[SCM] grass branch, upstream, updated. upstream/6.4.1-3-g019c645

Francesco Paolo Lovergine frankie at debian.org
Wed Sep 18 12:16:13 UTC 2013


The following commit has been merged in the upstream branch:
commit 019c64525ca680069e4f25d03937dd6b148cf7b8
Author: Francesco Paolo Lovergine <frankie at debian.org>
Date:   Wed Sep 18 14:15:22 2013 +0200

    Updated upstream branch for 6.4.3

diff --git a/ChangeLog_6.4.2.gz b/ChangeLog_6.4.2.gz
deleted file mode 100644
index 3518d7d..0000000
Binary files a/ChangeLog_6.4.2.gz and /dev/null differ
diff --git a/ChangeLog_6.4.3.gz b/ChangeLog_6.4.3.gz
new file mode 100644
index 0000000..3b71538
Binary files /dev/null and b/ChangeLog_6.4.3.gz differ
diff --git a/display/d.text/test.input b/display/d.text.new/test.input
similarity index 100%
copy from display/d.text/test.input
copy to display/d.text.new/test.input
diff --git a/doc/python/example_ctypes.py b/doc/python/example_ctypes.py
deleted file mode 100644
index 5df91b3..0000000
--- a/doc/python/example_ctypes.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/usr/bin/env python
-import os, sys, subprocess
-from ctypes import *
-grass = CDLL("libgrass_gis.so")
-
-if not os.environ.has_key("GISBASE"):
-    print "You must be in GRASS GIS to run this program."
-    sys.exit(1)
-
-if len(sys.argv)==2:
-  input = sys.argv[1]
-else:
-  input = raw_input("Raster Map Name? ")
-
-# initialize
-s = subprocess.Popen(['g.version','-r'], stdout=subprocess.PIPE).communicate()[0]
-for line in s.splitlines():
-    if line.startswith('Revision:'):
-        version = '$' + line + '$'
-grass.G__gisinit(version, '')
- 
-# find map in search path
-mapset = grass.G_find_cell2(input, '')
-mapset = c_char_p(mapset).value
- 
-# determine the inputmap type (CELL/FCELL/DCELL) */
-data_type = grass.G_raster_map_type(input, mapset)
-
-if data_type == 0:
-    ptype = POINTER(c_int)
-elif data_type == 1:
-    ptype = POINTER(c_float)
-elif data_type == 2:
-    ptype = POINTER(c_double)
- 
-infd = grass.G_open_cell_old(input, mapset)
-inrast = grass.G_allocate_raster_buf(data_type)
-inrast = cast(c_void_p(inrast), ptype)
-
-rows = grass.G_window_rows()
-cols = grass.G_window_cols()
- 
-for rown in xrange(rows):
-    grass.G_get_raster_row(infd, inrast, rown, data_type)
-    print rown, inrast[0:cols]
- 
-grass.G_close_cell(infd)
-grass.G_free(inrast)
-
diff --git a/doc/python/m.distance.py b/doc/python/m.distance.py
new file mode 100755
index 0000000..141e0cf
--- /dev/null
+++ b/doc/python/m.distance.py
@@ -0,0 +1,147 @@
+#!/usr/bin/env python
+############################################################################
+#
+# MODULE:       m.distance
+#
+# AUTHOR(S):    Hamish Bowman, Dunedin, New Zealand
+#               Updated for Ctypes by Martin Landa <landa.martin gmail.com>
+#
+# PURPOSE:      Find distance between two points
+#               If the projection is latitude-longitude, this distance
+#                 is measured along the geodesic.
+#               Demonstrates GRASS Python Ctypes interface
+#
+# COPYRIGHT:    (c) 2008-2011 Hamish Bowman, and the GRASS Development Team
+#
+#               This program is free software under the GNU General
+#               Public License (>=v2). Read the file COPYING that
+#               comes with GRASS for details.
+#
+############################################################################
+#
+# Requires GRASS Python Ctypes interface
+# Requires Numeric module (NumPy) from  http://numpy.scipy.org/
+#
+
+#%module
+#% label: Finds the distance between two or more points.
+#% description: If the projection is latitude-longitude, this distance is measured along the geodesic.
+#% keywords: miscellaneous, distance, measure
+#%end
+#%option
+#% key: coord
+#% type: string
+#% required: no
+#% multiple: yes
+#% key_desc: easting,northing
+#% description: Comma separated list of coordinate pairs
+#%end
+#%flag
+#% key: i
+#% description: Read coordinate pairs from stdin
+#%end
+
+import os, sys
+
+import grass.script as grass
+
+from grass.lib.gis import *
+
+def main(): 
+    G_gisinit('m.distance')
+
+    # calc distance
+    
+    proj_type = G_begin_distance_calculations()
+    # returns 0 if projection has no metrix (ie. imagery)
+    # returns 1 if projection is planimetric
+    # returns 2 if projection is latitude-longitude
+
+    # parser always creates at least an empty variable, and sys.argv is
+    # toast, so no way to check if option was given. So it hangs if
+    # --q was the only option given and there is no data from stdin.
+    coords = []
+    if flags['i']:
+        # read line by line from stdin
+        while True:
+            line = sys.stdin.readline().strip()
+            if not line: # EOF
+                break
+            else:
+                coords.append(line.split(','))
+    else:
+        # read from coord= command line option
+        p = None
+        for c in options['coord'].split(','):
+            if not p:
+                p = [c]
+            else:
+                p.append(c)
+                coords.append(p)
+                p = None
+    
+    if len(coords) < 2:
+       grass.fatal("A minimum of two input coordinate pairs are needed")
+    
+    # init variables
+    overall_distance = 0.0
+    coord_array = c_double * len(coords)
+    x = coord_array()
+    y = coord_array()
+    if proj_type == 2:
+        # lat/lon scan for DDD:MM:SS.SSSS
+        easting = c_double()
+        northing = c_double()
+        G_scan_easting(coords[0][0], byref(easting), PROJECTION_LL)
+        G_scan_northing(coords[0][1], byref(northing), PROJECTION_LL)
+        x[0] = float(easting.value)
+        y[0] = float(northing.value)
+    else:
+        # plain coordinates
+        x[0] = float(coords[0][0])
+        y[0] = float(coords[0][1])
+    
+    for i in range(1, len(coords)):
+        if proj_type == 2:
+            easting = c_double()
+            northing = c_double()
+            G_scan_easting(coords[i][0], byref(easting), PROJECTION_LL)
+            G_scan_northing(coords[i][1], byref(northing), PROJECTION_LL)
+            x[i] = float(easting.value)
+            y[i] = float(northing.value)
+        else:
+            x[i] = float(coords[i][0])
+            y[i] = float(coords[i][1])
+        
+        segment_distance = G_distance(x[i-1], y[i-1], x[i], y[i])
+        overall_distance += segment_distance
+        
+        print "segment %d distance is %.2f meters" % (i, segment_distance)
+        
+        # add to the area array
+    
+    print "\ntotal distance is %.2f meters\n" % overall_distance
+    
+    # calc area
+    if len(coords) < 3:
+       return 0
+    
+    G_begin_polygon_area_calculations()
+    # returns 0 if the projection is not measurable (ie. imagery or xy)
+    # returns 1 if the projection is planimetric (ie. UTM or SP)
+    # returns 2 if the projection is non-planimetric (ie. latitude-longitude)
+
+    # do not need to close polygon (but it doesn't hurt if you do)
+    area = G_area_of_polygon(x, y, len(coords))
+    print "area is %.2f square meters\n" % area
+    
+    # we don't need this, but just to have a look
+    if proj_type == 1:
+        G_database_units_to_meters_factor()
+        grass.message("Location units are %s" % G_database_unit_name(True).lower())
+    
+    return 0
+
+if __name__ == "__main__":
+    options, flags = grass.parser()
+    sys.exit(main())
diff --git a/doc/python/raster_example_ctypes.py b/doc/python/raster_example_ctypes.py
new file mode 100755
index 0000000..dff4c60
--- /dev/null
+++ b/doc/python/raster_example_ctypes.py
@@ -0,0 +1,79 @@
+#!/usr/bin/env python
+
+"""
+Sample Python script to access raster data using GRASS Ctypes
+interface
+
+You may wish to use 'g.region' to set the rows x columns to something
+small (say 10 x 5) to avoid overwhelming yourself: `g.region rows=10
+cols=5`
+"""
+
+# FIXME: as an example it should make extensive use of code comments and document
+#  each and every step along the way.  (e.g. explain c_char_p().value memory pointer
+#  to string conversion for Python programmers not familar with C pointers)
+#
+#  FIXME: explain at a basic level what ctypes is & does.
+
+import os
+import sys
+
+from grass.lib.gis    import *
+
+# check if GRASS is running or not
+if not os.environ.has_key("GISBASE"):
+    sys.exit("You must be in GRASS GIS to run this program")
+
+# parse command line arguments, prompt user for a raster map name if one wasn't given
+if len(sys.argv) == 2:
+  input = sys.argv[1]
+else:
+  input = raw_input("Name of raster map? ")
+
+# initialize GRASS library
+G_gisinit('')
+
+# find map in search path
+mapset = G_find_cell2(input, '')
+if not mapset:
+    sys.exit("Raster map <%s> not found" % input)
+
+# determine the inputmap type (CELL/FCELL/DCELL)
+data_type = G_raster_map_type(input, mapset)
+
+if data_type == CELL_TYPE:
+    ptype = POINTER(c_int)
+    type_name = 'CELL'
+elif data_type == FCELL_TYPE:
+    ptype = POINTER(c_float)
+    type_name = 'FCELL'
+elif data_type == DCELL_TYPE:
+    ptype = POINTER(c_double)
+    type_name = 'DCELL'
+
+print "Raster map <%s> contains data type %s." % (input, type_name)
+
+in_fd   = G_open_cell_old(input, mapset)
+in_rast = G_allocate_raster_buf(data_type)
+in_rast = cast(c_void_p(in_rast), ptype)
+
+rows = G_window_rows()
+cols = G_window_cols()
+print "Current region is %d rows x %d columns" % (rows, cols)
+
+# iterate through map rows
+print "Map data:"
+for row_n in xrange(rows):
+    # read a row of raster data into memory, then print it
+    G_get_raster_row(in_fd, in_rast, row_n, data_type)
+    print row_n, in_rast[0:cols]
+    # TODO check for NULL
+
+# closed map and cleanup memory allocation
+G_close_cell(in_fd)
+G_free(in_rast)
+
+def check_null(value):
+    if math.isnan(value):
+        return 'null'
+    return value
diff --git a/doc/python/vector_example_ctypes.py b/doc/python/vector_example_ctypes.py
new file mode 100755
index 0000000..6ba0e7f
--- /dev/null
+++ b/doc/python/vector_example_ctypes.py
@@ -0,0 +1,60 @@
+#!/usr/bin/python
+
+"""
+Sample Python script to access vector data using GRASS Ctypes
+interface
+"""
+
+import os, sys
+
+from grass.lib.gis    import *
+from grass.lib.vector import *
+
+if not os.environ.has_key("GISBASE"):
+    sys.exit("You must be in GRASS GIS to run this program.")
+
+if len(sys.argv) == 2:
+  input = sys.argv[1]
+else:
+  input = raw_input("Name of vector map? ")
+
+# initialize GRASS library
+G_gisinit('')
+
+# find vector map in the search path
+mapset = G_find_vector2(input, "")
+if not mapset:
+    sys.exit("Vector map <%s> not found" % input)
+
+# define map structure
+map_info = pointer(Map_info())
+
+# define open level (level 2: topology)
+Vect_set_open_level(2)
+
+# open existing vector map
+Vect_open_old(map_info, input, mapset)
+
+# query
+print 'Vector map        :', Vect_get_full_name(map_info)
+print 'Vector is 3D      :', Vect_is_3d(map_info)
+print 'Vector DB links   :', Vect_get_num_dblinks(map_info)
+print 'Map Scale         : 1:%d' % Vect_get_scale(map_info)
+
+# vector box tests
+box = bound_box()
+c_easting1  = 599505.0
+c_northing  = 4921010.0
+c_easting2  = 4599505.0
+
+Vect_get_map_box(map_info, byref(box))
+print 'Position 1 in box ?', Vect_point_in_box(c_easting1, c_northing, 0, byref(box))
+print 'Position 2 in box ?', Vect_point_in_box(c_easting2, c_northing, 0, byref(box))
+
+print 'Number of features:', Vect_get_num_lines(map_info)
+print 'Number of points  :', Vect_get_num_primitives(map_info, GV_POINT)
+print 'Number of lines   :', Vect_get_num_primitives(map_info, GV_LINE)
+print 'Number of areas   :', Vect_get_num_areas(map_info)
+
+# close map
+Vect_close(map_info)
diff --git a/general/g.proj/create.c b/general/g.proj/create.c
new file mode 100644
index 0000000..d0a8567
--- /dev/null
+++ b/general/g.proj/create.c
@@ -0,0 +1,68 @@
+#include <errno.h>
+#include <string.h>
+
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+
+void create_location(char *location)
+{
+    int ret;
+
+    ret = G__make_location(location, &cellhd, projinfo, projunits, NULL);
+    if (ret == 0)
+	G_message(_("Location <%s> created"), location);
+    else if (ret == -1)
+	G_fatal_error(_("Unable to create location <%s>: %s"),
+		    location, strerror(errno));
+    else if (ret == -2)
+	G_fatal_error(_("Unable to create projection files: %s"),
+		    strerror(errno));
+    else
+	/* Shouldn't happen */
+	G_fatal_error(_("Unspecified error while creating new location"));
+
+    G_message(_("You can switch to the new location by\n`%s=%s`"),
+	      "g.mapset mapset=PERMANENT location", location);
+}
+
+void modify_projinfo()
+{
+    const char *mapset = G_mapset();
+    struct Cell_head old_cellhd;
+    
+    if (strcmp(mapset, "PERMANENT") != 0)
+	G_fatal_error(_("You must select the PERMANENT mapset before updating the "
+			"current location's projection (current mapset is <%s>)."),
+		      mapset);
+    
+    /* Read projection information from current location first */
+    G_get_default_window(&old_cellhd);
+    
+    char path[GPATH_MAX];
+    int stat;
+	
+    /* Write out the PROJ_INFO, and PROJ_UNITS if available. */
+    if (projinfo != NULL) {
+	G__file_name(path, "", "PROJ_INFO", "PERMANENT");
+	G_write_key_value_file(path, projinfo, &stat);
+    }
+    
+    if (projunits != NULL) {
+	G__file_name(path, "", "PROJ_UNITS", "PERMANENT");
+	G_write_key_value_file(path, projunits, &stat);
+    }
+    
+    if ((old_cellhd.zone != cellhd.zone) ||
+	(old_cellhd.proj != cellhd.proj)) {
+	/* Recreate the default, and current window files if projection
+	 * number or zone have changed */
+	G__put_window(&cellhd, "", "DEFAULT_WIND");
+	G__put_window(&cellhd, "", "WIND");
+	G_message(_("Default region was updated to the new projection, but if you have "
+		    "multiple mapsets `g.region -d` should be run in each to update the "
+		    "region from the default"));
+    }
+    G_important_message(_("Projection information updated"));
+}
diff --git a/gui/icons/grass-64x64.png b/gui/icons/grass-64x64.png
new file mode 100644
index 0000000..0fcda98
Binary files /dev/null and b/gui/icons/grass-64x64.png differ
diff --git a/gui/icons/grass2/3d-help.png b/gui/icons/grass2/3d-help.png
new file mode 100644
index 0000000..0312063
Binary files /dev/null and b/gui/icons/grass2/3d-help.png differ
diff --git a/gui/icons/grass2/3d-rotate.png b/gui/icons/grass2/3d-rotate.png
new file mode 100644
index 0000000..b4f0558
Binary files /dev/null and b/gui/icons/grass2/3d-rotate.png differ
diff --git a/gui/icons/grass2/3d-settings.png b/gui/icons/grass2/3d-settings.png
new file mode 100644
index 0000000..3a47068
Binary files /dev/null and b/gui/icons/grass2/3d-settings.png differ
diff --git a/gui/icons/grass2/flythrough.png b/gui/icons/grass2/flythrough.png
new file mode 100644
index 0000000..5b04cd6
Binary files /dev/null and b/gui/icons/grass2/flythrough.png differ
diff --git a/gui/icons/grass2/image-add.png b/gui/icons/grass2/image-add.png
new file mode 100644
index 0000000..ce0ccba
Binary files /dev/null and b/gui/icons/grass2/image-add.png differ
diff --git a/gui/icons/grass2/line-add.png b/gui/icons/grass2/line-add.png
new file mode 100644
index 0000000..b633e51
Binary files /dev/null and b/gui/icons/grass2/line-add.png differ
diff --git a/gui/icons/grass2/loop-add.png b/gui/icons/grass2/loop-add.png
new file mode 100644
index 0000000..5a41ecb
Binary files /dev/null and b/gui/icons/grass2/loop-add.png differ
diff --git a/gui/icons/grass2/north-arrow-add.png b/gui/icons/grass2/north-arrow-add.png
new file mode 100644
index 0000000..4ed308c
Binary files /dev/null and b/gui/icons/grass2/north-arrow-add.png differ
diff --git a/gui/icons/grass2/point-add.png b/gui/icons/grass2/point-add.png
new file mode 100644
index 0000000..ac65d56
Binary files /dev/null and b/gui/icons/grass2/point-add.png differ
diff --git a/gui/icons/grass2/rectangle-add.png b/gui/icons/grass2/rectangle-add.png
new file mode 100644
index 0000000..912b33c
Binary files /dev/null and b/gui/icons/grass2/rectangle-add.png differ
diff --git a/mswindows/Installer-Files/GRASS_CMD.ico b/gui/icons/grass_cmd.ico
similarity index 100%
rename from mswindows/Installer-Files/GRASS_CMD.ico
rename to gui/icons/grass_cmd.ico
diff --git a/gui/icons/grass_error.ico b/gui/icons/grass_error.ico
deleted file mode 100644
index 718ac90..0000000
Binary files a/gui/icons/grass_error.ico and /dev/null differ
diff --git a/mswindows/Installer-Files/GRASS_MSys.ico b/gui/icons/grass_msys.ico
similarity index 100%
rename from mswindows/Installer-Files/GRASS_MSys.ico
rename to gui/icons/grass_msys.ico
diff --git a/gui/icons/grass_osgeo.ico b/gui/icons/grass_osgeo.ico
new file mode 100644
index 0000000..29eb7d1
Binary files /dev/null and b/gui/icons/grass_osgeo.ico differ
diff --git a/mswindows/Installer-Files/GRASS_tcltk.ico b/gui/icons/grass_tcltk.ico
similarity index 100%
rename from mswindows/Installer-Files/GRASS_tcltk.ico
rename to gui/icons/grass_tcltk.ico
diff --git a/mswindows/Installer-Files/GRASS_Web.ico b/gui/icons/grass_web.ico
similarity index 100%
rename from mswindows/Installer-Files/GRASS_Web.ico
rename to gui/icons/grass_web.ico
diff --git a/mswindows/Installer-Files/MSYS_Custom_Icon.ico b/gui/icons/msys.ico
similarity index 100%
rename from mswindows/Installer-Files/MSYS_Custom_Icon.ico
rename to gui/icons/msys.ico
diff --git a/gui/icons/symbols.xcf.bz2 b/gui/icons/symbols.xcf.bz2
new file mode 100644
index 0000000..934203a
Binary files /dev/null and b/gui/icons/symbols.xcf.bz2 differ
diff --git a/mswindows/Installer-Files/WinGRASS.ico b/gui/icons/wingrass.ico
similarity index 100%
rename from mswindows/Installer-Files/WinGRASS.ico
rename to gui/icons/wingrass.ico
diff --git a/gui/images/symbols/README b/gui/images/symbols/README
new file mode 100644
index 0000000..18954df
--- /dev/null
+++ b/gui/images/symbols/README
@@ -0,0 +1,39 @@
+Symbols in form of PNG images enable to choose easily symbols in d.vect
+and in wx.psmap dialogs. It is necessary to keep images synchronized with
+symbols from ./lib/symbol/symbol/ directories.
+
+How to create new symbol image:
+----------------------------------
+You can use following script (requires Inkscape), run script in symbol group
+directory (e.g. ./lib/symbol/symbol/basic) within a GRASS session.
+Optipng will try to make the file as small as possible.
+
+#!/bin/sh
+DIR="$(basename $PWD)"
+PSMAP_FILE=tmp.psmap
+PS_FILE=tmp.ps
+PNG_OUT=png_out
+
+rm -r "$PNG_OUT"
+mkdir "$PNG_OUT"
+for SYMBOL in *
+do
+    if [ -f "$SYMBOL" ]
+    then
+        echo -e "border none\npoint 50% 50%\n  symbol $DIR/$SYMBOL\n  end\nend" > "$PSMAP_FILE"
+        ps.map input="$PSMAP_FILE" output="$PS_FILE"
+        inkscape -f "$PS_FILE" --export-png="$PNG_OUT/$SYMBOL.png" -D -h=30
+        
+        rm "$PSMAP_FILE" "$PS_FILE"
+
+        #optipng -o5 "$PNG_OUT/$SYMBOL.png"
+    else
+        echo "$SYMBOL is not regular file"
+    fi
+done
+
+Image should have 30x30 px to be displayed correctly in GUI dialog. If the symbol
+has different width and height, you are supposed to correct it (for example
+in Gimp see Image -> Canvas size). Also consider where the reference point of symbol
+is placed (see e.g. offbox_ne, offbox_ns symbols).
+
diff --git a/gui/images/symbols/basic/arrow1.png b/gui/images/symbols/basic/arrow1.png
new file mode 100644
index 0000000..e3a187c
Binary files /dev/null and b/gui/images/symbols/basic/arrow1.png differ
diff --git a/gui/images/symbols/basic/arrow2.png b/gui/images/symbols/basic/arrow2.png
new file mode 100644
index 0000000..c3a1572
Binary files /dev/null and b/gui/images/symbols/basic/arrow2.png differ
diff --git a/gui/images/symbols/basic/arrow3.png b/gui/images/symbols/basic/arrow3.png
new file mode 100644
index 0000000..c623bd6
Binary files /dev/null and b/gui/images/symbols/basic/arrow3.png differ
diff --git a/gui/images/symbols/basic/box.png b/gui/images/symbols/basic/box.png
new file mode 100644
index 0000000..693d190
Binary files /dev/null and b/gui/images/symbols/basic/box.png differ
diff --git a/gui/images/symbols/basic/circle.png b/gui/images/symbols/basic/circle.png
new file mode 100644
index 0000000..c589776
Binary files /dev/null and b/gui/images/symbols/basic/circle.png differ
diff --git a/gui/images/symbols/basic/cross1.png b/gui/images/symbols/basic/cross1.png
new file mode 100644
index 0000000..decaa64
Binary files /dev/null and b/gui/images/symbols/basic/cross1.png differ
diff --git a/gui/images/symbols/basic/cross2.png b/gui/images/symbols/basic/cross2.png
new file mode 100644
index 0000000..1639012
Binary files /dev/null and b/gui/images/symbols/basic/cross2.png differ
diff --git a/gui/images/symbols/basic/cross3.png b/gui/images/symbols/basic/cross3.png
new file mode 100644
index 0000000..930e2fd
Binary files /dev/null and b/gui/images/symbols/basic/cross3.png differ
diff --git a/gui/images/symbols/basic/diamond.png b/gui/images/symbols/basic/diamond.png
new file mode 100644
index 0000000..28566df
Binary files /dev/null and b/gui/images/symbols/basic/diamond.png differ
diff --git a/gui/images/symbols/basic/marker.png b/gui/images/symbols/basic/marker.png
new file mode 100644
index 0000000..5524923
Binary files /dev/null and b/gui/images/symbols/basic/marker.png differ
diff --git a/gui/images/symbols/basic/octagon.png b/gui/images/symbols/basic/octagon.png
new file mode 100644
index 0000000..aa4fd15
Binary files /dev/null and b/gui/images/symbols/basic/octagon.png differ
diff --git a/gui/images/symbols/basic/point.png b/gui/images/symbols/basic/point.png
new file mode 100644
index 0000000..4e041ab
Binary files /dev/null and b/gui/images/symbols/basic/point.png differ
diff --git a/gui/images/symbols/basic/pushpin.png b/gui/images/symbols/basic/pushpin.png
new file mode 100644
index 0000000..ff6c7e7
Binary files /dev/null and b/gui/images/symbols/basic/pushpin.png differ
diff --git a/gui/images/symbols/basic/star.png b/gui/images/symbols/basic/star.png
new file mode 100644
index 0000000..f3c3636
Binary files /dev/null and b/gui/images/symbols/basic/star.png differ
diff --git a/gui/images/symbols/basic/triangle.png b/gui/images/symbols/basic/triangle.png
new file mode 100644
index 0000000..fd6c6fe
Binary files /dev/null and b/gui/images/symbols/basic/triangle.png differ
diff --git a/gui/images/symbols/basic/x.png b/gui/images/symbols/basic/x.png
new file mode 100644
index 0000000..cef288a
Binary files /dev/null and b/gui/images/symbols/basic/x.png differ
diff --git a/gui/images/symbols/demo/muchomurka.png b/gui/images/symbols/demo/muchomurka.png
new file mode 100644
index 0000000..4b8e395
Binary files /dev/null and b/gui/images/symbols/demo/muchomurka.png differ
diff --git a/gui/images/symbols/demo/smrk.png b/gui/images/symbols/demo/smrk.png
new file mode 100644
index 0000000..18727fc
Binary files /dev/null and b/gui/images/symbols/demo/smrk.png differ
diff --git a/gui/images/symbols/extra/4pt_star.png b/gui/images/symbols/extra/4pt_star.png
new file mode 100644
index 0000000..f10c8f1
Binary files /dev/null and b/gui/images/symbols/extra/4pt_star.png differ
diff --git a/gui/images/symbols/extra/adcp.png b/gui/images/symbols/extra/adcp.png
new file mode 100644
index 0000000..dadfdb9
Binary files /dev/null and b/gui/images/symbols/extra/adcp.png differ
diff --git a/gui/images/symbols/extra/airport.png b/gui/images/symbols/extra/airport.png
new file mode 100644
index 0000000..25c8ef0
Binary files /dev/null and b/gui/images/symbols/extra/airport.png differ
diff --git a/gui/images/symbols/extra/alpha_flag.png b/gui/images/symbols/extra/alpha_flag.png
new file mode 100644
index 0000000..ed9b93d
Binary files /dev/null and b/gui/images/symbols/extra/alpha_flag.png differ
diff --git a/gui/images/symbols/extra/bridge.png b/gui/images/symbols/extra/bridge.png
new file mode 100644
index 0000000..1bd5200
Binary files /dev/null and b/gui/images/symbols/extra/bridge.png differ
diff --git a/gui/images/symbols/extra/compass.png b/gui/images/symbols/extra/compass.png
new file mode 100644
index 0000000..8c8fcf6
Binary files /dev/null and b/gui/images/symbols/extra/compass.png differ
diff --git a/gui/images/symbols/extra/dim_arrow.png b/gui/images/symbols/extra/dim_arrow.png
new file mode 100644
index 0000000..94e321e
Binary files /dev/null and b/gui/images/symbols/extra/dim_arrow.png differ
diff --git a/gui/images/symbols/extra/dive_flag.png b/gui/images/symbols/extra/dive_flag.png
new file mode 100644
index 0000000..6783770
Binary files /dev/null and b/gui/images/symbols/extra/dive_flag.png differ
diff --git a/gui/images/symbols/extra/fancy_compass.png b/gui/images/symbols/extra/fancy_compass.png
new file mode 100644
index 0000000..595d251
Binary files /dev/null and b/gui/images/symbols/extra/fancy_compass.png differ
diff --git a/gui/images/symbols/extra/fiducial.png b/gui/images/symbols/extra/fiducial.png
new file mode 100644
index 0000000..a5b765f
Binary files /dev/null and b/gui/images/symbols/extra/fiducial.png differ
diff --git a/gui/images/symbols/extra/fish.png b/gui/images/symbols/extra/fish.png
new file mode 100644
index 0000000..8121864
Binary files /dev/null and b/gui/images/symbols/extra/fish.png differ
diff --git a/gui/images/symbols/extra/half-box.png b/gui/images/symbols/extra/half-box.png
new file mode 100644
index 0000000..cf141d5
Binary files /dev/null and b/gui/images/symbols/extra/half-box.png differ
diff --git a/gui/images/symbols/extra/half-circle.png b/gui/images/symbols/extra/half-circle.png
new file mode 100644
index 0000000..95db9f8
Binary files /dev/null and b/gui/images/symbols/extra/half-circle.png differ
diff --git a/gui/images/symbols/extra/n_arrow1.png b/gui/images/symbols/extra/n_arrow1.png
new file mode 100644
index 0000000..4759f35
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow1.png differ
diff --git a/gui/images/symbols/extra/n_arrow1b.png b/gui/images/symbols/extra/n_arrow1b.png
new file mode 100644
index 0000000..34c46bc
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow1b.png differ
diff --git a/gui/images/symbols/extra/n_arrow2.png b/gui/images/symbols/extra/n_arrow2.png
new file mode 100644
index 0000000..d8764b2
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow2.png differ
diff --git a/gui/images/symbols/extra/n_arrow3.png b/gui/images/symbols/extra/n_arrow3.png
new file mode 100644
index 0000000..3e9a6a3
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow3.png differ
diff --git a/gui/images/symbols/extra/n_arrow4.png b/gui/images/symbols/extra/n_arrow4.png
new file mode 100644
index 0000000..a01c546
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow4.png differ
diff --git a/gui/images/symbols/extra/n_arrow5.png b/gui/images/symbols/extra/n_arrow5.png
new file mode 100644
index 0000000..f43279e
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow5.png differ
diff --git a/gui/images/symbols/extra/n_arrow6.png b/gui/images/symbols/extra/n_arrow6.png
new file mode 100644
index 0000000..18f6bc3
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow6.png differ
diff --git a/gui/images/symbols/extra/n_arrow7a.png b/gui/images/symbols/extra/n_arrow7a.png
new file mode 100644
index 0000000..55c3d7b
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow7a.png differ
diff --git a/gui/images/symbols/extra/n_arrow7b.png b/gui/images/symbols/extra/n_arrow7b.png
new file mode 100644
index 0000000..374ebf0
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow7b.png differ
diff --git a/gui/images/symbols/extra/n_arrow8a.png b/gui/images/symbols/extra/n_arrow8a.png
new file mode 100644
index 0000000..c5a0c72
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow8a.png differ
diff --git a/gui/images/symbols/extra/n_arrow8b.png b/gui/images/symbols/extra/n_arrow8b.png
new file mode 100644
index 0000000..ba1b826
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow8b.png differ
diff --git a/gui/images/symbols/extra/n_arrow9.png b/gui/images/symbols/extra/n_arrow9.png
new file mode 100644
index 0000000..a949034
Binary files /dev/null and b/gui/images/symbols/extra/n_arrow9.png differ
diff --git a/gui/images/symbols/extra/offbox_ne.png b/gui/images/symbols/extra/offbox_ne.png
new file mode 100644
index 0000000..aebfe8c
Binary files /dev/null and b/gui/images/symbols/extra/offbox_ne.png differ
diff --git a/gui/images/symbols/extra/offbox_nw.png b/gui/images/symbols/extra/offbox_nw.png
new file mode 100644
index 0000000..0a31eb6
Binary files /dev/null and b/gui/images/symbols/extra/offbox_nw.png differ
diff --git a/gui/images/symbols/extra/offbox_se.png b/gui/images/symbols/extra/offbox_se.png
new file mode 100644
index 0000000..ae83392
Binary files /dev/null and b/gui/images/symbols/extra/offbox_se.png differ
diff --git a/gui/images/symbols/extra/offbox_sw.png b/gui/images/symbols/extra/offbox_sw.png
new file mode 100644
index 0000000..0a21fdb
Binary files /dev/null and b/gui/images/symbols/extra/offbox_sw.png differ
diff --git a/gui/images/symbols/extra/pentagon.png b/gui/images/symbols/extra/pentagon.png
new file mode 100644
index 0000000..28889be
Binary files /dev/null and b/gui/images/symbols/extra/pentagon.png differ
diff --git a/gui/images/symbols/extra/ping.png b/gui/images/symbols/extra/ping.png
new file mode 100644
index 0000000..a4471ae
Binary files /dev/null and b/gui/images/symbols/extra/ping.png differ
diff --git a/gui/images/symbols/extra/ring.png b/gui/images/symbols/extra/ring.png
new file mode 100644
index 0000000..1b3a7cb
Binary files /dev/null and b/gui/images/symbols/extra/ring.png differ
diff --git a/gui/images/symbols/extra/simple_zia.png b/gui/images/symbols/extra/simple_zia.png
new file mode 100644
index 0000000..d4a42d4
Binary files /dev/null and b/gui/images/symbols/extra/simple_zia.png differ
diff --git a/gui/images/symbols/extra/target.png b/gui/images/symbols/extra/target.png
new file mode 100644
index 0000000..4f2a2a4
Binary files /dev/null and b/gui/images/symbols/extra/target.png differ
diff --git a/gui/images/symbols/geology/half-arrow_left.png b/gui/images/symbols/geology/half-arrow_left.png
new file mode 100644
index 0000000..3c9f494
Binary files /dev/null and b/gui/images/symbols/geology/half-arrow_left.png differ
diff --git a/gui/images/symbols/geology/half-arrow_right.png b/gui/images/symbols/geology/half-arrow_right.png
new file mode 100644
index 0000000..8e94360
Binary files /dev/null and b/gui/images/symbols/geology/half-arrow_right.png differ
diff --git a/gui/images/symbols/geology/strike_box.png b/gui/images/symbols/geology/strike_box.png
new file mode 100644
index 0000000..16b9e14
Binary files /dev/null and b/gui/images/symbols/geology/strike_box.png differ
diff --git a/gui/images/symbols/geology/strike_circle.png b/gui/images/symbols/geology/strike_circle.png
new file mode 100644
index 0000000..891775a
Binary files /dev/null and b/gui/images/symbols/geology/strike_circle.png differ
diff --git a/gui/images/symbols/geology/strike_half-bowtie.png b/gui/images/symbols/geology/strike_half-bowtie.png
new file mode 100644
index 0000000..13cd7d2
Binary files /dev/null and b/gui/images/symbols/geology/strike_half-bowtie.png differ
diff --git a/gui/images/symbols/geology/strike_line.png b/gui/images/symbols/geology/strike_line.png
new file mode 100644
index 0000000..31c787a
Binary files /dev/null and b/gui/images/symbols/geology/strike_line.png differ
diff --git a/gui/images/symbols/geology/strike_triangle.png b/gui/images/symbols/geology/strike_triangle.png
new file mode 100644
index 0000000..3f8efed
Binary files /dev/null and b/gui/images/symbols/geology/strike_triangle.png differ
diff --git a/gui/wxpython/scripts/d.rast3d.py b/gui/scripts/d.rast3d.py
similarity index 84%
rename from gui/wxpython/scripts/d.rast3d.py
rename to gui/scripts/d.rast3d.py
index 377b5ba..0d09f9d 100644
--- a/gui/wxpython/scripts/d.rast3d.py
+++ b/gui/scripts/d.rast3d.py
@@ -8,7 +8,7 @@
 #
 # PURPOSE:	Wrapper for wxGUI to add 3D raster map into layer tree
 #
-# COPYRIGHT:	(C) 2008, 2010 by the GRASS Development Team
+# COPYRIGHT:	(C) 2008, 2010, 2012 by the GRASS Development Team
 #
 #		This program is free software under the GNU General
 #		Public License (>=v2). Read the file COPYING that
@@ -17,7 +17,7 @@
 #############################################################################
 
 #%module
-#% description: Displays 3D raster map layer.
+#% description: Displays user-specified 3D raster map in the active graphics frame.
 #% keywords: display, raster3d
 #%end
 
diff --git a/gui/scripts/r.mapcalc_wrapper b/gui/scripts/r.mapcalc_wrapper
new file mode 100644
index 0000000..1871189
--- /dev/null
+++ b/gui/scripts/r.mapcalc_wrapper
@@ -0,0 +1,65 @@
+#!/bin/sh
+#
+############################################################################
+#
+# MODULE:       r.mapcalc_wrapper 
+# AUTHOR(S):    Martin Landa <landa.martin gmail.com>
+# PURPOSE:      Simulate standard g.parser interface for GUI
+# COPYRIGHT:    (C) 2011 by The GRASS Development Team
+#
+#  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 of the License, 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.
+#
+############################################################################
+
+#%module
+#% description: Raster map calculator.
+#% keywords: raster, algebra
+#%end
+#%option
+#% key: expression
+#% type: string
+#% required: no
+#% multiple: no
+#% description: Expression to evaluate
+#% guisection: Expression
+#%end
+#%option
+#% key: file
+#% type: string
+#% required: no
+#% multiple: no
+#% key_desc: name
+#% description: File containing expression(s) to evaluate
+#% gisprompt: old,file,input
+#% guisection: Expression
+#%end
+
+if  [ -z "$GISBASE" ] ; then
+   echo "You must be in GRASS GIS to run this program." 1>&2
+   exit 1
+fi
+
+if [ "$1" != "@ARGS_PARSED@" ] ; then
+   exec g.parser "$0" "$@"
+fi
+
+if [ -n "$GIS_OPT_FILE" ] ; then
+    exec r.mapcalc < "$GIS_OPT_FILE"
+else
+    if [ -n "$GIS_OPT_EXPRESSION" ] ; then
+	exec r.mapcalc "$GIS_OPT_EXPRESSION"
+    else
+	exec g.message -e message="Either <expression> or <file> option must be given"
+	exit 1
+    fi
+fi
+
+exit 0
diff --git a/gui/wxpython/gui_modules/debug.py b/gui/wxpython/core/debug.py
similarity index 79%
rename from gui/wxpython/gui_modules/debug.py
rename to gui/wxpython/core/debug.py
index 99fc1aa..ee544f2 100644
--- a/gui/wxpython/gui_modules/debug.py
+++ b/gui/wxpython/core/debug.py
@@ -1,17 +1,18 @@
 """!
- at package debug
+ at package core.debug
 
- at brief Debugging
+ at brief wxGUI debugging
 
 Classes:
- - DebugMsg
+ - debug::DebugMsg
 
 @code
-from debug import Debug as Debug
+from core.debug import Debug
 Debug.msg (3, 'debug message')
 @endcode
          
-COPYRIGHT: (C) 2007-2009, 2011 by the GRASS Development Team
+(C) 2007-2009, 2011 by the GRASS Development Team
+
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
@@ -21,8 +22,6 @@ This program is free software under the GNU General Public License
 import os
 import sys
 
-import globalvar
-
 import grass.script as grass
 
 class DebugMsg:
@@ -66,12 +65,3 @@ class DebugMsg:
 
 # Debug instance
 Debug = DebugMsg()
-
-# testing
-if __name__ == "__main__":
-    import gcmd
-    gcmd.RunCommand('g.gisenv',
-                    set = 'DEBUG=3')
-                
-    for level in range (4):
-        Debug.msg (level, "message level=%d" % level)
diff --git a/gui/wxpython/gui_modules/gcmd.py b/gui/wxpython/core/gcmd.py
similarity index 85%
rename from gui/wxpython/gui_modules/gcmd.py
rename to gui/wxpython/core/gcmd.py
index 8dbac1a..c459204 100644
--- a/gui/wxpython/gui_modules/gcmd.py
+++ b/gui/wxpython/core/gcmd.py
@@ -1,24 +1,25 @@
 """!
- at package gcmd
+ at package core.gcmd
 
 @brief wxGUI command interface
 
 Classes:
- - GError
- - GWarning
- - GMessage
- - GException
- - Popen (from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440554)
- - Command
- - CommandThread
+ - gcmd::GError
+ - gcmd::GWarning
+ - gcmd::GMessage
+ - gcmd::GException
+ - gcmd::Popen (from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/440554)
+ - gcmd::Command
+ - gcmd::CommandThread
 
 Functions:
  - RunCommand
+ - GetDefaultEncoding
 
 (C) 2007-2008, 2010-2011 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Jachym Cepicky
 @author Martin Landa <landa.martin gmail.com>
@@ -31,7 +32,7 @@ import errno
 import signal
 import locale
 import traceback
-import types
+import copy
 
 import wx
 
@@ -50,13 +51,58 @@ else:
     import fcntl
 from threading import Thread
 
-import globalvar
-grassPath = os.path.join(globalvar.ETCDIR, "python")
-sys.path.append(grassPath)
 from grass.script import core as grass
 
-import utils
-from debug import Debug as Debug
+from core       import globalvar
+from core.debug import Debug
+
+def GetRealCmd(cmd):
+    """!Return real command name - only for MS Windows
+    """
+    if sys.platform == 'win32':
+        for ext in globalvar.grassScripts.keys():
+            if cmd in globalvar.grassScripts[ext]:
+                return cmd + ext
+    
+    return cmd
+
+def DecodeString(string):
+    """!Decode string using system encoding
+    
+    @param string string to be decoded
+    
+    @return decoded string
+    """
+    if not string:
+        return string
+
+    try:
+        enc = locale.getdefaultlocale()[1]
+    except ValueError, e:
+        sys.stderr.write(_("ERROR: %s\n") % str(e))
+        return string
+    
+    if enc:
+        Debug.msg(5, "DecodeString(): enc=%s" % enc)
+        return string.decode(enc)
+    
+    return string
+
+def EncodeString(string):
+    """!Return encoded string using system locales
+    
+    @param string string to be encoded
+    
+    @return encoded string
+    """
+    if not string:
+        return string
+    enc = locale.getdefaultlocale()[1]
+    if enc:
+        Debug.msg(5, "EncodeString(): enc=%s" % enc)
+        return string.encode(enc)
+    
+    return string
 
 class GError:
     def __init__(self, message, parent = None, caption = None, showTraceback = True):
@@ -103,25 +149,19 @@ class GMessage:
                       style = style)
 
 class GException(Exception):
-    def __init__(self, value):
+    def __init__(self, value = ''):
         self.value = value
 
     def __str__(self):
-        return str(self.value)
+        return self.value
 
 class Popen(subprocess.Popen):
     """!Subclass subprocess.Popen"""
-    def __init__(self, *args, **kwargs):
+    def __init__(self, args, **kwargs):
         if subprocess.mswindows:
-            try:
-                kwargs['args'] = map(utils.EncodeString, kwargs['args'])
-            except KeyError:
-                if len(args) > 0:
-                    targs = list(args)
-                    targs[0] = map(utils.EncodeString, args[0])
-                    args = tuple(targs)
+            args = map(EncodeString, args)
         
-        subprocess.Popen.__init__(self, *args, **kwargs)
+        subprocess.Popen.__init__(self, args, **kwargs)
         
     def recv(self, maxsize = None):
         return self._recv('stdout', maxsize)
@@ -441,10 +481,11 @@ class Command:
 class CommandThread(Thread):
     """!Create separate thread for command. Used for commands launched
     on the background."""
-    def __init__ (self, cmd, stdin = None,
+    def __init__ (self, cmd, env = None, stdin = None,
                   stdout = sys.stdout, stderr = sys.stderr):
         """
         @param cmd command (given as list)
+        @param env environmental variables
         @param stdin standard input stream 
         @param stdout redirect standard output or None
         @param stderr redirect standard error output or None
@@ -455,6 +496,7 @@ class CommandThread(Thread):
         self.stdin  = stdin
         self.stdout = stdout
         self.stderr = stderr
+        self.env    = env
         
         self.module = None
         self.error  = ''
@@ -480,21 +522,36 @@ class CommandThread(Thread):
             return
 
         Debug.msg(1, "gcmd.CommandThread(): %s" % ' '.join(self.cmd))
-
+        
         self.startTime = time.time()
-
-        # TODO: replace ugly hack bellow
+        
+        # TODO: replace ugly hack below
         args = self.cmd
         if sys.platform == 'win32' and os.path.splitext(self.cmd[0])[1] == '.py':
+            # Python GUI script should be replaced by Shell scripts
             os.chdir(os.path.join(os.getenv('GISBASE'), 'etc', 'gui', 'scripts'))
             args = [sys.executable, self.cmd[0]] + self.cmd[1:]
+        if sys.platform == 'win32' and \
+                self.cmd[0] in globalvar.grassScripts[globalvar.SCT_EXT]:
+            args[0] = self.cmd[0] + globalvar.SCT_EXT
+            env = copy.deepcopy(self.env)
+            # FIXME: env is None?  hmph. borrow sys.path instead.
+            #env['PATH'] = os.path.join(os.getenv('GISBASE').replace('/', '\\'), 'scripts') + \
+            #    os.pathsep + env['PATH']
+            scriptdir = os.path.join(os.getenv('GISBASE').replace('/', '\\'), 'scripts')
+            if scriptdir not in sys.path:
+                sys.path.append(scriptdir)
+        else:
+            env = self.env
         
         try:
             self.module = Popen(args,
                                 stdin = subprocess.PIPE,
                                 stdout = subprocess.PIPE,
                                 stderr = subprocess.PIPE,
-                                shell = sys.platform == "win32")
+                                shell = sys.platform == "win32",
+                                env = env)
+        
         except OSError, e:
             self.error = str(e)
             print >> sys.stderr, e
@@ -604,7 +661,7 @@ def RunCommand(prog, flags = "", overwrite = False, quiet = False, verbose = Fal
     if stdin:
         kwargs['stdin'] = subprocess.PIPE
     
-    ps = grass.start_command(prog, flags, overwrite, quiet, verbose, **kwargs)
+    ps = grass.start_command(GetRealCmd(prog), flags, overwrite, quiet, verbose, **kwargs)
     
     Debug.msg(2, "gcmd.RunCommand(): command started")
 
@@ -614,7 +671,7 @@ def RunCommand(prog, flags = "", overwrite = False, quiet = False, verbose = Fal
         ps.stdin = None
     
     Debug.msg(3, "gcmd.RunCommand(): decoding string")
-    stdout, stderr = map(utils.DecodeString, ps.communicate())
+    stdout, stderr = map(DecodeString, ps.communicate())
     
     ret = ps.returncode
     Debug.msg(1, "gcmd.RunCommand(): get return code %d" % ret)
@@ -648,3 +705,17 @@ def RunCommand(prog, flags = "", overwrite = False, quiet = False, verbose = Fal
     
     Debug.msg(2, "gcmd.RunCommand(): return result")
     return stdout, _formatMsg(stderr)
+
+def GetDefaultEncoding(forceUTF8 = False):
+    """!Get default system encoding
+    
+    @param forceUTF8 force 'UTF-8' if encoding is not defined
+
+    @return system encoding (can be None)
+    """
+    enc = locale.getdefaultlocale()[1]
+    if forceUTF8 and (enc is None or enc == 'UTF8'):
+        return 'UTF-8'
+    
+    Debug.msg(1, "GetSystemEncoding(): %s" % enc)
+    return enc
diff --git a/gui/wxpython/core/globalvar.py b/gui/wxpython/core/globalvar.py
new file mode 100644
index 0000000..95f5856
--- /dev/null
+++ b/gui/wxpython/core/globalvar.py
@@ -0,0 +1,278 @@
+"""!
+ at package core.globalvar
+
+ at brief Global variables used by wxGUI
+
+(C) 2007-2012 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import os
+import sys
+import locale
+
+if not os.getenv("GISBASE"):
+    sys.exit("GRASS is not running. Exiting...")
+
+# path to python scripts
+ETCDIR = os.path.join(os.getenv("GISBASE"), "etc")
+ETCICONDIR = os.path.join(os.getenv("GISBASE"), "etc", "gui", "icons")
+ETCWXDIR = os.path.join(ETCDIR, "wxpython")
+ETCIMGDIR = os.path.join(ETCDIR, "gui", "images")
+ETCSYMBOLDIR = os.path.join(ETCDIR, "gui", "images", "symbols")
+
+from core.debug import Debug
+
+sys.path.append(os.path.join(ETCDIR, "python"))
+import grass.script as grass
+
+def CheckWxVersion(version = [2, 8, 11, 0]):
+    """!Check wx version"""
+    ver = wx.version().split(' ')[0]
+    if map(int, ver.split('.')) < version:
+        return False
+    
+    return True
+
+def CheckForWx():
+    """!Try to import wx module and check its version"""
+    if 'wx' in sys.modules.keys():
+        return
+    
+    minVersion = [2, 8, 1, 1]
+    unsupportedVersion = [2, 9, 0, 0]
+    try:
+        try:
+            import wxversion
+        except ImportError, e:
+            raise ImportError(e)
+        # wxversion.select(str(minVersion[0]) + '.' + str(minVersion[1]))
+        wxversion.ensureMinimal(str(minVersion[0]) + '.' + str(minVersion[1]))
+        import wx
+        version = wx.version().split(' ')[0]
+        
+        if map(int, version.split('.')) < minVersion:
+            raise ValueError('Your wxPython version is %s.%s.%s.%s' % tuple(version.split('.')))
+        if map(int, version.split('.')) >= unsupportedVersion:
+            print >> sys.stderr, 'ERROR: wxGUI does not support wxPython %s yet.' % version
+            sys.exit(1)
+    except ImportError, e:
+        print >> sys.stderr, 'ERROR: wxGUI requires wxPython. %s' % str(e)
+        sys.exit(1)
+    except (ValueError, wxversion.VersionError), e:
+        print >> sys.stderr, 'ERROR: wxGUI requires wxPython >= %d.%d.%d.%d. ' % tuple(minVersion) + \
+            '%s.' % (str(e))
+        sys.exit(1)
+    except locale.Error, e:
+        print >> sys.stderr, "Unable to set locale:", e
+        os.environ['LC_ALL'] = ''
+    
+if not os.getenv("GRASS_WXBUNDLED"):
+    CheckForWx()
+import wx
+import wx.lib.flatnotebook as FN
+
+"""
+Query layer (generated for example by selecting item in the Attribute Table Manager)
+Deleted automatically on re-render action
+"""
+# temporal query layer (removed on re-render action)
+QUERYLAYER = 'qlayer'
+
+"""!Style definition for FlatNotebook pages"""
+FNPageStyle = FN.FNB_VC8 | \
+    FN.FNB_BACKGROUND_GRADIENT | \
+    FN.FNB_NODRAG | \
+    FN.FNB_TABS_BORDER_SIMPLE 
+
+FNPageDStyle = FN.FNB_FANCY_TABS | \
+    FN.FNB_BOTTOM | \
+    FN.FNB_NO_NAV_BUTTONS | \
+    FN.FNB_NO_X_BUTTON
+
+FNPageColor = wx.Colour(125,200,175)
+
+"""!Dialog widget dimension"""
+DIALOG_SPIN_SIZE = (150, -1)
+DIALOG_COMBOBOX_SIZE = (300, -1)
+DIALOG_GSELECT_SIZE = (400, -1)
+DIALOG_TEXTCTRL_SIZE = (400, -1)
+DIALOG_LAYER_SIZE = (100, -1)
+DIALOG_COLOR_SIZE = (30, 30)
+
+MAP_WINDOW_SIZE = (800, 600)
+GM_WINDOW_SIZE = (500, 600)
+
+if sys.platform == 'win32':
+    BIN_EXT = '.exe'
+    SCT_EXT = '.bat'
+else:
+    BIN_EXT = SCT_EXT = ''
+
+def GetGRASSCommands():
+    """!Create list of available GRASS commands to use when parsing
+    string from the command line
+
+    @return list of commands (set) and directory of scripts (collected
+    by extension - MS Windows only)
+    """
+    gisbase = os.environ['GISBASE']
+    cmd = list()
+    if sys.platform == 'win32':
+        scripts = { SCT_EXT : list() }
+    else:
+        scripts = {}
+    
+    # scan bin/
+    if os.path.exists(os.path.join(gisbase, 'bin')):
+        for fname in os.listdir(os.path.join(gisbase, 'bin')):
+            if scripts: # win32
+                name, ext = os.path.splitext(fname)
+                if ext != '.manifest':
+                    cmd.append(name)
+                if ext in scripts.keys():
+                    scripts[ext].append(name)
+            else:
+                cmd.append(fname)
+    
+    # scan scripts/ (not on MS Windows)
+    if not scripts and os.path.exists(os.path.join(gisbase, 'scripts')):
+        for fname in os.listdir(os.path.join(gisbase, 'scripts')):
+            cmd.append(fname)
+    
+    # scan gui/scripts/
+    if os.path.exists(os.path.join(gisbase, 'etc', 'gui', 'scripts')):
+        os.environ["PATH"] = os.getenv("PATH") + os.pathsep + os.path.join(gisbase, 'etc', 'gui', 'scripts')
+        os.environ["PATH"] = os.getenv("PATH") + os.pathsep + os.path.join(gisbase, 'etc', 'wxpython', 'scripts')
+        
+        pattern = "_wrapper"
+        for script in os.listdir(os.path.join(gisbase, 'etc', 'gui', 'scripts')):
+            if script[-len(pattern):] != pattern: # ignore wrappers
+                cmd.append(script)
+    
+    return set(cmd), scripts
+
+def UpdateGRASSAddOnCommands(eList = None):
+    """!Update list of available GRASS AddOns commands to use when
+    parsing string from the command line
+
+    @param eList list of AddOns commands to remove
+    """
+    global grassCmd, grassScripts
+    
+    # scan addons (path)
+    if not os.getenv('GRASS_ADDON_PATH'):
+        return
+        
+    # remove commands first
+    if eList:
+        for ext in eList:
+            if ext in grassCmd:
+                grassCmd.remove(ext)
+        Debug.msg(1, "Number of removed AddOn commands: %d", len(eList))
+
+    nCmd = 0
+    for path in os.getenv('GRASS_ADDON_PATH').split(os.pathsep):
+        if not os.path.exists(path) or not os.path.isdir(path):
+            continue
+        for fname in os.listdir(path):
+            if fname in ['docs', 'modules.xml']:
+                continue
+            if grassScripts: # win32
+                name, ext = os.path.splitext(fname)
+                if ext not in [BIN_EXT, SCT_EXT]:
+                    continue
+                if name not in grassCmd:
+                    grassCmd.add(name)
+                    Debug.msg(3, "AddOn commands: %s", name)
+                    nCmd += 1
+                if ext == SCT_EXT and \
+                        ext in grassScripts.keys() and \
+                        name not in grassScripts[ext]:
+                    grassScripts[ext].append(name)
+            else:
+                if fname not in grassCmd:
+                    grassCmd.add(fname)
+                    Debug.msg(3, "AddOn commands: %s", fname)
+                    nCmd += 1
+                    
+    Debug.msg(1, "Number of new AddOn commands: %d", nCmd)
+
+def SetLanguage():
+    import locale
+    
+    language = os.getenv('LANG')
+    if not language:
+        return
+    
+    language = language.split('.')[0] # Split off ignored .encoding part if present
+    orig_language = language
+    try:
+        locale.setlocale(locale.LC_ALL, language)
+    except locale.Error, e:
+        if sys.platform != 'win32': # Don't try on Windows, it will probably not work
+            # sys.stderr.write("Failed to set LC_ALL to %s (%s)\n" % (language, e))
+            try:
+                # Locale lang.encoding might be missing. Let's try
+                # UTF-8 encoding before giving up as on Linux systems
+                # lang.UTF-8 locales are more common than legacy
+                # ISO-8859 ones.
+                language = locale.normalize('%s.UTF-8' % (language))
+                locale.setlocale(locale.LC_ALL, language)
+            except locale.Error, e:
+                # If we got so far, provided locale is not supported
+                # on this system
+                sys.stderr.write("Failed to set LC_ALL to %s (%s)\n" % (language, e))
+                ### locale.getdefaultlocale() is probably related to gettext?
+                # try:
+                #     default_locale = locale.getdefaultlocale()
+                # except:
+                #     default_locale = None
+                # if default_locale and default_locale[0]:
+                #     language = default_locale[0]
+                # else:
+                language = 'C'
+    
+    # Set up environment for subprocesses
+    for lc in ('LC_CTYPE', 'LC_MESSAGES', 'LC_TIME', 'LC_COLLATE', 'LC_MONETARY', 'LC_PAPER',
+               'LC_NAME', 'LC_ADDRESS', 'LC_TELEPHONE', 'LC_MEASUREMENT', 'LC_IDENTIFICATION'):
+        os.environ[lc] = language
+    
+    Debug.msg(1, "Language setttings: (WX) %s / (GRASS) %s", language, orig_language)
+    
+    # Some code in GRASS might not like other decimal separators than .
+    # Other potential sources for problems are: LC_TIME LC_CTYPE
+    locale.setlocale(locale.LC_NUMERIC, 'C')
+    os.environ['LC_NUMERIC'] = 'C'
+    if os.getenv('LC_ALL'):
+        del os.environ['LC_ALL'] # Remove LC_ALL to not override LC_NUMERIC
+    
+    # Even if setting locale has failed, let's set LANG in a hope,
+    # that UI will use it GRASS texts will be in selected language,
+    # system messages (i.e. OK, Cancel etc.) - in system default
+    # language
+    os.environ['LANGUAGE'] = orig_language
+    os.environ['LANG'] = orig_language
+
+"""@brief Collected GRASS-relared binaries/scripts"""
+grassCmd, grassScripts = GetGRASSCommands()
+Debug.msg(1, "Number of GRASS commands: %d", len(grassCmd))
+UpdateGRASSAddOnCommands()
+
+"""@Toolbar icon size"""
+toolbarSize = (24, 24)
+
+"""@Is g.mlist available?"""
+if 'g.mlist' in grassCmd:
+    have_mlist = True
+else:
+    have_mlist = False
+
+"""@Check version of wxPython, use agwStyle for 2.8.11+"""
+hasAgw = CheckWxVersion()
+
+SetLanguage()
diff --git a/gui/wxpython/gui_modules/menudata.py b/gui/wxpython/core/menudata.py
similarity index 71%
rename from gui/wxpython/gui_modules/menudata.py
rename to gui/wxpython/core/menudata.py
index 88a9edc..461d9ab 100644
--- a/gui/wxpython/gui_modules/menudata.py
+++ b/gui/wxpython/core/menudata.py
@@ -1,13 +1,10 @@
 """!
- at package menudata.py
+ at package core.menudata
 
- at brief Complex list for menu entries for wxGUI.
+ at brief Complex list for menu entries for wxGUI
 
 Classes:
- - MenuData
- - ManagerData
- - ModelerData
- - PsMapData
+ - menudata::MenuData
 
 Usage:
 @code
@@ -21,6 +18,7 @@ where <i>action</i>:
  - dump
 
 (C) 2007-2011 by the GRASS Development Team
+
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
@@ -28,21 +26,21 @@ This program is free software under the GNU General Public License
 @author Yann Chemin <yann.chemin gmail.com>
 @author Martin Landa <landa.martin gmail.com>
 @author Glynn Clements
- at author Anna Kratochvilova <anna.kratochvilova fsv.cvut.cz>
 """
 
 import os
 import sys
+import pprint
 try:
-    import xml.etree.ElementTree as etree
+    import xml.etree.ElementTree   as etree
 except ImportError:
     import elementtree.ElementTree as etree # Python <= 2.4
 
+import wx
+
 if not os.getenv("GISBASE"):
     sys.exit("GRASS is not running. Exiting...")
 
-etcwxdir = os.path.join(os.getenv("GISBASE"), "etc", "wxpython")
-
 class MenuData:
     """!Abstract menu data class"""
     def __init__(self, filename):
@@ -62,6 +60,7 @@ class MenuData:
 	    gcmd     = mi.find('command')  # optional
             keywords = mi.find('keywords') # optional
             shortcut = mi.find('shortcut') # optional
+            wxId     = mi.find('id')       # optional
 	    if gcmd != None:
 		gcmd = gcmd.text
 	    else:
@@ -74,7 +73,11 @@ class MenuData:
                 shortcut = shortcut.text
             else:
                 shortcut = ""
-	    return (label, help, handler, gcmd, keywords, shortcut)
+            if wxId != None:
+                wxId = eval('wx.' + wxId.text)
+            else:
+                wxId = wx.ID_ANY
+	    return (label, help, handler, gcmd, keywords, shortcut, wxId)
 	elif mi.tag == 'menu':
 	    return self._getMenu(mi)
 	else:
@@ -191,67 +194,11 @@ class MenuData:
                     fh.write(menuSep.join(map(lambda x: x.replace('&', ''), menuItems)))
                     fh.write('%s%s' % (menuSep, eachItem[0]))
                     fh.write('\n')
-        
-class ManagerData(MenuData):
-    def __init__(self, filename = None):
-        if not filename:
-            gisbase = os.getenv('GISBASE')
-            global etcwxdir
-	    filename = os.path.join(etcwxdir, 'xml', 'menudata.xml')
-        
-        MenuData.__init__(self, filename)
-        
-    def GetModules(self):
-        """!Create dictionary of modules used to search module by
-        keywords, description, etc."""
-        modules = dict()
-        
-        for node in self.tree.getiterator():
-            if node.tag == 'menuitem':
-                module = description = ''
-                keywords = []
-                for child in node.getchildren():
-                    if child.tag == 'help':
-                        description = child.text
-                    if child.tag == 'command':
-                        module = child.text
-                    if child.tag == 'keywords':
-                        if child.text:
-                            keywords = child.text.split(',')
-                    
-                if module:
-                    modules[module] = { 'desc': description,
-                                        'keywords' : keywords }
-                    if len(keywords) < 1:
-                        print >> sys.stderr, "WARNING: Module <%s> has no keywords" % module
-                
-        return modules
-
-class ModelerData(MenuData):
-    def __init__(self, filename = None):
-        if not filename:
-            gisbase = os.getenv('GISBASE')
-            global etcwxdir
-	    filename = os.path.join(etcwxdir, 'xml', 'menudata_modeler.xml')
-        
-        MenuData.__init__(self, filename)
-
-class PsMapData(MenuData):
-    def __init__(self, path = None):
-        """!Menu for Cartographic Composer (psmap.py)
-        
-        @path path to XML to be read (None for menudata_psmap.xml)
-        """
-        if not path:
-            gisbase = os.getenv('GISBASE')
-            global etcwxdir
-        path = os.path.join(etcwxdir, 'xml', 'menudata_psmap.xml')
-        
-        MenuData.__init__(self, path)
 
 if __name__ == "__main__":
+    import os
     import sys
-
+    
     # i18N
     import gettext
     gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode=True)
@@ -265,16 +212,22 @@ if __name__ == "__main__":
         elif arg in ('manager', 'modeler'):
             menu = arg
     
+    sys.path.append(os.path.join(os.getenv("GISBASE"), "etc", "wxpython"))
+    
     if menu == 'manager':
+        from lmgr.menudata     import ManagerData
         data = ManagerData()
     else:
+        from gmodeler.menudata import ModelerData
         data = ModelerData()
-
+    
     if action == 'strings':
         data.PrintStrings(sys.stdout)
     elif action == 'tree':
         data.PrintTree(sys.stdout)
     elif action == 'commands':
         data.PrintCommands(sys.stdout)
+    elif action == 'dump':
+	pprint.pprint(data.GetMenu(), stream = sys.stdout, indent = 2)
     
     sys.exit(0)
diff --git a/gui/wxpython/gui_modules/render.py b/gui/wxpython/core/render.py
similarity index 91%
rename from gui/wxpython/gui_modules/render.py
rename to gui/wxpython/core/render.py
index c93fbb3..f4534a0 100644
--- a/gui/wxpython/gui_modules/render.py
+++ b/gui/wxpython/core/render.py
@@ -1,18 +1,18 @@
 """!
- at package render
+ at package core.render
 
-Rendering map layers and overlays into map composition image.
+ at brief Rendering map layers and overlays into map composition image.
 
 Classes:
- - Layer
- - MapLayer
- - Overlay
- - Map
+ - render::Layer
+ - render::MapLayer
+ - render::Overlay
+ - render::Map
 
 (C) 2006-2011 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Michael Barton
 @author Jachym Cepicky
@@ -24,13 +24,6 @@ import sys
 import glob
 import math
 import copy
-
-try:
-    import subprocess
-except:
-    compatPath = os.path.join(globalvar.ETCWXDIR, "compat")
-    sys.path.append(compatPath)
-    import subprocess
 import tempfile
 import types
 
@@ -39,11 +32,10 @@ from wx.lib.newevent import NewEvent
 
 from grass.script import core as grass
 
-import globalvar
-import utils
-import gcmd
-from debug import Debug as Debug
-from preferences import globalSettings as UserSettings
+from core          import utils
+from core.gcmd     import GException, GError, RunCommand
+from core.debug    import Debug
+from core.settings import UserSettings
 
 wxUpdateProgressBar, EVT_UPDATE_PRGBAR = NewEvent()
 
@@ -130,8 +122,8 @@ class Layer(object):
                       'overlay')
         
         if self.type not in layertypes:
-            raise gcmd.GException(_("<%(name)s>: layer type <%(type)s> is not supported") % \
-                                      {'type' : self.type, 'name' : self.name})
+            raise GException(_("<%(name)s>: layer type <%(type)s> is not supported") % \
+                                 {'type' : self.type, 'name' : self.name})
         
         # start monitor
         if UserSettings.Get(group='display', key='driver', subkey='type') == 'cairo':
@@ -168,10 +160,10 @@ class Layer(object):
             if self.type == 'command':
                 read = False
                 for c in self.cmd:
-                    ret, msg = gcmd.RunCommand(c[0],
-                                               getErrorMsg = True,
-                                               quiet = True,
-                                               **c[1])
+                    ret, msg = RunCommand(c[0],
+                                          getErrorMsg = True,
+                                          quiet = True,
+                                          **c[1])
                     if ret != 0:
                         break
                     if not read:
@@ -179,17 +171,18 @@ class Layer(object):
                 
                 os.environ["GRASS_PNG_READ"] = "FALSE"
             else:
-                ret, msg = gcmd.RunCommand(self.cmd[0],
-                                           getErrorMsg = True,
-                                           quiet = True,
-                                           **self.cmd[1])
+                ret, msg = RunCommand(self.cmd[0],
+                                      getErrorMsg = True,
+                                      quiet = True,
+                                      **self.cmd[1])
             
             if ret != 0:
-                raise gcmd.GException(value = _("'%(cmd)s' failed. Details: %(det)s") % \
-                                          { 'cmd' : self.cmd[0], 'det' : msg })
+                sys.stderr.write(_("Command '%s' failed\n") % self.GetCmd(string = True))
+                if msg:
+                    sys.stderr.write(_("Details: %s\n") % msg)
+                raise GException()
         
-        except gcmd.GException, e:
-            print >> sys.stderr, e.value
+        except GException:
             # clean up after problems
             try:
                 os.remove(self.mapfile)
@@ -284,7 +277,7 @@ class Layer(object):
                         'shaded', 'rgb', 'his', 'rastarrow', 'rastnum',
                         'thememap', 'themechart', 'grid', 'labels',
                         'geodesic','rhumb'):
-            raise gcmd.GException(_("Unsupported map layer type '%s'") % type)
+            raise GException(_("Unsupported map layer type '%s'") % type)
         
         self.type = type
 
@@ -316,7 +309,7 @@ class Layer(object):
             for c in cmd:
                 self.cmd.append(utils.CmdToTuple(c))
         else:
-            self.cmd  = utils.CmdToTuple(cmd)
+            self.cmd = utils.CmdToTuple(cmd)
         Debug.msg(3, "Layer.SetCmd(): cmd='%s'" % self.GetCmd(string = True))
         
         # for re-rendering
@@ -441,7 +434,7 @@ class Map(object):
             sys.exit(_("GRASS module '%s' not found. Unable to start map "
                        "display window.") % 'g.proj')
         
-        ret = self._runCommand(gcmd.RunCommand, prog = 'g.proj',
+        ret = self._runCommand(RunCommand, prog = 'g.proj',
                                read = True, flags = 'p')
         
         if not ret:
@@ -514,8 +507,9 @@ class Map(object):
         nwres = ewres = 0.0
         
         # Get current values for region and display
-        nsres = self.GetRegion()['nsres']
-        ewres = self.GetRegion()['ewres']
+        reg = self.GetRegion()
+        nsres = reg['nsres']
+        ewres = reg['ewres']
         
         n = float(self.region['n'])
         s = float(self.region['s'])
@@ -527,15 +521,16 @@ class Map(object):
         new['cols'] = math.fabs(round((e-w)/ewres))
         
         # Calculate new extents
-        new['s'] = nsres * round(s/nsres)
-        new['w'] = ewres * round(w/ewres)
+        new['s'] = nsres * round(s / nsres)
+        new['w'] = ewres * round(w / ewres)
         new['n'] = new['s'] + (new['rows'] * nsres)
         new['e'] = new['w'] + (new['cols'] * ewres)
         
         return new
 
     def AlignExtentFromDisplay(self):
-        """!Align region extent based on display size from center point"""
+        """!Align region extent based on display size from center
+        point"""
         # calculate new bounding box based on center of display
         if self.region["ewres"] > self.region["nsres"]:
             res = self.region["ewres"]
@@ -556,10 +551,8 @@ class Map(object):
         
         # LL locations
         if self.projinfo['proj'] == 'll':
-            if self.region['n'] > 90.0:
-                self.region['n'] = 90.0
-            if self.region['s'] < -90.0:
-                self.region['s'] = -90.0
+            self.region['n'] = min(self.region['n'], 90.0)
+            self.region['s'] = max(self.region['s'], -90.0)
         
     def ChangeMapSize(self, (width, height)):
         """!Change size of rendered map.
@@ -597,6 +590,8 @@ class Map(object):
         
         @return region settings as directory, e.g. {
         'n':'4928010', 's':'4913700', 'w':'589980',...}
+        
+        @see GetCurrentRegion()
         """
         region = {}
         
@@ -637,10 +632,10 @@ class Map(object):
         if vect:
             cmd['vect'] = ','.join(vect)
         
-        ret, reg, msg = gcmd.RunCommand('g.region',
-                                        read = True,
-                                        getErrorMsg = True,
-                                        **cmd)
+        ret, reg, msg = RunCommand('g.region',
+                                   read = True,
+                                   getErrorMsg = True,
+                                   **cmd)
         
         if ret != 0:
             if rast:
@@ -653,7 +648,7 @@ class Map(object):
                 message = _("Unable to get current geographic extent. "
                             "Force quiting wxGUI. Please manually run g.region to "
                             "fix the problem.")
-            gcmd.GError(message)
+            GError(message)
             return self.region
         
         for r in reg.splitlines():
@@ -679,7 +674,10 @@ class Map(object):
         return region
 
     def GetCurrentRegion(self):
-        """!Get current display region settings"""
+        """!Get current display region settings
+        
+        @see GetRegion()
+        """
         return self.region
 
     def SetRegion(self, windres = False):
@@ -697,8 +695,7 @@ class Map(object):
         if windres:
             compRegion = self.GetRegion()
             region = copy.copy(self.region)
-            for key in ('nsres', 'ewres',
-                        'rows', 'cols', 'cells'):
+            for key in ('nsres', 'ewres', 'cells'):
                 region[key] = compRegion[key]
         else:
             # adjust region settings to match monitor
@@ -732,10 +729,14 @@ class Map(object):
                         (region['nsres'])
                     continue
                 elif key == "cols":
+                    if windres:
+                        continue
                     grass_region += 'cols: %d; ' % \
                         region['cols']
                     continue
                 elif key == "rows":
+                    if windres:
+                        continue
                     grass_region += 'rows: %d; ' % \
                         region['rows']
                     continue
@@ -882,14 +883,14 @@ class Map(object):
         else:
             os.environ["GRASS_PNG_AUTO_WRITE"] = "TRUE"
             os.environ["GRASS_PNG_READ"] = "FALSE"
-            os.environ["GRASS_COMPRESSION"] = "0"
+            os.environ["GRASS_PNG_COMPRESSION"] = "0"
             os.environ["GRASS_TRUECOLOR"] = "TRUE"
             os.environ["GRASS_RENDER_IMMEDIATE"] = "TRUE"
         
         self._renderLayers(force, mapWindow, maps, masks, opacities)
         
         # ugly hack for MSYS
-        if not subprocess.mswindows:
+        if sys.platform != 'win32':
             mapstr = ",".join(maps)
             maskstr = ",".join(masks)
             mapoutstr = self.mapfile
@@ -908,15 +909,6 @@ class Map(object):
         bgcolor = ':'.join(map(str, UserSettings.Get(group = 'display', key = 'bgcolor',
                                                      subkey = 'color')))
         
-        complist = ["g.pnmcomp",
-                    "in=%s" % ",".join(maps),
-                    "mask=%s" % ",".join(masks),
-                    "opacity=%s" % ",".join(opacities),
-                    "background=%s" % bgcolor,
-                    "width=%s" % str(self.width),
-                    "height=%s" % str(self.height),
-                    "output=%s" % self.mapfile]
-        
         # render overlays
         if tmp_region:
             os.environ["GRASS_REGION"] = tmp_region
@@ -925,7 +917,8 @@ class Map(object):
         
         if maps:
             # run g.pngcomp to get composite image
-            ret = gcmd.RunCommand('g.pnmcomp',
+            ret, msg = RunCommand('g.pnmcomp',
+                                  getErrorMsg = True,
                                   input = '%s' % ",".join(maps),
                                   mask = '%s' % ",".join(masks),
                                   opacity = '%s' % ",".join(opacities),
@@ -935,7 +928,7 @@ class Map(object):
                                   output = self.mapfile)
             
             if ret != 0:
-                print >> sys.stderr, _("ERROR: Rendering failed")
+                print >> sys.stderr, _("ERROR: Rendering failed. Details: %s") % msg
                 wx.EndBusyCursor()
                 return None
             
@@ -984,7 +977,7 @@ class Map(object):
         Debug.msg (3, "Map.AddLayer(): layer=%s" % layer.name)
         if l_render:
             if not layer.Render():
-                raise gcmd.GException(_("Unable to render map layer <%s>.") % name)
+                raise GException(_("Unable to render map layer <%s>.") % name)
         
         wx.EndBusyCursor()
 
@@ -1068,8 +1061,8 @@ class Map(object):
             layer.SetOpacity(kargs['opacity'])
         
         if render and not layer.Render():
-            raise gcmd.GException(_("Unable to render map layer <%s>.") % 
-                                  name)
+            raise GException(_("Unable to render map layer <%s>.") % 
+                             name)
         
         return layer
 
@@ -1177,8 +1170,8 @@ class Map(object):
         self.overlays.append(overlay)
         
         if l_render and command != '' and not overlay.Render():
-            raise gcmd.GException(_("Unable to render overlay <%s>.") % 
-                                  name)
+            raise GException(_("Unable to render overlay <%s>.") % 
+                             name)
         
         return self.overlays[-1]
 
@@ -1215,9 +1208,9 @@ class Map(object):
         if 'opacity' in kargs:
             overlay.SetOpacity(kargs['opacity'])
         
-        if render and command != [] and not overlay.Render():
-            raise gcmd.GException(_("Unable to render overlay <%s>.") % 
-                                  name)
+        if render and overlay.GetCmd() != [] and not overlay.Render():
+            raise GException(_("Unable to render overlay <%s>.") % 
+                             name)
         
         return overlay
 
@@ -1248,7 +1241,7 @@ class Map(object):
     def DeleteOverlay(self, overlay):
         """!Delete overlay
         
-        @param id overlay id
+        @param overlay overlay layer
         
         @return removed overlay on success or None
         """
@@ -1295,31 +1288,29 @@ class Map(object):
         """!Reverse list of layers"""
         return self.layers.reverse()
 
+    def RenderOverlays(self, force):
+        """!Render overlays only (for nviz)"""
+        for layer in self.overlays:
+            if force or layer.force_render:
+                layer.Render()
+                
 if __name__ == "__main__":
-    """!Test of Display class.
-    Usage: display=Render()
-    """
     import gettext
     gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
     
-    print "Initializing..."
-    grass.run_command("g.region", flags = "d")
-    
-    map = Map()
-    map.width = 640
-    map.height = 480
+    Map = Map()
+    Map.GetRegion(update = True)
     
-    map.AddLayer(type = "raster",
-                 name = "elevation.dem",
-                 command = ["d.rast", "elevation.dem at PERMANENT", "catlist=1000-1500", "-i"],
+    Map.AddLayer(type = "raster",
+                 name = "elevation",
+                 command = ["d.rast", "map=elevation at PERMANENT"],
                  l_opacity = .7)
     
-    map.AddLayer(type = "vector",
-                 name = "streams",
-                 command = ["d.vect", "streams at PERMANENT", "color=red", "width=3", "type=line"])
+    Map.AddLayer(type = "vector",
+                 name = "roadsmajor",
+                 command = ["d.vect", "map=roadsmajor at PERMANENT", "color=red", "width=3", "type=line"])
     
-    image = map.Render(force = True)
+    image = Map.Render(force = True)
     
     if image:
-        os.system("display %s" % image)
-    
+        grass.call(["display", image])
diff --git a/gui/wxpython/core/settings.py b/gui/wxpython/core/settings.py
new file mode 100644
index 0000000..bb02906
--- /dev/null
+++ b/gui/wxpython/core/settings.py
@@ -0,0 +1,1029 @@
+"""!
+ at package core.settings
+
+ at brief Default GUI settings
+
+List of classes:
+ - settings::Settings
+
+Usage:
+ at code
+from core.settings import UserSettings
+ at endcode
+
+(C) 2007-2011 by the GRASS Development Team
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+ at author Luca Delucchi <lucadeluge gmail.com> (language choice)
+"""
+
+import os
+import sys
+import copy
+import types
+import locale
+
+from core       import globalvar
+from core.gcmd  import GException, GError
+from core.utils import GetSettingsPath, PathJoin
+
+class Settings:
+    """!Generic class where to store settings"""
+    def __init__(self):
+        # settings file
+        self.filePath = os.path.join(GetSettingsPath(), 'wx')
+        
+        # key/value separator
+        self.sep = ';'
+        
+        # define default settings
+        self._defaultSettings()  # -> self.defaultSettings
+        
+        # read settings from the file
+        self.userSettings = copy.deepcopy(self.defaultSettings)
+        try:
+            self.ReadSettingsFile()
+        except GException, e:
+            print >> sys.stderr, e.value
+        
+        # define internal settings
+        self._internalSettings() # -> self.internalSettings
+
+    def _generateLocale(self):
+        """!Generate locales
+        """
+        import os
+        
+        try:
+            self.locs = os.listdir(os.path.join(os.environ['GISBASE'], 'locale'))
+            self.locs.append('en') # GRASS doesn't ship EN po files
+            self.locs.sort()
+            # Add a default choice to not override system locale
+            self.locs.insert(0, 'system')
+        except:
+            # No NLS
+            self.locs = ['system']
+        
+        return 'system'
+    
+    def _defaultSettings(self):
+        """!Define default settings
+        """
+        try:
+            projFile = PathJoin(os.environ["GRASS_PROJSHARE"], 'epsg')
+        except KeyError:
+            projFile = ''
+        
+        self.defaultSettings = {
+            #
+            # general
+            #
+            'general': {
+                # use default window layout (layer manager, displays, ...)
+                'defWindowPos' : {
+                    'enabled' : True,
+                    'dim' : '0,0,%d,%d,%d,0,%d,%d' % \
+                        (globalvar.GM_WINDOW_SIZE[0],
+                         globalvar.GM_WINDOW_SIZE[1],
+                         globalvar.GM_WINDOW_SIZE[0],
+                         globalvar.MAP_WINDOW_SIZE[0],
+                         globalvar.MAP_WINDOW_SIZE[1])
+                    },
+                # workspace
+                'workspace' : {
+                    'posDisplay' : {
+                        'enabled' : False
+                        },
+                    'posManager' : {
+                        'enabled' : False
+                        },
+                    },
+                },
+            'manager' : {
+                # show opacity level widget
+                'changeOpacityLevel' : {
+                    'enabled' : False
+                    }, 
+                # ask when removing layer from layer tree
+                'askOnRemoveLayer' : {
+                    'enabled' : True
+                    },
+                # ask when quiting wxGUI or closing display
+                'askOnQuit' : {
+                    'enabled' : True
+                    },
+                # hide tabs
+                'hideTabs' : {
+                    'search' : False,
+                    'pyshell' : False,
+                    },
+                'copySelectedTextToClipboard' : {
+                    'enabled' : False
+                    },
+                },
+            #
+            # appearance
+            #
+            'appearance': {
+                'outputfont' : {
+                    'type' : 'Courier New',
+                    'size': '10',
+                    },
+                # expand/collapse element list
+                'elementListExpand' : {
+                    'selection' : 0 
+                    },
+                'menustyle' : {
+                    'selection' : 1
+                    },
+                'gSelectPopupHeight' : {
+                    'value' : 200
+                    },
+                'iconTheme' : {
+                    'type' : 'grass2'
+                    }, # grass2, grass, silk
+                },
+            #
+            # language
+            #
+            'language': {
+                'locale': {
+                    'lc_all' : self._generateLocale(),
+                }
+            },
+            #
+            # display
+            #
+            'display': {
+                'font' : {
+                    'type' : '',
+                    'encoding': 'ISO-8859-1',
+                    },
+                'driver': {
+                    'type': 'default'
+                    },
+                'alignExtent' : {
+                    'enabled' : True
+                    },
+                'compResolution' : {
+                    'enabled' : False
+                    },
+                'autoRendering': {
+                    'enabled' : True
+                    },
+                'autoZooming' : {
+                    'enabled' : False
+                    },
+                'statusbarMode': {
+                    'selection' : 0
+                    },
+                'bgcolor': {
+                    'color' : (255, 255, 255, 255),
+                    },
+                'mouseWheelZoom' : {
+                    'selection' : 1,
+                    },
+                'scrollDirection' : {
+                    'selection' : 0,
+                    },
+                'nvizDepthBuffer' : {
+                    'value' : 16,
+                    },
+                },
+            #
+            # projection
+            #
+            'projection' : {
+                'statusbar' : {
+                    'proj4'    : '',
+                    'epsg'     : '',
+                    'projFile' : projFile,
+                    },
+                'format' : {
+                    'll'  : 'DMS',
+                    'precision' : 2,
+                    },
+                },
+            #
+            # Attribute Table Manager
+            #
+            'atm' : {
+                'highlight' : {
+                    'color' : (255, 255, 0, 255),
+                    'width' : 2
+                    },
+                'leftDbClick' : {
+                    'selection' : 1 # draw selected
+                    },
+                'askOnDeleteRec' : {
+                    'enabled' : True
+                    },
+                'keycolumn' : {
+                    'value' : 'cat'
+                    },
+                'encoding' : {
+                    'value' : '',
+                    }
+                },
+            #
+            # Command
+            #
+            'cmd': {
+                'overwrite' : {
+                    'enabled' : False
+                    },
+                'closeDlg' : {
+                    'enabled' : False
+                    },
+                'verbosity' : {
+                    'selection' : 'grassenv'
+                    },
+                # d.rast
+                'rasterOverlay' : {
+                    'enabled' : True
+                    },
+                'rasterColorTable' : {
+                    'enabled'   : False,
+                    'selection' : 'rainbow',
+                    },
+                # d.vect
+                'showType': {
+                    'point' : {
+                        'enabled' : True
+                        },
+                    'line' : {
+                        'enabled' : True
+                        },
+                    'centroid' : {
+                        'enabled' : True
+                        },
+                    'boundary' : {
+                        'enabled' : True
+                        },
+                    'area' : {
+                        'enabled' : True
+                        },
+                    'face' : {
+                        'enabled' : True
+                        },
+                    },
+                'addNewLayer' : {
+                    'enabled' : True,
+                    },
+                'interactiveInput' : {
+                    'enabled' : True,
+                    },
+                },
+            #
+            # vdigit
+            #
+            'vdigit' : {
+                # symbology
+                'symbol' : {
+                    'newSegment' : {
+                        'enabled' : None,
+                        'color' : (255, 0, 0, 255)
+                        }, # red
+                    'newLine' : {
+                        'enabled' : None,
+                        'color' : (0, 86, 45, 255)
+                        }, # dark green
+                    'highlight' : {
+                        'enabled' : None,
+                        'color' : (255, 255, 0, 255)
+                        }, # yellow
+                    'highlightDupl' : {
+                        'enabled' : None,
+                        'color' : (255, 72, 0, 255)
+                        }, # red
+                    'point' : {
+                        'enabled' : True,
+                        'color' : (0, 0, 0, 255)
+                        }, # black
+                    'line' : {
+                        'enabled' : True,
+                        'color' : (0, 0, 0, 255)
+                        }, # black
+                    'boundaryNo' : {
+                        'enabled' : True,
+                        'color' : (126, 126, 126, 255)
+                        }, # grey
+                    'boundaryOne' : {
+                        'enabled' : True,
+                        'color' : (0, 255, 0, 255)
+                        }, # green
+                    'boundaryTwo' : {
+                        'enabled' : True,
+                        'color' : (255, 135, 0, 255)
+                        }, # orange
+                    'centroidIn' : {
+                        'enabled' : True,
+                        'color' : (0, 0, 255, 255)
+                        }, # blue
+                    'centroidOut' : {
+                        'enabled' : True,
+                        'color' : (165, 42, 42, 255)
+                        }, # brown
+                    'centroidDup' : {
+                        'enabled' : True,
+                        'color' : (156, 62, 206, 255)
+                        }, # violet
+                    'nodeOne' : {
+                        'enabled' : True,
+                        'color' : (255, 0, 0, 255)
+                        }, # red
+                    'nodeTwo' : {
+                        'enabled' : True,
+                        'color' : (0, 86, 45, 255)
+                        }, # dark green
+                    'vertex' : {
+                        'enabled' : False,
+                        'color' : (255, 20, 147, 255)
+                        }, # deep pink
+                    'area' : {
+                        'enabled' : True,
+                        'color' : (217, 255, 217, 255)
+                        }, # green
+                    'direction' : {
+                        'enabled' : False,
+                        'color' : (255, 0, 0, 255)
+                        }, # red
+                    },
+                # display
+                'lineWidth' : {
+                    'value' : 2,
+                    'units' : 'screen pixels'
+                    },
+                # snapping
+                'snapping' : {
+                    'value' : 10,
+                    'units' : 'screen pixels'
+                    },
+                'snapToVertex' : {
+                    'enabled' : False
+                    },
+                # digitize new record
+                'addRecord' : {
+                    'enabled' : True
+                    },
+                'layer' :{
+                    'value' : 1
+                    },
+                'category' : {
+                    'value' : 1
+                    },
+                'categoryMode' : {
+                    'selection' : 0
+                    },
+                # delete existing feature(s)
+                'delRecord' : {
+                    'enabled' : True
+                    },
+                # query tool
+                'query' : {
+                    'selection' : 0,
+                    'box' : True
+                    },
+                'queryLength' : {
+                    'than-selection' : 0,
+                    'thresh' : 0
+                    },
+                'queryDangle' : {
+                    'than-selection' : 0,
+                    'thresh' : 0
+                    },
+                # select feature (point, line, centroid, boundary)
+                'selectType': {
+                    'point' : {
+                        'enabled' : True
+                        },
+                    'line' : {
+                        'enabled' : True
+                        },
+                    'centroid' : {
+                        'enabled' : True
+                        },
+                    'boundary' : {
+                        'enabled' : True
+                        },
+                    },
+                'selectThresh' : {
+                    'value' : 10,
+                    'units' : 'screen pixels'
+                    },
+                'checkForDupl' : {
+                    'enabled' : False
+                    },
+                'selectInside' : {
+                    'enabled' : False
+                    },
+                # exit
+                'saveOnExit' : {
+                    'enabled' : False,
+                    },
+                # break lines on intersection
+                'breakLines' : {
+                    'enabled' : False,
+                    },
+                },
+            'profile': {
+                'raster' : {
+                    'pcolor' : (0, 0, 255, 255), # profile line color
+                    'pwidth' : 1, # profile line width
+                    'pstyle' : 'solid', # profile line pen style
+                    },
+                'font' : {
+                    'titleSize' : 12,
+                    'axisSize' : 11,
+                    'legendSize' : 10,
+                    },
+                'marker' : {
+                    'color' : (0, 0, 0, 255),
+                    'fill' : 'transparent',
+                    'size' : 2,
+                    'type' : 'triangle',
+                    'legend' : _('Segment break'),
+                    },
+                'grid' : {
+                    'color' : (200, 200, 200, 255),
+                    'enabled' : True,
+                    },
+                'x-axis' : {
+                    'type' : 'auto', # axis format
+                    'min' : 0, # axis min for custom axis range
+                    'max': 0, # axis max for custom axis range
+                    'log' : False,
+                    },
+                'y-axis' : {
+                    'type' : 'auto', # axis format
+                    'min' : 0, # axis min for custom axis range
+                    'max': 0, # axis max for custom axis range
+                    'log' : False,
+                    },
+                'legend' : {
+                    'enabled' : True
+                    },
+                },
+            'gcpman' : {
+                'rms' : {
+                    'highestonly' : True,
+                    'sdfactor' : 1,
+                    },
+                'symbol' : {
+                    'color' : (0, 0, 255, 255),
+                    'hcolor' : (255, 0, 0, 255),
+                    'scolor' : (0, 255, 0, 255),
+                    'ucolor' : (255, 165, 0, 255),
+                    'unused' : True,
+                    'size' : 8,
+                    'width' : 2,
+                    },
+                },
+            'nviz' : {
+                'view' : {
+                    'persp' : {
+                        'value' : 20,
+                        'step' : 2,
+                        },
+                    'position' : {
+                        'x' : 0.84,
+                        'y' : 0.16,
+                        },
+                    'twist' : {
+                        'value' : 0,
+                        },
+                    'z-exag' : {
+                        'min' : 0,
+                        'max' : 10,
+                        'value': 1,
+                        },
+                    'background' : {
+                        'color' : (255, 255, 255, 255), # white
+                        },
+                    },
+                'fly' : {
+                    'exag' : {
+                        'move' : 5,
+                        'turn' : 5,
+                        }
+                    },
+                'animation' : {
+                    'fps' : 24,
+                    'prefix' : _("animation")
+                    },
+                'surface' : {
+                    'shine': {
+                        'map' : False,
+                        'value' : 60.0,
+                        },
+                    'color' : {
+                        'map' : True,
+                        'value' : (100, 100, 100, 255), # constant: grey
+                        },
+                    'draw' : {
+                        'wire-color' : (136, 136, 136, 255),
+                        'mode' : 1, # fine
+                        'style' : 1, # surface
+                        'shading' : 1, # gouraud
+                        'res-fine' : 6,
+                        'res-coarse' : 9,
+                        },
+                    'position' : {
+                        'x' : 0,
+                        'y' : 0,
+                        'z' : 0,
+                        },
+                    },
+                'constant' : {
+                    'color' : (100, 100, 100, 255),
+                    'value' : 0.0,
+                    'transp' : 0,
+                    'resolution': 6
+                },
+                'vector' : {
+                    'lines' : {
+                        'show' : False,
+                        'width' : 2,
+                        'color' : (0, 0, 255, 255), # blue
+                        'flat' : False,
+                        'height' : 0,
+                        },
+                    'points' : {
+                        'show' : False,
+                        'size' : 100,
+                        'width' : 2,
+                        'marker' : 2,
+                        'color' : (0, 0, 255, 255), # blue
+                        'height' : 0,
+                        }
+                    },
+                'volume' : {
+                    'color' : {
+                        'map' : True,
+                        'value' : (100, 100, 100, 255), # constant: grey
+                        },
+                    'draw' : {
+                        'mode'       : 0, # isosurfaces
+                        'shading'    : 1, # gouraud
+                        'resolution' : 3, # polygon resolution
+                        },
+                    'shine': {
+                        'map' : False,
+                        'value' : 60,
+                        },
+                    'topo': {
+                        'map' : None,
+                        'value' : 0.0
+                        },
+                    'transp': {
+                        'map' : None,
+                        'value': 0
+                        },
+                    'mask': {
+                        'map' : None,
+                        'value': ''
+                        },
+                    'slice_position': {
+                        'x1' : 0,
+                        'x2' : 1,
+                        'y1' : 0,
+                        'y2' : 1,
+                        'z1' : 0,
+                        'z2' : 1,
+                        'axis' : 0,
+                        }
+                    },
+                'cplane' : {
+                    'shading': 4,
+                    'rotation':{
+                        'rot': 180, 
+                        'tilt': 0
+                        }, 
+                    'position':{
+                        'x' : 0,
+                        'y' : 0,
+                        'z' : 0
+                    }   
+                },
+                'light' : {
+                    'position' : {
+                        'x' : 0.68,
+                        'y' : -0.68,
+                        'z' : 80,
+                        },
+                    'bright'  : 80,
+                    'color'   : (255, 255, 255, 255), # white
+                    'ambient' : 20,
+                    },
+                'fringe' : {
+                    'elev'   : 55,
+                    'color'  : (128, 128, 128, 255), # grey
+                    },
+                'arrow': {
+                    'color': (0, 0, 0),
+                    },
+                'scalebar': {
+                    'color': (0, 0, 0),
+                    }
+                },
+            'modeler' : {
+                'disabled': {
+                    'color': (211, 211, 211, 255), # light grey
+                    },
+                'action' : {
+                    'color' : {
+                        'valid'   :  (180, 234, 154, 255), # light green
+                        'invalid' :  (255, 255, 255, 255), # white
+                        'running' :  (255, 0, 0, 255),     # red
+                        },
+                    'size' : {
+                        'width'  : 125,
+                        'height' : 50,
+                        },
+                    'width': {
+                        'parameterized' : 2,
+                        'default'       : 1,
+                        },
+                    },
+                'data' : { 
+                    'color': {
+                        'raster'   : (215, 215, 248, 255), # light blue
+                        'raster3d' : (215, 248, 215, 255), # light green
+                        'vector'   : (248, 215, 215, 255), # light red
+                        },
+                    'size' : {
+                        'width' : 175,
+                        'height' : 50,
+                        },
+                    },
+                'loop' : {
+                    'color' : {
+                        'valid'   :  (234, 226, 154, 255), # light yellow
+                        },
+                    'size' : {
+                        'width' : 175,
+                        'height' : 40,
+                        },
+                    },
+                'if-else' : {
+                    'size' : {
+                        'width' : 150,
+                        'height' : 40,
+                        },
+                    },
+                },
+            }
+
+        # quick fix, http://trac.osgeo.org/grass/ticket/1233
+        # TODO
+        if sys.platform == 'darwin':
+            self.defaultSettings['general']['defWindowPos']['enabled'] = False
+
+    def _internalSettings(self):
+        """!Define internal settings (based on user settings)
+        """
+        self.internalSettings = {}
+        for group in self.userSettings.keys():
+            self.internalSettings[group] = {}
+            for key in self.userSettings[group].keys():
+                self.internalSettings[group][key] = {}
+
+        # self.internalSettings['general']["mapsetPath"]['value'] = self.GetMapsetPath()
+        self.internalSettings['appearance']['elementListExpand']['choices'] = \
+            (_("Collapse all except PERMANENT and current"),
+             _("Collapse all except PERMANENT"),
+             _("Collapse all except current"),
+             _("Collapse all"),
+             _("Expand all"))
+             
+        self.internalSettings['language']['locale']['choices'] = tuple(self.locs)
+        self.internalSettings['atm']['leftDbClick']['choices'] = (_('Edit selected record'),
+                                                                  _('Display selected'))
+        
+        self.internalSettings['cmd']['verbosity']['choices'] = ('grassenv',
+                                                                'verbose',
+                                                                'quiet')
+        
+        self.internalSettings['appearance']['iconTheme']['choices'] = ('grass',
+                                                                       'grass2',
+                                                                       'silk')
+        self.internalSettings['appearance']['menustyle']['choices'] = \
+                   (_("Classic (labels only)"),
+                    _("Combined (labels and module names)"),
+                    _("Professional (module names only)"))
+        self.internalSettings['appearance']['gSelectPopupHeight']['min'] = 50
+        # there is also maxHeight given to TreeCtrlComboPopup.GetAdjustedSize
+        self.internalSettings['appearance']['gSelectPopupHeight']['max'] = 1000
+        
+        self.internalSettings['display']['driver']['choices'] = ['default']
+        self.internalSettings['display']['statusbarMode']['choices'] = None # set during MapFrame init
+        self.internalSettings['display']['mouseWheelZoom']['choices'] = (_('Zoom and recenter'),
+                                                                         _('Zoom to mouse cursor'),
+                                                                         _('Nothing'))
+        self.internalSettings['display']['scrollDirection']['choices'] = (_('Scroll forward to zoom in'),
+                                                                          _('Scroll back to zoom in'))
+
+        self.internalSettings['nviz']['view'] = {}
+        self.internalSettings['nviz']['view']['twist'] = {}
+        self.internalSettings['nviz']['view']['twist']['min'] = -180
+        self.internalSettings['nviz']['view']['twist']['max'] = 180
+        self.internalSettings['nviz']['view']['persp'] = {}
+        self.internalSettings['nviz']['view']['persp']['min'] = 1
+        self.internalSettings['nviz']['view']['persp']['max'] = 100
+        self.internalSettings['nviz']['view']['height'] = {}
+        self.internalSettings['nviz']['view']['height']['value'] = -1
+        self.internalSettings['nviz']['view']['z-exag'] = {}
+        self.internalSettings['nviz']['view']['z-exag']['llRatio'] = 1
+        self.internalSettings['nviz']['view']['rotation'] = None
+        self.internalSettings['nviz']['view']['focus'] = {}
+        self.internalSettings['nviz']['view']['focus']['x'] = -1
+        self.internalSettings['nviz']['view']['focus']['y'] = -1
+        self.internalSettings['nviz']['view']['focus']['z'] = -1
+        self.internalSettings['nviz']['view']['dir'] = {}
+        self.internalSettings['nviz']['view']['dir']['x'] = -1
+        self.internalSettings['nviz']['view']['dir']['y'] = -1
+        self.internalSettings['nviz']['view']['dir']['z'] = -1
+        self.internalSettings['nviz']['view']['dir']['use'] = False
+        
+        for decor in ('arrow', 'scalebar'):
+            self.internalSettings['nviz'][decor] = {}
+            self.internalSettings['nviz'][decor]['position'] = {}
+            self.internalSettings['nviz'][decor]['position']['x'] = 0
+            self.internalSettings['nviz'][decor]['position']['y'] = 0
+            self.internalSettings['nviz'][decor]['size'] = 100
+        self.internalSettings['nviz']['vector'] = {}
+        self.internalSettings['nviz']['vector']['points'] = {}
+        self.internalSettings['nviz']['vector']['points']['marker'] = ("x",
+                                                                       _("box"),
+                                                                       _("sphere"),
+                                                                       _("cube"),
+                                                                       _("diamond"),
+                                                                       _("aster"),
+                                                                       _("gyro"),
+                                                                       _("histogram"))
+        self.internalSettings['vdigit']['bgmap'] = {}
+        self.internalSettings['vdigit']['bgmap']['value'] = ''
+        
+    def ReadSettingsFile(self, settings = None):
+        """!Reads settings file (mapset, location, gisdbase)"""
+        if settings is None:
+            settings = self.userSettings
+        
+        self._readFile(self.filePath, settings)
+        
+        # set environment variables
+        font = self.Get(group = 'display', key = 'font', subkey = 'type')
+        enc  = self.Get(group = 'display', key = 'font', subkey = 'encoding')
+        if font:
+            os.environ["GRASS_FONT"] = font
+        if enc:
+            os.environ["GRASS_ENCODING"] = enc
+        
+    def _readFile(self, filename, settings = None):
+        """!Read settings from file to dict
+
+        @param filename settings file path
+        @param settings dict where to store settings (None for self.userSettings)
+        """
+        if settings is None:
+            settings = self.userSettings
+        
+        if not os.path.exists(filename):
+            # try alternative path
+            filename = os.path.join(os.path.expanduser("~"), '.grasswx6')
+            if not os.path.exists(filename):
+                return
+        
+        try:
+            fd = open(filename, "r")
+        except IOError:
+            sys.stderr.write(_("Unable to read settings file <%s>\n") % filename)
+            return
+        
+        try:
+            line = ''
+            for line in fd.readlines():
+                line = line.rstrip('%s' % os.linesep)
+                group, key = line.split(self.sep)[0:2]
+                kv = line.split(self.sep)[2:]
+                subkeyMaster = None
+                if len(kv) % 2 != 0: # multiple (e.g. nviz)
+                    subkeyMaster = kv[0]
+                    del kv[0]
+                idx = 0
+                while idx < len(kv):
+                    if subkeyMaster:
+                        subkey = [subkeyMaster, kv[idx]]
+                    else:
+                        subkey = kv[idx]
+                    value = kv[idx+1]
+                    value = self._parseValue(value, read = True)
+                    self.Append(settings, group, key, subkey, value)
+                    idx += 2
+        except ValueError, e:
+            print >> sys.stderr, _("Error: Reading settings from file <%(file)s> failed.\n"
+                                   "\t\tDetails: %(detail)s\n"
+                                   "\t\tLine: '%(line)s'\n") % { 'file' : filename,
+                                                                 'detail' : e,
+                                                                 'line' : line }
+            fd.close()
+        
+        fd.close()
+        
+    def SaveToFile(self, settings = None):
+        """!Save settings to the file"""
+        if settings is None:
+            settings = self.userSettings
+        
+        dirPath = GetSettingsPath()
+        if not os.path.exists(dirPath):
+            try:
+                os.mkdir(dirPath)
+            except:
+                GError(_('Unable to create settings directory'))
+                return
+        
+        try:
+            file = open(self.filePath, "w")
+            for group in settings.keys():
+                for key in settings[group].keys():
+                    subkeys = settings[group][key].keys()
+                    file.write('%s%s%s%s' % (group, self.sep, key, self.sep))
+                    for idx in range(len(subkeys)):
+                        value = settings[group][key][subkeys[idx]]
+                        if type(value) == types.DictType:
+                            if idx > 0:
+                                file.write('%s%s%s%s%s' % (os.linesep, group, self.sep, key, self.sep))
+                            file.write('%s%s' % (subkeys[idx], self.sep))
+                            kvalues = settings[group][key][subkeys[idx]].keys()
+                            srange = range(len(kvalues))
+                            for sidx in srange:
+                                svalue = self._parseValue(settings[group][key][subkeys[idx]][kvalues[sidx]])
+                                file.write('%s%s%s' % (kvalues[sidx], self.sep,
+                                                       svalue))
+                                if sidx < len(kvalues) - 1:
+                                    file.write('%s' % self.sep)
+                        else:
+                            if idx > 0 and \
+                                    type(settings[group][key][subkeys[idx - 1]]) == types.DictType:
+                                file.write('%s%s%s%s%s' % (os.linesep, group, self.sep, key, self.sep))
+                            value = self._parseValue(settings[group][key][subkeys[idx]])
+                            file.write('%s%s%s' % (subkeys[idx], self.sep, value))
+                            if idx < len(subkeys) - 1 and \
+                                    type(settings[group][key][subkeys[idx + 1]]) != types.DictType:
+                                file.write('%s' % self.sep)
+                    file.write(os.linesep)
+        except IOError, e:
+            raise GException(e)
+        except StandardError, e:
+            raise GException(_('Writing settings to file <%(file)s> failed.'
+                               '\n\nDetails: %(detail)s') % { 'file' : self.filePath,
+                                                              'detail' : e })
+        
+        file.close()
+        
+    def _parseValue(self, value, read = False):
+        """!Parse value to be store in settings file"""
+        if read: # -> read settings (cast values)
+            if value == 'True':
+                value = True
+            elif value == 'False':
+                value = False
+            elif value == 'None':
+                value = None
+            elif ':' in value: # -> color
+                try:
+                    value = tuple(map(int, value.split(':')))
+                except ValueError: # -> string
+                    pass
+            else:
+                try:
+                    value = int(value)
+                except ValueError:
+                    try:
+                        value = float(value)
+                    except ValueError:
+                        pass
+        else: # -> write settings
+            if type(value) == type(()): # -> color
+                value = str(value[0]) + ':' +\
+                    str(value[1]) + ':' + \
+                    str(value[2])
+                
+        return value
+
+    def Get(self, group, key = None, subkey = None, internal = False):
+        """!Get value by key/subkey
+
+        Raise KeyError if key is not found
+        
+        @param group settings group
+        @param key (value, None)
+        @param subkey (value, list or None)
+        @param internal use internal settings instead
+
+        @return value
+        """
+        if internal is True:
+            settings = self.internalSettings
+        else:
+            settings = self.userSettings
+            
+        try:
+            if subkey is None:
+                if key is None:
+                    return settings[group]
+                else:
+                    return settings[group][key]
+            else:
+                if type(subkey) == type(tuple()) or \
+                        type(subkey) == type(list()):
+                    return settings[group][key][subkey[0]][subkey[1]]
+                else:
+                    return settings[group][key][subkey]  
+
+        except KeyError:
+            print >> sys.stderr, "Settings: unable to get value '%s:%s:%s'\n" % \
+                (group, key, subkey)
+        
+    def Set(self, group, value, key = None, subkey = None, internal = False):
+        """!Set value of key/subkey
+        
+        Raise KeyError if group/key is not found
+        
+        @param group settings group
+        @param key key (value, None)
+        @param subkey subkey (value, list or None)
+        @param value value
+        @param internal use internal settings instead
+        """
+        if internal is True:
+            settings = self.internalSettings
+        else:
+            settings = self.userSettings
+        
+        try:
+            if subkey is None:
+                if key is None:
+                    settings[group] = value
+                else:
+                    settings[group][key] = value
+            else:
+                if type(subkey) == type(tuple()) or \
+                        type(subkey) == type(list()):
+                    settings[group][key][subkey[0]][subkey[1]] = value
+                else:
+                    settings[group][key][subkey] = value
+        except KeyError:
+            raise GException("%s '%s:%s:%s'" % (_("Unable to set "), group, key, subkey))
+        
+    def Append(self, dict, group, key, subkey, value):
+        """!Set value of key/subkey
+
+        Create group/key/subkey if not exists
+        
+        @param dict settings dictionary to use
+        @param group settings group
+        @param key key
+        @param subkey subkey (value or list)
+        @param value value
+        """
+        if group not in dict:
+            dict[group] = {}
+
+        if key not in dict[group]:
+            dict[group][key] = {}
+
+        if type(subkey) == types.ListType:
+            # TODO: len(subkey) > 2
+            if subkey[0] not in dict[group][key]:
+                dict[group][key][subkey[0]] = {}
+            try:
+                dict[group][key][subkey[0]][subkey[1]] = value
+            except TypeError:
+                print >> sys.stderr, _("Unable to parse settings '%s'") % value + \
+                    ' (' + group + ':' + key + ':' + subkey[0] + ':' + subkey[1] + ')'
+        else:
+            try:
+                dict[group][key][subkey] = value
+            except TypeError:
+                print >> sys.stderr, _("Unable to parse settings '%s'") % value + \
+                    ' (' + group + ':' + key + ':' + subkey + ')'
+        
+    def GetDefaultSettings(self):
+        """!Get default user settings"""
+        return self.defaultSettings
+
+    def Reset(self, key = None):
+        """!Reset to default settings
+
+        @key key in settings dict (None for all keys)
+        """
+        if not key:
+            self.userSettings = copy.deepcopy(self.defaultSettings)
+        else:
+            self.userSettings[key] = copy.deepcopy(self.defaultSettings[key])
+        
+UserSettings = Settings()
diff --git a/gui/wxpython/gui_modules/units.py b/gui/wxpython/core/units.py
similarity index 90%
rename from gui/wxpython/gui_modules/units.py
rename to gui/wxpython/core/units.py
index 8e6a5e8..e7af0b9 100644
--- a/gui/wxpython/gui_modules/units.py
+++ b/gui/wxpython/core/units.py
@@ -1,24 +1,23 @@
 """!
- at package units
+ at package core.units
 
 @brief Units management
 
-Probably will be replaced by Python SWIG fns in the near future(?)
+ at todo Probably will be replaced by Python ctypes fns in the near
+future(?)
 
 Usage:
-
 @code
-from units import Units
+from core.units import Units
 @endcode
 
 Classes:
- - BaseUnits
+ - units::BaseUnits
 
-(C) 2009 by the GRASS Development Team
+(C) 2009, 2011 by the GRASS Development Team
 
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Martin Landa <landa.martin gmail.com>
 """
diff --git a/gui/wxpython/gui_modules/utils.py b/gui/wxpython/core/utils.py
similarity index 68%
rename from gui/wxpython/gui_modules/utils.py
rename to gui/wxpython/core/utils.py
index 8d756c3..e15e1b0 100644
--- a/gui/wxpython/gui_modules/utils.py
+++ b/gui/wxpython/core/utils.py
@@ -1,5 +1,5 @@
 """!
- at package utils.py
+ at package core.utils
 
 @brief Misc utilities for wxGUI
 
@@ -17,17 +17,18 @@ import sys
 import platform
 import string
 import glob
-import locale
 import shlex
+import re
+import locale
 
-import globalvar
-sys.path.append(os.path.join(globalvar.ETCDIR, "python"))
+from core.globalvar import ETCDIR
+sys.path.append(os.path.join(ETCDIR, "python"))
 
 from grass.script import core as grass
 from grass.script import task as gtask
 
-import gcmd
-from debug import Debug
+from core.gcmd  import RunCommand
+from core.debug import Debug
 
 def normalize_whitespace(text):
     """!Remove redundant whitespace from a string"""
@@ -35,9 +36,7 @@ def normalize_whitespace(text):
 
 def split(s):
     """!Platform spefic shlex.split"""
-    if sys.version_info >= (2, 6):
-        return shlex.split(s, posix = (sys.platform != "win32"))
-    elif sys.platform == "win32":
+    if sys.platform == "win32":
         return shlex.split(s.replace('\\', r'\\'))
     else:
         return shlex.split(s)
@@ -51,11 +50,9 @@ def GetTempfile(pref=None):
 
     @return Path to file name (string) or None
     """
-    import gcmd
-
-    ret = gcmd.RunCommand('g.tempfile',
-                          read = True,
-                          pid = os.getpid())
+    ret = RunCommand('g.tempfile',
+                     read = True,
+                     pid = os.getpid())
 
     tempfile = ret.splitlines()[0].strip()
 
@@ -117,41 +114,54 @@ def GetLayerNameFromCmd(dcmd, fullyQualified = False, param = None,
                      'h_map', 's_map', 'i_map',
                      'reliefmap', 'labels'):
                 params.append((idx, p, v))
-        
+
         if len(params) < 1:
-            if len(dcmd) > 1 and '=' not in dcmd[1]:
-                task = gtask.parse_interface(dcmd[0])
-                p = task.get_options()['params'][0].get('name', '')
-                params.append((1, p, dcmd[1]))
+            if len(dcmd) > 1:
+                i = 1
+                while i < len(dcmd):
+                    if '=' not in dcmd[i] and not dcmd[i].startswith('-'):
+                        task = gtask.parse_interface(dcmd[0])
+                        # this expects the first parameter to be the right one
+                        p = task.get_options()['params'][0].get('name', '')
+                        params.append((i, p, dcmd[i]))
+                        break
+                    i += 1
             else:
                 return mapname, False
-        
-        mapname = params[0][2]
-        mapset = ''
-        if fullyQualified and '@' not in mapname:
-            if layerType in ('raster', 'vector', '3d-raster', 'rgb', 'his'):
-                try:
-                    if layerType in ('raster', 'rgb', 'his'):
-                        findType = 'cell'
-                    else:
-                        findType = layerType
-                    mapset = grass.find_file(mapname, element = findType)['mapset']
-                except AttributeError, e: # not found
-                    return '', False
-                if not mapset:
-                    found = False
-            else:
-                mapset = grass.gisenv()['MAPSET']
-            
-            # update dcmd
-            for i, p, v in params:
-                if p:
-                    dcmd[i] = p + '=' + v
+
+        if len(params) < 1:
+            return mapname, False
+
+        # need to add mapset for all maps
+        mapsets = {}
+        for i, p, v in params:
+            mapname = v
+            mapset = ''
+            if fullyQualified and '@' not in mapname:
+                if layerType in ('raster', 'vector', '3d-raster', 'rgb', 'his'):
+                    try:
+                        if layerType in ('raster', 'rgb', 'his'):
+                            findType = 'cell'
+                        else:
+                            findType = layerType
+                        mapset = grass.find_file(mapname, element = findType)['mapset']
+                    except AttributeError, e: # not found
+                        return '', False
+                    if not mapset:
+                        found = False
                 else:
-                    dcmd[i] = v
-                if mapset:
-                    dcmd[i] += '@' + mapset
-        
+                    mapset = grass.gisenv()['MAPSET']
+            mapsets[i] = mapset
+            
+        # update dcmd
+        for i, p, v in params:
+            if p:
+                dcmd[i] = p + '=' + v
+            else:
+                dcmd[i] = v
+            if i in mapsets and mapsets[i]:
+                dcmd[i] += '@' + mapsets[i]
+
         maps = list()
         for i, p, v in params:
             if not p:
@@ -165,7 +175,7 @@ def GetLayerNameFromCmd(dcmd, fullyQualified = False, param = None,
 def GetValidLayerName(name):
     """!Make layer name SQL compliant, based on G_str_to_sql()
     
-    @todo: Better use directly GRASS Python SWIG...
+    @todo: Better use directly Ctypes to reuse venerable libgis C fns...
     """
     retName = str(name).strip()
     
@@ -243,29 +253,29 @@ def ListOfMapsets(get = 'ordered'):
     mapsets = []
     
     if get == 'all' or get == 'ordered':
-        ret = gcmd.RunCommand('g.mapsets',
-                              read = True,
-                              quiet = True,
-                              flags = 'l',
-                              fs = ';')
+        ret = RunCommand('g.mapsets',
+                         read = True,
+                         quiet = True,
+                         flags = 'l',
+                         fs = 'newline')
         
         if ret:
-            mapsets = ret.replace('\n', '').strip().split(';')
+            mapsets = ret.splitlines()
             ListSortLower(mapsets)
         else:
             return None
         
     if get == 'accessible' or get == 'ordered':
-        ret = gcmd.RunCommand('g.mapsets',
-                              read = True,
-                              quiet = True,
-                              flags = 'p',
-                              fs = ';')
+        ret = RunCommand('g.mapsets',
+                         read = True,
+                         quiet = True,
+                         flags = 'p',
+                         fs = 'newline')
         if ret:
             if get == 'accessible':
-                mapsets = ret.replace('\n', '').strip().split(';')
+                mapsets = ret.splitlines()
             else:
-                mapsets_accessible = ret.replace('\n', '').strip().split(';')
+                mapsets_accessible = ret.splitlines()
                 for mapset in mapsets_accessible:
                     mapsets.remove(mapset)
                 mapsets = mapsets_accessible + mapsets
@@ -293,12 +303,12 @@ def GetVectorNumberOfLayers(vector, parent = None):
         Debug.msg(5, "utils.GetVectorNumberOfLayers(): vector map '%s' not found" % vector)
         return layers
     
-    ret, out, msg = gcmd.RunCommand('v.db.connect',
-                                    getErrorMsg = True,
-                                    read = True,
-                                    flags = 'g',
-                                    map = fullname,
-                                    fs = ';')
+    ret, out, msg = RunCommand('v.db.connect',
+                               getErrorMsg = True,
+                               read = True,
+                               flags = 'g',
+                               map = fullname,
+                               fs = ';')
     if ret != 0:
         sys.stderr.write(_("Vector map <%(map)s>: %(msg)s\n") % { 'map' : fullname, 'msg' : msg })
         return layers
@@ -319,6 +329,41 @@ def GetVectorNumberOfLayers(vector, parent = None):
     
     return layers
 
+def GetAllVectorLayers(vector):
+    """!Returns list of all vector layers as strings.
+
+    @param vector name of vector map
+    """
+    layers = []
+    if not vector:
+        return layers
+    
+    fullname = grass.find_file(name = vector, element = 'vector')['fullname']
+    if not fullname:
+        Debug.msg(3, "utils.GetAllVectorLayers(): vector map <%s> not found" % vector)
+        return layers
+    
+    ret, out, msg = RunCommand('v.category',
+                               getErrorMsg = True,
+                               read = True,
+                               quiet = True,
+                               option = 'layers',
+                               input = fullname)
+
+    if ret != 0:
+        sys.stderr.write(_("Vector map <%(map)s>: %(msg)s\n") % { 'map' : fullname, 'msg' : msg })
+        return layers
+    
+    Debug.msg(1, "utils.GetAllVectorLayers(): ret %s" % ret)
+
+    for layer in out.splitlines():
+        layers.append(layer)
+
+    Debug.msg(3, "utils.GetAllVectorLayers(): vector=%s -> %s" % \
+                  (fullname, ','.join(layers)))
+
+    return layers
+
 def Deg2DMS(lon, lat, string = True, hemisphere = True, precision = 3):
     """!Convert deg value to dms string
 
@@ -483,7 +528,7 @@ def CmdToTuple(cmd):
     """!Convert command list to tuple for gcmd.RunCommand()"""
     if len(cmd) < 1:
         return None
-        
+    
     dcmd = {}
     for item in cmd[1:]:
         if '=' in item: # params
@@ -493,13 +538,15 @@ def CmdToTuple(cmd):
             flag = item[2:]
             if flag in ('verbose', 'quiet', 'overwrite'):
                 dcmd[str(flag)] = True
-        else: # -> flags
+        elif len(item) == 2 and item[0] == '-': # -> flags
             if 'flags' not in dcmd:
                 dcmd['flags'] = ''
-            dcmd['flags'] += item.replace('-', '')
-                
-    return (cmd[0],
-            dcmd)
+            dcmd['flags'] += item[1]
+        else: # unnamed parameter
+            module = gtask.parse_interface(cmd[0])
+            dcmd[module.define_first()] = item
+    
+    return (cmd[0], dcmd)
 
 def PathJoin(*args):
     """!Check path created by os.path.join"""
@@ -562,15 +609,15 @@ def ReprojectCoordinates(coord, projOut, projIn = None, flags = ''):
     @return reprojected coordinates (returned as tuple)
     """
     if not projIn:
-        projIn = gcmd.RunCommand('g.proj',
-                                 flags = 'jf',
-                                 read = True)
-    coors = gcmd.RunCommand('m.proj',
-                            flags = flags,
-                            proj_in = projIn,
-                            proj_out = projOut,
-                            stdin = '%f|%f' % (coord[0], coord[1]),
+        projIn = RunCommand('g.proj',
+                            flags = 'jf',
                             read = True)
+    coors = RunCommand('m.proj',
+                       flags = flags,
+                       proj_in = projIn,
+                       proj_out = projOut,
+                       stdin = '%f|%f' % (coord[0], coord[1]),
+                       read = True)
     if coors:
         coors = coors.split('\t')
         e = coors[0]
@@ -624,11 +671,11 @@ def GetListOfMapsets(dbase, location, selectable = False):
     listOfMapsets = list()
     
     if selectable:
-        ret = gcmd.RunCommand('g.mapset',
-                              read = True,
-                              flags = 'l',
-                              location = location,
-                              gisdbase = dbase)
+        ret = RunCommand('g.mapset',
+                         read = True,
+                         flags = 'l',
+                         location = location,
+                         gisdbase = dbase)
         
         if not ret:
             return listOfMapsets
@@ -646,9 +693,9 @@ def GetListOfMapsets(dbase, location, selectable = False):
 
 def GetColorTables():
     """!Get list of color tables"""
-    ret = gcmd.RunCommand('r.colors',
-                          read = True,
-                          flags = 'l')
+    ret = RunCommand('r.colors',
+                     read = True,
+                     flags = 'l')
     if not ret:
         return list()
     
@@ -687,22 +734,6 @@ def EncodeString(string):
     
     return string
 
-def UnicodeString(string):
-    """!Return unicode string
-    
-    @param string string to be converted
-    
-    @return unicode string
-    """
-    if isinstance(string, unicode):
-        return string
-    
-    enc = locale.getdefaultlocale()[1]
-    if enc:
-        return unicode(string, enc)
-    
-    return string
-
 def _getGDALFormats():
     """!Get dictionary of avaialble GDAL drivers"""
     ret = grass.read_command('r.in.gdal',
@@ -736,11 +767,14 @@ def _parseFormats(output):
         if format in ('PostgreSQL', 'SQLite',
                       'ODBC', 'ESRI Personal GeoDatabase',
                       'Rasterlite',
-                      'PostGIS WKT Raster driver'):
+                      'PostGIS WKT Raster driver',
+                      'CouchDB'):
             formats['database'].append(format)
         elif format in ('GeoJSON',
                         'OGC Web Coverage Service',
                         'OGC Web Map Service',
+                        'WFS',
+                        'GeoRSS',
                         'HTTP Fetching Wrapper'):
             formats['protocol'].append(format)
         else:
@@ -768,14 +802,106 @@ def GetSettingsPath():
     """!Get full path to the settings directory
     """
     try:
-        verFd = open(os.path.join(globalvar.ETCDIR, "VERSIONNUMBER"))
+        verFd = open(os.path.join(ETCDIR, "VERSIONNUMBER"))
         version = int(verFd.readlines()[0].split(' ')[0].split('.')[0])
     except (IOError, ValueError, TypeError, IndexError), e:
         sys.exit(_("ERROR: Unable to determine GRASS version. Details: %s") % e)
     
     verFd.close()
     
+    # keep location of settings files rc and wx in sync with
+    # lib/init/init.sh and init.bat
     if sys.platform == 'win32':
-        return os.path.join(os.getenv('APPDATA'), '.grass%d' % version)
+        return os.path.join(os.getenv('APPDATA'), 'GRASS%d' % version)
     
     return os.path.join(os.getenv('HOME'), '.grass%d' % version)
+
+def StoreEnvVariable(key, value = None, envFile = None):
+    """!Store environmental variable
+
+    If value is not given (is None) then environmental variable is
+    unset.
+    
+    @param key env key
+    @param value env value
+    @param envFile path to the environmental file (None for default location)
+    """
+    windows = sys.platform == 'win32'
+    if not envFile:
+        if not windows:
+            envFile = os.path.join(os.getenv('HOME'), '.grass.bashrc')
+        else:
+            gVersion = grass.version()['version'].split('.', 1)[0]
+            envFile = os.path.join(os.getenv('APPDATA'), 'GRASS%s' % gVersion, 'env.bat')
+    
+    # read env file
+    environ = dict()
+    lineSkipped = list()
+    if os.path.exists(envFile):
+        try:
+            fd = open(envFile)
+        except IOError, e:
+            sys.stderr.write(_("Unable to open file '%s'\n") % envFile)
+            return
+        for line in fd.readlines():
+            line = line.rstrip(os.linesep)
+            try:
+                k, v = map(lambda x: x.strip(), line.split(' ', 1)[1].split('=', 1))
+            except StandardError, e:
+                
+                sys.stderr.write(_("%(env)s: line skipped - unable to parse "
+                                   "Reason: %(e)s\n") % {'env': envFile, 
+                                                         'line': line, 'e': e})
+                lineSkipped.append(line)
+                continue
+            if k in environ:
+                sys.stderr.write(_("Duplicated key: %s\n") % k)
+            environ[k] = v
+        
+        fd.close()
+    
+    # update environmental variables
+    if value is None and key in environ:
+        del environ[key]
+    else:
+        environ[key] = value
+    
+    # write update env file
+    try:
+        fd = open(envFile, 'w')
+    except IOError, e:
+        sys.stderr.write(_("Unable to create file '%s'\n") % envFile)
+        return
+    if windows:
+        expCmd = 'set'
+    else:
+        expCmd = 'export'
+    
+    for key, value in environ.iteritems():
+        fd.write('%s %s=%s\n' % (expCmd, key, value))
+    
+    # write also skipped lines
+    for line in lineSkipped:
+        fd.write(line + os.linesep)
+    
+    fd.close()
+
+def SetAddOnPath(addonPath = None):
+    """!Set default AddOn path
+
+    @addonPath path to addons (None for default)
+    """
+    gVersion = grass.version()['version'].split('.', 1)[0]
+    # update env file
+    if not addonPath:
+        if sys.platform != 'win32':
+            addonPath = os.path.join(os.path.join(os.getenv('HOME'),
+                                                  '.grass%s' % gVersion,
+                                                  'addons'))
+        else:
+            addonPath = os.path.join(os.path.join(os.getenv('APPDATA'),
+                                                  'GRASS%s' % gVersion,
+                                                  'addons'))
+    
+    StoreEnvVariable('GRASS_ADDON_PATH', addonPath)
+    os.environ['GRASS_ADDON_PATH'] = addonPath
diff --git a/gui/wxpython/gui_modules/workspace.py b/gui/wxpython/core/workspace.py
similarity index 69%
rename from gui/wxpython/gui_modules/workspace.py
rename to gui/wxpython/core/workspace.py
index a9a1237..ac8ac90 100644
--- a/gui/wxpython/gui_modules/workspace.py
+++ b/gui/wxpython/core/workspace.py
@@ -1,45 +1,29 @@
 """!
- at package workspace.py
+ at package core.workspace
 
 @brief Open/save workspace definition file
 
 Classes:
- - ProcessWorkspaceFile
- - Nviz
- - WriteWorkspaceFile
- - ProcessGrcFile
+ - workspace::ProcessWorkspaceFile
+ - workspace::WriteWorkspaceFile
+ - workspace::ProcessGrcFile
 
-(C) 2007-2010 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Martin Landa <landa.martin gmail.com>
 """
 
 import os
-import sys
 
 import wx
 
-### for gxw (workspace file) parsering
-# xmlproc not available on Mac OS
-# from xml.parsers.xmlproc import xmlproc
-# from xml.parsers.xmlproc import xmlval
-# from xml.parsers.xmlproc import xmldtd
-try:
-    import xml.etree.ElementTree as etree
-except ImportError:
-    import elementtree.ElementTree as etree # Python <= 2.4
-
-import utils
-import globalvar
-from preferences import globalSettings as UserSettings
-
-try:
-    import wxnviz
-except (ImportError, NameError):
-    wxnviz = None
+from core.utils     import normalize_whitespace
+from core.settings  import UserSettings
+from core.gcmd      import EncodeString, GetDefaultEncoding
+from nviz.main      import NvizSettings
 
 class ProcessWorkspaceFile:
     def __init__(self, tree):
@@ -64,12 +48,19 @@ class ProcessWorkspaceFile:
         # list of map layers
         #
         self.layers = []
+        #
+        # nviz state
+        #
+        self.nviz_state = {}
         
         self.displayIndex = -1 # first display has index '0'
         
         self.__processFile()
-        
-        self.nvizDefault = Nviz()
+
+        if NvizSettings:
+            self.nvizDefault = NvizSettings()
+        else:
+            self.nvizDefault = None
         
     def __filterValue(self, value):
         """!Filter value
@@ -85,7 +76,7 @@ class ProcessWorkspaceFile:
         """!Get node text"""
         p = node.find(tag)
         if p is not None:
-            return utils.normalize_whitespace(p.text)
+            return normalize_whitespace(p.text)
         
         return default
     
@@ -142,17 +133,22 @@ class ProcessWorkspaceFile:
                 projection = { 'enabled' : False }
             
             self.displays.append( {
+                    "name"           : display.get('name'),
                     "render"         : bool(int(display.get('render', "0"))),
                     "mode"           : int(display.get('mode', 0)),
                     "showCompExtent" : bool(int(display.get('showCompExtent', "0"))),
                     "pos"            : pos,
                     "size"           : size,
                     "extent"         : extent,
+                    "alignExtent"    : bool(int(display.get('alignExtent', "0"))),
                     "constrainRes"   : bool(int(display.get('constrainRes', "0"))),
-                    "projection"     : projection, } )
+                    "projection"     : projection,
+                    "viewMode"       : display.get('viewMode', '2d')} )
             
             # process all layers/groups in the display
             self.__processLayers(display)
+            # process nviz_state
+            self.__processNvizState(display)
 
     def __processLayers(self, node, inGroup = -1):
         """!Process layers/groups of selected display
@@ -178,10 +174,13 @@ class ProcessWorkspaceFile:
                 
             elif item.tag == 'layer':
                 cmd, selected, vdigit, nviz = self.__processLayer(item)
+                lname = item.get('name', None)
+                if lname and '\\n' in lname:
+                    lname = lname.replace('\\n', os.linesep)
                 
                 self.layers.append( {
                         "type"     : item.get('type', None),
-                        "name"     : item.get('name', None),
+                        "name"     : lname,
                         "checked"  : bool(int(item.get('checked', "0"))),
                         "opacity"  : float(item.get('opacity', '1.0')),
                         "cmd"      : cmd,
@@ -269,7 +268,7 @@ class ProcessWorkspaceFile:
         nviz = {}
         if node_nviz.find('surface') is not None: # -> raster
             nviz['surface'] = {}
-            for sec in ('attribute', 'draw', 'mask', 'position'):
+            for sec in ('attribute', 'draw', 'position'):
                 nviz['surface'][sec] = {}
         elif node_nviz.find('vlines') is not None or \
                 node_nviz.find('vpoints') is not None: # -> vector
@@ -330,12 +329,12 @@ class ProcessWorkspaceFile:
             # position
             node_pos = node_surface.find('position')
             if node_pos is not None:
-                dc = self.nviz['surface']['position'] = {}
+                dc = nviz['surface']['position'] = {}
                 for coor in ['x', 'y', 'z']:
                     node = node_pos.find(coor)
                     if node is None:
                         continue
-                    value = int(self.__getNodeText(node, 'value'))
+                    value = int(self.__getNodeText(node_pos, coor))
                     dc[coor] = value
             
         elif 'vector' in nviz:
@@ -350,9 +349,17 @@ class ProcessWorkspaceFile:
                 node_mode = node_vpoints.find('mode')
                 if node_mode is not None:
                     nviz['vector']['points']['mode'] = {}
-                    nviz['vector']['points']['mode']['type'] = str(node_mode.get('type', ''))
-                    nviz['vector']['points']['mode']['surface'] = \
-                        self.__processLayerNvizNode(node_mode, 'map', str)
+                    nviz['vector']['points']['mode']['type'] = str(node_mode.get('type', 'surface'))
+                    nviz['vector']['points']['mode']['surface'] = {}
+                    nviz['vector']['points']['mode']['surface']['value'] = []
+                    nviz['vector']['points']['mode']['surface']['show'] = []
+                    
+                    # map
+                    for node_map in node_mode.findall('map'):
+                        nviz['vector']['points']['mode']['surface']['value'].append(
+                            self.__processLayerNvizNode(node_map, 'name', str))
+                        nviz['vector']['points']['mode']['surface']['show'].append(bool(
+                            self.__processLayerNvizNode(node_map, 'checked', int)))
                 
                 # color
                 self.__processLayerNvizNode(node_vpoints, 'color', str,
@@ -369,7 +376,7 @@ class ProcessWorkspaceFile:
                 # height
                 self.__processLayerNvizNode(node_vpoints, 'size', int,
                                             nviz['vector']['points'])
-            
+                
             # vlines
             node_vlines = node_nviz.find('vlines')
             if node_vlines is not None:
@@ -377,11 +384,16 @@ class ProcessWorkspaceFile:
                 if node_mode is not None:
                     nviz['vector']['lines']['mode'] = {}
                     nviz['vector']['lines']['mode']['type'] = str(node_mode.get('type', ''))
-                    nviz['vector']['lines']['mode']['surface'] = ''
+                    nviz['vector']['lines']['mode']['surface'] = {}
+                    nviz['vector']['lines']['mode']['surface']['value'] = []
+                    nviz['vector']['lines']['mode']['surface']['show'] = []
                     
                     # map
-                    nviz['vector']['lines']['mode']['surface'] = \
-                        self.__processLayerNvizNode(node_mode, 'map', str)
+                    for node_map in node_mode.findall('map'):
+                        nviz['vector']['lines']['mode']['surface']['value'].append(
+                            self.__processLayerNvizNode(node_map, 'name', str))
+                        nviz['vector']['lines']['mode']['surface']['show'].append(bool(
+                            self.__processLayerNvizNode(node_map, 'checked', int)))
                 
                 # color
                 self.__processLayerNvizNode(node_vlines, 'color', str,
@@ -394,7 +406,7 @@ class ProcessWorkspaceFile:
                 # height
                 self.__processLayerNvizNode(node_vlines, 'height', int,
                                             nviz['vector']['lines'])
-            
+                
         return nviz
     
     def __processLayerNvizNode(self, node, tag, cast, dc = None):
@@ -417,250 +429,104 @@ class ProcessWorkspaceFile:
             else:
                 return value
     
-class Nviz:
-    def __init__(self):
-        """Default 3D settings"""
-        pass
-    
-    def SetSurfaceDefaultProp(self):
-        """Set default surface data properties"""
-        data = dict()
-        for sec in ('attribute', 'draw', 'mask', 'position'):
-            data[sec] = {}
-        
+    def __processNvizState(self, node):
+        """!Process tag nviz_state"""
+        node_state = node.find('nviz_state')
+        if node_state is None:
+            return
+        self.nviz_state['display'] = self.displayIndex
         #
-        # attributes
+        # view
         #
-        for attrb in ('shine', ):
-            data['attribute'][attrb] = {}
-            for key, value in UserSettings.Get(group='nviz', key='volume',
-                                               subkey=attrb).iteritems():
-                data['attribute'][attrb][key] = value
-            data['attribute'][attrb]['update'] = None
+        node_view = node_state.find('view')
+        view = {}
+        iview = {}
         
-        #
-        # draw
-        #
-        data['draw']['all'] = False # apply only for current surface
-        for control, value in UserSettings.Get(group='nviz', key='surface', subkey='draw').iteritems():
-            if control[:3] == 'res':
-                if 'resolution' not in data['draw']:
-                    data['draw']['resolution'] = {}
-                if 'update' not in data['draw']['resolution']:
-                    data['draw']['resolution']['update'] = None
-                data['draw']['resolution'][control[4:]] = value
-                continue
-            
-            if control == 'wire-color':
-                value = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
-            elif control in ('mode', 'style', 'shading'):
-                if 'mode' not in data['draw']:
-                    data['draw']['mode'] = {}
-                continue
-
-            data['draw'][control] = { 'value' : value }
-            data['draw'][control]['update'] = None
-        
-        value, desc = self.GetDrawMode(UserSettings.Get(group='nviz', key='surface', subkey=['draw', 'mode']),
-                                       UserSettings.Get(group='nviz', key='surface', subkey=['draw', 'style']),
-                                       UserSettings.Get(group='nviz', key='surface', subkey=['draw', 'shading']))
-    
-        data['draw']['mode'] = { 'value' : value,
-                                 'desc' : desc, 
-                                 'update': None }
+        node_position = node_view.find('v_position')
+        view['position'] = {}
+        view['position']['x'] = self.__processLayerNvizNode(node_position, 'x', float)
+        view['position']['y'] = self.__processLayerNvizNode(node_position, 'y', float)
+        node_persp = node_view.find('persp')
+        view['persp'] = {}
+        iview['persp'] = {}
+        view['persp']['value'] = self.__processLayerNvizNode(node_persp, 'value', int)
+        view['persp']['step'] = self.__processLayerNvizNode(node_persp, 'step', int)
+        iview['persp']['min'] = self.__processLayerNvizNode(node_persp, 'min', int)
+        iview['persp']['max'] = self.__processLayerNvizNode(node_persp, 'max', int)
+        node_height = node_view.find('v_height')
+        iview['height'] = {}
+        iview['height']['value'] = self.__processLayerNvizNode(node_height, 'value', int)
+        iview['height']['min'] = self.__processLayerNvizNode(node_height, 'min', int)
+        iview['height']['max'] = self.__processLayerNvizNode(node_height, 'max', int)
+        node_twist = node_view.find('twist')
+        view['twist'] = {}
+        iview['twist'] = {}
+        view['twist']['value'] = self.__processLayerNvizNode(node_twist, 'value', int)
+        iview['twist']['min'] = self.__processLayerNvizNode(node_twist, 'min', int)
+        iview['twist']['max'] = self.__processLayerNvizNode(node_twist, 'max', int)
+        node_zexag = node_view.find('z-exag')
+        view['z-exag'] = {}
+        iview['z-exag'] = {}
+        view['z-exag']['value'] = self.__processLayerNvizNode(node_zexag, 'value', float)
+        view['z-exag']['min'] = self.__processLayerNvizNode(node_zexag, 'min', int)
+        view['z-exag']['max'] = self.__processLayerNvizNode(node_zexag, 'max', int)
+        iview['z-exag']['llRatio'] = self.__processLayerNvizNode(node_zexag, 'llRatio', float)
+        node_focus = node_view.find('focus')
+        iview['focus'] = {}
+        iview['focus']['x'] = self.__processLayerNvizNode(node_focus, 'x', int)
+        iview['focus']['y'] = self.__processLayerNvizNode(node_focus, 'y', int)
+        iview['focus']['z'] = self.__processLayerNvizNode(node_focus, 'z', int)
+        node_dir = node_view.find('dir')
+        if node_dir:
+            iview['dir'] = {}
+            iview['dir']['x'] = self.__processLayerNvizNode(node_dir, 'x', int)
+            iview['dir']['y'] = self.__processLayerNvizNode(node_dir, 'y', int)
+            iview['dir']['z'] = self.__processLayerNvizNode(node_dir, 'z', int)
+            iview['dir']['use'] = True
+        else:
+            iview['dir'] = {}
+            iview['dir']['x'] = -1
+            iview['dir']['y'] = -1
+            iview['dir']['z'] = -1
+            iview['dir']['use'] = False
         
-        return data
-    
-    def SetVolumeDefaultProp(self):
-        """Set default volume data properties"""
-        data = dict()
-        for sec in ('attribute', 'draw', 'position'):
-            data[sec] = dict()
-            for sec in ('isosurface', 'slice'):
-                    data[sec] = list()
+        view['background'] = {}
+        color = self.__processLayerNvizNode(node_view, 'background_color', str)
+        view['background']['color'] = tuple(map(int, color.split(':')))
         
+        self.nviz_state['view'] = view
+        self.nviz_state['iview'] = iview
         #
-        # draw
+        # light
         #
-        for control, value in UserSettings.Get(group='nviz', key='volume', subkey='draw').iteritems():
-            if control == 'mode':
-                continue
-            if control == 'shading':
-                sel = UserSettings.Get(group='nviz', key='surface', subkey=['draw', 'shading'])
-                value, desc = self.GetDrawMode(shade=sel, string=False)
-
-                data['draw']['shading'] = { 'value' : value,
-                                            'desc' : desc['shading'] }
-            elif control == 'mode':
-                sel = UserSettings.Get(group='nviz', key='volume', subkey=['draw', 'mode'])
-                if sel == 0:
-                    desc = 'isosurface'
-                else:
-                    desc = 'slice'
-                data['draw']['mode'] = { 'value' : sel,
-                                         'desc' : desc, }
-            else:
-                data['draw'][control] = { 'value' : value }
-
-            if 'update' not in data['draw'][control]:
-                data['draw'][control]['update'] = None
-        
-        #
-        # isosurface attributes
-        #
-        for attrb in ('shine', ):
-            data['attribute'][attrb] = {}
-            for key, value in UserSettings.Get(group='nviz', key='volume',
-                                               subkey=attrb).iteritems():
-                data['attribute'][attrb][key] = value
-        
-        return data
-    
-    def SetVectorDefaultProp(self):
-        """Set default vector data properties"""
-        data = dict()
-        for sec in ('lines', 'points'):
-            data[sec] = {}
+        node_light = node_state.find('light')
+        light = {}
         
-        self.SetVectorLinesDefaultProp(data['lines'])
-        self.SetVectorPointsDefaultProp(data['points'])
-
-        return data
-    
-    def SetVectorLinesDefaultProp(self, data):
-        """Set default vector properties -- lines"""
-        # width
-        data['width'] = {'value' : UserSettings.Get(group='nviz', key='vector',
-                                                    subkey=['lines', 'width']) }
-        
-        # color
-        value = UserSettings.Get(group='nviz', key='vector',
-                                 subkey=['lines', 'color'])
-        color = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
-        data['color'] = { 'value' : color }
-
-        # mode
-        if UserSettings.Get(group='nviz', key='vector',
-                            subkey=['lines', 'flat']):
-            type = 'flat'
-            map  = None
-        else:
-            type = 'flat'
-            map = None
-
-        data['mode'] = {}
-        data['mode']['type'] = type
-        data['mode']['update'] = None
-        if map:
-            data['mode']['surface'] = map
-
-        # height
-        data['height'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
-                                                      subkey=['lines', 'height']) }
-
-        if 'object' in data:
-            for attrb in ('color', 'width', 'mode', 'height'):
-                data[attrb]['update'] = None
+        node_position = node_light.find('l_position')
+        light['position'] = {}
+        light['position']['x'] = self.__processLayerNvizNode(node_position, 'x', float)
+        light['position']['y'] = self.__processLayerNvizNode(node_position, 'y', float)
+        light['position']['z'] = self.__processLayerNvizNode(node_position, 'z', int)
         
-    def SetVectorPointsDefaultProp(self, data):
-        """Set default vector properties -- points"""
-        # size
-        data['size'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
-                                                    subkey=['points', 'size']) }
-
-        # width
-        data['width'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
-                                                     subkey=['points', 'width']) }
-
-        # marker
-        data['marker'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
-                                                      subkey=['points', 'marker']) }
-
-        # color
-        value = UserSettings.Get(group='nviz', key='vector',
-                                 subkey=['points', 'color'])
-        color = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
-        data['color'] = { 'value' : color }
-
-        # mode
-        data['mode'] = { 'type' : 'surface',
-                         'surface' : '', }
+        light['bright'] = self.__processLayerNvizNode(node_light, 'bright', int) 
+        light['ambient'] = self.__processLayerNvizNode(node_light, 'ambient', int)
+        color = self.__processLayerNvizNode(node_light, 'color', str)
+        light['color'] = tuple(map(int, color.split(':')))
         
-        # height
-        data['height'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
-                                                      subkey=['points', 'height']) }
-
-        if 'object' in data:
-            for attrb in ('size', 'width', 'marker',
-                          'color', 'surface', 'height'):
-                data[attrb]['update'] = None
+        self.nviz_state['light'] = light
         
-    def GetDrawMode(self, mode=None, style=None, shade=None, string=False):
-        """Get surface draw mode (value) from description/selection
+        node_constants = node_state.find('constant_planes')
+        constants = []
+        if node_constants:
+            for i, node_plane in enumerate(node_constants.findall('plane')):
+                plane = {}
+                plane['color'] = self.__processLayerNvizNode(node_plane, 'color', str)                
+                plane['resolution'] = self.__processLayerNvizNode(node_plane, 'fine_resolution', int)
+                plane['value'] = self.__processLayerNvizNode(node_plane, 'height', int)
+                plane['object'] = {}
+                constants.append({'constant': plane})
+        self.nviz_state['constants'] = constants
 
-        @param mode,style,shade modes
-        @param string if True input parameters are strings otherwise
-        selections
-        """
-        if not wxnviz:
-            return None
-        
-        value = 0
-        desc = {}
-
-        if string:
-            if mode is not None:
-                if mode == 'coarse':
-                    value |= wxnviz.DM_WIRE
-                elif mode == 'fine':
-                    value |= wxnviz.DM_POLY
-                else: # both
-                    value |= wxnviz.DM_WIRE_POLY
-
-            if style is not None:
-                if style == 'wire':
-                    value |= wxnviz.DM_GRID_WIRE
-                else: # surface
-                    value |= wxnviz.DM_GRID_SURF
-                    
-            if shade is not None:
-                if shade == 'flat':
-                    value |= wxnviz.DM_FLAT
-                else: # surface
-                    value |= wxnviz.DM_GOURAUD
-
-            return value
-
-        # -> string is False
-        if mode is not None:
-            if mode == 0: # coarse
-                value |= wxnviz.DM_WIRE
-                desc['mode'] = 'coarse'
-            elif mode == 1: # fine
-                value |= wxnviz.DM_POLY
-                desc['mode'] = 'fine'
-            else: # both
-                value |= wxnviz.DM_WIRE_POLY
-                desc['mode'] = 'both'
-
-        if style is not None:
-            if style == 0: # wire
-                value |= wxnviz.DM_GRID_WIRE
-                desc['style'] = 'wire'
-            else: # surface
-                value |= wxnviz.DM_GRID_SURF
-                desc['style'] = 'surface'
-
-        if shade is not None:
-            if shade == 0:
-                value |= wxnviz.DM_FLAT
-                desc['shading'] = 'flat'
-            else: # surface
-                value |= wxnviz.DM_GOURAUD
-                desc['shading'] = 'gouraud'
-        
-        return (value, desc)
-    
 class WriteWorkspaceFile(object):
     """!Generic class for writing workspace file"""
     def __init__(self, lmgr, file):
@@ -669,7 +535,8 @@ class WriteWorkspaceFile(object):
         self.indent = 0
         
         # write header
-        self.file.write('<?xml version="1.0" encoding="UTF-8"?>\n')
+
+        self.file.write('<?xml version="1.0" encoding="%s"?>\n' % GetDefaultEncoding(forceUTF8 = True))
         self.file.write('<!DOCTYPE gxw SYSTEM "grass-gxw.dtd">\n')
         self.file.write('%s<gxw>\n' % (' ' * self.indent))
         
@@ -689,32 +556,43 @@ class WriteWorkspaceFile(object):
         
         # list of displays
         for page in range(0, self.lmgr.gm_cb.GetPageCount()):
+            dispName = self.lmgr.gm_cb.GetPageText(page)
             mapTree = self.lmgr.gm_cb.GetPage(page).maptree
             region = mapTree.Map.region
             
             displayPos = mapTree.mapdisplay.GetPosition()
             displaySize = mapTree.mapdisplay.GetSize()
+            if mapTree.mapdisplay.toolbars['map'].combo.GetSelection() == 1:
+                viewmode = '3d'
+            else:
+                viewmode = '2d'
             
-            file.write('%s<display render="%d" '
+            file.write('%s<display '
+                       'name="%s" render="%d" '
                        'mode="%d" showCompExtent="%d" '
+                       'alignExtent="%d" '
                        'constrainRes="%d" '
                        'dim="%d,%d,%d,%d" '
-                       'extent="%f,%f,%f,%f">\n' % (' ' * self.indent,
-                                                    int(mapTree.mapdisplay.statusbarWin['render'].IsChecked()),
-                                                    mapTree.mapdisplay.statusbarWin['toggle'].GetSelection(),
-                                                    int(mapTree.mapdisplay.statusbarWin['region'].IsChecked()),
-                                                    int(mapTree.mapdisplay.statusbarWin['resolution'].IsChecked()),
-                                                    displayPos[0],
-                                                    displayPos[1],
-                                                    displaySize[0],
-                                                    displaySize[1],
-                                                    region['w'],
-                                                    region['s'],
-                                                    region['e'],
-                                                    region['n']
-                                                    ))
+                       'extent="%f,%f,%f,%f" '
+                       'viewMode="%s" >\n' % (' ' * self.indent,
+                                              dispName.encode('utf8'),
+                                              int(mapTree.mapdisplay.GetProperty('render')),
+                                              mapTree.mapdisplay.statusbarManager.GetMode(),
+                                              int(mapTree.mapdisplay.GetProperty('region')),
+                                              int(mapTree.mapdisplay.GetProperty('alignExtent')),
+                                              int(mapTree.mapdisplay.GetProperty('resolution')),
+                                              displayPos[0],
+                                              displayPos[1],
+                                              displaySize[0],
+                                              displaySize[1],
+                                              region['w'],
+                                              region['s'],
+                                              region['e'],
+                                              region['n'],
+                                              viewmode
+                                              ))
             # projection statusbar info
-            if mapTree.mapdisplay.statusbarWin['projection'].IsChecked() and \
+            if mapTree.mapdisplay.GetProperty('projection') and \
                     UserSettings.Get(group='display', key='projection', subkey='proj4'):
                 self.indent += 4
                 file.write('%s<projection' % (' ' * self.indent))
@@ -732,6 +610,12 @@ class WriteWorkspaceFile(object):
             # list of layers
             item = mapTree.GetFirstChild(mapTree.root)[0]
             self.__writeLayer(mapTree, item)
+            
+            if mapTree.mapdisplay.MapWindow3D is not None:
+                nvizDisp = mapTree.mapdisplay.MapWindow3D
+                self.__writeNvizState(view = nvizDisp.view, iview =  nvizDisp.iview, 
+                                      light = nvizDisp.light, constants = nvizDisp.constants)
+            
             file.write('%s</display>\n' % (' ' * self.indent))
         
         self.indent =- 4
@@ -759,26 +643,26 @@ class WriteWorkspaceFile(object):
             if type == 'command':
                 cmd = mapTree.GetPyData(item)[0]['maplayer'].GetCmd(string=True)
                 self.file.write('%s<layer type="%s" name="%s" checked="%d">\n' % \
-                               (' ' * self.indent, type, cmd, checked));
+                               (' ' * self.indent, type, EncodeString(cmd), checked));
                 self.file.write('%s</layer>\n' % (' ' * self.indent));
             elif type == 'group':
                 name = mapTree.GetItemText(item)
                 self.file.write('%s<group name="%s" checked="%d">\n' % \
-                               (' ' * self.indent, name.encode('utf8'), checked));
+                               (' ' * self.indent, EncodeString(name), checked));
                 self.indent += 4
                 subItem = mapTree.GetFirstChild(item)[0]
                 self.__writeLayer(mapTree, subItem)
                 self.indent -= 4
                 self.file.write('%s</group>\n' % (' ' * self.indent));
             else:
-                cmd = mapTree.GetPyData(item)[0]['maplayer'].GetCmd(string=False)
-                name = mapTree.GetItemText(item)
+                cmd = mapTree.GetPyData(item)[0]['maplayer'].GetCmd(string = False)
+                name = mapTree.GetItemText(item).replace(os.linesep, '\\n')
                 opacity = maplayer.GetOpacity(float = True)
                 # remove 'opacity' part
                 if opacity < 1:
                     name = name.split('(', -1)[0].strip()
                 self.file.write('%s<layer type="%s" name="%s" checked="%d" opacity="%f">\n' % \
-                                    (' ' * self.indent, type, name.encode('utf8'), checked, opacity));
+                                    (' ' * self.indent, type, EncodeString(name), checked, opacity));
                 
                 self.indent += 4
                 # selected ?
@@ -840,7 +724,6 @@ class WriteWorkspaceFile(object):
         """
         if 'object' not in data: # skip disabled
             return
-
         self.indent += 4
         self.file.write('%s<surface>\n' % (' ' * self.indent))
         self.indent += 4
@@ -853,6 +736,8 @@ class WriteWorkspaceFile(object):
             for name in data[attrb].iterkeys():
                 # surface attribute
                 if attrb == 'attribute':
+                    if data[attrb][name]['map'] is None:
+                        continue
                     self.file.write('%s<%s name="%s" map="%d">\n' % \
                                    (' ' * self.indent, attrb, name, data[attrb][name]['map']))
                     self.indent += 4
@@ -937,8 +822,14 @@ class WriteWorkspaceFile(object):
                                                           data[attrb][name]['type']))
                     if data[attrb][name]['type'] == 'surface':
                         self.indent += 4
-                        self.file.write('%s<map>%s</map>\n' % (' ' * self.indent,
-                                                               data[attrb][name]['surface']))
+                        for idx, surface in enumerate(data[attrb][name]['surface']['value']):
+                            checked = data[attrb][name]['surface']['show'][idx]
+                            self.file.write('%s<map>\n' % (' ' * self.indent))
+                            self.indent += 4
+                            self.file.write('%s<name>%s</name>\n' % (' ' * self.indent, surface))
+                            self.file.write('%s<checked>%s</checked>\n' % (' ' * self.indent, int(checked)))
+                            self.indent -= 4
+                            self.file.write('%s</map>\n' % (' ' * self.indent))
                         self.indent -= 4
                     self.file.write('%s</%s>\n' % ((' ' * self.indent, name)))
                 else:
@@ -952,6 +843,132 @@ class WriteWorkspaceFile(object):
 
         self.indent -= 4
 
+    def __writeNvizState(self, view, iview, light, constants):
+        """"!Save Nviz properties (view, light) to workspace
+
+        @param view Nviz view properties
+        @param iview Nviz internal view properties
+        @param light Nviz light properties
+        """
+        self.indent += 4
+        self.file.write('%s<nviz_state>\n' % (' ' * self.indent))
+        #
+        # view
+        #
+        self.indent += 4
+        self.file.write('%s<view>\n' % (' ' * self.indent))
+        self.indent += 4
+        # position
+        self.file.write('%s<v_position>\n' % (' ' * self.indent))
+        self.indent += 4
+        self.file.write('%s<x>%.2f</x>\n' % (' ' * self.indent, view['position']['x']))
+        self.file.write('%s<y>%.2f</y>\n' % (' ' * self.indent, view['position']['y']))
+        self.indent -= 4
+        self.file.write('%s</v_position>\n' % (' ' * self.indent))
+        # perspective
+        self.file.write('%s<persp>\n' % (' ' * self.indent))
+        self.indent += 4
+        self.file.write('%s<value>%d</value>\n' % (' ' * self.indent, view['persp']['value']))
+        self.file.write('%s<step>%d</step>\n' % (' ' * self.indent, view['persp']['step']))
+        self.file.write('%s<min>%d</min>\n' % (' ' * self.indent, iview['persp']['min']))
+        self.file.write('%s<max>%d</max>\n' % (' ' * self.indent, iview['persp']['max']))
+        self.indent -= 4
+        self.file.write('%s</persp>\n' % (' ' * self.indent))
+        # height
+        self.file.write('%s<v_height>\n' % (' ' * self.indent))
+        self.indent += 4
+        self.file.write('%s<value>%d</value>\n' % (' ' * self.indent, iview['height']['value']))
+        self.file.write('%s<min>%d</min>\n' % (' ' * self.indent, iview['height']['min']))
+        self.file.write('%s<max>%d</max>\n' % (' ' * self.indent, iview['height']['max']))
+        self.indent -= 4
+        self.file.write('%s</v_height>\n' % (' ' * self.indent))
+        # twist
+        self.file.write('%s<twist>\n' % (' ' * self.indent))
+        self.indent += 4
+        self.file.write('%s<value>%d</value>\n' % (' ' * self.indent, view['twist']['value']))
+        self.file.write('%s<min>%d</min>\n' % (' ' * self.indent, iview['twist']['min']))
+        self.file.write('%s<max>%d</max>\n' % (' ' * self.indent, iview['twist']['max']))
+        self.indent -= 4
+        self.file.write('%s</twist>\n' % (' ' * self.indent))
+        # z-exag
+        self.file.write('%s<z-exag>\n' % (' ' * self.indent))
+        self.indent += 4
+        self.file.write('%s<value>%.2f</value>\n' % (' ' * self.indent, view['z-exag']['value']))
+        self.file.write('%s<min>%d</min>\n' % (' ' * self.indent, view['z-exag']['min']))
+        self.file.write('%s<max>%d</max>\n' % (' ' * self.indent, view['z-exag']['max']))
+        self.file.write('%s<llRatio>%.2f</llRatio>\n' % (' ' * self.indent, iview['z-exag']['llRatio']))
+        self.indent -= 4
+        self.file.write('%s</z-exag>\n' % (' ' * self.indent))
+        # focus (look here)
+        self.file.write('%s<focus>\n' % (' ' * self.indent))
+        self.indent += 4
+        self.file.write('%s<x>%d</x>\n' % (' ' * self.indent, iview['focus']['x']))
+        self.file.write('%s<y>%d</y>\n' % (' ' * self.indent, iview['focus']['y']))
+        self.file.write('%s<z>%d</z>\n' % (' ' * self.indent, iview['focus']['z']))
+        self.indent -= 4
+        self.file.write('%s</focus>\n' % (' ' * self.indent))
+        # background
+        self.__writeTagWithValue('background_color', view['background']['color'][:3], format = 'd:%d:%d')
+        
+        self.indent -= 4
+        self.file.write('%s</view>\n' % (' ' * self.indent))
+        #
+        # light
+        #
+        self.file.write('%s<light>\n' % (' ' * self.indent))
+        self.indent += 4
+        # position
+        self.file.write('%s<l_position>\n' % (' ' * self.indent))
+        self.indent += 4
+        self.file.write('%s<x>%.2f</x>\n' % (' ' * self.indent, light['position']['x']))
+        self.file.write('%s<y>%.2f</y>\n' % (' ' * self.indent, light['position']['y']))
+        self.file.write('%s<z>%d</z>\n' % (' ' * self.indent, light['position']['z']))
+        self.indent -= 4
+        self.file.write('%s</l_position>\n' % (' ' * self.indent))
+        # bright
+        self.__writeTagWithValue('bright', light['bright'])
+        # ambient
+        self.__writeTagWithValue('ambient', light['ambient'])
+        # color
+        self.__writeTagWithValue('color', light['color'][:3], format = 'd:%d:%d')
+        
+        self.indent -= 4
+        self.file.write('%s</light>\n' % (' ' * self.indent))
+        #
+        # constant planes
+        #
+        if constants:
+            self.file.write('%s<constant_planes>\n' % (' ' * self.indent))
+            self.indent += 4
+            for idx, plane in enumerate(constants):
+                self.file.write('%s<plane>\n' % (' ' * self.indent))
+                self.indent += 4
+                self.__writeTagWithValue('height', constants[idx]['constant']['value'])
+                self.__writeTagWithValue('fine_resolution', constants[idx]['constant']['resolution'])
+                self.__writeTagWithValue('color', constants[idx]['constant']['color'], format = 's')
+                self.indent -= 4
+                self.file.write('%s</plane>\n' % (' ' * self.indent))
+            self.indent -= 4
+            self.file.write('%s</constant_planes>\n' % (' ' * self.indent))
+        self.indent -= 4
+        
+        self.file.write('%s</nviz_state>\n' % (' ' * self.indent))
+        self.indent -= 4
+    
+    def __writeTagWithValue(self, tag, data, format = 'd'):
+        """!Helper function for writing pair tag
+        
+        @param tag written tag
+        @param data written data
+        @param format conversion type
+        """
+        self.file.write('%s<%s>\n' % (' ' * self.indent, tag))
+        self.indent += 4
+        self.file.write('%s' % (' ' * self.indent))
+        self.file.write(('<value>%' + format + '</value>\n') % data)
+        self.indent -= 4
+        self.file.write('%s</%s>\n' % (' ' * self.indent, tag))
+        
 class ProcessGrcFile(object):
     def __init__(self, filename):
         """!Process GRC file"""
diff --git a/gui/wxpython/create__init__.py b/gui/wxpython/create__init__.py
new file mode 100755
index 0000000..ceb4f62
--- /dev/null
+++ b/gui/wxpython/create__init__.py
@@ -0,0 +1,33 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import glob
+
+def main(path):
+    if not os.path.exists(path) or not os.path.isdir(path):
+        print >> sys.stderr, "'%s' is not a directory" % path
+        return 1
+    
+    modules = []
+    for f in glob.glob(os.path.join(os.path.basename(path), '*.py')):
+        if f[-5:-3] == '__':
+            continue
+        modules.append(os.path.splitext(os.path.basename(f))[0])
+        
+    fd = open(os.path.join(path, '__init__.py'), 'w')
+    try:
+        fd.write('all = [%s' % os.linesep)
+        for m in modules:
+            fd.write("    '%s',%s" % (m, os.linesep))
+        fd.write('    ]%s' % os.linesep)
+    finally:
+        fd.close()
+    
+    return 0
+
+if __name__ == "__main__":
+    if len(sys.argv) < 2:
+        sys.exit("usage: %s path/to/gui_modules" % sys.argv[0])
+    
+    sys.exit(main(sys.argv[1]))
diff --git a/gui/wxpython/gui_modules/dbm_dialogs.py b/gui/wxpython/dbmgr/dialogs.py
similarity index 80%
rename from gui/wxpython/gui_modules/dbm_dialogs.py
rename to gui/wxpython/dbmgr/dialogs.py
index 6b5ffff..4e84685 100644
--- a/gui/wxpython/gui_modules/dbm_dialogs.py
+++ b/gui/wxpython/dbmgr/dialogs.py
@@ -1,38 +1,39 @@
 """!
- at package dbm_dialogs.py
+ at package dbmgr.dialogs
 
 @brief DBM-related dialogs
 
 List of classes:
- - DisplayAttributesDialog
- - ModifyTableRecord
+ - dialogs::DisplayAttributesDialog
+ - dialogs::ModifyTableRecord
 
 (C) 2007-2011 by the GRASS Development Team
 
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Martin Landa <landa.martin gmail.com>
 """
 
 import os
+import types
 
-import globalvar
+from core import globalvar
 import wx
 import wx.lib.scrolledpanel as scrolled
 
-import gcmd
-from debug import Debug
-from preferences import globalSettings as UserSettings
-from dbm_base    import VectorDBInfo
+from core.gcmd        import RunCommand, GError
+from core.debug       import Debug
+from core.settings    import UserSettings
+from dbmgr.vinfo      import VectorDBInfo
+from gui_core.widgets import IntegerValidator, FloatValidator
 
 class DisplayAttributesDialog(wx.Dialog):
     def __init__(self, parent, map,
                  query = None, cats = None, line = None,
                  style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER,
                  pos = wx.DefaultPosition,
-                 action = "add"):
+                 action = "add", ignoreError = False):
         """!Standard dialog used to add/update/display attributes linked
         to the vector map.
         
@@ -47,6 +48,7 @@ class DisplayAttributesDialog(wx.Dialog):
         @param style
         @param pos
         @param action (add, update, display)
+        @param ignoreError True to ignore errors
         """
         self.parent = parent # mapdisplay.BufferedWindow
         self.map    = map
@@ -64,17 +66,21 @@ class DisplayAttributesDialog(wx.Dialog):
 
         # check if db connection / layer exists
         if len(layers) <= 0:
-            label = _("Database connection "
-                      "is not defined in DB file.")
-
-            gcmd.GMessage(parent = self.parent,
-                          message = _("No attribute table linked to "
-                                      "vector map <%(vector)s> found. %(msg)s\n\n"
-                                      "New attribute table can be created by "
-                                      "Attribute Table Manager.") % 
-                          {'vector' : self.map, 'msg' : label})
+            if not ignoreError:
+                dlg = wx.MessageDialog(parent = self.parent,
+                                       message = _("No attribute table found.\n\n"
+                                                   "Do you want to create a new attribute table "
+                                                   "and defined a link to vector map <%s>?") % self.map,
+                                       caption = _("Create table?"),
+                                       style = wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
+                if dlg.ShowModal() == wx.ID_YES:
+                    lmgr = self.parent.lmgr
+                    lmgr.OnShowAttributeTable(event = None, selection = 'layers')
+                
+                dlg.Destroy()
+            
             self.mapDBInfo = None
-
+        
         wx.Dialog.__init__(self, parent = self.parent, id = wx.ID_ANY,
                            title = "", style = style, pos = pos)
 
@@ -154,11 +160,12 @@ class DisplayAttributesDialog(wx.Dialog):
 
         # set min size for dialog
         w, h = self.GetBestSize()
+        w += 50
         if h < 200:
             self.SetMinSize((w, 200))
         else:
-            self.SetMinSize(self.GetBestSize())
-
+            self.SetMinSize((w, h))
+        
         if self.notebook.GetPageCount() == 0:
             Debug.msg(2, "DisplayAttributesDialog(): Nothing found!")
             ### self.mapDBInfo = None
@@ -182,6 +189,8 @@ class DisplayAttributesDialog(wx.Dialog):
     def GetSQLString(self, updateValues = False):
         """!Create SQL statement string based on self.sqlStatement
 
+        Show error message when invalid values are entered.
+        
         If updateValues is True, update dataFrame according to values
         in textfields.
         """
@@ -198,26 +207,42 @@ class DisplayAttributesDialog(wx.Dialog):
                     if name == key:
                         cat = columns[name]['values'][idx]
                         continue
-                    type  = columns[name]['type']
+                    ctype  = columns[name]['ctype']
                     value = columns[name]['values'][idx]
                     id    = columns[name]['ids'][idx]
                     try:
                         newvalue = self.FindWindowById(id).GetValue()
                     except:
                         newvalue = self.FindWindowById(id).GetLabel()
-
-                    if newvalue == '':
-                        newvalue = None
+                  
+                    if newvalue:
+                        try:
+                            if ctype == int:
+                                newvalue = int(newvalue)
+                            elif ctype == float:
+                                newvalue = float(newvalue)
+                        except ValueError:
+                            GError(parent = self,
+                                   message = _("Column <%(col)s>: Value '%(value)s' needs to be entered as %(type)s.") % \
+                                       {'col' : name,
+                                        'value' : str(newvalue),
+                                        'type' : columns[name]['type'].lower()},
+                                   showTraceback = False)
+                            sqlCommands.append(None)
+                            continue
+                    else:
+                        if self.action == 'add':
+                            continue
                     
                     if newvalue != value:
                         updatedColumns.append(name)
-                        if newvalue is None:
+                        if not newvalue:
                             updatedValues.append('NULL')
                         else:
-                            if type != 'character':
-                                updatedValues.append(newvalue)
+                            if ctype != str:
+                                updatedValues.append(str(newvalue))
                             else:
-                                updatedValues.append("'" + newvalue + "'")
+                                updatedValues.append("'" + str(newvalue) + "'")
                         columns[name]['values'][idx] = newvalue
 
                 if self.action != "add" and len(updatedValues) == 0:
@@ -276,34 +301,40 @@ class DisplayAttributesDialog(wx.Dialog):
     def OnCancel(self, event):
         """!Cancel button pressed
         """
-        self.parent.parent.dialogs['attributes'] = None
-        
+        frame = self.parent.parent
+        frame.dialogs['attributes'] = None
         if hasattr(self, "digit"):
             self.parent.digit.GetDisplay().SetSelected([])
-            self.parent.UpdateMap(render = False)
-        else:
-            self.parent.parent.OnRender(None)
-        
+            if frame.IsAutoRendered():
+                self.parent.UpdateMap(render = False)
+        elif frame.IsAutoRendered():
+            frame.RemoveQueryLayer()
+            self.parent.UpdateMap(render = True)
+
         self.Close()
 
     def OnSubmit(self, event):
         """!Submit records"""
-        ret = 0
+        close = True
+        enc = UserSettings.Get(group = 'atm', key = 'encoding', subkey = 'value')
+        if not enc and 'GRASS_DB_ENCODING' in os.environ:
+            enc = os.environ['GRASS_DB_ENCODING']
+        
         for sql in self.GetSQLString(updateValues = True):
-            enc = UserSettings.Get(group = 'atm', key = 'encoding', subkey = 'value')
-            if not enc and 'GRASS_DB_ENCODING' in os.environ:
-                enc = os.environ['GRASS_DB_ENCODING']
+            if not sql:
+                close = False
+                continue
             if enc:
                 sql = sql.encode(enc)
             
-            ret += gcmd.RunCommand('db.execute',
-                                   parent = self,
-                                   quiet = True,
-                                   stdin = sql)
+            RunCommand('db.execute',
+                       parent = self,
+                       quiet = True,
+                       stdin = sql)
         
-        if ret == 0 and self.closeDialog.IsChecked():
+        if close and self.closeDialog.IsChecked():
             self.OnCancel(event)
-        
+
     def OnFeature(self, event):
         self.fid = int(event.GetString())
         self.UpdateDialog(cats = self.cats, fid = self.fid)
@@ -365,7 +396,7 @@ class DisplayAttributesDialog(wx.Dialog):
                 idx = 0
                 for layer in data['Layer']:
                     layer = int(layer)
-                    if 'Id' in data:
+                    if data['Id'][idx] is not None:
                         tfid = int(data['Id'][idx])
                     else:
                         tfid = 0 # Area / Volume
@@ -455,8 +486,8 @@ class DisplayAttributesDialog(wx.Dialog):
                 # notebook body
                 border = wx.BoxSizer(wx.VERTICAL)
                 
-                flexSizer = wx.FlexGridSizer (cols = 4, hgap = 3, vgap = 3)
-                flexSizer.AddGrowableCol(3)
+                flexSizer = wx.FlexGridSizer (cols = 3, hgap = 3, vgap = 3)
+                flexSizer.AddGrowableCol(2)
                 # columns (sorted by index)
                 names = [''] * len(columns.keys())
                 for name in columns.keys():
@@ -466,10 +497,11 @@ class DisplayAttributesDialog(wx.Dialog):
                     if name == key: # skip key column (category)
                         continue
                     
-                    vtype  = columns[name]['type']
+                    vtype  = columns[name]['type'].lower()
+                    ctype  = columns[name]['ctype']
                     
                     if columns[name]['values'][idx] is not None:
-                        if columns[name]['ctype'] != type(''):
+                        if columns[name]['ctype'] != types.StringType:
                             value = str(columns[name]['values'][idx])
                         else:
                             value = columns[name]['values'][idx]
@@ -479,21 +511,22 @@ class DisplayAttributesDialog(wx.Dialog):
                     colName = wx.StaticText(parent = panel, id = wx.ID_ANY,
                                             label = name)
                     colType = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                            label = "[" + vtype.lower() + "]")
-                    delimiter = wx.StaticText(parent = panel, id = wx.ID_ANY, label = ":")
-                    
+                                            label = "[%s]:" % vtype)
                     colValue = wx.TextCtrl(parent = panel, id = wx.ID_ANY, value = value)
                     colValue.SetName(name)
+                    if ctype == int:
+                        colValue.SetValidator(IntegerValidator())
+                    elif ctype == float:
+                        colValue.SetValidator(FloatValidator())
+                    
                     self.Bind(wx.EVT_TEXT, self.OnSQLStatement, colValue)
                     if self.action == 'display':
                         colValue.SetWindowStyle(wx.TE_READONLY)
                     
                     flexSizer.Add(colName, proportion = 0,
-                                  flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
+                                  flag = wx.ALIGN_CENTER_VERTICAL)
                     flexSizer.Add(colType, proportion = 0,
-                                  flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
-                    flexSizer.Add(delimiter, proportion = 0,
-                                  flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
+                                  flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
                     flexSizer.Add(colValue, proportion = 1,
                                   flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL)
                     # add widget reference to self.columns
@@ -542,7 +575,7 @@ class ModifyTableRecord(wx.Dialog):
         self.CenterOnParent()
         
         self.keyId = keyEditable[0]
-                
+        
         box = wx.StaticBox(parent = self, id = wx.ID_ANY)
         box.Hide()
         self.dataPanel = scrolled.ScrolledPanel(parent = self, id = wx.ID_ANY,
@@ -559,7 +592,9 @@ class ModifyTableRecord(wx.Dialog):
         cId = 0
         self.usebox = False
         self.cat = None
-        for column, value in data:
+        winFocus = False
+        
+        for column, ctype, ctypeStr, value in data:
             if self.keyId == cId:
                 self.cat = int(value)
                 if not keyEditable[1]:
@@ -575,11 +610,19 @@ class ModifyTableRecord(wx.Dialog):
             else:
                 valueWin = wx.TextCtrl(parent = self.dataPanel, id = wx.ID_ANY,
                                        value = value, size = (250, -1))
+                if ctype == int:
+                    valueWin.SetValidator(IntegerValidator())
+                elif ctype == float:
+                    valueWin.SetValidator(FloatValidator())
+                if not winFocus:
+                    wx.CallAfter(valueWin.SetFocus)
+                    winFocus = True
             
             label = wx.StaticText(parent = self.dataPanel, id = wx.ID_ANY,
-                                  label = column + ":")
-            
-            self.widgets.append((label.GetId(), valueWin.GetId()))
+                                  label = column)
+            ctype = wx.StaticText(parent = self.dataPanel, id = wx.ID_ANY,
+                                  label = "[%s]:" % ctypeStr.lower())
+            self.widgets.append((label.GetId(), ctype.GetId(), valueWin.GetId()))
             
             cId += 1
         
@@ -590,15 +633,18 @@ class ModifyTableRecord(wx.Dialog):
         sizer = wx.BoxSizer(wx.VERTICAL)
         
         # data area
-        dataSizer = wx.FlexGridSizer (cols = 2, hgap = 3, vgap = 3)
-        dataSizer.AddGrowableCol(1)
+        dataSizer = wx.FlexGridSizer(cols = 3, hgap = 3, vgap = 3)
+        dataSizer.AddGrowableCol(2)
         
-        for labelId, valueId in self.widgets:
+        for labelId, ctypeId, valueId in self.widgets:
             label = self.FindWindowById(labelId)
+            ctype = self.FindWindowById(ctypeId)
             value = self.FindWindowById(valueId)
             
             dataSizer.Add(label, proportion = 0,
                           flag = wx.ALIGN_CENTER_VERTICAL)
+            dataSizer.Add(ctype, proportion = 0,
+                          flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
             dataSizer.Add(value, proportion = 0,
                           flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL)
         
@@ -626,9 +672,9 @@ class ModifyTableRecord(wx.Dialog):
         sizer.Add(item = btnSizer, proportion = 0,
                   flag = wx.EXPAND | wx.ALL, border = 5)
         
-        framewidth = self.GetSize()[0]
-        self.SetMinSize((framewidth,250))
-        
+        framewidth = self.GetBestSize()[0] + 25
+        self.SetMinSize((framewidth, 250))
+
         self.SetAutoLayout(True)
         self.SetSizer(sizer)
         sizer.Fit(self)
@@ -641,7 +687,7 @@ class ModifyTableRecord(wx.Dialog):
         If columns is given (list), return only values of given columns.
         """
         valueList = []
-        for labelId, valueId in self.widgets:
+        for labelId, ctypeId, valueId in self.widgets:
             column = self.FindWindowById(labelId).GetLabel().replace(':', '')
             if columns is None or column in columns:
                 value = str(self.FindWindowById(valueId).GetValue())
diff --git a/gui/wxpython/gui_modules/dbm.py b/gui/wxpython/dbmgr/manager.py
similarity index 62%
rename from gui/wxpython/gui_modules/dbm.py
rename to gui/wxpython/dbmgr/manager.py
index 2948352..ce2820b 100644
--- a/gui/wxpython/gui_modules/dbm.py
+++ b/gui/wxpython/dbmgr/manager.py
@@ -1,5 +1,5 @@
 """!
- at package dbm.py
+ at package dbmgr.manager
 
 @brief GRASS Attribute Table Manager
 
@@ -14,15 +14,17 @@ python dbm.py vector at mapset
 @endcode
 
 List of classes:
- - Log
- - VirtualAttributeList
- - AttributeManager
+ - manager::Log
+ - manager::VirtualAttributeList
+ - manager::AttributeManager
+ - manager::TableListCtrl
+ - manager::LayerListCtrl
+ - manager::LayerBook
 
 (C) 2007-2009, 2011 by the GRASS Development Team
 
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Jachym Cepicky <jachym.cepicky gmail.com>
 @author Martin Landa <landa.martin gmail.com>
@@ -35,25 +37,24 @@ import tempfile
 import copy
 import types
 
-### i18N
-import gettext
-gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode=True)
-
-import globalvar
+if __name__ == "__main__":
+    sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'wxpython'))
+from core import globalvar
 import wx
 import wx.lib.mixins.listctrl as listmix
-import wx.lib.flatnotebook as FN
+import wx.lib.flatnotebook    as FN
 
 import grass.script as grass
 
-import sqlbuilder
-import gcmd
-import utils
-import gdialogs
-import dbm_base
-from debug import Debug
-from dbm_dialogs import ModifyTableRecord
-from preferences import globalSettings as UserSettings
+from dbmgr.sqlbuilder import SQLFrame
+from core.gcmd        import RunCommand, GException, GError, GMessage, GWarning
+from core.utils       import ListOfCatsToRange
+from gui_core.dialogs import CreateNewVector
+from dbmgr.vinfo      import VectorDBInfo, unicodeValue, createDbInfoDesc
+from core.debug       import Debug
+from dbmgr.dialogs    import ModifyTableRecord
+from core.settings    import UserSettings
+from gui_core.widgets import GNotebook
 
 class Log:
     """
@@ -84,13 +85,13 @@ class VirtualAttributeList(wx.ListCtrl,
         
         self.columns = {} # <- LoadData()
 
-        wx.ListCtrl.__init__(self, parent=parent, id=wx.ID_ANY,
-                             style=wx.LC_REPORT | wx.LC_HRULES |
+        wx.ListCtrl.__init__(self, parent = parent, id = wx.ID_ANY,
+                             style = wx.LC_REPORT | wx.LC_HRULES |
                              wx.LC_VRULES | wx.LC_VIRTUAL | wx.LC_SORT_ASCENDING)
         
         try:
             keyColumn = self.LoadData(layer)
-        except gcmd.GException, e:
+        except GException, e:
             GError(parent = self,
                    message = e.value)
             return
@@ -115,9 +116,9 @@ class VirtualAttributeList(wx.ListCtrl,
 
         # sort item by category (id)
         if keyColumn > -1:
-            self.SortListItems(col=keyColumn, ascending=True) 
-        else:
-            self.SortListItems(col=0, ascending=True) 
+            self.SortListItems(col = keyColumn, ascending = True) 
+        elif keyColumn:
+            self.SortListItems(col = 0, ascending = True) 
         
         # events
         self.Bind(wx.EVT_LIST_ITEM_SELECTED,   self.OnItemSelected)
@@ -130,7 +131,7 @@ class VirtualAttributeList(wx.ListCtrl,
         self.mapDBInfo = mapDBInfo
         self.LoadData(self.layer)
 
-    def LoadData(self, layer, columns=None, where=None, sql=None):
+    def LoadData(self, layer, columns = None, where = None, sql = None):
         """!Load data into list
 
         @param layer layer number
@@ -148,9 +149,9 @@ class VirtualAttributeList(wx.ListCtrl,
         try:
             self.columns = self.mapDBInfo.tables[tableName]
         except KeyError:
-            raise gcmd.GException(_("Attribute table <%s> not found. "
-                                    "For creating the table switch to "
-                                    "'Manage layers' tab.") % tableName)
+            raise GException(_("Attribute table <%s> not found. "
+                               "For creating the table switch to "
+                               "'Manage layers' tab.") % tableName)
         
         if not columns:
             columns = self.mapDBInfo.GetColumns(tableName)
@@ -158,11 +159,10 @@ class VirtualAttributeList(wx.ListCtrl,
             all = self.mapDBInfo.GetColumns(tableName)
             for col in columns:
                 if col not in all:
-                    wx.MessageBox(parent=self,
-                                  message=_("Column <%(column)s> not found in "
-                                            "in the table <%(table)s>.") % \
-                                      { 'column' : col, 'table' : tableName },
-                                  caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+                    GError(parent = self,
+                           message = _("Column <%(column)s> not found in "
+                                       "in the table <%(table)s>.") % \
+                               { 'column' : col, 'table' : tableName })
                     return
         
         try:
@@ -178,33 +178,33 @@ class VirtualAttributeList(wx.ListCtrl,
 
         # stdout can be very large, do not use PIPE, redirect to temp file
         # TODO: more effective way should be implemented...
-        outFile = tempfile.NamedTemporaryFile(mode='w+b')
-        
+        outFile = tempfile.NamedTemporaryFile(mode = 'w+b')
+
+        # split on field sep breaks if varchar() column contains the
+        # values, so while sticking with ASCII we make it something
+        # highly unlikely to exist naturally.
+        fs = '{_sep_}'
+
+        cmdParams = dict(quiet = True,
+                         parent = self,
+                         flags = 'c',
+                         fs = fs)
+
         if sql:
-            ret = gcmd.RunCommand('db.select',
-                                  quiet = True,
-                                  parent = self,
-                                  flags = 'c',
-                                  sql = sql,
-                                  output = outFile.name)
+            cmdParams.update(dict(sql = sql,
+                                  output = outFile.name))
+            ret = RunCommand('db.select',
+                             **cmdParams)
         else:
+            cmdParams.update(dict(map = self.mapDBInfo.map,
+                                  layer = layer,
+                                  where = where,
+                                  stdout = outFile))
             if columns:
-                ret = gcmd.RunCommand('v.db.select',
-                                      quiet = True,
-                                      flags = 'c',
-                                      map = self.mapDBInfo.map,
-                                      layer = layer,
-                                      columns = ','.join(columns),
-                                      where = where,
-                                      stdout=outFile)
-            else:
-                ret = gcmd.RunCommand('v.db.select',
-                                      quiet = True,
-                                      flags = 'c',
-                                      map = self.mapDBInfo.map,
-                                      layer = layer,
-                                      where = where,
-                                      stdout=outFile) 
+                cmdParams.update(dict(columns = ','.join(columns)))
+
+            ret = RunCommand('v.db.select',
+                             **cmdParams)
         
         # These two should probably be passed to init more cleanly
         # setting the numbers of items = number of elements in the dictionary
@@ -240,12 +240,21 @@ class VirtualAttributeList(wx.ListCtrl,
             
             if not record:
                 break
-           
+
+            record = record.split(fs) 
+            if len(columns) != len(record):
+                GError(parent = self, 
+                       message = _("Inconsistent number of columns " 
+                                   "in the table <%(table)s>.") % \
+                                {'table' : tableName })
+                self.columns = {} # because of IsEmpty method
+                return
+
             self.AddDataRow(i, record, columns, keyId)
 
             i += 1
             if i >= 100000:
-                self.log.write(_("Limit 100000 records."))
+                self.log.write(_("Viewing limit: 100000 records."))
                 break
         
         self.SetItemCount(i)
@@ -257,7 +266,7 @@ class VirtualAttributeList(wx.ListCtrl,
                 width = 60
             if width > 300:
                 width = 300
-            self.SetColumnWidth(col=i, width=width)
+            self.SetColumnWidth(col = i, width = width)
             i += 1
         
         self.SendSizeEvent()
@@ -279,7 +288,7 @@ class VirtualAttributeList(wx.ListCtrl,
             j += 1
             cat = i + 1
         
-        for value in record.split('|'):
+        for value in record:
             if self.columns[columns[j]]['ctype'] != types.StringType:
                 try:
                     ### casting disabled (2009/03)
@@ -290,7 +299,7 @@ class VirtualAttributeList(wx.ListCtrl,
             else:
                 # encode string values
                 try:
-                    self.itemDataMap[i].append(dbm_base.unicodeValue(value))
+                    self.itemDataMap[i].append(unicodeValue(value))
                 except UnicodeDecodeError:
                     self.itemDataMap[i].append(_("Unable to decode value. "
                                                  "Set encoding in GUI preferences ('Attributes')."))
@@ -300,13 +309,13 @@ class VirtualAttributeList(wx.ListCtrl,
                     cat = self.columns[columns[j]]['ctype'] (value)
                 except ValueError, e:
                     cat = -1
-                    gcmd.GError(parent = self,
-                                message=_("Error loading attribute data. "
-                                          "Record number: %(rec)d. Unable to convert value '%(val)s' in "
-                                          "key column (%(key)s) to integer.\n\n"
-                                          "Details: %(detail)s") % \
-                                    { 'rec' : i + 1, 'val' : value,
-                                      'key' : keyColumn, 'detail' : e})
+                    GError(parent = self,
+                           message = _("Error loading attribute data. "
+                                       "Record number: %(rec)d. Unable to convert value '%(val)s' in "
+                                       "key column (%(key)s) to integer.\n\n"
+                                       "Details: %(detail)s") % \
+                               { 'rec' : i + 1, 'val' : value,
+                                 'key' : keyColumn, 'detail' : e})
             j += 1
         
         self.itemIndexMap.append(i)
@@ -383,8 +392,8 @@ class VirtualAttributeList(wx.ListCtrl,
             self.popupID11 = wx.NewId()
             self.popupID12 = wx.NewId()
         
-        popupMenu.Append(self.popupID1, text=_("Sort ascending"))
-        popupMenu.Append(self.popupID2, text=_("Sort descending"))
+        popupMenu.Append(self.popupID1, text = _("Sort ascending"))
+        popupMenu.Append(self.popupID2, text = _("Sort descending"))
         popupMenu.AppendSeparator()
         subMenu = wx.Menu()
         popupMenu.AppendMenu(self.popupID3, _("Calculate (only numeric columns)"),
@@ -393,18 +402,18 @@ class VirtualAttributeList(wx.ListCtrl,
                 self.columns[self.GetColumn(self._col).GetText()]['ctype'] not in (types.IntType, types.FloatType):
             popupMenu.Enable(self.popupID3, False)
         
-        subMenu.Append(self.popupID4,  text=_("Area size"))
-        subMenu.Append(self.popupID5,  text=_("Line length"))
-        subMenu.Append(self.popupID6,  text=_("Compactness of an area"))
-        subMenu.Append(self.popupID7,  text=_("Fractal dimension of boundary defining a polygon"))
-        subMenu.Append(self.popupID8,  text=_("Perimeter length of an area"))
-        subMenu.Append(self.popupID9,  text=_("Number of features for each category"))
-        subMenu.Append(self.popupID10, text=_("Slope steepness of 3D line"))
-        subMenu.Append(self.popupID11, text=_("Line sinuousity"))
-        subMenu.Append(self.popupID12, text=_("Line azimuth"))
-        
-        self.Bind (wx.EVT_MENU, self.OnColumnSortAsc,  id=self.popupID1)
-        self.Bind (wx.EVT_MENU, self.OnColumnSortDesc, id=self.popupID2)
+        subMenu.Append(self.popupID4,  text = _("Area size"))
+        subMenu.Append(self.popupID5,  text = _("Line length"))
+        subMenu.Append(self.popupID6,  text = _("Compactness of an area"))
+        subMenu.Append(self.popupID7,  text = _("Fractal dimension of boundary defining a polygon"))
+        subMenu.Append(self.popupID8,  text = _("Perimeter length of an area"))
+        subMenu.Append(self.popupID9,  text = _("Number of features for each category"))
+        subMenu.Append(self.popupID10, text = _("Slope steepness of 3D line"))
+        subMenu.Append(self.popupID11, text = _("Line sinuousity"))
+        subMenu.Append(self.popupID12, text = _("Line azimuth"))
+        
+        self.Bind (wx.EVT_MENU, self.OnColumnSortAsc,  id = self.popupID1)
+        self.Bind (wx.EVT_MENU, self.OnColumnSortDesc, id = self.popupID2)
         for id in (self.popupID4, self.popupID5, self.popupID6,
                    self.popupID7, self.popupID8, self.popupID9,
                    self.popupID10, self.popupID11, self.popupID12):
@@ -458,12 +467,12 @@ class VirtualAttributeList(wx.ListCtrl,
         if not option:
             return
         
-        gcmd.RunCommand('v.to.db',
-                        parent = self.parent,
-                        map = self.mapDBInfo.map,
-                        layer = self.layer, 
-                        option = option,
-                        columns = self.GetColumn(self._col).GetText())
+        RunCommand('v.to.db',
+                   parent = self.parent,
+                   map = self.mapDBInfo.map,
+                   layer = self.layer, 
+                   option = option,
+                   columns = self.GetColumn(self._col).GetText())
         
         self.LoadData(self.layer)
         
@@ -478,7 +487,7 @@ class VirtualAttributeList(wx.ListCtrl,
             info.m_text = self.GetColumn(column).GetText()
             self.SetColumn(column, info)
         
-    def SortItems(self, sorter=cmp):
+    def SortItems(self, sorter = cmp):
         """!Sort items"""
         items = list(self.itemDataMap.keys())
         items.sort(self.Sorter)
@@ -497,7 +506,7 @@ class VirtualAttributeList(wx.ListCtrl,
             item1 = self.itemDataMap[key1][self._col]
             item2 = self.itemDataMap[key2][self._col]
 
-        if type(item1) == type('') or type(item2) == type(''):
+        if type(item1) == types.StringType or type(item2) == types.StringTypes:
             cmpVal = locale.strcoll(str(item1), str(item2))
         else:
             cmpVal = cmp(item1, item2)
@@ -524,13 +533,20 @@ class VirtualAttributeList(wx.ListCtrl,
         return True
     
 class AttributeManager(wx.Frame):
-    """
-    GRASS Attribute manager main window
-    """
-    def __init__(self, parent, id=wx.ID_ANY,
-                 size = wx.DefaultSize, style = wx.DEFAULT_FRAME_STYLE,
-                 title=None, vectorName=None, item=None, log=None, selection = 0):
-
+    def __init__(self, parent, id = wx.ID_ANY,
+                 title = None, vectorName = None, item = None, log = None,
+                 selection = None, **kwargs):
+        """!GRASS Attribute Table Manager window
+
+        @param parent parent window
+        @parem id window id
+        @param title window title or None for default title
+        @param vetorName name of vector map
+        @param item item from Layer Tree
+        @param log log window
+        @param selection name of page to be selected
+        @param kwagrs other wx.Frame's arguments
+        """
         self.vectorName = vectorName
         self.parent     = parent # GMFrame
         self.treeItem   = item   # item in layer tree
@@ -547,13 +563,9 @@ class AttributeManager(wx.Frame):
         else:
             self.editable = False
         
-        # FIXME: editing is currently broken on wingrass (bug #1270)
-        if sys.platform == 'win32':
-            self.editable = False
-
-        self.cmdLog     = log    # self.parent.goutput
+        self.cmdLog = log    # self.parent.goutput
         
-        wx.Frame.__init__(self, parent, id, style=style)
+        wx.Frame.__init__(self, parent, id, *kwargs)
 
         # title
         if not title:
@@ -565,7 +577,7 @@ class AttributeManager(wx.Frame):
         # icon
         self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass_sql.ico'), wx.BITMAP_TYPE_ICO))
 
-        self.panel = wx.Panel(parent=self, id=wx.ID_ANY)
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
 
         try:
             self.map        = self.parent.curr_page.maptree.Map
@@ -580,48 +592,31 @@ class AttributeManager(wx.Frame):
         self.qlayer = None
 
         # -> layers / tables description
-        self.mapDBInfo = dbm_base.VectorDBInfo(self.vectorName)
+        self.mapDBInfo = VectorDBInfo(self.vectorName)
 
         # sqlbuilder
         self.builder = None
         
         if len(self.mapDBInfo.layers.keys()) == 0:
-            wx.MessageBox(parent=self.parent,
-                          message=_("Database connection for vector map <%s> "
-                                    "is not defined in DB file. "
-                                    "You can define new connection in "
-                                    "'Manage layers' tab.") % self.vectorName,
-                          caption=_("Attribute Table Manager"),
-                          style=wx.OK | wx.ICON_INFORMATION | wx.CENTRE)
-
+            GMessage(parent = self.parent,
+                     message = _("Database connection for vector map <%s> "
+                                 "is not defined in DB file. "
+                                 "You can define new connection in "
+                                 "'Manage layers' tab.") % self.vectorName)
+        
         #
         # list of command/SQL statements to be performed
         #
         self.listOfCommands      = []
         self.listOfSQLStatements = []
 
-        self.CreateStatusBar(number=1)
+        self.CreateStatusBar(number = 1)
 
         # set up virtual lists (each layer)
         ### {layer: list, widgets...}
         self.layerPage = {}
 
-        # auinotebook (browse, manage, settings)
-        #self.notebook = wx.aui.AuiNotebook(parent=self, id=wx.ID_ANY,
-        #                                   style=wx.aui.AUI_NB_BOTTOM)
-        # really needed (ML)
-        # self.notebook.SetFont(wx.Font(10, wx.FONTFAMILY_MODERN, wx.NORMAL, wx.NORMAL, 0, ''))
-
-        if globalvar.hasAgw:
-            self.notebook = FN.FlatNotebook(parent = self.panel, id = wx.ID_ANY,
-                                            agwStyle = FN.FNB_BOTTOM |
-                                            FN.FNB_NO_NAV_BUTTONS |
-                                            FN.FNB_FANCY_TABS | FN.FNB_NO_X_BUTTON)
-        else:
-            self.notebook = FN.FlatNotebook(parent = self.panel, id = wx.ID_ANY,
-                                            style = FN.FNB_BOTTOM |
-                                            FN.FNB_NO_NAV_BUTTONS |
-                                            FN.FNB_FANCY_TABS | FN.FNB_NO_X_BUTTON)
+        self.notebook = GNotebook(self.panel, style = globalvar.FNPageDStyle)
         
         if globalvar.hasAgw:
             dbmStyle = { 'agwStyle' : globalvar.FNPageStyle }
@@ -630,37 +625,39 @@ class AttributeManager(wx.Frame):
         
         self.browsePage = FN.FlatNotebook(self.panel, id = wx.ID_ANY,
                                           **dbmStyle)
-        # self.notebook.AddPage(self.browsePage, caption=_("Browse data"))
-        self.notebook.AddPage(self.browsePage, text=_("Browse data")) # FN
+        self.notebook.AddPage(page = self.browsePage, text = _("Browse data"),
+                              name = 'browse')
         self.browsePage.SetTabAreaColour(globalvar.FNPageColor)
 
         self.manageTablePage = FN.FlatNotebook(self.panel, id = wx.ID_ANY,
                                                **dbmStyle)
-        #self.notebook.AddPage(self.manageTablePage, caption=_("Manage tables"))
-        self.notebook.AddPage(self.manageTablePage, text=_("Manage tables")) # FN
+        self.notebook.AddPage(page = self.manageTablePage, text = _("Manage tables"),
+                              name = 'table')
         if not self.editable:
             self.notebook.GetPage(self.notebook.GetPageCount()-1).Enable(False)
         self.manageTablePage.SetTabAreaColour(globalvar.FNPageColor)
 
         self.manageLayerPage = FN.FlatNotebook(self.panel, id = wx.ID_ANY,
                                                **dbmStyle)
-        #self.notebook.AddPage(self.manageLayerPage, caption=_("Manage layers"))
-        self.notebook.AddPage(self.manageLayerPage, text=_("Manage layers")) # FN
+        self.notebook.AddPage(page = self.manageLayerPage, text = _("Manage layers"),
+                              name = 'layers')
         self.manageLayerPage.SetTabAreaColour(globalvar.FNPageColor)
         if not self.editable:
             self.notebook.GetPage(self.notebook.GetPageCount()-1).Enable(False)
         
-        self.__createBrowsePage()
-        self.__createManageTablePage()
-        self.__createManageLayerPage()
-        wx.CallAfter(self.notebook.SetSelection, selection)
+        self._createBrowsePage()
+        self._createManageTablePage()
+        self._createManageLayerPage()
+
+        if selection:
+            wx.CallAfter(self.notebook.SetSelectionByName, selection)
+        else:
+            wx.CallAfter(self.notebook.SetSelection, 0) # select browse tab
         
-        #
         # buttons
-        #
-        self.btnQuit   = wx.Button(parent=self.panel, id=wx.ID_EXIT)
+        self.btnQuit   = wx.Button(parent = self.panel, id = wx.ID_EXIT)
         self.btnQuit.SetToolTipString(_("Close Attribute Table Manager"))
-        self.btnReload = wx.Button(parent=self.panel, id=wx.ID_REFRESH)
+        self.btnReload = wx.Button(parent = self.panel, id = wx.ID_REFRESH)
         self.btnReload.SetToolTipString(_("Reload attribute data (selected layer only)"))
 
         # events
@@ -669,137 +666,148 @@ class AttributeManager(wx.Frame):
         self.notebook.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
         self.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.OnLayerPageChanged, self.browsePage)
         self.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.OnLayerPageChanged, self.manageTablePage)
-        
+        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
+
         # do layout
-        self.__layout()
+        self._layout()
 
         # self.SetMinSize(self.GetBestSize())
-        self.SetSize((680, 550)) # FIXME hard-coded size
+        self.SetSize((700, 550)) # FIXME hard-coded size
         self.SetMinSize(self.GetSize())
 
-    def __createBrowsePage(self, onlyLayer=-1):
+    def _createBrowsePage(self, onlyLayer = -1):
         """!Create browse tab page"""
         for layer in self.mapDBInfo.layers.keys():
             if onlyLayer > 0 and layer != onlyLayer:
                 continue
 
-            panel = wx.Panel(parent=self.browsePage, id=wx.ID_ANY)
+            panel = wx.Panel(parent = self.browsePage, id = wx.ID_ANY)
             
             #IMPORTANT NOTE: wx.StaticBox MUST be defined BEFORE any of the 
             #   controls that are placed IN the wx.StaticBox, or it will freeze
             #   on the Mac
             
-            listBox = wx.StaticBox(parent=panel, id=wx.ID_ANY,
-                       label=" %s " % _("Attribute data - right-click to edit/manage records"))
+            listBox = wx.StaticBox(parent = panel, id = wx.ID_ANY,
+                                   label = " %s " % _("Attribute data - right-click to edit/manage records"))
             listSizer = wx.StaticBoxSizer(listBox, wx.VERTICAL)
             
             win = VirtualAttributeList(panel, self.log,
                                        self.mapDBInfo, layer)
             if win.IsEmpty():
-                del panel
+                panel.Destroy()
                 continue
             
             win.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnDataItemActivated)
 
             self.layerPage[layer] = {'browsePage': panel.GetId()}
-
-            self.browsePage.AddPage(page=panel, text=" %d / %s %s" % \
-                                        (layer, _("Table"), self.mapDBInfo.layers[layer]['table']))
-
+            
+            label = _("Table")
+            if not self.editable:
+                label += _(" (readonly)")
+            self.browsePage.AddPage(page = panel, text = " %d / %s %s" % \
+                                        (layer, label, self.mapDBInfo.layers[layer]['table']))
+            
             pageSizer = wx.BoxSizer(wx.VERTICAL)
 
             # attribute data            
-            sqlBox = wx.StaticBox(parent=panel, id=wx.ID_ANY,
-                                  label=" %s " % _("SQL Query"))
+            sqlBox = wx.StaticBox(parent = panel, id = wx.ID_ANY,
+                                  label = " %s " % _("SQL Query"))
 
             sqlSizer = wx.StaticBoxSizer(sqlBox, wx.VERTICAL)
 
             win.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnDataRightUp) #wxMSW
             win.Bind(wx.EVT_RIGHT_UP,            self.OnDataRightUp) #wxGTK
-            if UserSettings.Get(group='atm', key='leftDbClick', subkey='selection') == 0:
+            if UserSettings.Get(group = 'atm', key = 'leftDbClick', subkey = 'selection') == 0:
                 win.Bind(wx.EVT_LEFT_DCLICK, self.OnDataItemEdit)
                 win.Bind(wx.EVT_COMMAND_LEFT_DCLICK, self.OnDataItemEdit)
             else:
                 win.Bind(wx.EVT_LEFT_DCLICK, self.OnDataDrawSelected)
                 win.Bind(wx.EVT_COMMAND_LEFT_DCLICK, self.OnDataDrawSelected)
-                
             
-            listSizer.Add(item=win, proportion=1,
-                          flag=wx.EXPAND | wx.ALL,
-                          border=3)
+            listSizer.Add(item = win, proportion = 1,
+                          flag = wx.EXPAND | wx.ALL,
+                          border = 3)
 
             # sql statement box
-            btnApply = wx.Button(parent=panel, id=wx.ID_APPLY)
+            btnApply = wx.Button(parent = panel, id = wx.ID_APPLY)
             btnApply.SetToolTipString(_("Apply SELECT statement and reload data records"))
             btnApply.Bind(wx.EVT_BUTTON, self.OnApplySqlStatement)
-            btnSqlBuilder = wx.Button(parent=panel, id=wx.ID_ANY, label=_("SQL Builder"))
+            btnSqlBuilder = wx.Button(parent = panel, id = wx.ID_ANY, label = _("SQL Builder"))
             btnSqlBuilder.Bind(wx.EVT_BUTTON, self.OnBuilder)
 
-            sqlSimple = wx.RadioButton(parent=panel, id=wx.ID_ANY,
-                                       label=_("Simple"))
+            sqlSimple = wx.RadioButton(parent = panel, id = wx.ID_ANY,
+                                       label = _("Simple"))
             sqlSimple.SetValue(True)
-            sqlAdvanced = wx.RadioButton(parent=panel, id=wx.ID_ANY,
-                                         label=_("Advanced"))
+            sqlAdvanced = wx.RadioButton(parent = panel, id = wx.ID_ANY,
+                                         label = _("Advanced"))
             sqlSimple.Bind(wx.EVT_RADIOBUTTON,   self.OnChangeSql)
             sqlAdvanced.Bind(wx.EVT_RADIOBUTTON, self.OnChangeSql)
 
-            sqlWhereColumn = wx.Choice(parent=panel, id=wx.ID_ANY,
-                                       size=(100,-1),
-                                       choices=self.mapDBInfo.GetColumns(self.mapDBInfo.layers[layer]['table']))
-            sqlWhereValue = wx.TextCtrl(parent=panel, id=wx.ID_ANY, value="",
-                                        style=wx.TE_PROCESS_ENTER)
+            sqlWhereColumn = wx.ComboBox(parent = panel, id = wx.ID_ANY,
+                                         size = (100,-1),
+                                         style = wx.CB_SIMPLE | wx.CB_READONLY,
+                                         choices = self.mapDBInfo.GetColumns(self.mapDBInfo.layers[layer]['table']))
+            sqlWhereColumn.SetSelection(0)
+            sqlWhereCond = wx.Choice(parent = panel, id = wx.ID_ANY,
+                                     size = (55,-1),
+                                     choices = ['=', '!=', '<', '<=', '>', '>='])
+            sqlWhereValue = wx.TextCtrl(parent = panel, id = wx.ID_ANY, value = "",
+                                        style = wx.TE_PROCESS_ENTER)
             sqlWhereValue.SetToolTipString(_("Example: %s") % "MULTILANE = 'no' AND OBJECTID < 10")
 
-            sqlStatement = wx.TextCtrl(parent=panel, id=wx.ID_ANY,
-                                       value="SELECT * FROM %s" % \
+            sqlStatement = wx.TextCtrl(parent = panel, id = wx.ID_ANY,
+                                       value = "SELECT * FROM %s" % \
                                            self.mapDBInfo.layers[layer]['table'],
-                                       style=wx.TE_PROCESS_ENTER)
+                                       style = wx.TE_PROCESS_ENTER)
             sqlStatement.SetToolTipString(_("Example: %s") % "SELECT * FROM roadsmajor WHERE MULTILANE = 'no' AND OBJECTID < 10")
             sqlWhereValue.Bind(wx.EVT_TEXT_ENTER, self.OnApplySqlStatement)
             sqlStatement.Bind(wx.EVT_TEXT_ENTER, self.OnApplySqlStatement)
 
-            sqlLabel = wx.StaticText(parent=panel, id=wx.ID_ANY,
-                                     label="SELECT * FROM %s WHERE " % \
+            sqlLabel = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                     label = "SELECT * FROM %s WHERE " % \
                                          self.mapDBInfo.layers[layer]['table'])
-            label_query = wx.StaticText(parent=panel, id=wx.ID_ANY,
-                                        label="")
+            label_query = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                        label = "")
 
-            sqlFlexSizer = wx.FlexGridSizer (cols=3, hgap=5, vgap=5)
+            sqlFlexSizer = wx.FlexGridSizer (cols = 3, hgap = 5, vgap = 5)
             sqlFlexSizer.AddGrowableCol(1)
 
-            sqlFlexSizer.Add(item=sqlSimple,
-                             flag=wx.ALIGN_CENTER_VERTICAL)
+            sqlFlexSizer.Add(item = sqlSimple,
+                             flag = wx.ALIGN_CENTER_VERTICAL)
             sqlSimpleSizer = wx.BoxSizer(wx.HORIZONTAL)
-            sqlSimpleSizer.Add(item=sqlLabel,
-                               flag=wx.ALIGN_CENTER_VERTICAL)
-            sqlSimpleSizer.Add(item=sqlWhereColumn,
-                               flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL)
-            sqlSimpleSizer.Add(item=sqlWhereValue, proportion=1,
-                               flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL)
-            sqlFlexSizer.Add(item=sqlSimpleSizer,
-                             flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
-            sqlFlexSizer.Add(item=btnApply,
-                             flag=wx.ALIGN_RIGHT)
-            sqlFlexSizer.Add(item=sqlAdvanced,
-                             flag=wx.ALIGN_CENTER_VERTICAL)
-            sqlFlexSizer.Add(item=sqlStatement,
-                             flag=wx.EXPAND)
-            sqlFlexSizer.Add(item=btnSqlBuilder,
-                             flag=wx.ALIGN_RIGHT)
-
-            sqlSizer.Add(item=sqlFlexSizer,
-                         flag=wx.ALL | wx.EXPAND,
-                         border=3)
-
-            pageSizer.Add(item=listSizer,
-                          proportion=1,
-                          flag=wx.ALL | wx.EXPAND,
-                          border=5)
-
-            pageSizer.Add(item=sqlSizer,
-                          proportion=0,
-                          flag=wx.BOTTOM | wx.LEFT | wx.RIGHT | wx.EXPAND,
-                          border=5)
+            sqlSimpleSizer.Add(item = sqlLabel,
+                               flag = wx.ALIGN_CENTER_VERTICAL)
+            sqlSimpleSizer.Add(item = sqlWhereColumn,
+                               flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL)
+            sqlSimpleSizer.Add(item = sqlWhereCond,
+                               flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT,
+                               border = 3)
+            sqlSimpleSizer.Add(item = sqlWhereValue, proportion = 1,
+                               flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL)
+            sqlFlexSizer.Add(item = sqlSimpleSizer,
+                             flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
+            sqlFlexSizer.Add(item = btnApply,
+                             flag = wx.ALIGN_RIGHT)
+            sqlFlexSizer.Add(item = sqlAdvanced,
+                             flag = wx.ALIGN_CENTER_VERTICAL)
+            sqlFlexSizer.Add(item = sqlStatement,
+                             flag = wx.EXPAND)
+            sqlFlexSizer.Add(item = btnSqlBuilder,
+                             flag = wx.ALIGN_RIGHT)
+
+            sqlSizer.Add(item = sqlFlexSizer,
+                         flag = wx.ALL | wx.EXPAND,
+                         border = 3)
+
+            pageSizer.Add(item = listSizer,
+                          proportion = 1,
+                          flag = wx.ALL | wx.EXPAND,
+                          border = 5)
+
+            pageSizer.Add(item = sqlSizer,
+                          proportion = 0,
+                          flag = wx.BOTTOM | wx.LEFT | wx.RIGHT | wx.EXPAND,
+                          border = 5)
 
             panel.SetSizer(pageSizer)
 
@@ -807,6 +815,7 @@ class AttributeManager(wx.Frame):
             self.layerPage[layer]['simple']    = sqlSimple.GetId()
             self.layerPage[layer]['advanced']  = sqlAdvanced.GetId()
             self.layerPage[layer]['whereColumn'] = sqlWhereColumn.GetId()
+            self.layerPage[layer]['whereOperator'] = sqlWhereCond.GetId()
             self.layerPage[layer]['where']     = sqlWhereValue.GetId()
             self.layerPage[layer]['builder']   = btnSqlBuilder.GetId()
             self.layerPage[layer]['statement'] = sqlStatement.GetId()
@@ -821,7 +830,7 @@ class AttributeManager(wx.Frame):
         except (IndexError, KeyError):
             self.layer = None
         
-    def __createManageTablePage(self, onlyLayer=-1):
+    def _createManageTablePage(self, onlyLayer = -1):
         """!Create manage page (create/link and alter tables)"""
         for layer in self.mapDBInfo.layers.keys():
             if onlyLayer > 0 and layer != onlyLayer:
@@ -830,11 +839,13 @@ class AttributeManager(wx.Frame):
             if not layer in self.layerPage:
                 continue
             
-            panel = wx.Panel(parent=self.manageTablePage, id=wx.ID_ANY)
+            panel = wx.Panel(parent = self.manageTablePage, id = wx.ID_ANY)
             self.layerPage[layer]['tablePage'] = panel.GetId()
-            self.manageTablePage.AddPage(page=panel,
-                                         text=" %d / %s %s" % (layer,
-                                                               _("Table"),
+            label = _("Table")
+            if not self.editable:
+                label += _(" (readonly)")
+            self.manageTablePage.AddPage(page = panel,
+                                         text = " %d / %s %s" % (layer, label,
                                                                self.mapDBInfo.layers[layer]['table']))
             
             pageSizer = wx.BoxSizer(wx.VERTICAL)
@@ -842,27 +853,27 @@ class AttributeManager(wx.Frame):
             #
             # dbInfo
             #
-            dbBox = wx.StaticBox(parent=panel, id=wx.ID_ANY,
-                                          label=" %s " % _("Database connection"))
+            dbBox = wx.StaticBox(parent = panel, id = wx.ID_ANY,
+                                          label = " %s " % _("Database connection"))
             dbSizer = wx.StaticBoxSizer(dbBox, wx.VERTICAL)
-            dbSizer.Add(item=dbm_base.createDbInfoDesc(panel, self.mapDBInfo, layer),
-                        proportion=1,
-                        flag=wx.EXPAND | wx.ALL,
-                        border=3)
+            dbSizer.Add(item = createDbInfoDesc(panel, self.mapDBInfo, layer),
+                        proportion = 1,
+                        flag = wx.EXPAND | wx.ALL,
+                        border = 3)
             
             #
             # table description
             #
             table = self.mapDBInfo.layers[layer]['table']
-            tableBox = wx.StaticBox(parent=panel, id=wx.ID_ANY,
-                                    label=" %s " % _("Table <%s> - right-click to delete column(s)") % table)
+            tableBox = wx.StaticBox(parent = panel, id = wx.ID_ANY,
+                                    label = " %s " % _("Table <%s> - right-click to delete column(s)") % table)
             
             tableSizer = wx.StaticBoxSizer(tableBox, wx.VERTICAL)
             
-            list = self.__createTableDesc(panel, table)
-            list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnTableRightUp) #wxMSW
-            list.Bind(wx.EVT_RIGHT_UP,            self.OnTableRightUp) #wxGTK
-            self.layerPage[layer]['tableData'] = list.GetId()
+            tlist = self._createTableDesc(panel, table)
+            tlist.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnTableRightUp) #wxMSW
+            tlist.Bind(wx.EVT_RIGHT_UP,            self.OnTableRightUp) #wxGTK
+            self.layerPage[layer]['tableData'] = tlist.GetId()
             
             # manage columns (add)
             addBox = wx.StaticBox(parent = panel, id = wx.ID_ANY,
@@ -870,18 +881,18 @@ class AttributeManager(wx.Frame):
             addSizer = wx.StaticBoxSizer(addBox, wx.HORIZONTAL)
             
             column = wx.TextCtrl(parent = panel, id = wx.ID_ANY, value = '',
-                                 size=(150, -1), style = wx.TE_PROCESS_ENTER)
+                                 size = (150, -1), style = wx.TE_PROCESS_ENTER)
             column.Bind(wx.EVT_TEXT,       self.OnTableAddColumnName)
             column.Bind(wx.EVT_TEXT_ENTER, self.OnTableItemAdd)
             self.layerPage[layer]['addColName'] = column.GetId()
-            addSizer.Add(item= wx.StaticText(parent = panel, id = wx.ID_ANY, label=_("Column")),
+            addSizer.Add(item =  wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Column")),
                          flag = wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT,
                          border = 5)
             addSizer.Add(item = column, proportion = 1,
                          flag = wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT,
                          border = 5)
             
-            ctype = wx.Choice (parent=panel, id=wx.ID_ANY,
+            ctype = wx.Choice (parent = panel, id = wx.ID_ANY,
                                choices = ["integer",
                                           "double",
                                           "varchar",
@@ -889,11 +900,11 @@ class AttributeManager(wx.Frame):
             ctype.SetSelection(0)
             ctype.Bind(wx.EVT_CHOICE, self.OnTableChangeType)
             self.layerPage[layer]['addColType'] = ctype.GetId()
-            addSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY, label=_("Type")), 
+            addSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Type")), 
                          flag = wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT,
                          border = 5)
             addSizer.Add(item = ctype,
-                         flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT,
+                         flag = wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT,
                          border = 5)
             
             length = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
@@ -951,7 +962,7 @@ class AttributeManager(wx.Frame):
             renameSizer.Add(item = btnRenameCol, flag = wx.ALL | wx.ALIGN_RIGHT | wx.EXPAND,
                             border = 3)
             
-            tableSizer.Add(item = list,
+            tableSizer.Add(item = tlist,
                            flag = wx.ALL | wx.EXPAND,
                            proportion = 1,
                            border = 3)
@@ -983,97 +994,100 @@ class AttributeManager(wx.Frame):
         except IndexError:
             self.layer = None
         
-    def __createTableDesc(self, parent, table):
+    def _createTableDesc(self, parent, table):
         """!Create list with table description"""
-        list = TableListCtrl(parent=parent, id=wx.ID_ANY,
-                             table=self.mapDBInfo.tables[table],
-                             columns=self.mapDBInfo.GetColumns(table))
-        list.Populate()
+        tlist = TableListCtrl(parent = parent, id = wx.ID_ANY,
+                             table = self.mapDBInfo.tables[table],
+                             columns = self.mapDBInfo.GetColumns(table))
+        tlist.Populate()
         # sorter
         # itemDataMap = list.Populate()
         # listmix.ColumnSorterMixin.__init__(self, 2)
 
-        return list
+        return tlist
 
-    def __createManageLayerPage(self):
+    def _createManageLayerPage(self):
         """!Create manage page"""
-        splitterWin = wx.SplitterWindow(parent=self.manageLayerPage, id=wx.ID_ANY)
+        splitterWin = wx.SplitterWindow(parent = self.manageLayerPage, id = wx.ID_ANY)
         splitterWin.SetMinimumPaneSize(100)
         
-        self.manageLayerPage.AddPage(page=splitterWin,
-                                     text=_("Layers of vector map")) # dummy page
+        label = _("Layers of vector map")
+        if not self.editable:
+            label += _(" (readonly)")
+        self.manageLayerPage.AddPage(page = splitterWin,
+                                     text = label) # dummy page
         
         #
         # list of layers
         #
-        panelList = wx.Panel(parent=splitterWin, id=wx.ID_ANY)
+        panelList = wx.Panel(parent = splitterWin, id = wx.ID_ANY)
 
         panelListSizer  = wx.BoxSizer(wx.VERTICAL)
-        layerBox = wx.StaticBox(parent=panelList, id=wx.ID_ANY,
-                                label=" %s " % _("List of layers"))
+        layerBox = wx.StaticBox(parent = panelList, id = wx.ID_ANY,
+                                label = " %s " % _("List of layers"))
         layerSizer = wx.StaticBoxSizer(layerBox, wx.VERTICAL)
 
-        self.layerList = self.__createLayerDesc(panelList)
+        self.layerList = self._createLayerDesc(panelList)
         self.layerList.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnLayerRightUp) #wxMSW
         self.layerList.Bind(wx.EVT_RIGHT_UP,            self.OnLayerRightUp) #wxGTK
         
-        layerSizer.Add(item=self.layerList,
-                       flag=wx.ALL | wx.EXPAND,
-                       proportion=1,
-                       border=3)
+        layerSizer.Add(item = self.layerList,
+                       flag = wx.ALL | wx.EXPAND,
+                       proportion = 1,
+                       border = 3)
 
-        panelListSizer.Add(item=layerSizer,
-                           flag=wx.ALL | wx.EXPAND,
-                           proportion=1,
-                           border=3)
+        panelListSizer.Add(item = layerSizer,
+                           flag = wx.ALL | wx.EXPAND,
+                           proportion = 1,
+                           border = 3)
 
         panelList.SetSizer(panelListSizer)
 
         #
         # manage part
         #
-        panelManage = wx.Panel(parent=splitterWin, id=wx.ID_ANY)
+        panelManage = wx.Panel(parent = splitterWin, id = wx.ID_ANY)
          
         manageSizer = wx.BoxSizer(wx.VERTICAL)
 
-        self.manageLayerBook = LayerBook(parent=panelManage, id=wx.ID_ANY,
-                                         parentDialog=self)
+        self.manageLayerBook = LayerBook(parent = panelManage, id = wx.ID_ANY,
+                                         parentDialog = self)
 
-        manageSizer.Add(item=self.manageLayerBook,
-                        proportion=1,
-                        flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND,
-                        border=5)
+        manageSizer.Add(item = self.manageLayerBook,
+                        proportion = 1,
+                        flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND,
+                        border = 5)
 
         panelManage.SetSizer(manageSizer)
         splitterWin.SplitHorizontally(panelList, panelManage, 100) 
         splitterWin.Fit()
 
-    def __createLayerDesc(self, parent):
+    def _createLayerDesc(self, parent):
         """!Create list of linked layers"""
-        list = LayerListCtrl(parent=parent, id=wx.ID_ANY,
-                             layers=self.mapDBInfo.layers)
+        tlist = LayerListCtrl(parent = parent, id = wx.ID_ANY,
+                             layers = self.mapDBInfo.layers)
         
-        list.Populate()
+        tlist.Populate()
         # sorter
         # itemDataMap = list.Populate()
         # listmix.ColumnSorterMixin.__init__(self, 2)
 
-        return list
+        return tlist
 
-    def __layout(self):
+    def _layout(self):
         """!Do layout"""
         # frame body
         mainSizer = wx.BoxSizer(wx.VERTICAL)
 
         # buttons
         btnSizer = wx.BoxSizer(wx.HORIZONTAL)
-        btnSizer.Add(item=self.btnReload, proportion=1,
-                     flag=wx.ALL | wx.ALIGN_RIGHT, border=5)
-        btnSizer.Add(item=self.btnQuit, proportion=1,
-                     flag=wx.ALL | wx.ALIGN_RIGHT, border=5)
+        btnSizer.Add(item = self.btnReload, proportion = 1,
+                     flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
+        btnSizer.Add(item = self.btnQuit, proportion = 1,
+                     flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
 
-        mainSizer.Add(item=self.notebook, proportion=1, flag=wx.EXPAND)
-        mainSizer.Add(item=btnSizer, flag=wx.ALIGN_RIGHT | wx.ALL, border=5)
+        mainSizer.Add(item = self.notebook, proportion = 1, flag = wx.EXPAND)
+        mainSizer.Add(item = btnSizer, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
 
         self.panel.SetAutoLayout(True)
         self.panel.SetSizer(mainSizer)
@@ -1095,24 +1109,24 @@ class AttributeManager(wx.Frame):
             self.popupDataID10 = wx.NewId()
             self.popupDataID11 = wx.NewId()
 
-            self.Bind(wx.EVT_MENU, self.OnDataItemEdit,       id=self.popupDataID1)
-            self.Bind(wx.EVT_MENU, self.OnDataItemAdd,        id=self.popupDataID2)
-            self.Bind(wx.EVT_MENU, self.OnDataItemDelete,     id=self.popupDataID3)
-            self.Bind(wx.EVT_MENU, self.OnDataItemDeleteAll,  id=self.popupDataID4)
-            self.Bind(wx.EVT_MENU, self.OnDataSelectAll,      id=self.popupDataID5)
-            self.Bind(wx.EVT_MENU, self.OnDataSelectNone,     id=self.popupDataID6)
-            self.Bind(wx.EVT_MENU, self.OnDataDrawSelected,   id=self.popupDataID7)
-            self.Bind(wx.EVT_MENU, self.OnDataDrawSelectedZoom, id=self.popupDataID8)
-            self.Bind(wx.EVT_MENU, self.OnExtractSelected,    id=self.popupDataID9)
-            self.Bind(wx.EVT_MENU, self.OnDeleteSelected,     id=self.popupDataID11)
-            self.Bind(wx.EVT_MENU, self.OnDataReload,         id=self.popupDataID10)
-
-        list = self.FindWindowById(self.layerPage[self.layer]['data'])
+            self.Bind(wx.EVT_MENU, self.OnDataItemEdit,       id = self.popupDataID1)
+            self.Bind(wx.EVT_MENU, self.OnDataItemAdd,        id = self.popupDataID2)
+            self.Bind(wx.EVT_MENU, self.OnDataItemDelete,     id = self.popupDataID3)
+            self.Bind(wx.EVT_MENU, self.OnDataItemDeleteAll,  id = self.popupDataID4)
+            self.Bind(wx.EVT_MENU, self.OnDataSelectAll,      id = self.popupDataID5)
+            self.Bind(wx.EVT_MENU, self.OnDataSelectNone,     id = self.popupDataID6)
+            self.Bind(wx.EVT_MENU, self.OnDataDrawSelected,   id = self.popupDataID7)
+            self.Bind(wx.EVT_MENU, self.OnDataDrawSelectedZoom, id = self.popupDataID8)
+            self.Bind(wx.EVT_MENU, self.OnExtractSelected,    id = self.popupDataID9)
+            self.Bind(wx.EVT_MENU, self.OnDeleteSelected,     id = self.popupDataID11)
+            self.Bind(wx.EVT_MENU, self.OnDataReload,         id = self.popupDataID10)
+
+        tlist = self.FindWindowById(self.layerPage[self.layer]['data'])
         # generate popup-menu
         menu = wx.Menu()
         menu.Append(self.popupDataID1, _("Edit selected record"))
-        selected = list.GetFirstSelected()
-        if not self.editable or selected == -1 or list.GetNextSelected(selected) != -1:
+        selected = tlist.GetFirstSelected()
+        if not self.editable or selected == -1 or tlist.GetNextSelected(selected) != -1:
             menu.Enable(self.popupDataID1, False)
         menu.Append(self.popupDataID2, _("Insert new record"))
         menu.Append(self.popupDataID3, _("Delete selected record(s)"))
@@ -1127,14 +1141,14 @@ class AttributeManager(wx.Frame):
         menu.AppendSeparator()
         menu.Append(self.popupDataID7, _("Highlight selected features"))
         menu.Append(self.popupDataID8, _("Highlight selected features and zoom"))
-        if not self.map or len(list.GetSelectedItems()) == 0:
+        if not self.map or len(tlist.GetSelectedItems()) == 0:
             menu.Enable(self.popupDataID7, False)
             menu.Enable(self.popupDataID8, False)
         menu.Append(self.popupDataID9, _("Extract selected features"))
         menu.Append(self.popupDataID11, _("Delete selected features"))
         if not self.editable:
             menu.Enable(self.popupDataID11, False)
-        if list.GetFirstSelected() == -1:
+        if tlist.GetFirstSelected() == -1:
             menu.Enable(self.popupDataID3, False)
             menu.Enable(self.popupDataID9, False)
             menu.Enable(self.popupDataID11, False)
@@ -1146,66 +1160,66 @@ class AttributeManager(wx.Frame):
 
         # update statusbar
         self.log.write(_("Number of loaded records: %d") % \
-                           list.GetItemCount())
+                           tlist.GetItemCount())
 
     def OnDataItemDelete(self, event):
-        """!Delete selected item(s) from the list (layer/category pair)"""
-        list = self.FindWindowById(self.layerPage[self.layer]['data'])
-        item = list.GetFirstSelected()
-
+        """!Delete selected item(s) from the tlist (layer/category pair)"""
+        dlist = self.FindWindowById(self.layerPage[self.layer]['data'])
+        item = dlist.GetFirstSelected()
+        
         table    = self.mapDBInfo.layers[self.layer]["table"]
         key      = self.mapDBInfo.layers[self.layer]["key"]
-
+        
         indeces = []
         # collect SQL statements
         while item != -1:
-            index = list.itemIndexMap[item]
+            index = dlist.itemIndexMap[item]
             indeces.append(index)
-
-            cat = list.itemCatsMap[index]
+            
+            cat = dlist.itemCatsMap[index]
             
             self.listOfSQLStatements.append('DELETE FROM %s WHERE %s=%d' % \
                                                 (table, key, cat))
-
-            item = list.GetNextSelected(item)
-
-        if UserSettings.Get(group='atm', key='askOnDeleteRec', subkey='enabled'):
-            deleteDialog = wx.MessageBox(parent=self,
-                                         message=_("Selected data records (%d) will be permanently deleted "
+            
+            item = dlist.GetNextSelected(item)
+        
+        if UserSettings.Get(group = 'atm', key = 'askOnDeleteRec', subkey = 'enabled'):
+            deleteDialog = wx.MessageBox(parent = self,
+                                         message = _("Selected data records (%d) will be permanently deleted "
                                                    "from table. Do you want to delete them?") % \
                                              (len(self.listOfSQLStatements)),
-                                         caption=_("Delete records"),
-                                         style=wx.YES_NO | wx.CENTRE)
+                                         caption = _("Delete records"),
+                                         style = wx.YES_NO | wx.CENTRE)
             if deleteDialog != wx.YES:
                 self.listOfSQLStatements = []
                 return False
-
+        
         # restore maps
         i = 0
-        indexTemp = copy.copy(list.itemIndexMap)
-        list.itemIndexMap = []
-        dataTemp = copy.deepcopy(list.itemDataMap)
-        list.itemDataMap = {}
-        catsTemp = copy.deepcopy(list.itemCatsMap)
-        list.itemCatsMap = {}
-
+        indexTemp = copy.copy(dlist.itemIndexMap)
+        dlist.itemIndexMap = []
+        dataTemp = copy.deepcopy(dlist.itemDataMap)
+        dlist.itemDataMap = {}
+        catsTemp = copy.deepcopy(dlist.itemCatsMap)
+        dlist.itemCatsMap = {}
+        
         i = 0
         for index in indexTemp:
             if index in indeces:
                 continue
-            list.itemIndexMap.append(i)
-            list.itemDataMap[i] = dataTemp[index]
-            list.itemCatsMap[i] = catsTemp[index]
-
+            dlist.itemIndexMap.append(i)
+            dlist.itemDataMap[i] = dataTemp[index]
+            dlist.itemCatsMap[i] = catsTemp[index]
+            
             i += 1
             
-        list.SetItemCount(len(list.itemIndexMap))
-
+        dlist.SetItemCount(len(dlist.itemIndexMap))
+        
         # deselect items
-        item = list.GetFirstSelected()
+        item = dlist.GetFirstSelected()
         while item != -1:
-            list.SetItemState(item, 0, wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED)
-            item = list.GetNextSelected(item)
+            dlist.SetItemState(item, 0, wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED)
+            item = dlist.GetNextSelected(item)
         
         # submit SQL statements
         self.ApplyCommands()
@@ -1214,21 +1228,21 @@ class AttributeManager(wx.Frame):
 
     def OnDataItemDeleteAll(self, event):
         """!Delete all items from the list"""
-        list = self.FindWindowById(self.layerPage[self.layer]['data'])
-        if UserSettings.Get(group='atm', key='askOnDeleteRec', subkey='enabled'):
-            deleteDialog = wx.MessageBox(parent=self,
-                                         message=_("All data records (%d) will be permanently deleted "
+        dlist = self.FindWindowById(self.layerPage[self.layer]['data'])
+        if UserSettings.Get(group = 'atm', key = 'askOnDeleteRec', subkey = 'enabled'):
+            deleteDialog = wx.MessageBox(parent = self,
+                                         message = _("All data records (%d) will be permanently deleted "
                                                    "from table. Do you want to delete them?") % \
-                                             (len(list.itemIndexMap)),
-                                         caption=_("Delete records"),
-                                         style=wx.YES_NO | wx.CENTRE)
+                                             (len(dlist.itemIndexMap)),
+                                         caption = _("Delete records"),
+                                         style = wx.YES_NO | wx.CENTRE)
             if deleteDialog != wx.YES:
                 return
 
-        list.DeleteAllItems()
-        list.itemDataMap  = {}
-        list.itemIndexMap = []
-        list.SetItemCount(0)
+        dlist.DeleteAllItems()
+        dlist.itemDataMap  = {}
+        dlist.itemIndexMap = []
+        dlist.SetItemCount(0)
 
         table = self.mapDBInfo.layers[self.layer]["table"]
         self.listOfSQLStatements.append('DELETE FROM %s' % table)
@@ -1242,18 +1256,18 @@ class AttributeManager(wx.Frame):
         if not self.map or not self.mapdisplay:
             return
         
-        list = self.FindWindowById(self.layerPage[self.layer]['data'])
-        cats = map(int, list.GetSelectedItems())
+        tlist = self.FindWindowById(self.layerPage[self.layer]['data'])
+        cats = map(int, tlist.GetSelectedItems())
 
-        digitToolbar = self.mapdisplay.toolbars['vdigit']
+        digitToolbar = self.mapdisplay.GetToolbar('vdigit')
         if digitToolbar and digitToolbar.GetLayer() and \
                 digitToolbar.GetLayer().GetName() == self.vectorName:
-
-            self.mapdisplay.digit.driver.SetSelected(cats, field=self.layer)
+            display = self.mapdisplay.GetMapWindow().GetDisplay()
+            display.SetSelected(cats, layer = self.layer)
             if zoom:
-                n, s, w, e = self.mapdisplay.digit.driver.GetRegionSelected()
-                self.mapdisplay.Map.GetRegion(n=n, s=s, w=w, e=e,
-                                              update=True)
+                n, s, w, e = display.GetRegionSelected()
+                self.mapdisplay.Map.GetRegion(n = n, s = s, w = w, e = e,
+                                              update = True)
         else:
             # add map layer with higlighted vector features
             self.AddQueryMapLayer() # -> self.qlayer
@@ -1262,12 +1276,12 @@ class AttributeManager(wx.Frame):
             if self.parent and self.parent.GetName() == "LayerManager" and \
                     self.treeItem:
                 maptree = self.parent.curr_page.maptree
-                opacity = maptree.GetPyData(self.treeItem)[0]['maplayer'].GetOpacity(float=True)
+                opacity = maptree.GetPyData(self.treeItem)[0]['maplayer'].GetOpacity(float = True)
                 self.qlayer.SetOpacity(opacity)
             if zoom:
                 keyColumn = self.mapDBInfo.layers[self.layer]['key']
                 where = ''
-                for range in utils.ListOfCatsToRange(cats).split(','):
+                for range in ListOfCatsToRange(cats).split(','):
                     if '-' in range:
                         min, max = range.split('-')
                         where += '%s >= %d and %s <= %d or ' % \
@@ -1277,43 +1291,52 @@ class AttributeManager(wx.Frame):
                         where += '%s = %d or ' % (keyColumn, int(range))
                 where = where.rstrip('or ')
                 
-                select = gcmd.RunCommand('v.db.select',
-                                         parent = self,
-                                         read = True,
-                                         quiet = True,
-                                         flags = 'r',
-                                         map = self.mapDBInfo.map,
-                                         layer = int(self.layer),
-                                         where = where)
+                select = RunCommand('v.db.select',
+                                    parent = self,
+                                    read = True,
+                                    quiet = True,
+                                    flags = 'r',
+                                    map = self.mapDBInfo.map,
+                                    layer = int(self.layer),
+                                    where = where)
                 
                 region = {}
                 for line in select.splitlines():
                     key, value = line.split('=')
                     region[key.strip()] = float(value.strip())
-                
-                self.mapdisplay.Map.GetRegion(n=region['n'], s=region['s'],
-                                              w=region['w'], e=region['e'],
-                                              update=True)
+
+                nsdist = ewdist = 0
+                renderer = self.mapdisplay.GetMap()
+                nsdist = 10 * ((renderer.GetCurrentRegion()['n'] - renderer.GetCurrentRegion()['s']) /
+                        renderer.height)
+                ewdist = 10 * ((renderer.GetCurrentRegion()['e'] - renderer.GetCurrentRegion()['w']) /
+                        renderer.width)
+                north = region['n'] + nsdist
+                south = region['s'] - nsdist
+                west = region['w'] - ewdist
+                east = region['e'] + ewdist
+                renderer.GetRegion(n = north, s = south, w = west, e = east, update = True)
+                self.mapdisplay.GetMapWindow().ZoomHistory(n = north, s = south, w = west, e = east)
         
         if zoom:
-            self.mapdisplay.Map.AdjustRegion() # adjust resolution
+            self.mapdisplay.Map.AdjustRegion()           # adjust resolution
             self.mapdisplay.Map.AlignExtentFromDisplay() # adjust extent
-            self.mapdisplay.MapWindow.UpdateMap(render=True, renderVector=True)
+            self.mapdisplay.MapWindow.UpdateMap(render = True,  renderVector = True)
         else:
-            self.mapdisplay.MapWindow.UpdateMap(render=False, renderVector=True)
+            self.mapdisplay.MapWindow.UpdateMap(render = False, renderVector = True)
         
     def OnDataDrawSelected(self, event):
         """!Reload table description"""
-        self._drawSelected(zoom=False)
+        self._drawSelected(zoom = False)
         event.Skip()
 
     def OnDataDrawSelectedZoom(self, event):
-        self._drawSelected(zoom=True)
+        self._drawSelected(zoom = True)
         event.Skip()
         
     def OnDataItemAdd(self, event):
         """!Add new record to the attribute table"""
-        list      = self.FindWindowById(self.layerPage[self.layer]['data'])
+        tlist      = self.FindWindowById(self.layerPage[self.layer]['data'])
         table     = self.mapDBInfo.layers[self.layer]['table']
         keyColumn = self.mapDBInfo.layers[self.layer]['key']
         
@@ -1322,12 +1345,12 @@ class AttributeManager(wx.Frame):
 
         # collect names of all visible columns
         columnName = []
-        for i in range(list.GetColumnCount()): 
-            columnName.append(list.GetColumn(i).GetText())
+        for i in range(tlist.GetColumnCount()): 
+            columnName.append(tlist.GetColumn(i).GetText())
 
         # maximal category number
-        if len(list.itemCatsMap.values()) > 0:
-            maxCat = max(list.itemCatsMap.values())
+        if len(tlist.itemCatsMap.values()) > 0:
+            maxCat = max(tlist.itemCatsMap.values())
         else:
             maxCat = 0 # starting category '1'
         
@@ -1343,12 +1366,15 @@ class AttributeManager(wx.Frame):
         colIdx = 0
         keyId = -1
         for col in columnName:
+            ctype = self.mapDBInfo.tables[table][col]['ctype']
+            ctypeStr = self.mapDBInfo.tables[table][col]['type']
             if col == keyColumn: # key 
                 if missingKey is False: 
-                    data.append((col, str(maxCat + 1)))
+                    data.append((col, ctype, ctypeStr, str(maxCat + 1)))
                     keyId = colIdx
             else:
-                data.append((col, ''))
+                data.append((col, ctype, ctypeStr, ''))
+            
             colIdx += 1
                 
         dlg = ModifyTableRecord(parent = self,
@@ -1357,12 +1383,12 @@ class AttributeManager(wx.Frame):
 
         if dlg.ShowModal() == wx.ID_OK:
             try: # get category number
-                cat = int(dlg.GetValues(columns=[keyColumn])[0])
+                cat = int(dlg.GetValues(columns = [keyColumn])[0])
             except:
                 cat = -1
 
             try:
-                if cat in list.itemCatsMap.values():
+                if cat in tlist.itemCatsMap.values():
                     raise ValueError(_("Record with category number %d "
                                        "already exists in the table.") % cat)
 
@@ -1379,44 +1405,44 @@ class AttributeManager(wx.Frame):
                             continue
 
                     try:
-                        if list.columns[columnName[i]]['ctype'] == int:
+                        if tlist.columns[columnName[i]]['ctype'] == int:
                             # values[i] is stored as text. 
                             value = float(values[i])
                         else:
                             value = values[i]
-                        values[i] = list.columns[columnName[i]]['ctype'] (value)
+                        values[i] = tlist.columns[columnName[i]]['ctype'] (value)
 
                     except:
                         raise ValueError(_("Value '%(value)s' needs to be entered as %(type)s.") % 
                                          {'value' : str(values[i]),
-                                          'type' : list.columns[columnName[i]]['type']})
+                                          'type' : tlist.columns[columnName[i]]['type']})
                     columnsString += '%s,' % columnName[i]
-                    if list.columns[columnName[i]]['ctype'] == str:
+                    if tlist.columns[columnName[i]]['ctype'] == str:
                         valuesString += "'%s'," % values[i]
                     else:
                         valuesString += "%s," % values[i]
 
             except ValueError, err:
-                wx.MessageBox(parent=self,
-                              message="%s%s%s" % (_("Unable to insert new record."),
-                                                    os.linesep, err),
-                              caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+                GError(parent = self,
+                       message = _("Unable to insert new record.\n%s") % err,
+                       showTraceback = False)
+                self.OnDataItemAdd(event)
                 return
-
+            
             # remove category if need 
             if missingKey is True:
                 del values[0]
                 
-            # add new item to the list
-            if len(list.itemIndexMap) > 0:
-                index = max(list.itemIndexMap) + 1
+            # add new item to the tlist
+            if len(tlist.itemIndexMap) > 0:
+                index = max(tlist.itemIndexMap) + 1
             else:
                 index = 0
             
-            list.itemIndexMap.append(index)
-            list.itemDataMap[index] = values
-            list.itemCatsMap[index] = cat
-            list.SetItemCount(list.GetItemCount() + 1)
+            tlist.itemIndexMap.append(index)
+            tlist.itemDataMap[index] = values
+            tlist.itemCatsMap[index] = cat
+            tlist.SetItemCount(tlist.GetItemCount() + 1)
 
             self.listOfSQLStatements.append('INSERT INTO %s (%s) VALUES(%s)' % \
                                                 (table,
@@ -1426,22 +1452,22 @@ class AttributeManager(wx.Frame):
             
     def OnDataItemEdit(self, event):
         """!Edit selected record of the attribute table"""
-        list      = self.FindWindowById(self.layerPage[self.layer]['data'])
-        item      = list.GetFirstSelected()
+        tlist      = self.FindWindowById(self.layerPage[self.layer]['data'])
+        item      = tlist.GetFirstSelected()
         if item == -1:
             return
 
         table     = self.mapDBInfo.layers[self.layer]['table']
         keyColumn = self.mapDBInfo.layers[self.layer]['key']
-        cat       = list.itemCatsMap[list.itemIndexMap[item]]
+        cat       = tlist.itemCatsMap[tlist.itemIndexMap[item]]
 
         # (column name, value)
         data = []
 
         # collect names of all visible columns
         columnName = []
-        for i in range(list.GetColumnCount()): 
-            columnName.append(list.GetColumn(i).GetText())
+        for i in range(tlist.GetColumnCount()): 
+            columnName.append(tlist.GetColumn(i).GetText())
 
 
         # key column must be always presented
@@ -1455,16 +1481,18 @@ class AttributeManager(wx.Frame):
             
         # add other visible columns
         for i in range(len(columnName)):
+            ctype = self.mapDBInfo.tables[table][columnName[i]]['ctype']
+            ctypeStr = self.mapDBInfo.tables[table][columnName[i]]['type']
             if columnName[i] == keyColumn: # key 
                 if missingKey is False: 
-                    data.append((columnName[i], str(cat)))
+                    data.append((columnName[i], ctype, ctypeStr, str(cat)))
                     keyId = i
             else:
                 if missingKey is True:
-                    value = list.GetItem(item, i-1).GetText()
+                    value = tlist.GetItem(item, i-1).GetText()
                 else:
-                    value = list.GetItem(item, i).GetText()
-                data.append((columnName[i], value))
+                    value = tlist.GetItem(item, i).GetText()
+                data.append((columnName[i], ctype, ctypeStr, value))
 
         dlg = ModifyTableRecord(parent = self, 
                                 title = _("Update existing record"),
@@ -1477,28 +1505,28 @@ class AttributeManager(wx.Frame):
                 for i in range(len(values)): 
                     if i == keyId: # skip key column
                         continue
-                    if list.GetItem(item, i).GetText() != values[i]:
+                    if tlist.GetItem(item, i).GetText() != values[i]:
                         if len(values[i]) > 0:
                             try:
                                 if missingKey is True:
                                     idx = i - 1
                                 else:
                                     idx = i
-                                if list.columns[columnName[i]]['ctype'] != type(''):
-                                    if list.columns[columnName[i]]['ctype'] == int:
+                                if tlist.columns[columnName[i]]['ctype'] != types.StringType:
+                                    if tlist.columns[columnName[i]]['ctype'] == int:
                                         value = float(values[i])
                                     else:
                                         value = values[i]
-                                    list.itemDataMap[item][idx] = \
-                                        list.columns[columnName[i]]['ctype'] (value)
+                                    tlist.itemDataMap[item][idx] = \
+                                        tlist.columns[columnName[i]]['ctype'] (value)
                                 else:
-                                    list.itemDataMap[item][idx] = values[i]
+                                    tlist.itemDataMap[item][idx] = values[i]
                             except:
                                 raise ValueError(_("Value '%(value)s' needs to be entered as %(type)s.") % \
                                                      {'value' : str(values[i]),
-                                                      'type' : list.columns[columnName[i]]['type']})
+                                                      'type' : tlist.columns[columnName[i]]['type']})
 
-                            if list.columns[columnName[i]]['ctype'] == str:
+                            if tlist.columns[columnName[i]]['ctype'] == str:
                                 updateString += "%s='%s'," % (columnName[i], values[i])
                             else:
                                 updateString += "%s=%s," % (columnName[i], values[i])
@@ -1506,10 +1534,10 @@ class AttributeManager(wx.Frame):
                             updateString += "%s=NULL," % (columnName[i])
                             
             except ValueError, err:
-                wx.MessageBox(parent=self,
-                              message="%s%s%s" % (_("Unable to update existing record."),
-                                                  os.linesep, err),
-                              caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+                GError(parent = self,
+                       message = _("Unable to update existing record.\n%s") % err,
+                       showTraceback = False)
+                self.OnDataItemEdit(event)
                 return
             
             if len(updateString) > 0:
@@ -1518,36 +1546,36 @@ class AttributeManager(wx.Frame):
                                                      keyColumn, cat))
                 self.ApplyCommands()
 
-            list.Update(self.mapDBInfo)
+            tlist.Update(self.mapDBInfo)
                         
     def OnDataReload(self, event):
-        """!Reload list of records"""
+        """!Reload tlist of records"""
         self.OnApplySqlStatement(None)
         self.listOfSQLStatements = []
 
     def OnDataSelectAll(self, event):
         """!Select all items"""
-        list = self.FindWindowById(self.layerPage[self.layer]['data'])
+        tlist = self.FindWindowById(self.layerPage[self.layer]['data'])
         item = -1
 
         while True:
-            item = list.GetNextItem(item)
+            item = tlist.GetNextItem(item)
             if item == -1:
                 break
-            list.SetItemState(item, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)
+            tlist.SetItemState(item, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)
 
         event.Skip()
 
     def OnDataSelectNone(self, event):
         """!Deselect items"""
-        list = self.FindWindowById(self.layerPage[self.layer]['data'])
+        tlist = self.FindWindowById(self.layerPage[self.layer]['data'])
         item = -1
 
         while True:
-            item = list.GetNextItem(item, wx.LIST_STATE_SELECTED)
+            item = tlist.GetNextItem(item, wx.LIST_STATE_SELECTED)
             if item == -1:
                 break
-            list.SetItemState(item, 0, wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED)
+            tlist.SetItemState(item, 0, wx.LIST_STATE_SELECTED | wx.LIST_STATE_FOCUSED)
 
         event.Skip()
 
@@ -1585,32 +1613,30 @@ class AttributeManager(wx.Frame):
 
     def OnTableItemChange(self, event):
         """!Rename column in the table"""
-        list   = self.FindWindowById(self.layerPage[self.layer]['tableData'])
+        tlist   = self.FindWindowById(self.layerPage[self.layer]['tableData'])
         name   = self.FindWindowById(self.layerPage[self.layer]['renameCol']).GetValue()
         nameTo = self.FindWindowById(self.layerPage[self.layer]['renameColTo']).GetValue()
 
         table = self.mapDBInfo.layers[self.layer]["table"]
 
         if not name or not nameTo:
-            wx.MessageBox(self=self,
-                          message=_("Unable to rename column. "
-                                    "No column name defined."),
-                          caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+            GError(parent = self,
+                   message = _("Unable to rename column. "
+                               "No column name defined."))
             return
         else:
-            item = list.FindItem(start=-1, str=name)
+            item = tlist.FindItem(start = -1, str = name)
             if item > -1:
-                if list.FindItem(start=-1, str=nameTo) > -1:
-                    wx.MessageBox(parent=self,
-                                  message=_("Unable to rename column <%(column)s> to "
-                                            "<%(columnTo)s>. Column already exists "
-                                            "in the table <%(table)s>.") % \
-                                      {'column' : name, 'columnTo' : nameTo,
-                                       'table' : table},
-                                  caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+                if tlist.FindItem(start = -1, str = nameTo) > -1:
+                    GError(parent = self,
+                           message = _("Unable to rename column <%(column)s> to "
+                                       "<%(columnTo)s>. Column already exists "
+                                       "in the table <%(table)s>.") % \
+                               {'column' : name, 'columnTo' : nameTo,
+                                'table' : table})
                     return
                 else:
-                    list.SetItemText(item, nameTo)
+                    tlist.SetItemText(item, nameTo)
 
                     self.listOfCommands.append(('v.db.renamecol',
                                                 { 'map'    : self.vectorName,
@@ -1618,11 +1644,10 @@ class AttributeManager(wx.Frame):
                                                   'column' : '%s,%s' % (name, nameTo) }
                                                 ))
             else:
-                wx.MessageBox(parent=self,
-                              message=_("Unable to rename column. "
-                                        "Column <%(column)s> doesn't exist in the table <%(table)s>.") % 
-                              {'column' : name, 'table' : table},
-                              caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+                GError(parent = self,
+                       message = _("Unable to rename column. "
+                                   "Column <%(column)s> doesn't exist in the table <%(table)s>.") % 
+                       {'column' : name, 'table' : table})
                 return
             
         # apply changes
@@ -1641,9 +1666,9 @@ class AttributeManager(wx.Frame):
             self.popupTableID1 = wx.NewId()
             self.popupTableID2 = wx.NewId()
             self.popupTableID3 = wx.NewId()
-            self.Bind(wx.EVT_MENU, self.OnTableItemDelete,    id=self.popupTableID1)
-            self.Bind(wx.EVT_MENU, self.OnTableItemDeleteAll, id=self.popupTableID2)
-            self.Bind(wx.EVT_MENU, self.OnTableReload,        id=self.popupTableID3)
+            self.Bind(wx.EVT_MENU, self.OnTableItemDelete,    id = self.popupTableID1)
+            self.Bind(wx.EVT_MENU, self.OnTableItemDeleteAll, id = self.popupTableID2)
+            self.Bind(wx.EVT_MENU, self.OnTableReload,        id = self.popupTableID3)
 
         # generate popup-menu
         menu = wx.Menu()
@@ -1659,17 +1684,17 @@ class AttributeManager(wx.Frame):
 
     def OnTableItemDelete(self, event):
         """!Delete selected item(s) from the list"""
-        list = self.FindWindowById(self.layerPage[self.layer]['tableData'])
+        tlist = self.FindWindowById(self.layerPage[self.layer]['tableData'])
         
-        item = list.GetFirstSelected()
+        item = tlist.GetFirstSelected()
         
-        if UserSettings.Get(group='atm', key='askOnDeleteRec', subkey='enabled'):
-            deleteDialog = wx.MessageBox(parent=self,
-                                         message=_("Selected column '%s' will PERMANENTLY removed "
+        if UserSettings.Get(group = 'atm', key = 'askOnDeleteRec', subkey = 'enabled'):
+            deleteDialog = wx.MessageBox(parent = self,
+                                         message = _("Selected column '%s' will PERMANENTLY removed "
                                                    "from table. Do you want to drop the column?") % \
-                                             (list.GetItemText(item)),
-                                         caption=_("Drop column(s)"),
-                                         style=wx.YES_NO | wx.CENTRE)
+                                             (tlist.GetItemText(item)),
+                                         caption = _("Drop column(s)"),
+                                         style = wx.YES_NO | wx.CENTRE)
             if deleteDialog != wx.YES:
                 return False
         
@@ -1677,10 +1702,10 @@ class AttributeManager(wx.Frame):
             self.listOfCommands.append(('v.db.dropcol',
                                         { 'map' : self.vectorName,
                                           'layer' : self.layer,
-                                          'column' : list.GetItemText(item) }
+                                          'column' : tlist.GetItemText(item) }
                                         ))
-            list.DeleteItem(item)
-            item = list.GetFirstSelected()
+            tlist.DeleteItem(item)
+            item = tlist.GetFirstSelected()
         
         # apply changes
         self.ApplyCommands()
@@ -1700,13 +1725,13 @@ class AttributeManager(wx.Frame):
         if keyColumn in cols:
             cols.remove(keyColumn)
         
-        if UserSettings.Get(group='atm', key='askOnDeleteRec', subkey='enabled'):
-            deleteDialog = wx.MessageBox(parent=self,
-                                         message=_("Selected columns\n%s\nwill PERMANENTLY removed "
+        if UserSettings.Get(group = 'atm', key = 'askOnDeleteRec', subkey = 'enabled'):
+            deleteDialog = wx.MessageBox(parent = self,
+                                         message = _("Selected columns\n%s\nwill PERMANENTLY removed "
                                                    "from table. Do you want to drop the columns?") % \
                                              ('\n'.join(cols)),
-                                         caption=_("Drop column(s)"),
-                                         style=wx.YES_NO | wx.CENTRE)
+                                         caption = _("Drop column(s)"),
+                                         style = wx.YES_NO | wx.CENTRE)
             if deleteDialog != wx.YES:
                 return False
         
@@ -1728,9 +1753,9 @@ class AttributeManager(wx.Frame):
 
         event.Skip()
 
-    def OnTableReload(self, event=None):
+    def OnTableReload(self, event = None):
         """!Reload table description"""
-        self.FindWindowById(self.layerPage[self.layer]['tableData']).Populate(update=True)
+        self.FindWindowById(self.layerPage[self.layer]['tableData']).Populate(update = True)
         self.listOfCommands = []
 
     def OnTableItemAdd(self, event):
@@ -1739,9 +1764,9 @@ class AttributeManager(wx.Frame):
         name = self.FindWindowById(self.layerPage[self.layer]['addColName']).GetValue()
         
         if not name:
-            gcmd.GError(parent = self,
-                        message = _("Unable to add column to the table. "
-                                    "No column name defined."))
+            GError(parent = self,
+                   message = _("Unable to add column to the table. "
+                               "No column name defined."))
             return
         
         ctype = self.FindWindowById(self.layerPage[self.layer]['addColType']). \
@@ -1759,11 +1784,10 @@ class AttributeManager(wx.Frame):
         # add item to the list of table columns
         tlist = self.FindWindowById(self.layerPage[self.layer]['tableData'])
         # check for duplicate items
-        if tlist.FindItem(start=-1, str=name) > -1:
-            gcmd.GError(parent = self,
-                        message = _("Column <%(column)s> already exists in table <%(table)s>.") % \
-                            {'column' : name, 'table' : self.mapDBInfo.layers[self.layer]["table"]}
-                        )
+        if tlist.FindItem(start = -1, str = name) > -1:
+            GError(parent = self,
+                   message = _("Column <%(column)s> already exists in table <%(table)s>.") % \
+                       {'column' : name, 'table' : self.mapDBInfo.layers[self.layer]["table"]})
             return
         index = tlist.InsertStringItem(sys.maxint, str(name))
         tlist.SetStringItem(index, 0, str(name))
@@ -1855,40 +1879,41 @@ class AttributeManager(wx.Frame):
         
         if len(self.listOfCommands) > 0:
             for cmd in self.listOfCommands:
-                gcmd.RunCommand(prog = cmd[0],
-                                quiet = True,
-                                parent = self,
-                                **cmd[1])
+                RunCommand(prog = cmd[0],
+                           quiet = True,
+                           parent = self,
+                           **cmd[1])
             
-            self.mapDBInfo = dbm_base.VectorDBInfo(self.vectorName)
+            self.mapDBInfo = VectorDBInfo(self.vectorName)
             table = self.mapDBInfo.layers[self.layer]['table']
 
             # update table description
-            list = self.FindWindowById(self.layerPage[self.layer]['tableData'])
-            list.Update(table=self.mapDBInfo.tables[table],
-                        columns=self.mapDBInfo.GetColumns(table))
+            tlist = self.FindWindowById(self.layerPage[self.layer]['tableData'])
+            tlist.Update(table = self.mapDBInfo.tables[table],
+                        columns = self.mapDBInfo.GetColumns(table))
             self.OnTableReload(None)
 
-            # update data list
-            list = self.FindWindowById(self.layerPage[self.layer]['data'])
-            list.Update(self.mapDBInfo)
+            # update data tlist
+            tlist = self.FindWindowById(self.layerPage[self.layer]['data'])
+            tlist.Update(self.mapDBInfo)
 
             # reset list of commands
             self.listOfCommands = []
         
         # perform SQL non-select statements (e.g. 'delete from table where cat=1')
         if len(self.listOfSQLStatements) > 0:
-            sqlFile = tempfile.NamedTemporaryFile(mode="wt")
+            fd, sqlFilePath = tempfile.mkstemp(text=True)
+            sqlFile = open(sqlFilePath, 'w')
             for sql in self.listOfSQLStatements:
-                enc = UserSettings.Get(group='atm', key='encoding', subkey='value')
+                enc = UserSettings.Get(group = 'atm', key = 'encoding', subkey = 'value')
                 if not enc and 'GRASS_DB_ENCODING' in os.environ:
                     enc = os.environ['GRASS_DB_ENCODING']
                 if enc:
-                    sqlFile.file.write(sql.encode(enc) + ';')
+                    sqlFile.write(sql.encode(enc) + ';')
                 else:
-                    sqlFile.file.write(sql + ';')
-                sqlFile.file.write(os.linesep)
-                sqlFile.file.flush()
+                    sqlFile.write(sql + ';')
+                sqlFile.write(os.linesep)
+                sqlFile.close()
 
             driver   = self.mapDBInfo.layers[self.layer]["driver"]
             database = self.mapDBInfo.layers[self.layer]["database"]
@@ -1896,12 +1921,14 @@ class AttributeManager(wx.Frame):
             Debug.msg(3, 'AttributeManger.ApplyCommands(): %s' %
                       ';'.join(["%s" % s for s in self.listOfSQLStatements]))
             
-            gcmd.RunCommand('db.execute',
-                            parent = self,
-                            input = sqlFile.name,
-                            driver = driver,
-                            database = database)
+            RunCommand('db.execute',
+                       parent = self,
+                       input = sqlFilePath,
+                       driver = driver,
+                       database = database)
             
+            os.close(fd)
+            os.remove(sqlFilePath)
             # reset list of statements
             self.listOfSQLStatements = []
             
@@ -1912,21 +1939,24 @@ class AttributeManager(wx.Frame):
         keyColumn = -1 # index of key column
         listWin = self.FindWindowById(self.layerPage[self.layer]['data'])
         sql = None
+        win = self.FindWindowById(self.layerPage[self.layer]['simple'])
+        if not win:
+            return
         
         wx.BeginBusyCursor()
-        
-        if self.FindWindowById(self.layerPage[self.layer]['simple']).GetValue():
+        if win.GetValue():
             # simple sql statement
             whereCol = self.FindWindowById(self.layerPage[self.layer]['whereColumn']).GetStringSelection()
+            whereOpe = self.FindWindowById(self.layerPage[self.layer]['whereOperator']).GetStringSelection()
             whereVal = self.FindWindowById(self.layerPage[self.layer]['where']).GetValue().strip()
             try:
                 if len(whereVal) > 0:
-                    keyColumn = listWin.LoadData(self.layer, where=whereCol + whereVal)
+                    keyColumn = listWin.LoadData(self.layer, where = whereCol + whereOpe + whereVal)
                 else:
                     keyColumn = listWin.LoadData(self.layer)
-            except gcmd.GException, e:
-                gcmd.GError(parent = self,
-                            message = _("Loading attribute data failed.\n\n%s") % e.value)
+            except GException, e:
+                GError(parent = self,
+                       message = _("Loading attribute data failed.\n\n%s") % e.value)
                 self.FindWindowById(self.layerPage[self.layer]['where']).SetValue('')
         else:
             # advanced sql statement
@@ -1936,21 +1966,20 @@ class AttributeManager(wx.Frame):
                 if cols is None and where is None:
                     sql = win.GetValue()
             except TypeError:
-                wx.MessageBox(parent=self,
-                              message=_("Loading attribute data failed.\n"
-                                        "Invalid SQL select statement.\n\n%s") % win.GetValue(),
-                              caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+                GError(parent = self,
+                       message = _("Loading attribute data failed.\n"
+                                   "Invalid SQL select statement.\n\n%s") % win.GetValue())
                 win.SetValue("SELECT * FROM %s" % self.mapDBInfo.layers[self.layer]['table'])
                 cols = None
                 where = None
             
             if cols or where or sql:
                 try:
-                    keyColumn = listWin.LoadData(self.layer, columns=cols,
-                                                 where=where, sql=sql)
-                except gcmd.GException, e:
-                    gcmd.GError(parent = self,
-                                message = _("Loading attribute data failed.\n\n%s") % e.value)
+                    keyColumn = listWin.LoadData(self.layer, columns = cols,
+                                                 where = where, sql = sql)
+                except GException, e:
+                    GError(parent = self,
+                           message = _("Loading attribute data failed.\n\n%s") % e.value)
                     win.SetValue("SELECT * FROM %s" % self.mapDBInfo.layers[self.layer]['table'])
         
         # sort by key column
@@ -1958,9 +1987,9 @@ class AttributeManager(wx.Frame):
             pass # don't order by key column
         else:
             if keyColumn > -1:
-                listWin.SortListItems(col=keyColumn, ascending=True)
+                listWin.SortListItems(col = keyColumn, ascending = True)
             else:
-                listWin.SortListItems(col=0, ascending=True) 
+                listWin.SortListItems(col = 0, ascending = True) 
         
         wx.EndBusyCursor()
         
@@ -2009,20 +2038,22 @@ class AttributeManager(wx.Frame):
     
     def OnCloseWindow(self, event):
         """!Cancel button pressed"""
-        self.Close()
         if self.parent and self.parent.GetName() == 'LayerManager':
             # deregister ATM
             self.parent.dialogs['atm'].remove(self)
+                    
+        if not isinstance(event, wx.CloseEvent):
+            self.Destroy()
         
         event.Skip()
 
     def OnBuilder(self,event):
         """!SQL Builder button pressed -> show the SQLBuilder dialog"""
         if not self.builder:
-            self.builder = sqlbuilder.SQLFrame(parent = self, id = wx.ID_ANY,
-                                               title = _("SQL Builder"),
-                                               vectmap = self.vectorName,
-                                               evtheader = self.OnBuilderEvt)
+            self.builder = SQLFrame(parent = self, id = wx.ID_ANY,
+                                    title = _("SQL Builder"),
+                                    vectmap = self.vectorName,
+                                    evtHandler = self.OnBuilderEvt)
             self.builder.Show()
         else:
             self.builder.Raise()
@@ -2031,6 +2062,10 @@ class AttributeManager(wx.Frame):
         if event == 'apply':
             sqlstr = self.builder.GetSQLStatement()
             self.FindWindowById(self.layerPage[self.layer]['statement']).SetValue(sqlstr)
+            # apply query
+            self.listOfSQLStatements.append(sqlstr)
+            self.OnApplySqlStatement(None)
+            # close builder on apply
             if self.builder.CloseOnApply():
                 self.builder = None
         elif event == 'close':
@@ -2049,23 +2084,22 @@ class AttributeManager(wx.Frame):
         """!Extract vector objects selected in attribute browse window
         to new vector map
         """
-        list = self.FindWindowById(self.layerPage[self.layer]['data'])
-        # cats = list.selectedCats[:]
-        cats = list.GetSelectedItems()
+        tlist = self.FindWindowById(self.layerPage[self.layer]['data'])
+        # cats = tlist.selectedCats[:]
+        cats = tlist.GetSelectedItems()
         if len(cats) == 0:
-            wx.MessageBox(parent=self,
-                          message=_('Nothing to extract.'),
-                          caption=_('Message'), style=wx.CENTRE)
+            GMessage(parent = self,
+                     message = _('Nothing to extract.'))
             return
         else:
             # dialog to get file name
-            dlg = gdialogs.CreateNewVector(parent = self, title = _('Extract selected features'),
-                                           log = self.cmdLog,
-                                           cmd = (('v.extract',
-                                                   { 'input' : self.vectorName,
-                                                     'list' : utils.ListOfCatsToRange(cats) },
-                                                   'output')),
-                                           disableTable = True)
+            dlg = CreateNewVector(parent = self, title = _('Extract selected features'),
+                                  log = self.cmdLog,
+                                  cmd = (('v.extract',
+                                          { 'input' : self.vectorName,
+                                            'list' : ListOfCatsToRange(cats) },
+                                          'output')),
+                                  disableTable = True)
             if not dlg:
                 return
             
@@ -2078,48 +2112,52 @@ class AttributeManager(wx.Frame):
             dlg.Destroy()
             
     def OnDeleteSelected(self, event):
-        """
-        Delete vector objects selected in attribute browse window
+        """!Delete vector objects selected in attribute browse window
         (attribures and geometry)
         """
-        list = self.FindWindowById(self.layerPage[self.layer]['data'])
-        cats = list.GetSelectedItems()
+        tlist = self.FindWindowById(self.layerPage[self.layer]['data'])
+        cats = tlist.GetSelectedItems()
         if len(cats) == 0:
-            wx.MessageBox(parent=self,
-                          message=_('Nothing to delete.'),
-                          caption=_('Message'), style=wx.CENTRE)
+            GMessage(parent = self,
+                     message = _('Nothing to delete.'))
         
-        if self.OnDataItemDelete(None):
+        display = None
+        if 'vdigit' in self.mapdisplay.toolbars:
             digitToolbar = self.mapdisplay.toolbars['vdigit']
             if digitToolbar and digitToolbar.GetLayer() and \
                     digitToolbar.GetLayer().GetName() == self.vectorName:
-                self.mapdisplay.digit.driver.SetSelected(map(int, cats), field=self.layer)
-                self.mapdisplay.digit.DeleteSelectedLines()
+                display = self.mapdisplay.GetMapWindow().GetDisplay()
+                display.SetSelected(map(int, cats), layer = self.layer)
+                self.mapdisplay.MapWindow.UpdateMap(render = True, renderVector = True)
+        
+        if self.OnDataItemDelete(None):
+            if display:
+                self.mapdisplay.GetMapWindow().digit.DeleteSelectedLines()
             else:
-                gcmd.RunCommand('v.edit',
-                                parent = self,
-                                quiet = True,
-                                map = self.vectorName,
-                                tool = 'delete',
-                                cats = utils.ListOfCatsToRange(cats))
-                
-            self.mapdisplay.MapWindow.UpdateMap(render=True, renderVector=True)
+                RunCommand('v.edit',
+                           parent = self,
+                           quiet = True,
+                           map = self.vectorName,
+                           tool = 'delete',
+                           cats = ListOfCatsToRange(cats))
+            
+            self.mapdisplay.MapWindow.UpdateMap(render = True, renderVector = True)
         
     def AddQueryMapLayer(self):
         """!Redraw a map
 
         Return True if map has been redrawn, False if no map is given
         """
-        list = self.FindWindowById(self.layerPage[self.layer]['data'])
+        tlist = self.FindWindowById(self.layerPage[self.layer]['data'])
         cats = { 
-            self.layer : list.GetSelectedItems()
+            self.layer : tlist.GetSelectedItems()
             }
         
         if self.mapdisplay.Map.GetLayerIndex(self.qlayer) < 0:
             self.qlayer = None
             
         if self.qlayer:
-            self.qlayer.SetCmd(self.mapdisplay.AddTmpVectorMapLayer(self.vectorName, cats, addLayer=False))
+            self.qlayer.SetCmd(self.mapdisplay.AddTmpVectorMapLayer(self.vectorName, cats, addLayer = False))
         else:
             self.qlayer = self.mapdisplay.AddTmpVectorMapLayer(self.vectorName, cats)
 
@@ -2127,9 +2165,7 @@ class AttributeManager(wx.Frame):
     
     def UpdateDialog(self, layer):
         """!Updates dialog layout for given layer"""
-        #
         # delete page
-        #
         if layer in self.mapDBInfo.layers.keys():
             # delete page
             # draging pages disallowed
@@ -2139,28 +2175,28 @@ class AttributeManager(wx.Frame):
             self.browsePage.DeletePage(self.mapDBInfo.layers.keys().index(layer))
             self.manageTablePage.DeletePage(self.mapDBInfo.layers.keys().index(layer))
             # set current page selection
-            self.notebook.SetSelection(2)
+            self.notebook.SetSelectionByName('layers')
             
         # fetch fresh db info
-        self.mapDBInfo = dbm_base.VectorDBInfo(self.vectorName)    
+        self.mapDBInfo = VectorDBInfo(self.vectorName)    
 
         #
         # add new page
         #
         if layer in self.mapDBInfo.layers.keys():
             # 'browse data' page
-            self.__createBrowsePage(layer)
+            self._createBrowsePage(layer)
             # 'manage tables' page
-            self.__createManageTablePage(layer)
+            self._createManageTablePage(layer)
             # set current page selection
-            self.notebook.SetSelection(2)
+            self.notebook.SetSelectionByName('layers')
             
         #
         # 'manage layers' page
         #
         # update list of layers
         self.layerList.Update(self.mapDBInfo.layers)
-        self.layerList.Populate(update=True)
+        self.layerList.Populate(update = True)
         # update selected widgets
         listOfLayers = map(str, self.mapDBInfo.layers.keys())
         ### delete layer page
@@ -2180,13 +2216,13 @@ class AttributeManager(wx.Frame):
             maxLayer+1)
         ### modify layer
         self.manageLayerBook.modifyLayerWidgets['layer'][1].SetItems(listOfLayers)
-        self.manageLayerBook.OnChangeLayer(event=None)
+        self.manageLayerBook.OnChangeLayer(event = None)
 
     def GetVectorName(self):
         """!Get vector name"""
         return self.vectorName
     
-    def LoadData(self, layer, columns=None, where=None, sql=None):
+    def LoadData(self, layer, columns = None, where = None, sql = None):
         """!Load data into list
 
         @param layer layer number
@@ -2205,14 +2241,14 @@ class TableListCtrl(wx.ListCtrl,
                     #                    listmix.TextEditMixin):
     """!Table description list"""
 
-    def __init__(self, parent, id, table, columns, pos=wx.DefaultPosition,
-                 size=wx.DefaultSize):
+    def __init__(self, parent, id, table, columns, pos = wx.DefaultPosition,
+                 size = wx.DefaultSize):
 
         self.parent  = parent
         self.table   = table
         self.columns = columns
         wx.ListCtrl.__init__(self, parent, id, pos, size,
-                             style=wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES |
+                             style = wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES |
                              wx.BORDER_NONE)
 
         listmix.ListCtrlAutoWidthMixin.__init__(self)
@@ -2223,7 +2259,7 @@ class TableListCtrl(wx.ListCtrl,
         self.table   = table
         self.columns = columns
 
-    def Populate(self, update=False):
+    def Populate(self, update = False):
         """!Populate the list"""
         itemData = {} # requested by sorter
 
@@ -2231,9 +2267,10 @@ class TableListCtrl(wx.ListCtrl,
             headings = [_("Column name"), _("Data type"), _("Data length")]
             i = 0
             for h in headings:
-                self.InsertColumn(col=i, heading=h)
-                self.SetColumnWidth(col=i, width=150)
+                self.InsertColumn(col = i, heading = h)
                 i += 1
+            self.SetColumnWidth(col = 0, width = 350)
+            self.SetColumnWidth(col = 1, width = 175)
         else:
             self.DeleteAllItems()
 
@@ -2260,13 +2297,13 @@ class LayerListCtrl(wx.ListCtrl,
     """!Layer description list"""
 
     def __init__(self, parent, id, layers,
-                 pos=wx.DefaultPosition,
-                 size=wx.DefaultSize):
+                 pos = wx.DefaultPosition,
+                 size = wx.DefaultSize):
 
         self.parent = parent
         self.layers = layers
         wx.ListCtrl.__init__(self, parent, id, pos, size,
-                             style=wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES |
+                             style = wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES |
                              wx.BORDER_NONE)
 
         listmix.ListCtrlAutoWidthMixin.__init__(self)
@@ -2276,7 +2313,7 @@ class LayerListCtrl(wx.ListCtrl,
         """!Update description"""
         self.layers = layers
 
-    def Populate(self, update=False):
+    def Populate(self, update = False):
         """!Populate the list"""
         itemData = {} # requested by sorter
 
@@ -2284,7 +2321,7 @@ class LayerListCtrl(wx.ListCtrl,
             headings = [_("Layer"),  _("Driver"), _("Database"), _("Table"), _("Key")]
             i = 0
             for h in headings:
-                self.InsertColumn(col=i, heading=h)
+                self.InsertColumn(col = i, heading = h)
                 i += 1
         else:
             self.DeleteAllItems()
@@ -2310,9 +2347,9 @@ class LayerListCtrl(wx.ListCtrl,
             i += 1
 
         for i in range(self.GetColumnCount()):
-            self.SetColumnWidth(col=i, width=wx.LIST_AUTOSIZE)
-            if self.GetColumnWidth(col=i) < 60:
-                self.SetColumnWidth(col=i, width=60)
+            self.SetColumnWidth(col = i, width = wx.LIST_AUTOSIZE)
+            if self.GetColumnWidth(col = i) < 60:
+                self.SetColumnWidth(col = i, width = 60)
 
         self.SendSizeEvent()
         
@@ -2322,8 +2359,8 @@ class LayerBook(wx.Notebook):
     """!Manage layers (add, delete, modify)"""
     def __init__(self, parent, id,
                  parentDialog,
-                 style=wx.BK_DEFAULT):
-        wx.Notebook.__init__(self, parent, id, style=style)
+                 style = wx.BK_DEFAULT):
+        wx.Notebook.__init__(self, parent, id, style = style)
 
         self.parent       = parent
         self.parentDialog = parentDialog
@@ -2332,10 +2369,10 @@ class LayerBook(wx.Notebook):
         #
         # drivers
         #
-        drivers = gcmd.RunCommand('db.drivers',
-                                  quiet = True,
-                                  read = True,
-                                  flags = 'p')
+        drivers = RunCommand('db.drivers',
+                             quiet = True,
+                             read = True,
+                             flags = 'p')
         
         self.listOfDrivers = []
         for drv in drivers.splitlines():
@@ -2345,10 +2382,10 @@ class LayerBook(wx.Notebook):
         # get default values
         #
         self.defaultConnect = {}
-        connect = gcmd.RunCommand('db.connect',
-                                  flags = 'p',
-                                  read = True,
-                                  quiet = True)
+        connect = RunCommand('db.connect',
+                             flags = 'p',
+                             read = True,
+                             quiet = True)
         
         for line in connect.splitlines():
             item, value = line.split(':', 1)
@@ -2356,29 +2393,27 @@ class LayerBook(wx.Notebook):
         
         if len(self.defaultConnect['driver']) == 0 or \
                len(self.defaultConnect['database']) == 0:
-            wx.MessageBox(parent=self.parent,
-                          message=_("Unknown default DB connection. "
-                                    "Please define DB connection using db.connect module."),
-                          caption=_("Warning"),
-                          style=wx.OK | wx.ICON_WARNING | wx.CENTRE)
-        
-        self.defaultTables = self.__getTables(self.defaultConnect['driver'],
-                                              self.defaultConnect['database'])
+            GWarning(parent = self.parent,
+                     message = _("Unknown default DB connection. "
+                                 "Please define DB connection using db.connect module."))
+        
+        self.defaultTables = self._getTables(self.defaultConnect['driver'],
+                                             self.defaultConnect['database'])
         try:
-            self.defaultColumns = self.__getColumns(self.defaultConnect['driver'],
+            self.defaultColumns = self._getColumns(self.defaultConnect['driver'],
                                                     self.defaultConnect['database'],
                                                     self.defaultTables[0])
         except IndexError:
             self.defaultColumns = []
 
-        self.__createAddPage()
-        self.__createDeletePage()
-        self.__createModifyPage()
+        self._createAddPage()
+        self._createDeletePage()
+        self._createModifyPage()
 
-    def __createAddPage(self):
+    def _createAddPage(self):
         """!Add new layer"""
-        self.addPanel = wx.Panel(parent=self, id=wx.ID_ANY)
-        self.AddPage(page=self.addPanel, text=_("Add layer"))
+        self.addPanel = wx.Panel(parent = self, id = wx.ID_ANY)
+        self.AddPage(page = self.addPanel, text = _("Add layer"))
         
         try:
             maxLayer = max(self.mapDBInfo.layers.keys())
@@ -2387,43 +2422,43 @@ class LayerBook(wx.Notebook):
 
         # layer description
         
-        layerBox = wx.StaticBox (parent=self.addPanel, id=wx.ID_ANY,
-                                 label=" %s " % (_("Layer description")))
+        layerBox = wx.StaticBox (parent = self.addPanel, id = wx.ID_ANY,
+                                 label = " %s " % (_("Layer description")))
         layerSizer = wx.StaticBoxSizer(layerBox, wx.VERTICAL)
         
         #
         # list of layer widgets (label, value)
         #
         self.addLayerWidgets = {'layer':
-                                    (wx.StaticText(parent=self.addPanel, id=wx.ID_ANY,
-                                                   label='%s:' % _("Layer")),
-                                     wx.SpinCtrl(parent=self.addPanel, id=wx.ID_ANY, size=(65, -1),
-                                                 initial=maxLayer+1,
-                                                 min=1, max=1e6)),
+                                    (wx.StaticText(parent = self.addPanel, id = wx.ID_ANY,
+                                                   label = '%s:' % _("Layer")),
+                                     wx.SpinCtrl(parent = self.addPanel, id = wx.ID_ANY, size = (65, -1),
+                                                 initial = maxLayer+1,
+                                                 min = 1, max = 1e6)),
                                 'driver':
-                                    (wx.StaticText(parent=self.addPanel, id=wx.ID_ANY,
-                                                   label='%s:' % _("Driver")),
-                                     wx.Choice(parent=self.addPanel, id=wx.ID_ANY, size=(200, -1),
-                                               choices=self.listOfDrivers)),
+                                    (wx.StaticText(parent = self.addPanel, id = wx.ID_ANY,
+                                                   label = '%s:' % _("Driver")),
+                                     wx.Choice(parent = self.addPanel, id = wx.ID_ANY, size = (200, -1),
+                                               choices = self.listOfDrivers)),
                                 'database':
-                                    (wx.StaticText(parent=self.addPanel, id=wx.ID_ANY,
-                                                   label='%s:' % _("Database")),
-                                     wx.TextCtrl(parent=self.addPanel, id=wx.ID_ANY,
-                                                 value='',
-                                                 style=wx.TE_PROCESS_ENTER)),
+                                    (wx.StaticText(parent = self.addPanel, id = wx.ID_ANY,
+                                                   label = '%s:' % _("Database")),
+                                     wx.TextCtrl(parent = self.addPanel, id = wx.ID_ANY,
+                                                 value = '',
+                                                 style = wx.TE_PROCESS_ENTER)),
                                 'table':
-                                    (wx.StaticText(parent=self.addPanel, id=wx.ID_ANY,
-                                                   label='%s:' % _("Table")),
-                                     wx.Choice(parent=self.addPanel, id=wx.ID_ANY, size=(200, -1),
-                                               choices=self.defaultTables)),
+                                    (wx.StaticText(parent = self.addPanel, id = wx.ID_ANY,
+                                                   label = '%s:' % _("Table")),
+                                     wx.Choice(parent = self.addPanel, id = wx.ID_ANY, size = (200, -1),
+                                               choices = self.defaultTables)),
                                 'key':
-                                    (wx.StaticText(parent=self.addPanel, id=wx.ID_ANY,
-                                                   label='%s:' % _("Key column")),
-                                     wx.Choice(parent=self.addPanel, id=wx.ID_ANY, size=(200, -1),
-                                               choices=self.defaultColumns)),
+                                    (wx.StaticText(parent = self.addPanel, id = wx.ID_ANY,
+                                                   label = '%s:' % _("Key column")),
+                                     wx.Choice(parent = self.addPanel, id = wx.ID_ANY, size = (200, -1),
+                                               choices = self.defaultColumns)),
                                 'addCat':
-                                    (wx.CheckBox(parent=self.addPanel, id=wx.ID_ANY,
-                                                 label=_("Insert record for each category into table")),
+                                    (wx.CheckBox(parent = self.addPanel, id = wx.ID_ANY,
+                                                 label = _("Insert record for each category into table")),
                                      None),
                                 }
         
@@ -2440,34 +2475,40 @@ class LayerBook(wx.Notebook):
         # tooltips
         self.addLayerWidgets['addCat'][0].SetToolTipString(_("You need to add categories "
                                                              "by v.category module."))
+
+        # table description
+        tableBox = wx.StaticBox (parent = self.addPanel, id = wx.ID_ANY,
+                                 label = " %s " % (_("Table description")))
+        tableSizer = wx.StaticBoxSizer(tableBox, wx.VERTICAL)
+
         #
         # list of table widgets
         #
-        keyCol = UserSettings.Get(group='atm', key='keycolumn', subkey='value')
-        self.tableWidgets = {'table': (wx.StaticText(parent=self.addPanel, id=wx.ID_ANY,
-                                                     label='%s:' % _("Table name")),
-                                       wx.TextCtrl(parent=self.addPanel, id=wx.ID_ANY,
-                                                   value='',
-                                                   style=wx.TE_PROCESS_ENTER)),
-                             'key': (wx.StaticText(parent=self.addPanel, id=wx.ID_ANY,
-                                                   label='%s:' % _("Key column")),
-                                     wx.TextCtrl(parent=self.addPanel, id=wx.ID_ANY,
-                                                 value=keyCol,
-                                                 style=wx.TE_PROCESS_ENTER))}
+        keyCol = UserSettings.Get(group = 'atm', key = 'keycolumn', subkey = 'value')
+        self.tableWidgets = {'table': (wx.StaticText(parent = self.addPanel, id = wx.ID_ANY,
+                                                     label = '%s:' % _("Table name")),
+                                       wx.TextCtrl(parent = self.addPanel, id = wx.ID_ANY,
+                                                   value = '',
+                                                   style = wx.TE_PROCESS_ENTER)),
+                             'key': (wx.StaticText(parent = self.addPanel, id = wx.ID_ANY,
+                                                   label = '%s:' % _("Key column")),
+                                     wx.TextCtrl(parent = self.addPanel, id = wx.ID_ANY,
+                                                 value = keyCol,
+                                                 style = wx.TE_PROCESS_ENTER))}
         # events
         self.tableWidgets['table'][1].Bind(wx.EVT_TEXT_ENTER, self.OnCreateTable)
         self.tableWidgets['key'][1].Bind(wx.EVT_TEXT_ENTER, self.OnCreateTable)
         
         btnTable   = wx.Button(self.addPanel, wx.ID_ANY, _("&Create table"),
-                             size=(125,-1))
+                             size = (125,-1))
         btnTable.Bind(wx.EVT_BUTTON, self.OnCreateTable)
         
         btnLayer   = wx.Button(self.addPanel, wx.ID_ANY, _("&Add layer"),
-                             size=(125,-1))
+                             size = (125,-1))
         btnLayer.Bind(wx.EVT_BUTTON, self.OnAddLayer)
         
         btnDefault = wx.Button(self.addPanel, wx.ID_ANY, _("&Set default"),
-                               size=(125,-1))
+                               size = (125,-1))
         btnDefault.Bind(wx.EVT_BUTTON, self.OnSetDefault)
         
         # do layout
@@ -2475,7 +2516,7 @@ class LayerBook(wx.Notebook):
         pageSizer = wx.BoxSizer(wx.HORIZONTAL)
                 
         # data area
-        dataSizer = wx.GridBagSizer(hgap=5, vgap=5)
+        dataSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
         dataSizer.AddGrowableCol(1)
         row = 0
         for key in ('layer', 'driver', 'database', 'table', 'key', 'addCat'):
@@ -2484,101 +2525,96 @@ class LayerBook(wx.Notebook):
                 span = (1, 2)
             else:
                 span = (1, 1)
-            dataSizer.Add(item=label,
-                          flag=wx.ALIGN_CENTER_VERTICAL, pos=(row, 0),
-                          span=span)
+            dataSizer.Add(item = label,
+                          flag = wx.ALIGN_CENTER_VERTICAL, pos = (row, 0),
+                          span = span)
             
             if not value:
                 row += 1
                 continue
 
-            if label.GetLabel() == "Layer:":
+            if key == 'layer':
                 style = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT
             else:
                 style = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND
             
-            dataSizer.Add(item=value,
-                          flag=style, pos=(row, 1))
+            dataSizer.Add(item = value,
+                          flag = style, pos = (row, 1))
             
             row += 1
         
-        layerSizer.Add(item=dataSizer,
-                       proportion=1,
-                       flag=wx.ALL | wx.EXPAND,
-                       border=5)
+        layerSizer.Add(item = dataSizer,
+                       proportion = 1,
+                       flag = wx.ALL | wx.EXPAND,
+                       border = 5)
         
         btnSizer = wx.BoxSizer(wx.HORIZONTAL)
-        btnSizer.Add(item=btnDefault,
-                     proportion=0,
-                     flag=wx.ALL | wx.ALIGN_LEFT,
-                     border=5)
-        
-        btnSizer.Add(item=(5, 5),
-                     proportion=1,
-                     flag=wx.ALL | wx.EXPAND,
-                     border=5)
-        
-        btnSizer.Add(item=btnLayer,
-                     proportion=0,
-                     flag=wx.ALL | wx.ALIGN_RIGHT,
-                     border=5)
-        
-        layerSizer.Add(item=btnSizer,
-                       proportion=0,
-                       flag=wx.ALL | wx.EXPAND,
-                       border=0)
+        btnSizer.Add(item = btnDefault,
+                     proportion = 0,
+                     flag = wx.ALL | wx.ALIGN_LEFT,
+                     border = 5)
+        
+        btnSizer.Add(item = (5, 5),
+                     proportion = 1,
+                     flag = wx.ALL | wx.EXPAND,
+                     border = 5)
+        
+        btnSizer.Add(item = btnLayer,
+                     proportion = 0,
+                     flag = wx.ALL | wx.ALIGN_RIGHT,
+                     border = 5)
+        
+        layerSizer.Add(item = btnSizer,
+                       proportion = 0,
+                       flag = wx.ALL | wx.EXPAND,
+                       border = 0)
                 
-        # table description
-        tableBox = wx.StaticBox (parent=self.addPanel, id=wx.ID_ANY,
-                                 label=" %s " % (_("Table description")))
-        tableSizer = wx.StaticBoxSizer(tableBox, wx.VERTICAL)
-        
         # data area
-        dataSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
+        dataSizer = wx.FlexGridSizer(cols = 2, hgap = 5, vgap = 5)
         dataSizer.AddGrowableCol(1)
         for key in ['table', 'key']:
             label, value = self.tableWidgets[key]
-            dataSizer.Add(item=label,
-                          flag=wx.ALIGN_CENTER_VERTICAL)
-            dataSizer.Add(item=value,
-                          flag=wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
-
-        tableSizer.Add(item=dataSizer,
-                       proportion=1,
-                       flag=wx.ALL | wx.EXPAND,
-                       border=5)
-
-        tableSizer.Add(item=btnTable,
-                       proportion=0,
-                       flag=wx.ALL | wx.ALIGN_BOTTOM | wx.ALIGN_RIGHT,
-                       border=5)
-
-        pageSizer.Add(item=layerSizer,
-                      proportion=3,
-                      flag=wx.ALL | wx.EXPAND,
-                      border=3)
-        
-        pageSizer.Add(item=tableSizer,
-                      proportion=2,
-                      flag=wx.TOP | wx.BOTTOM | wx.RIGHT | wx.EXPAND,
-                      border=3)
+            dataSizer.Add(item = label,
+                          flag = wx.ALIGN_CENTER_VERTICAL)
+            dataSizer.Add(item = value,
+                          flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
+
+        tableSizer.Add(item = dataSizer,
+                       proportion = 1,
+                       flag = wx.ALL | wx.EXPAND,
+                       border = 5)
+
+        tableSizer.Add(item = btnTable,
+                       proportion = 0,
+                       flag = wx.ALL | wx.ALIGN_BOTTOM | wx.ALIGN_RIGHT,
+                       border = 5)
+
+        pageSizer.Add(item = layerSizer,
+                      proportion = 3,
+                      flag = wx.ALL | wx.EXPAND,
+                      border = 3)
+        
+        pageSizer.Add(item = tableSizer,
+                      proportion = 2,
+                      flag = wx.TOP | wx.BOTTOM | wx.RIGHT | wx.EXPAND,
+                      border = 3)
         
         layerSizer.SetVirtualSizeHints(self.addPanel)
         self.addPanel.SetAutoLayout(True)
         self.addPanel.SetSizer(pageSizer)
         pageSizer.Fit(self.addPanel)
         
-    def __createDeletePage(self):
+    def _createDeletePage(self):
         """!Delete layer"""
-        self.deletePanel = wx.Panel(parent=self, id=wx.ID_ANY)
-        self.AddPage(page=self.deletePanel, text=_("Remove layer"))
+        self.deletePanel = wx.Panel(parent = self, id = wx.ID_ANY)
+        self.AddPage(page = self.deletePanel, text = _("Remove layer"))
 
-        label = wx.StaticText(parent=self.deletePanel, id=wx.ID_ANY,
-                              label='%s:' % _("Layer to remove"))
+        label = wx.StaticText(parent = self.deletePanel, id = wx.ID_ANY,
+                              label = '%s:' % _("Layer to remove"))
 
-        self.deleteLayer = wx.ComboBox(parent=self.deletePanel, id=wx.ID_ANY, size=(100, -1),
-                                       style=wx.CB_SIMPLE | wx.CB_READONLY,
-                                       choices=map(str, self.mapDBInfo.layers.keys()))
+        self.deleteLayer = wx.ComboBox(parent = self.deletePanel, id = wx.ID_ANY, size = (100, -1),
+                                       style = wx.CB_SIMPLE | wx.CB_READONLY,
+                                       choices = map(str, self.mapDBInfo.layers.keys()))
         self.deleteLayer.SetSelection(0)           
         self.deleteLayer.Bind(wx.EVT_COMBOBOX, self.OnChangeLayer)
 
@@ -2587,8 +2623,8 @@ class LayerBook(wx.Notebook):
         except ValueError:
             tableName = ''
             
-        self.deleteTable = wx.CheckBox(parent=self.deletePanel, id=wx.ID_ANY,
-                                       label=_('Drop also linked attribute table (%s)') % \
+        self.deleteTable = wx.CheckBox(parent = self.deletePanel, id = wx.ID_ANY,
+                                       label = _('Drop also linked attribute table (%s)') % \
                                        tableName)
 
         if tableName == '':
@@ -2596,7 +2632,7 @@ class LayerBook(wx.Notebook):
             self.deleteTable.Enable(False)
             
         btnDelete   = wx.Button(self.deletePanel, wx.ID_DELETE, _("&Remove layer"),
-                                size=(125,-1))
+                                size = (125,-1))
         btnDelete.Bind(wx.EVT_BUTTON, self.OnDeleteLayer)
 
         #
@@ -2606,76 +2642,76 @@ class LayerBook(wx.Notebook):
 
         dataSizer = wx.BoxSizer(wx.VERTICAL)
 
-        flexSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
+        flexSizer = wx.FlexGridSizer(cols = 2, hgap = 5, vgap = 5)
         flexSizer.AddGrowableCol(2)
 
-        flexSizer.Add(item=label,
-                      flag=wx.ALIGN_CENTER_VERTICAL)
-        flexSizer.Add(item=self.deleteLayer,
-                      flag=wx.ALIGN_CENTER_VERTICAL)
+        flexSizer.Add(item = label,
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        flexSizer.Add(item = self.deleteLayer,
+                      flag = wx.ALIGN_CENTER_VERTICAL)
 
-        dataSizer.Add(item=flexSizer,
-                      proportion=0,
-                      flag=wx.ALL | wx.EXPAND,
-                      border=1)
+        dataSizer.Add(item = flexSizer,
+                      proportion = 0,
+                      flag = wx.ALL | wx.EXPAND,
+                      border = 1)
 
-        dataSizer.Add(item=self.deleteTable,
-                      proportion=0,
-                      flag=wx.ALL | wx.EXPAND,
-                      border=1)
+        dataSizer.Add(item = self.deleteTable,
+                      proportion = 0,
+                      flag = wx.ALL | wx.EXPAND,
+                      border = 1)
 
-        pageSizer.Add(item=dataSizer,
-                      proportion=1,
-                      flag=wx.ALL | wx.EXPAND,
-                      border=5)
+        pageSizer.Add(item = dataSizer,
+                      proportion = 1,
+                      flag = wx.ALL | wx.EXPAND,
+                      border = 5)
 
-        pageSizer.Add(item=btnDelete,
-                      proportion=0,
-                      flag=wx.ALL | wx.ALIGN_RIGHT,
-                      border=5)
+        pageSizer.Add(item = btnDelete,
+                      proportion = 0,
+                      flag = wx.ALL | wx.ALIGN_RIGHT,
+                      border = 5)
 
         self.deletePanel.SetSizer(pageSizer)
 
-    def __createModifyPage(self):
+    def _createModifyPage(self):
         """!Modify layer"""
-        self.modifyPanel = wx.Panel(parent=self, id=wx.ID_ANY)
-        self.AddPage(page=self.modifyPanel, text=_("Modify layer"))
+        self.modifyPanel = wx.Panel(parent = self, id = wx.ID_ANY)
+        self.AddPage(page = self.modifyPanel, text = _("Modify layer"))
 
         #
         # list of layer widgets (label, value)
         #
         self.modifyLayerWidgets = {'layer':
-                                       (wx.StaticText(parent=self.modifyPanel, id=wx.ID_ANY,
-                                                      label='%s:' % _("Layer")),
-                                        wx.ComboBox(parent=self.modifyPanel, id=wx.ID_ANY,
-                                                    size=(100, -1),
-                                                    style=wx.CB_SIMPLE | wx.CB_READONLY,
-                                                    choices=map(str, 
+                                       (wx.StaticText(parent = self.modifyPanel, id = wx.ID_ANY,
+                                                      label = '%s:' % _("Layer")),
+                                        wx.ComboBox(parent = self.modifyPanel, id = wx.ID_ANY,
+                                                    size = (100, -1),
+                                                    style = wx.CB_SIMPLE | wx.CB_READONLY,
+                                                    choices = map(str, 
                                                                 self.mapDBInfo.layers.keys()))),
                                    'driver':
-                                       (wx.StaticText(parent=self.modifyPanel, id=wx.ID_ANY,
-                                                      label='%s:' % _("Driver")),
-                                        wx.Choice(parent=self.modifyPanel, id=wx.ID_ANY,
-                                                  size=(200, -1),
-                                                  choices=self.listOfDrivers)),
+                                       (wx.StaticText(parent = self.modifyPanel, id = wx.ID_ANY,
+                                                      label = '%s:' % _("Driver")),
+                                        wx.Choice(parent = self.modifyPanel, id = wx.ID_ANY,
+                                                  size = (200, -1),
+                                                  choices = self.listOfDrivers)),
                                    'database':
-                                       (wx.StaticText(parent=self.modifyPanel, id=wx.ID_ANY,
-                                                      label='%s:' % _("Database")),
-                                        wx.TextCtrl(parent=self.modifyPanel, id=wx.ID_ANY,
-                                                    value='', size=(350, -1),
-                                                    style=wx.TE_PROCESS_ENTER)),
+                                       (wx.StaticText(parent = self.modifyPanel, id = wx.ID_ANY,
+                                                      label = '%s:' % _("Database")),
+                                        wx.TextCtrl(parent = self.modifyPanel, id = wx.ID_ANY,
+                                                    value = '', size = (350, -1),
+                                                    style = wx.TE_PROCESS_ENTER)),
                                    'table':
-                                       (wx.StaticText(parent=self.modifyPanel, id=wx.ID_ANY,
-                                                      label='%s:' % _("Table")),
-                                        wx.Choice(parent=self.modifyPanel, id=wx.ID_ANY,
-                                                  size=(200, -1),
-                                                  choices=self.defaultTables)),
+                                       (wx.StaticText(parent = self.modifyPanel, id = wx.ID_ANY,
+                                                      label = '%s:' % _("Table")),
+                                        wx.Choice(parent = self.modifyPanel, id = wx.ID_ANY,
+                                                  size = (200, -1),
+                                                  choices = self.defaultTables)),
                                    'key':
-                                       (wx.StaticText(parent=self.modifyPanel, id=wx.ID_ANY,
-                                                      label='%s:' % _("Key column")),
-                                        wx.Choice(parent=self.modifyPanel, id=wx.ID_ANY,
-                                                  size=(200, -1),
-                                                  choices=self.defaultColumns))}
+                                       (wx.StaticText(parent = self.modifyPanel, id = wx.ID_ANY,
+                                                      label = '%s:' % _("Key column")),
+                                        wx.Choice(parent = self.modifyPanel, id = wx.ID_ANY,
+                                                  size = (200, -1),
+                                                  choices = self.defaultColumns))}
         
         # set default values for widgets
         self.modifyLayerWidgets['layer'][1].SetSelection(0)
@@ -2691,7 +2727,7 @@ class LayerBook(wx.Notebook):
             database = self.mapDBInfo.layers[layer]['database']
             table    = self.mapDBInfo.layers[layer]['table']
 
-            listOfColumns = self.__getColumns(driver, database, table)
+            listOfColumns = self._getColumns(driver, database, table)
             self.modifyLayerWidgets['driver'][1].SetStringSelection(driver)
             self.modifyLayerWidgets['database'][1].SetValue(database)
             if table in self.modifyLayerWidgets['table'][1].GetItems():
@@ -2712,7 +2748,7 @@ class LayerBook(wx.Notebook):
         # self.modifyLayerWidgets['table'][1].Bind(wx.EVT_CHOICE, self.OnTableChanged)
 
         btnModify = wx.Button(self.modifyPanel, wx.ID_DELETE, _("&Modify layer"),
-                              size=(125,-1))
+                              size = (125,-1))
         btnModify.Bind(wx.EVT_BUTTON, self.OnModifyLayer)
 
         #
@@ -2721,47 +2757,46 @@ class LayerBook(wx.Notebook):
         pageSizer = wx.BoxSizer(wx.VERTICAL)
 
         # data area
-        dataSizer = wx.FlexGridSizer(cols=2, hgap=5, vgap=5)
+        dataSizer = wx.FlexGridSizer(cols = 2, hgap = 5, vgap = 5)
         dataSizer.AddGrowableCol(1)
         for key in ('layer', 'driver', 'database', 'table', 'key'):
             label, value = self.modifyLayerWidgets[key]
-            dataSizer.Add(item=label,
-                          flag=wx.ALIGN_CENTER_VERTICAL)
-            if label.GetLabel() == "Layer:":
-                dataSizer.Add(item=value,
-                              flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
+            dataSizer.Add(item = label,
+                          flag = wx.ALIGN_CENTER_VERTICAL)
+            if key == 'layer':
+                dataSizer.Add(item = value,
+                              flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
             else:
-                dataSizer.Add(item=value,
-                              flag=wx.ALIGN_CENTER_VERTICAL)
+                dataSizer.Add(item = value,
+                              flag = wx.ALIGN_CENTER_VERTICAL)
 
-        pageSizer.Add(item=dataSizer,
-                      proportion=1,
-                      flag=wx.ALL | wx.EXPAND,
-                      border=5)
+        pageSizer.Add(item = dataSizer,
+                      proportion = 1,
+                      flag = wx.ALL | wx.EXPAND,
+                      border = 5)
 
-        pageSizer.Add(item=btnModify,
-                      proportion=0,
-                      flag=wx.ALL | wx.ALIGN_RIGHT,
-                      border=5)
+        pageSizer.Add(item = btnModify,
+                      proportion = 0,
+                      flag = wx.ALL | wx.ALIGN_RIGHT,
+                      border = 5)
 
         self.modifyPanel.SetSizer(pageSizer)
 
-    def __getTables(self, driver, database):
+    def _getTables(self, driver, database):
         """!Get list of tables for given driver and database"""
         tables = []
 
-        ret = gcmd.RunCommand('db.tables',
-                              parent = self,
-                              read = True,
-                              flags = 'p',
-                              driver = driver,
-                              database = database)
+        ret = RunCommand('db.tables',
+                         parent = self,
+                         read = True,
+                         flags = 'p',
+                         driver = driver,
+                         database = database)
         
         if ret is None:
-            wx.MessageBox(parent=self,
-                          message=_("Unable to get list of tables.\n"
-                                    "Please use db.connect to set database parameters."),
-                          caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+            GError(parent = self,
+                   message = _("Unable to get list of tables.\n"
+                               "Please use db.connect to set database parameters."))
             
             return tables
         
@@ -2770,17 +2805,17 @@ class LayerBook(wx.Notebook):
         
         return tables
 
-    def __getColumns(self, driver, database, table):
+    def _getColumns(self, driver, database, table):
         """!Get list of column of given table"""
         columns = []
 
-        ret = gcmd.RunCommand('db.columns',
-                              parent = self,
-                              quiet = True,
-                              read = True,
-                              driver = driver,
-                              database = database,
-                              table = table)
+        ret = RunCommand('db.columns',
+                         parent = self,
+                         quiet = True,
+                         read = True,
+                         driver = driver,
+                         database = database,
+                         table = table)
         
         if ret == None:
             return columns
@@ -2797,7 +2832,7 @@ class LayerBook(wx.Notebook):
 
         winTable = self.addLayerWidgets['table'][1]
         winKey   = self.addLayerWidgets['key'][1]
-        tables   = self.__getTables(driver, database)
+        tables   = self._getTables(driver, database)
 
         winTable.SetItems(tables)
         winTable.SetSelection(0)
@@ -2818,7 +2853,7 @@ class LayerBook(wx.Notebook):
         table    = event.GetString()
 
         win  = self.addLayerWidgets['key'][1]
-        cols = self.__getColumns(driver, database, table)
+        cols = self._getColumns(driver, database, table)
         win.SetItems(cols)
         win.SetSelection(0)
 
@@ -2833,14 +2868,14 @@ class LayerBook(wx.Notebook):
 
         driver.SetStringSelection(self.defaultConnect['driver'])
         database.SetValue(self.defaultConnect['database'])
-        tables = self.__getTables(self.defaultConnect['driver'],
+        tables = self._getTables(self.defaultConnect['driver'],
                                   self.defaultConnect['database'])
         table.SetItems(tables)
         table.SetSelection(0)
         if len(tables) == 0:
             key.SetItems([])
         else:
-            cols = self.__getColumns(self.defaultConnect['driver'],
+            cols = self._getColumns(self.defaultConnect['driver'],
                                      self.defaultConnect['database'],
                                      tables[0])
             key.SetItems(cols)
@@ -2856,37 +2891,35 @@ class LayerBook(wx.Notebook):
         key      = self.tableWidgets['key'][1].GetValue()
         
         if not table or not key:
-            wx.MessageBox(parent=self,
-                          message=_("Unable to create new table. "
-                                    "Table name or key column name is missing."),
-                          caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+            GError(parent = self,
+                   message = _("Unable to create new table. "
+                               "Table name or key column name is missing."))
             return
 
         if table in self.addLayerWidgets['table'][1].GetItems():
-            wx.MessageBox(parent=self,
-                          message=_("Unable to create new table. "
-                                    "Table <%s> already exists in the database.") % table,
-                          caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+            GError(parent = self,
+                   message = _("Unable to create new table. "
+                               "Table <%s> already exists in the database.") % table)
             return
         
         # create table
         sql = 'CREATE TABLE %s (%s INTEGER)' % (table, key)
 
-        gcmd.RunCommand('db.execute',
-                        quiet = True,
-                        parent = self,
-                        stdin = sql,
-                        driver = driver,
-                        database = database)
+        RunCommand('db.execute',
+                   quiet = True,
+                   parent = self,
+                   stdin = sql,
+                   driver = driver,
+                   database = database)
         
         # update list of tables
         tableList = self.addLayerWidgets['table'][1]
-        tableList.SetItems(self.__getTables(driver, database))
+        tableList.SetItems(self._getTables(driver, database))
         tableList.SetStringSelection(table)
 
         # update key column selection
         keyList = self.addLayerWidgets['key'][1]
-        keyList.SetItems(self.__getColumns(driver, database, table))
+        keyList.SetItems(self._getColumns(driver, database, table))
         keyList.SetStringSelection(key)
         
         event.Skip()
@@ -2901,38 +2934,37 @@ class LayerBook(wx.Notebook):
         key      = self.addLayerWidgets['key'][1].GetStringSelection()
         
         if layer in self.mapDBInfo.layers.keys():
-            wx.MessageBox(parent=self,
-                          message=_("Unable to add new layer to vector map <%(vector)s>. "
-                                    "Layer %(layer)d already exists.") % 
-                          {'vector' : self.mapDBInfo.map, 'layer' : layer},
-                          caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
+            GError(parent = self,
+                   message = _("Unable to add new layer to vector map <%(vector)s>. "
+                               "Layer %(layer)d already exists.") % \
+                       {'vector' : self.mapDBInfo.map, 'layer' : layer})
             return
 
         # add new layer
-        ret = gcmd.RunCommand('v.db.connect',
-                              parent = self,
-                              quiet = True,
-                              map = self.mapDBInfo.map,
-                              driver = driver,
-                              database = database,
-                              table = table,
-                              key = key,
-                              layer = layer)
+        ret = RunCommand('v.db.connect',
+                         parent = self,
+                         quiet = True,
+                         map = self.mapDBInfo.map,
+                         driver = driver,
+                         database = database,
+                         table = table,
+                         key = key,
+                         layer = layer)
         
         # insert records into table if required
         if self.addLayerWidgets['addCat'][0].IsChecked():
-            gcmd.RunCommand('v.to.db',
-                            parent = self,
-                            quiet = True,
-                            map = self.mapDBInfo.map,
-                            layer = layer,
-                            qlayer = layer,
-                            option = 'cat',
-                            columns = key)
+            RunCommand('v.to.db',
+                       parent = self,
+                       quiet = True,
+                       map = self.mapDBInfo.map,
+                       layer = layer,
+                       qlayer = layer,
+                       option = 'cat',
+                       columns = key)
 
         if ret == 0:
             # update dialog (only for new layer)
-            self.parentDialog.UpdateDialog(layer=layer) 
+            self.parentDialog.UpdateDialog(layer = layer) 
             # update db info
             self.mapDBInfo = self.parentDialog.mapDBInfo
             # increase layer number
@@ -2952,11 +2984,11 @@ class LayerBook(wx.Notebook):
         except:
             return
 
-        gcmd.RunCommand('v.db.connect',
-                        parent = self,
-                        flags = 'd',
-                        map = self.mapDBInfo.map,
-                        layer = layer)
+        RunCommand('v.db.connect',
+                   parent = self,
+                   flags = 'd',
+                   map = self.mapDBInfo.map,
+                   layer = layer)
 
         # drop also table linked to layer which is deleted
         if self.deleteTable.IsChecked():
@@ -2965,20 +2997,20 @@ class LayerBook(wx.Notebook):
             table    = self.mapDBInfo.layers[layer]['table']
             sql      = 'DROP TABLE %s' % (table)
 
-            gcmd.RunCommand('db.execute',
-                            parent = self,
-                            stdin = sql,
-                            quiet = True,
-                            driver = driver,
-                            database = database)
+            RunCommand('db.execute',
+                       parent = self,
+                       stdin = sql,
+                       quiet = True,
+                       driver = driver,
+                       database = database)
             
             # update list of tables
             tableList = self.addLayerWidgets['table'][1]
-            tableList.SetItems(self.__getTables(driver, database))
+            tableList.SetItems(self._getTables(driver, database))
             tableList.SetStringSelection(table)
         
         # update dialog
-        self.parentDialog.UpdateDialog(layer=layer) 
+        self.parentDialog.UpdateDialog(layer = layer) 
         # update db info
         self.mapDBInfo = self.parentDialog.mapDBInfo
 
@@ -3005,7 +3037,7 @@ class LayerBook(wx.Notebook):
             driver   = self.mapDBInfo.layers[layer]['driver']
             database = self.mapDBInfo.layers[layer]['database']
             table    = self.mapDBInfo.layers[layer]['table']
-            listOfColumns = self.__getColumns(driver, database, table)
+            listOfColumns = self._getColumns(driver, database, table)
             self.modifyLayerWidgets['driver'][1].SetStringSelection(driver)
             self.modifyLayerWidgets['database'][1].SetValue(database)
             self.modifyLayerWidgets['table'][1].SetStringSelection(table)
@@ -3035,54 +3067,52 @@ class LayerBook(wx.Notebook):
 
         if modify:
             # delete layer
-            gcmd.RunCommand('v.db.connect',
-                            parent = self,
-                            quiet = True,
-                            flag = 'd',
-                            map = self.mapDBInfo.map,
-                            layer = layer)
-
+            RunCommand('v.db.connect',
+                       parent = self,
+                       quiet = True,
+                       flag = 'd',
+                       map = self.mapDBInfo.map,
+                       layer = layer)
+            
             # add modified layer
-            gcmd.RunCommand('v.db.connect',
-                            quiet = True,
-                            map = self.mapDBInfo.map,
-                            driver = self.modifyLayerWidgets['driver'][1].GetStringSelection(),
-                            database = self.modifyLayerWidgets['database'][1].GetValue(),
-                            table = self.modifyLayerWidgets['table'][1].GetStringSelection(),
-                            key = self.modifyLayerWidgets['key'][1].GetStringSelection(),
-                            layer = int(layer))
+            RunCommand('v.db.connect',
+                       quiet = True,
+                       map = self.mapDBInfo.map,
+                       driver = self.modifyLayerWidgets['driver'][1].GetStringSelection(),
+                       database = self.modifyLayerWidgets['database'][1].GetValue(),
+                       table = self.modifyLayerWidgets['table'][1].GetStringSelection(),
+                       key = self.modifyLayerWidgets['key'][1].GetStringSelection(),
+                       layer = int(layer))
             
             # update dialog (only for new layer)
-            self.parentDialog.UpdateDialog(layer=layer) 
+            self.parentDialog.UpdateDialog(layer = layer) 
             # update db info
             self.mapDBInfo = self.parentDialog.mapDBInfo
 
         event.Skip()
 
-def main(argv=None):
+def main(argv = None):
+    import gettext
+    gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
+    
     if argv is None:
         argv = sys.argv
-
+    
     if len(argv) != 2:
         print >> sys.stderr, __doc__
         sys.exit()
-
-    # Command line arguments of the script to be run are preserved by the
-    # hotswap.py wrapper but hotswap.py and its options are removed that
-    # sys.argv looks as if no wrapper was present.
-    #print "argv:", `argv`
-
+    
     #some applications might require image handlers
     wx.InitAllImageHandlers()
-
+    
     app = wx.PySimpleApp()
-    f = AttributeManager(parent=None, id=wx.ID_ANY,
-                         title="%s - <%s>" % (_("GRASS GIS Attribute Table Manager"),
+    f = AttributeManager(parent = None, id = wx.ID_ANY,
+                         title = "%s - <%s>" % (_("GRASS GIS Attribute Table Manager"),
                                               argv[1]),
-                         size=(900,600), vectorName=argv[1])
+                         size = (900,600), vectorName = argv[1])
     f.Show()
-
+    
     app.MainLoop()
-
+    
 if __name__ == '__main__':
     main()
diff --git a/gui/wxpython/gui_modules/sqlbuilder.py b/gui/wxpython/dbmgr/sqlbuilder.py
similarity index 89%
rename from gui/wxpython/gui_modules/sqlbuilder.py
rename to gui/wxpython/dbmgr/sqlbuilder.py
index fe0d49f..c24c978 100644
--- a/gui/wxpython/gui_modules/sqlbuilder.py
+++ b/gui/wxpython/dbmgr/sqlbuilder.py
@@ -1,21 +1,20 @@
 """!
- at package sqlbuilder.py
+ at package dbmgr.sqlbuilder
 
 @brief GRASS SQL Builder
 
 Classes:
- - SQLFrame
+ - sqlbuilder::SQLFrame
 
 Usage:
 @code
 python sqlbuilder.py vector_map
 @endcode
 
-(C) 2007-2009 by the GRASS Development Team
+(C) 2007-2009, 2011 by the GRASS Development Team
 
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Jachym Cepicky <jachym.cepicky gmail.com> (original author)
 @author Martin Landa <landa.martin gmail.com>
@@ -24,24 +23,21 @@ for details.
 
 import os
 import sys
-import time
 
-### i18N
-import gettext
-gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode=True)
-
-import globalvar
+if __name__ == "__main__":
+    sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'gui', 'wxpython'))
+from core import globalvar
 import wx
 
-import grass.script as grass
+from core.gcmd   import RunCommand, GError
+from dbmgr.vinfo import createDbInfoDesc, VectorDBInfo
 
-import gcmd
-import dbm_base
+import grass.script as grass
 
 class SQLFrame(wx.Frame):
     """!SQL Frame class"""
     def __init__(self, parent, title, vectmap, id = wx.ID_ANY,
-                 layer = 1, qtype = "select", evtheader = None):
+                 layer = 1, qtype = "select", evtHandler = None):
         
         wx.Frame.__init__(self, parent, id, title)
         
@@ -49,19 +45,19 @@ class SQLFrame(wx.Frame):
                              wx.BITMAP_TYPE_ICO))
         
         self.parent = parent
-        self.evtHeader = evtheader
+        self.evtHandler = evtHandler
 
         #
         # variables
         #
         self.vectmap = vectmap # fullname
         if not "@" in self.vectmap:
-            self.vectmap = self.vectmap + "@" + grass.gisenv()['MAPSET']
+            self.vectmap = grass.find_file(self.vectmap, element = 'vector')['fullname']
         self.mapname, self.mapset = self.vectmap.split("@", 1)
         
         # db info
         self.layer = layer
-        self.dbInfo = dbm_base.VectorDBInfo(self.vectmap)
+        self.dbInfo = VectorDBInfo(self.vectmap)
         self.tablename = self.dbInfo.GetTable(self.layer)
         self.driver, self.database = self.dbInfo.GetDbSettings(self.layer)
         
@@ -90,7 +86,7 @@ class SQLFrame(wx.Frame):
         databasebox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
                                    label = " %s " % _("Database connection"))
         databaseboxsizer = wx.StaticBoxSizer(databasebox, wx.VERTICAL)
-        databaseboxsizer.Add(item=dbm_base.createDbInfoDesc(self.panel, self.dbInfo, layer = self.layer),
+        databaseboxsizer.Add(item=createDbInfoDesc(self.panel, self.dbInfo, layer = self.layer),
                              proportion=1,
                              flag=wx.EXPAND | wx.ALL,
                              border=3)
@@ -286,26 +282,22 @@ class SQLFrame(wx.Frame):
         
         self.list_values.Clear()
         
-        querystring = "SELECT %s FROM %s" % (column, self.tablename)
-        
-        data = grass.db_select(table = self.tablename,
-                               sql = querystring,
+        data = grass.db_select(sql = "SELECT %s FROM %s" % (column, self.tablename),
                                database = self.database,
                                driver = self.driver)
         if not data:
             return
-
+        
         desc = self.dbInfo.GetTableDesc(self.dbInfo.GetTable(self.layer))[column]
         
         i = 0
-        for item in sorted(map(desc['ctype'], data)):
-            if justsample and i < 256 or \
-               not justsample:
-                if desc['type'] != 'character':
-                    item = str(item)
-                self.list_values.Append(item)
-            else:
+        for item in sorted(set(map(lambda x: desc['ctype'](x[0]), data))):
+            if justsample and i > 255:
                 break
+            
+            if desc['type'] != 'character':
+                item = str(item)
+            self.list_values.Append(item)
             i += 1
         
     def OnSampleValues(self, event):
@@ -409,9 +401,9 @@ class SQLFrame(wx.Frame):
         
     def OnApply(self, event):
         """Apply button pressed"""
-        if self.evtHeader:
-            self.evtHeader(event = 'apply')
-
+        if self.evtHandler:
+            self.evtHandler(event = 'apply')
+        
         if self.close_onapply.IsChecked():
             self.Destroy()
             
@@ -419,18 +411,18 @@ class SQLFrame(wx.Frame):
     
     def OnVerify(self, event):
         """!Verify button pressed"""
-        ret, msg = gcmd.RunCommand('db.select',
-                                   getErrorMsg = True,
-                                   table = self.tablename,
-                                   sql = self.text_sql.GetValue(),
-                                   flags = 't',
-                                   driver = self.driver,
-                                   database = self.database)
+        ret, msg = RunCommand('db.select',
+                              getErrorMsg = True,
+                              table = self.tablename,
+                              sql = self.text_sql.GetValue(),
+                              flags = 't',
+                              driver = self.driver,
+                              database = self.database)
         
         if ret != 0 and msg:
             self.statusbar.SetStatusText(_("SQL statement is not valid"), 0)
-            gcmd.GError(parent = self,
-                        message = _("SQL statement is not valid.\n\n%s") % msg)
+            GError(parent = self,
+                   message = _("SQL statement is not valid.\n\n%s") % msg)
         else:
             self.statusbar.SetStatusText(_("SQL statement is valid"), 0)
                         
@@ -443,8 +435,8 @@ class SQLFrame(wx.Frame):
     
     def OnClose(self, event):
         """!Close button pressed"""
-        if self.evtHeader:
-            self.evtHeader(event = 'close')
+        if self.evtHandler:
+            self.evtHandler(event = 'close')
         
         self.Destroy()
         
@@ -455,6 +447,9 @@ if __name__ == "__main__":
         print >>sys.stderr, __doc__
         sys.exit()
     
+    import gettext
+    gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode=True)
+    
     app = wx.App(0)
     sqlb = SQLFrame(parent = None, title = _('SQL Builder'), vectmap = sys.argv[1])
     sqlb.Show()
diff --git a/gui/wxpython/gui_modules/dbm_base.py b/gui/wxpython/dbmgr/vinfo.py
similarity index 67%
rename from gui/wxpython/gui_modules/dbm_base.py
rename to gui/wxpython/dbmgr/vinfo.py
index 50f09e9..5cf495f 100644
--- a/gui/wxpython/gui_modules/dbm_base.py
+++ b/gui/wxpython/dbmgr/vinfo.py
@@ -1,16 +1,15 @@
 """
- at package dbm_base.py
+ at package dbmgr.vinfo
 
- at brief Support classes for dbm.py
+ at brief Support classes for Database Manager
 
 List of classes:
- - VectorDBInfo
+ - vinfo::VectorDBInfo
 
 (C) 2007-2011 by the GRASS Development Team
 
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Martin Landa <landa.martin gmail.com>
 """
@@ -20,9 +19,9 @@ import types
 
 import wx
 
-import gselect
-import gcmd
-from preferences import globalSettings as UserSettings
+from gui_core.gselect import VectorDBInfo as VectorDBInfoBase
+from core.gcmd        import RunCommand
+from core.settings    import UserSettings
 
 import grass.script as grass
 
@@ -32,17 +31,12 @@ def unicodeValue(value):
         return value
     
     enc = UserSettings.Get(group = 'atm', key = 'encoding', subkey = 'value')
-    if enc:
-        value = unicode(value, enc)
-    elif 'GRASS_DB_ENCODING' in os.environ:
-        value = unicode(value, os.environ['GRASS_DB_ENCODING'])
+    if not enc and 'GRASS_DB_ENCODING' in os.environ:
+        enc = os.environ['GRASS_DB_ENCODING']
     else:
-        try:
-            value = unicode(value, 'ascii')
-        except UnicodeDecodeError:
-            value = _("Unable to decode value. Set encoding in GUI preferences ('Attributes').")
+        enc = 'utf-8'
     
-    return value
+    return unicode(value, enc, errors = 'replace')
 
 def createDbInfoDesc(panel, mapDBInfo, layer):
     """!Create database connection information content"""
@@ -68,11 +62,11 @@ def createDbInfoDesc(panel, mapDBInfo, layer):
     
     return infoFlexSizer
         
-class VectorDBInfo(gselect.VectorDBInfo):
+class VectorDBInfo(VectorDBInfoBase):
     """!Class providing information about attribute tables
     linked to the vector map"""
     def __init__(self, map):
-        gselect.VectorDBInfo.__init__(self, map)
+        VectorDBInfoBase.__init__(self, map)
         
     def GetColumns(self, table):
         """!Return list of columns names (based on their index)"""
@@ -97,28 +91,37 @@ class VectorDBInfo(gselect.VectorDBInfo):
                                  coord = (float(queryCoords[0]), float(queryCoords[1])),
                                  distance = float(qdist))
 
-        if len(data) < 1 or 'Table' not in data[0]:
+        if len(data) < 1 or all(('Table' not in record) for record in data):
             return None
         
         # process attributes
-        table = data[0]['Table']
-        for key, value in data[0]['Attributes'].iteritems():
-            if len(value) < 1:
-                value = None
-            else:
-                if self.tables[table][key]['ctype'] != types.StringType:
-                    value = self.tables[table][key]['ctype'] (value)
-                else:
-                    value = unicodeValue(value)
-            self.tables[table][key]['values'].append(value)
-        
         ret = dict()
-        for key, value in data[0].iteritems():
-            if key == 'Attributes':
-                continue
+        for key in ['Category', 'Layer', 'Table', 'Id']:
             ret[key] = list()
-            ret[key].append(value)
-        
+
+        for record in data:
+            if not 'Table' in record:
+                continue
+
+            table = record['Table']
+            for key, value in record['Attributes'].iteritems():
+                if len(value) < 1:
+                    value = None
+                else:
+                    if self.tables[table][key]['ctype'] != types.StringType:
+                        value = self.tables[table][key]['ctype'] (value)
+                    else:
+                        value = unicodeValue(value)
+                self.tables[table][key]['values'].append(value)
+            
+            for key, value in record.iteritems():
+                if key == 'Attributes':
+                    continue
+                if key in ret:
+                    ret[key].append(value)
+            if 'Id' not in record.keys():
+                ret['Id'].append(None)
+
         return ret
     
     def SelectFromTable(self, layer, cols = '*', where = None):
@@ -138,14 +141,14 @@ class VectorDBInfo(gselect.VectorDBInfo):
         else:
             sql = "SELECT %s FROM %s WHERE %s" % (cols, table, where)
         
-        ret = gcmd.RunCommand('db.select',
-                              parent = self,
-                              read = True,
-                              quiet = True,
-                              flags = 'v',
-                              sql= sql,
-                              database = self.layers[layer]["database"],
-                              driver = self.layers[layer]["driver"])
+        ret = RunCommand('db.select',
+                         parent = self,
+                         read = True,
+                         quiet = True,
+                         flags = 'v',
+                         sql= sql,
+                         database = self.layers[layer]["database"],
+                         driver = self.layers[layer]["driver"])
         
         # self.tables[table][key][1] = str(cat)
         if ret:
diff --git a/gui/wxpython/docs/wxGUI.Attribute_Table_Manager.tmp.html b/gui/wxpython/docs/wxGUI.Attribute_Table_Manager.tmp.html
new file mode 100644
index 0000000..8851b55
--- /dev/null
+++ b/gui/wxpython/docs/wxGUI.Attribute_Table_Manager.tmp.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>GRASS GIS Manual: wxGUI.Attribute_Table_Manager</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="stylesheet" href="grassdocs.css" type="text/css">
+</head>
+<body bgcolor="white">
+<img src="grass_logo.png" alt="GRASS logo"><hr align=center size=6 noshade>
+<h2>NAME</h2>
+<em><b>wxGUI.Attribute_Table_Manager</b></em>
+
+<h2>DESCRIPTION</h2>
+
+The <em>Attribute table manager</em> allows you to:
+
+<ul>
+  <li>Browse attribute data of vector map, perform SQL select
+  statements</li>
+  <li>Modify attribute data, insert new records to attribute table,
+  delete existing records</li>
+  <li>Highlight selected items in Map Display Window</li>
+  <li>Extract selected items into new vector map</li>
+  <li>Modify attribute table - add, drop, rename columns</li>
+  <li>Modify vector map DB connection settings - add, remove or
+  modify layers</li>
+</ul>
+
+
+<h2>SEE ALSO</h2>
+
+<em>
+  <a href="wxGUI.html">wxGUI</a><br>
+  <a href="wxGUI.Components.html">wxGUI components</a>
+</em>
+
+<p>
+<em>
+  <a href="db.columns.html">db.columns</a>,
+  <a href="db.connect.html">db.connect</a>,
+  <a href="db.describe.html">db.describe</a>,
+  <a href="db.drivers.html">db.drivers</a>,
+  <a href="db.execute.html">db.execute</a>,
+  <a href="db.select.html">db.select</a>,
+  <a href="db.tables.html">db.tables</a>
+</em>
+
+<p>
+<em>
+  <a href="v.db.addcol.html">v.db.addcol</a>,
+  <a href="v.db.connect.html">v.db.connect</a>,
+  <a href="v.db.dropcol.html">v.db.dropcol</a>,
+  <a href="v.db.renamecol.html">v.db.renamecol</a>,
+  <a href="v.what.html">v.what</a>
+</em>
+
+<p>
+See also <a href="http://grasswiki.osgeo.org/wiki/WxPython-based_GUI_for_GRASS#Attribute_table_manager">wiki</a> page.
+
+
+<h2>AUTHORS</h2>
+
+<a href="http://geo.fsv.cvut.cz/gwiki/Landa">Martin Landa</a>, <a href="http://www.fbk.eu">FBK-irst</a> (2007-2008), Trento, Italy, and <a href="http://www.cvut.cz">Czech Technical University in Prague</a>, Czech Republic<br>
+Michael Barton, Arizona State University, USA<br>
+Jachym Cepicky
+
+<p>
+<i>$Date: 2013-04-17 23:12:55 -0700 (Wed, 17 Apr 2013) $</i>
+<HR>
+<P><a href="index.html">Main index</a> - <a href="wxGUI.html">wxGUI index</a> - <a href="full_index.html">Full index</a></P>
+<P>© 2003-2013 <a href="http://grass.osgeo.org">GRASS Development Team</a></p>
+</body>
+</html>
diff --git a/gui/wxpython/docs/wxGUI.Components.html b/gui/wxpython/docs/wxGUI.Components.html
new file mode 100644
index 0000000..f39695f
--- /dev/null
+++ b/gui/wxpython/docs/wxGUI.Components.html
@@ -0,0 +1,14 @@
+<p>
+List of <em><a href="wxGUI.html">wxGUI</a></em> components:
+
+<ul>
+  <li><a href="wxGUI.Nviz.html">3D Viewer</a></li>
+  <li><a href="wxGUI.Attribute_Table_Manager.html">Attribute Table Manager</a></li>
+  <li><a href="wxGUI.PsMap.html">Cartographic Composer</a></li>
+  <li><a href="wxGUI.Modeler.html">Graphical Modeler</a></li>
+  <li><a href="wxGUI.GCP_Manager.html">Ground Control Points Manager</a></li>
+  <li><a href="wxGUI.Vector_Digitizer.html">Vector Digitizer</a></li>
+</ul>
+
+<p>
+<i>$Date: 2012-08-20 05:40:31 -0700 (Mon, 20 Aug 2012) $</i>
diff --git a/gui/wxpython/docs/wxGUI.Components.tmp.html b/gui/wxpython/docs/wxGUI.Components.tmp.html
new file mode 100644
index 0000000..d68394a
--- /dev/null
+++ b/gui/wxpython/docs/wxGUI.Components.tmp.html
@@ -0,0 +1,31 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>GRASS GIS Manual: wxGUI.Components</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="stylesheet" href="grassdocs.css" type="text/css">
+</head>
+<body bgcolor="white">
+<img src="grass_logo.png" alt="GRASS logo"><hr align=center size=6 noshade>
+<h2>NAME</h2>
+<em><b>wxGUI.Components</b></em>
+
+<p>
+List of <em><a href="wxGUI.html">wxGUI</a></em> components:
+
+<ul>
+  <li><a href="wxGUI.Nviz.html">3D Viewer</a></li>
+  <li><a href="wxGUI.Attribute_Table_Manager.html">Attribute Table Manager</a></li>
+  <li><a href="wxGUI.PsMap.html">Cartographic Composer</a></li>
+  <li><a href="wxGUI.Modeler.html">Graphical Modeler</a></li>
+  <li><a href="wxGUI.GCP_Manager.html">Ground Control Points Manager</a></li>
+  <li><a href="wxGUI.Vector_Digitizer.html">Vector Digitizer</a></li>
+</ul>
+
+<p>
+<i>$Date: 2012-08-20 05:40:31 -0700 (Mon, 20 Aug 2012) $</i>
+<HR>
+<P><a href="index.html">Main index</a> - <a href="wxGUI.html">wxGUI index</a> - <a href="full_index.html">Full index</a></P>
+<P>© 2003-2013 <a href="http://grass.osgeo.org">GRASS Development Team</a></p>
+</body>
+</html>
diff --git a/gui/wxpython/docs/wxGUI.GCP_Manager.tmp.html b/gui/wxpython/docs/wxGUI.GCP_Manager.tmp.html
new file mode 100644
index 0000000..e1dcc83
--- /dev/null
+++ b/gui/wxpython/docs/wxGUI.GCP_Manager.tmp.html
@@ -0,0 +1,331 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>GRASS GIS Manual: wxGUI.GCP_Manager</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="stylesheet" href="grassdocs.css" type="text/css">
+</head>
+<body bgcolor="white">
+<img src="grass_logo.png" alt="GRASS logo"><hr align=center size=6 noshade>
+<h2>NAME</h2>
+<em><b>wxGUI.GCP_Manager</b></em>
+
+<h2>DESCRIPTION</h2>
+
+<p>
+The <b>GCP Manager</b> is a <em><a href="wxGUI.html">wxGUI</a></em>
+extension which allows the user to create, edit, and manage
+Ground Control Points. It is available from the menu
+"File | Manage Ground Control Points".
+
+<p>
+The <b>GCP Manager</b> provides an interactive graphical interface to
+manage and analyze Ground Control Points. A backup copy of the initial
+POINTS file is always maintained and updated only on request (Save GCPs
+to POINTS file). This guarantees that accidential changes are not
+permanent and can be undone by reloading the Ground Control Points.
+
+<p>
+The GCP Manager must be started in the target location, not in the
+source location.
+
+<p>
+The GCP Manager is structured into three panels:
+
+<ul>
+  <li>The topmost panel shows a list of Ground Control Points. Tools to
+  manipulate and analyze GCPs are provided in the toolbar. This panel can
+  be moved out of the GCP manager window by either dragging with the
+  caption or by clicking on the pin button on the right in the caption.
+  This panel can also be placed below the map displays by dragging.
+  <li>The two panels in the lower part are used for map and GCP display,
+  the left pane showing a map from the source location and the right
+  pane showing a reference map from the target location. Numbered Ground
+  Control Points are shown on both map displays.
+</ul>
+
+
+
+<h3>Components of the GCP Manager</h3>
+
+<center>
+  <br><img src="wxGUI_GCP_Manager.jpg" border="0" alt="GCP Manager"><br><br>
+</center>
+
+<p>
+<em>Toolbars</em>
+<p>
+Two toolbars are provided with the GCP Manager, one for managing the map
+displays and one for managing the GCP list.
+
+<p>
+<em>List of ground control points</em>
+<p>
+The list of Ground Control Points can be sorted by clicking on a column 
+header. Clicking on a cloumn header will sort the GCPs ascending, a
+second click on the same column will sort the GCPs descending. Overall
+RMS error and individual RMS errors of all points are often improved if
+the GCP with the highest RMS error is adjusted. Individual coordinates
+can be edited by double-clicking on a row.
+<p>
+The first column holds a checkbox and displays the point number. A GCP
+is only used for RMS error calculation and georectification if its
+checkbox on the left is checked. Uncheck to deactivate a GCP (mark as
+unused GCP).
+
+<p>
+<em>Two panels for map display</em>
+<p>
+The left panel is used to display a map from the source location, the
+right panel to display a map from the target loaction. Zooming in and
+out is always possible with the mouse wheel and done for each map canvas
+separately.
+<p>
+GCPs are displayed in different colors, depending on whether a GCP has
+a high RMS error, is currently unused or is currently selected. Optionally,
+currently unused GCPs are not shown on the map display.
+
+<p>
+<em>Statusbar</em>
+<p>
+At the bottom of the GCP Manager is a statusbar providing several
+functions. The default is set to <em>Go to GCP No.</em> (see also below).
+Typing a number or using the up/down arrows will center the maps on the
+given GCP, useful with a high zoom.
+
+<h4>GCP Map Display Toolbar</h4>
+
+<dl>
+
+<dt><img src="icons/show.png"> 
+  <em>Display map</em></dt>
+<dd>Displays maps for source and target canvas and re-renders any layers
+that have changed since the last time the display was updated.</dd>
+
+<dt><img src="icons/layer-redraw.png"> 
+  <em>Re-render map</em></dt>
+<dd>Re-renders both source and target canvas regardless of whether they
+have changed or not.</dd>
+
+<dt><img src="icons/erase.png"> 
+  <em>Erase display</em></dt>
+<dd>Erases both source and target canvas to a white background.</dd>
+
+<dt><img src="icons/gcp-create.png"> 
+  <em>Define GCP (Ground Control Points)</em></dt>
+<dd>On left mouse click, coordinates are defined for the currently
+selected GCP.</dd>
+
+<dt><img src="icons/pan.png"> 
+  <em>Pan</em></dt>
+<dd>Interactive selection of a new center of view in the active
+display monitor. Drag the pan cursor while pressing the left mouse
+button to pan. Alternatively left-click on the new center. Panning
+changes the location of the region displayed but not the size of the
+area displayed or the resolution.</dd>
+
+<dt><img src="icons/zoom-in.png"> 
+  <em>Zoom in</em></dt>
+<dd>Interactive zooming with the mouse in the active map canvas (source 
+or target). Drawing a box or just a left click with the mouse and zoom-in
+cursor causes the display to zoom in so that the area defined by the box
+fills the display. The map resolution is not changed. Clicking with the
+zoom-in cursor causes the display to zoom in by 30%, centered on the
+point where the mouse is clicked. Zooming changes the display region
+extents (both size and location of area displayed).</dd>
+
+<dt><img src="icons/zoom-out.png"> 
+  <em>Zoom out</em></dt>
+<dd>Interactive zooming with the mouse in the active map canvas (source 
+or target). Drawing a box or just a left click with the mouse and zoom-out
+cursor causes the display to zoom out so that the area displayed
+shrinks to fill the area defined by the box. The map resolution is not
+changed. Clicking with the zoom-out cursor causes the display to zoom
+out by 30%, centered on the point where the mouse is clicked. Zooming
+changes the display region extents (both size and location of area
+displayed).</dd>
+
+<dt><img src="icons/zoom-more.png"> 
+  <em>Adjust display zoom</em></dt>
+<dd>Source and target display are adjusted by using the current GCPs for
+coordinate transformation:
+<br><br>
+  <dl>
+    <dt><em>Adjust source display to target display</em>
+    <dd>The extents of the source display are adjusted to the current
+    extents of the target display.
+    <dt><em>Adjust target display to source display</em>
+    <dd>The extents of the source display are adjusted to the current
+    extents of the target display.
+  </dl>
+
+<dt><em>Set active map canvas</em></dt>
+<dd>Sets the currently active map canvas (source or target). Click 
+to set active map canvas for <em>Return to previous zoom</em> or 
+<em>Zoom to extent of currently displayed map</em>. Alternatively, move
+the mouse over the map canvas to be used as active canvas.</dd>
+
+<dt><img src="icons/zoom-last.png"> 
+  <em>Return to pervious zoom</em></dt>
+<dd>Returns to the previous zoom extent. Up to 10 levels of zoom back are
+maintained.</dd>
+
+<dt><img src="icons/zoom-extent.png"> 
+<em>Zoom to extent of currently displayed map</em></dt>
+<dd>Zoom to the extent of the currently displayed map in the active map
+canvas (source or target).</dd>
+
+<dt><img src="icons/settings.png"> 
+<em>Settings</em></dt>
+<dd>Shows a settings dialog for GCP management and display:<br><br> 
+
+  <dl>
+    <dt><em>Symbology</em></dt>
+      <dd>Settings for map and GCP display:<br><br>
+
+      <dl>
+        <dt><em>Highlight highest RMS error only</em></dt>
+          <dd>Only the GCP with the highest RMS error will be displayed in
+          a different colour, both in the list of GCPs and the GCP Map Display.
+        <dt><em>Factor for RMS error threshold = M + SD * factor:</em></dt>
+          <dd>All GCPs with an RMS error larger than mean RMS + RMS standard
+          deviation * this factor will be displayed in a different colour,
+          both in the list of GCPs and the GCP Map Display. As a rule of
+          thumb, GCPs with an RMS error larger than <em>M + SD * 2</em> are
+          most probably wrong. GCPs with an RMS error larger than
+          <em>M + SD * 1</em> are worth closer inspection. This option is
+          only available if <em>Highlight highest RMS error only</em> is
+          unchecked.</dd>
+        <dt><em>Color</em></dt>
+          <dd>Set the color for GCPs on the GCP Map Display.</dd>
+        <dt><em>Color for high RMS error</em></dt>
+          <dd>Set the color for GCPs with a high RMS error on the GCP Map
+          Display.</dd>
+        <dt><em>Color for selected GCP</em></dt>
+          <dd>Set the color for the currently selected GCP on the GCP Map
+          Display.</dd>
+        <dt><em>Show unused GCPs</em></dt>
+          <dd>If unchecked, unused GCPs will not be shown on the GCP Map
+          Display.</dd>
+        <dt><em>Color for unused GCPs</em></dt>
+          <dd>Set the color for unused GCPs on the GCP Map Display.</dd>
+        <dt><em>Symbol size</em></dt>
+          <dd>Set the symbol size for GCPs on the GCP Map Display.</dd>
+        <dt><em>Line width</em></dt>
+          <dd>Set the line width for GCPs on the GCP Map Display.</dd>
+        <dt><em>Select source map to display</em></dt>
+          <dd>Select a source map for the left pane of the GCP Map Display.</dd>
+        <dt><em>Select target map to display</em></dt>
+          <dd>Select a target map for the right pane of the GCP Map Display.</dd>
+      </dl>
+      </dd>
+
+    <dt><br><em>Rectification</em></dt>
+      <dd>Settings for georectification:<br><br>
+      <dl>
+        <dt><em>Select rectification method</em></dt>
+          <dd>Set the polynomial order for georectification. This order will
+          also be used for RMS error calculation.</dd>
+        <dt><em>Clip to computational region in target location</em></dt>
+          <dd>Clip raster maps to the current computational region in the
+          target location when georectifying.</dd>
+        <dt><em>Extension for output maps</em></dt>
+          <dd>Change the extension for output map names when doing the actual
+          georectification.</dd>
+      </dl>
+      </dd>
+  </dl><br>
+</dd>
+
+<dt><img src="icons/help.png"> 
+<em>Show Help</em></dt>
+<dd>Show help page for the GCP Manager.
+
+<dt><img src="icons/quit.png"> 
+<em>Quit</em></dt>
+<dd>Quit the GCP Manager.
+
+</dl>
+
+<h4>Toolbar for the GCP list</h4>
+
+<dl>
+
+<dt><img src="icons/gcp-save.png"> 
+<em>Save GCPs to POINTS file</em></dt>
+<dd>The current list of GCPs is saved to the imagery group's POINTS file
+and to a backup copy.</dd>
+
+<dt><img src="icons/gcp-add.png"> 
+<em>Add new GCP</em></dt>
+<dd>Adds a new Ground Control Point to the list and selects it for editing.</dd>
+
+<dt><img src="icons/gcp-delete.png"> 
+<em>Delete selected GCP</em></dt>
+<dd>Deletes the currently selected GCP from the list.</dd>
+
+<dt><img src="icons/gcp-remove.png"> 
+<em>Clear selected GCP</em></dt>
+<dd>Resets all coordinates of the currently selected GCP to 0 (zero).</dd>
+
+<dt><img src="icons/reload.png"> 
+<em>Reload GCPs from POINTS file</em></dt>
+<dd>Reloads GCPs from the imagery group's POINTS file.</dd>
+
+<dt><img src="icons/gcp-rms.png"> 
+<em>Recalculate RMS error</em></dt>
+<dd>Recalculates forward and backward RMS error for all GCP marked for
+use (activated checkbox in first row).
+</dd>
+
+<dt><img src="icons/georectify.png"> 
+<em>Georectify</em></dt>
+<dd>Uses <em><a href="i.rectify.html">i.rectify</a></em> to georectify
+all images in the source imagery group.
+</dd>
+
+</dl>
+
+<h4>GCP Map Display Statusbar</h4>
+
+The GCP map display statusbar is similar to the statusbar in the regular
+GRASS GIS map display with two differences, <em>Go to</em> has been
+replaced with <em>Go to GCP No.</em> and <em>Projection</em> has been
+replaced with <em>RMS error</em>.
+<p>
+If <em>Go to GCP No.</em> is selected, a GCP number can be given in the
+left side of the statusbar and the source and target map canvas will be
+centered on the given GCP. Clicking on the map canvas will update
+coordinates for this GCP.
+<p>
+If <em>RMS error</em> is selected, the overall forward and backward RMS
+error is displayed.
+
+<h2>SEE ALSO</h2>
+
+<em>
+  <a href="wxGUI.html">wxGUI</a><br>
+  <a href="wxGUI.Components.html">wxGUI components</a>
+</em>
+
+<p>
+<em>
+  <a href="i.rectify.html">i.rectify</a>,
+  <a href="g.transform.html">g.transform</a>
+</em>
+
+<h2>AUTHORS</h2>
+
+Markus Metz<br><br>
+<em>Based on the Georectifier (GRASS 6.4.0) by</em><br>
+Michael Barton<br>
+<a href="http://geo.fsv.cvut.cz/gwiki/Landa">Martin Landa</a>, <a
+href="http://www.cvut.cz">Czech Technical University in Prague</a>, Czech Republic
+
+<p>
+<i>$Date: 2012-02-19 12:31:20 -0800 (Sun, 19 Feb 2012) $</i>
+<HR>
+<P><a href="index.html">Main index</a> - <a href="wxGUI.html">wxGUI index</a> - <a href="full_index.html">Full index</a></P>
+<P>© 2003-2013 <a href="http://grass.osgeo.org">GRASS Development Team</a></p>
+</body>
+</html>
diff --git a/gui/wxpython/docs/wxGUI.Modeler.tmp.html b/gui/wxpython/docs/wxGUI.Modeler.tmp.html
new file mode 100644
index 0000000..1b940d1
--- /dev/null
+++ b/gui/wxpython/docs/wxGUI.Modeler.tmp.html
@@ -0,0 +1,76 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>GRASS GIS Manual: wxGUI.Modeler</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="stylesheet" href="grassdocs.css" type="text/css">
+</head>
+<body bgcolor="white">
+<img src="grass_logo.png" alt="GRASS logo"><hr align=center size=6 noshade>
+<h2>NAME</h2>
+<em><b>wxGUI.Modeler</b></em>
+
+<h2>DESCRIPTION</h2>
+
+Note: <b>wxGUI Modeler is currently under development. It's provided as
+an experimental prototype.</b>
+
+<p>
+The <b>Graphical Modeler</b> is
+a <em><a href="wxGUI.html">wxGUI</a></em> compoment which allows the
+user to create, edit, and manage models. The modeler can be launched
+from the menu <tt>File -> Graphical modeler</tt> or by clicking on
+icon <img src="icons/modeler-main.png"> in the toolbar.
+
+<p>
+The modeler currently allows you to:
+
+<ul>
+  <li>define data items (raster, vector, 3D raster maps)</li>
+  <li>define actions (GRASS commands)</li>
+  <li>define relations between data and action items</li>
+  <li>define loops (eg. map series) and conditions (if-else statements)</li>
+  <li>define model variables</li>
+  <li>parameterize commands</li>
+  <li>define intermediate data</li>
+  <li>validate and run model</li>
+  <li>store model properties to the file (<tt>GRASS Model File|*.gxm</tt>)</li>
+  <li>export model to Python script</li>
+  <li>export model to image file</li>
+</ul>
+
+<center>
+<br><img src="wxGUI_modeler.jpg" border="1"><br><br>
+</center>
+
+
+<h2>SEE ALSO</h2>
+
+<em>
+  <a href="wxGUI.html">wxGUI</a><br>
+  <a href="wxGUI.Components.html">wxGUI components</a>
+</em>
+
+<p>
+User-defined models available
+from <a href="http://svn.osgeo.org/grass/grass-addons/models">SVN</a>.
+
+<p>
+See also
+user <a href="http://grasswiki.osgeo.org/wiki/WxGUI_Modeler">wiki</a> page
+(especially various <a href="http://grasswiki.osgeo.org/wiki/WxGUI_Modeler#Video_tutorials">video
+tutorials</a>).
+
+
+<h2>AUTHORS</h2>
+
+<a href="http://geo.fsv.cvut.cz/gwiki/Landa">Martin Landa</a>, <a
+href="http://www.cvut.cz">Czech Technical University in Prague</a>, Czech Republic
+
+<p>
+<i>$Date: 2013-04-17 23:12:55 -0700 (Wed, 17 Apr 2013) $</i>
+<HR>
+<P><a href="index.html">Main index</a> - <a href="wxGUI.html">wxGUI index</a> - <a href="full_index.html">Full index</a></P>
+<P>© 2003-2013 <a href="http://grass.osgeo.org">GRASS Development Team</a></p>
+</body>
+</html>
diff --git a/gui/wxpython/docs/wxGUI.Nviz.tmp.html b/gui/wxpython/docs/wxGUI.Nviz.tmp.html
new file mode 100644
index 0000000..b4ad0d3
--- /dev/null
+++ b/gui/wxpython/docs/wxGUI.Nviz.tmp.html
@@ -0,0 +1,421 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>GRASS GIS Manual: wxGUI.Nviz</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="stylesheet" href="grassdocs.css" type="text/css">
+</head>
+<body bgcolor="white">
+<img src="grass_logo.png" alt="GRASS logo"><hr align=center size=6 noshade>
+<h2>NAME</h2>
+<em><b>wxGUI.Nviz</b></em>
+
+<h2>DESCRIPTION</h2>
+
+Note: <b>wxGUI 3D view mode is currently under development. It's
+provided as an experimental prototype.</b>
+
+<p>
+<b>wxNviz</b> is a <em><a href="wxGUI.html">wxGUI</a></em> <b>3D view
+mode</b> which allows users to realistically render multiple
+<em>surfaces</em> (raster data) in a 3D space, optionally using
+thematic coloring, draping 2D <em>vector</em> data over the surfaces,
+displaying 3D vector data in the space, and visualization
+of <em>volume</em> data (3D raster data).
+
+<p>
+To start the wxGUI 3D view mode, choose '3D view' from the map
+toolbar. You can switch between 2D and 3D view. The region in 
+3D view is updated according to displayed region in 2D view.
+<p>
+wxNviz is emphasized on the ease and speed of viewer positioning and
+provided flexibility for using a wide range of data. A low resolution
+surface or wire grid (optional) provides real-time viewer positioning
+capabilities. Coarse and fine resolution controls allow the user to
+further refine drawing speed and detail as needed. Continuous scaling
+of elevation provides the ability to use various data types for the
+vertical dimension.
+
+<p>
+For each session of wxNviz, you might want the same set of 2D/3D
+raster and vector data, view parameters, or other attributes. For
+consistency between sessions, you can store this information in the
+GRASS <em>workspace</em> file (gxw). Workspace contains information to
+restore "state" of the system in 2D and if wxNviz is enabled also in
+the 3D display mode.
+
+<h2>3D View Toolbar</h2>
+
+<center>
+<br><img src="wxGUI_nviz_toolbar.jpg" border="1"><br><br>
+</center>
+
+<dl>
+  <dt><img src="icons/script-save.png"> 
+    <em>Generate command for m.nviz.image</em></dt>
+  <dd>Generate command for m.nviz.image based on current state.</dd>
+  <dt><img src="icons/settings.png"> 
+    <em>Show 3D view mode settings</em></dt>
+  <dd>Show dialog with settings for wxGUI 3D view mode. The user
+  settings can be stored in wxGUI settings file.</dd>
+  <dt><img src="icons/help.png"> 
+    <em>Show help</em></dt>
+  <dd>Show this help.</dd>
+</dl>
+
+<h2>3D View Layer Manager Toolbox</h2>
+
+The 3D view toolbox is integrated in the Layer Manager. The toolbox
+has several tabs:
+
+<ul>
+  <li><b>View</b> for view controlling,</li>
+  <li><b>Data</b> for data properties,</li>
+  <li><b>Appearance</b> for appearance settings (lighting, fringes, ...).</li>
+  <li><b>Analysis</b> for various data analyses (only cutting planes so far).</li>
+  <li><b>Animation</b> for creating simple animations.</li>
+</ul>
+
+<h3>View</h3>
+
+You can use this panel to set the <em>position, direction, and
+  perspective</em> of the view. The position box shows a puck with a
+  direction line pointing to the center. The direction line indicates
+  the look direction (azimuth). You click and drag the puck to change
+  the current eye position. Another way to change eye position is
+  to press the buttons around the position box representing cardinal
+  and ordinal directions. 
+  
+<p>
+There are four other buttons for view control in the bottom of this panel
+(following label <em>Look:</em>):
+<ul>
+  <li><em>here</em> requires you to click on Map Display Window to determine
+   the point to look at.</li>
+   <li><em>center</em> changes the point you are looking at to the center.</li>
+   <li><em>top</em> moves the current eye position above the map center.</li>
+   <li><em>reset</em> returns all current view settings to their default values.</li>
+</ul>
+
+<center>
+  <br><img src="wxGUI_nviz_tools_view.jpg" border="1"><br><br>
+</center>
+
+You can adjust the viewer's height above the scene, perspective and
+twist value to rotate the scene about the horizontal axis. An angle of
+0 is flat. The scene rotates between -90 and 90 degrees.
+
+<p>
+You can also adjusts the vertical exaggeration of the surface. As an
+example, if the easting and northing are in meters and the elevation
+in feet, a vertical exaggeration of 0.305 would produce a true
+(unexaggerated) surface.
+<p>
+View parameters can be controlled by sliders or edited directly in text box.
+It's possible to enter values which are out of slider's range (and it will 
+adjust then).
+
+<h4>Fly-through mode</h4>
+View can be changed in fly-through mode (can be activated in Map Display toolbar),
+which enables to change the view smoothly and therefore it is suitable
+for creating animation (see below). To start flying, press left mouse button
+and hold it down to continue flying. Flight direction is controlled by mouse cursor
+position on screen. Flight speed can be increased/decreased stepwise by keys
+PageUp/PageDown, Home/End or Up/Down arrows.
+Speed is increased multiple times while Shift key is held down. Holding down
+Ctrl key switches flight mode in the way that position of viewpoint is
+changed (not the direction).
+
+<h3>Data properties</h3> 
+This tab controls the parameters related to map layers. It consists
+of four collapsible panels - <em>Surface</em>, <em>Constant surface</em>, 
+<em>Vector</em> and <em>Volume</em>.
+
+<h4>Surface</h4>
+
+Each active raster map layer from the current layer tree is displayed
+as surface in the 3D space. This panel controls how loaded surfaces are drawn.
+To change parameters of a surface, it must be selected in the very top part of the
+panel.
+<p>
+The top half of the panel has drawing style options.
+Surface can be drawn as a wire mesh or using filled polygons (most
+realistic). You can set draw <b>mode</b> to <em>coarse</em> (fast
+display mode), <em>fine</em> (draws surface as filled polygons with
+fine resolution) or <em>both</em> (which combines coarse and fine
+mode). Additionally set coarse <b>style</b> to <em>wire</em> to draw
+the surface as wire mesh (you can also choose color of the wire)
+or <em>surface</em> to draw the surface using coarse resolution filled
+polygons. This is a low resolution version of the polygon surface
+style.
+
+E.g. surface is drawn as a wire mesh if you set <b>mode</b>
+to <em>coarse</em> and <b>style</b> to <em>wire</em>. Note that it
+differs from the mesh drawn in fast display mode because hidden lines
+are not drawn. To draw the surface using filled polygons, but with
+wire mesh draped over it, choose <b>mode</b> <em>both</em>
+and <b>style</b> <em>wire</em>.
+
+Beside mode and style you can also choose style of <b>shading</b> used
+for the surface. <em>Gouraud</em> style draws the surfaces with a
+smooth shading to blend individual cell colors together, <em>flat</em>
+draws the surfaces with flat shading with one color for every two
+cells. The surface appears faceted.
+
+<p>
+To set given draw settings for all loaded surfaces press button "Set to all".
+
+<p>
+The bottom half of the panel has options to set, unset or modify attributes
+of the current surface. Separate raster data or constants can be
+used for various attributes of the surface:
+<ul>
+  <li><b>color</b> - raster map or constant color to drape over the current
+    surface. This option is useful for draping imagery such as aerial
+    photography over a DEM.</li>
+  <li><b>mask</b> - raster map that controls the areas displayed from
+    the current surface.</li>
+  <li><b>transparency</b> - raster map or constant value that controls
+    the transparency of the current surface. The default is completely
+    opaque. Range from 0 (opaque) to 100 (transparent).</li>
+  <li><b>shininess</b> - raster map or constant value that controls
+    the shininess (reflectivity) of the current surface. Range from 0 to
+    100.</li>
+</ul>
+
+<p>
+In the very bottom part of the panel position of surface can be set.
+To move the surface right (looking from the south) choose <em>X</em> axis
+and set some positive value. To reset the surface position press
+<em>Reset</em> button.
+
+<center>
+  <br><img src="wxGUI_nviz_tools_surface.jpg" border="1"><br><br>
+</center>
+
+<h4>Constant surface</h4>
+It is possible to add constant surface and set its properties like 
+fine resolution, value (height), color and transparency. It behaves 
+similarly to surface but it has less options.
+
+<h4>Vector</h4>
+
+2D vector data can be draped on the selected surfaces with various
+markers to represent point data; you can use attribute of vector
+features to determine size, color, shape of glyph.
+
+3D vector data including volumes (closed group of faces with one
+kernel inside) is also supported.
+This panel controls how loaded 2D or 3D vector data are drawn.
+
+<p>
+You can define the width (in pixels) of the line features, the color
+used for lines or point markers.
+
+<p>
+If vector map is 2D you can display vector features as flat at a
+specified elevation or drape it over a surface(s) at a specified
+height. Use the height control to set the flat elevation or the drape
+height above the surface(s). In case of multiple surfaces it is possible
+to specify which surfaces is the vector map draped over.
+
+<p>
+For display purposes, it is better to set the height slightly above
+the surface. If the height is set at zero, portions of the vector may
+disappear into the surface(s).
+
+<p>
+For 2D/3D vector points you can also set the size of the markers.
+<!-- and the width (in pixels) of the line used to draw the point markers (only
+applies to wire-frame markers). -->
+ Currently are implemented these markers:
+
+<ul>
+  <li><b>x</b> sets the current points markers to a 2D "X",</li>
+  <li><b>sphere</b> - solid 3D sphere,</li>
+  <li><b>diamond</b> - solid 3D diamond,</li>
+  <li><b>cube</b> - solid 3D cube,</li>
+  <li><b>box</b> - hollow 3D cube,</li>
+  <li><b>gyroscope</b> - hollow 3D sphere,</li>
+  <li><b>asterisk</b> - 3D line-star.</li>
+</ul>
+ 
+<p>
+Thematic mapping can be used to determine marker color and size
+(and line color and width).
+
+<center>
+  <br><img src="wxGUI_nviz_tools_vector.jpg" border="1"><br><br>
+</center>
+
+<h4>Volume</h4>
+
+Volumes (3D raster maps) can be displayed either as isosurfaces or slices.
+Similarly to surface panel you can define draw <b>shading</b>
+- <em>gouraud</em> (draws the volumes with a smooth shading to blend
+individual cell colors together) and <em>flat</em> (draws the volumes
+with flat shading with one color for every two cells. The volume
+appears faceted). As mentioned above currently are supported two
+visualization modes:
+
+<ul>
+  <li><b>isosurface</b> - the levels of values for drawing the
+  volume(s) as isosurfaces,</li>
+  <li>and <b>slice</b> -  drawing the volume
+  as cross-sections.</li>
+</ul>
+<p>
+The middle part of the panel has controls to add, delete, move up/down selected 
+isosurface or slice. The bottom part differs for isosurface and slice. 
+When choosing isosurface, this part the of panel has options to set, unset
+or modify attributes of the current isosurface. 
+Various attributes of the isosurface can be defined, similarly to surface
+attributes:
+
+<ul>
+  <li><b>isosurface value</b> - reference isosurface value (height in map
+  units).</li>
+  <li><b>color</b> - raster map or constant color to drape over the
+  current volume.</li>
+  <li><b>mask</b> - raster map that controls the areas displayed from
+    the current volume.</li>
+  <li><b>transparency</b> - raster map or constant value that controls
+    the transparency of the current volume. The default is completely
+    opaque. Range from 0 (opaque) to 100 (transparent).</li>
+  <li><b>shininess</b> - raster map or constant value that controls
+    the shininess (reflectivity) of the current volume. Range from 0 to
+    100.</li>
+</ul>
+
+In case of volume slice the bottom part of the panel controls the slice 
+attributes (which axis is slice parallel to, position of slice edges,
+transparency). Press button <em>Reset</em> to reset slice position
+attributes.
+<p>
+Volumes can be moved the same way like surfaces do.
+
+<center>
+  <br><img src="wxGUI_nviz_tools_volume.jpg" border="1"><br><br>
+</center>
+
+<h3>Analysis</h3>
+<em>Analysis</em> tab contains <em>Cutting planes</em> panel.
+
+<h4>Cutting planes</h4>
+Cutting planes allow to cut surfaces along a plane. You can switch 
+between six planes; to disable cutting planes switch to <em>None</em>.
+Initially the plane is vertical, you can change it to horizontal by setting
+<em>tilt</em> 90 degrees. The <em>X</em> and <em>Y</em> values specify
+the rotation center of plane. You can see better what <em>X</em> and <em>Y</em>
+do when changing <em>rotation</em>. 
+<em>Height</em> parameter has sense only when changing 
+<em>tilt</em> too. Press button <em>Reset</em> to reset current cutting plane.
+<p>
+In case of multiple surfaces you can visualize the cutting plane by
+<em>Shading</em>. Shading is visible only when more than one surface
+is loaded and these surfaces must have the same fine resolution set.
+
+
+
+<h3>Appearance</h3>
+Appearance tab consists of three collapsible panels:
+
+<ul>
+  <li><em>Lighting</em> for adjusting light source</li>
+  <li><em>Fringe</em> for drawing fringes
+  <li><em>Decorations</em> to display north arrow and scale bar</li>
+</ul>
+<p>
+The <em>lighting</em> panel enables to change the position of light
+source, light color, brightness and ambient. Light position is controlled 
+similarly to eye position. If option <em>Show light model</em> is enabled
+light model is displayed to visualize the light settings.
+
+<center>
+  <br><img src="wxGUI_nviz_tools_light.jpg" border="1"><br><br>
+</center>
+<p>
+The <em>Fringe</em> panel allows you to draw fringes in different directions
+(North & East, South & East, South & West, North & West). It is possible
+to set fringe color and height of the bottom edge.
+<p>
+The <em>Decorations</em> panel enables to display north arrow and simple
+scale bar. North arrow and scale bar length is determined in map units. 
+You can display more than one scale bar.
+
+<h3>Animation</h3>
+Animation panel enables to create a simple animation as a sequence of images.
+Press 'Record' button and start changing the view. Views are
+recorded in given interval (FPS - Frames Per Second). After recording,
+the animation can be replayed. To save the animation, fill in the
+directory and file prefix, choose image format (PPM or TIF) and then
+press 'Save'. Now wait until the last image is generated.
+
+It is recommended to record animations using fly-through mode to achieve
+smooth motion.
+
+<h2>Settings</h2>
+
+This panel has controls which allows user to set default surface,
+vector and volume data attributes. You can also modify default view
+parameters, or to set the background color of the Map Display Window
+(the default color is white).
+
+
+<h2>To be implement</h2>
+
+<ul>
+  <li>Labels, decoration, etc. (Implemented, but not fully functional)</li>
+  <li>Surface - mask by zero/elevation, more interactive positioning</li>
+  <li>Vector points - implement display mode flat/surface for 2D points</li>
+  <li>...</li>
+</ul>
+
+
+<h2>NOTE</h2>
+wxNviz is under active development and
+distributed as "Experimental Prototype".
+
+<p>
+Please note that with wxGTK port of wxPython (Linux systems),
+a problem might appear during wxNviz initialization (nothing is rendered at all)
+or when rendering vectors (bad order of rendering surfaces and vectors).
+If you encounter such problems, try to change a depth buffer number
+in GUI Settings > Map Display  > Advanced (possible numbers are 0, 16, 24, 32).
+It is currently not possible to automatically find out the right number which is working for your computer.
+</p>
+
+<h2>SEE ALSO</h2>
+
+<em>
+  <a href="wxGUI.html">wxGUI</a><br>
+  <a href="wxGUI.Components.html">wxGUI components</a>
+</em>
+
+<p>
+See also <a href="http://grasswiki.osgeo.org/wiki/WxNVIZ">wiki</a> page
+(especially various <a href="http://grasswiki.osgeo.org/wiki/WxNVIZ#Video_tutorials">video
+tutorials</a>).
+
+<br><br>
+
+Command-line module <em><a href="m.nviz.image.html">m.nviz.image</a></em>.
+<br><br>
+
+Original <a href="nviz.html">TCL/TK-based</a> Nviz.
+
+<h2>AUTHORS</h2>
+
+<a href="http://geo.fsv.cvut.cz/gwiki/Landa">Martin
+Landa</a>, <a href="http://grasswiki.osgeo.org/wiki/WxNviz_GSoC_2008">Google
+Summer of Code 2008</a> (mentor: Michael Barton)
+and <a href="http://grasswiki.osgeo.org/wiki/WxNviz_GSoC_2010">Google
+Summer of Code 2010</a> (mentor: Helena Mitasova)
+
+<p>
+<i>$Date: 2013-04-29 00:06:19 -0700 (Mon, 29 Apr 2013) $</i>
+<HR>
+<P><a href="index.html">Main index</a> - <a href="wxGUI.html">wxGUI index</a> - <a href="full_index.html">Full index</a></P>
+<P>© 2003-2013 <a href="http://grass.osgeo.org">GRASS Development Team</a></p>
+</body>
+</html>
diff --git a/gui/wxpython/docs/wxGUI.PsMap.tmp.html b/gui/wxpython/docs/wxGUI.PsMap.tmp.html
new file mode 100644
index 0000000..80b157f
--- /dev/null
+++ b/gui/wxpython/docs/wxGUI.PsMap.tmp.html
@@ -0,0 +1,221 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>GRASS GIS Manual: wxGUI.PsMap</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="stylesheet" href="grassdocs.css" type="text/css">
+</head>
+<body bgcolor="white">
+<img src="grass_logo.png" alt="GRASS logo"><hr align=center size=6 noshade>
+<h2>NAME</h2>
+<em><b>wxGUI.PsMap</b></em>
+
+<h2>DESCRIPTION</h2>
+
+<b>Note:</b> <em>wxGUI Cartographic Composer is currently under
+development.</em>
+
+<p>
+<b>wxGUI Cartographic Composer</b> also called <em>wx.psmap</em> is
+a <em><a href="wxGUI.html">wxGUI</a></em> extension which allows the
+user to create interactively hardcopy map outputs. This tool
+generates <em><a href="ps.map.html">ps.map</a></em> configuration file
+and then runs <em><a href="ps.map.html">ps.map</a></em> to create
+PostScript output. There are two modes - <em>Draft mode</em> for map
+composing and <em>Preview mode</em>
+(requires <a href="http://www.pythonware.com/products/pil/">Python
+Imaging Library</a>) to see how the result will look like. In draft
+mode map features (like legend or scalebar) are represented by a
+colored rectangle with a label.
+
+<p>
+Possible output files:</p>
+<ul>
+  <li> <em><a href="ps.map.html">ps.map</a></em> instructions file
+  <li> PostScript/EPS file
+  <li> PDF (using ps2pdf)
+</ul>
+
+<p>
+Cartographic Composer enables to load in saved instructions file. It
+works better with files created by wx.psmap (more tested).</p>
+
+<p>
+Currently supported <em><a href="ps.map.html">ps.map</a></em> instructions:</p>
+
+<ul>
+  <li> paper
+  <li> maploc
+  <li> scale
+  <li> border
+  <li> raster
+  <li> colortable
+  <li> vpoints
+  <li> vlines
+  <li> vareas
+  <li> vlegend
+  <li> text
+  <li> scalebar
+  <li> mapinfo
+  <li> point
+  <li> line
+  <li> rectangle
+</ul>
+
+
+<h3>CARTOGRAPHIC COMPOSER TOOLBAR</h3>
+<dl>
+  <dt><img src="icons/script-save.png"> 
+    <em>Generate instructions file</em></dt>
+  <dd>Generates and saves text file with mapping instructions.</dd>
+  
+  <dt><img src="icons/script-load.png"> 
+    <em>Load instructions file</em></dt>
+  <dd>Load text file with mapping instructions.</dd>
+  
+  <dt><img src="icons/page-settings.png"> 
+    <em>Page setup</em></dt>
+  <dd>Specify paper size, margins and orientation.</dd>
+  
+  <dt><img src="icons/pointer.png"> 
+    <em>Pointer</em></dt>
+  <dd>Select object on the paper by clicking, drag the cursor while pressing the left mouse button to move it or resize object (currently only map frame) by clicking on a small black box in its bottom right corner. Double click to show object properties dialog</dd>
+    
+  <dt><img src="icons/pan.png"> 
+    <em>Pan</em></dt>
+  <dd>Drag the pan cursor while pressing the left mouse button to move your view. </dd>
+
+
+  <dt><img src="icons/zoom-in.png"> 
+    <em>Zoom in</em></dt>
+  <dd>Interactive zooming with the mouse in both draft and preview mode. Drawing a box or just a left click with the mouse and zoom-in cursor causes the display to zoom in so that the area defined by the box fills the display.</dd>
+
+
+  <dt><img src="icons/zoom-out.png"> 
+    <em>Zoom out</em></dt>
+  <dd>Interactive zooming with the mouse in both draft and preview mode. Drawing a box or just a left click with the mouse and zoom-out cursor causes the display to zoom out so that the area displayed shrinks to fill the area defined by the box.</dd>
+  
+  <dt><img src="icons/zoom-extent.png"> 
+    <em>Zoom to page</em></dt>
+  <dd>Zoom to display the entire page </dd>
+  
+  
+  <dt><img src="icons/layer-add.png"> 
+    <em>Map frame</em></dt>
+  <dd>Click and drag to place map frame. If map frame is already drawn, open a dialog to set its properties. </dd>
+  
+  <dt><img src="icons/layer-raster-add.png"> 
+    <em>Raster map</em></dt>
+  <dd>Shows a dialog to add or change the raster map.</dd>
+  
+  <dt><img src="icons/layer-vector-add.png"> 
+    <em>Vector map</em></dt>
+  <dd>Shows a dialog to add or change current vector maps and their properties:
+    <dl>
+      <dt><em>Data selection</em></dt>
+        <dd>Select data to draw:
+        
+        <dl>
+          <dt><em>Feature type</em></dt>
+            <dd> Select which data type to draw. In case of point data, points or centroids
+            can be drawn, in case of line data, lines or boundaries. </dd>
+          <dt><em>Layer selection</em></dt>
+            <dd>Select layer and limit data by a SQL query or chose only certain categories.</dd>
+          <dt><em>Mask</em></dt>
+            <dd>Whether to use mask or not.</dd>
+        </dl> 
+        </dd>
+      
+      <dt><em>Colors</em></dt>
+        <dd>Color settings:
+                
+        <dl>
+          <dt><em>Outline</em></dt>
+            <dd> Select outline color and width in points. In case of lines, outline means highlighting.</dd>
+          <dt><em>Fill</em></dt>
+            <dd>Select fill color, one color for all vector elements or color from rgb column.</dd>
+        </dl> 
+      </dd>
+      <dt><em>Size and style</em></dt>
+        <dd>
+        Sets size, style, symbols, pattern; depends on data type:
+        
+        <dl>
+          <dt><em>Symbology</em></dt>
+            <dd> Available for point data. Choose symbol or EPS file to draw points with.</dd>
+          <dt><em>Line style</em></dt>
+            <dd>Available for line data. Select line style (solid, dashed, ...) and the look of the ends of the line (butt, round, ...)</dd>
+          <dt><em>Pattern</em></dt>
+          <dd> Available for areas. Choose pattern file and set the width of the pattern.</dd>
+          <dt><em>Size</em></dt>
+          <dd> Available for point data. Choose size (number of times larger than the size in the icon file) as a single value or take the size from a map table column.</dd>
+          <dt><em>Rotation</em></dt>
+          <dd> Available for point data. Rotate symbols counterclockwise with the given value or with the value from a map table column</dd>
+          <dt><em>Width</em></dt>
+          <dd> Available for line data. Set line width in points or take the value from a map table column.</dd>
+        </dl> 
+      </dd>
+  
+  
+    </dl>
+    </dd>
+  
+  
+   <dt><img src="icons/overlay-add.png"> 
+    <em>Add map elements</em></dt>
+   <dd>Add map elements: legend, scalebar, map info, text 
+    <dl>
+      <dt><img src="icons/legend-add.png"> 
+        <em>Add legend</em></dt>
+      <dd>Add raster or vector legend or edit their properties.</dd>
+      <dt><img src="icons/map-info.png"> 
+        <em>Add map info</em></dt>
+      <dd>Add information about region, grid and scale or edit map info properties.</dd>
+      <dt><img src="icons/scalebar-add.png"> 
+        <em>Add scalebar</em></dt>
+      <dd>Add scalebar or edit its properties.</dd>
+      <dt><img src="icons/text-add.png"> 
+        <em>Add text</em></dt>
+      <dd>Add text label.</dd>    
+    </dl>
+    </dd>
+  <dt><img src="icons/layer-remove.png"> 
+    <em>Remove selected element</em></dt>
+  <dd>Select an object and remove it. Pressing Delete key does the same. </dd>
+  
+  <dt><img src="icons/execute.png"> 
+    <em>Show preview</em></dt>
+  <dd> Generates output and switches to Preview mode to see the result. Be patient, it can take a while.</dd>
+  
+
+  <dt><img src="icons/ps-export.png"> 
+    <em>Generate hardcopy map output in PS</em></dt>
+  <dd> Generates hardcopy map output in PostScript/EPS file.</dd>
+   <dt><img src="icons/pdf-export.png"> 
+    <em>Generate hardcopy map output in PDF</em></dt>
+  <dd> Generates hardcopy map output in PDF using ps2pdf.</dd>
+  
+</dl>
+
+
+<h2>SEE ALSO</h2>
+
+<em>
+  <a href="wxGUI.html">wxGUI</a><br>
+  <a href="wxGUI.Components.html">wxGUI components</a>
+</em>
+
+<p>
+See also <a href="http://grasswiki.osgeo.org/wiki/WxGUI_Cartographic_Composer">wiki</a> page.
+</p>
+<h2>AUTHORS</h2>
+
+Anna Kratochvilova, Czech Technical Univesity (CTU) in Prague, Czech Republic (bachelor's final project 2011, mentor: Martin Landa)
+
+<p>
+<i>$Date: 2013-02-15 14:04:18 -0800 (Fri, 15 Feb 2013) $</i></p>
+<HR>
+<P><a href="index.html">Main index</a> - <a href="wxGUI.html">wxGUI index</a> - <a href="full_index.html">Full index</a></P>
+<P>© 2003-2013 <a href="http://grass.osgeo.org">GRASS Development Team</a></p>
+</body>
+</html>
diff --git a/gui/wxpython/docs/wxGUI.Vector_Digitizer.tmp.html b/gui/wxpython/docs/wxGUI.Vector_Digitizer.tmp.html
new file mode 100644
index 0000000..ba41059
--- /dev/null
+++ b/gui/wxpython/docs/wxGUI.Vector_Digitizer.tmp.html
@@ -0,0 +1,277 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>GRASS GIS Manual: wxGUI.Vector_Digitizer</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="stylesheet" href="grassdocs.css" type="text/css">
+</head>
+<body bgcolor="white">
+<img src="grass_logo.png" alt="GRASS logo"><hr align=center size=6 noshade>
+<h2>NAME</h2>
+<em><b>wxGUI.Vector_Digitizer</b></em>
+
+<h2>DESCRIPTION</h2>
+
+The <b>vector digitizer</b> is
+a <em><a href="wxGUI.html">wxGUI</a></em> component intended for
+interactive editing vector maps
+(see <em><a href="v.edit.html">v.edit</a></em> for non-interactive
+vector editing GRASS capabilities).
+
+<p>
+The digitizer supports editing of 2D vector features (points, lines, centroids,
+boundaries, and area).
+
+Vector features can be selected using mouse or by query (e.g. minimal
+vector line length). Vector features can be selected by bounding box
+or simply by mouse click (based on 'Settings->General->Select
+threshold' value).
+
+<p>
+Vector digitizer can be activated from Main toolbar in Map Display by
+selecting "Digitize" from "Tools" combobox. Vector map to be edited
+can be afterwards selected from digitizer toolbar ("Select vector map"
+combobox, note that only vector maps from the current layer tree in Layer
+Manager are available).
+
+Vector digitizer can be alternatively also activated from contextual
+menu in Layer Manager by selecting "Start editing" on selected vector
+map in the layer tree.
+
+<p>
+New vector map can be easily created from digitizer toolbar by
+selecting "New vector map" in "Select vector map" combobox. A new
+vector map is created, added to the current layer tree in Layer
+Manager and opened for editing. "Select vector map" combobox in
+digitizer toolbar also allows switching easily between vector maps to be
+edited.
+<p>
+The wxGUI vector digitizer draws all maps in the Layer Manager in the Map 
+Display window; in addition, the digitizer also recognizes a special 
+"background" vector map. This map is selected from the Layer Manager by 
+right-clicking on the map and selecting "Use as Background Map" from the
+contextual menu. The features of the background map may then be copied into
+the currently edited vector map using the "Copy features from (background) 
+vector map" button in the "Additional Tools" menu on the Digitzer Toolbar.
+
+<h3>DIGITIZER TOOLBAR</h3>
+
+<center>
+<br><img src="wxGUI_vector_digitizer_toolbar.jpg" border="1"><br><br>
+</center>
+
+<dl>
+  <dt><img src="icons/point-create.png"> 
+    <em>Digitize new point</em></dt>
+  <dd>Add new point to vector map and optionally define its
+    attributes.</dd>
+  
+  <dt><img src="icons/line-create.png"> 
+    <em>Digitize new line</em></dt>
+  <dd>Add new line to vector map and optionally define its
+    attributes.</dd>
+
+  <dt><img src="icons/boundary-create.png"> 
+    <em>Digitize new boundary</em></dt>
+  <dd>Add new boundary to vector map and optionally define its
+    attributes.</dd>
+  
+  <dt><img src="icons/centroid-create.png"> 
+    <em>Digitize new centroid</em></dt>
+  <dd>Add new centroid to vector map and optionally define its
+    attributes.</dd>
+
+  <dt><img src="icons/polygon-create.png"> 
+    <em>Digitize new area</em></dt>
+  <dd>Add new area (closed boundary and one centroid inside) to vector
+    map and optionally define its attributes.</dd>
+  
+  <dt><img src="icons/vertex-move.png"> 
+    <em>Move vertex</em></dt>
+  <dd>Move selected vertex of linear feature. Thus shape of linear
+    feature is changed.</dd>
+
+  <dt><img src="icons/vertex-create.png"> 
+    <em>Add vertex</em></dt>
+  <dd>Add new vertex to selected linear feature (shape not
+    changed).</dd>
+
+  <dt><img src="icons/vertex-delete.png"> 
+    <em>Remove vertex</em></dt>
+  <dd>Remove selected vertex from linear feature. Thus shape of selected
+  feature can be changed.</dd>
+  
+  <dt><img src="icons/line-edit.png"> 
+    <em>Edit line/boundary</em></dt>
+  <dd>Edit selected linear feature, add new segments or remove
+  existing segments of linear feature.</dd>
+
+  <dt><img src="icons/line-move.png"> 
+    <em>Move feature(s)</em></dt>
+  <dd>Move selected vector features. Selection can be done by mouse or
+    by query.</dd>
+
+  <dt><img src="icons/line-delete.png"> 
+    <em>Delete feature(s)</em></dt>
+  <dd>Delete selected vector features (point, line, centroid, or
+  boundary). Selection can be done by mouse or by query.</dd>
+
+  <dt><img src="icons/cats-display.png"> 
+    <em>Display/update categories</em></dt>
+  <dd>Display categories of selected vector feature. Category settings
+  can be modified, new layer/category pairs added or already defined pairs
+  removed.</dd>
+
+  <dt><img src="icons/attributes-display.png"> 
+    <em>Display/update attributes</em></dt>
+  <dd>Display attributes of selected vector feature (based on its
+    category settings).  Attributes can be also modified. Same
+    functionality is accessible from Main toolbar "Query vector map
+    (editable mode)".</dd>
+
+  <dt><img src="icons/tools.png"> 
+    <em>Additional tools</em></dt>
+  <dd>
+    <ul>
+      <li><em>Break selected lines/boundaries at intersection</em><br> Split
+	given vector line or boundary into two lines on given position
+	(based on <em><a href="v.clean.html">v.clean</a></em>,
+	<tt>tool=break</tt>).</li>
+
+      <li><em>Connect two selected lines/boundaries</em><br> Connect selected
+	lines or boundaries, the first given line is connected to the
+	second one. The second line is broken if necessary on each intersection.
+	The lines are connected only if distance between them is not greater
+	than snapping threshold value.</li>
+
+      <li><em>Copy categories</em><br>Copy category settings of
+	selected vector feature to other vector
+	features. Layer/category pairs of source vector features are
+	appended to the target feature category settings. Existing
+	layer/category pairs are not removed from category settings of
+	the target features.</li>
+
+      <li><em>Copy features from (background) map</em><br> Make identical copy of
+	selected vector features. If a background vector map has been 
+	selected from the Layer Manager, copy features from background 
+	vector map, not from the currently modified vector map.</li>
+
+      <li><em>Copy attributes</em><br>Duplicate attributes settings of
+	selected vector feature to other vector features. New
+	category(ies) is appended to the target feature category
+	settings and attributes duplicated based on category settings
+	of source vector features. Existing layer/category pairs are
+	not removed from category settings of the target
+	features.</li>
+
+      <li><em>Feature type conversion</em><br> Change feature type of selected
+	geometry features. Points are converted to centroids,
+	centroids to points, lines to boundaries and boundaries to
+	lines.</li>
+
+      <li><em>Flip selected lines/boundaries</em><br> Flip direction of
+	selected linear features (lines or boundaries).</li>
+
+      <li><em>Merge selected lines/boundaries</em><br> Merge (at least two)
+	selected vector lines or boundaries. The geometry of the
+	merged vector lines can be changed. If the second line from
+	two selected lines is in opposite direction to the first, it
+	will be flipped. See also
+	module <em><a href="v.build.polylines.html">v.build.polylines</a></em>.</li>
+
+      <li><em>Snap selected lines/boundaries (only to nodes)</em><br> Snap
+	vector features in given threshold. See also
+	module <em><a href="v.clean.html">v.clean</a></em>. Note that
+	this tool supports only snapping to nodes. Snapping to vector
+	features from background vector map is not currently
+	supported.</li>
+
+      <li><em>Split line/boundary</em><br>Split selected line or boundary on
+      given position.</li>
+
+      <li><em>Query tool</em><br>Select vector features by defining a threshold for
+        min/max length value (linear features or dangles).</li>
+
+      <li><em>Z-bulk labeling of 3D lines</em><br> Assign z coordinate values to 3D
+	vector lines in bounding box. This is useful for labeling contour lines.</li>
+    </ul>
+  </dd>
+  
+  <dt><img src="icons/undo.png"> 
+    <em>Undo</em></dt>
+  <dd>Undo previous operations.</dd>
+
+  <dt><img src="icons/settings.png"> 
+    <em>Settings</em></dt>
+  <dd>Dialog for vector digitizer settings.</dd>
+
+  <dt><img src="icons/quit.png"> 
+    <em>Quit digitizing tool</em></dt>
+  <dd>Changes in vector map can be optionally discarded when
+  digitizing session is quited.</dd>
+
+</dl>
+
+<h2>NOTES</h2>
+
+<dl><dt><b>Mouse button Functions:</b><dd>
+	<dt><i>Left</i>   - select/deselect features</dt>
+	<dt><i>Control+Left</i> - cancel action/undo vertex</dt>
+	<dt><i>Right</i>  - confirm action</dt>
+</dl>
+
+<p>
+<i>Dead (deleted)</i> are internally only marked in the geometry file
+as 'dead' but it remains there and occupies space. Any vector module
+used afterwards on this vector map which really reads and writes
+vector geometry (so not <em><a href="g.copy.html">g.copy</a></em>)
+will writes only features which are 'alive'.
+
+<p>
+<i>Added or modified</i> vector features are <i>snapped</i> to
+existing vector features (Settings→General→Snapping). To
+disable snapping set the snapping threshold to '0'.
+
+<p>
+If the digitizer crashes for some reason you can repair the vector map
+which was left open with the <em>v.build</em> module.
+
+<h2>REFERENCE</h2>
+
+<ul>
+  <li><a href="http://grass.osgeo.org/programming6/Vedit_Library.html">GRASS Vedit Library</a></li>
+</ul>
+
+<h2>SEE ALSO</h2>
+
+<em>
+  <a href="wxGUI.html">wxGUI</a><br>
+  <a href="wxGUI.Components.html">wxGUI components</a>
+</em>
+
+<p>
+<em>
+<a href="v.edit.html">v.edit</a>,
+<a href="v.category.html">v.category</a>,
+<a href="v.build.html">v.build</a>
+</em>
+
+<p>
+See also
+the <a href="http://grasswiki.osgeo.org/wiki/WxGUI_Vector_Digitizer">wiki
+page</a>
+including <a href="http://grasswiki.osgeo.org/wiki/WxGUI_Vector_Digitizer#Vector_tutorials">video
+tutorials</a>.
+
+<h2>AUTHOR</h2>
+
+Martin Landa, FBK-irst (2007-2008), Trento, Italy, and Czech Technical
+University in Prague, Czech Republic
+
+<p>
+<i>$Date: 2013-02-15 14:04:18 -0800 (Fri, 15 Feb 2013) $</i>
+<HR>
+<P><a href="index.html">Main index</a> - <a href="wxGUI.html">wxGUI index</a> - <a href="full_index.html">Full index</a></P>
+<P>© 2003-2013 <a href="http://grass.osgeo.org">GRASS Development Team</a></p>
+</body>
+</html>
diff --git a/gui/wxpython/docs/wxGUI.tmp.html b/gui/wxpython/docs/wxGUI.tmp.html
new file mode 100644
index 0000000..818425e
--- /dev/null
+++ b/gui/wxpython/docs/wxGUI.tmp.html
@@ -0,0 +1,647 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<title>GRASS GIS Manual: wxGUI</title>
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+<link rel="stylesheet" href="grassdocs.css" type="text/css">
+</head>
+<body bgcolor="white">
+<img src="grass_logo.png" alt="GRASS logo"><hr align=center size=6 noshade>
+<h2>NAME</h2>
+<em><b>wxGUI</b></em>
+
+<h2>DESCRIPTION</h2>
+
+<b>wxGUI</b> is a new generation of the <em>Graphical User
+Interface</em> (GUI) for GRASS GIS written
+in <a href="http://www.python.org">Python</a>
+using <a href="http://www.wxpython.org">wxPython</a> library. It's a
+successor of the <em><a href="gis.m.html">Tcl/Tk GUI</a></em> from
+GRASS 6.
+
+<p>
+If wxGUI is not your default GUI, you can define it as default by
+typing at GRASS command line prompt:
+
+<div class="code"><pre>
+g.gui -u wxpython 
+</pre></div>
+
+Alternatively it may be defined in GISRC file
+(<tt>$HOME/.grassrc6</tt> on GNU/Linux, <tt>$APPDATA\GRASS6\grassrc6</tt>
+on MS Windows) by <tt>GRASS_GUI</tt> variable
+
+<div class="code"><pre>
+GRASS_GUI: wxpython
+</pre></div>
+
+The GUI can be quit by selecting the 'File -> Exit GUI' menu item.
+<!-- is → allowed? -->
+On MS Windows when GRASS is launched without an interactive command line
+this will end the entire GRASS session. In other cases the terminal
+window will remain running; type <tt>exit</tt> at the command prompt
+to end the GRASS session.
+<p>
+The GUI can be restarted from the GRASS command line prompt by typing
+
+<div class="code"><pre>
+g.gui wxpython
+</pre></div>
+
+To restart with previously saved workspace file:
+
+<div class="code"><pre>
+g.gui wxpython workspace=file.gxw
+</pre></div>
+
+<p>
+The user can also start GRASS from the shell command line with the wxGUI
+specifying the <tt>-gui</tt> (or <tt>-wxpython</tt>) switch:
+
+<div class="code"><pre>
+grass65 -gui
+</pre></div>
+
+<p>
+The GUI is composed by <em>two</em> main components:
+
+<ul>
+  <li>The <b>Layer Manager</b> includes map layer management, integrated
+  command-line prompt, and command output window tab.</li>
+  <li>The <b>Map Display Window</b> integrates basic tools for
+  zooming, panning, data querying, and map elements (north arrows,
+  barscale, etc.). Each display window is associated with its own 
+  set of map layers in the layer manager. The user may start multiple map 
+  displays during a session. The map layers for each display are grouped
+  under different tabs in the Layer Manager.</li>
+</ul>
+
+<h3>Layer Manager</h3>
+
+The <em>Layer Manager</em> provides an interactive graphical interface for
+creating and managing GRASS displays. There is a toolbar to manage displayed 
+map layers, a layer tree frame in which map layers for display are organized, 
+a command output window tab, and interactive command line prompt. On Linux 
+and Windows platforms, the layer manager also has a menu bar with a set of 
+pull-down menus for all GRASS GIS functions (analysis, file I/O, GIS 
+configuration and management); on a Mac, the GRASS functions menu is at the 
+top of the screen.
+
+<center>
+<br><img src="wxGUI_layer_manager.jpg" border="1"><br><br>
+</center>
+
+The top left button of the toolbar opens a new <em>Map Display
+Window</em>. Each map display has a unique set of layers to display
+and region settings. Other toolbar buttons add layers of different
+types for display in the selected map display window. There are
+additional buttons for saving or opening workspace file, and others.
+
+<p>
+Map layers are listed in the window frame below the toolbar. Layers can
+include raster and vector maps, vector labels, and commands (where any 
+GRASS command can be written). Layers are displayed as arranged in the layer 
+tree: the bottom layer is displayed first and the top layer is displayed 
+last, as if the layers were a series of stacked overlays.
+
+<p>
+The check box to the left of each layer makes it active or inactive
+for display. Only active layers are displayed/redisplayed when the
+display button is pressed. Layers can be organized into groups; entire
+groups can be activated or deactivated for display. Layer tree
+composition can be saved to a workspace file and opened in subsequent
+sessions, restoring all layers and their display options.
+
+<p>
+A right mouse click on a layer or left clicking the button to the right of 
+the layer opens a dropdown menu with options to remove or rename the layer 
+(g.remove, g.rename), change its display properties (d.rast and d.vect 
+options such as color, symbol, etc.), show its metadata (r.info, v.info) or 
+attributes, if applicable.
+<p>
+A left mouse double click on a layer opens GUI for its display options 
+These options are those for the d.* command for each layer type (d.rast, 
+d.vect, or d.grid, for example).
+
+<h4>Layer Manager Toolbar</h4>
+
+<dl>
+  
+  <dt><img src="icons/monitor-create.png"> 
+    <em>Start new map display</em></dt>
+  <dd>Opens a new map display and creates empty layer tree tab in Layer Manager.</dd>
+  
+  <dt><img src="icons/create.png"> 
+    <em>Create new workspace</em></dt>
+  <dd>Removes all layers from the layer tree and creates a new, empty tree
+    where new layers can be added.</dd>
+    
+  <dt><img src="icons/open.png"> 
+    <em>Open existing workspace file</em></dt>
+  <dd>Opens an previously saved workspace file, containing a set of display
+    layers and their option settings.</dd>
+  
+  <dt><img src="icons/save.png"> 
+    <em>Save current workspace to file</em></dt>
+  <dd>Saves current set of layers and their options to a workspace
+    file.</dd>
+  
+  <dt><img src="icons/layer-open.png"> 
+    <em>Load map layers into workspace</em></dt>
+  <dd>Loads selected raster or vector maps into current layer tree.</dd>
+
+  <dt><img src="icons/layer-raster-add.png"> 
+    <em>Add raster map layer</em></dt>
+  <dd>Adds raster map to layer tree,
+  see <em><a href="d.rast.html">d.rast</a></em>.</dd>
+  
+  <dt><img src="icons/layer-raster-more.png"> 
+    <em>Add various raster map layers (RGB, HIS, shaded relief...)</em></dt>
+  <dd>Opens a dropdown menu that allows user to select to:
+    
+    <dl>
+      <dt><img src="icons/layer-raster3d-add.png"> 
+	<em>Add 3D raster map layer</em></dt>
+      <dd>Adds 3D raster map to layer tree.</dd>
+      
+      <dt><img src="icons/layer-rgb-add.png"> 
+	<em>Add RGB raster layer</em></dt>
+      <dd>Combines and displays three raster maps defined as red, green, 
+	and blue channels to create an RGB color map, 
+	see <em><a href="d.rgb.html">d.rgb</a></em>.</dd>
+      
+      <dt><img src="icons/layer-his-add.png"> 
+	<em>Add HIS raster layer</em></dt>
+      <dd>Combines and displays two or three raster maps defined as hue,
+	intensity, and (optionally) saturation channels to create a color map,
+	see <em><a href="d.his.html">d.his</a></em>.</dd>
+      
+      <dt><img src="icons/layer-shaded-relief-add.png"> 
+	<em>Add shaded relief raster map layer </em></dt>
+      <dd>Adds shaded relief raster map layer,
+	see <em><a href="d.shadedmap.html">d.shadedmap</a></em>.</dd>
+      
+      <dt><img src="icons/layer-aspect-arrow-add.png"> 
+	<em>Add raster arrows layer</em></dt>
+      <dd>Adds map of raster cells with directional arrows drawn. Arrow
+	direction and length are determined by separate aspect/directional map
+	and (optional) slope/intensity map,
+	see <em><a href="d.rast.arrow.html">d.rast.arrow</a></em>.</dd>
+      
+      <dt><img src="icons/layer-cell-cats-add.png"> 
+	<em>Add raster numbers layer</em></dt>
+      <dd>Adds map of raster cells with numbers representing the cell values, 
+	see <em><a href="d.rast.num.html">d.rast.num</a></em>.</dd>
+    </dl>
+    </dd>
+  
+  <dt><img src="icons/layer-vector-add.png"> 
+    <em>Add vector map layer</em></dt>
+  <dd>Adds a vector map layer, see <em><a href="d.vect.html">d.vect</a></em>.</dd>
+  
+  <dt><img src="icons/layer-vector-more.png"> 
+    <em>Add various vector map layers (thematic, chart...)</em></dt>
+  <dd>Opens a dropdown menu that allows user to select to:
+    
+    <dl>
+      <dt><img src="icons/layer-vector-thematic-add.png"> 
+	<em>Add thematic area (choropleth) map layer
+	  (for all vector types)</em></dt>
+      <dd>Adds layer for thematic display values from a numeric attribute
+	column associated with a vector map. Options include: thematic display
+	type (graduated colors or point sizes), methods for creating display
+	intervals, SQL query of attribute column to limit vector objects to
+	display, control of point icon types and sizes, control of thematic
+	color schemes, creation of legend for thematic map, and saving the
+	results of thematic mapping to a ps.map instructions file for later
+	printing,
+	see <em><a href="d.vect.thematic.html">d.vect.thematic</a></em>.</dd>
+      
+      <dt><img src="icons/layer-vector-chart-add.png"> 
+	<em>Add thematic chart layer (for vector points)</em></dt>
+      <dd>Adds layer in which pie or bar charts can be automatically created
+	at vector point locations. Charts display values from selected columns
+	in the associated attribute table. Options include: chart type, layer
+	and attributes to chart, chart colors, and chart size (fixed or based
+	on attribute column),
+	see <em><a href="d.vect.chart.html">d.vect.chart</a></em>.</dd>
+    </dl>
+  </dd>
+
+  <dt><img src="icons/layer-group-add.png"> 
+      <em>Add group</em></dt>
+  <dd>Adds an empty group. Layers can then be added to the group.</dd>
+  
+  <dt><img src="icons/layer-more.png"> 
+    <em>Add grid or vector labels overlay</em></dt>
+  <dd>Opens a dropdown menu that allows user to select to:
+    
+    <dl>
+      <dt><img src="icons/layer-grid-add.png"> 
+	<em>Add overlay grids and lines</em></dt>
+      <dd>Adds layer to display regular grid (for all locations)
+	see <em><a href="d.grid.html">d.grid</a></em></dd>
+      
+      <dt><img src="icons/layer-label-add.png"> 
+	<em>Add labels layer for vector objects (from existing labels file)</em></dt>
+      <dd>Add a layer of text from a labels file for vector objects
+	created with the <em><a href="v.label.html">v.label</a></em> module. 
+	A labels file can also be created with a text editor, 
+	see <em><a href="d.labels.html">d.labels</a></em>.</dd>
+      
+      <dt><img src="icons/shortest-distance.png"> 
+	<em>Add geodesic line layer</em></dt>
+      <dd>Add layer to display geodesic line for latitude/longitude locations only,
+	see <em><a href="d.geodesic.html">d.geodesic</a></em></dd>
+      
+      <dt><img src="icons/shortest-distance.png"> 
+	<em>Add rhumbline layer</em>
+	<dd>Add layer to display rhumblines (for latitude/longitude locations only),
+          see <em><a href="d.rhumbline.html">d.rhumbline</a></em>.</dd>
+	
+      <dt><img src="icons/layer-command-add.png"> 
+	<em>Add command layer</em></dt>
+      <dd>Adds a layer in which a GRASS GIS command or command list can be entered.
+	For a command list use the semi-colon (";") symbol as a separator.
+	For example:
+	
+<div class="code"><pre>
+d.rast soils;d.rast -o roads;d.vect streams col=blue
+</pre></div>
+
+Note that when an option of the command contains spaces, you need to
+"escape" them with the backslash ('\') character, for example:
+<div class="code"><pre>
+d.text text=Population\ density
+</pre></div>
+      </dd>
+    </dl>
+  </dd>
+
+  <dt><img src="icons/layer-remove.png"> 
+    <em>Delete selected layer</em></dt>
+  <dd>Removes selected map layer or map layer group from layer tree.</dd>
+  
+  <dt><img src="icons/table.png"> 
+    <em>Show attribute table</em></dt>
+  <dd>Opens <em><a href="wxGUI.Attribute_Table_Manager.html">attribute table manager</a></em> for selected vector map.</dd>
+  
+  <dt><img src="icons/layer-open.png"> 
+    <em>Import raster or vector data</em></dt>
+  <dd>
+    <dl>
+      <dt><img src="icons/layer-import.png"> 
+	<em>Import raster data</em></dt>
+      <dd>Import selected raster data into GRASS
+      using <em><a href="r.in.gdal.html">r.in.gdal</a></em> and load
+      them into current layer tree.</dd>
+      
+      <dt><img src="icons/layer-import.png"> 
+	<em>Import vector data</em></dt>
+      <dd>Import selected vector data into GRASS
+      using <em><a href="v.in.ogr.html">v.in.ogr</a></em> and load
+      them into current layer tree.</dd>
+    </dl>
+</dd>
+
+  <dt><img src="icons/calculator.png"> 
+    <em>Raster Map Calculator</em></dt>
+  <dd>Launches Raster Calculator GUI front-end
+  for <em><a href="r.mapcalc.html">r.mapcalc</a></em>.</dd>
+
+  <dt><img src="icons/modeler-main.png"> 
+    <em>Graphical Modeler</em></dt>
+  <dd>Launches <em><a href="wxGUI.Modeler.html">graphical
+  modeler</a></em> to create models and run them.</dd>
+
+  <dt><img src="icons/georectify.png"> 
+    <em>Georectifier Tool</em></dt>
+  <dd>Launches <em><a href="wxGUI.GCP_Manager.html">GCP
+    Manager</a></em> to create, edit, and manage Ground Control
+    Points.</dd>
+
+  <dt><img src="icons/print-compose.png"> 
+    <em>Cartographic Composer</em></dt>
+  <dd>Launches <em><a href="wxGUI.PsMap.html">Cartographic
+    Composer</a></em> to create interactively hardcopy map
+    outputs.</dd>
+  
+  <dt><img src="icons/settings.png"> 
+    <em>Show GUI settings</em></dt>
+  <dd>Opens dialog to change GUI settings.</dd>
+  
+  <dt><img src="icons/help.png"> 
+    <em>Show help</em></dt>
+  <dd>Opens GRASS manual.</dd>
+
+</dl>
+
+<h4>Key shortcuts</h4>
+
+<dl>
+  <dt>Ctrl+Tab</dt>
+  <dd>Switch 'Map layers' and 'Command output' tab</dd>
+  <dt>Ctrl+Q</dt>
+  <dd>Quit</dd>
+</dl>
+
+<b>Workspace</b>
+<dl>
+  <dt>Ctrl+N</dt>
+  <dd>Create new workspace</dd>
+  <dt>Ctrl+O</dt>
+  <dd>Load workspace from file</dd>
+  <dt>Ctrl+S</dt>
+  <dd>Close workspace</dd>
+</dl>
+
+<b>Map Layers</b>
+<dl>
+  <dt>Ctrl+Shift+L</dt>
+  <dd>Add multiple raster or vector map layers to current map display</dd>
+  <dt>Ctrl+Shift+R</dt>
+  <dd>Add raster map layer to current map display</dd>
+  <dt>Ctrl+Shift+V</dt>
+  <dd>Add vector map layer to current map display</dd>
+  <dt>Ctrl+W</dt>
+  <dd>Close current map display</dd>
+</dl>
+
+<b>Command line prompt</b>
+<dl>
+  <dt>Tab</dt>
+  <dd>Show command tooltips</dd>
+  <dt>Esc</dt>
+  <dd>Hide command tooltips</dd>
+  <dt>Ctrl+Space</dt>
+  <dd>Map entries without arguments (as in <tt>r.info [mapname]</tt>)</dd>
+  <dt>Up/Down</dt>
+  <dd>List command history</dd>
+  <dt>Enter</dt>
+  <dd>Run command</dd>
+</dl>
+
+<h3>Map Display Window</h3>
+
+The map display window includes toolbar that can be docked and undocked from 
+the window, a map canvas where a map composition of one or more layers is 
+displayed, and a statusbar with information about the geographic region of
+the maps displayed.
+
+<center>
+  <br><img src="wxGUI_map_display.jpg" alt="Map Display Window"><br><br>
+</center>
+
+Each Map Display Window has a unique layer tree (in the layer manager) 
+and geographic <em>region</em> setting. At the top of the window is a 
+toolbar with buttons to manage the map in the display (render, erase, zoom 
+and pan), for query and and analysis (distance measurement, profile, 
+and histogram creation), to overlay map elements onto the display (scale,
+north arrow, legend, and custom text), and to export or print the display.
+
+<p>
+In the statusbar, the user can choose to display the geographic coordinates 
+under the cursor, current geographical region extent, computational region
+(including graphical visualization in map display), map display geometry 
+(number of rows, columns, resolution) and map scale. Checking the 
+<em>render</em> button in the statusbar will cause the map display to update
+automatically any time a map is added to, removed from, or changed in its
+layer tree.
+
+<p>
+It is important to note that zooming in any display will
+have <em>no</em> effect on the 'computational region' setting (set
+with <em><a href="g.region.html">g.region</a></em>). Only by selecting
+the 'Set current region to match display' item in the zoom menu (in
+the map display toolbar) will the current display extents be copied to
+the computational region extents.
+
+<h4>Map Display Toolbar</h4>
+
+<dl>
+
+  <dt><img src="icons/show.png"> 
+    <em>Display map</em></dt>
+  <dd>Displays all active layers from layer tree and re-renders for display
+    any layers that have changed since the last time the display was updated, 
+    including layers added or removed.</dd>
+  
+  <dt><img src="icons/layer-redraw.png"> 
+    <em>Re-render map</em></dt>
+  <dd>Re-renders all active layers regardless of whether they have changed
+    or not.</dd>
+  
+  <dt><img src="icons/erase.png"> 
+    <em>Erase display</em></dt>
+  <dd>Erases the currently selected map display to a white background,
+    see <em><a href="d.erase.html">d.erase</a>, <a href="d.frame.html">d.frame
+	-e</a></em>.</dd>
+  
+  <dt><img src="icons/pointer.png"> 
+    <em>Pointer</em></dt>
+  <dd>Select arrow cursor for map display.</dd>
+  
+  <dt><img src="icons/info.png"> 
+    <em>Query raster/vector maps</em></dt>
+  <dd>Opens a dropdown menu that allows user to select to:
+    <dl>
+      <dt><em>Display mode</em></dt>
+      <dd>Query selected raster, RGB raster (all three map channels will be
+	queried), or vector map(s) using the mouse. Map(s) must be selected
+	before query.  Vector charts and thematic vector maps cannot be
+	queried. The results of the query will be displayed in the console window,
+	see <em><a href="r.what.html">r.what</a>, <a href="v.what.html">v.what</a></em>.</dd>
+      <dt><em>Edit mode</em></dt>
+      <dd>Query selected vector map in edit mode. The results of the query 
+	will be displayed in a form that permits editing of the queried vector
+	attributes.</dd>
+    </dl>
+  </dd>
+  
+  <dt><img src="icons/pan.png"> 
+    <em>Pan</em></dt>
+  <dd>Interactive selection of a new center of view in the active
+    display monitor. Drag the pan cursor while pressing the left mouse
+    button to pan.  Panning changes the location of the region displayed
+    but not the size of the area displayed or the resolution. Panning
+    does <em>not</em> affect the computational region for other GIS
+    processes, see <em><a href="g.region.html">g.region</a></em>.</dd>
+  
+  <dt><img src="icons/zoom-in.png"> 
+    <em>Zoom in</em></dt>
+  <dd>Interactive zooming with the mouse in the active display monitor.
+    Drawing a box or just click with the mouse (left button) and zoom-in
+    cursor causes the display to zoom in so that the area defined by the
+    box fills the display. The map resolution is not changed. Clicking
+    with the zoom-in cursor causes the display to zoom in by 30%, centered
+    on the point where the mouse is clicked. Zooming resets the display
+    region extents (both size and location of area displayed). It
+    does <em>not</em> affect the computational region for other GIS
+    processes, see <em><a href="g.region.html">g.region</a></em>.</dd>
+  
+  <dt><img src="icons/zoom-out.png"> 
+    <em>Zoom out</em></dt>
+  <dd>Interactive zooming with the mouse in the active display monitor.
+    Drawing a box or just click with the mouse (left button) and zoom-out
+    cursor causes the display to zoom in so that the area displayed
+    shrinks to fill the area defined by the box. The map resolution is not
+    changed. Clicking with the zoom-out cursor causes the display to zoom
+    out by 30%, centered on the point where the mouse is clicked. Zooming
+    resets the display region extents (both size and location of area
+    displayed). It does <em>not</em> affect the computational region for
+    other GIS processes,
+    see <em><a href="g.region.html">g.region</a></em>.</dd>
+
+  <dt><img src="icons/zoom-extent.png"> 
+    <em>Zoom to selected map(s)</em></dt>
+  <dd>Set zoom extent based on selected raster or vector maps. Zooming
+    resets the display region extents (both size and location of area
+    displayed). It does <em>not</em> affect the computational region
+    for other GIS processes,
+    see <em><a href="g.region.html">g.region</a></em>.</dd>
+  
+  <dt><img src="icons/zoom-last.png"> 
+    <em>Return to previous zoom</em></dt>
+  <dd>Returns to the previous zoom extent. Up to 10 levels of zoom back are
+    maintained, see <em><a href="g.region.html">g.region</a></em>.</dd>
+  
+  <dt><img src="icons/zoom-more.png"> 
+    <em>Zoom options</em></dt>
+  <dd>Opens a dropdown menu that allows user to:
+    <ul>
+      <li>Zoom to match the extents of a selected map</li>
+      <li>Zoom to match the computational region (set with <em>g.region</em>)</li>
+      <li>Zoom to match the extents of the default region</li> 
+      <li>Zoom to match the extents of a saved region</li> 
+      <li>Set computational region (the mapset's <tt>WIND</tt> file) to match the
+        current display extents (does not change the resolution),
+        see <em><a href="g.region.html">g.region</a></em>.</li>
+      <li>Save display geometry (current extents) to a named region file</li>
+    </ul>
+  </dd>
+
+  <dt><img src="icons/layer-raster-analyze.png"> 
+      <em>Analyze menu</em></dt>
+  <dd>Opens a dropdown menu with:
+    <dl>
+      <dt><img src="icons/measure-length.png"> 
+	<em>Distance measurement tool</em></dt>
+      <dd>Interactive measurement of lengths defined with the mouse. The
+	length of each segment and the cumulative length of all segments
+	measuered is displayed in the command output window frame. Lengths are
+	measured in the current measurement unit,
+	see <em><a href="d.measure.html">d.measure</a></em>.</dd>
+      
+      <dt><img src="icons/layer-raster-profile.png"> 
+	<em>Profile tool</em></dt>
+      <dd>Interactively create profile of a raster map. Profile transect is
+	drawn with the mouse in map display. The profile may be of the
+	displayed map or a different map. Up to three maps can be profiled 
+	simultaneously, 
+	see <em><a href="gm_profile.html">Profile Tool help page</a></em>.</dd>
+      
+      <dt><img src="icons/layer-raster-histogram.png"> 
+        <em>Histogramming tool</em></dt>
+      <dd>Displays histogram of selected raster map or image in new
+        window,
+        see <em><a href="d.histogram.html">d.histogram</a></em>.</dd>
+    </dl>
+  </dd>
+  
+  <dt><img src="icons/overlay-add.png"> 
+    <em>Add overlay</em></dt>
+  <dd>opens a dropdown menu that allows user to:
+    <dl>
+      <dt><img src="icons/scalebar-add.png"> 
+	<em>Add scalebar and north arrow</em></dt>
+      <dd>Adds layer to display a combined scalebar and north arrow. Options
+	include scalebar placement (using screen coordinates or a mouse),
+	scalebar format, and scalebar colors,
+	see <em><a href="d.barscale.html">d.barscale</a></em>.</dd>
+      
+      <dt><img src="icons/legend-add.png"> 
+	<em>Add raster map legend</em></dt>
+      <dd>Adds layer to display with legend of selected raster map,
+	see <em><a href="d.legend.html">d.legend</a></em>.</dd>
+      
+      <dt><img src="icons/text-add.png"> 
+	<em>Add text layer</em></dt>
+      <dd>Adds layer to display a line of text using default GRASS font
+	(selected with <em><a href="d.font.html">d.font</a></em>).  Options
+	include: text placement (screen coordinates); and text size, bolding,
+	and color, see <em><a href="d.text.html">d.text</a></em>.</dd>
+    </dl>
+  </dd>
+  
+  <dt><img src="icons/map-export.png"> 
+    <em>Save display to graphic file</em></dt>
+  <dd>Save the visible image in map display to different raster graphic formats.</dd>
+  
+  <dt><img src="icons/print.png"> 
+    <em>Print map</em></dt>
+  <dd>Prints map on system native printer or PostScript device;
+    saves visible map display (including PostScript text and labels) to PDF
+    or EPS file.</dd>
+  
+  <dt><em>Map display mode</em></dt>
+  <dd>Opens a dropdown menu for selecting different display mode
+    <dl>
+      <dt><em>2D view mode</em></dt>
+      <dd>Normal GIS display. All active layers are composited and displayed
+	in 2D mode.</dd>
+      
+      <dt><em>3D view mode</em></dt>
+      <dd>Experimental replacement for NVIZ. Displays all active layers in 
+	3D perspective using OpenGL. A new control panel opens to manage the 
+	3D view. 3D view can be zoomed, panned, rotated, and tilted. The 
+	vertical exaggeration of rasters and 3D vectors can be set. Various 
+	color and lighten settings are possible. Not yet functional for 
+	Windows platforms</dd>
+      
+      <dt><em>Digitize mode</em></dt>
+      <dd>Puts display into vector digitizing mode and opens a new digitizing 
+	toolbar. The user can digitize a new map or edit an existing
+	map. Not yet functional for Windows platforms</dd>
+    </dl>
+  </dd>
+</dl>
+
+<h2>SEE ALSO</h2>
+
+<em>
+  <a href="wxGUI.Components.html">wxGUI components</a>
+</em>
+
+<p>
+See also wxGUI <a href="http://grasswiki.osgeo.org/wiki/WxGUI">wiki</a>
+page
+(especially various <a href="http://grasswiki.osgeo.org/wiki/WxGUI#Video_tutorials">video
+tutorials</a>),
+and <a href="http://grasswiki.osgeo.org/wiki/Quick_wxGUI_tutorial">Quick
+wxGUI Tutorial</a>.
+
+<p>
+<em>
+<a href="gis.m.html">TCL/TK-based GIS Manager</a>,
+<a href="d.m.html">TCL/TK-based Display Manager</a>
+</em>
+
+<h2>AUTHORS</h2>
+
+<a href="http://geo.fsv.cvut.cz/gwiki/Landa">Martin Landa</a>, <a href="http://www.fbk.eu">FBK-irst</a> (2007-2008), Trento, Italy, and <a href="http://www.cvut.cz">Czech Technical University in Prague</a>, Czech Republic<br>
+Michael Barton, Arizona State University, USA<br>
+Daniel Calvelo Aros<br>
+Jachym Cepicky<br>
+Markus Metz, Germany<br>
+Anna Kratochvilova, <a href="http://www.cvut.cz">Czech Technical University in Prague</a>, Czech Republic<br>
+Vaclav Petras, <a href="http://www.cvut.cz">Czech Technical University in Prague</a>, Czech Republic<br><br>
+
+Icons created by <a href="http://robert.szczepanek.pl">Robert Szczepanek</a>, Poland (<a href="https://svn.osgeo.org/osgeo/graphics/trunk/toolbar-icons/24x24/">SVN</a>)
+
+<p>
+<i>$Date: 2013-05-01 18:35:55 -0700 (Wed, 01 May 2013) $</i>
+<HR>
+<P><a href="index.html">Main index</a> - <a href="wxGUI.html">wxGUI index</a> - <a href="full_index.html">Full index</a></P>
+<P>© 2003-2013 <a href="http://grass.osgeo.org">GRASS Development Team</a></p>
+</body>
+</html>
diff --git a/gui/wxpython/docs/wxGUI_nviz_tools_light.jpg b/gui/wxpython/docs/wxGUI_nviz_tools_light.jpg
new file mode 100644
index 0000000..2ab2c59
Binary files /dev/null and b/gui/wxpython/docs/wxGUI_nviz_tools_light.jpg differ
diff --git a/gui/wxpython/gui_modules/gcpmanager.py b/gui/wxpython/gcp/manager.py
similarity index 91%
rename from gui/wxpython/gui_modules/gcpmanager.py
rename to gui/wxpython/gcp/manager.py
index 61d217b..499e934 100644
--- a/gui/wxpython/gui_modules/gcpmanager.py
+++ b/gui/wxpython/gcp/manager.py
@@ -1,21 +1,22 @@
 """!
- at package gcpmanager.py
+ at package gcp.manager
 
 @brief Georectification module for GRASS GIS. Includes ground control
 point management and interactive point and click GCP creation
 
 Classes:
- - GCPWizard
- - LocationPage
- - GroupPage
- - DispMapPage
- - GCP
- - GCPList
- - VectGroup
- - EditGCP
- - GrSettingsDialog
+ - manager::GCPWizard
+ - manager::LocationPage
+ - manager::GroupPage
+ - manager::DispMapPage
+ - manager::GCP
+ - manager::GCPList
+ - manager::VectGroup
+ - manager::EditGCP
+ - manager::GrSettingsDialog
 
 (C) 2006-2011 by the GRASS Development Team
+
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
@@ -26,40 +27,25 @@ This program is free software under the GNU General Public License
 
 import os
 import sys
-import tempfile
 import shutil
-import time
-import cStringIO
 
 import wx
 from wx.lib.mixins.listctrl import CheckListCtrlMixin, ColumnSorterMixin, ListCtrlAutoWidthMixin
-import wx.lib.colourselect as  csel
-import wx.wizard as wiz
+import wx.lib.colourselect as csel
+import wx.wizard           as wiz
 
 import grass.script as grass
 
-import globalvar
-import render
-import toolbars
-import menuform
-import gselect
-import gcmd
-import utils
-from debug import Debug as Debug
-from icon import Icons as Icons
-from location_wizard import TitledPage as TitledPage
-from preferences import globalSettings as UserSettings
-from gcpmapdisp import MapFrame
-from mapdisp_window import BufferedWindow
-
-try:
-    import subprocess # Not needed if GRASS commands could actually be quiet
-except:
-    CompatPath = globalvar.ETCWXDIR
-    sys.path.append(CompatPath)
-    from compat import subprocess
-
-sys.path.append(os.path.join(globalvar.ETCWXDIR, "icons"))
+from core              import globalvar
+from core              import utils
+from core.render       import Map
+from gui_core.gselect  import Select, LocationSelect, MapsetSelect
+from gui_core.dialogs  import GroupDialog
+from core.gcmd         import RunCommand, GMessage, GError, GWarning
+from core.settings     import UserSettings
+from gcp.mapdisplay    import MapFrame
+
+from location_wizard.wizard  import TitledPage
 
 #
 # global variables
@@ -172,12 +158,12 @@ class GCPWizard(object):
         if self.wizard.RunWizard(self.startpage):
             success = self.OnWizFinished()
             if success == False:
-                gcmd.GMessage(parent = self.parent,
-                              message = _("Georectifying setup canceled."))
+                GMessage(parent = self.parent,
+                         message = _("Georectifying setup canceled."))
                 self.Cleanup()
         else:
-            gcmd.GMessage(parent = self.parent,
-                          message = _("Georectifying setup canceled."))
+            GMessage(parent = self.parent,
+                     message = _("Georectifying setup canceled."))
             self.Cleanup()
 
         #
@@ -186,9 +172,9 @@ class GCPWizard(object):
         if success != False:
             # instance of render.Map to be associated with display
             self.SwitchEnv('source')
-            self.SrcMap = render.Map(gisrc=self.source_gisrc) 
+            self.SrcMap = Map(gisrc=self.source_gisrc) 
             self.SwitchEnv('target')
-            self.TgtMap = render.Map(gisrc=self.target_gisrc)
+            self.TgtMap = Map(gisrc=self.target_gisrc)
             self.Map = self.SrcMap
             
             #
@@ -335,7 +321,7 @@ class LocationPage(TitledPage):
         self.sizer.Add(item=wx.StaticText(parent=self, id=wx.ID_ANY, label=_('Select source location:')),
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
                        pos=(2, 1))
-        self.cb_location = gselect.LocationSelect(parent = self, gisdbase = self.grassdatabase)
+        self.cb_location = LocationSelect(parent = self, gisdbase = self.grassdatabase)
         self.sizer.Add(item=self.cb_location,
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
                        pos=(2, 2))
@@ -344,7 +330,7 @@ class LocationPage(TitledPage):
         self.sizer.Add(item=wx.StaticText(parent=self, id=wx.ID_ANY, label=_('Select source mapset:')),
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
                        pos=(3, 1))
-        self.cb_mapset = gselect.MapsetSelect(parent = self, gisdbase = self.grassdatabase,
+        self.cb_mapset = MapsetSelect(parent = self, gisdbase = self.grassdatabase,
                                               setItems = False)
         self.sizer.Add(item=self.cb_mapset,
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
@@ -394,9 +380,9 @@ class LocationPage(TitledPage):
     def OnMapset(self, event):
         """!Sets source mapset for map(s) to georectify"""
         if self.xylocation == '':
-            gcmd.GMessage(_('You must select a valid location '
-                            'before selecting a mapset'),
-                          parent = self)
+            GMessage(_('You must select a valid location '
+                       'before selecting a mapset'),
+                     parent = self)
             return
 
         self.xymapset = event.GetString()
@@ -407,9 +393,9 @@ class LocationPage(TitledPage):
     def OnPageChanging(self, event=None):
         if event.GetDirection() and \
                (self.xylocation == '' or self.xymapset == ''):
-            gcmd.GMessage(_('You must select a valid location '
-                            'and mapset in order to continue'),
-                          parent = self)
+            GMessage(_('You must select a valid location '
+                       'and mapset in order to continue'),
+                     parent = self)
             event.Veto()
             return
         
@@ -499,8 +485,18 @@ class GroupPage(TitledPage):
         
     def OnMkGroup(self, event):
         """!Create new group in source location/mapset"""
-        menuform.GUI(parent = self.parent.parent, modal = True).ParseCommand(['i.group'],
-                                                                             completed = (self.GetOptData, None, ''))
+        dlg = GroupDialog(parent = self, defaultGroup = self.xygroup)
+
+        dlg.ShowModal()
+        gr = dlg.GetSelectedGroup()
+        if gr in dlg.GetExistGroups():
+            self.xygroup = gr
+        else:
+            gr = ''
+        dlg.Destroy()
+        
+        self.OnEnterPage()
+        self.Update()
         
     def OnVGroup(self, event):
         """!Add vector maps to group"""
@@ -517,30 +513,21 @@ class GroupPage(TitledPage):
         dlg.MakeVGroup()
         self.OnEnterPage()
         
-    def GetOptData(self, dcmd, layer, params, propwin):
-        """!Process i.group"""
-        # update the page
-        if dcmd:
-            gcmd.Command(dcmd)
-
-        self.OnEnterPage()
-        self.Update()
-        
     def OnExtension(self, event):
         self.extension = event.GetString()
 
     def OnPageChanging(self, event=None):
         if event.GetDirection() and self.xygroup == '':
-            gcmd.GMessage(_('You must select a valid image/map '
-                            'group in order to continue'),
-                          parent = self)
+            GMessage(_('You must select a valid image/map '
+                       'group in order to continue'),
+                     parent = self)
             event.Veto()
             return
 
         if event.GetDirection() and self.extension == '':
-            gcmd.GMessage(_('You must enter an map name '
-                            'extension in order to continue'),
-                          parent = self)
+            GMessage(_('You must enter an map name '
+                       'extension in order to continue'),
+                     parent = self)
             event.Veto()
             return
 
@@ -581,10 +568,12 @@ class GroupPage(TitledPage):
         utils.ListSortLower(self.groupList)
         self.cb_group.SetItems(self.groupList)
         
-        if len(self.groupList) > 0 and \
-                self.xygroup == '':
-            self.cb_group.SetSelection(0)
-            self.xygroup = self.groupList[0]
+        if len(self.groupList) > 0:
+            if self.xygroup and self.xygroup in self.groupList:
+                self.cb_group.SetStringSelection(self.xygroup)
+            else:
+                self.cb_group.SetSelection(0)
+                self.xygroup = self.groupList[0]
         
         if self.xygroup == '' or \
                 self.extension == '':
@@ -614,8 +603,8 @@ class DispMapPage(TitledPage):
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
                        pos=(1, 1))
         
-        self.srcselection = gselect.Select(self, id=wx.ID_ANY,
-                                    size=globalvar.DIALOG_GSELECT_SIZE, type=maptype, updateOnPopup = False)
+        self.srcselection = Select(self, id=wx.ID_ANY,
+                                   size=globalvar.DIALOG_GSELECT_SIZE, type=maptype, updateOnPopup = False)
         
         self.sizer.Add(item=self.srcselection,
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
@@ -625,8 +614,8 @@ class DispMapPage(TitledPage):
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
                        pos=(2, 1))
 
-        self.tgtselection = gselect.Select(self, id=wx.ID_ANY,
-                                        size=globalvar.DIALOG_GSELECT_SIZE, type=maptype, updateOnPopup = False)
+        self.tgtselection = Select(self, id = wx.ID_ANY,
+                                   size = globalvar.DIALOG_GSELECT_SIZE, type=maptype, updateOnPopup = False)
         
         self.sizer.Add(item=self.tgtselection,
                        flag=wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5,
@@ -656,9 +645,9 @@ class DispMapPage(TitledPage):
         try:
         # set computational region to match selected map and zoom display to region
             if maptype == 'cell':
-                p = gcmd.Command(['g.region', 'rast=src_map'])
+                p = RunCommand('g.region', rast='src_map')
             elif maptype == 'vector':
-                p = gcmd.Command(['g.region', 'vect=src_map'])
+                p = RunCommand('g.region', vect='src_map')
             
             if p.returncode == 0:
                 print 'returncode = ', str(p.returncode)
@@ -677,9 +666,9 @@ class DispMapPage(TitledPage):
         global tgt_map
 
         if event.GetDirection() and (src_map == ''):
-            gcmd.GMessage(_('You must select a source map '
-                            'in order to continue'),
-                          parent = self)
+            GMessage(_('You must select a source map '
+                       'in order to continue'),
+                     parent = self)
             event.Veto()
             return
 
@@ -691,19 +680,19 @@ class DispMapPage(TitledPage):
         global tgt_map
 
         self.srcselection.SetElementList(maptype)
-        ret = gcmd.RunCommand('i.group',
-                              parent = self,
-                              read = True,
-                              group = self.parent.grouppage.xygroup,
-                              flags = 'g')            
+        ret = RunCommand('i.group',
+                         parent = self,
+                         read = True,
+                         group = self.parent.grouppage.xygroup,
+                         flags = 'g')            
 
         if ret:
             self.parent.src_maps = ret.splitlines()
         else:
-            gcmd.GError(parent = self,
-                        message = _('No maps in selected group <%s>.\n'
-                                    'Please edit group or select another group.') %
-                        self.parent.grouppage.xygroup)
+            GError(parent = self,
+                   message = _('No maps in selected group <%s>.\n'
+                               'Please edit group or select another group.') %
+                   self.parent.grouppage.xygroup)
             return
 
         # filter out all maps not in group
@@ -721,14 +710,14 @@ class DispMapPage(TitledPage):
         else:
             wx.FindWindowById(wx.ID_FORWARD).Enable(True)
 
-class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
+class GCP(MapFrame, ColumnSorterMixin):
     """!
     Manages ground control points for georectifying. Calculates RMS statics.
     Calls i.rectify or v.transform to georectify map.
     """
     def __init__(self, parent, grwiz = None, id = wx.ID_ANY,
                  title = _("Manage Ground Control Points"),
-                 size = (700, 300), toolbars=["gcpdisp"], Map=None, lmgr=None):
+                 size = (700, 300), toolbars = ["gcpdisp"], Map = None, lmgr = None):
 
         self.grwiz = grwiz # GR Wizard
 
@@ -738,8 +727,8 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
             self.show_target = True
         
         #wx.Frame.__init__(self, parent, id, title, size = size, name = "GCPFrame")
-        MapFrame.__init__(self, parent, id, title, size = size,
-                            Map=Map, toolbars=["gcpdisp"], lmgr=lmgr, name='GCPMapWindow')
+        MapFrame.__init__(self, parent = parent, title = title, size = size,
+                            Map = Map, toolbars = toolbars, lmgr = lmgr, name = 'GCPMapWindow')
 
         #
         # init variables
@@ -890,11 +879,20 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
     def GetListCtrl(self):
         return self.list
+        
+    def GetMapCoordList(self):
+        return self.mapcoordlist
 
     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
     def GetSortImages(self):
         return (self.sm_dn, self.sm_up)
 
+    def GetFwdError(self):
+        return self.fwd_rmserror
+        
+    def GetBkwError(self):
+        return self.bkw_rmserror
+                
     def InitMapDisplay(self):
         self.list.LoadData()
         
@@ -911,17 +909,17 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
         """
         # check to see if we are georectifying map in current working location/mapset
         if self.newlocation == self.currentlocation and self.newmapset == self.currentmapset:
-            gcmd.RunCommand('i.target',
-                            parent = self,
-                            flags = 'c',
-                            group = tgroup)
+            RunCommand('i.target',
+                       parent = self,
+                       flags = 'c',
+                       group = tgroup)
         else:
             self.grwiz.SwitchEnv('source')
-            gcmd.RunCommand('i.target',
-                            parent = self,
-                            group = tgroup,
-                            location = tlocation,
-                            mapset = tmapset)
+            RunCommand('i.target',
+                       parent = self,
+                       group = tgroup,
+                       location = tlocation,
+                       mapset = tmapset)
             self.grwiz.SwitchEnv('target')
 
     def AddGCP(self, event):
@@ -938,7 +936,7 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
                                    0.0,                # forward error
                                    0.0 ] )             # backward error
 
-        if self.statusbarWin['toggle'].GetSelection() == 7: # go to
+        if self.statusbarManager.GetMode() == 8: # go to
             self.StatusbarUpdate()
 
     def DeleteGCP(self, event):
@@ -948,8 +946,8 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
         minNumOfItems = self.OnGROrder(None)
 
         if self.list.GetItemCount() <= minNumOfItems:
-            gcmd.GMessage(parent = self,
-                          message=_("At least %d GCPs required. Operation cancelled.") % minNumOfItems)
+            GMessage(parent = self,
+                     message=_("At least %d GCPs required. Operation canceled.") % minNumOfItems)
             return
 
         key = self.list.DeleteGCPItem()
@@ -979,24 +977,23 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
 
         self.UpdateColours()
 
-        if self.statusbarWin['toggle'].GetSelection() == 7: # go to
+        if self.statusbarManager.GetMode() == 8: # go to
             self.StatusbarUpdate()
             if self.list.selectedkey > 0:
-                self.statusbarWin['goto'].SetValue(self.list.selectedkey)
-            #self.statusbarWin['goto'].SetValue(0)
+                self.statusbarManager.SetProperty('gotoGCP', self.list.selectedkey)
 
     def ClearGCP(self, event):
         """
         Clears all values in selected item of GCP list and unchecks it
         """
         index = self.list.GetSelected()
+        key = self.list.GetItemData(index)
 
-        for i in range(4):
+        for i in range(1, 5):
             self.list.SetStringItem(index, i, '0.0')
-        self.list.SetStringItem(index, 4, '')
         self.list.SetStringItem(index, 5, '')
+        self.list.SetStringItem(index, 6, '')
         self.list.CheckItem(index, False)
-        key = self.list.GetItemData(index)
 
         # GCP number, source E, source N, target E, target N, fwd error, bkwd error
         self.mapcoordlist[key] = [key, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
@@ -1036,9 +1033,9 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
             n_idx = 4
 
         if not mapWin:
-            gcmd.GError(parent = self,
-                        message="%s%s." % (_("mapwin not defined for "),
-                                           str(idx)))
+            GError(parent = self,
+                   message="%s%s." % (_("mapwin not defined for "),
+                                      str(idx)))
             return
 
         #for gcp in self.mapcoordlist:
@@ -1175,9 +1172,9 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
                 f.write(coord0 + ' ' + coord1 + '     ' + coord2 + ' ' + coord3 + '     ' + check + '\n')
 
         except IOError, err:
-            gcmd.GError(parent = self,
-                        message="%s <%s>. %s%s" % (_("Writing POINTS file failed"),
-                                                   self.file['points'], os.linesep, err))
+            GError(parent = self,
+                   message="%s <%s>. %s%s" % (_("Writing POINTS file failed"),
+                                              self.file['points'], os.linesep, err))
             return
 
         f.close()
@@ -1200,14 +1197,14 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
         #targetMapWin = self.parent.curr_page.maptree.mapdisplay.MapWindow
 
         if not sourceMapWin:
-            gcmd.GError(parent = self,
-                        message = "%s. %s%s" % (_("source mapwin not defined"),
-                                                os.linesep, err))
+            GError(parent = self,
+                   message = "%s. %s%s" % (_("source mapwin not defined"),
+                                           os.linesep, err))
         
         if not targetMapWin:
-            gcmd.GError(parent = self,
-                        message="%s. %s%s" % (_("target mapwin not defined"),
-                                              os.linesep, err))
+            GError(parent = self,
+                   message="%s. %s%s" % (_("target mapwin not defined"),
+                                         os.linesep, err))
         
         try:
             f = open(self.file['points'], 'r')
@@ -1233,9 +1230,9 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
                 GCPcnt += 1
 
         except IOError, err:
-            gcmd.GError(parent = self,
-                        message = "%s <%s>. %s%s" % (_("Reading POINTS file failed"),
-                                                     self.file['points'], os.linesep, err))
+            GError(parent = self,
+                   message = "%s <%s>. %s%s" % (_("Reading POINTS file failed"),
+                                                self.file['points'], os.linesep, err))
             return
 
         f.close()
@@ -1304,12 +1301,12 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
             (self.GCPcount < 6 and self.gr_order == 2) or \
             (self.GCPcount < 10 and self.gr_order == 3):
             if msg:
-                gcmd.GWarning(parent = self,
-                              message=_('Insufficient points defined and active (checked) '
-                                        'for selected rectification method.\n'
-                                        '3+ points needed for 1st order,\n'
-                                        '6+ points for 2nd order, and\n'
-                                        '10+ points for 3rd order.'))
+                GWarning(parent = self,
+                         message=_('Insufficient points defined and active (checked) '
+                                   'for selected rectification method.\n'
+                                   '3+ points needed for 1st order,\n'
+                                   '6+ points for 2nd order, and\n'
+                                   '10+ points for 3rd order.'))
                 return False
         else:
             return True
@@ -1336,7 +1333,7 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
                                parent=self)
             wx.Yield()
 
-            ret, msg = gcmd.RunCommand('i.rectify',
+            ret, msg = RunCommand('i.rectify',
                                   parent = self,
                                   getErrorMsg = True,
                                   quiet = True,
@@ -1388,12 +1385,12 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
                                              switchPage = True)
                 msg = err = ''
                 
-                ret, out, err = gcmd.RunCommand('v.transform',
-                                                overwrite = True,
-                                                input = vect,
-                                                output = self.outname,
-                                                pointsfile = self.file['points'],
-                                                getErrorMsg = True, read = True) 
+                ret, out, err = RunCommand('v.transform',
+                                           overwrite = True,
+                                           input = vect,
+                                           output = self.outname,
+                                           pointsfile = self.file['points'],
+                                           getErrorMsg = True, read = True) 
                 
                 if ret == 0:
                     self.VectGRList.append(self.outname)
@@ -1453,10 +1450,10 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
 
                 # TODO: connect vectors to copied tables with v.db.connect
                                                    
-            gcmd.GMessage(_('For all vector maps georectified successfully,') + '\n' +
-                          _('you will need to copy any attribute tables') + '\n' +
-                          _('and reconnect them to the georectified vectors'),
-                          parent = self)
+            GMessage(_('For all vector maps georectified successfully,') + '\n' +
+                     _('you will need to copy any attribute tables') + '\n' +
+                     _('and reconnect them to the georectified vectors'),
+                     parent = self)
         
         self.grwiz.SwitchEnv('target')
 
@@ -1591,20 +1588,20 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
         # get list of forward and reverse rms error values for each point
         self.grwiz.SwitchEnv('source')
         
-        ret = gcmd.RunCommand('g.transform',
-                              parent = self,
-                              read = True,
-                              group = xygroup,
-                              order = order)
+        ret = RunCommand('g.transform',
+                         parent = self,
+                         read = True,
+                         group = xygroup,
+                         order = order)
         
         self.grwiz.SwitchEnv('target')
 
         if ret:
             errlist = ret.splitlines()
         else:
-            gcmd.GError(parent = self,
-                        message=_('Could not calculate RMS Error.\n'
-                                  'Possible error with g.transform.'))
+            GError(parent = self,
+                   message=_('Could not calculate RMS Error.\n'
+                             'Possible error with g.transform.'))
             return
         
         # insert error values into GCP list for checked items
@@ -1702,23 +1699,23 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
         self.grwiz.SwitchEnv('source')
         
         if map == 'source':
-            ret = gcmd.RunCommand('g.transform',
-                                  parent = self,
-                                  read = True,
-                                  group = self.xygroup,
-                                  order = 1,
-                                  format = 'dst',
-                                  coords = coord_file)
+            ret = RunCommand('g.transform',
+                             parent = self,
+                             read = True,
+                             group = self.xygroup,
+                             order = 1,
+                             format = 'dst',
+                             coords = coord_file)
 
         elif map == 'target':
-            ret = gcmd.RunCommand('g.transform',
-                                  parent = self,
-                                  read = True,
-                                  group = self.xygroup,
-                                  order = 1,
-                                  flags = 'r',
-                                  format = 'src',
-                                  coords = coord_file)
+            ret = RunCommand('g.transform',
+                             parent = self,
+                             read = True,
+                             group = self.xygroup,
+                             order = 1,
+                             flags = 'r',
+                             format = 'src',
+                             coords = coord_file)
 
         os.unlink(coord_file)
         
@@ -1727,9 +1724,9 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
         if ret:
             errlist = ret.splitlines()
         else:
-            gcmd.GError(parent = self,
-                        message=_('Could not calculate new extends.\n'
-                                  'Possible error with g.transform.'))
+            GError(parent = self,
+                   message=_('Could not calculate new extends.\n'
+                             'Possible error with g.transform.'))
             return
 
         # fist corner
@@ -1779,7 +1776,7 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
     def UpdateActive(self, win):
 
         # optionally disable tool zoomback tool
-        self.toolbars['gcpdisp'].Enable('zoomback', enable = (len(self.MapWindow.zoomhistory) > 1))
+        self.GetMapToolbar().Enable('zoomback', enable = (len(self.MapWindow.zoomhistory) > 1))
 
         if self.activemap.GetSelection() != (win == self.TgtMapWindow):
             self.activemap.SetSelection(win == self.TgtMapWindow)
@@ -1875,7 +1872,7 @@ class GCP(MapFrame, wx.Frame, ColumnSorterMixin):
     def OnDispResize(self, event):
         """!GCP Map Display resized, adjust Map Windows
         """
-        if self.toolbars['gcpdisp']:
+        if self.GetMapToolbar():
             srcwidth, srcheight = self.SrcMapWindow.GetSize()
             tgtwidth, tgtheight = self.TgtMapWindow.GetSize()
             srcwidth = (srcwidth + tgtwidth) / 2
@@ -1974,6 +1971,8 @@ class GCPList(wx.ListCtrl,
         self.ResizeColumns()
         self.render = True
 
+        self.EnsureVisible(self.selected)
+
     def OnCheckItem(self, index, flag):
         """!Item is checked/unchecked"""
 
@@ -2010,6 +2009,8 @@ class GCPList(wx.ListCtrl,
 
         self.ResizeColumns()
 
+        self.EnsureVisible(self.selected)
+
         return self.selected
 
     def DeleteGCPItem(self):
@@ -2073,8 +2074,8 @@ class GCPList(wx.ListCtrl,
             values = dlg.GetValues() # string
             
             if len(values) == 0:
-                gcmd.GError(parent = self,
-                            message=_("Invalid coordinate value. Operation cancelled."))
+                GError(parent = self,
+                       message=_("Invalid coordinate value. Operation canceled."))
             else:
                 for i in range(len(values)):
                     if values[i] != coords[i]:
@@ -2542,16 +2543,16 @@ class GrSettingsDialog(wx.Dialog):
         # maps to display
         #
         # source map to display
-        self.srcselection = gselect.Select(panel, id=wx.ID_ANY,
-                    size=globalvar.DIALOG_GSELECT_SIZE, type='cell', updateOnPopup = False)
+        self.srcselection = Select(panel, id=wx.ID_ANY,
+                                   size=globalvar.DIALOG_GSELECT_SIZE, type='cell', updateOnPopup = False)
         self.parent.grwiz.SwitchEnv('source')
         self.srcselection.SetElementList(maptype)
         # filter out all maps not in group
         self.srcselection.tcp.GetElementList(elements = self.parent.src_maps)
 
         # target map to display
-        self.tgtselection = gselect.Select(panel, id=wx.ID_ANY,
-                    size=globalvar.DIALOG_GSELECT_SIZE, type='cell', updateOnPopup = False)
+        self.tgtselection = Select(panel, id=wx.ID_ANY,
+                                   size=globalvar.DIALOG_GSELECT_SIZE, type='cell', updateOnPopup = False)
         self.parent.grwiz.SwitchEnv('target')
         self.tgtselection.SetElementList(maptype)
         self.tgtselection.GetElementList()
@@ -2646,12 +2647,12 @@ class GrSettingsDialog(wx.Dialog):
         self.sdfactor = float(event.GetString())
 
         if self.sdfactor <= 0:
-            gcmd.GError(parent = self,
-                        message=_('RMS threshold factor must be > 0'))
+            GError(parent = self,
+                   message=_('RMS threshold factor must be > 0'))
         elif self.sdfactor < 1:
-            gcmd.GError(parent = self,
-                        message=_('RMS threshold factor is < 1\n'
-                                  'Too many points might be highlighted'))
+            GError(parent = self,
+                   message=_('RMS threshold factor is < 1\n'
+                             'Too many points might be highlighted'))
         
     def OnSrcSelection(self,event):
         """!Source map to display selected"""
@@ -2748,7 +2749,7 @@ class GrSettingsDialog(wx.Dialog):
                     self.parent.show_target = True
                     self.parent._mgr.GetPane("target").Show()
                     self.parent._mgr.Update()
-                    self.parent.toolbars['gcpdisp'].Enable('zoommenu', enable = True)
+                    self.parent.GetMapToolbar().Enable('zoommenu', enable = True)
                     self.parent.activemap.Enable()
                     self.parent.TgtMapWindow.ZoomToMap(layers = self.parent.TgtMap.GetListOfLayers())
             else: # tgt_map == ''
@@ -2758,7 +2759,7 @@ class GrSettingsDialog(wx.Dialog):
                     self.parent._mgr.Update()
                     self.parent.activemap.SetSelection(0)
                     self.parent.activemap.Enable(False)
-                    self.parent.toolbars['gcpdisp'].Enable('zoommenu', enable = False)
+                    self.parent.GetMapToolbar().Enable('zoommenu', enable = False)
 
         self.parent.UpdateColours(srcrender, srcrenderVector, tgtrender, tgtrenderVector)
 
diff --git a/gui/wxpython/gcp/mapdisplay.py b/gui/wxpython/gcp/mapdisplay.py
new file mode 100644
index 0000000..6f7dab1
--- /dev/null
+++ b/gui/wxpython/gcp/mapdisplay.py
@@ -0,0 +1,630 @@
+"""!
+ at package gcp.mapdisplay
+
+ at brief Display to manage ground control points with two toolbars, one
+for various display management functions, one for manipulating GCPs.
+
+Classes:
+- mapdisplay::MapFrame
+
+(C) 2006-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Markus Metz
+"""
+
+import os
+import math
+import platform
+
+from core import globalvar
+import wx
+import wx.aui
+
+from core.render       import EVT_UPDATE_PRGBAR
+from mapdisp.toolbars  import MapToolbar
+from gcp.toolbars      import GCPDisplayToolbar, GCPManToolbar
+from mapdisp.gprint    import PrintOptions
+from core.gcmd         import GMessage
+from gui_core.dialogs  import GetImageHandlers, ImageSizeDialog
+from gui_core.mapdisp  import MapFrameBase
+from core.settings     import UserSettings
+from mapdisp.mapwindow import BufferedWindow
+
+import mapdisp.statusbar as sb
+
+# for standalone app
+cmdfilename = None
+
+class MapFrame(MapFrameBase):
+    """!Main frame for map display window. Drawing takes place in
+    child double buffered drawing window.
+    """
+    def __init__(self, parent=None, title=_("GRASS GIS Manage Ground Control Points"),
+                 toolbars=["gcpdisp"], tree=None, notebook=None, lmgr=None,
+                 page=None, Map=None, auimgr=None, name = 'GCPMapWindow', **kwargs):
+        """!Main map display window with toolbars, statusbar and
+        DrawWindow
+
+        @param toolbars array of activated toolbars, e.g. ['map', 'digit']
+        @param tree reference to layer tree
+        @param notebook control book ID in Layer Manager
+        @param lmgr Layer Manager
+        @param page notebook page with layer tree
+        @param Map instance of render.Map
+        @param auimgs AUI manager
+        @param kwargs wx.Frame attribures
+        """
+        
+        MapFrameBase.__init__(self, parent = parent, title = title, toolbars = toolbars,
+                              Map = Map, auimgr = auimgr, name = name, **kwargs)
+        
+        self._layerManager = lmgr   # Layer Manager object
+        self.tree       = tree      # Layer Manager layer tree object
+        self.page       = page      # Notebook page holding the layer tree
+        self.layerbook  = notebook  # Layer Manager layer tree notebook
+        #
+        # Add toolbars
+        #
+        for toolb in toolbars:
+            self.AddToolbar(toolb)
+
+        self.activemap = self.toolbars['gcpdisp'].togglemap
+        self.activemap.SetSelection(0)
+        
+        self.SrcMap        = self.grwiz.SrcMap       # instance of render.Map
+        self.TgtMap        = self.grwiz.TgtMap       # instance of render.Map
+        self._mgr.SetDockSizeConstraint(0.5, 0.5)
+
+        #
+        # Add statusbar
+        #
+        
+        # items for choice
+        self.statusbarItems = [sb.SbCoordinates,
+                               sb.SbRegionExtent,
+                               sb.SbCompRegionExtent,
+                               sb.SbShowRegion,
+                               sb.SbResolution,
+                               sb.SbDisplayGeometry,
+                               sb.SbMapScale,
+                               sb.SbProjection,
+                               sb.SbGoToGCP,
+                               sb.SbRMSError]
+                            
+        
+        # create statusbar and its manager
+        statusbar = self.CreateStatusBar(number = 4, style = 0)
+        statusbar.SetStatusWidths([-5, -2, -1, -1])
+        self.statusbarManager = sb.SbManager(mapframe = self, statusbar = statusbar)
+        
+        # fill statusbar manager
+        self.statusbarManager.AddStatusbarItemsByClass(self.statusbarItems, mapframe = self, statusbar = statusbar)
+        self.statusbarManager.AddStatusbarItem(sb.SbMask(self, statusbar = statusbar, position = 2))
+        self.statusbarManager.AddStatusbarItem(sb.SbRender(self, statusbar = statusbar, position = 3))
+        
+        self.statusbarManager.SetMode(8) # goto GCP
+        self.statusbarManager.Update()
+        
+
+        #
+        # Init map display (buffered DC & set default cursor)
+        #
+        self.grwiz.SwitchEnv('source')
+        self.SrcMapWindow = BufferedWindow(self, id=wx.ID_ANY,
+                                          Map=self.SrcMap, tree=self.tree, lmgr=self._layerManager)
+
+        self.grwiz.SwitchEnv('target')
+        self.TgtMapWindow = BufferedWindow(self, id=wx.ID_ANY,
+                                          Map=self.TgtMap, tree=self.tree, lmgr=self._layerManager)
+        self.MapWindow = self.SrcMapWindow
+        self.Map = self.SrcMap
+        self.SrcMapWindow.SetCursor(self.cursors["cross"])
+        self.TgtMapWindow.SetCursor(self.cursors["cross"])
+
+        #
+        # initialize region values
+        #
+        self._initMap(map = self.SrcMap) 
+        self._initMap(map = self.TgtMap) 
+
+        #
+        # Bind various events
+        #
+        self.Bind(wx.EVT_ACTIVATE, self.OnFocus)
+        self.Bind(EVT_UPDATE_PRGBAR, self.OnUpdateProgress)
+        self.Bind(wx.EVT_SIZE,     self.OnDispResize)
+        self.activemap.Bind(wx.EVT_CHOICE, self.OnUpdateActive)
+        
+        #
+        # Update fancy gui style
+        #
+        # AuiManager wants a CentrePane, workaround to get two equally sized windows
+        self.list = self.CreateGCPList()
+
+        #self.SrcMapWindow.SetSize((300, 300))
+        #self.TgtMapWindow.SetSize((300, 300))
+        self.list.SetSize((100, 150))
+        self._mgr.AddPane(self.list, wx.aui.AuiPaneInfo().
+                  Name("gcplist").Caption(_("GCP List")).LeftDockable(False).
+                  RightDockable(False).PinButton().FloatingSize((600,200)).
+                  CloseButton(False).DestroyOnClose(True).
+                  Top().Layer(1).MinSize((200,100)))
+        self._mgr.AddPane(self.SrcMapWindow, wx.aui.AuiPaneInfo().
+                  Name("source").Caption(_("Source Display")).Dockable(False).
+                  CloseButton(False).DestroyOnClose(True).Floatable(False).
+                  Centre())
+        self._mgr.AddPane(self.TgtMapWindow, wx.aui.AuiPaneInfo().
+                  Name("target").Caption(_("Target Display")).Dockable(False).
+                  CloseButton(False).DestroyOnClose(True).Floatable(False).
+                  Right().Layer(0))
+
+        srcwidth, srcheight = self.SrcMapWindow.GetSize()
+        tgtwidth, tgtheight = self.TgtMapWindow.GetSize()
+        srcwidth = (srcwidth + tgtwidth) / 2
+        self._mgr.GetPane("target").Hide()
+        self._mgr.Update()
+        self._mgr.GetPane("source").BestSize((srcwidth, srcheight))
+        self._mgr.GetPane("target").BestSize((srcwidth, srcheight))
+        if self.show_target:
+            self._mgr.GetPane("target").Show()
+        else:
+            self.activemap.Enable(False)
+        # needed by Mac OS, does not harm on Linux, breaks display on Windows
+        if platform.system() != 'Windows':
+            self._mgr.Update()
+
+        #
+        # Init print module and classes
+        #
+        self.printopt = PrintOptions(self, self.MapWindow)
+        
+        #
+        # Initialization of digitization tool
+        #
+        self.digit = None
+
+        # set active map
+        self.MapWindow = self.SrcMapWindow
+        self.Map = self.SrcMap
+        
+        # do not init zoom history here, that happens when zooming to map(s)
+
+        #
+        # Re-use dialogs
+        #
+        self.dialogs = {}
+        self.dialogs['attributes'] = None
+        self.dialogs['category'] = None
+        self.dialogs['barscale'] = None
+        self.dialogs['legend'] = None
+
+        self.decorationDialog = None # decoration/overlays
+
+    def AddToolbar(self, name):
+        """!Add defined toolbar to the window
+        
+        Currently known toolbars are:
+         - 'map'     - basic map toolbar
+         - 'vdigit'  - vector digitizer
+         - 'gcpdisp' - GCP Manager, Display
+         - 'gcpman'  - GCP Manager, points management
+         - 'nviz'    - 3D view mode
+        """
+        # default toolbar
+        if name == "map":
+            self.toolbars['map'] = MapToolbar(self, self.Map)
+
+            self._mgr.AddPane(self.toolbars['map'],
+                              wx.aui.AuiPaneInfo().
+                              Name("maptoolbar").Caption(_("Map Toolbar")).
+                              ToolbarPane().Top().
+                              LeftDockable(False).RightDockable(False).
+                              BottomDockable(False).TopDockable(True).
+                              CloseButton(False).Layer(2).
+                              BestSize((self.toolbars['map'].GetSize())))
+
+        # GCP display
+        elif name == "gcpdisp":
+            self.toolbars['gcpdisp'] = GCPDisplayToolbar(self)
+
+            self._mgr.AddPane(self.toolbars['gcpdisp'],
+                              wx.aui.AuiPaneInfo().
+                              Name("gcpdisplaytoolbar").Caption(_("GCP Display toolbar")).
+                              ToolbarPane().Top().
+                              LeftDockable(False).RightDockable(False).
+                              BottomDockable(False).TopDockable(True).
+                              CloseButton(False).Layer(2))
+
+            if self.show_target == False:
+                self.toolbars['gcpdisp'].Enable('zoommenu', enable = False)
+
+            self.toolbars['gcpman'] = GCPManToolbar(self)
+
+            self._mgr.AddPane(self.toolbars['gcpman'],
+                              wx.aui.AuiPaneInfo().
+                              Name("gcpmanagertoolbar").Caption(_("GCP Manager toolbar")).
+                              ToolbarPane().Top().Row(1).
+                              LeftDockable(False).RightDockable(False).
+                              BottomDockable(False).TopDockable(True).
+                              CloseButton(False).Layer(2))
+            
+        self._mgr.Update()
+
+    def OnUpdateProgress(self, event):
+        """
+        Update progress bar info
+        """
+        self.GetProgressBar().SetValue(event.value)
+        
+        event.Skip()
+        
+    def OnFocus(self, event):
+        """
+        Change choicebook page to match display.
+        Or set display for georectifying
+        """
+        if self._layerManager and \
+                self._layerManager.gcpmanagement:
+            # in GCP Management, set focus to current MapWindow for mouse actions
+            self.OnPointer(event)
+            self.MapWindow.SetFocus()
+        else:
+            # change bookcontrol page to page associated with display
+            # GCP Manager: use bookcontrol?
+            if self.page:
+                pgnum = self.layerbook.GetPageIndex(self.page)
+                if pgnum > -1:
+                    self.layerbook.SetSelection(pgnum)
+        
+        event.Skip()
+
+    def OnDraw(self, event):
+        """!Re-display current map composition
+        """
+        self.MapWindow.UpdateMap(render = False)
+        
+    def OnRender(self, event):
+        """!Re-render map composition (each map layer)
+        """
+        # FIXME: remove qlayer code or use RemoveQueryLayer() now in mapdisp.frame
+        # delete tmp map layers (queries)
+        qlayer = self.Map.GetListOfLayers(l_name=globalvar.QUERYLAYER)
+        for layer in qlayer:
+            self.Map.DeleteLayer(layer)
+
+        self.SrcMapWindow.UpdateMap(render=True)
+        if self.show_target:
+            self.TgtMapWindow.UpdateMap(render=True)
+        
+        # update statusbar
+        self.StatusbarUpdate()
+
+    def OnPointer(self, event):
+        """!Pointer button clicked
+        """
+        self.toolbars['gcpdisp'].OnTool(event)
+        self.toolbars['gcpdisp'].action['desc'] = ''
+
+        # change the cursor
+        self.SrcMapWindow.SetCursor(self.cursors["cross"])
+        self.SrcMapWindow.mouse['use'] = "pointer"
+        self.SrcMapWindow.mouse['box'] = "point"
+        self.TgtMapWindow.SetCursor(self.cursors["cross"])
+        self.TgtMapWindow.mouse['use'] = "pointer"
+        self.TgtMapWindow.mouse['box'] = "point"
+
+    def OnZoomIn(self, event):
+        """
+        Zoom in the map.
+        Set mouse cursor, zoombox attributes, and zoom direction
+        """
+        self.toolbars['gcpdisp'].OnTool(event)
+        self.toolbars['gcpdisp'].action['desc'] = ''
+        
+        self.MapWindow.mouse['use'] = "zoom"
+        self.MapWindow.mouse['box'] = "box"
+        self.MapWindow.zoomtype = 1
+        self.MapWindow.pen = wx.Pen(colour='Red', width=2, style=wx.SHORT_DASH)
+        
+        # change the cursor
+        self.MapWindow.SetCursor(self.cursors["cross"])
+
+        if self.MapWindow == self.SrcMapWindow:
+            win = self.TgtMapWindow
+        elif self.MapWindow == self.TgtMapWindow:
+            win = self.SrcMapWindow
+
+        win.mouse['use'] = "zoom"
+        win.mouse['box'] = "box"
+        win.zoomtype = 1
+        win.pen = wx.Pen(colour='Red', width=2, style=wx.SHORT_DASH)
+        
+        # change the cursor
+        win.SetCursor(self.cursors["cross"])
+
+    def OnZoomOut(self, event):
+        """
+        Zoom out the map.
+        Set mouse cursor, zoombox attributes, and zoom direction
+        """
+        self.toolbars['gcpdisp'].OnTool(event)
+        self.toolbars['gcpdisp'].action['desc'] = ''
+        
+        self.MapWindow.mouse['use'] = "zoom"
+        self.MapWindow.mouse['box'] = "box"
+        self.MapWindow.zoomtype = -1
+        self.MapWindow.pen = wx.Pen(colour='Red', width=2, style=wx.SHORT_DASH)
+        
+        # change the cursor
+        self.MapWindow.SetCursor(self.cursors["cross"])
+
+        if self.MapWindow == self.SrcMapWindow:
+            win = self.TgtMapWindow
+        elif self.MapWindow == self.TgtMapWindow:
+            win = self.SrcMapWindow
+
+        win.mouse['use'] = "zoom"
+        win.mouse['box'] = "box"
+        win.zoomtype = -1
+        win.pen = wx.Pen(colour='Red', width=2, style=wx.SHORT_DASH)
+        
+        # change the cursor
+        win.SetCursor(self.cursors["cross"])
+
+    def OnPan(self, event):
+        """
+        Panning, set mouse to drag
+        """
+        self.toolbars['gcpdisp'].OnTool(event)
+        self.toolbars['gcpdisp'].action['desc'] = ''
+        
+        self.MapWindow.mouse['use'] = "pan"
+        self.MapWindow.mouse['box'] = "pan"
+        self.MapWindow.zoomtype = 0
+        
+        # change the cursor
+        self.MapWindow.SetCursor(self.cursors["hand"])
+
+        if self.MapWindow == self.SrcMapWindow:
+            win = self.TgtMapWindow
+        elif self.MapWindow == self.TgtMapWindow:
+            win = self.SrcMapWindow
+
+        win.mouse['use'] = "pan"
+        win.mouse['box'] = "pan"
+        win.zoomtype = 0
+        
+        # change the cursor
+        win.SetCursor(self.cursors["hand"])
+
+    def OnErase(self, event):
+        """
+        Erase the canvas
+        """
+        self.MapWindow.EraseMap()
+
+        if self.MapWindow == self.SrcMapWindow:
+            win = self.TgtMapWindow
+        elif self.MapWindow == self.TgtMapWindow:
+            win = self.SrcMapWindow
+
+        win.EraseMap()
+
+    def OnZoomRegion(self, event):
+        """
+        Zoom to region
+        """
+        self.Map.getRegion()
+        self.Map.getResolution()
+        self.UpdateMap()
+        # event.Skip()
+
+    def OnAlignRegion(self, event):
+        """
+        Align region
+        """
+        if not self.Map.alignRegion:
+            self.Map.alignRegion = True
+        else:
+            self.Map.alignRegion = False
+        # event.Skip()
+    
+    def SaveToFile(self, event):
+        """!Save map to image
+        """
+        img = self.MapWindow.img
+        if not img:
+            GMessage(parent = self,
+                     message = _("Nothing to render (empty map). Operation canceled."))
+            return
+        filetype, ltype = GetImageHandlers(img)
+
+        # get size
+        dlg = ImageSizeDialog(self)
+        dlg.CentreOnParent()
+        if dlg.ShowModal() != wx.ID_OK:
+            dlg.Destroy()
+            return
+        width, height = dlg.GetValues()
+        dlg.Destroy()
+        
+        # get filename
+        dlg = wx.FileDialog(parent = self,
+                            message = _("Choose a file name to save the image "
+                                        "(no need to add extension)"),
+                            wildcard = filetype,
+                            style=wx.SAVE | wx.FD_OVERWRITE_PROMPT)
+        
+        if dlg.ShowModal() == wx.ID_OK:
+            path = dlg.GetPath()
+            if not path:
+                dlg.Destroy()
+                return
+            
+            base, ext = os.path.splitext(path)
+            fileType = ltype[dlg.GetFilterIndex()]['type']
+            extType  = ltype[dlg.GetFilterIndex()]['ext']
+            if ext != extType:
+                path = base + '.' + extType
+            
+            self.MapWindow.SaveToFile(path, fileType,
+                                      width, height)
+            
+        dlg.Destroy()
+
+    def PrintMenu(self, event):
+        """
+        Print options and output menu for map display
+        """
+        point = wx.GetMousePosition()
+        printmenu = wx.Menu()
+        # Add items to the menu
+        setup = wx.MenuItem(printmenu, wx.ID_ANY, _('Page setup'))
+        printmenu.AppendItem(setup)
+        self.Bind(wx.EVT_MENU, self.printopt.OnPageSetup, setup)
+
+        preview = wx.MenuItem(printmenu, wx.ID_ANY, _('Print preview'))
+        printmenu.AppendItem(preview)
+        self.Bind(wx.EVT_MENU, self.printopt.OnPrintPreview, preview)
+
+        doprint = wx.MenuItem(printmenu, wx.ID_ANY, _('Print display'))
+        printmenu.AppendItem(doprint)
+        self.Bind(wx.EVT_MENU, self.printopt.OnDoPrint, doprint)
+
+        # Popup the menu.  If an item is selected then its handler
+        # will be called before PopupMenu returns.
+        self.PopupMenu(printmenu)
+        printmenu.Destroy()
+    
+    def FormatDist(self, dist):
+        """!Format length numbers and units in a nice way,
+        as a function of length. From code by Hamish Bowman
+        Grass Development Team 2006"""
+
+        mapunits = self.Map.projinfo['units']
+        if mapunits == 'metres': mapunits = 'meters'
+        outunits = mapunits
+        dist = float(dist)
+        divisor = 1.0
+
+        # figure out which units to use
+        if mapunits == 'meters':
+            if dist > 2500.0:
+                outunits = 'km'
+                divisor = 1000.0
+            else: outunits = 'm'
+        elif mapunits == 'feet':
+            # nano-bug: we match any "feet", but US Survey feet is really
+            #  5279.9894 per statute mile, or 10.6' per 1000 miles. As >1000
+            #  miles the tick markers are rounded to the nearest 10th of a
+            #  mile (528'), the difference in foot flavours is ignored.
+            if dist > 5280.0:
+                outunits = 'miles'
+                divisor = 5280.0
+            else:
+                outunits = 'ft'
+        elif 'degree' in mapunits:
+            if dist < 1:
+                outunits = 'min'
+                divisor = (1/60.0)
+            else:
+                outunits = 'deg'
+
+        # format numbers in a nice way
+        if (dist/divisor) >= 2500.0:
+            outdist = round(dist/divisor)
+        elif (dist/divisor) >= 1000.0:
+            outdist = round(dist/divisor,1)
+        elif (dist/divisor) > 0.0:
+            outdist = round(dist/divisor,int(math.ceil(3-math.log10(dist/divisor))))
+        else:
+            outdist = float(dist/divisor)
+
+        return (outdist, outunits)
+
+    def OnZoomToRaster(self, event):
+        """!
+        Set display extents to match selected raster map (ignore NULLs)
+        """
+        self.MapWindow.ZoomToMap(ignoreNulls = True)
+        
+    def OnZoomToSaved(self, event):
+        """!Set display geometry to match extents in
+        saved region file
+        """
+        self.MapWindow.ZoomToSaved()
+        
+    def OnDisplayToWind(self, event):
+        """!Set computational region (WIND file) to match display
+        extents
+        """
+        self.MapWindow.DisplayToWind()
+ 
+    def SaveDisplayRegion(self, event):
+        """!Save display extents to named region file.
+        """
+        self.MapWindow.SaveDisplayRegion()
+        
+    def OnZoomMenu(self, event):
+        """!Popup Zoom menu
+        """
+        point = wx.GetMousePosition()
+        zoommenu = wx.Menu()
+        # Add items to the menu
+
+        zoomwind = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to computational region (set with g.region)'))
+        zoommenu.AppendItem(zoomwind)
+        self.Bind(wx.EVT_MENU, self.OnZoomToWind, zoomwind)
+
+        zoomdefault = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to default region'))
+        zoommenu.AppendItem(zoomdefault)
+        self.Bind(wx.EVT_MENU, self.OnZoomToDefault, zoomdefault)
+
+        zoomsaved = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to saved region'))
+        zoommenu.AppendItem(zoomsaved)
+        self.Bind(wx.EVT_MENU, self.OnZoomToSaved, zoomsaved)
+
+        savewind = wx.MenuItem(zoommenu, wx.ID_ANY, _('Set computational region from display'))
+        zoommenu.AppendItem(savewind)
+        self.Bind(wx.EVT_MENU, self.OnDisplayToWind, savewind)
+
+        savezoom = wx.MenuItem(zoommenu, wx.ID_ANY, _('Save display geometry to named region'))
+        zoommenu.AppendItem(savezoom)
+        self.Bind(wx.EVT_MENU, self.SaveDisplayRegion, savezoom)
+
+        # Popup the menu. If an item is selected then its handler
+        # will be called before PopupMenu returns.
+        self.PopupMenu(zoommenu)
+        zoommenu.Destroy()
+        
+        
+    def IsStandalone(self):
+        """!Check if Map display is standalone"""
+        if self._layerManager:
+            return False
+        
+        return True
+    
+    def GetLayerManager(self):
+        """!Get reference to Layer Manager
+
+        @return window reference
+        @return None (if standalone)
+        """
+        return self._layerManager
+    
+    def GetSrcWindow(self):
+        return self.SrcMapWindow
+        
+    def GetTgtWindow(self):
+        return self.TgtMapWindow
+    
+    def GetShowTarget(self):
+        return self.show_target
+        
+    def GetMapToolbar(self):
+        """!Returns toolbar with zooming tools"""
+        return self.toolbars['gcpdisp']
diff --git a/gui/wxpython/gcp/toolbars.py b/gui/wxpython/gcp/toolbars.py
new file mode 100644
index 0000000..295cb64
--- /dev/null
+++ b/gui/wxpython/gcp/toolbars.py
@@ -0,0 +1,155 @@
+"""!
+ at package gcp.toolbars
+
+ at brief Georectification module - toolbars
+
+Classes:
+ - toolbars::GCPManToolbar
+ - toolbars::GCPDisplayToolbar
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Markus Metz
+"""
+
+import os
+import sys
+
+import wx
+
+from core              import globalvar
+from gui_core.toolbars import BaseToolbar, BaseIcons
+from icon              import MetaIcon
+   
+class GCPManToolbar(BaseToolbar):
+    """!Toolbar for managing ground control points
+
+    @param parent reference to GCP widget
+    """
+    def __init__(self, parent):
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # realize the toolbar
+        self.Realize()
+
+    def _toolbarData(self):
+        icons = {
+            'gcpAdd'     : MetaIcon(img = 'gcp-add',
+                                    label = _('Add new GCP to the list')),
+            'gcpDelete'  : MetaIcon(img = 'gcp-delete',
+                                    label = _('Delete selected GCP')),
+            'gcpClear'   : MetaIcon(img = 'gcp-remove',
+                                    label = _('Clear selected GCP')),
+            'gcpRms'     : MetaIcon(img = 'gcp-rms',
+                                    label = _('Recalculate RMS error')),
+            'georectify' : MetaIcon(img = 'georectify',
+                                    label = _('Georectify')),
+            'gcpSave'    : MetaIcon(img = 'gcp-save',
+                                    label = _('Save GCPs to POINTS file')),
+            'gcpReload'  : MetaIcon(img = 'reload',
+                                    label = _('Reload GCPs from POINTS file')),
+            }
+        
+        return self._getToolbarData((('gcpAdd', icons["gcpAdd"],
+                                      self.parent.AddGCP),
+                                     ('gcpDelete', icons["gcpDelete"],
+                                      self.parent.DeleteGCP),
+                                     ('gcpClear', icons["gcpClear"],
+                                      self.parent.ClearGCP),
+                                     (None, ),
+                                     ('rms', icons["gcpRms"],
+                                      self.parent.OnRMS),
+                                     ('georect', icons["georectify"],
+                                      self.parent.OnGeorect),
+                                     (None, ),
+                                     ('gcpSave', icons["gcpSave"],
+                                      self.parent.SaveGCPs),
+                                     ('gcpReload', icons["gcpReload"],
+                                      self.parent.ReloadGCPs))
+                                    )
+    
+class GCPDisplayToolbar(BaseToolbar):
+    """
+    GCP Display toolbar
+    """
+    def __init__(self, parent):
+        """!
+        GCP Display toolbar constructor
+        """
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # add tool to toggle active map window
+        self.togglemapid = wx.NewId()
+        self.togglemap = wx.Choice(parent = self, id = self.togglemapid,
+                                   choices = [_('source'), _('target')])
+
+        self.InsertControl(10, self.togglemap)
+
+        self.SetToolShortHelp(self.togglemapid, '%s %s %s' % (_('Set map canvas for '),
+                                                              BaseIcons["zoomBack"].GetLabel(),
+                                                              _(' / Zoom to map')))
+
+        # realize the toolbar
+        self.Realize()
+        
+        self.action = { 'id' : self.gcpset }
+        self.defaultAction = { 'id' : self.gcpset,
+                               'bind' : self.parent.OnPointer }
+        
+        self.OnTool(None)
+        
+        self.EnableTool(self.zoomback, False)
+        
+    def _toolbarData(self):
+        """!Toolbar data"""
+        icons = {
+            'gcpSet'    : MetaIcon(img = 'gcp-create',
+                                   label = _('Update GCP coordinates'),
+                                   desc = _('Update GCP coordinates)')),
+            'quit'      : BaseIcons['quit'].SetLabel(_('Quit georectification tool')),
+            'settings'  : BaseIcons['settings'].SetLabel( _('Georectifier settings')),
+            'help'      : BaseIcons['help'].SetLabel(_('Georectifier manual')),
+            }
+        
+        return self._getToolbarData((("displaymap", BaseIcons["display"],
+                                      self.parent.OnDraw),
+                                     ("rendermap", BaseIcons["render"],
+                                      self.parent.OnRender),
+                                     ("erase", BaseIcons["erase"],
+                                      self.parent.OnErase),
+                                     (None, ),
+                                     ("gcpset", icons["gcpSet"],
+                                      self.parent.OnPointer,
+                                      wx.ITEM_CHECK),
+                                     ("pan", BaseIcons["pan"],
+                                      self.parent.OnPan,
+                                      wx.ITEM_CHECK),
+                                     ("zoomin", BaseIcons["zoomIn"],
+                                      self.parent.OnZoomIn,
+                                      wx.ITEM_CHECK),
+                                     ("zoomout", BaseIcons["zoomOut"],
+                                      self.parent.OnZoomOut,
+                                      wx.ITEM_CHECK),
+                                     ("zoommenu", BaseIcons["zoomMenu"],
+                                      self.parent.OnZoomMenuGCP),
+                                     (None, ),
+                                     ("zoomback", BaseIcons["zoomBack"],
+                                      self.parent.OnZoomBack),
+                                     ("zoomtomap", BaseIcons["zoomExtent"],
+                                      self.parent.OnZoomToMap),
+                                     (None, ),
+                                     ('settings', icons["settings"],
+                                      self.parent.OnSettings),
+                                     ('help', icons["help"],
+                                      self.parent.OnHelp),
+                                     (None, ),
+                                     ('quit', icons["quit"],
+                                      self.parent.OnQuit))
+                                    )
diff --git a/gui/wxpython/gmodeler/dialogs.py b/gui/wxpython/gmodeler/dialogs.py
new file mode 100644
index 0000000..6c40b7a
--- /dev/null
+++ b/gui/wxpython/gmodeler/dialogs.py
@@ -0,0 +1,966 @@
+"""!
+ at package gmodeler.dialogs
+
+ at brief wxGUI Graphical Modeler - dialogs
+
+Classes:
+ - dialogs::ModelDataDialog
+ - dialogs::ModelSearchDialog
+ - dialogs::ModelRelationDialog
+ - dialogs::ModelItemDialog
+ - dialogs::ModelLoopDialog
+ - dialogs::ModelConditionDialog
+ - dialogs::ModelListCtrl
+ - dialogs::ValiableListCtrl
+ - dialogs::ItemListCtrl
+ - dialogs::ItemCheckListCtrl
+
+(C) 2010-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import os
+import sys
+
+import wx
+import wx.lib.mixins.listctrl as listmix
+
+from core                 import globalvar
+from core                 import utils
+from gui_core.widgets     import GNotebook
+from core.gcmd            import GError, EncodeString
+from gui_core.dialogs     import ElementDialog, MapLayersDialog
+from gui_core.ghelp       import SearchModuleWindow
+from gui_core.prompt      import GPromptSTC
+from gui_core.forms       import CmdPanel
+from gui_core.gselect     import Select
+from gmodeler.model       import *
+
+from grass.script import task as gtask
+
+class ModelDataDialog(ElementDialog):
+    """!Data item properties dialog"""
+    def __init__(self, parent, shape, id = wx.ID_ANY, title = _("Data properties"),
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER):
+        self.parent = parent
+        self.shape = shape
+        
+        label, etype = self._getLabel()
+        ElementDialog.__init__(self, parent, title, label = label, etype = etype)
+                
+        self.element = Select(parent = self.panel)
+        self.element.SetValue(shape.GetValue())
+        
+        self.Bind(wx.EVT_BUTTON, self.OnOK,     self.btnOK)
+        self.Bind(wx.EVT_BUTTON, self.OnCancel, self.btnCancel)
+        
+        self.PostInit()
+        
+        if shape.GetValue():
+            self.btnOK.Enable()
+        
+        self._layout()
+        self.SetMinSize(self.GetSize())
+        
+    def _getLabel(self):
+        etype = False
+        prompt = self.shape.GetPrompt()
+        if prompt == 'raster':
+            label = _('Name of raster map:')
+        elif prompt == 'vector':
+            label = _('Name of vector map:')
+        else:
+            etype = True
+            label = _('Name of element:')
+
+        return label, etype
+    
+    def _layout(self):
+        """!Do layout"""
+        self.dataSizer.Add(self.element, proportion=0,
+                      flag=wx.EXPAND | wx.ALL, border=1)
+        
+        self.panel.SetSizer(self.sizer)
+        self.sizer.Fit(self)
+
+    def OnOK(self, event):
+        """!Ok pressed"""
+        self.shape.SetValue(self.GetElement())
+        if self.etype:
+            elem = self.GetType()
+            if elem == 'rast':
+                self.shape.SetPrompt('raster')
+            elif elem == 'vect':
+                self.shape.SetPrompt('raster')
+        
+        self.parent.canvas.Refresh()
+        self.parent.SetStatusText('', 0)
+        self.shape.SetPropDialog(None)
+        
+        if self.IsModal():
+            event.Skip() 
+        else:
+            self.Destroy()
+    
+    def OnCancel(self, event):
+        """!Cancel pressed"""
+        self.shape.SetPropDialog(None)
+        if self.IsModal():
+            event.Skip()
+        else:
+            self.Destroy()
+
+class ModelSearchDialog(wx.Dialog):
+    def __init__(self, parent, id = wx.ID_ANY, title = _("Add new GRASS module to the model"),
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
+        """!Graphical modeler module search window
+        
+        @param parent parent window
+        @param id window id
+        @param title window title
+        @param kwargs wx.Dialogs' arguments
+        """
+        self.parent = parent
+        
+        wx.Dialog.__init__(self, parent = parent, id = id, title = title, **kwargs)
+        self.SetName("ModelerDialog")
+        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
+        
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
+        
+        self.cmdBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                   label=" %s " % _("Command"))
+        
+        self.cmd_prompt = GPromptSTC(parent = self)
+        self.search = SearchModuleWindow(parent = self.panel, cmdPrompt = self.cmd_prompt, showTip = True)
+        wx.CallAfter(self.cmd_prompt.SetFocus)
+        
+        # get commands
+        items = self.cmd_prompt.GetCommandItems()
+        
+        self.btnCancel = wx.Button(self.panel, wx.ID_CANCEL)
+        self.btnOk     = wx.Button(self.panel, wx.ID_OK)
+        self.btnOk.SetDefault()
+        self.btnOk.Enable(False)
+
+        self.cmd_prompt.Bind(wx.EVT_KEY_UP, self.OnText)
+        self.search.searchChoice.Bind(wx.EVT_CHOICE, self.OnText)
+        self.Bind(wx.EVT_BUTTON, self.OnOk, self.btnOk)
+        
+        self._layout()
+        
+        self.SetSize((500, 275))
+        
+    def _layout(self):
+        cmdSizer = wx.StaticBoxSizer(self.cmdBox, wx.VERTICAL)
+        cmdSizer.Add(item = self.cmd_prompt, proportion = 1,
+                     flag = wx.EXPAND)
+        
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(self.btnCancel)
+        btnSizer.AddButton(self.btnOk)
+        btnSizer.Realize()
+        
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        mainSizer.Add(item = self.search, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL, border = 3)
+        mainSizer.Add(item = cmdSizer, proportion = 1,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, border = 3)
+        mainSizer.Add(item = btnSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+        
+        self.panel.SetSizer(mainSizer)
+        mainSizer.Fit(self.panel)
+        
+        self.Layout()
+
+    def GetPanel(self):
+        """!Get dialog panel"""
+        return self.panel
+
+    def GetCmd(self):
+        """!Get command"""
+        line = self.cmd_prompt.GetCurLine()[0].strip()
+        if len(line) == 0:
+            list()
+        
+        try:
+            cmd = utils.split(str(line))
+        except UnicodeError:
+            cmd = utils.split(utils.EncodeString((line)))
+            
+        return cmd
+    
+    def OnOk(self, event):
+        """!Button 'OK' pressed"""
+        self.btnOk.SetFocus()
+        cmd = self.GetCmd()
+        
+        if len(cmd) < 1:
+            GError(parent = self,
+                   message = _("Command not defined.\n\n"
+                               "Unable to add new action to the model."))
+            return
+        
+        if cmd[0] not in globalvar.grassCmd:
+            GError(parent = self,
+                   message = _("'%s' is not a GRASS module.\n\n"
+                               "Unable to add new action to the model.") % cmd[0])
+            return
+        
+        self.EndModal(wx.ID_OK)
+        
+    def OnText(self, event):
+        """!Text in prompt changed"""
+        if self.cmd_prompt.AutoCompActive():
+            event.Skip()
+            return
+        
+        if isinstance(event, wx.KeyEvent):
+            entry = self.cmd_prompt.GetTextLeft()
+        elif isinstance(event, wx.stc.StyledTextEvent):
+            entry = event.GetText()
+        else:
+            entry = event.GetString()
+        
+        if entry:
+            self.btnOk.Enable()
+        else:
+            self.btnOk.Enable(False)
+            
+        event.Skip()
+        
+    def Reset(self):
+        """!Reset dialog"""
+        self.search.Reset()
+        self.cmd_prompt.OnCmdErase(None)
+        self.btnOk.Enable(False)
+        self.cmd_prompt.SetFocus()
+
+class ModelRelationDialog(wx.Dialog):
+    """!Relation properties dialog"""
+    def __init__(self, parent, shape, id = wx.ID_ANY, title = _("Relation properties"),
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
+        self.parent = parent
+        self.shape = shape
+        
+        options = self._getOptions()
+        if not options:
+            self.valid = False
+            return
+        
+        self.valid = True
+        wx.Dialog.__init__(self, parent, id, title, style = style, **kwargs)
+        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
+        
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
+        
+        self.fromBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                    label = " %s " % _("From"))
+        self.toBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                  label = " %s " % _("To"))
+        
+        self.option = wx.ComboBox(parent = self.panel, id = wx.ID_ANY,
+                                  style = wx.CB_READONLY,
+                                  choices = options)
+        self.option.Bind(wx.EVT_COMBOBOX, self.OnOption)
+        
+        self.btnCancel = wx.Button(self.panel, wx.ID_CANCEL)
+        self.btnOk     = wx.Button(self.panel, wx.ID_OK)
+        self.btnOk.Enable(False)
+        
+        self._layout()
+
+    def _layout(self):
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+
+        fromSizer = wx.StaticBoxSizer(self.fromBox, wx.VERTICAL)
+        self._layoutShape(shape = self.shape.GetFrom(), sizer = fromSizer)
+        toSizer = wx.StaticBoxSizer(self.toBox, wx.VERTICAL)
+        self._layoutShape(shape = self.shape.GetTo(), sizer = toSizer)
+
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(self.btnCancel)
+        btnSizer.AddButton(self.btnOk)
+        btnSizer.Realize()
+        
+        mainSizer.Add(item = fromSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL, border = 5)
+        mainSizer.Add(item = toSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
+        mainSizer.Add(item = btnSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+        
+        self.panel.SetSizer(mainSizer)
+        mainSizer.Fit(self.panel)
+        
+        self.Layout()
+        self.SetSize(self.GetBestSize())
+        
+    def _layoutShape(self, shape, sizer):
+        if isinstance(shape, ModelData):
+            sizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                           label = _("Data: %s") % shape.GetLog()),
+                      proportion = 1, flag = wx.EXPAND | wx.ALL,
+                      border = 5)
+        elif isinstance(shape, ModelAction):
+            gridSizer = wx.GridBagSizer (hgap = 5, vgap = 5)
+            gridSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                               label = _("Command:")),
+                          pos = (0, 0))
+            gridSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                               label = shape.GetName()),
+                          pos = (0, 1))
+            gridSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                               label = _("Option:")),
+                          flag = wx.ALIGN_CENTER_VERTICAL,
+                          pos = (1, 0))
+            gridSizer.Add(item = self.option,
+                          pos = (1, 1))
+            sizer.Add(item = gridSizer,
+                      proportion = 1, flag = wx.EXPAND | wx.ALL,
+                      border = 5)
+            
+    def _getOptions(self):
+        """!Get relevant options"""
+        items = []
+        fromShape = self.shape.GetFrom()
+        if not isinstance(fromShape, ModelData):
+            GError(parent = self.parent,
+                   message = _("Relation doesn't start with data item.\n"
+                               "Unable to add relation."))
+            return items
+        
+        toShape = self.shape.GetTo()
+        if not isinstance(toShape, ModelAction):
+            GError(parent = self.parent,
+                   message = _("Relation doesn't point to GRASS command.\n"
+                               "Unable to add relation."))
+            return items
+        
+        prompt = fromShape.GetPrompt()
+        task = toShape.GetTask()
+        for p in task.get_options()['params']:
+            if p.get('prompt', '') == prompt and \
+                    'name' in p:
+                items.append(p['name'])
+        
+        if not items:
+            GError(parent = self.parent,
+                   message = _("No relevant option found.\n"
+                               "Unable to add relation."))
+        return items
+    
+    def GetOption(self):
+        """!Get selected option"""
+        return self.option.GetStringSelection()
+    
+    def IsValid(self):
+        """!Check if relation is valid"""
+        return self.valid
+    
+    def OnOption(self, event):
+        """!Set option"""
+        if event.GetString():
+            self.btnOk.Enable()
+        else:
+            self.btnOk.Enable(False)
+
+class ModelItemDialog(wx.Dialog):
+    """!Abstract item properties dialog"""
+    def __init__(self, parent, shape, title, id = wx.ID_ANY,
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
+        self.parent = parent
+        self.shape = shape
+        
+        wx.Dialog.__init__(self, parent, id, title = title, style = style, **kwargs)
+        
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
+        
+        self.condBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                    label=" %s " % _("Condition"))
+        self.condText = wx.TextCtrl(parent = self.panel, id = wx.ID_ANY,
+                                    value = shape.GetText())
+        
+        self.itemList = ItemCheckListCtrl(parent = self.panel,
+                                          window = self,
+                                          columns = [_("ID"), _("Name"),
+                                                     _("Command")],
+                                          shape = shape)
+        self.itemList.Populate(self.parent.GetModel().GetItems())
+        
+        self.btnCancel = wx.Button(parent = self.panel, id = wx.ID_CANCEL)
+        self.btnOk     = wx.Button(parent = self.panel, id = wx.ID_OK)
+        self.btnOk.SetDefault()
+        
+    def _layout(self):
+        """!Do layout (virtual method)"""
+        pass
+    
+    def GetCondition(self):
+        """!Get loop condition"""
+        return self.condText.GetValue()
+
+class ModelLoopDialog(ModelItemDialog):
+    """!Loop properties dialog"""
+    def __init__(self, parent, shape, id = wx.ID_ANY, title = _("Loop properties"),
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
+        ModelItemDialog.__init__(self, parent, shape, title,
+                                 style = style, **kwargs)
+        
+        self.listBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                    label=" %s " % _("List of items in loop"))
+        
+        self.btnSeries = wx.Button(parent = self.panel, id = wx.ID_ANY,
+                                   label = _("Series"))
+        self.btnSeries.SetToolTipString(_("Define map series as condition for the loop"))
+        self.btnSeries.Bind(wx.EVT_BUTTON, self.OnSeries)
+        
+        self._layout()
+        self.SetMinSize(self.GetSize())
+        self.SetSize((500, 400))
+        
+    def _layout(self):
+        """!Do layout"""
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        
+        condSizer = wx.StaticBoxSizer(self.condBox, wx.HORIZONTAL)
+        condSizer.Add(item = self.condText, proportion = 1,
+                      flag = wx.ALL, border = 3)
+        condSizer.Add(item = self.btnSeries, proportion = 0,
+                      flag = wx.EXPAND)
+
+        listSizer = wx.StaticBoxSizer(self.listBox, wx.VERTICAL)
+        listSizer.Add(item = self.itemList, proportion = 1,
+                      flag = wx.EXPAND | wx.ALL, border = 3)
+        
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(self.btnCancel)
+        btnSizer.AddButton(self.btnOk)
+        btnSizer.Realize()
+
+        sizer.Add(item = condSizer, proportion = 0,
+                  flag = wx.EXPAND | wx.ALL, border = 3)
+        sizer.Add(item = listSizer, proportion = 1,
+                  flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 3)
+        sizer.Add(item = btnSizer, proportion=0,
+                  flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
+        
+        self.panel.SetSizer(sizer)
+        sizer.Fit(self.panel)
+        
+        self.Layout()
+        
+    def GetItems(self):
+        """!Get list of selected actions"""
+        return self.itemList.GetItems()
+
+    def OnSeries(self, event):
+        """!Define map series as condition"""
+        dialog = MapLayersDialog(parent = self, title = _("Define series of maps"), modeler = True)
+        if dialog.ShowModal() != wx.ID_OK:
+            dialog.Destroy()
+            return
+        
+        cond = dialog.GetDSeries()
+        if not cond:
+            cond = 'map in %s' % map(lambda x: str(x), dialog.GetMapLayers())
+        
+        self.condText.SetValue(cond)
+                               
+        dialog.Destroy()
+
+class ModelConditionDialog(ModelItemDialog):
+    """!Condition properties dialog"""
+    def __init__(self, parent, shape, id = wx.ID_ANY, title = _("If-else properties"),
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
+        ModelItemDialog.__init__(self, parent, shape, title,
+                                 style = style, **kwargs)
+        
+        self.listBoxIf = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                      label=" %s " % _("List of items in 'if' block"))
+        self.itemListIf = self.itemList
+        self.itemListIf.SetName('IfBlockList')
+        
+        self.listBoxElse = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                        label=" %s " % _("List of items in 'else' block"))
+        self.itemListElse = ItemCheckListCtrl(parent = self.panel,
+                                              window = self,
+                                              columns = [_("ID"), _("Name"),
+                                                         _("Command")],
+                                              shape = shape)
+        self.itemListElse.SetName('ElseBlockList')
+        self.itemListElse.Populate(self.parent.GetModel().GetItems())
+        
+        self._layout()
+        self.SetMinSize(self.GetSize())
+        self.SetSize((500, 400))
+        
+    def _layout(self):
+        """!Do layout"""
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        
+        condSizer = wx.StaticBoxSizer(self.condBox, wx.VERTICAL)
+        condSizer.Add(item = self.condText, proportion = 1,
+                      flag = wx.EXPAND)
+        
+        listIfSizer = wx.StaticBoxSizer(self.listBoxIf, wx.VERTICAL)
+        listIfSizer.Add(item = self.itemListIf, proportion = 1,
+                        flag = wx.EXPAND)
+        listElseSizer = wx.StaticBoxSizer(self.listBoxElse, wx.VERTICAL)
+        listElseSizer.Add(item = self.itemListElse, proportion = 1,
+                          flag = wx.EXPAND)
+        
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(self.btnCancel)
+        btnSizer.AddButton(self.btnOk)
+        btnSizer.Realize()
+
+        sizer.Add(item = condSizer, proportion = 0,
+                  flag = wx.EXPAND | wx.ALL, border = 3)
+        sizer.Add(item = listIfSizer, proportion = 1,
+                  flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 3)
+        sizer.Add(item = listElseSizer, proportion = 1,
+                  flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 3)
+        sizer.Add(item = btnSizer, proportion=0,
+                  flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
+        
+        self.panel.SetSizer(sizer)
+        sizer.Fit(self.panel)
+        
+        self.Layout()
+
+    def OnCheckItemIf(self, index, flag):
+        """!Item in if-block checked/unchecked"""
+        if flag is False:
+            return
+        
+        aId = int(self.itemListIf.GetItem(index, 0).GetText())
+        if aId in self.itemListElse.GetItems()['checked']:
+            self.itemListElse.CheckItemById(aId, False)
+            
+    def OnCheckItemElse(self, index, flag):
+        """!Item in else-block checked/unchecked"""
+        if flag is False:
+            return
+        
+        aId = int(self.itemListElse.GetItem(index, 0).GetText())
+        if aId in self.itemListIf.GetItems()['checked']:
+            self.itemListIf.CheckItemById(aId, False)
+        
+    def GetItems(self):
+        """!Get items"""
+        return { 'if'   : self.itemListIf.GetItems(),
+                 'else' : self.itemListElse.GetItems() }
+
+class ModelListCtrl(wx.ListCtrl,
+                    listmix.ListCtrlAutoWidthMixin,
+                    listmix.TextEditMixin,
+                    listmix.ColumnSorterMixin):
+    def __init__(self, parent, columns, id = wx.ID_ANY,
+                 style = wx.LC_REPORT | wx.BORDER_NONE |
+                 wx.LC_SORT_ASCENDING |wx.LC_HRULES |
+                 wx.LC_VRULES, **kwargs):
+        """!List of model variables"""
+        self.parent = parent
+        self.columns = columns
+        self.shape = None
+        try:
+            self.frame  = parent.parent
+        except AttributeError:
+            self.frame = None
+        
+        wx.ListCtrl.__init__(self, parent, id = id, style = style, **kwargs)
+        listmix.ListCtrlAutoWidthMixin.__init__(self)
+        listmix.TextEditMixin.__init__(self)
+        listmix.ColumnSorterMixin.__init__(self, 4)
+        
+        i = 0
+        for col in columns:
+            self.InsertColumn(i, col)
+            self.SetColumnWidth(i, wx.LIST_AUTOSIZE_USEHEADER)
+            i += 1
+        
+        self.itemDataMap = {} # requested by sorter
+        self.itemCount   = 0
+        
+        self.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT, self.OnBeginEdit)
+        self.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEndEdit)
+        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick)
+        self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightUp) #wxMSW
+        self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)            #wxGTK
+                
+    def OnBeginEdit(self, event):
+        """!Editing of item started"""
+        event.Allow()
+
+    def OnEndEdit(self, event):
+        """!Finish editing of item"""
+        pass
+    
+    def OnColClick(self, event):
+        """!Click on column header (order by)"""
+        event.Skip()
+
+class VariableListCtrl(ModelListCtrl):
+    def __init__(self, parent, columns, **kwargs):
+        """!List of model variables"""
+        ModelListCtrl.__init__(self, parent, columns, **kwargs)
+
+        self.SetColumnWidth(2, 200) # default value
+
+    def GetListCtrl(self):
+        """!Used by ColumnSorterMixin"""
+        return self
+    
+    def GetData(self):
+        """!Get list data"""
+        return self.itemDataMap
+    
+    def Populate(self, data):
+        """!Populate the list"""
+        self.itemDataMap = dict()
+        i = 0
+        for name, values in data.iteritems():
+            self.itemDataMap[i] = [name, values['type'],
+                                   values.get('value', ''),
+                                   values.get('description', '')]
+            i += 1
+        
+        self.itemCount = len(self.itemDataMap.keys())
+        self.DeleteAllItems()
+        i = 0
+        for name, vtype, value, desc in self.itemDataMap.itervalues():
+            index = self.InsertStringItem(sys.maxint, name)
+            self.SetStringItem(index, 0, name)
+            self.SetStringItem(index, 1, vtype)
+            self.SetStringItem(index, 2, value)
+            self.SetStringItem(index, 3, desc)
+            self.SetItemData(index, i)
+            i += 1
+        
+    def Append(self, name, vtype, value, desc):
+        """!Append new item to the list
+
+        @return None on success
+        @return error string
+        """
+        for iname, ivtype, ivalue, idesc in self.itemDataMap.itervalues():
+            if iname == name:
+                return _("Variable <%s> already exists in the model. "
+                         "Adding variable failed.") % name
+        
+        index = self.InsertStringItem(sys.maxint, name)
+        self.SetStringItem(index, 0, name)
+        self.SetStringItem(index, 1, vtype)
+        self.SetStringItem(index, 2, value)
+        self.SetStringItem(index, 3, desc)
+        self.SetItemData(index, self.itemCount)
+        
+        self.itemDataMap[self.itemCount] = [name, vtype, value, desc]
+        self.itemCount += 1
+        
+        return None
+
+    def OnRemove(self, event):
+        """!Remove selected variable(s) from the model"""
+        item = self.GetFirstSelected()
+        while item != -1:
+            self.DeleteItem(item)
+            del self.itemDataMap[item]
+            item = self.GetFirstSelected()
+        self.parent.UpdateModelVariables()
+        
+        event.Skip()
+        
+    def OnRemoveAll(self, event):
+        """!Remove all variable(s) from the model"""
+        dlg = wx.MessageBox(parent=self,
+                            message=_("Do you want to delete all variables from "
+                                      "the model?"),
+                            caption=_("Delete variables"),
+                            style=wx.YES_NO | wx.CENTRE)
+        if dlg != wx.YES:
+            return
+        
+        self.DeleteAllItems()
+        self.itemDataMap = dict()
+        
+        self.parent.UpdateModelVariables()
+        
+    def OnEndEdit(self, event):
+        """!Finish editing of item"""
+        itemIndex = event.GetIndex()
+        columnIndex = event.GetColumn()
+        nameOld = self.GetItem(itemIndex, 0).GetText()
+
+        if columnIndex == 0: # TODO
+            event.Veto()
+        
+        self.itemDataMap[itemIndex][columnIndex] = event.GetText()
+        
+        self.parent.UpdateModelVariables()
+
+    def OnReload(self, event):
+        """!Reload list of variables"""
+        self.Populate(self.parent.parent.GetModel().GetVariables())
+
+    def OnRightUp(self, event):
+        """!Mouse right button up"""
+        if not hasattr(self, "popupID1"):
+            self.popupID1 = wx.NewId()
+            self.popupID2 = wx.NewId()
+            self.popupID3 = wx.NewId()
+            self.Bind(wx.EVT_MENU, self.OnRemove,    id = self.popupID1)
+            self.Bind(wx.EVT_MENU, self.OnRemoveAll, id = self.popupID2)
+            self.Bind(wx.EVT_MENU, self.OnReload,    id = self.popupID3)
+        
+        # generate popup-menu
+        menu = wx.Menu()
+        menu.Append(self.popupID1, _("Delete selected"))
+        menu.Append(self.popupID2, _("Delete all"))
+        if self.GetFirstSelected() == -1:
+            menu.Enable(self.popupID1, False)
+            menu.Enable(self.popupID2, False)
+        
+        menu.AppendSeparator()
+        menu.Append(self.popupID3, _("Reload"))
+        
+        self.PopupMenu(menu)
+        menu.Destroy()
+
+class ItemListCtrl(ModelListCtrl):
+    def __init__(self, parent, columns, disablePopup = False, **kwargs):
+        """!List of model actions"""
+        self.disablePopup = disablePopup
+                
+        ModelListCtrl.__init__(self, parent, columns, **kwargs)
+        self.SetColumnWidth(1, 100)
+        self.SetColumnWidth(2, 65)
+        
+    def GetListCtrl(self):
+        """!Used by ColumnSorterMixin"""
+        return self
+    
+    def GetData(self):
+        """!Get list data"""
+        return self.itemDataMap
+    
+    def Populate(self, data):
+        """!Populate the list"""
+        self.itemDataMap = dict()
+        
+        if self.shape:
+            if isinstance(self.shape, ModelCondition):
+                if self.GetName() == 'ElseBlockList':
+                    shapeItems = map(lambda x: x.GetId(), self.shape.GetItems()['else'])
+                else:
+                    shapeItems = map(lambda x: x.GetId(), self.shape.GetItems()['if'])
+            else:
+                shapeItems = map(lambda x: x.GetId(), self.shape.GetItems())
+        else:
+            shapeItems = list()
+        
+        i = 0
+        if len(self.columns) == 3: # ItemCheckList
+            checked = list()
+        for action in data:
+            if isinstance(action, ModelData) or \
+                    action == self.shape:
+                continue
+            
+            if len(self.columns) == 3:
+                self.itemDataMap[i] = [str(action.GetId()),
+                                       action.GetName(),
+                                       action.GetLog()]
+                aId = action.GetBlockId()
+                if action.GetId() in shapeItems:
+                    checked.append(aId)
+                else:
+                    checked.append(None)
+            else:
+                bId = action.GetBlockId()
+                if not bId:
+                    bId = ''
+                self.itemDataMap[i] = [str(action.GetId()),
+                                       action.GetName(),
+                                       ','.join(map(str, bId)),
+                                       action.GetLog()]
+            
+            i += 1
+        
+        self.itemCount = len(self.itemDataMap.keys())
+        self.DeleteAllItems()
+        i = 0
+        if len(self.columns) == 3:
+            for aid, name, desc in self.itemDataMap.itervalues():
+                index = self.InsertStringItem(sys.maxint, aid)
+                self.SetStringItem(index, 0, aid)
+                self.SetStringItem(index, 1, name)
+                self.SetStringItem(index, 2, desc)
+                self.SetItemData(index, i)
+                if checked[i]:
+                    self.CheckItem(index, True)
+                i += 1
+        else:
+            for aid, name, inloop, desc in self.itemDataMap.itervalues():
+                index = self.InsertStringItem(sys.maxint, aid)
+                self.SetStringItem(index, 0, aid)
+                self.SetStringItem(index, 1, name)
+                self.SetStringItem(index, 2, inloop)
+                self.SetStringItem(index, 3, desc)
+                self.SetItemData(index, i)
+                i += 1
+                
+    def OnRemove(self, event):
+        """!Remove selected action(s) from the model"""
+        model = self.frame.GetModel()
+        canvas = self.frame.GetCanvas()
+        
+        item = self.GetFirstSelected()
+        while item != -1:
+            self.DeleteItem(item)
+            del self.itemDataMap[item]
+            
+            aId = self.GetItem(item, 0).GetText()
+            action = model.GetItem(int(aId))
+            if not action:
+                item = self.GetFirstSelected()
+                continue
+            
+            model.RemoveItem(action)
+            canvas.GetDiagram().RemoveShape(action)
+            self.frame.ModelChanged()
+            
+            item = self.GetFirstSelected()
+        
+        canvas.Refresh()
+        
+        event.Skip()
+    
+    def OnRemoveAll(self, event):
+        """!Remove all variable(s) from the model"""
+        deleteDialog = wx.MessageBox(parent=self,
+                                     message=_("Selected data records (%d) will permanently deleted "
+                                               "from table. Do you want to delete them?") % \
+                                         (len(self.listOfSQLStatements)),
+                                     caption=_("Delete records"),
+                                     style=wx.YES_NO | wx.CENTRE)
+        if deleteDialog != wx.YES:
+            return False
+        
+        self.DeleteAllItems()
+        self.itemDataMap = dict()
+
+        self.parent.UpdateModelVariables()
+
+    def OnEndEdit(self, event):
+        """!Finish editing of item"""
+        itemIndex = event.GetIndex()
+        columnIndex = event.GetColumn()
+        
+        self.itemDataMap[itemIndex][columnIndex] = event.GetText()
+        
+        aId = int(self.GetItem(itemIndex, 0).GetText())
+        action = self.frame.GetModel().GetItem(aId)
+        if not action:
+            event.Veto()
+        if columnIndex == 0:
+            action.SetId(int(event.GetText()))
+        
+        self.frame.ModelChanged()
+
+    def OnReload(self, event = None):
+        """!Reload list of actions"""
+        self.Populate(self.frame.GetModel().GetItems())
+
+    def OnRightUp(self, event):
+        """!Mouse right button up"""
+        if self.disablePopup:
+            return
+        
+        if not hasattr(self, "popupID1"):
+            self.popupID1 = wx.NewId()
+            self.popupID2 = wx.NewId()
+            self.popupID3 = wx.NewId()
+            self.popupID4 = wx.NewId()
+            self.Bind(wx.EVT_MENU, self.OnRemove,    id = self.popupID1)
+            self.Bind(wx.EVT_MENU, self.OnRemoveAll, id = self.popupID2)
+            self.Bind(wx.EVT_MENU, self.OnReload,    id = self.popupID3)
+            self.Bind(wx.EVT_MENU, self.OnNormalize, id = self.popupID4)
+
+        # generate popup-menu
+        menu = wx.Menu()
+        menu.Append(self.popupID1, _("Delete selected"))
+        menu.Append(self.popupID2, _("Delete all"))
+        if self.GetFirstSelected() == -1:
+            menu.Enable(self.popupID1, False)
+            menu.Enable(self.popupID2, False)
+        
+        menu.AppendSeparator()
+        menu.Append(self.popupID4, _("Normalize"))
+        menu.Append(self.popupID3, _("Reload"))
+        
+        self.PopupMenu(menu)
+        menu.Destroy()
+    
+    def OnNormalize(self, event):
+        """!Update id of actions"""
+        model = self.frame.GetModel()
+        
+        aId = 1
+        for item in model.GetItems():
+            item.SetId(aId)
+            aId += 1
+        
+        self.OnReload(None)
+        self.frame.GetCanvas().Refresh()
+        self.frame.ModelChanged()
+
+class ItemCheckListCtrl(ItemListCtrl, listmix.CheckListCtrlMixin):
+    def __init__(self, parent, shape, columns, window = None, **kwargs):
+        self.parent = parent
+        self.window = window
+        
+        ItemListCtrl.__init__(self, parent, columns, disablePopup = True, **kwargs)
+        listmix.CheckListCtrlMixin.__init__(self)
+        self.SetColumnWidth(0, 50)
+        
+        self.shape  = shape
+        
+    def OnBeginEdit(self, event):
+        """!Disable editing"""
+        event.Veto()
+        
+    def OnCheckItem(self, index, flag):
+        """!Item checked/unchecked"""
+        name = self.GetName()
+        if name == 'IfBlockList' and self.window:
+            self.window.OnCheckItemIf(index, flag)
+        elif name == 'ElseBlockList' and self.window:
+            self.window.OnCheckItemElse(index, flag)
+        
+    def GetItems(self):
+        """!Get list of selected actions"""
+        ids = { 'checked'   : list(),
+                'unchecked' : list() }
+        for i in range(self.GetItemCount()):
+            iId = int(self.GetItem(i, 0).GetText())
+            if self.IsChecked(i):
+                ids['checked'].append(iId)
+            else:
+                ids['unchecked'].append(iId)
+            
+        return ids
+
+    def CheckItemById(self, aId, flag):
+        """!Check/uncheck given item by id"""
+        for i in range(self.GetItemCount()):
+            iId = int(self.GetItem(i, 0).GetText())
+            if iId == aId:
+                self.CheckItem(i, flag)
+                break
diff --git a/gui/wxpython/gmodeler/frame.py b/gui/wxpython/gmodeler/frame.py
new file mode 100644
index 0000000..e6bca3d
--- /dev/null
+++ b/gui/wxpython/gmodeler/frame.py
@@ -0,0 +1,1668 @@
+"""!
+ at package gmodeler.frame
+
+ at brief wxGUI Graphical Modeler for creating, editing, and managing models
+
+Classes:
+ - frame::ModelFrame
+ - frame::ModelCanvas
+ - frame::ModelEvtHandler
+ - frame::VariablePanel
+ - frame::ItemPanel
+ - frame::PythonPanel
+
+(C) 2010-2012 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import os
+import sys
+import time
+import stat
+import textwrap
+import tempfile
+import copy
+import re
+import random
+
+if __name__ == "__main__":
+    sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'wxpython'))
+
+import wx
+from   wx.lib import ogl
+import wx.lib.flatnotebook    as FN
+
+from core                 import globalvar
+from gui_core.widgets     import GNotebook
+from gui_core.goutput     import GMConsole, PyStc
+from core.debug           import Debug
+from core.gcmd            import GMessage, GException, GWarning, GError, RunCommand
+from gui_core.dialogs     import GetImageHandlers
+from gui_core.preferences import PreferencesBaseDialog
+from core.settings        import UserSettings
+from core.menudata        import MenuData
+from gui_core.menu        import Menu
+from gmodeler.menudata    import ModelerData
+from gui_core.forms       import GUI
+from gmodeler.preferences import PreferencesDialog, PropertiesDialog
+from gmodeler.toolbars    import ModelerToolbar
+
+from gmodeler.model       import *
+from gmodeler.dialogs     import *
+
+from grass.script import core as grass
+
+class ModelFrame(wx.Frame):
+    def __init__(self, parent, id = wx.ID_ANY,
+                 title = _("GRASS GIS Graphical Modeler (experimental prototype)"), **kwargs):
+        """!Graphical modeler main window
+        
+        @param parent parent window
+        @param id window id
+        @param title window title
+
+        @param kwargs wx.Frames' arguments
+        """
+        self.parent = parent
+        self.searchDialog = None # module search dialog
+        self.baseTitle = title
+        self.modelFile = None    # loaded model
+        self.modelChanged = False
+        self.randomness = 40 # random layout
+        
+        self.cursors = {
+            "default" : wx.StockCursor(wx.CURSOR_ARROW),
+            "cross"   : wx.StockCursor(wx.CURSOR_CROSS),
+            }
+        
+        wx.Frame.__init__(self, parent = parent, id = id, title = title, **kwargs)
+        self.SetName("Modeler")
+        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
+        
+        self.menubar = Menu(parent = self, data = ModelerData())
+        
+        self.SetMenuBar(self.menubar)
+        
+        self.toolbar = ModelerToolbar(parent = self)
+        self.SetToolBar(self.toolbar)
+        
+        self.statusbar = self.CreateStatusBar(number = 1)
+        
+        self.notebook = GNotebook(parent = self,
+                                  style = FN.FNB_FANCY_TABS | FN.FNB_BOTTOM |
+                                  FN.FNB_NO_NAV_BUTTONS | FN.FNB_NO_X_BUTTON)
+        
+        self.canvas = ModelCanvas(self)
+        self.canvas.SetBackgroundColour(wx.WHITE)
+        self.canvas.SetCursor(self.cursors["default"])
+        
+        self.model = Model(self.canvas)
+        
+        self.variablePanel = VariablePanel(parent = self)
+        
+        self.itemPanel = ItemPanel(parent = self)
+        
+        self.pythonPanel = PythonPanel(parent = self)
+        
+        self.goutput = GMConsole(parent = self, notebook = self.notebook)
+        
+        self.notebook.AddPage(page = self.canvas, text=_('Model'), name = 'model')
+        self.notebook.AddPage(page = self.itemPanel, text=_('Items'), name = 'items')
+        self.notebook.AddPage(page = self.variablePanel, text=_('Variables'), name = 'variables')
+        self.notebook.AddPage(page = self.pythonPanel, text=_('Python editor'), name = 'python')
+        self.notebook.AddPage(page = self.goutput, text=_('Command output'), name = 'output')
+        wx.CallAfter(self.notebook.SetSelectionByName, 'model')
+        wx.CallAfter(self.ModelChanged, False)
+
+        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
+        self.Bind(wx.EVT_SIZE, self.OnSize)
+        self.notebook.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
+        
+        self._layout()
+        self.SetMinSize((640, 300))
+        self.SetSize((800, 600))
+        
+        # fix goutput's pane size
+        if self.goutput:
+            self.goutput.SetSashPosition(int(self.GetSize()[1] * .75))
+        
+    def _layout(self):
+        """!Do layout"""
+        sizer = wx.BoxSizer(wx.VERTICAL)
+
+        sizer.Add(item = self.notebook, proportion = 1,
+                  flag = wx.EXPAND)
+        
+        self.SetAutoLayout(True)
+        self.SetSizer(sizer)
+        sizer.Fit(self)
+        
+        self.Layout()
+
+    def _addEvent(self, item):
+        """!Add event to item"""
+        evthandler = ModelEvtHandler(self.statusbar,
+                                     self)
+        evthandler.SetShape(item)
+        evthandler.SetPreviousHandler(item.GetEventHandler())
+        item.SetEventHandler(evthandler)
+
+    def _randomShift(self):
+        """!Returns random value to shift layout"""
+        return random.randint(-self.randomness, self.randomness)
+
+    def GetCanvas(self):
+        """!Get canvas"""
+        return self.canvas
+    
+    def GetModel(self):
+        """!Get model"""
+        return self.model
+    
+    def ModelChanged(self, changed = True):
+        """!Update window title"""
+        self.modelChanged = changed
+        
+        if self.modelFile:
+            if self.modelChanged:
+                self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.modelFile) + '*')
+            else:
+                self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.modelFile))
+        else:
+            self.SetTitle(self.baseTitle)
+
+    def OnPageChanged(self, event):
+        """!Page in notebook changed"""
+        page = event.GetSelection()
+        if page == self.notebook.GetPageIndexByName('python'):
+            if self.pythonPanel.IsEmpty():
+                self.pythonPanel.RefreshScript()
+            
+            if self.pythonPanel.IsModified():
+                self.SetStatusText(_('Python script contains local modifications'), 0)
+            else:
+                self.SetStatusText(_('Python script is up-to-date'), 0)
+        
+        event.Skip()
+
+    def OnVariables(self, event):
+        """!Switch to variables page"""
+        self.notebook.SetSelectionByName('variables')
+        
+    def OnRemoveItem(self, event):
+        """!Remove shape
+        """
+        self.GetCanvas().RemoveSelected()
+        
+    def OnCanvasRefresh(self, event):
+        """!Refresh canvas"""
+        self.SetStatusText(_("Redrawing model..."), 0)
+        self.GetCanvas().Refresh()
+        self.SetStatusText("", 0)
+
+    def OnCmdRun(self, event):
+        """!Run command"""
+        try:
+            action = self.GetModel().GetItems()[event.pid]
+            if hasattr(action, "task"):
+                action.Update(running = True)
+        except IndexError:
+            pass
+        
+    def OnCmdPrepare(self, event):
+        """!Prepare for running command"""
+        if not event.userData:
+            return
+        
+        event.onPrepare(item = event.userData['item'],
+                        params = event.userData['params'])
+        
+    def OnCmdDone(self, event):
+        """!Command done (or aborted)"""
+        try:
+            action = self.GetModel().GetItems()[event.pid]
+            if hasattr(action, "task"):
+                action.Update(running = True)
+        except IndexError:
+            pass
+        
+    def OnCloseWindow(self, event):
+        """!Close window"""
+        if self.modelChanged and \
+                UserSettings.Get(group='manager', key='askOnQuit', subkey='enabled'):
+            if self.modelFile:
+                message = _("Do you want to save changes in the model?")
+            else:
+                message = _("Do you want to store current model settings "
+                            "to model file?")
+            
+            # ask user to save current settings
+            dlg = wx.MessageDialog(self,
+                                   message = message,
+                                   caption=_("Quit Graphical Modeler"),
+                                   style = wx.YES_NO | wx.YES_DEFAULT |
+                                   wx.CANCEL | wx.ICON_QUESTION | wx.CENTRE)
+            ret = dlg.ShowModal()
+            if ret == wx.ID_YES:
+                if not self.modelFile:
+                        self.OnWorkspaceSaveAs()
+                else:
+                    self.WriteModelFile(self.modelFile)
+            elif ret == wx.ID_CANCEL:
+                dlg.Destroy()
+                return
+            dlg.Destroy()
+        
+        self.Destroy()
+
+    def OnSize(self, event):
+        """Window resized, save to the model"""
+        self.ModelChanged()
+        event.Skip()
+        
+    def OnPreferences(self, event):
+        """!Open preferences dialog"""
+        dlg = PreferencesDialog(parent = self)
+        dlg.CenterOnParent()
+        
+        dlg.ShowModal()
+        self.canvas.Refresh()
+        
+    def OnHelp(self, event):
+        """!Show help"""
+        if self.parent and self.parent.GetName() == 'LayerManager':
+            log = self.parent.GetLogWindow()
+            log.RunCmd(['g.manual',
+                        'entry=wxGUI.Modeler'])
+        else:
+            RunCommand('g.manual',
+                       quiet = True,
+                       entry = 'wxGUI.Modeler')
+        
+    def OnModelProperties(self, event):
+        """!Model properties dialog"""
+        dlg = PropertiesDialog(parent = self)
+        dlg.CentreOnParent()
+        properties = self.model.GetProperties()
+        dlg.Init(properties)
+        if dlg.ShowModal() == wx.ID_OK:
+            self.ModelChanged()
+            for key, value in dlg.GetValues().iteritems():
+                properties[key] = value
+            for action in self.model.GetItems(objType = ModelAction):
+                action.GetTask().set_flag('overwrite', properties['overwrite'])
+        
+        dlg.Destroy()
+        
+    def OnDeleteData(self, event):
+        """!Delete intermediate data"""
+        rast, vect, rast3d, msg = self.model.GetIntermediateData()
+        
+        if not rast and not vect and not rast3d:
+            GMessage(parent = self,
+                     message = _('No intermediate data to delete.'))
+            return
+        
+        dlg = wx.MessageDialog(parent = self,
+                               message= _("Do you want to permanently delete data?%s" % msg),
+                               caption=_("Delete intermediate data?"),
+                               style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+        
+        ret = dlg.ShowModal()
+        if ret == wx.ID_YES:
+            dlg.Destroy()
+            
+            if rast:
+                self.goutput.RunCmd(['g.remove', 'rast=%s' %','.join(rast)])
+            if rast3d:
+                self.goutput.RunCmd(['g.remove', 'rast3d=%s' %','.join(rast3d)])
+            if vect:
+                self.goutput.RunCmd(['g.remove', 'vect=%s' %','.join(vect)])
+            
+            self.SetStatusText(_("%d maps deleted from current mapset") % \
+                                 int(len(rast) + len(rast3d) + len(vect)))
+            return
+        
+        dlg.Destroy()
+                
+    def OnModelNew(self, event):
+        """!Create new model"""
+        Debug.msg(4, "ModelFrame.OnModelNew():")
+        
+        # ask user to save current model
+        if self.modelFile and self.modelChanged:
+            self.OnModelSave()
+        elif self.modelFile is None and \
+                (self.model.GetNumItems() > 0 or len(self.model.GetData()) > 0):
+            dlg = wx.MessageDialog(self, message=_("Current model is not empty. "
+                                                   "Do you want to store current settings "
+                                                   "to model file?"),
+                                   caption=_("Create new model?"),
+                                   style=wx.YES_NO | wx.YES_DEFAULT |
+                                   wx.CANCEL | wx.ICON_QUESTION)
+            ret = dlg.ShowModal()
+            if ret == wx.ID_YES:
+                self.OnModelSaveAs()
+            elif ret == wx.ID_CANCEL:
+                dlg.Destroy()
+                return
+            
+            dlg.Destroy()
+        
+        # delete all items
+        self.canvas.GetDiagram().DeleteAllShapes()
+        self.model.Reset()
+        self.canvas.Refresh()
+        self.itemPanel.Update()
+        self.variablePanel.Reset()
+        
+        # no model file loaded
+        self.modelFile = None
+        self.modelChanged = False
+        self.SetTitle(self.baseTitle)
+        
+    def OnModelOpen(self, event):
+        """!Load model from file"""
+        filename = ''
+        dlg = wx.FileDialog(parent = self, message=_("Choose model file"),
+                            defaultDir = os.getcwd(),
+                            wildcard=_("GRASS Model File (*.gxm)|*.gxm"))
+        if dlg.ShowModal() == wx.ID_OK:
+            filename = dlg.GetPath()
+                    
+        if not filename:
+            return
+        
+        Debug.msg(4, "ModelFrame.OnModelOpen(): filename=%s" % filename)
+        
+        # close current model
+        self.OnModelClose()
+        
+        self.LoadModelFile(filename)
+        
+        self.modelFile = filename
+        self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.modelFile))
+        self.SetStatusText(_('%(items)d items (%(actions)d actions) loaded into model') % \
+                               { 'items' : self.model.GetNumItems(),
+                                 'actions' : self.model.GetNumItems(actionOnly = True) }, 0)
+        
+    def OnModelSave(self, event = None):
+        """!Save model to file"""
+        if self.modelFile and self.modelChanged:
+            dlg = wx.MessageDialog(self, message=_("Model file <%s> already exists. "
+                                                   "Do you want to overwrite this file?") % \
+                                       self.modelFile,
+                                   caption=_("Save model"),
+                                   style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+            if dlg.ShowModal() == wx.ID_NO:
+                dlg.Destroy()
+            else:
+                Debug.msg(4, "ModelFrame.OnModelSave(): filename=%s" % self.modelFile)
+                self.WriteModelFile(self.modelFile)
+                self.SetStatusText(_('File <%s> saved') % self.modelFile, 0)
+                self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.modelFile))
+        elif not self.modelFile:
+            self.OnModelSaveAs(None)
+        
+    def OnModelSaveAs(self, event):
+        """!Create model to file as"""
+        filename = ''
+        dlg = wx.FileDialog(parent = self,
+                            message = _("Choose file to save current model"),
+                            defaultDir = os.getcwd(),
+                            wildcard=_("GRASS Model File (*.gxm)|*.gxm"),
+                            style=wx.FD_SAVE)
+        
+        
+        if dlg.ShowModal() == wx.ID_OK:
+            filename = dlg.GetPath()
+        
+        if not filename:
+            return
+        
+        # check for extension
+        if filename[-4:] != ".gxm":
+            filename += ".gxm"
+        
+        if os.path.exists(filename):
+            dlg = wx.MessageDialog(parent = self,
+                                   message=_("Model file <%s> already exists. "
+                                             "Do you want to overwrite this file?") % filename,
+                                   caption=_("File already exists"),
+                                   style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+            if dlg.ShowModal() != wx.ID_YES:
+                dlg.Destroy()
+                return
+        
+        Debug.msg(4, "GMFrame.OnModelSaveAs(): filename=%s" % filename)
+        
+        self.WriteModelFile(filename)
+        self.modelFile = filename
+        self.SetTitle(self.baseTitle + " - " + os.path.basename(self.modelFile))
+        self.SetStatusText(_('File <%s> saved') % self.modelFile, 0)
+
+    def OnModelClose(self, event = None):
+        """!Close model file"""
+        Debug.msg(4, "ModelFrame.OnModelClose(): file=%s" % self.modelFile)
+        # ask user to save current model
+        if self.modelFile and self.modelChanged:
+            self.OnModelSave()
+        elif self.modelFile is None and \
+                (self.model.GetNumItems() > 0 or len(self.model.GetData()) > 0):
+            dlg = wx.MessageDialog(self, message=_("Current model is not empty. "
+                                                   "Do you want to store current settings "
+                                                   "to model file?"),
+                                   caption=_("Create new model?"),
+                                   style=wx.YES_NO | wx.YES_DEFAULT |
+                                   wx.CANCEL | wx.ICON_QUESTION)
+            ret = dlg.ShowModal()
+            if ret == wx.ID_YES:
+                self.OnModelSaveAs()
+            elif ret == wx.ID_CANCEL:
+                dlg.Destroy()
+                return
+            
+            dlg.Destroy()
+        
+        self.modelFile = None
+        self.SetTitle(self.baseTitle)
+        
+        self.canvas.GetDiagram().DeleteAllShapes()
+        self.model.Reset()
+        
+        self.canvas.Refresh()
+        
+    def OnRunModel(self, event):
+        """!Run entire model"""
+        self.model.Run(self.goutput, self.OnDone, parent = self)
+        
+    def OnDone(self, cmd, returncode):
+        """!Computation finished"""
+        self.SetStatusText('', 0)
+        # restore original files
+        if hasattr(self.model, "fileInput"):
+            for finput in self.model.fileInput:
+                data = self.model.fileInput[finput]
+                if not data:
+                    continue
+                
+                fd = open(finput, "w")
+                try:
+                    fd.write(data)
+                finally:
+                    fd.close()
+            del self.model.fileInput
+        
+    def OnValidateModel(self, event, showMsg = True):
+        """!Validate entire model"""
+        if self.model.GetNumItems() < 1:
+            GMessage(parent = self, 
+                     message = _('Model is empty. Nothing to validate.'))
+            return
+        
+        
+        self.SetStatusText(_('Validating model...'), 0)
+        errList = self.model.Validate()
+        self.SetStatusText('', 0)
+        
+        if errList:
+            GWarning(parent = self,
+                     message = _('Model is not valid.\n\n%s') % '\n'.join(errList))
+        else:
+            GMessage(parent = self,
+                     message = _('Model is valid.'))
+    
+    def OnExportImage(self, event):
+        """!Export model to image (default image)
+        """
+        xminImg = 0
+        xmaxImg = 0
+        yminImg = 0
+        ymaxImg = 0
+        # get current size of canvas
+        for shape in self.canvas.GetDiagram().GetShapeList():
+            w, h = shape.GetBoundingBoxMax()
+            x    = shape.GetX()
+            y    = shape.GetY()
+            xmin = x - w / 2
+            xmax = x + w / 2
+            ymin = y - h / 2
+            ymax = y + h / 2
+            if xmin < xminImg:
+                xminImg = xmin
+            if xmax > xmaxImg:
+                xmaxImg = xmax
+            if ymin < yminImg:
+                yminImg = ymin
+            if ymax > ymaxImg:
+                ymaxImg = ymax
+        size = wx.Size(int(xmaxImg - xminImg) + 50,
+                       int(ymaxImg - yminImg) + 50)
+        bitmap = wx.EmptyBitmap(width = size.width, height = size.height)
+        
+        filetype, ltype = GetImageHandlers(wx.ImageFromBitmap(bitmap))
+        
+        dlg = wx.FileDialog(parent = self,
+                            message = _("Choose a file name to save the image (no need to add extension)"),
+                            defaultDir = "",
+                            defaultFile = "",
+                            wildcard = filetype,
+                            style=wx.SAVE | wx.FD_OVERWRITE_PROMPT)
+        
+        if dlg.ShowModal() == wx.ID_OK:
+            path = dlg.GetPath()
+            if not path:
+                dlg.Destroy()
+                return
+            
+            base, ext = os.path.splitext(path)
+            fileType = ltype[dlg.GetFilterIndex()]['type']
+            extType  = ltype[dlg.GetFilterIndex()]['ext']
+            if ext != extType:
+                path = base + '.' + extType
+            
+            dc = wx.MemoryDC(bitmap)
+            dc.SetBackground(wx.WHITE_BRUSH)
+            dc.SetBackgroundMode(wx.SOLID)
+            
+            dc.BeginDrawing()
+            self.canvas.GetDiagram().Clear(dc)
+            self.canvas.GetDiagram().Redraw(dc)
+            dc.EndDrawing()
+            
+            bitmap.SaveFile(path, fileType)
+            self.SetStatusText(_("Model exported to <%s>") % path)
+        
+        dlg.Destroy()
+        
+    def OnExportPython(self, event = None, text = None):
+        """!Export model to Python script"""
+        filename = self.pythonPanel.SaveAs(force = True)
+        self.SetStatusText(_("Model exported to <%s>") % filename)
+
+    def OnDefineRelation(self, event):
+        """!Define relation between data and action items"""
+        self.canvas.SetCursor(self.cursors["cross"])
+        self.defineRelation = { 'from' : None,
+                                'to'   : None }
+        
+    def OnDefineLoop(self, event):
+        """!Define new loop in the model"""
+        self.ModelChanged()
+        
+        width, height = self.canvas.GetSize()
+        loop = ModelLoop(self, x = width/2, y = height/2,
+                         id = self.model.GetNumItems() + 1)
+        self.canvas.diagram.AddShape(loop)
+        loop.Show(True)
+        
+        self._addEvent(loop)
+        self.model.AddItem(loop)
+        
+        self.canvas.Refresh()
+        
+    def OnDefineCondition(self, event):
+        """!Define new condition in the model"""
+        self.ModelChanged()
+        
+        width, height = self.canvas.GetSize()
+        cond = ModelCondition(self, x = width/2, y = height/2,
+                              id = self.model.GetNumItems() + 1)
+        self.canvas.diagram.AddShape(cond)
+        cond.Show(True)
+        
+        self._addEvent(cond)
+        self.model.AddItem(cond)
+        
+        self.canvas.Refresh()
+    
+    def OnAddAction(self, event):
+        """!Add action to model"""
+        if self.searchDialog is None:
+            self.searchDialog = ModelSearchDialog(self)
+            self.searchDialog.CentreOnParent()
+        else:
+            self.searchDialog.Reset()
+        
+        if self.searchDialog.ShowModal() == wx.ID_CANCEL:
+            self.searchDialog.Hide()
+            return
+            
+        cmd = self.searchDialog.GetCmd()
+        self.searchDialog.Hide()
+        
+        self.ModelChanged()
+        
+        # add action to canvas
+        x, y = self.canvas.GetNewShapePos()
+        action = ModelAction(self.model, cmd = cmd,
+                             x = x + self._randomShift(),
+                             y = y + self._randomShift(),
+                             id = self.model.GetNextId())
+        overwrite = self.model.GetProperties().get('overwrite', None)
+        if overwrite is not None:
+            action.GetTask().set_flag('overwrite', overwrite)
+        
+        self.canvas.diagram.AddShape(action)
+        action.Show(True)
+        
+        self._addEvent(action)
+        self.model.AddItem(action)
+        
+        self.itemPanel.Update()
+        self.canvas.Refresh()
+        time.sleep(.1)
+        
+        # show properties dialog
+        win = action.GetPropDialog()
+        if not win:
+            if action.IsValid():
+                self.GetOptData(dcmd = action.GetLog(string = False), layer = action,
+                                params = action.GetParams(), propwin = None)
+            else:
+                GUI(parent = self, show = True).ParseCommand(action.GetLog(string = False),
+                                                             completed = (self.GetOptData, action, action.GetParams()))
+        elif win and not win.IsShown():
+            win.Show()
+        
+        if win:
+            win.Raise()
+        
+    def OnAddData(self, event):
+        """!Add data item to model
+        """
+        # add action to canvas
+        width, height = self.canvas.GetSize()
+        data = ModelData(self, x = width/2 + self._randomShift(),
+                         y = height/2 + self._randomShift())
+       
+        dlg = ModelDataDialog(parent = self, shape = data)
+        data.SetPropDialog(dlg)
+        dlg.CentreOnParent()
+        ret = dlg.ShowModal()
+        dlg.Destroy()
+        if ret != wx.ID_OK:
+            return
+        
+        data.Update()
+        self.canvas.diagram.AddShape(data)
+        data.Show(True)
+        
+        self.ModelChanged()
+        
+        self._addEvent(data)
+        self.model.AddItem(data)
+        
+        self.canvas.Refresh()
+        
+        
+    def OnHelp(self, event):
+        """!Display manual page"""
+        grass.run_command('g.manual',
+                          entry = 'wxGUI.Modeler')
+
+    def OnAbout(self, event):
+        """!Display About window"""
+        info = wx.AboutDialogInfo()
+
+        info.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
+        info.SetName(_('wxGUI Graphical Modeler'))
+        info.SetWebSite('http://grass.osgeo.org')
+        year = grass.version()['date']
+        info.SetDescription(_('(C) 2010-%s by the GRASS Development Team\n\n') % year + 
+                            '\n'.join(textwrap.wrap(_('This program is free software under the GNU General Public License'
+                                                      '(>=v2). Read the file COPYING that comes with GRASS for details.'), 75)))
+        
+        wx.AboutBox(info)
+        
+    def GetOptData(self, dcmd, layer, params, propwin):
+        """!Process action data"""
+        if params: # add data items
+            width, height = self.canvas.GetSize()
+            x = width/2 - 200 + self._randomShift()
+            y = height/2 + self._randomShift()
+            for p in params['params']:
+                if p.get('prompt', '') in ('raster', 'vector', 'raster3d') and \
+                        (p.get('value', None) or \
+                             (p.get('age', 'old') != 'old' and p.get('required', 'no') == 'yes')):
+                    data = layer.FindData(p.get('name', ''))
+                    if data:
+                        data.SetValue(p.get('value', ''))
+                        data.Update()
+                        continue
+                    
+                    data = self.model.FindData(p.get('value', ''),
+                                               p.get('prompt', ''))
+                    if data:
+                        if p.get('age', 'old') == 'old':
+                            rel = ModelRelation(parent = self, fromShape = data,
+                                                toShape = layer, param = p.get('name', ''))
+                        else:
+                            rel = ModelRelation(parent = self, fromShape = layer,
+                                                toShape = data, param = p.get('name', ''))
+                        layer.AddRelation(rel)
+                        data.AddRelation(rel)
+                        self.AddLine(rel)
+                        data.Update()
+                        continue
+                    
+                    data = ModelData(self, value = p.get('value', ''),
+                                     prompt = p.get('prompt', ''),
+                                     x = x, y = y)
+                    self._addEvent(data)
+                    self.canvas.diagram.AddShape(data)
+                    data.Show(True)
+                                                            
+                    if p.get('age', 'old') == 'old':
+                        rel = ModelRelation(parent = self, fromShape = data,
+                                            toShape = layer, param = p.get('name', ''))
+                    else:
+                        rel = ModelRelation(parent = self, fromShape = layer,
+                                            toShape = data, param = p.get('name', ''))
+                    layer.AddRelation(rel)
+                    data.AddRelation(rel)
+                    self.AddLine(rel)
+                    data.Update()
+            
+            # valid / parameterized ?
+            layer.SetValid(params)
+            
+            self.canvas.Refresh()
+        
+        if dcmd:
+            layer.SetProperties(params, propwin)
+            
+        self.SetStatusText(layer.GetLog(), 0)
+        
+    def AddLine(self, rel):
+        """!Add connection between model objects
+        
+        @param rel relation
+        """
+        fromShape = rel.GetFrom()
+        toShape   = rel.GetTo()
+        
+        rel.SetCanvas(self)
+        rel.SetPen(wx.BLACK_PEN)
+        rel.SetBrush(wx.BLACK_BRUSH)
+        rel.AddArrow(ogl.ARROW_ARROW)
+        points = rel.GetControlPoints()
+        rel.MakeLineControlPoints(2)
+        if points:
+            for x, y in points:
+                rel.InsertLineControlPoint(point = wx.RealPoint(x, y))
+        
+        self._addEvent(rel)
+        try:
+            fromShape.AddLine(rel, toShape)
+        except TypeError:
+            pass # bug when connecting ModelCondition and ModelLoop - to be fixed
+        
+        self.canvas.diagram.AddShape(rel)
+        rel.Show(True)
+        
+    def LoadModelFile(self, filename):
+        """!Load model definition stored in GRASS Model XML file (gxm)
+        """
+        try:
+            self.model.LoadModel(filename)
+        except GException, e:
+            GError(parent = self,
+                   message = _("Reading model file <%s> failed.\n"
+                               "Invalid file, unable to parse XML document.") % filename)
+        
+        self.modelFile = filename
+        self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.modelFile))
+        
+        self.SetStatusText(_("Please wait, loading model..."), 0)
+        
+        # load actions
+        for item in self.model.GetItems(objType = ModelAction):
+            self._addEvent(item)
+            self.canvas.diagram.AddShape(item)
+            item.Show(True)
+            # relations/data
+            for rel in item.GetRelations():
+                if rel.GetFrom() == item:
+                    dataItem = rel.GetTo()
+                else:
+                    dataItem = rel.GetFrom()
+                self._addEvent(dataItem)
+                self.canvas.diagram.AddShape(dataItem)
+                self.AddLine(rel)
+                dataItem.Show(True)
+        
+        # load loops
+        for item in self.model.GetItems(objType = ModelLoop):
+            self._addEvent(item)
+            self.canvas.diagram.AddShape(item)
+            item.Show(True)
+            
+            # connect items in the loop
+            self.DefineLoop(item)
+
+        # load conditions
+        for item in self.model.GetItems(objType = ModelCondition):
+            self._addEvent(item)
+            self.canvas.diagram.AddShape(item)
+            item.Show(True)
+            
+            # connect items in the condition
+            self.DefineCondition(item)
+        
+        # load variables
+        self.variablePanel.Update()
+        self.itemPanel.Update()
+        self.SetStatusText('', 0)
+        
+        # final updates
+        for action in self.model.GetItems(objType = ModelAction):
+            action.SetValid(action.GetParams())
+            action.Update()
+        
+        self.canvas.Refresh(True)
+        
+    def WriteModelFile(self, filename):
+        """!Save model to model file, recover original file on error.
+        
+        @return True on success
+        @return False on failure
+        """
+        self.ModelChanged(False)
+        tmpfile = tempfile.TemporaryFile(mode='w+b')
+        try:
+            WriteModelFile(fd = tmpfile, model = self.model)
+        except StandardError:
+            GError(parent = self,
+                   message = _("Writing current settings to model file failed."))
+            return False
+        
+        try:
+            mfile = open(filename, "w")
+            tmpfile.seek(0)
+            for line in tmpfile.readlines():
+                mfile.write(line)
+        except IOError:
+            wx.MessageBox(parent = self,
+                          message = _("Unable to open file <%s> for writing.") % filename,
+                          caption = _("Error"),
+                          style = wx.OK | wx.ICON_ERROR | wx.CENTRE)
+            return False
+        
+        mfile.close()
+        
+        return True
+    
+    def DefineLoop(self, loop):
+        """!Define loop with given list of items"""
+        parent = loop
+        items = loop.GetItems()
+        if not items:
+            return
+        
+        # remove defined relations first
+        for rel in loop.GetRelations():
+            self.canvas.GetDiagram().RemoveShape(rel)
+        loop.Clear()
+        
+        for item in items:
+            rel = ModelRelation(parent = self, fromShape = parent, toShape = item)
+            dx = item.GetX() - parent.GetX()
+            dy = item.GetY() - parent.GetY()
+            loop.AddRelation(rel)
+            if dx != 0:
+                rel.SetControlPoints(((parent.GetX(), parent.GetY() + dy / 2),
+                                      (parent.GetX() + dx, parent.GetY() + dy / 2)))
+            self.AddLine(rel)
+            parent = item
+        
+        # close loop
+        item = loop.GetItems()[-1]
+        rel = ModelRelation(parent = self, fromShape = item, toShape = loop)
+        loop.AddRelation(rel)
+        self.AddLine(rel)
+        dx = (item.GetX() - loop.GetX()) + loop.GetWidth() / 2 + 50
+        dy = item.GetHeight() / 2 + 50
+        rel.MakeLineControlPoints(0)
+        rel.InsertLineControlPoint(point = wx.RealPoint(loop.GetX() - loop.GetWidth() / 2 ,
+                                                        loop.GetY()))
+        rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX(),
+                                                        item.GetY() + item.GetHeight() / 2))
+        rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX(),
+                                                        item.GetY() + dy))
+        rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX() - dx,
+                                                        item.GetY() + dy))
+        rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX() - dx,
+                                                        loop.GetY()))
+        
+        self.canvas.Refresh()
+
+    def DefineCondition(self, condition):
+        """!Define if-else statement with given list of items"""
+        parent = condition
+        items = condition.GetItems()
+        if not items['if'] and not items['else']:
+            return
+        
+        # remove defined relations first
+        for rel in condition.GetRelations():
+            self.canvas.GetDiagram().RemoveShape(rel)
+        condition.Clear()
+        dxIf   = condition.GetX() + condition.GetWidth() / 2
+        dxElse = condition.GetX() - condition.GetWidth() / 2
+        dy     = condition.GetY()
+        for branch in items.keys():
+            for item in items[branch]:
+                rel = ModelRelation(parent = self, fromShape = parent,
+                                    toShape = item)
+                condition.AddRelation(rel)
+                self.AddLine(rel)
+                rel.MakeLineControlPoints(0)
+                if branch == 'if':
+                    rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX() - item.GetWidth() / 2, item.GetY()))
+                    rel.InsertLineControlPoint(point = wx.RealPoint(dxIf, dy))
+                else:
+                    rel.InsertLineControlPoint(point = wx.RealPoint(dxElse, dy))
+                    rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX() - item.GetWidth() / 2, item.GetY()))
+                parent = item
+        
+        self.canvas.Refresh()
+        
+class ModelCanvas(ogl.ShapeCanvas):
+    """!Canvas where model is drawn"""
+    def __init__(self, parent):
+        self.parent = parent
+        ogl.OGLInitialize()
+        ogl.ShapeCanvas.__init__(self, parent)
+        
+        self.diagram = ogl.Diagram()
+        self.SetDiagram(self.diagram)
+        self.diagram.SetCanvas(self)
+        
+        self.SetScrollbars(20, 20, 2000/20, 2000/20)
+        
+        self.Bind(wx.EVT_CHAR,  self.OnChar)
+        
+    def OnChar(self, event):
+        """!Key pressed"""
+        kc = event.GetKeyCode()
+        diagram = self.GetDiagram()
+        if kc == wx.WXK_DELETE:
+            self.RemoveSelected()
+        
+    def RemoveSelected(self):
+        """!Remove selected shapes"""
+        self.parent.ModelChanged()
+        
+        diagram = self.GetDiagram()
+        shapes = [shape for shape in diagram.GetShapeList() if shape.Selected()]
+        self.RemoveShapes(shapes)
+
+    def RemoveShapes(self, shapes):
+        """!Removes shapes"""
+        self.parent.ModelChanged()
+        diagram = self.GetDiagram()
+        for shape in shapes:
+            remList, upList = self.parent.GetModel().RemoveItem(shape)
+            shape.Select(False)
+            diagram.RemoveShape(shape)
+            shape.__del__()
+            for item in remList:
+                diagram.RemoveShape(item)
+                item.__del__()
+            
+            for item in upList:
+                item.Update()
+        
+        self.Refresh()
+        
+    def GetNewShapePos(self):
+        """!Determine optimal position for newly added object
+
+        @return x,y
+        """
+        xNew, yNew = map(lambda x: x / 2, self.GetSize())
+        diagram = self.GetDiagram()
+        
+        for shape in diagram.GetShapeList():
+            y = shape.GetY()
+            yBox = shape.GetBoundingBoxMin()[1] / 2
+            if yBox > 0 and y < yNew + yBox and y > yNew - yBox:
+                yNew += yBox * 3
+
+        return xNew, yNew
+    
+class ModelEvtHandler(ogl.ShapeEvtHandler):
+    """!Model event handler class"""
+    def __init__(self, log, frame):
+        ogl.ShapeEvtHandler.__init__(self)
+        self.log = log
+        self.frame = frame
+        self.x = self.y = None
+        
+    def OnLeftClick(self, x, y, keys = 0, attachment = 0):
+        """!Left mouse button pressed -> select item & update statusbar"""
+        shape = self.GetShape()
+        canvas = shape.GetCanvas()
+        dc = wx.ClientDC(canvas)
+        canvas.PrepareDC(dc)
+        
+        if hasattr(self.frame, 'defineRelation'):
+            drel = self.frame.defineRelation
+            if drel['from'] is None:
+                drel['from'] = shape
+            elif drel['to'] is None:
+                drel['to'] = shape
+                rel = ModelRelation(parent = self.frame, fromShape = drel['from'],
+                                    toShape = drel['to'])
+                dlg = ModelRelationDialog(parent = self.frame,
+                                          shape = rel)
+                if dlg.IsValid():
+                    ret = dlg.ShowModal()
+                    if ret == wx.ID_OK:
+                        option = dlg.GetOption()
+                        rel.SetName(option)
+                        drel['from'].AddRelation(rel)
+                        drel['to'].AddRelation(rel)
+                        drel['from'].Update()
+                        params = { 'params' : [{ 'name' : option,
+                                                 'value' : drel['from'].GetValue()}] }
+                        drel['to'].MergeParams(params)
+                        self.frame.AddLine(rel)
+                
+                    dlg.Destroy()
+                del self.frame.defineRelation
+        
+        # select object
+        self._onSelectShape(shape)
+        
+        if hasattr(shape, "GetLog"):
+            self.log.SetStatusText(shape.GetLog(), 0)
+        else:
+            self.log.SetStatusText('', 0)
+        
+    def OnLeftDoubleClick(self, x, y, keys = 0, attachment = 0):
+        """!Left mouse button pressed (double-click) -> show properties"""
+        self.OnProperties()
+        
+    def OnProperties(self, event = None):
+        """!Show properties dialog"""
+        self.frame.ModelChanged()
+        shape = self.GetShape()
+        if isinstance(shape, ModelAction):
+            module = GUI(parent = self.frame, show = True).ParseCommand(shape.GetLog(string = False),
+                                                                        completed = (self.frame.GetOptData, shape, shape.GetParams()))
+        
+        elif isinstance(shape, ModelData):
+            dlg = ModelDataDialog(parent = self.frame, shape = shape)
+            shape.SetPropDialog(dlg)
+            dlg.CentreOnParent()
+            dlg.Show()
+        
+        elif isinstance(shape, ModelLoop):
+            dlg = ModelLoopDialog(parent = self.frame, shape = shape)
+            dlg.CentreOnParent()
+            if dlg.ShowModal() == wx.ID_OK:
+                shape.SetText(dlg.GetCondition())
+                alist = list()
+                ids = dlg.GetItems()
+                for aId in ids['unchecked']:
+                    action = self.frame.GetModel().GetItem(aId)
+                    action.UnSetBlock(shape)
+                for aId in ids['checked']:
+                    action = self.frame.GetModel().GetItem(aId)
+                    action.SetBlock(shape)
+                    if action:
+                        alist.append(action)
+                shape.SetItems(alist)
+                self.frame.DefineLoop(shape)
+                self.frame.SetStatusText(shape.GetLog(), 0)
+            self.frame.GetCanvas().Refresh()
+            
+            dlg.Destroy()
+        
+        elif isinstance(shape, ModelCondition):
+            dlg = ModelConditionDialog(parent = self.frame, shape = shape)
+            dlg.CentreOnParent()
+            if dlg.ShowModal() == wx.ID_OK:
+                shape.SetText(dlg.GetCondition())
+                ids = dlg.GetItems()
+                for b in ids.keys():
+                    alist = list()
+                    for aId in ids[b]['unchecked']:
+                        action = self.frame.GetModel().GetItem(aId)
+                        action.UnSetBlock(shape)
+                    for aId in ids[b]['checked']:
+                        action = self.frame.GetModel().GetItem(aId)
+                        action.SetBlock(shape)
+                        if action:
+                            alist.append(action)
+                    shape.SetItems(alist, branch = b)
+                self.frame.DefineCondition(shape)
+            self.frame.GetCanvas().Refresh()
+            
+            dlg.Destroy()
+                   
+    def OnBeginDragLeft(self, x, y, keys = 0, attachment = 0):
+        """!Drag shape (begining)"""
+        self.frame.ModelChanged()
+        if self._previousHandler:
+            self._previousHandler.OnBeginDragLeft(x, y, keys, attachment)
+        
+    def OnEndDragLeft(self, x, y, keys = 0, attachment = 0):
+        """!Drag shape (end)"""
+        if self._previousHandler:
+            self._previousHandler.OnEndDragLeft(x, y, keys, attachment)
+        
+        shape = self.GetShape()
+        if isinstance(shape, ModelLoop):
+            self.frame.DefineLoop(shape)
+        elif isinstance(shape, ModelCondition):
+            self.frame.DefineCondition(shape)
+        
+        for mo in shape.GetBlock():
+            if isinstance(mo, ModelLoop):
+                self.frame.DefineLoop(mo)
+            elif isinstance(mo, ModelCondition):
+                self.frame.DefineCondition(mo)
+        
+    def OnEndSize(self, x, y):
+        """!Resize shape"""
+        self.frame.ModelChanged()
+        if self._previousHandler:
+            self._previousHandler.OnEndSize(x, y)
+        
+    def OnRightClick(self, x, y, keys = 0, attachment = 0):
+        """!Right click -> pop-up menu"""
+        if not hasattr (self, "popupID"):
+            self.popupID = dict()
+            for key in ('remove', 'enable', 'addPoint',
+                        'delPoint', 'intermediate', 'props', 'id'):
+                self.popupID[key] = wx.NewId()
+        
+        # record coordinates
+        self.x = x
+        self.y = y
+        
+        # select object
+        shape = self.GetShape()
+        self._onSelectShape(shape)
+        
+        popupMenu = wx.Menu()
+        popupMenu.Append(self.popupID['remove'], text=_('Remove'))
+        self.frame.Bind(wx.EVT_MENU, self.OnRemove, id = self.popupID['remove'])
+        if isinstance(shape, ModelAction) or isinstance(shape, ModelLoop):
+            if shape.IsEnabled():
+                popupMenu.Append(self.popupID['enable'], text=_('Disable'))
+                self.frame.Bind(wx.EVT_MENU, self.OnDisable, id = self.popupID['enable'])
+            else:
+                popupMenu.Append(self.popupID['enable'], text=_('Enable'))
+                self.frame.Bind(wx.EVT_MENU, self.OnEnable, id = self.popupID['enable'])
+        
+        if isinstance(shape, ModelRelation):
+            popupMenu.AppendSeparator()
+            popupMenu.Append(self.popupID['addPoint'], text=_('Add control point'))
+            self.frame.Bind(wx.EVT_MENU, self.OnAddPoint, id = self.popupID['addPoint'])
+            popupMenu.Append(self.popupID['delPoint'], text=_('Remove control point'))
+            self.frame.Bind(wx.EVT_MENU, self.OnRemovePoint, id = self.popupID['delPoint'])
+            if len(shape.GetLineControlPoints()) == 2:
+                popupMenu.Enable(self.popupID['delPoint'], False)
+        
+        if isinstance(shape, ModelData) and '@' not in shape.GetValue():
+            popupMenu.AppendSeparator()
+            popupMenu.Append(self.popupID['intermediate'], text=_('Intermediate'),
+                             kind = wx.ITEM_CHECK)
+            if self.GetShape().IsIntermediate():
+                popupMenu.Check(self.popupID['intermediate'], True)
+            
+            self.frame.Bind(wx.EVT_MENU, self.OnIntermediate, id = self.popupID['intermediate'])
+            
+        if isinstance(shape, ModelData) or \
+                isinstance(shape, ModelAction) or \
+                isinstance(shape, ModelLoop):
+            popupMenu.AppendSeparator()
+            popupMenu.Append(self.popupID['props'], text=_('Properties'))
+            self.frame.Bind(wx.EVT_MENU, self.OnProperties, id = self.popupID['props'])
+        
+        self.frame.PopupMenu(popupMenu)
+        popupMenu.Destroy()
+
+    def OnDisable(self, event):
+        """!Disable action"""
+        self._onEnable(False)
+        
+    def OnEnable(self, event):
+        """!Disable action"""
+        self._onEnable(True)
+        
+    def _onEnable(self, enable):
+        shape = self.GetShape()
+        shape.Enable(enable)
+        self.frame.ModelChanged()
+        self.frame.canvas.Refresh()
+        
+    def _onSelectShape(self, shape):
+        canvas = shape.GetCanvas()
+        dc = wx.ClientDC(canvas)
+        
+        if shape.Selected():
+            shape.Select(False, dc)
+        else:
+            redraw = False
+            shapeList = canvas.GetDiagram().GetShapeList()
+            toUnselect = list()
+            
+            for s in shapeList:
+                if s.Selected():
+                    toUnselect.append(s)
+            
+            shape.Select(True, dc)
+            
+            for s in toUnselect:
+                s.Select(False, dc)
+
+        canvas.Refresh(False)
+        
+    def OnAddPoint(self, event):
+        """!Add control point"""
+        shape = self.GetShape()
+        shape.InsertLineControlPoint(point = wx.RealPoint(self.x, self.y))
+        shape.ResetShapes()
+        shape.Select(True)
+        self.frame.ModelChanged()
+        self.frame.canvas.Refresh()
+        
+    def OnRemovePoint(self, event):
+        """!Remove control point"""
+        shape = self.GetShape()
+        shape.DeleteLineControlPoint()
+        shape.Select(False)
+        shape.Select(True)
+        self.frame.ModelChanged()
+        self.frame.canvas.Refresh()
+        
+    def OnIntermediate(self, event):
+        """!Mark data as intermediate"""
+        self.frame.ModelChanged()
+        shape = self.GetShape()
+        shape.SetIntermediate(event.IsChecked())
+        self.frame.canvas.Refresh()
+
+    def OnRemove(self, event):
+        """!Remove shape
+        """
+        self.frame.GetCanvas().RemoveShapes([self.GetShape()])
+        self.frame.itemPanel.Update()
+        
+class VariablePanel(wx.Panel):
+    def __init__(self, parent, id = wx.ID_ANY,
+                 **kwargs):
+        """!Manage model variables panel
+        """
+        self.parent = parent
+        
+        wx.Panel.__init__(self, parent = parent, id = id, **kwargs)
+        
+        self.listBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                                    label=" %s " % _("List of variables - right-click to delete"))
+        
+        self.list = VariableListCtrl(parent = self,
+                                     columns = [_("Name"), _("Data type"),
+                                                _("Default value"), _("Description")])
+        
+        # add new category
+        self.addBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                                   label = " %s " % _("Add new variable"))
+        self.name = wx.TextCtrl(parent = self, id = wx.ID_ANY)
+        wx.CallAfter(self.name.SetFocus)
+        self.type = wx.Choice(parent = self, id = wx.ID_ANY,
+                              choices = [_("integer"),
+                                         _("float"),
+                                         _("string"),
+                                         _("raster"),
+                                         _("vector"),
+                                         _("mapset"),
+                                         _("file")])
+        self.type.SetSelection(2) # string
+        self.value = wx.TextCtrl(parent = self, id = wx.ID_ANY)
+        self.desc = wx.TextCtrl(parent = self, id = wx.ID_ANY)
+        
+        # buttons
+        self.btnAdd = wx.Button(parent = self, id = wx.ID_ADD)
+        self.btnAdd.SetToolTipString(_("Add new variable to the model"))
+        self.btnAdd.Enable(False)
+        
+        # bindings
+        self.name.Bind(wx.EVT_TEXT, self.OnText)
+        self.value.Bind(wx.EVT_TEXT, self.OnText)
+        self.desc.Bind(wx.EVT_TEXT, self.OnText)
+        self.btnAdd.Bind(wx.EVT_BUTTON, self.OnAdd)
+        
+        self._layout()
+
+    def _layout(self):
+        """!Layout dialog"""
+        listSizer = wx.StaticBoxSizer(self.listBox, wx.VERTICAL)
+        listSizer.Add(item = self.list, proportion = 1,
+                      flag = wx.EXPAND)
+        
+        addSizer = wx.StaticBoxSizer(self.addBox, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        gridSizer.AddGrowableCol(1)
+        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                           label = "%s:" % _("Name")),
+                      flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (0, 0))
+        gridSizer.Add(item = self.name,
+                      pos = (0, 1),
+                      flag = wx.EXPAND)
+        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                           label = "%s:" % _("Data type")),
+                      flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (0, 2))
+        gridSizer.Add(item = self.type,
+                      pos = (0, 3))
+        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                           label = "%s:" % _("Default value")),
+                      flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (1, 0))
+        gridSizer.Add(item = self.value,
+                      pos = (1, 1), span = (1, 3),
+                      flag = wx.EXPAND)
+        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                           label = "%s:" % _("Description")),
+                      flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (2, 0))
+        gridSizer.Add(item = self.desc,
+                      pos = (2, 1), span = (1, 3),
+                      flag = wx.EXPAND)
+        addSizer.Add(item = gridSizer,
+                     flag = wx.EXPAND)
+        addSizer.Add(item = self.btnAdd, proportion = 0,
+                     flag = wx.TOP | wx.ALIGN_RIGHT, border = 5)
+        
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        mainSizer.Add(item = listSizer, proportion = 1,
+                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+        mainSizer.Add(item = addSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALIGN_CENTER |
+                      wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
+        
+        self.SetSizer(mainSizer)
+        mainSizer.Fit(self)
+        
+    def OnText(self, event):
+        """!Text entered"""
+        if self.name.GetValue():
+            self.btnAdd.Enable()
+        else:
+            self.btnAdd.Enable(False)
+    
+    def OnAdd(self, event):
+        """!Add new variable to the list"""
+        msg = self.list.Append(self.name.GetValue(),
+                               self.type.GetStringSelection(),
+                               self.value.GetValue(),
+                               self.desc.GetValue())
+        self.name.SetValue('')
+        self.name.SetFocus()
+        
+        if msg:
+            GError(parent = self,
+                   message = msg)
+        else:
+            self.type.SetSelection(2) # string
+            self.value.SetValue('')
+            self.desc.SetValue('')
+            self.UpdateModelVariables()
+        
+    def UpdateModelVariables(self):
+        """!Update model variables"""
+        variables = dict()
+        for values in self.list.GetData().itervalues():
+            name = values[0]
+            variables[name] = { 'type' : str(values[1]) }
+            if values[2]:
+                variables[name]['value'] = values[2]
+            if values[3]:
+                variables[name]['description'] = values[3]
+        
+        self.parent.GetModel().SetVariables(variables)
+        self.parent.ModelChanged()
+
+    def Update(self):
+        """!Reload list of variables"""
+        self.list.OnReload(None)
+        
+    def Reset(self):
+        """!Remove all variables"""
+        self.list.DeleteAllItems()
+        self.parent.GetModel().SetVariables([])
+        
+class ItemPanel(wx.Panel):
+    def __init__(self, parent, id = wx.ID_ANY,
+                 **kwargs):
+        """!Manage model items
+        """
+        self.parent = parent
+        
+        wx.Panel.__init__(self, parent = parent, id = id, **kwargs)
+        
+        self.listBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                                    label=" %s " % _("List of items - right-click to delete"))
+        
+        self.list = ItemListCtrl(parent = self,
+                                 columns = [_("ID"), _("Name"), _("In block"),
+                                            _("Command / Condition")])
+        
+        self._layout()
+
+    def _layout(self):
+        """!Layout dialog"""
+        listSizer = wx.StaticBoxSizer(self.listBox, wx.VERTICAL)
+        listSizer.Add(item = self.list, proportion = 1,
+                      flag = wx.EXPAND)
+        
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        mainSizer.Add(item = listSizer, proportion = 1,
+                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+        
+        self.SetSizer(mainSizer)
+        mainSizer.Fit(self)
+        
+    def Update(self):
+        """!Reload list of variables"""
+        self.list.OnReload(None)
+
+class PythonPanel(wx.Panel):
+    def __init__(self, parent, id = wx.ID_ANY,
+                 **kwargs):
+        """!Model as python script
+        """
+        self.parent = parent
+        
+        wx.Panel.__init__(self, parent = parent, id = id, **kwargs)
+
+        self.filename = None # temp file to run
+        
+        self.bodyBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                                    label = " %s " % _("Python script"))
+        self.body = PyStc(parent = self, statusbar = self.parent.GetStatusBar())
+
+        self.btnRun = wx.Button(parent = self, id = wx.ID_ANY, label = _("&Run"))
+        self.btnRun.SetToolTipString(_("Run python script"))
+        self.Bind(wx.EVT_BUTTON, self.OnRun, self.btnRun)
+        self.btnSaveAs = wx.Button(parent = self, id = wx.ID_SAVEAS)
+        self.btnSaveAs.SetToolTipString(_("Save python script to file"))
+        self.Bind(wx.EVT_BUTTON, self.OnSaveAs, self.btnSaveAs)
+        self.btnRefresh = wx.Button(parent = self, id = wx.ID_REFRESH)
+        self.btnRefresh.SetToolTipString(_("Refresh python script based on the model.\n"
+                                           "It will discards all local changes."))
+        self.Bind(wx.EVT_BUTTON, self.OnRefresh, self.btnRefresh)
+        
+        self._layout()
+        
+    def _layout(self):
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        bodySizer = wx.StaticBoxSizer(self.bodyBox, wx.HORIZONTAL)
+        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+        
+        bodySizer.Add(item = self.body, proportion = 1,
+                      flag = wx.EXPAND | wx.ALL, border = 3)
+        
+        btnSizer.Add(item = self.btnRefresh, proportion = 0,
+                     flag = wx.LEFT | wx.RIGHT, border = 5)
+        btnSizer.AddStretchSpacer()
+        btnSizer.Add(item = self.btnSaveAs, proportion = 0,
+                     flag = wx.RIGHT | wx.ALIGN_RIGHT, border = 5)
+        btnSizer.Add(item = self.btnRun, proportion = 0,
+                     flag = wx.RIGHT | wx.ALIGN_RIGHT, border = 5)
+        
+        sizer.Add(item = bodySizer, proportion = 1,
+                  flag = wx.EXPAND | wx.ALL, border = 3)
+        sizer.Add(item = btnSizer, proportion = 0,
+                  flag = wx.EXPAND | wx.ALL, border = 3)
+        
+        sizer.Fit(self)
+        sizer.SetSizeHints(self)
+        self.SetSizer(sizer)
+
+    def OnRun(self, event):
+        """!Run Python script"""
+        self.filename = grass.tempfile()
+        try:
+            fd = open(self.filename, "w")
+            fd.write(self.body.GetText())
+        except IOError, e:
+            GError(_("Unable to launch Python script. %s") % e,
+                   parent = self)
+            return
+        finally:
+            fd.close()
+            mode = stat.S_IMODE(os.lstat(self.filename)[stat.ST_MODE])
+            os.chmod(self.filename, mode | stat.S_IXUSR)
+        
+        self.parent.goutput.RunCmd([fd.name], switchPage = True,
+                                   skipInterface = True, onDone = self.OnDone)
+        
+        event.Skip()
+
+    def OnDone(self, cmd, returncode):
+        """!Python script finished"""
+        grass.try_remove(self.filename)
+        self.filename = None
+        
+    def SaveAs(self, force = False):
+        """!Save python script to file
+
+        @return filename
+        """
+        filename = ''
+        dlg = wx.FileDialog(parent = self,
+                            message = _("Choose file to save"),
+                            defaultDir = os.getcwd(),
+                            wildcard = _("Python script (*.py)|*.py"),
+                            style = wx.FD_SAVE)
+        
+        if dlg.ShowModal() == wx.ID_OK:
+            filename = dlg.GetPath()
+        
+        if not filename:
+            return ''
+        
+        # check for extension
+        if filename[-3:] != ".py":
+            filename += ".py"
+        
+        if os.path.exists(filename):
+            dlg = wx.MessageDialog(self, message=_("File <%s> already exists. "
+                                                   "Do you want to overwrite this file?") % filename,
+                                   caption=_("Save file"),
+                                   style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+            if dlg.ShowModal() == wx.ID_NO:
+                dlg.Destroy()
+                return ''
+            
+            dlg.Destroy()
+        
+        fd = open(filename, "w")
+        try:
+            if force:
+                WritePythonFile(fd, self.parent.GetModel())
+            else:
+                fd.write(self.body.GetText())
+        finally:
+            fd.close()
+        
+        # executable file
+        os.chmod(filename, stat.S_IRWXU | stat.S_IWUSR)
+        
+        return filename
+    
+    def OnSaveAs(self, event):
+        """!Save python script to file"""
+        self.SaveAs(force = False)
+        event.Skip()
+        
+    def RefreshScript(self):
+        """!Refresh Python script
+
+        @return True on refresh
+        @return False script hasn't been updated
+        """
+        if self.body.modified:
+            dlg = wx.MessageDialog(self,
+                                   message = _("Python script is locally modificated. "
+                                               "Refresh will discard all changes. "
+                                               "Do you really want to continue?"),
+                                   caption=_("Update"),
+                                   style = wx.YES_NO | wx.NO_DEFAULT |
+                                   wx.ICON_QUESTION | wx.CENTRE)
+            ret = dlg.ShowModal()
+            dlg.Destroy()
+            if ret == wx.ID_NO:
+                return False
+        
+        fd = tempfile.TemporaryFile()
+        WritePythonFile(fd, self.parent.GetModel())
+        fd.seek(0)
+        self.body.SetText(fd.read())
+        fd.close()
+        
+        self.body.modified = False
+        
+        return True
+    
+    def OnRefresh(self, event):
+        """!Refresh Python script"""
+        if self.RefreshScript():
+            self.parent.SetStatusText(_('Python script is up-to-date'), 0)
+        event.Skip()
+        
+    def IsModified(self):
+        """!Check if python script has been modified"""
+        return self.body.modified
+    
+    def IsEmpty(self):
+        """!Check if python script is empty"""
+        return len(self.body.GetText()) == 0
+        
+def main():
+    import gettext
+    gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
+    
+    app = wx.PySimpleApp()
+    wx.InitAllImageHandlers()
+    frame = ModelFrame(parent = None)
+    if len(sys.argv) > 1:
+        frame.LoadModelFile(sys.argv[1])
+    frame.Show()
+    
+    app.MainLoop()
+    
+if __name__ == "__main__":
+    main()
diff --git a/gui/wxpython/gmodeler/menudata.py b/gui/wxpython/gmodeler/menudata.py
new file mode 100644
index 0000000..c643709
--- /dev/null
+++ b/gui/wxpython/gmodeler/menudata.py
@@ -0,0 +1,28 @@
+"""!
+ at package gmodeler.menudata
+
+ at brief wxGUI Graphical Modeler - menu data
+
+Classes:
+ - menudata::ModelerData
+
+(C) 2010-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import os
+
+from core                 import globalvar
+from core.menudata        import MenuData
+
+class ModelerData(MenuData):
+    def __init__(self, filename = None):
+        if not filename:
+            gisbase = os.getenv('GISBASE')
+	    filename = os.path.join(globalvar.ETCWXDIR, 'xml', 'menudata_modeler.xml')
+        
+        MenuData.__init__(self, filename)
diff --git a/gui/wxpython/gmodeler/model.py b/gui/wxpython/gmodeler/model.py
new file mode 100644
index 0000000..d09c84c
--- /dev/null
+++ b/gui/wxpython/gmodeler/model.py
@@ -0,0 +1,2251 @@
+"""!
+ at package gmodeler.model
+
+ at brief wxGUI Graphical Modeler (base classes & read/write)
+
+Classes:
+ - model::Model
+ - model::ModelObject
+ - model::ModelAction
+ - model::ModelData
+ - model::ModelRelation
+ - model::ModelItem
+ - model::ModelLoop
+ - model::ModelCondition
+ - model::ProcessModelFile
+ - model::WriteModelFile
+ - model::WritePythonFile
+ - model::ModelParamDialog
+
+(C) 2010-2012 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import os
+import getpass
+import copy
+import re
+import mimetypes
+import time
+try:
+    import xml.etree.ElementTree as etree
+except ImportError:
+    import elementtree.ElementTree as etree # Python <= 2.4
+
+import wx
+from wx.lib import ogl
+
+from core                import globalvar
+from core                import utils
+from core.gcmd           import GMessage, GException, GError, RunCommand, EncodeString, GWarning, GetDefaultEncoding
+from core.settings       import UserSettings
+from gui_core.forms      import GUI, CmdPanel
+from gui_core.widgets    import GNotebook
+
+from grass.script import core as grass
+from grass.script import task as gtask
+
+class Model(object):
+    """!Class representing the model"""
+    def __init__(self, canvas = None):
+        self.items      = list() # list of actions/loops/...
+        
+        # model properties
+        self.properties = { 'name'        : _("model"),
+                            'description' : _("Script generated by wxGUI Graphical Modeler."),
+                            'author'      : getpass.getuser() }
+        # model variables
+        self.variables = dict()
+        self.variablesParams = dict()
+        
+        self.canvas  = canvas
+        
+    def GetCanvas(self):
+        """!Get canvas or None"""
+        return self.canvas
+    
+    def GetItems(self, objType = None):
+        """!Get list of model items
+
+        @param objType Object type to filter model objects
+        """
+        if not objType:
+            return self.items
+        
+        result = list()
+        for item in self.items:
+            if isinstance(item, objType):
+                result.append(item)
+        
+        return result
+
+    def GetItem(self, aId):
+        """!Get item of given id
+
+        @param aId item id
+        
+        @return Model* instance
+        @return None if no item found
+        """
+        ilist = self.GetItems()
+        for item in ilist:
+            if item.GetId() == aId:
+                return item
+        
+        return None
+
+    def GetNumItems(self, actionOnly = False):
+        """!Get number of items"""
+        if actionOnly:
+            return len(self.GetItems(objType = ModelAction))
+        
+        return len(self.GetItems())
+
+    def GetNextId(self):
+        """!Get next id (data ignored)
+
+        @return next id to be used (default: 1)
+        """
+        if len(self.items) < 1:
+            return 1
+        
+        currId = self.items[-1].GetId()
+        if currId > 0:
+            return currId + 1
+        
+        return 1
+
+    def GetProperties(self):
+        """!Get model properties"""
+        return self.properties
+
+    def GetVariables(self, params = False):
+        """!Get model variables"""
+        if params:
+            return self.variablesParams
+        
+        return self.variables
+    
+    def SetVariables(self, data):
+        """!Set model variables"""
+        self.variables = data
+    
+    def Reset(self):
+        """!Reset model"""
+        self.items = list()
+        
+    def RemoveItem(self, item):
+        """!Remove item from model
+        
+        @return list of related items to remove/update
+        """
+        relList = list()
+        upList = list()
+        
+        if not isinstance(item, ModelData):
+            self.items.remove(item)
+        
+        if isinstance(item, ModelAction):
+            for rel in item.GetRelations():
+                relList.append(rel)
+                data = rel.GetData()
+                if len(data.GetRelations()) < 2:
+                    relList.append(data)
+                else:
+                    upList.append(data)
+            
+        elif isinstance(item, ModelData):
+            for rel in item.GetRelations():
+                relList.append(rel)
+                if rel.GetFrom() == self:
+                    relList.append(rel.GetTo())
+                else:
+                    relList.append(rel.GetFrom())
+        
+        elif isinstance(item, ModelLoop):
+            for rel in item.GetRelations():
+                relList.append(rel)
+            for action in self.GetItems():
+                action.UnSetBlock(item)
+        
+        return relList, upList
+    
+    def FindAction(self, aId):
+        """!Find action by id"""
+        alist = self.GetItems(objType = ModelAction)
+        for action in alist:
+            if action.GetId() == aId:
+                return action
+        
+        return None
+
+    def GetData(self):
+        """!Get list of data items"""
+        result = list()
+        dataItems = self.GetItems(objType = ModelData)
+        
+        for action in self.GetItems(objType = ModelAction):
+            for rel in action.GetRelations():
+                dataItem = rel.GetData()
+                if dataItem not in result:
+                    result.append(dataItem)
+                if dataItem in dataItems:
+                    dataItems.remove(dataItem)
+        
+        # standalone data
+        if dataItems:
+            result += dataItems
+        
+        return result
+
+    def FindData(self, value, prompt):
+        """!Find data item in the model
+
+        @param value value
+        @param prompt prompt
+
+        @return ModelData instance
+        @return None if not found
+        """
+        for data in self.GetData():
+            if data.GetValue() == value and \
+                    data.GetPrompt() == prompt:
+                return data
+        
+        return None
+                
+    def LoadModel(self, filename):
+        """!Load model definition stored in GRASS Model XML file (gxm)
+        
+        @todo Validate against DTD
+        
+        Raise exception on error.
+        """
+        dtdFilename = os.path.join(globalvar.ETCWXDIR, "xml", "grass-gxm.dtd")
+        
+        # parse workspace file
+        try:
+            gxmXml = ProcessModelFile(etree.parse(filename))
+        except StandardError, e:
+            raise GException(e)
+        
+        if self.canvas:
+            win = self.canvas.parent
+            if gxmXml.pos:
+                win.SetPosition(gxmXml.pos)
+            if gxmXml.size:
+                win.SetSize(gxmXml.size)
+        
+        # load properties
+        self.properties = gxmXml.properties
+        self.variables  = gxmXml.variables
+        
+        # load model.GetActions()
+        for action in gxmXml.actions:
+            actionItem = ModelAction(parent = self, 
+                                     x = action['pos'][0],
+                                     y = action['pos'][1],
+                                     width = action['size'][0],
+                                     height = action['size'][1],
+                                     task = action['task'],
+                                     id = action['id'])
+            
+            if action['disabled']:
+                actionItem.Enable(False)
+            
+            self.AddItem(actionItem)
+            
+            actionItem.SetValid(actionItem.GetTask().get_options())
+            actionItem.GetLog() # substitute variables (-> valid/invalid)
+        
+        # load data & relations
+        for data in gxmXml.data:
+            dataItem = ModelData(parent = self, 
+                                 x = data['pos'][0],
+                                 y = data['pos'][1],
+                                 width = data['size'][0],
+                                 height = data['size'][1],
+                                 prompt = data['prompt'],
+                                 value = data['value'])
+            dataItem.SetIntermediate(data['intermediate'])
+            
+            for rel in data['rels']:
+                actionItem = self.FindAction(rel['id'])
+                if rel['dir'] == 'from':
+                    relation = ModelRelation(parent = self, fromShape = dataItem,
+                                             toShape = actionItem, param = rel['name'])
+                else:
+                    relation = ModelRelation(parent = self, fromShape = actionItem,
+                                             toShape = dataItem, param = rel['name'])
+                relation.SetControlPoints(rel['points'])
+                actionItem.AddRelation(relation)
+                dataItem.AddRelation(relation)
+
+            if self.canvas:
+                dataItem.Update()
+           
+        # load loops
+        for loop in gxmXml.loops:
+            loopItem = ModelLoop(parent = self, 
+                                 x = loop['pos'][0],
+                                 y = loop['pos'][1],
+                                 width = loop['size'][0],
+                                 height = loop['size'][1],
+                                 text = loop['text'],
+                                 id = loop['id'])
+            self.AddItem(loopItem)
+
+        # load conditions
+        for condition in gxmXml.conditions:
+            conditionItem = ModelCondition(parent = self, 
+                                           x = condition['pos'][0],
+                                           y = condition['pos'][1],
+                                           width = condition['size'][0],
+                                           height = condition['size'][1],
+                                           text = condition['text'],
+                                           id = condition['id'])
+            self.AddItem(conditionItem)
+
+        # define loops & if/else items
+        for loop in gxmXml.loops:
+            alist = list()
+            for aId in loop['items']:
+                action = self.GetItem(aId)
+                alist.append(action)
+            
+            loopItem = self.GetItem(loop['id'])
+            loopItem.SetItems(alist)
+            
+            for action in loopItem.GetItems():
+                action.SetBlock(loopItem)
+        
+        for condition in gxmXml.conditions:
+            conditionItem = self.GetItem(condition['id'])
+            for b in condition['items'].keys():
+                alist = list()
+                for aId in condition['items'][b]:
+                    action = self.GetItem(aId)
+                    alist.append(action)
+                conditionItem.SetItems(alist, branch = b)
+            
+            items = conditionItem.GetItems()
+            for b in items.keys():
+                for action in items[b]:
+                    action.SetBlock(conditionItem)
+        
+    def AddItem(self, newItem):
+        """!Add item to the list"""
+        iId = newItem.GetId()
+        
+        i  = 0
+        for item in self.items:
+            if item.GetId() > iId:
+                self.items.insert(i, newItem)
+                return
+            i += 1
+        
+        self.items.append(newItem)
+        
+    def IsValid(self):
+        """Return True if model is valid"""
+        if self.Validate():
+            return False
+        
+        return True
+    
+    def Validate(self):
+        """!Validate model, return None if model is valid otherwise
+        error string"""
+        errList = list()
+
+        variables = self.GetVariables().keys()
+        pattern = re.compile(r'(.*)(%.+\s?)(.*)')
+        for action in self.GetItems(objType = ModelAction):
+            cmd = action.GetLog(string = False)
+            
+            task = GUI(show = None).ParseCommand(cmd = cmd)
+            errList += map(lambda x: cmd[0] + ': ' + x, task.get_cmd_error())
+            
+            # check also variables
+            for opt in cmd[1:]:
+                if '=' not in opt:
+                    continue
+                key, value = opt.split('=', 1)
+                sval = pattern.search(value)
+                if sval:
+                    var = sval.group(2).strip()[1:] # ignore '%'
+                    if var not in variables:
+                        report = True
+                        for item in filter(lambda x: isinstance(x, ModelLoop), action.GetBlock()):
+                            if var in item.GetText():
+                                report = False
+                                break
+                        if report:
+                            errList.append(cmd[0] + ": " + _("undefined variable '%s'") % var)
+            ### TODO: check variables in file only optionally
+            ### errList += self._substituteFile(action, checkOnly = True)
+        
+        return errList
+
+    def _substituteFile(self, item, params = None, checkOnly = False):
+        """!Subsitute variables in command file inputs
+
+        @param checkOnly tuble - True to check variable, don't touch files
+        
+        @return list of undefined variables
+        """
+        errList = list()
+        
+        self.fileInput = dict()
+        
+        # collect ascii inputs
+        for p in item.GetParams()['params']:
+            if p.get('element', '') == 'file' and \
+                    p.get('prompt', '') == 'input' and \
+                    p.get('age', '') == 'old_file':
+                filename = p.get('value', p.get('default', ''))
+                if filename and \
+                        mimetypes.guess_type(filename)[0] == 'text/plain':
+                    self.fileInput[filename] = None
+        
+        for finput in self.fileInput:
+            # read lines
+            fd = open(finput, "r")
+            try:
+                data = self.fileInput[finput] = fd.read()
+            finally:
+                fd.close()
+            
+            # substitute variables
+            write = False
+            variables = self.GetVariables()
+            for variable in variables:
+                pattern = re.compile('%' + variable)
+                value = ''
+                if params and 'variables' in params:
+                    for p in params['variables']['params']:
+                        if variable == p.get('name', ''):
+                            if p.get('type', 'string') == 'string':
+                                value = p.get('value', '')
+                            else:
+                                value = str(p.get('value', ''))
+                            break
+                
+                if not value:
+                    value = variables[variable].get('value', '')
+                
+                data = pattern.sub(value, data)
+                if not checkOnly:
+                    write = True
+            
+            pattern = re.compile(r'(.*)(%.+\s?)(.*)')
+            sval = pattern.search(data)
+            if sval:
+                var = sval.group(2).strip()[1:] # ignore '%'
+                cmd = item.GetLog(string = False)[0]
+                errList.append(cmd + ": " + _("undefined variable '%s'") % var)
+            
+            if not checkOnly:
+                if write:
+                    fd = open(finput, "w")
+                    try:
+                        fd.write(data)
+                    finally:
+                        fd.close()
+                else:
+                    self.fileInput[finput] = None
+        
+        return errList
+    
+    def OnPrepare(self, item, params):
+        self._substituteFile(item, params, checkOnly = False)
+
+    def RunAction(self, item, params, log, onDone, onPrepare = None, statusbar = None):
+        """!Run given action
+
+        @param item action item
+        @param params parameters dict
+        @param log logging window
+        @param onDone on-done method
+        @param onPrepare on-prepare method
+        @param statusbar wx.StatusBar instance or None
+        """
+        name = item.GetName()
+        if name in params:
+            paramsOrig = item.GetParams(dcopy = True)
+            item.MergeParams(params[name])
+        
+        if statusbar:
+            statusbar.SetStatusText(_('Running model...'), 0)
+            
+        data = { 'item' : item,
+                 'params' : copy.deepcopy(params) }
+        log.RunCmd(command = item.GetLog(string = False, substitute = params),
+                   onDone = onDone, onPrepare = self.OnPrepare, userData = data)
+        
+        if name in params:
+            item.SetParams(paramsOrig)
+
+    def Run(self, log, onDone, parent = None):
+        """!Run model
+
+        @param log logging window (see goutput.GMConsole)
+        @param onDone on-done method
+        @param parent window for messages or None
+        """
+        if self.GetNumItems() < 1:
+            GMessage(parent = parent,
+                     message = _('Model is empty. Nothing to run.'))
+            return
+        
+        statusbar = None
+        if isinstance(parent, wx.Frame):
+            statusbar = parent.GetStatusBar()
+        
+        # validation
+        if statusbar:
+            statusbar.SetStatusText(_('Validating model...'), 0)
+        errList = self.Validate()
+        if statusbar:
+            statusbar.SetStatusText('', 0)
+        if errList:
+            dlg = wx.MessageDialog(parent = parent,
+                                   message = _('Model is not valid. Do you want to '
+                                               'run the model anyway?\n\n%s') % '\n'.join(errList),
+                                   caption = _("Run model?"),
+                                   style = wx.YES_NO | wx.NO_DEFAULT |
+                                   wx.ICON_QUESTION | wx.CENTRE)
+            ret = dlg.ShowModal()
+            dlg.Destroy()
+            if ret != wx.ID_YES:
+                return
+        
+        # parametrization
+        params = self.Parameterize()
+        delInterData = False
+        if params:
+            dlg = ModelParamDialog(parent = parent,
+                                   params = params)
+            dlg.CenterOnParent()
+            
+            ret = dlg.ShowModal()
+            if ret != wx.ID_OK:
+                dlg.Destroy()
+                return
+            
+            err = dlg.GetErrors()
+            delInterData = dlg.DeleteIntermediateData()
+            dlg.Destroy()
+            if err:
+                GError(parent = parent, message = unicode('\n'.join(err)))
+                return
+            
+            err = list()
+            for key, item in params.iteritems():
+                for p in item['params']:
+                    if p.get('value', '') == '':
+                        err.append((key, p.get('name', ''), p.get('description', '')))
+            if err:
+                GError(parent = parent,
+                       message = _("Variables below not defined:") + \
+                           "\n\n" + unicode('\n'.join(map(lambda x: "%s: %s (%s)" % (x[0], x[1], x[2]), err))))
+                return
+        
+        log.cmdThread.SetId(-1)
+        for item in self.GetItems():
+            if not item.IsEnabled():
+                continue
+            if isinstance(item, ModelAction):
+                if item.GetBlockId():
+                    continue
+                self.RunAction(item, params, log, onDone)
+            elif isinstance(item, ModelLoop):
+                cond = item.GetText()
+                # substitute variables in condition
+                variables = self.GetVariables()
+                for variable in variables:
+                    pattern = re.compile('%' + variable)
+                    if pattern.search(cond):
+                        value = ''
+                        if params and 'variables' in params:
+                            for p in params['variables']['params']:
+                                if variable == p.get('name', ''):
+                                    value = p.get('value', '')
+                                    break
+                        
+                        if not value:
+                            value = variables[variable].get('value', '')
+                        
+                        if not value:
+                            continue
+                        
+                        vtype = variables[variable].get('type', 'string')
+                        if vtype == 'string':
+                            value = '"' + value + '"'
+                        cond = pattern.sub(value, cond)
+                
+                # split condition
+                condVar, condText = map(lambda x: x.strip(), re.split('\s*in\s*', cond))
+                pattern = re.compile('%' + condVar)
+                ### for vars()[condVar] in eval(condText): ?
+                if condText[0] == '`' and condText[-1] == '`':
+                    # run command
+                    cmd, dcmd = utils.CmdToTuple(condText[1:-1].split(' '))
+                    ret = RunCommand(cmd,
+                                     read = True,
+                                     **dcmd)
+                    if ret:
+                        vlist = ret.splitlines()
+                else:
+                    vlist = eval(condText)
+                
+                if 'variables' not in params:
+                    params['variables'] = { 'params' : [] }
+                varDict = { 'name' : condVar, 'value' : '' }
+                params['variables']['params'].append(varDict)
+                                
+                for var in vlist:
+                    for action in item.GetItems():
+                        if not isinstance(action, ModelAction) or \
+                                not action.IsEnabled():
+                            continue
+                        
+                        varDict['value'] = var
+                                                
+                        self.RunAction(item = action, params = params,
+                                       log = log, onDone = onDone)
+                params['variables']['params'].remove(varDict)
+        
+        if delInterData:
+            self.DeleteIntermediateData(log)
+        
+        # discard values
+        if params:
+            for item in params.itervalues():
+                for p in item['params']:
+                    p['value'] = ''
+        
+    def DeleteIntermediateData(self, log):
+        """!Detele intermediate data"""
+        rast, vect, rast3d, msg = self.GetIntermediateData()
+        
+        if rast:
+            log.RunCmd(['g.remove', 'rast=%s' %','.join(rast)])
+        if rast3d:
+            log.RunCmd(['g.remove', 'rast3d=%s' %','.join(rast3d)])
+        if vect:
+            log.RunCmd(['g.remove', 'vect=%s' %','.join(vect)])
+        
+    def GetIntermediateData(self):
+        """!Get info about intermediate data"""
+        rast = list()
+        rast3d = list()
+        vect = list()
+        for data in self.GetData():
+            if not data.IsIntermediate():
+                continue
+            name = data.GetValue()
+            prompt = data.GetPrompt()
+            if prompt == 'raster':
+                rast.append(name)
+            elif prompt == 'vector':
+                vect.append(name)
+            elif prompt == 'rast3d':
+                rast3d.append(name)
+        
+        msg = ''
+        if rast:
+            msg += '\n\n%s: ' % _('Raster maps')
+            msg += ', '.join(rast)
+        if rast3d:
+            msg += '\n\n%s: ' % _('3D raster maps')
+            msg += ', '.join(rast3d)
+        if vect:
+            msg += '\n\n%s: ' % _('Vector maps')
+            msg += ', '.join(vect)
+        
+        return rast, vect, rast3d, msg
+
+    def Update(self):
+        """!Update model"""
+        for item in self.items:
+            item.Update()
+        
+    def IsParameterized(self):
+        """!Return True if model is parameterized"""
+        if self.Parameterize():
+            return True
+        
+        return False
+    
+    def Parameterize(self):
+        """!Return parameterized options"""
+        result = dict()
+        idx = 0
+        if self.variables:
+            params = list()
+            result["variables"] = { 'flags'  : list(),
+                                    'params' : params,
+                                    'idx'    : idx }
+            for name, values in self.variables.iteritems():
+                gtype = values.get('type', 'string')
+                if gtype in ('raster', 'vector', 'mapset', 'file'):
+                    gisprompt = True
+                    prompt = gtype
+                    if gtype == 'raster':
+                        element = 'cell'
+                    else:
+                        element = gtype
+                    ptype = 'string'
+                else:
+                    gisprompt = False
+                    prompt = None
+                    element = None
+                    ptype = gtype
+                params.append({ 'gisprompt' : gisprompt,
+                                'multiple'  : False,
+                                'description' : values.get('description', ''),
+                                'guidependency' : '',
+                                'default' : '',
+                                'age' : None,
+                                'required' : True,
+                                'value' : values.get('value', ''),
+                                'label' : '',
+                                'guisection' : '',
+                                'key_desc' : '',
+                                'values' : list(),
+                                'parameterized' : False,
+                                'values_desc' : list(),
+                                'prompt' : prompt,
+                                'element' : element,
+                                'type' : ptype,
+                                'name' : name })
+            
+            idx += 1
+        
+        for action in self.GetItems(objType = ModelAction):
+            if not action.IsEnabled():
+                continue
+            name   = action.GetName()
+            params = action.GetParams()
+            for f in params['flags']:
+                if f.get('parameterized', False):
+                    if name not in result:
+                        result[name] = { 'flags' : list(),
+                                         'params': list(),
+                                         'idx'   : idx }
+                    result[name]['flags'].append(f)
+            for p in params['params']:
+                if p.get('parameterized', False):
+                    if name not in result:
+                        result[name] = { 'flags' : list(),
+                                         'params': list(),
+                                         'idx'   : idx }
+                    result[name]['params'].append(p)
+            if name in result:
+                idx += 1
+        
+        self.variablesParams = result # record parameters
+        
+        return result
+
+class ModelObject(object):
+    def __init__(self, id = -1):
+        self.id   = id
+        self.rels = list() # list of ModelRelations
+        
+        self.isEnabled = True
+        self.inBlock   = list() # list of related loops/conditions
+        
+    def __del__(self):
+        pass
+    
+    def GetId(self):
+        """!Get id"""
+        return self.id
+    
+    def AddRelation(self, rel):
+        """!Record new relation
+        """
+        self.rels.append(rel)
+
+    def GetRelations(self, fdir = None):
+        """!Get list of relations
+        
+        @param fdir True for 'from'
+        """
+        if fdir is None:
+            return self.rels
+        
+        result = list()
+        for rel in self.rels:
+            if fdir == 'from':
+                if rel.GetFrom() == self:
+                    result.append(rel)
+            else:
+                if rel.GetTo() == self:
+                    result.append(rel)
+        
+        return result
+    
+    def IsEnabled(self):
+        """!Get True if action is enabled, otherwise False"""
+        return self.isEnabled
+    
+    def Enable(self, enabled = True):
+        """!Enable/disable action"""
+        self.isEnabled = enabled
+        self.Update()
+
+    def Update(self):
+        pass
+
+    def SetBlock(self, item):
+        """!Add object to the block (loop/condition)
+
+        @param item reference to ModelLoop or ModelCondition which
+        defines loops/condition
+        """
+        if item not in self.inBlock:
+            self.inBlock.append(item)
+        
+    def UnSetBlock(self, item):
+        """!Remove object from the block (loop/consition)
+
+        @param item reference to ModelLoop or ModelCondition which
+        defines loops/codition
+        """
+        if item in self.inBlock:
+            self.inBlock.remove(item)
+        
+    def GetBlock(self):
+        """!Get list of related ModelObject(s) which defines block
+        (loop/condition)
+
+        @return list of ModelObjects
+        """
+        return self.inBlock
+    
+    def GetBlockId(self):
+        """!Get list of related ids which defines block
+
+        @return list of ids
+        """
+        ret = list()
+        for mo in self.inBlock:
+            ret.append(mo.GetId())
+        
+        return ret
+    
+class ModelAction(ModelObject, ogl.RectangleShape):
+    """!Action class (GRASS module)"""
+    def __init__(self, parent, x, y, id = -1, cmd = None, task = None, width = None, height = None):
+        ModelObject.__init__(self, id)
+        
+        self.parent  = parent
+        self.task    = task
+        
+        if not width:
+            width = UserSettings.Get(group='modeler', key='action', subkey=('size', 'width'))
+        if not height:
+            height = UserSettings.Get(group='modeler', key='action', subkey=('size', 'height'))
+        
+        if cmd and cmd[0] in ('r.mapcalc', 'v.type'):
+            cmd[0] += '_wrapper'
+        
+        if cmd:
+            self.task = GUI(show = None).ParseCommand(cmd = cmd)
+        else:
+            if task:
+                self.task = task
+            else:
+                self.task = None
+        
+        self.propWin = None
+        
+        self.data = list()   # list of connected data items
+        
+        self.isValid = False
+        self.isParameterized = False
+        
+        if self.parent.GetCanvas():
+            ogl.RectangleShape.__init__(self, width, height)
+            
+            self.SetCanvas(self.parent)
+            self.SetX(x)
+            self.SetY(y)
+            self.SetPen(wx.BLACK_PEN)
+            self._setPen()
+            self._setBrush()
+            self.SetId(id)
+        
+        if self.task:
+            self.SetValid(self.task.get_options())
+        
+    def _setBrush(self, running = False):
+        """!Set brush"""
+        if running:
+            color = UserSettings.Get(group='modeler', key='action',
+                                     subkey=('color', 'running'))
+        elif not self.isEnabled:
+            color = UserSettings.Get(group='modeler', key='disabled',
+                                     subkey='color')
+        elif self.isValid:
+            color = UserSettings.Get(group='modeler', key='action',
+                                     subkey=('color', 'valid'))
+        else:
+            color = UserSettings.Get(group='modeler', key='action',
+                                     subkey=('color', 'invalid'))
+        
+        wxColor = wx.Color(color[0], color[1], color[2])
+        self.SetBrush(wx.Brush(wxColor))
+        
+    def _setPen(self):
+        """!Set pen"""
+        if self.isParameterized:
+            width = int(UserSettings.Get(group='modeler', key='action',
+                                         subkey=('width', 'parameterized')))
+        else:
+            width = int(UserSettings.Get(group='modeler', key='action',
+                                         subkey=('width', 'default')))
+        pen = self.GetPen()
+        pen.SetWidth(width)
+        self.SetPen(pen)
+
+    def SetId(self, id):
+        """!Set id"""
+        self.id = id
+        cmd = self.task.get_cmd(ignoreErrors = True)
+        if cmd and len(cmd) > 0:
+            self.ClearText()
+            self.AddText('(%d) %s' % (self.id, cmd[0]))
+        else:
+            self.AddText('(%d) <<%s>>' % (self.id, _("unknown")))
+        
+    def SetProperties(self, params, propwin):
+        """!Record properties dialog"""
+        self.task.params = params['params']
+        self.task.flags  = params['flags']
+        self.propWin = propwin
+
+    def GetPropDialog(self):
+        """!Get properties dialog"""
+        return self.propWin
+
+    def GetLog(self, string = True, substitute = None):
+        """!Get logging info
+
+        @param string True to get cmd as a string otherwise a list
+        @param substitute dictionary of parameter to substitute or None
+        """
+        cmd = self.task.get_cmd(ignoreErrors = True, ignoreRequired = True,
+                                ignoreDefault = False)
+        
+        # substitute variables
+        if substitute:
+            variables = []
+            if 'variables' in substitute:
+                for p in substitute['variables']['params']:
+                    variables.append(p.get('name', ''))
+            else:
+                variables = self.parent.GetVariables()
+            for variable in variables:
+                pattern= re.compile('%' + variable)
+                value = ''
+                if substitute and 'variables' in substitute:
+                    for p in substitute['variables']['params']:
+                        if variable == p.get('name', ''):
+                            if p.get('type', 'string') == 'string':
+                                value = p.get('value', '')
+                            else:
+                                value = str(p.get('value', ''))
+                            break
+                    
+                if not value:
+                    value = variables[variable].get('value', '')
+                
+                if not value:
+                    continue
+                
+                for idx in range(len(cmd)):
+                    if pattern.search(cmd[idx]):
+                        cmd[idx] = pattern.sub(value, cmd[idx])
+                        break
+                    idx += 1
+        
+        if string:
+            if cmd is None:
+                return ''
+            else:
+                return ' '.join(cmd)
+        
+        return cmd
+    
+    def GetName(self):
+        """!Get name"""
+        cmd = self.task.get_cmd(ignoreErrors = True)
+        if cmd and len(cmd) > 0:
+            return cmd[0]
+        
+        return _('unknown')
+
+    def GetParams(self, dcopy = False):
+        """!Get dictionary of parameters"""
+        if dcopy:
+            return copy.deepcopy(self.task.get_options())
+        
+        return self.task.get_options()
+
+    def GetTask(self):
+        """!Get grassTask instance"""
+        return self.task
+    
+    def SetParams(self, params):
+        """!Set dictionary of parameters"""
+        self.task.params = params['params']
+        self.task.flags  = params['flags']
+        
+    def MergeParams(self, params):
+        """!Merge dictionary of parameters"""
+        if 'flags' in params:
+            for f in params['flags']:
+                self.task.set_flag(f['name'],
+                                   f.get('value', False))
+        if 'params' in params:
+            for p in params['params']:
+                self.task.set_param(p['name'],
+                                    p.get('value', ''))
+        
+    def SetValid(self, options):
+        """!Set validity for action
+        
+        @param options dictionary with flags and params (gtask)
+        """
+        self.isValid = True
+        self.isParameterized = False
+        
+        for f in options['flags']:
+            if f.get('parameterized', False):
+                self.IsParameterized = True
+                break
+        
+        for p in options['params']:
+            if self.isValid and p.get('required', False) and \
+                    p.get('value', '') == '' and \
+                    p.get('default', '') == '':
+                self.isValid = False
+            if not self.isParameterized and p.get('parameterized', False):
+                self.isParameterized = True
+        
+        if self.parent.GetCanvas():
+            self._setBrush()
+            self._setPen()
+        
+    def IsValid(self):
+        """!Check validity (all required parameters set)"""
+        return self.isValid
+    
+    def IsParameterized(self):
+        """!Check if action is parameterized"""
+        return self.isParameterized
+    
+    def FindData(self, name):
+        """!Find data item by name"""
+        for rel in self.GetRelations():
+            data = rel.GetData()
+            if name == rel.GetName() and name in data.GetName():
+                return data
+        
+        return None
+
+    def Update(self, running = False):
+        """!Update action"""
+        if running:
+            self._setBrush(running = True)
+        else:
+            self._setBrush()
+        self._setPen()
+
+    def OnDraw(self, dc):
+        """!Draw action in canvas"""
+        self._setBrush()
+        self._setPen()
+        ogl.RectangleShape.Recentre(self, dc) # re-center text
+        ogl.RectangleShape.OnDraw(self, dc)
+
+class ModelData(ModelObject, ogl.EllipseShape):
+    def __init__(self, parent, x, y, value = '', prompt = '', width = None, height = None):
+        """Data item class
+        
+        @param parent window parent
+        @param x, y   position of the shape
+        @param fname, tname list of parameter names from / to
+        @param value  value
+        @param prompt type of GIS element
+        @param width,height dimension of the shape
+        """
+        ModelObject.__init__(self)
+        
+        self.parent  = parent
+        self.value   = value
+        self.prompt  = prompt
+        self.intermediate = False
+        self.propWin = None
+        if not width:
+            width = UserSettings.Get(group='modeler', key='data', subkey=('size', 'width'))
+        if not height:
+            height = UserSettings.Get(group='modeler', key='data', subkey=('size', 'height'))
+        
+        if self.parent.GetCanvas():
+            ogl.EllipseShape.__init__(self, width, height)
+            
+            self.SetCanvas(self.parent)
+            self.SetX(x)
+            self.SetY(y)
+            self.SetPen(wx.BLACK_PEN)
+            self._setBrush()
+            
+            self._setText()
+            
+    def IsIntermediate(self):
+        """!Checks if data item is intermediate"""
+        return self.intermediate
+    
+    def SetIntermediate(self, im):
+        """!Set intermediate flag"""
+        self.intermediate = im
+  
+    def OnDraw(self, dc):
+        pen = self.GetPen()
+        pen.SetWidth(1)
+        if self.intermediate:
+            pen.SetStyle(wx.SHORT_DASH)
+        else:
+            pen.SetStyle(wx.SOLID)
+        self.SetPen(pen)
+        
+        ogl.EllipseShape.OnDraw(self, dc)
+        
+    def GetLog(self, string = True):
+        """!Get logging info"""
+        name = list()
+        for rel in self.GetRelations():
+            name.append(rel.GetName())
+        if name:
+            return '/'.join(name) + '=' + self.value + ' (' + self.prompt + ')'
+        else:
+            return self.value + ' (' + self.prompt + ')'
+
+    def GetName(self):
+        """!Get list of names"""
+        name = list()
+        for rel in self.GetRelations():
+            name.append(rel.GetName())
+        
+        return name
+    
+    def GetPrompt(self):
+        """!Get prompt"""
+        return self.prompt
+
+    def SetPrompt(self, prompt):
+        """!Set prompt
+        
+        @param prompt
+        """
+        self.prompt = prompt
+        
+    def GetValue(self):
+        """!Get value"""
+        return self.value
+
+    def SetValue(self, value):
+        """!Set value
+
+        @param value
+        """
+        self.value = value
+        self._setText()
+        for direction in ('from', 'to'):
+            for rel in self.GetRelations(direction):
+                if direction == 'from':
+                    action = rel.GetTo()
+                else:
+                    action = rel.GetFrom()
+                
+                task = GUI(show = None).ParseCommand(cmd = action.GetLog(string = False))
+                task.set_param(rel.GetName(), self.value)
+                action.SetParams(params = task.get_options())
+        
+    def GetPropDialog(self):
+        """!Get properties dialog"""
+        return self.propWin
+
+    def SetPropDialog(self, win):
+        """!Get properties dialog"""
+        self.propWin = win
+
+    def _setBrush(self):
+        """!Set brush"""
+        if self.prompt == 'raster':
+            color = UserSettings.Get(group = 'modeler', key = 'data',
+                                     subkey = ('color', 'raster'))
+        elif self.prompt == 'raster3d':
+            color = UserSettings.Get(group = 'modeler', key = 'data',
+                                     subkey = ('color', 'raster3d'))
+        elif self.prompt == 'vector':
+            color = UserSettings.Get(group = 'modeler', key = 'data',
+                                     subkey = ('color', 'vector'))
+        else:
+            color = UserSettings.Get(group = 'modeler', key = 'action',
+                                     subkey = ('color', 'invalid'))
+        wxColor = wx.Color(color[0], color[1], color[2])
+        self.SetBrush(wx.Brush(wxColor))
+        
+    def _setPen(self):
+        """!Set pen"""
+        isParameterized = False
+        for rel in self.GetRelations('from'):
+            if rel.GetTo().IsParameterized():
+                isParameterized = True
+                break
+        if not isParameterized:
+            for rel in self.GetRelations('to'):
+                if rel.GetFrom().IsParameterized():
+                    isParameterized = True
+                    break
+
+        if isParameterized:
+            width = int(UserSettings.Get(group = 'modeler', key = 'action',
+                                         subkey = ('width', 'parameterized')))
+        else:
+            width = int(UserSettings.Get(group = 'modeler', key = 'action',
+                                         subkey = ('width', 'default')))
+        pen = self.GetPen()
+        pen.SetWidth(width)
+        self.SetPen(pen)
+        
+    def _setText(self):
+        """!Update text"""
+        self.ClearText()
+        name = []
+        for rel in self.GetRelations():
+            name.append(rel.GetName())
+        self.AddText('/'.join(name))
+        if self.value:
+            self.AddText(self.value)
+        else:
+            self.AddText(_('<not defined>'))
+        
+    def Update(self):
+        """!Update action"""
+        self._setBrush()
+        self._setPen()
+        self._setText()
+
+class ModelRelation(ogl.LineShape):
+    """!Data - action relation"""
+    def __init__(self, parent, fromShape, toShape, param = ''):
+        self.fromShape = fromShape
+        self.toShape   = toShape
+        self.param     = param
+        self.parent    = parent
+        
+        self._points    = None
+        
+        if self.parent.GetCanvas():        
+            ogl.LineShape.__init__(self)
+    
+    def __del__(self):
+        if self in self.fromShape.rels:
+            self.fromShape.rels.remove(self)
+        if self in self.toShape.rels:
+            self.toShape.rels.remove(self)
+        
+    def GetFrom(self):
+        """!Get id of 'from' shape"""
+        return self.fromShape
+    
+    def GetTo(self):
+        """!Get id of 'to' shape"""
+        return self.toShape
+    
+    def GetData(self):
+        """!Get related ModelData instance
+
+        @return ModelData instance
+        @return None if not found
+        """
+        if isinstance(self.fromShape, ModelData):
+            return self.fromShape
+        elif isinstance(self.toShape, ModelData):
+            return self.toShape
+        
+        return None
+    
+    def GetName(self):
+        """!Get parameter name"""
+        return self.param
+    
+    def ResetShapes(self):
+        """!Reset related objects"""
+        self.fromShape.ResetControlPoints()
+        self.toShape.ResetControlPoints()
+        self.ResetControlPoints()
+        
+    def SetControlPoints(self, points):
+        """!Set control points"""
+        self._points = points
+        
+    def GetControlPoints(self):
+        """!Get list of control points"""
+        return self._points
+    
+    def _setPen(self):
+        """!Set pen"""
+        pen = self.GetPen()
+        pen.SetWidth(1)
+        pen.SetStyle(wx.SOLID)
+        self.SetPen(pen)
+        
+    def OnDraw(self, dc):
+        """!Draw relation"""
+        self._setPen()
+        ogl.LineShape.OnDraw(self, dc)
+    
+    def SetName(self, param):
+        self.param = param
+
+class ModelItem(ModelObject):
+    def __init__(self, parent, x, y, id = -1, width = None, height = None, text = '', items = []):
+        """!Abstract class for loops and conditions"""
+        ModelObject.__init__(self, id)
+        self.parent  = parent
+        self.text    = text
+        self.items   = items  # list of items in the loop
+        
+    def GetText(self):
+        """!Get loop text"""
+        return self.text
+
+    def GetItems(self):
+        """!Get items (id)"""
+        return self.items
+
+    def SetId(self, id):
+        """!Set loop id"""
+        self.id = id
+
+    def SetText(self, cond):
+        """!Set loop text (condition)"""
+        self.text = cond
+        self.ClearText()
+        self.AddText('(' + str(self.id) + ') ' + self.text)
+
+    def GetLog(self):
+        """!Get log info"""
+        if self.text:
+            return _("Condition: ") + self.text
+        else:
+            return _("Condition: not defined")
+
+    def AddRelation(self, rel):
+        """!Record relation"""
+        self.rels.append(rel)
+        
+    def Clear(self):
+        """!Clear object, remove rels"""
+        self.rels = list()
+
+class ModelLoop(ModelItem, ogl.RectangleShape):
+    def __init__(self, parent, x, y, id = -1, width = None, height = None, text = '', items = []):
+        """!Defines a loop"""
+        ModelItem.__init__(self, parent, x, y, id, width, height, text, items)
+        
+        if not width:
+            width = UserSettings.Get(group='modeler', key='loop', subkey=('size', 'width'))
+        if not height:
+            height = UserSettings.Get(group='modeler', key='loop', subkey=('size', 'height'))
+        
+        if self.parent.GetCanvas():
+            ogl.RectangleShape.__init__(self, width, height)
+            
+            self.SetCanvas(self.parent)
+            self.SetX(x)
+            self.SetY(y)
+            self.SetPen(wx.BLACK_PEN)
+            self.SetCornerRadius(100)
+            if text:
+                self.AddText('(' + str(self.id) + ') ' + text)
+            else:
+                self.AddText('(' + str(self.id) + ')')
+        
+        self._setBrush()
+        
+    def _setBrush(self):
+        """!Set brush"""
+        if not self.isEnabled:
+            color = UserSettings.Get(group='modeler', key='disabled',
+                                     subkey='color')
+        else:
+            color = UserSettings.Get(group='modeler', key='loop',
+                                     subkey=('color', 'valid'))
+        
+        wxColor = wx.Color(color[0], color[1], color[2])
+        self.SetBrush(wx.Brush(wxColor))
+
+    def Enable(self, enabled = True):
+        """!Enable/disable action"""
+        for item in self.items:
+            if not isinstance(item, ModelAction):
+                continue
+            item.Enable(enabled)
+        
+        ModelObject.Enable(self, enabled)
+        
+    def Update(self):
+        self._setBrush()
+        
+    def GetName(self):
+        """!Get name"""
+        return _("loop")
+    
+    def SetItems(self, items):
+        """!Set items (id)"""
+        self.items = items
+
+class ModelCondition(ModelItem, ogl.PolygonShape):
+    def __init__(self, parent, x, y, id = -1, width = None, height = None, text = '',
+                 items = { 'if' : [], 'else' : [] }):
+        """!Defines a if-else condition"""
+        ModelItem.__init__(self, parent, x, y, id, width, height, text, items)
+        
+        if not width:
+            self.width = UserSettings.Get(group='modeler', key='if-else', subkey=('size', 'width'))
+        else:
+            self.width = width
+        if not height:
+            self.height = UserSettings.Get(group='modeler', key='if-else', subkey=('size', 'height'))
+        else:
+            self.height = height
+        
+        if self.parent.GetCanvas():
+            ogl.PolygonShape.__init__(self)
+            
+            points = [(0, - self.height / 2),
+                      (self.width / 2, 0),
+                      (0, self.height / 2),
+                      (- self.width / 2, 0)]
+            self.Create(points)
+            
+            self.SetCanvas(self.parent)
+            self.SetX(x)
+            self.SetY(y)
+            self.SetPen(wx.BLACK_PEN)
+            if text:
+                self.AddText('(' + str(self.id) + ') ' + text)
+            else:
+                self.AddText('(' + str(self.id) + ')')
+
+    def GetName(self):
+        """!Get name"""
+        return _("if-else")
+
+    def GetWidth(self):
+        """!Get object width"""
+        return self.width
+
+    def GetHeight(self):
+        """!Get object height"""
+        return self.height
+
+    def SetItems(self, items, branch = 'if'):
+        """!Set items (id)
+
+        @param items list of items
+        @param branch 'if' / 'else'
+        """
+        if branch in ['if', 'else']:
+            self.items[branch] = items
+
+class ProcessModelFile:
+    """!Process GRASS model file (gxm)"""
+    def __init__(self, tree):
+        """!A ElementTree handler for the GXM XML file, as defined in
+        grass-gxm.dtd.
+        """
+        self.tree = tree
+        self.root = self.tree.getroot()
+        
+        # list of actions, data
+        self.properties = dict()
+        self.variables  = dict() 
+        self.actions = list()
+        self.data    = list()
+        self.loops   = list()
+        self.conditions = list()
+        
+        self._processWindow()
+        self._processProperties()
+        self._processVariables()
+        self._processItems()
+        self._processData()
+        
+    def _filterValue(self, value):
+        """!Filter value
+        
+        @param value
+        """
+        value = value.replace('<', '<')
+        value = value.replace('>', '>')
+        
+        return value
+        
+    def _getNodeText(self, node, tag, default = ''):
+        """!Get node text"""
+        p = node.find(tag)
+        if p is not None:
+            if p.text:
+                return utils.normalize_whitespace(p.text)
+            else:
+                return ''
+        
+        return default
+    
+    def _processWindow(self):
+        """!Process window properties"""
+        node = self.root.find('window')
+        if node is None:
+            self.pos = self.size = None
+            return
+        
+        self.pos, self.size = self._getDim(node)
+        
+    def _processProperties(self):
+        """!Process model properties"""
+        node = self.root.find('properties')
+        if node is None:
+            return
+        for key in ('name', 'description', 'author'):
+            self._processProperty(node, key)
+        
+        for f in node.findall('flag'):
+            name = f.get('name', '')
+            if name == 'overwrite':
+                self.properties['overwrite'] = True
+        
+    def _processProperty(self, pnode, name):
+        """!Process given property"""
+        node = pnode.find(name)
+        if node is not None:
+            self.properties[name] = node.text
+        else:
+            self.properties[name] = ''
+
+    def _processVariables(self):
+        """!Process model variables"""
+        vnode = self.root.find('variables')
+        if vnode is None:
+            return
+        for node in vnode.findall('variable'):
+            name = node.get('name', '')
+            if not name:
+                continue # should not happen
+            self.variables[name] = { 'type' : node.get('type', 'string') }
+            for key in ('description', 'value'):
+                self._processVariable(node, name, key)
+        
+    def _processVariable(self, pnode, name, key):
+        """!Process given variable"""
+        node = pnode.find(key)
+        if node is not None:
+            if node.text:
+                self.variables[name][key] = node.text
+
+    def _processItems(self):
+        """!Process model items (actions, loops, conditions)"""
+        self._processActions()
+        self._processLoops()
+        self._processConditions()
+        
+    def _processActions(self):
+        """!Process model file"""
+        for action in self.root.findall('action'):
+            pos, size = self._getDim(action)
+            disabled  = False
+            
+            task = action.find('task')
+            if task is not None:
+                if task.find('disabled') is not None:
+                    disabled = True
+                task = self._processTask(task)
+            else:
+                task = None
+            
+            aId = int(action.get('id', -1))
+            
+            self.actions.append({ 'pos'      : pos,
+                                  'size'     : size,
+                                  'task'     : task,
+                                  'id'       : aId,
+                                  'disabled' : disabled })
+            
+    def _getDim(self, node):
+        """!Get position and size of shape"""
+        pos = size = None
+        posAttr = node.get('pos', None)
+        if posAttr:
+            posVal = map(int, posAttr.split(','))
+            try:
+                pos = (posVal[0], posVal[1])
+            except:
+                pos = None
+        
+        sizeAttr = node.get('size', None)
+        if sizeAttr:
+            sizeVal = map(int, sizeAttr.split(','))
+            try:
+                size = (sizeVal[0], sizeVal[1])
+            except:
+                size = None
+        
+        return pos, size        
+    
+    def _processData(self):
+        """!Process model file"""
+        for data in self.root.findall('data'):
+            pos, size = self._getDim(data)
+            param = data.find('data-parameter')
+            prompt = value = None
+            if param is not None:
+                prompt = param.get('prompt', None)
+                value = self._filterValue(self._getNodeText(param, 'value'))
+            
+            if data.find('intermediate') is None:
+                intermediate = False
+            else:
+                intermediate = True
+            
+            rels = list()
+            for rel in data.findall('relation'):
+                defrel = { 'id'  : int(rel.get('id', -1)),
+                           'dir' : rel.get('dir', 'to'),
+                           'name' : rel.get('name', '') }
+                points = list()
+                for point in rel.findall('point'):
+                    x = self._filterValue(self._getNodeText(point, 'x'))
+                    y = self._filterValue(self._getNodeText(point, 'y'))
+                    points.append((float(x), float(y)))
+                defrel['points'] = points
+                rels.append(defrel)
+            
+            self.data.append({ 'pos' : pos,
+                               'size': size,
+                               'prompt' : prompt,
+                               'value' : value,
+                               'intermediate' : intermediate,
+                               'rels' : rels })
+        
+    def _processTask(self, node):
+        """!Process task
+
+        @return grassTask instance
+        @return None on error
+        """
+        cmd = list()
+        parameterized = list()
+        
+        name = node.get('name', None)
+        if not name:
+            return None
+        
+        cmd.append(name)
+        
+        # flags
+        for f in node.findall('flag'):
+            flag = f.get('name', '')
+            if f.get('parameterized', '0') == '1':
+                parameterized.append(('flag', flag))
+                if f.get('value', '1') == '0':
+                    continue
+            if len(flag) > 1:
+                cmd.append('--' + flag)
+            else:
+                cmd.append('-' + flag)
+        # parameters
+        for p in node.findall('parameter'):
+            name = p.get('name', '')
+            if p.find('parameterized') is not None:
+                parameterized.append(('param', name))
+            cmd.append('%s=%s' % (name,
+                                  self._filterValue(self._getNodeText(p, 'value'))))
+        
+        task, err = GUI(show = None, checkError = True).ParseCommand(cmd = cmd)
+        if err:
+            GWarning(os.linesep.join(err))
+        
+        for opt, name in parameterized:
+            if opt == 'flag':
+                task.set_flag(name, True, element = 'parameterized')
+            else:
+                task.set_param(name, True, element = 'parameterized')
+        
+        return task
+
+    def _processLoops(self):
+        """!Process model loops"""
+        for node in self.root.findall('loop'):
+            pos, size = self._getDim(node)
+            text = self._filterValue(self._getNodeText(node, 'condition')).strip()
+            aid = list()
+            for anode in node.findall('item'):
+                try:
+                    aid.append(int(anode.text))
+                except ValueError:
+                    pass
+            
+            self.loops.append({ 'pos'     : pos,
+                                'size'    : size,
+                                'text'    : text,
+                                'id'      : int(node.get('id', -1)),
+                                'items'   : aid })
+        
+    def _processConditions(self):
+        """!Process model conditions"""
+        for node in self.root.findall('if-else'):
+            pos, size = self._getDim(node)
+            text = self._filterValue(self._getNodeText(node, 'condition')).strip()
+            aid = { 'if'   : list(),
+                    'else' : list() }
+            for b in aid.keys():
+                bnode = node.find(b)
+                if bnode is None:
+                    continue
+                for anode in bnode.findall('item'):
+                    try:
+                        aid[b].append(int(anode.text))
+                    except ValueError:
+                        pass
+            
+            self.conditions.append({ 'pos'     : pos,
+                                     'size'    : size,
+                                     'text'    : text,
+                                     'id'      : int(node.get('id', -1)),
+                                     'items'   : aid })
+        
+class WriteModelFile:
+    """!Generic class for writing model file"""
+    def __init__(self, fd, model):
+        self.fd         = fd
+        self.model      = model
+        self.properties = model.GetProperties()
+        self.variables  = model.GetVariables()
+        self.items      = model.GetItems()
+        
+        self.indent = 0
+        
+        self._header()
+        
+        self._window()
+        self._properties()
+        self._variables()
+        self._items()
+        
+        dataList = list()
+        for action in model.GetItems(objType = ModelAction):
+            for rel in action.GetRelations():
+                dataItem = rel.GetData()
+                if dataItem not in dataList:
+                    dataList.append(dataItem)
+        self._data(dataList)
+        
+        self._footer()
+
+    def _filterValue(self, value):
+        """!Make value XML-valid"""
+        value = value.replace('<', '<')
+        value = value.replace('>', '>')
+        
+        return value
+        
+    def _header(self):
+        """!Write header"""
+        self.fd.write('<?xml version="1.0" encoding="%s"?>\n' % GetDefaultEncoding(forceUTF8 = True))
+        self.fd.write('<!DOCTYPE gxm SYSTEM "grass-gxm.dtd">\n')
+        self.fd.write('%s<gxm>\n' % (' ' * self.indent))
+        self.indent += 4
+                
+    def _footer(self):
+        """!Write footer"""
+        self.indent -= 4
+        self.fd.write('%s</gxm>\n' % (' ' * self.indent))
+
+    def _window(self):
+        """!Write window properties"""
+        canvas = self.model.GetCanvas()
+        if canvas is None:
+            return
+        win  = canvas.parent
+        pos  = win.GetPosition()
+        size = win.GetSize()
+        self.fd.write('%s<window pos="%d,%d" size="%d,%d" />\n' % \
+                          (' ' * self.indent, pos[0], pos[1], size[0], size[1]))
+        
+    def _properties(self):
+        """!Write model properties"""
+        self.fd.write('%s<properties>\n' % (' ' * self.indent))
+        self.indent += 4
+        if self.properties['name']:
+            self.fd.write('%s<name>%s</name>\n' % (' ' * self.indent, EncodeString(self.properties['name'])))
+        if self.properties['description']:
+            self.fd.write('%s<description>%s</description>\n' % (' ' * self.indent,
+                                                                 utils.EncodeString(self.properties['description'])))
+        if self.properties['author']:
+            self.fd.write('%s<author>%s</author>\n' % (' ' * self.indent,
+                                                       utils.EncodeString(self.properties['author'])))
+        
+        if 'overwrite' in self.properties and \
+                self.properties['overwrite']:
+            self.fd.write('%s<flag name="overwrite" />\n' % (' ' * self.indent))
+        self.indent -= 4
+        self.fd.write('%s</properties>\n' % (' ' * self.indent))
+
+    def _variables(self):
+        """!Write model variables"""
+        if not self.variables:
+            return
+        self.fd.write('%s<variables>\n' % (' ' * self.indent))
+        self.indent += 4
+        for name, values in self.variables.iteritems():
+            self.fd.write('%s<variable name="%s" type="%s">\n' % \
+                              (' ' * self.indent, EncodeString(name), values['type']))
+            self.indent += 4
+            if 'value' in values:
+                self.fd.write('%s<value>%s</value>\n' % \
+                                  (' ' * self.indent, EncodeString(values['value'])))
+            if 'description' in values:
+                self.fd.write('%s<description>%s</description>\n' % \
+                                  (' ' * self.indent, EncodeString(values['description'])))
+            self.indent -= 4
+            self.fd.write('%s</variable>\n' % (' ' * self.indent))
+        self.indent -= 4
+        self.fd.write('%s</variables>\n' % (' ' * self.indent))
+        
+    def _items(self):
+        """!Write actions/loops/conditions"""
+        for item in self.items:
+            if isinstance(item, ModelAction):
+                self._action(item)
+            elif isinstance(item, ModelLoop):
+                self._loop(item)
+            elif isinstance(item, ModelCondition):
+                self._condition(item)
+        
+    def _action(self, action):
+        """!Write actions"""
+        self.fd.write('%s<action id="%d" name="%s" pos="%d,%d" size="%d,%d">\n' % \
+                          (' ' * self.indent, action.GetId(), action.GetName(), action.GetX(), action.GetY(),
+                           action.GetWidth(), action.GetHeight()))
+        self.indent += 4
+        self.fd.write('%s<task name="%s">\n' % (' ' * self.indent, action.GetLog(string = False)[0]))
+        self.indent += 4
+        if not action.IsEnabled():
+            self.fd.write('%s<disabled />\n' % (' ' * self.indent))
+        for key, val in action.GetParams().iteritems():
+            if key == 'flags':
+                for f in val:
+                    if f.get('value', False) or f.get('parameterized', False):
+                        if f.get('parameterized', False):
+                            if f.get('value', False) == False:
+                                self.fd.write('%s<flag name="%s" value="0" parameterized="1" />\n' %
+                                              (' ' * self.indent, f.get('name', '')))
+                            else:
+                                self.fd.write('%s<flag name="%s" parameterized="1" />\n' %
+                                              (' ' * self.indent, f.get('name', '')))
+                        else:
+                            self.fd.write('%s<flag name="%s" />\n' %
+                                          (' ' * self.indent, f.get('name', '')))
+            else: # parameter
+                for p in val:
+                    if not p.get('value', '') and not p.get('parameterized', False):
+                        continue
+                    self.fd.write('%s<parameter name="%s">\n' %
+                                  (' ' * self.indent, p.get('name', '')))
+                    self.indent += 4
+                    if p.get('parameterized', False):
+                        self.fd.write('%s<parameterized />\n' % (' ' * self.indent))
+                    self.fd.write('%s<value>%s</value>\n' %
+                                  (' ' * self.indent, self._filterValue(p.get('value', ''))))
+                    self.indent -= 4
+                    self.fd.write('%s</parameter>\n' % (' ' * self.indent))
+        self.indent -= 4
+        self.fd.write('%s</task>\n' % (' ' * self.indent))
+        self.indent -= 4
+        self.fd.write('%s</action>\n' % (' ' * self.indent))
+                
+    def _data(self, dataList):
+        """!Write data"""
+        for data in dataList:
+            self.fd.write('%s<data pos="%d,%d" size="%d,%d">\n' % \
+                              (' ' * self.indent, data.GetX(), data.GetY(),
+                               data.GetWidth(), data.GetHeight()))
+            self.indent += 4
+            self.fd.write('%s<data-parameter prompt="%s">\n' % \
+                              (' ' * self.indent, data.GetPrompt()))
+            self.indent += 4
+            self.fd.write('%s<value>%s</value>\n' %
+                          (' ' * self.indent, self._filterValue(data.GetValue())))
+            self.indent -= 4
+            self.fd.write('%s</data-parameter>\n' % (' ' * self.indent))
+            
+            if data.IsIntermediate():
+                self.fd.write('%s<intermediate />\n' % (' ' * self.indent))
+
+            # relations
+            for ft in ('from', 'to'):
+                for rel in data.GetRelations(ft):
+                    if ft == 'from':
+                        aid = rel.GetTo().GetId()
+                    else:
+                        aid  = rel.GetFrom().GetId()
+                    self.fd.write('%s<relation dir="%s" id="%d" name="%s">\n' % \
+                                      (' ' * self.indent, ft, aid, rel.GetName()))
+                    self.indent += 4
+                    for point in rel.GetLineControlPoints()[1:-1]:
+                        self.fd.write('%s<point>\n' % (' ' * self.indent))
+                        self.indent += 4
+                        x, y = point.Get()
+                        self.fd.write('%s<x>%d</x>\n' % (' ' * self.indent, int(x)))
+                        self.fd.write('%s<y>%d</y>\n' % (' ' * self.indent, int(y)))
+                        self.indent -= 4
+                        self.fd.write('%s</point>\n' % (' ' * self.indent))
+                    self.indent -= 4
+                    self.fd.write('%s</relation>\n' % (' ' * self.indent))
+                
+            self.indent -= 4
+            self.fd.write('%s</data>\n' % (' ' * self.indent))
+
+    def _loop(self, loop):
+        """!Write loops"""
+        self.fd.write('%s<loop id="%d" pos="%d,%d" size="%d,%d">\n' % \
+                          (' ' * self.indent, loop.GetId(), loop.GetX(), loop.GetY(),
+                           loop.GetWidth(), loop.GetHeight()))
+        text = loop.GetText()
+        self.indent += 4
+        if text:
+            self.fd.write('%s<condition>%s</condition>\n' %
+                          (' ' * self.indent, self._filterValue(text)))
+        for item in loop.GetItems():
+            self.fd.write('%s<item>%d</item>\n' %
+                          (' ' * self.indent, item.GetId()))
+        self.indent -= 4
+        self.fd.write('%s</loop>\n' % (' ' * self.indent))
+
+    def _condition(self, condition):
+        """!Write conditions"""
+        bbox = condition.GetBoundingBoxMin()
+        self.fd.write('%s<if-else id="%d" pos="%d,%d" size="%d,%d">\n' % \
+                          (' ' * self.indent, condition.GetId(), condition.GetX(), condition.GetY(),
+                           bbox[0], bbox[1]))
+        text = condition.GetText()
+        self.indent += 4
+        if text:
+            self.fd.write('%s<condition>%s</condition>\n' %
+                          (' ' * self.indent, self._filterValue(text)))
+        items = condition.GetItems()
+        for b in items.keys():
+            if len(items[b]) < 1:
+                continue
+            self.fd.write('%s<%s>\n' % (' ' * self.indent, b))
+            self.indent += 4
+            for item in items[b]:
+                self.fd.write('%s<item>%d</item>\n' %
+                              (' ' * self.indent, item.GetId()))
+            self.indent -= 4
+            self.fd.write('%s</%s>\n' % (' ' * self.indent, b))
+        
+        self.indent -= 4
+        self.fd.write('%s</if-else>\n' % (' ' * self.indent))
+
+class WritePythonFile:
+    def __init__(self, fd, model):
+        """!Class for exporting model to Python script
+
+        @param fd file desciptor
+        """
+        self.fd     = fd
+        self.model  = model
+        self.indent = 4
+
+        self._writePython()
+        
+    def _writePython(self):
+        """!Write model to file"""
+        properties = self.model.GetProperties()
+        
+        self.fd.write(
+r"""#!/usr/bin/env python
+#
+#%s
+#
+# MODULE:       %s
+#
+# AUTHOR(S):    %s
+#               
+# PURPOSE:      %s
+#
+# DATE:         %s
+#
+#%s
+""" % ('#' * 79,
+       EncodeString(properties['name']),
+       EncodeString(properties['author']),
+       EncodeString('\n# '.join(properties['description'].splitlines())),
+       time.asctime(),
+       '#' * 79))
+        
+        self.fd.write(
+r"""
+import sys
+import os
+import atexit
+
+import grass.script as grass
+""")
+        
+        # cleanup()
+        rast, vect, rast3d, msg = self.model.GetIntermediateData()
+        self.fd.write(
+r"""
+def cleanup():
+""")
+        if rast:
+            self.fd.write(
+r"""    grass.run_command('g.remove',
+                      rast=%s)
+""" % ','.join(map(lambda x: "'" + x + "'", rast)))
+        if vect:
+            self.fd.write(
+r"""    grass.run_command('g.remove',
+                      vect = %s)
+""" % ','.join(map(lambda x: "'" + x + "'", vect)))
+        if rast3d:
+            self.fd.write(
+r"""    grass.run_command('g.remove',
+                      rast3d = %s)
+""" % ','.join(map(lambda x: "'" + x + "'", rast3d)))
+        if not rast and not vect and not rast3d:
+            self.fd.write('    pass\n')
+        
+        self.fd.write("\ndef main():\n")
+        for item in self.model.GetItems():
+            self._writePythonItem(item)
+        
+        self.fd.write("\n    return 0\n")
+        
+        self.fd.write(
+r"""
+if __name__ == "__main__":
+    options, flags = grass.parser()
+    atexit.register(cleanup)
+    sys.exit(main())
+""")
+        
+    def _writePythonItem(self, item, ignoreBlock = True, variables = []):
+        """!Write model object to Python file"""
+        if isinstance(item, ModelAction):
+            if ignoreBlock and item.GetBlockId(): # ignore items in loops of conditions
+                return
+            self._writePythonAction(item, variables = variables)
+        elif isinstance(item, ModelLoop) or isinstance(item, ModelCondition):
+            # substitute condition
+            variables = self.model.GetVariables()
+            cond = item.GetText()
+            for variable in variables:
+                pattern = re.compile('%' + variable)
+                if pattern.search(cond):
+                    value = variables[variable].get('value', '')
+                    if variables[variable].get('type', 'string') == 'string':
+                        value = '"' + value + '"'
+                    cond = pattern.sub(value, cond)
+            if isinstance(item, ModelLoop):
+                condVar, condText = map(lambda x: x.strip(), re.split('\s*in\s*', cond))
+                cond = "%sfor %s in " % (' ' * self.indent, condVar)
+                if condText[0] == '`' and condText[-1] == '`':
+                    task = GUI(show = None).ParseCommand(cmd = utils.split(condText[1:-1]))
+                    cond += "grass.read_command("
+                    cond += self._getPythonActionCmd(task, len(cond), variables = [condVar]) + ".splitlines()"
+                else:
+                    cond += condText
+                self.fd.write('%s:\n' % cond)
+                self.indent += 4
+                for action in item.GetItems():
+                    self._writePythonItem(action, ignoreBlock = False, variables = [condVar])
+                self.indent -= 4
+            else: # ModelCondition
+                self.fd.write('%sif %s:\n' % (' ' * self.indent, cond))
+                self.indent += 4
+                condItems = item.GetItems()
+                for action in condItems['if']:
+                    self._writePythonItem(action, ignoreBlock = False)
+                if condItems['else']:
+                    self.indent -= 4
+                    self.fd.write('%selse:\n' % (' ' * self.indent))
+                    self.indent += 4
+                    for action in condItems['else']:
+                        self._writePythonItem(action, ignoreBlock = False)
+                self.indent += 4
+        
+    def _writePythonAction(self, item, variables = []):
+        """!Write model action to Python file"""
+        task = GUI(show = None).ParseCommand(cmd = item.GetLog(string = False, substitute = self.model.GetVariables()))
+        strcmd = "%sgrass.run_command(" % (' ' * self.indent)
+        self.fd.write(strcmd + self._getPythonActionCmd(task, len(strcmd), variables) + '\n')
+        
+    def _getPythonActionCmd(self, task, cmdIndent, variables = []):
+        opts = task.get_options()
+        
+        ret = ''
+        flags = ''
+        params = list()
+        
+        for f in opts['flags']:
+            if f.get('value', False):
+                name = f.get('name', '')
+                if len(name) > 1:
+                    params.append('%s = True' % name)
+                else:
+                    flags += name
+        
+        for p in opts['params']:
+            name = p.get('name', None)
+            value = p.get('value', None)
+            if name and value:
+                ptype = p.get('type', 'string')
+                if value[0] == '%':
+                    params.append("%s = %s" % (name, value[1:]))
+                elif ptype == 'string':
+                    params.append('%s = "%s"' % (name, value))
+                else:
+                    params.append("%s = %s" % (name, value))
+        
+        ret += '"%s"' % task.get_name()
+        if flags:
+            ret += ",\n%sflags = '%s'" % (' ' * cmdIndent, flags)
+        if len(params) > 0:
+            ret += ",\n"
+            for opt in params[:-1]:
+                ret += "%s%s,\n" % (' ' * cmdIndent, opt)
+            ret += "%s%s)" % (' ' * cmdIndent, params[-1])
+        else:
+            ret += ")"
+        
+        return ret
+
+class ModelParamDialog(wx.Dialog):
+    def __init__(self, parent, params, id = wx.ID_ANY, title = _("Model parameters"),
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
+        """!Model parameters dialog
+        """
+        self.parent = parent
+        self.params = params
+        self.tasks  = list() # list of tasks/pages
+        
+        wx.Dialog.__init__(self, parent = parent, id = id, title = title, style = style, **kwargs)
+        
+        self.notebook = GNotebook(parent = self, 
+                                  style = globalvar.FNPageDStyle)
+        
+        panel = self._createPages()
+        wx.CallAfter(self.notebook.SetSelection, 0)
+
+        # intermediate data?
+        self.interData = wx.CheckBox(parent = self, label = _("Delete intermediate data when finish"))
+        self.interData.SetValue(True)
+        rast, vect, rast3d, msg = self.parent.GetModel().GetIntermediateData()
+        if not rast and not vect and not rast3d:
+            self.interData.Hide()
+        
+        self.btnCancel = wx.Button(parent = self, id = wx.ID_CANCEL)
+        self.btnRun    = wx.Button(parent = self, id = wx.ID_OK,
+                                   label = _("&Run"))
+        self.btnRun.SetDefault()
+        
+        self._layout()
+        
+        size = self.GetBestSize()
+        self.SetMinSize(size)
+        self.SetSize((size.width, size.height +
+                      panel.constrained_size[1] -
+                      panel.panelMinHeight))
+                
+    def _layout(self):
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(self.btnCancel)
+        btnSizer.AddButton(self.btnRun)
+        btnSizer.Realize()
+        
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        mainSizer.Add(item = self.notebook, proportion = 1,
+                      flag = wx.EXPAND)
+        if self.interData.IsShown():
+            mainSizer.Add(item = self.interData, proportion = 0,
+                          flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+
+            mainSizer.Add(item = wx.StaticLine(parent = self, id = wx.ID_ANY,
+                                               style = wx.LI_HORIZONTAL),
+                          proportion = 0,
+                          flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 5) 
+        
+        mainSizer.Add(item = btnSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+        
+        self.SetSizer(mainSizer)
+        mainSizer.Fit(self)
+        
+    def _createPages(self):
+        """!Create for each parameterized module its own page"""
+        nameOrdered = [''] * len(self.params.keys())
+        for name, params in self.params.iteritems():
+            nameOrdered[params['idx']] = name
+        for name in nameOrdered:
+            params = self.params[name]
+            panel = self._createPage(name, params)
+            if name == 'variables':
+                name = _('Variables')
+            self.notebook.AddPage(page = panel, text = name)
+        
+        return panel
+    
+    def _createPage(self, name, params):
+        """!Define notebook page"""
+        if name in globalvar.grassCmd:
+            task = gtask.grassTask(name)
+        else:
+            task = gtask.grassTask()
+        task.flags  = params['flags']
+        task.params = params['params']
+        
+        panel = CmdPanel(parent = self, id = wx.ID_ANY, task = task)
+        self.tasks.append(task)
+        
+        return panel
+
+    def GetErrors(self):
+        """!Check for errors, get list of messages"""
+        errList = list()
+        for task in self.tasks:
+            errList += task.get_cmd_error()
+        
+        return errList
+
+    def DeleteIntermediateData(self):
+        """!Check if to detele intermediate data"""
+        if self.interData.IsShown() and self.interData.IsChecked():
+            return True
+        
+        return False
diff --git a/gui/wxpython/gmodeler/preferences.py b/gui/wxpython/gmodeler/preferences.py
new file mode 100644
index 0000000..07728bb
--- /dev/null
+++ b/gui/wxpython/gmodeler/preferences.py
@@ -0,0 +1,528 @@
+"""!
+ at package gmodeler.preferences
+
+ at brief wxGUI Graphical Modeler - preferences
+
+Classes:
+ - preferences::PreferencesDialog
+ - preferences::PropertiesDialog
+
+(C) 2010-2012 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import wx
+import wx.lib.colourselect    as csel
+
+from core                 import globalvar
+from gui_core.preferences import PreferencesBaseDialog
+from core.settings        import UserSettings
+
+class PreferencesDialog(PreferencesBaseDialog):
+    """!User preferences dialog"""
+    def __init__(self, parent, settings = UserSettings,
+                 title = _("Modeler settings")):
+        
+        PreferencesBaseDialog.__init__(self, parent = parent, title = title,
+                                       settings = settings)
+        
+        # create notebook pages
+        self._createGeneralPage(self.notebook)
+        self._createActionPage(self.notebook)
+        self._createDataPage(self.notebook)
+        self._createLoopPage(self.notebook)
+        
+        self.SetMinSize(self.GetBestSize())
+        self.SetSize(self.size)
+
+    def _createGeneralPage(self, notebook):
+        """!Create notebook page for action settings"""
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        notebook.AddPage(page = panel, text = _("General"))
+        
+        # colors
+        border = wx.BoxSizer(wx.VERTICAL)
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                              label = " %s " % _("Item properties"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
+        gridSizer.AddGrowableCol(0)
+        
+        row = 0
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                           label = _("Disabled:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        rColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                   colour = self.settings.Get(group='modeler', key='disabled', subkey='color'),
+                                   size = globalvar.DIALOG_COLOR_SIZE)
+        rColor.SetName('GetColour')
+        self.winId['modeler:disabled:color'] = rColor.GetId()
+        
+        gridSizer.Add(item = rColor,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+        
+        sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
+
+        panel.SetSizer(border)
+        
+        return panel
+
+    def _createActionPage(self, notebook):
+        """!Create notebook page for action settings"""
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        notebook.AddPage(page = panel, text = _("Action"))
+        
+        # colors
+        border = wx.BoxSizer(wx.VERTICAL)
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                              label = " %s " % _("Color"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
+        gridSizer.AddGrowableCol(0)
+        
+        row = 0
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Valid:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        vColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                   colour = self.settings.Get(group='modeler', key='action', subkey=('color', 'valid')),
+                                   size = globalvar.DIALOG_COLOR_SIZE)
+        vColor.SetName('GetColour')
+        self.winId['modeler:action:color:valid'] = vColor.GetId()
+        
+        gridSizer.Add(item = vColor,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+
+        row += 1
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Invalid:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        iColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                   colour = self.settings.Get(group='modeler', key='action', subkey=('color', 'invalid')),
+                                   size = globalvar.DIALOG_COLOR_SIZE)
+        iColor.SetName('GetColour')
+        self.winId['modeler:action:color:invalid'] = iColor.GetId()
+        
+        gridSizer.Add(item = iColor,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+
+        row += 1
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Running:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        rColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                   colour = self.settings.Get(group='modeler', key='action', subkey=('color', 'running')),
+                                   size = globalvar.DIALOG_COLOR_SIZE)
+        rColor.SetName('GetColour')
+        self.winId['modeler:action:color:running'] = rColor.GetId()
+        
+        gridSizer.Add(item = rColor,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+        
+        sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
+        
+        # size
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                              label = " %s " % _("Shape size"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer (hgap=3, vgap=3)
+        gridSizer.AddGrowableCol(0)
+
+        row = 0
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Width:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        
+        width = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
+                            min = 0, max = 500,
+                            initial = self.settings.Get(group='modeler', key='action', subkey=('size', 'width')))
+        width.SetName('GetValue')
+        self.winId['modeler:action:size:width'] = width.GetId()
+        
+        gridSizer.Add(item = width,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+
+        row += 1
+        gridSizer.Add(item = wx.StaticText(parent=panel, id=wx.ID_ANY,
+                                         label=_("Height:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos=(row, 0))
+        
+        height = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
+                             min = 0, max = 500,
+                             initial = self.settings.Get(group='modeler', key='action', subkey=('size', 'height')))
+        height.SetName('GetValue')
+        self.winId['modeler:action:size:height'] = height.GetId()
+        
+        gridSizer.Add(item = height,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+        
+        sizer.Add(item=gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5)
+        border.Add(item=sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3)
+                
+        panel.SetSizer(border)
+        
+        return panel
+
+    def _createDataPage(self, notebook):
+        """!Create notebook page for data settings"""
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        notebook.AddPage(page = panel, text = _("Data"))
+        
+        # colors
+        border = wx.BoxSizer(wx.VERTICAL)
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                              label = " %s " % _("Type"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
+        gridSizer.AddGrowableCol(0)
+        
+        row = 0
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Raster:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        rColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                   colour = self.settings.Get(group='modeler', key='data', subkey=('color', 'raster')),
+                                   size = globalvar.DIALOG_COLOR_SIZE)
+        rColor.SetName('GetColour')
+        self.winId['modeler:data:color:raster'] = rColor.GetId()
+        
+        gridSizer.Add(item = rColor,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+
+        row += 1
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("3D raster:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        r3Color = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                    colour = self.settings.Get(group='modeler', key='data', subkey=('color', 'raster3d')),
+                                    size = globalvar.DIALOG_COLOR_SIZE)
+        r3Color.SetName('GetColour')
+        self.winId['modeler:data:color:raster3d'] = r3Color.GetId()
+        
+        gridSizer.Add(item = r3Color,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+        
+        row += 1
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Vector:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        vColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                   colour = self.settings.Get(group='modeler', key='data', subkey=('color', 'vector')),
+                                   size = globalvar.DIALOG_COLOR_SIZE)
+        vColor.SetName('GetColour')
+        self.winId['modeler:data:color:vector'] = vColor.GetId()
+        
+        gridSizer.Add(item = vColor,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+        
+        sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
+
+        # size
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                              label = " %s " % _("Shape size"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer (hgap=3, vgap=3)
+        gridSizer.AddGrowableCol(0)
+        
+        row = 0
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Width:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        
+        width = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
+                            min = 0, max = 500,
+                            initial = self.settings.Get(group='modeler', key='data', subkey=('size', 'width')))
+        width.SetName('GetValue')
+        self.winId['modeler:data:size:width'] = width.GetId()
+        
+        gridSizer.Add(item = width,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+
+        row += 1
+        gridSizer.Add(item = wx.StaticText(parent=panel, id=wx.ID_ANY,
+                                         label=_("Height:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos=(row, 0))
+        
+        height = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
+                             min = 0, max = 500,
+                             initial = self.settings.Get(group='modeler', key='data', subkey=('size', 'height')))
+        height.SetName('GetValue')
+        self.winId['modeler:data:size:height'] = height.GetId()
+        
+        gridSizer.Add(item = height,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+        
+        sizer.Add(item=gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5)
+        border.Add(item=sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3)
+        
+        panel.SetSizer(border)
+        
+        return panel
+
+    def _createLoopPage(self, notebook):
+        """!Create notebook page for loop settings"""
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        notebook.AddPage(page = panel, text = _("Loop"))
+        
+        # colors
+        border = wx.BoxSizer(wx.VERTICAL)
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                              label = " %s " % _("Color"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
+        gridSizer.AddGrowableCol(0)
+        
+        row = 0
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Valid:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        vColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                   colour = self.settings.Get(group='modeler', key='loop', subkey=('color', 'valid')),
+                                   size = globalvar.DIALOG_COLOR_SIZE)
+        vColor.SetName('GetColour')
+        self.winId['modeler:loop:color:valid'] = vColor.GetId()
+        
+        gridSizer.Add(item = vColor,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+        
+        sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
+        
+        # size
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                              label = " %s " % _("Shape size"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer (hgap=3, vgap=3)
+        gridSizer.AddGrowableCol(0)
+
+        row = 0
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Width:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        
+        width = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
+                            min = 0, max = 500,
+                            initial = self.settings.Get(group='modeler', key='loop', subkey=('size', 'width')))
+        width.SetName('GetValue')
+        self.winId['modeler:loop:size:width'] = width.GetId()
+        
+        gridSizer.Add(item = width,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+
+        row += 1
+        gridSizer.Add(item = wx.StaticText(parent=panel, id=wx.ID_ANY,
+                                         label=_("Height:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos=(row, 0))
+        
+        height = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
+                             min = 0, max = 500,
+                             initial = self.settings.Get(group='modeler', key='loop', subkey=('size', 'height')))
+        height.SetName('GetValue')
+        self.winId['modeler:loop:size:height'] = height.GetId()
+        
+        gridSizer.Add(item = height,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+        
+        sizer.Add(item=gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5)
+        border.Add(item=sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3)
+                
+        panel.SetSizer(border)
+        
+        return panel
+
+    def OnApply(self, event):
+        """!Button 'Apply' pressed"""
+        PreferencesBaseDialog.OnApply(self, event)
+        
+        self.parent.GetModel().Update()
+        self.parent.GetCanvas().Refresh()
+
+    def OnSave(self, event):
+        """!Button 'Save' pressed"""
+        PreferencesBaseDialog.OnSave(self, event)
+        
+        self.parent.GetModel().Update()
+        self.parent.GetCanvas().Refresh()
+
+class PropertiesDialog(wx.Dialog):
+    """!Model properties dialog
+    """
+    def __init__(self, parent, id = wx.ID_ANY,
+                 title = _('Model properties'),
+                 size = (350, 400),
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER):
+        wx.Dialog.__init__(self, parent, id, title, size = size,
+                           style = style)
+        
+        self.metaBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                                    label=" %s " % _("Metadata"))
+        self.cmdBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                                   label=" %s " % _("Commands"))
+        
+        self.name = wx.TextCtrl(parent = self, id = wx.ID_ANY,
+                                size = (300, 25))
+        self.desc = wx.TextCtrl(parent = self, id = wx.ID_ANY,
+                                style = wx.TE_MULTILINE,
+                                size = (300, 50))
+        self.author = wx.TextCtrl(parent = self, id = wx.ID_ANY,
+                                size = (300, 25))
+        
+        # commands
+        self.overwrite = wx.CheckBox(parent = self, id=wx.ID_ANY,
+                                     label=_("Allow output files to overwrite existing files"))
+        self.overwrite.SetValue(UserSettings.Get(group='cmd', key='overwrite', subkey='enabled'))
+        
+        # buttons
+        self.btnOk     = wx.Button(self, wx.ID_OK)
+        self.btnCancel = wx.Button(self, wx.ID_CANCEL)
+        self.btnOk.SetDefault()
+        
+        self.btnOk.SetToolTipString(_("Apply properties"))
+        self.btnOk.SetDefault()
+        self.btnCancel.SetToolTipString(_("Close dialog and ignore changes"))
+        
+        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
+        
+        self._layout()
+
+    def _layout(self):
+        metaSizer = wx.StaticBoxSizer(self.metaBox, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(hgap = 3, vgap = 3)
+        gridSizer.AddGrowableCol(1)
+        gridSizer.AddGrowableRow(1)
+        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                         label = _("Name:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (0, 0))
+        gridSizer.Add(item = self.name,
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
+                      pos = (0, 1))
+        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                         label = _("Description:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (1, 0))
+        gridSizer.Add(item = self.desc,
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
+                      pos = (1, 1))
+        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                         label = _("Author(s):")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (2, 0))
+        gridSizer.Add(item = self.author,
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
+                      pos = (2, 1))
+        metaSizer.Add(item = gridSizer, proportion = 1, flag = wx.EXPAND)
+        
+        cmdSizer = wx.StaticBoxSizer(self.cmdBox, wx.VERTICAL)
+        cmdSizer.Add(item = self.overwrite,
+                     flag = wx.EXPAND | wx.ALL, border = 3)
+        
+        btnStdSizer = wx.StdDialogButtonSizer()
+        btnStdSizer.AddButton(self.btnCancel)
+        btnStdSizer.AddButton(self.btnOk)
+        btnStdSizer.Realize()
+        
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        mainSizer.Add(item=metaSizer, proportion=1,
+                      flag=wx.EXPAND | wx.ALL, border=5)
+        mainSizer.Add(item=cmdSizer, proportion=0,
+                      flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5)
+        mainSizer.Add(item=btnStdSizer, proportion=0,
+                      flag=wx.EXPAND | wx.ALL | wx.ALIGN_RIGHT, border=5)
+        
+        self.SetSizer(mainSizer)
+        mainSizer.Fit(self)
+
+    def OnCloseWindow(self, event):
+        self.Hide()
+        
+    def GetValues(self):
+        """!Get values"""
+        return { 'name'        : self.name.GetValue(),
+                 'description' : self.desc.GetValue(),
+                 'author'      : self.author.GetValue(),
+                 'overwrite'   : self.overwrite.IsChecked() }
+    
+    def Init(self, prop):
+        """!Initialize dialog"""
+        self.name.SetValue(prop['name'])
+        self.desc.SetValue(prop['description'])
+        self.author.SetValue(prop['author'])
+        if 'overwrite' in prop:
+            self.overwrite.SetValue(prop['overwrite'])
diff --git a/gui/wxpython/gmodeler/toolbars.py b/gui/wxpython/gmodeler/toolbars.py
new file mode 100644
index 0000000..6290df7
--- /dev/null
+++ b/gui/wxpython/gmodeler/toolbars.py
@@ -0,0 +1,109 @@
+"""!
+ at package gmodeler.toolbars
+
+ at brief wxGUI Graphical Modeler toolbars classes
+
+Classes:
+ - toolbars::ModelerToolbar
+
+(C) 2010-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import os
+import sys
+
+import wx
+
+from core              import globalvar
+from gui_core.toolbars import BaseToolbar, BaseIcons
+
+from icons.icon        import MetaIcon
+
+class ModelerToolbar(BaseToolbar):
+    """!Graphical modeler toolbaro (see gmodeler.py)
+    """
+    def __init__(self, parent):
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # realize the toolbar
+        self.Realize()
+        
+    def _toolbarData(self):
+        """!Toolbar data"""
+        icons = {
+            'new'        : MetaIcon(img = 'create',
+                                    label = _('Create new model (Ctrl+N)')),
+            'open'       : MetaIcon(img = 'open',
+                                    label = _('Load model from file (Ctrl+O)')),
+            'save'       : MetaIcon(img = 'save',
+                                    label = _('Save current model to file (Ctrl+S)')),
+            'toImage'    : MetaIcon(img = 'image-export',
+                                    label = _('Export model to image')),
+            'toPython'   : MetaIcon(img = 'python-export',
+                                    label = _('Export model to Python script')),
+            'actionAdd'  : MetaIcon(img = 'module-add',
+                                    label = _('Add command (GRASS module) to model')),
+            'dataAdd'    : MetaIcon(img = 'data-add',
+                                    label = _('Add data to model')),
+            'relation'   : MetaIcon(img = 'relation-create',
+                                    label = _('Manually define relation between data and commands')),
+            'loop'       : MetaIcon(img = 'loop-add',
+                                    label = _('Add loop/series')),
+            'run'        : MetaIcon(img = 'execute',
+                                    label = _('Run model')),
+            'validate'   : MetaIcon(img = 'check',
+                                    label = _('Validate model')),
+            'settings'   : BaseIcons['settings'].SetLabel(_('Modeler settings')),
+            'properties' : MetaIcon(img = 'options',
+                                    label = _('Show model properties')),
+            'variables'  : MetaIcon(img = 'modeler-variables',
+                                    label = _('Manage model variables')),
+            'redraw'     : MetaIcon(img = 'redraw',
+                                    label = _('Redraw model canvas')),
+            'quit'       : BaseIcons['quit'].SetLabel(_('Quit Graphical Modeler')),
+            }
+        
+        return self._getToolbarData((('new', icons['new'],
+                                      self.parent.OnModelNew),
+                                     ('open', icons['open'],
+                                      self.parent.OnModelOpen),
+                                     ('save', icons['save'],
+                                      self.parent.OnModelSave),
+                                     ('image', icons['toImage'],
+                                      self.parent.OnExportImage),
+                                     ('python', icons['toPython'],
+                                      self.parent.OnExportPython),
+                                     (None, ),
+                                     ('action', icons['actionAdd'],
+                                      self.parent.OnAddAction),
+                                     ('data', icons['dataAdd'],
+                                      self.parent.OnAddData),
+                                     ('relation', icons['relation'],
+                                      self.parent.OnDefineRelation),
+                                     ('loop', icons['loop'],
+                                      self.parent.OnDefineLoop),
+                                     (None, ),
+                                     ('redraw', icons['redraw'],
+                                      self.parent.OnCanvasRefresh),
+                                     ('validate', icons['validate'],
+                                      self.parent.OnValidateModel),
+                                     ('run', icons['run'],
+                                      self.parent.OnRunModel),
+                                     (None, ),
+                                     ("variables", icons['variables'],
+                                      self.parent.OnVariables),
+                                     ("settings", icons['settings'],
+                                      self.parent.OnPreferences),
+                                     ("help", BaseIcons['help'],
+                                      self.parent.OnHelp),
+                                     (None, ),
+                                     ('quit', icons['quit'],
+                                      self.parent.OnCloseWindow))
+                                    )
diff --git a/gui/wxpython/gui_core/dialogs.py b/gui/wxpython/gui_core/dialogs.py
new file mode 100644
index 0000000..bec88f5
--- /dev/null
+++ b/gui/wxpython/gui_core/dialogs.py
@@ -0,0 +1,2423 @@
+"""!
+ at package gui_core.dialogs
+
+ at brief Various dialogs used in wxGUI.
+
+List of classes:
+ - dialogs::ElementDialog
+ - dialogs::LocationDialog
+ - dialogs::MapsetDialog
+ - dialogs::NewVectorDialog
+ - dialogs::SavedRegion
+ - dialogs::DecorationDialog
+ - dialogs::TextLayerDialog 
+ - dialogs::GroupDialog
+ - dialogs::MapLayersDialog
+ - dialogs::ImportDialog
+ - dialogs::GdalImportDialog
+ - dialogs::DxfImportDialog
+ - dialogs::LayersList (used by MultiImport) 
+ - dialogs::SetOpacityDialog
+ - dialogs::ImageSizeDialog
+
+(C) 2008-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+ at author Anna Kratochvilova <kratochanna gmail.com> (GroupDialog)
+"""
+
+import os
+import sys
+import re
+from bisect import bisect
+
+import wx
+import wx.lib.filebrowsebutton as filebrowse
+import wx.lib.mixins.listctrl as listmix
+from wx.lib.newevent import NewEvent
+
+from grass.script import core as grass
+from grass.script import task as gtask
+
+from core             import globalvar
+from core.gcmd        import GError, RunCommand, GMessage
+from gui_core.gselect import ElementSelect, LocationSelect, MapsetSelect, Select, GdalSelect
+from gui_core.forms   import GUI
+from gui_core.widgets import SingleSymbolPanel, EVT_SYMBOL_SELECTION_CHANGED
+from core.utils       import GetListOfMapsets, GetLayerNameFromCmd, GetValidLayerName
+from core.settings    import UserSettings
+from core.debug       import Debug
+
+wxApplyOpacity, EVT_APPLY_OPACITY = NewEvent()
+
+class ElementDialog(wx.Dialog):
+    def __init__(self, parent, title, label, id = wx.ID_ANY,
+                 etype = False, style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER,
+                 **kwargs):
+        """!General dialog to choose given element (location, mapset, vector map, etc.)
+        
+        @param parent window
+        @param title window title
+        @param label element label
+        @param etype show also ElementSelect
+        """
+        wx.Dialog.__init__(self, parent, id, title, style = style, **kwargs)
+        
+        self.etype = etype
+        self.label = label
+        
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
+        
+        self.btnCancel = wx.Button(parent = self.panel, id = wx.ID_CANCEL)
+        self.btnOK     = wx.Button(parent = self.panel, id = wx.ID_OK)
+        self.btnOK.SetDefault()
+        self.btnOK.Enable(False)
+        
+        if self.etype:
+            self.typeSelect = ElementSelect(parent = self.panel,
+                                            size = globalvar.DIALOG_GSELECT_SIZE)
+            self.typeSelect.Bind(wx.EVT_CHOICE, self.OnType)
+        
+        self.element = None # must be defined 
+        
+        self.__layout()
+        
+    def PostInit(self):
+        self.element.SetFocus()
+        self.element.Bind(wx.EVT_TEXT, self.OnElement)
+        
+    def OnType(self, event):
+        """!Select element type"""
+        if not self.etype:
+            return
+        evalue = self.typeSelect.GetValue(event.GetString())
+        self.element.SetType(evalue)
+        
+    def OnElement(self, event):
+        """!Name for vector map layer given"""
+        if len(event.GetString()) > 0:
+            self.btnOK.Enable(True)
+        else:
+            self.btnOK.Enable(False)
+        
+    def __layout(self):
+        """!Do layout"""
+        self.sizer = wx.BoxSizer(wx.VERTICAL)
+        
+        self.dataSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        if self.etype:
+            self.dataSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                                    label = _("Type of element:")),
+                               proportion = 0, flag = wx.ALL, border = 1)
+            self.dataSizer.Add(item = self.typeSelect,
+                               proportion = 0, flag = wx.ALL, border = 1)
+        
+        self.dataSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                                label = self.label),
+                           proportion = 0, flag = wx.ALL, border = 1)
+        
+        # buttons
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(self.btnCancel)
+        btnSizer.AddButton(self.btnOK)
+        btnSizer.Realize()
+        
+        self.sizer.Add(item = self.dataSizer, proportion = 1,
+                       flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+        
+        self.sizer.Add(item = btnSizer, proportion = 0,
+                       flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+        
+    def GetElement(self):
+        """!Return (mapName, overwrite)"""
+        return self.element.GetValue()
+    
+    def GetType(self):
+        """!Get element type"""
+        return self.element.tcp.GetType()
+        
+class LocationDialog(ElementDialog):
+    """!Dialog used to select location"""
+    def __init__(self, parent, title = _("Select GRASS location and mapset"), id =  wx.ID_ANY):
+        ElementDialog.__init__(self, parent, title, label = _("Name of GRASS location:"))
+
+        self.element = LocationSelect(parent = self.panel, id = wx.ID_ANY,
+                                      size = globalvar.DIALOG_GSELECT_SIZE)
+
+        self.element1 = MapsetSelect(parent = self.panel, id = wx.ID_ANY,
+                                     size = globalvar.DIALOG_GSELECT_SIZE,
+                                     setItems = False, skipCurrent = True)
+        
+        self.PostInit()
+        
+        self._layout()
+        self.SetMinSize(self.GetSize())
+
+    def _layout(self):
+        """!Do layout"""
+        self.dataSizer.Add(self.element, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL, border = 1)
+ 
+        self.dataSizer.Add(wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                         label = _("Name of mapset:")), proportion = 0,
+                           flag = wx.EXPAND | wx.ALL, border = 1)
+
+        self.dataSizer.Add(self.element1, proportion = 0,
+                           flag = wx.EXPAND | wx.ALL, border = 1)
+       
+        self.panel.SetSizer(self.sizer)
+        self.sizer.Fit(self)
+
+    def OnElement(self, event):
+        """!Select mapset given location name"""
+        location = event.GetString()
+        
+        if location:
+            dbase = grass.gisenv()['GISDBASE']
+            self.element1.UpdateItems(dbase = dbase, location = location)
+            self.element1.SetSelection(0)
+            mapset = self.element1.GetStringSelection()
+        
+        if location and mapset:
+            self.btnOK.Enable(True)
+        else:
+            self.btnOK.Enable(False)
+
+    def GetValues(self):
+        """!Get location, mapset"""
+        return (self.GetElement(), self.element1.GetStringSelection())
+    
+class MapsetDialog(ElementDialog):
+    """!Dialog used to select mapset"""
+    def __init__(self, parent, title = _("Select mapset in GRASS location"),
+                 location = None, id =  wx.ID_ANY):
+        ElementDialog.__init__(self, parent, title, label = _("Name of mapset:"))
+        if location:
+            self.SetTitle(self.GetTitle() + ' <%s>' % location)
+        else:
+            self.SetTitle(self.GetTitle() + ' <%s>' % grass.gisenv()['LOCATION_NAME'])
+        
+        self.element = MapsetSelect(parent = self.panel, id = wx.ID_ANY, skipCurrent = True,
+                                    size = globalvar.DIALOG_GSELECT_SIZE)
+        
+        self.PostInit()
+        
+        self.__Layout()
+        self.SetMinSize(self.GetSize())
+
+    def __Layout(self):
+        """!Do layout"""
+        self.dataSizer.Add(self.element, proportion = 0,
+                           flag = wx.EXPAND | wx.ALL, border = 1)
+        
+        self.panel.SetSizer(self.sizer)
+        self.sizer.Fit(self)
+
+    def GetMapset(self):
+        return self.GetElement()
+    
+class NewVectorDialog(ElementDialog):
+    def __init__(self, parent, id = wx.ID_ANY, title = _('Create new vector map'),
+                 disableAdd = False, disableTable = False,
+                 style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, *kwargs):
+        """!Dialog for creating new vector map
+
+        @param parent parent window
+        @param id window id
+        @param title window title
+        @param disableAdd disable 'add layer' checkbox
+        @param disableTable disable 'create table' checkbox
+        @param style window style
+        @param kwargs other argumentes for ElementDialog
+        
+        @return dialog instance       
+        """
+        ElementDialog.__init__(self, parent, title, label = _("Name for new vector map:"))
+        
+        self.element = Select(parent = self.panel, id = wx.ID_ANY, size = globalvar.DIALOG_GSELECT_SIZE,
+                              type = 'vector', mapsets = [grass.gisenv()['MAPSET'],])
+        
+        self.table = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
+                                 label = _("Create attribute table"))
+        self.table.SetValue(True)
+        if disableTable:
+            self.table.Enable(False)
+        
+        self.keycol = wx.TextCtrl(parent = self.panel, id =  wx.ID_ANY,
+                                  size = globalvar.DIALOG_SPIN_SIZE)
+        self.keycol.SetValue(UserSettings.Get(group = 'atm', key = 'keycolumn', subkey = 'value'))
+        if disableTable:
+            self.keycol.Enable(False)
+        
+        self.addbox = wx.CheckBox(parent = self.panel,
+                                  label = _('Add created map into layer tree'), style = wx.NO_BORDER)
+        if disableAdd:
+            self.addbox.SetValue(True)
+            self.addbox.Enable(False)
+        else:
+            self.addbox.SetValue(UserSettings.Get(group = 'cmd', key = 'addNewLayer', subkey = 'enabled'))
+
+        self.table.Bind(wx.EVT_CHECKBOX, self.OnTable)
+        
+        self.PostInit()
+        
+        self._layout()
+        self.SetMinSize(self.GetSize())
+        
+    def OnMapName(self, event):
+        """!Name for vector map layer given"""
+        self.OnElement(event)
+        
+    def OnTable(self, event):
+        self.keycol.Enable(event.IsChecked())
+        
+    def _layout(self):
+        """!Do layout"""
+        self.dataSizer.Add(self.element, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL, border = 1)
+        
+        self.dataSizer.Add(self.table, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL, border = 1)
+
+        keySizer = wx.BoxSizer(wx.HORIZONTAL)
+        keySizer.Add(item = wx.StaticText(parent = self.panel, label = _("Key column:")),
+                     proportion = 0,
+                     flag = wx.ALIGN_CENTER_VERTICAL)
+        keySizer.AddSpacer(10)
+        keySizer.Add(item = self.keycol, proportion = 0,
+                     flag = wx.ALIGN_RIGHT)
+        self.dataSizer.Add(item = keySizer, proportion = 1,
+                           flag = wx.EXPAND | wx.ALL, border = 1)
+
+        self.dataSizer.AddSpacer(5)
+        
+        self.dataSizer.Add(item = self.addbox, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL, border = 1)
+        
+        self.panel.SetSizer(self.sizer)
+        self.sizer.Fit(self)
+
+    def GetName(self, full = False):
+        """!Get name of vector map to be created
+
+        @param full True to get fully qualified name
+        """
+        name = self.GetElement()
+        if full:
+            if '@' in name:
+                return name
+            else:
+                return name + '@' + grass.gisenv()['MAPSET']
+        
+        return name.split('@', 1)[0]
+
+    def GetKey(self):
+        """!Get key column name"""
+        return self.keycol.GetValue()
+    
+    def IsChecked(self, key):
+        """!Get dialog properties
+
+        @param key window key ('add', 'table')
+
+        @return True/False
+        @return None on error
+        """
+        if key == 'add':
+            return self.addbox.IsChecked()
+        elif key == 'table':
+            return self.table.IsChecked()
+        
+        return None
+    
+def CreateNewVector(parent, cmd, title = _('Create new vector map'),
+                    exceptMap = None, log = None, disableAdd = False, disableTable = False):
+    """!Create new vector map layer
+    
+    @param cmd (prog, **kwargs)
+    @param title window title
+    @param exceptMap list of maps to be excepted
+    @param log
+    @param disableAdd disable 'add layer' checkbox
+    @param disableTable disable 'create table' checkbox
+
+    @return dialog instance
+    @return None on error
+    """
+    dlg = NewVectorDialog(parent, title = title,
+                          disableAdd = disableAdd, disableTable = disableTable)
+    
+    if dlg.ShowModal() != wx.ID_OK:
+        dlg.Destroy()
+        return None
+
+    outmap = dlg.GetName()
+    key    = dlg.GetKey()
+    if outmap == exceptMap:
+        GError(parent = parent,
+               message = _("Unable to create vector map <%s>.") % outmap)
+        dlg.Destroy()
+        return None
+    if dlg.table.IsEnabled() and not key:
+        GError(parent = parent,
+               message = _("Invalid or empty key column.\n"
+                           "Unable to create vector map <%s>.") % outmap)
+        dlg.Destroy()
+        return
+        
+    if outmap == '': # should not happen
+        dlg.Destroy()
+        return None
+    
+    # update cmd -> output name defined
+    cmd[1][cmd[2]] = outmap
+        
+    listOfVectors = grass.list_grouped('vect')[grass.gisenv()['MAPSET']]
+    
+    overwrite = False
+    if not UserSettings.Get(group = 'cmd', key = 'overwrite', subkey = 'enabled') and \
+            outmap in listOfVectors:
+        dlgOw = wx.MessageDialog(parent, message = _("Vector map <%s> already exists "
+                                                     "in the current mapset. "
+                                                     "Do you want to overwrite it?") % outmap,
+                                 caption = _("Overwrite?"),
+                                 style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+        if dlgOw.ShowModal() == wx.ID_YES:
+            overwrite = True
+        else:
+            dlgOw.Destroy()
+            dlg.Destroy()
+            return None
+    
+    if UserSettings.Get(group = 'cmd', key = 'overwrite', subkey = 'enabled'):
+        overwrite = True
+        
+    ret = RunCommand(prog = cmd[0],
+                     parent = parent,
+                     overwrite = overwrite,
+                     **cmd[1])
+    if ret != 0:
+        dlg.Destroy()
+        return None
+    
+    # create attribute table
+    if dlg.table.IsEnabled() and dlg.table.IsChecked():
+        sql = 'CREATE TABLE %s (%s INTEGER)' % (outmap, key)
+        
+        RunCommand('db.connect',
+                   flags = 'c')
+        
+        Debug.msg(1, "SQL: %s" % sql)
+        RunCommand('db.execute',
+                   quiet = True,
+                   parent = parent,
+                   input = '-',
+                   stdin = sql)
+        
+        RunCommand('v.db.connect',
+                   quiet = True,
+                   parent = parent,
+                   map = outmap,
+                   table = outmap,
+                   key = key,
+                   layer = '1')
+    
+    # return fully qualified map name
+    if '@' not in outmap:
+        outmap += '@' + grass.gisenv()['MAPSET']
+    
+    if log:
+        log.WriteLog(_("New vector map <%s> created") % outmap)
+        
+    return dlg
+
+class SavedRegion(wx.Dialog):
+    def __init__(self, parent, id = wx.ID_ANY, title = "", loadsave = 'load',
+                 **kwargs):
+        """!Loading and saving of display extents to saved region file
+
+        @param loadsave load or save region?
+        """
+        wx.Dialog.__init__(self, parent, id, title, **kwargs)
+
+        self.loadsave = loadsave
+        self.wind = ''
+        
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        
+        box = wx.BoxSizer(wx.HORIZONTAL)
+        label = wx.StaticText(parent = self, id = wx.ID_ANY)
+        box.Add(item = label, proportion = 0, flag = wx.ALIGN_CENTRE | wx.ALL, border = 5)
+        if loadsave == 'load':
+            label.SetLabel(_("Load region:"))
+            selection = Select(parent = self, id = wx.ID_ANY, size = globalvar.DIALOG_GSELECT_SIZE,
+                               type = 'windows')
+        elif loadsave == 'save':
+            label.SetLabel(_("Save region:"))
+            selection = Select(parent = self, id = wx.ID_ANY, size = globalvar.DIALOG_GSELECT_SIZE,
+                               type = 'windows', mapsets = [grass.gisenv()['MAPSET']], fullyQualified = False)
+        
+        box.Add(item = selection, proportion = 0, flag = wx.ALIGN_CENTRE | wx.ALL, border = 5)
+        selection.SetFocus()
+        selection.Bind(wx.EVT_TEXT, self.OnRegion)
+        
+        sizer.Add(item = box, proportion = 0, flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL,
+                  border = 5)
+        
+        line = wx.StaticLine(parent = self, id = wx.ID_ANY, size = (20, -1), style = wx.LI_HORIZONTAL)
+        sizer.Add(item = line, proportion = 0,
+                  flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, border = 5)
+        
+        btnsizer = wx.StdDialogButtonSizer()
+        
+        btn = wx.Button(parent = self, id = wx.ID_OK)
+        btn.SetDefault()
+        btnsizer.AddButton(btn)
+        
+        btn = wx.Button(parent = self, id = wx.ID_CANCEL)
+        btnsizer.AddButton(btn)
+        btnsizer.Realize()
+        
+        sizer.Add(item = btnsizer, proportion = 0, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
+        
+        self.SetSizer(sizer)
+        sizer.Fit(self)
+        self.Layout()
+        
+    def OnRegion(self, event):
+        self.wind = event.GetString()
+    
+DECOR_DIALOG_LEGEND = 0
+DECOR_DIALOG_BARSCALE = 1
+
+class DecorationDialog(wx.Dialog):
+    """
+    """
+    def __init__(self, parent, title, overlayController,
+                 ddstyle, **kwargs):
+
+        wx.Dialog.__init__(self, parent, wx.ID_ANY, title, **kwargs)
+
+        self.parent  = parent  # MapFrame
+        self._overlay = overlayController
+        self._ddstyle = ddstyle
+        
+        sizer = wx.BoxSizer(wx.VERTICAL)
+
+        box = wx.BoxSizer(wx.HORIZONTAL)
+        self.chkbox = wx.CheckBox(parent = self, id = wx.ID_ANY)
+        self.chkbox.SetValue(True)
+
+        if self._ddstyle == DECOR_DIALOG_LEGEND:
+            self.chkbox.SetLabel("Show legend")
+        else:
+            self.chkbox.SetLabel("Show scale and North arrow")
+
+
+        box.Add(item = self.chkbox, proportion = 0,
+                flag = wx.ALIGN_CENTRE|wx.ALL, border = 5)
+        sizer.Add(item = box, proportion = 0,
+                  flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 5)
+
+        box = wx.BoxSizer(wx.HORIZONTAL)
+        optnbtn = wx.Button(parent = self, id = wx.ID_ANY, label = _("Set options"))
+        box.Add(item = optnbtn, proportion = 0, flag = wx.ALIGN_CENTRE|wx.ALL, border = 5)
+        sizer.Add(item = box, proportion = 0,
+                  flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 5)
+        if self._ddstyle == DECOR_DIALOG_LEGEND:
+            box = wx.BoxSizer(wx.HORIZONTAL)
+            self.resizeBtn = wx.ToggleButton(parent = self, id = wx.ID_ANY, label = _("Set size and position"))
+            self.resizeBtn.SetToolTipString(_("Click and drag on the map display to set legend "
+                                              "size and position and then press OK"))
+            self.resizeBtn.Disable()
+            self.resizeBtn.Bind(wx.EVT_TOGGLEBUTTON, self.OnResize)
+            box.Add(item = self.resizeBtn, proportion = 0, flag = wx.ALIGN_CENTRE|wx.ALL, border = 5)
+            sizer.Add(item = box, proportion = 0,
+                      flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 5)
+
+        box = wx.BoxSizer(wx.HORIZONTAL)
+        if self._ddstyle == DECOR_DIALOG_LEGEND:
+            labelText = _("Drag legend object with mouse in pointer mode to position.\n"
+                          "Double-click to change options.\n"
+                          "Define raster map name for legend in properties dialog.")
+        else:
+            labelText = _("Drag scale object with mouse in pointer mode to position.\n"
+                          "Double-click to change options.")
+
+        label = wx.StaticText(parent = self, id = wx.ID_ANY,
+                              label = labelText)
+
+        box.Add(item = label, proportion = 0,
+                flag = wx.ALIGN_CENTRE|wx.ALL, border = 5)
+        sizer.Add(item = box, proportion = 0,
+                  flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 5)
+
+        line = wx.StaticLine(parent = self, id = wx.ID_ANY, size = (20,-1), style = wx.LI_HORIZONTAL)
+        sizer.Add(item = line, proportion = 0,
+                  flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 5)
+
+        # buttons
+        btnsizer = wx.StdDialogButtonSizer()
+
+        self.btnOK = wx.Button(parent = self, id = wx.ID_OK)
+        self.btnOK.SetDefault()
+        self.btnOK.Enable(self._ddstyle != DECOR_DIALOG_LEGEND)
+        btnsizer.AddButton(self.btnOK)
+
+        btnCancel = wx.Button(parent = self, id = wx.ID_CANCEL)
+        btnsizer.AddButton(btnCancel)
+        btnsizer.Realize()
+
+        sizer.Add(item = btnsizer, proportion = 0,
+                  flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border = 5)
+
+        #
+        # bindings
+        #
+        optnbtn.Bind(wx.EVT_BUTTON, self.OnOptions)
+        btnCancel.Bind(wx.EVT_BUTTON, lambda evt: self.CloseDialog())
+        self.btnOK.Bind(wx.EVT_BUTTON, self.OnOK)
+
+        self.SetSizer(sizer)
+        sizer.Fit(self)
+
+        mapName, found = GetLayerNameFromCmd(self._overlay.cmd)
+        if found:
+            # enable 'OK' and 'Resize' button
+            self.btnOK.Enable()
+            if not self.parent.IsPaneShown('3d'):
+                self.resizeBtn.Enable()
+            
+            # set title
+            self.SetTitle(_('Legend of raster map <%s>') % \
+                              mapName)
+        
+    def OnOptions(self, event):
+        """!Sets option for decoration map overlays
+        """
+        if self._overlay.propwin is None:
+            # build properties dialog
+            GUI(parent = self.parent).ParseCommand(cmd = self._overlay.cmd,
+                                                   completed = (self.GetOptData, self._overlay.name, ''))
+            
+        else:
+            if self._overlay.propwin.IsShown():
+                self._overlay.propwin.SetFocus()
+            else:
+                self._overlay.propwin.Show()
+    
+    def OnResize(self, event):
+        if event.GetInt(): 
+            self.parent.MapWindow.SetCursor(self.parent.cursors["cross"])
+            self.parent.MapWindow.mouse['use'] = 'legend'
+            self.parent.MapWindow.mouse['box'] = 'box'
+            self.parent.MapWindow.pen = wx.Pen(colour = 'Black', width = 2, style = wx.SHORT_DASH)
+        else:
+            self.parent.MapWindow.SetCursor(self.parent.cursors["default"])
+            self.parent.MapWindow.mouse['use'] = 'pointer'
+            
+    def CloseDialog(self):
+        """!Hide dialog"""
+        if self._ddstyle == DECOR_DIALOG_LEGEND and self.resizeBtn.GetValue():
+            self.resizeBtn.SetValue(False)
+            self.OnResize(None)
+
+        self.Hide()
+
+    def OnOK(self, event):
+        """!Button 'OK' pressed"""
+        # enable or disable overlay
+        self._overlay.Show(self.chkbox.IsChecked())
+
+        # update map
+        if self.parent.IsPaneShown('3d'):
+            self.parent.MapWindow.UpdateOverlays()
+            
+        self.parent.MapWindow.UpdateMap()
+
+        # hide dialog
+        self.CloseDialog()
+
+    def GetOptData(self, dcmd, layer, params, propwin):
+        """!Process decoration layer data"""
+        if dcmd:
+            self._overlay.cmd = dcmd
+        self._overlay.propwin = propwin
+        if params:
+            self.btnOK.Enable()
+            if self._ddstyle == DECOR_DIALOG_LEGEND and not self.parent.IsPaneShown('3d'):
+                self.resizeBtn.Enable()
+
+
+class TextLayerDialog(wx.Dialog):
+    """
+    Controls setting options and displaying/hiding map overlay decorations
+    """
+
+    def __init__(self, parent, ovlId, title, name = 'text',
+                 pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_DIALOG_STYLE):
+
+        wx.Dialog.__init__(self, parent, wx.ID_ANY, title, pos, size, style)
+        from wx.lib.expando import ExpandoTextCtrl, EVT_ETC_LAYOUT_NEEDED
+
+        self.ovlId = ovlId
+        self.parent = parent
+
+        if self.ovlId in self.parent.MapWindow.textdict.keys():
+            self.currText = self.parent.MapWindow.textdict[self.ovlId]['text']
+            self.currFont = self.parent.MapWindow.textdict[self.ovlId]['font']
+            self.currClr  = self.parent.MapWindow.textdict[self.ovlId]['color']
+            self.currRot  = self.parent.MapWindow.textdict[self.ovlId]['rotation']
+            self.currCoords = self.parent.MapWindow.textdict[self.ovlId]['coords']
+            self.currBB = self.parent.MapWindow.textdict[self.ovlId]['bbox']
+        else:
+            self.currClr = wx.BLACK
+            self.currText = ''
+            self.currFont = self.GetFont()
+            self.currRot = 0.0
+            self.currCoords = [10, 10, 10, 10]
+            self.currBB = wx.Rect()
+
+        self.sizer = wx.BoxSizer(wx.VERTICAL)
+        box = wx.GridBagSizer(vgap = 5, hgap = 5)
+
+        # show/hide
+        self.chkbox = wx.CheckBox(parent = self, id = wx.ID_ANY,
+                                  label = _('Show text object'))
+        if self.parent.Map.GetOverlay(self.ovlId) is None:
+            self.chkbox.SetValue(True)
+        else:
+            self.chkbox.SetValue(self.parent.MapWindow.overlays[self.ovlId]['layer'].IsActive())
+        box.Add(item = self.chkbox, span = (1,2),
+                flag = wx.ALIGN_LEFT|wx.ALL, border = 5,
+                pos = (0, 0))
+
+        # text entry
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Enter text:"))
+        box.Add(item = label,
+                flag = wx.ALIGN_CENTER_VERTICAL,
+                pos = (1, 0))
+
+        self.textentry = ExpandoTextCtrl(parent = self, id = wx.ID_ANY, value = "", size = (300,-1))
+        self.textentry.SetFont(self.currFont)
+        self.textentry.SetForegroundColour(self.currClr)
+        self.textentry.SetValue(self.currText)
+        # get rid of unneeded scrollbar when text box first opened
+        self.textentry.SetClientSize((300,-1))
+        
+        box.Add(item = self.textentry,
+                pos = (1, 1))
+
+        # rotation
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Rotation:"))
+        box.Add(item = label,
+                flag = wx.ALIGN_CENTER_VERTICAL,
+                pos = (2, 0))
+        self.rotation = wx.SpinCtrl(parent = self, id = wx.ID_ANY, value = "", pos = (30, 50),
+                                    size = (75,-1), style = wx.SP_ARROW_KEYS)
+        self.rotation.SetRange(-360, 360)
+        self.rotation.SetValue(int(self.currRot))
+        box.Add(item = self.rotation,
+                flag = wx.ALIGN_RIGHT,
+                pos = (2, 1))
+
+        # font
+        fontbtn = wx.Button(parent = self, id = wx.ID_ANY, label = _("Set font"))
+        box.Add(item = fontbtn,
+                flag = wx.ALIGN_RIGHT,
+                pos = (3, 1))
+
+        self.sizer.Add(item = box, proportion = 1,
+                  flag = wx.ALL, border = 10)
+
+        # note
+        box = wx.BoxSizer(wx.HORIZONTAL)
+        label = wx.StaticText(parent = self, id = wx.ID_ANY,
+                              label = _("Drag text with mouse in pointer mode "
+                                      "to position.\nDouble-click to change options"))
+        box.Add(item = label, proportion = 0,
+                flag = wx.ALIGN_CENTRE | wx.ALL, border = 5)
+        self.sizer.Add(item = box, proportion = 0,
+                  flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER | wx.ALL, border = 5)
+
+        line = wx.StaticLine(parent = self, id = wx.ID_ANY,
+                             size = (20,-1), style = wx.LI_HORIZONTAL)
+        self.sizer.Add(item = line, proportion = 0,
+                  flag = wx.EXPAND | wx.ALIGN_CENTRE | wx.ALL, border = 5)
+
+        btnsizer = wx.StdDialogButtonSizer()
+
+        btn = wx.Button(parent = self, id = wx.ID_OK)
+        btn.SetDefault()
+        btnsizer.AddButton(btn)
+
+        btn = wx.Button(parent = self, id = wx.ID_CANCEL)
+        btnsizer.AddButton(btn)
+        btnsizer.Realize()
+
+        self.sizer.Add(item = btnsizer, proportion = 0,
+                       flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+
+        self.SetSizer(self.sizer)
+        self.sizer.Fit(self)
+
+        # bindings
+        self.Bind(EVT_ETC_LAYOUT_NEEDED, self.OnRefit, self.textentry)
+        self.Bind(wx.EVT_BUTTON,     self.OnSelectFont, fontbtn)
+        self.Bind(wx.EVT_TEXT,       self.OnText,       self.textentry)
+        self.Bind(wx.EVT_SPINCTRL,   self.OnRotation,   self.rotation)
+
+    def OnRefit(self, event):
+        """!Resize text entry to match text"""
+        self.sizer.Fit(self)
+
+    def OnText(self, event):
+        """!Change text string"""
+        self.currText = event.GetString()
+
+    def OnRotation(self, event):
+        """!Change rotation"""
+        self.currRot = event.GetInt()
+
+        event.Skip()
+
+    def OnSelectFont(self, event):
+        """!Change font"""
+        data = wx.FontData()
+        data.EnableEffects(True)
+        data.SetColour(self.currClr)         # set colour
+        data.SetInitialFont(self.currFont)
+
+        dlg = wx.FontDialog(self, data)
+
+        if dlg.ShowModal() == wx.ID_OK:
+            data = dlg.GetFontData()
+            self.currFont = data.GetChosenFont()
+            self.currClr = data.GetColour()
+
+            self.textentry.SetFont(self.currFont)
+            self.textentry.SetForegroundColour(self.currClr)
+
+            self.Layout()
+
+        dlg.Destroy()
+
+    def GetValues(self):
+        """!Get text properties"""
+        return { 'text' : self.currText,
+                 'font' : self.currFont,
+                 'color' : self.currClr,
+                 'rotation' : self.currRot,
+                 'coords' : self.currCoords,
+                 'active' : self.chkbox.IsChecked() }
+
+class GroupDialog(wx.Dialog):
+    """!Dialog for creating/editing groups"""
+    def __init__(self, parent = None, defaultGroup = None, 
+                 title = _("Create or edit imagery groups"),
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
+                     
+        wx.Dialog.__init__(self, parent = parent, id = wx.ID_ANY, title = title,
+                            style = style, **kwargs)
+                            
+        self.parent = parent
+        self.defaultGroup = defaultGroup
+        self.currentGroup = self.defaultGroup
+        self.groupChanged = False
+        
+        self.bodySizer = self._createDialogBody()
+        
+        # buttons
+        btnOk = wx.Button(parent = self, id = wx.ID_OK)
+        btnApply = wx.Button(parent = self, id = wx.ID_APPLY)
+        btnClose = wx.Button(parent = self, id = wx.ID_CANCEL)
+        
+        btnOk.SetToolTipString(_("Apply changes to selected group and close dialog"))
+        btnApply.SetToolTipString(_("Apply changes to selected group"))
+        btnClose.SetToolTipString(_("Close dialog, changes are not applied"))
+
+        btnOk.SetDefault()
+        
+        # sizers & do layout
+        # btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+        # btnSizer.Add(item = btnClose, proportion = 0,
+        #              flag = wx.RIGHT | wx.ALIGN_RIGHT | wx.EXPAND, border = 5)
+        # btnSizer.Add(item = btnApply, proportion = 0,
+        #              flag = wx.LEFT, border = 5)
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(btnOk)
+        btnSizer.AddButton(btnApply)
+        btnSizer.AddButton(btnClose)
+        btnSizer.Realize()
+        
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        mainSizer.Add(item = self.bodySizer, proportion = 1,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 10)
+        mainSizer.Add(item = wx.StaticLine(parent = self, id = wx.ID_ANY,
+                      style = wx.LI_HORIZONTAL), proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 10) 
+        
+        mainSizer.Add(item = btnSizer, proportion = 0,
+                      flag = wx.ALL | wx.ALIGN_RIGHT, border = 10)
+
+        self.SetSizer(mainSizer)
+        mainSizer.Fit(self)
+        
+        btnOk.Bind(wx.EVT_BUTTON, self.OnOk)
+        btnApply.Bind(wx.EVT_BUTTON, self.OnApply)
+        btnClose.Bind(wx.EVT_BUTTON, self.OnClose)
+
+        # set dialog min size
+        self.SetMinSize(self.GetSize())
+        
+    def _createDialogBody(self):
+        bodySizer = wx.BoxSizer(wx.VERTICAL)
+    
+        # group selection
+        bodySizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                           label = _("Select the group you want to edit or "
+                                                     "enter name of new group:")),
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.TOP, border = 10)
+        self.groupSelect = Select(parent = self, type = 'group',
+                                  mapsets = [grass.gisenv()['MAPSET']],
+                                  size = globalvar.DIALOG_GSELECT_SIZE) # searchpath?
+            
+        bodySizer.Add(item = self.groupSelect, flag = wx.TOP | wx.EXPAND, border = 5)
+        
+        bodySizer.AddSpacer(10)
+        # layers in group
+        bodySizer.Add(item = wx.StaticText(parent = self, label = _("Layers in selected group:")),
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM, border = 5)
+        
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+        gridSizer.AddGrowableCol(0)
+        
+        self.layerBox = wx.ListBox(parent = self,  id = wx.ID_ANY, size = (-1, 150),
+                                   style = wx.LB_MULTIPLE | wx.LB_NEEDED_SB)
+        
+        gridSizer.Add(item = self.layerBox, pos = (0, 0), span = (2, 1), flag = wx.EXPAND)
+        
+        self.addLayer = wx.Button(self, id = wx.ID_ADD)
+        self.addLayer.SetToolTipString(_("Select map layers and add them to the list."))
+        gridSizer.Add(item = self.addLayer, pos = (0, 1), flag = wx.EXPAND)
+        
+        self.removeLayer = wx.Button(self, id = wx.ID_REMOVE)
+        self.removeLayer.SetToolTipString(_("Remove selected layer(s) from list."))
+        gridSizer.Add(item = self.removeLayer, pos = (1, 1))
+        
+        bodySizer.Add(item = gridSizer, proportion = 1, flag = wx.EXPAND)
+        
+        self.infoLabel = wx.StaticText(parent = self, id = wx.ID_ANY)
+        bodySizer.Add(item = self.infoLabel, 
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.TOP | wx.BOTTOM, border = 5)
+        
+        self.subGroup = wx.CheckBox(parent = self, id = wx.ID_ANY,
+                                    label = _("Define also sub-group (same name as group)"))
+        bodySizer.Add(item = self.subGroup, flag = wx.BOTTOM | wx.EXPAND, border = 5)
+        
+        # bindings
+        self.groupSelect.GetTextCtrl().Bind(wx.EVT_TEXT, self.OnGroupSelected)
+        self.addLayer.Bind(wx.EVT_BUTTON, self.OnAddLayer)
+        self.removeLayer.Bind(wx.EVT_BUTTON, self.OnRemoveLayer)
+        
+        if self.defaultGroup:
+            self.groupSelect.SetValue(self.defaultGroup)
+        
+        return bodySizer
+        
+    def OnAddLayer(self, event):
+        """!Add new layer to listbox"""
+        dlg = MapLayersDialog(parent = self, title = _("Add selected map layers into group"),
+                              mapType = 'raster', selectAll = False,
+                              fullyQualified = True, showFullyQualified = False)
+        if dlg.ShowModal() != wx.ID_OK:
+            dlg.Destroy()
+            return
+        
+        layers = dlg.GetMapLayers()
+        for layer in layers:
+            if layer not in self.GetLayers():
+                self.layerBox.Append(layer)
+                self.groupChanged = True
+            
+    
+    def OnRemoveLayer(self, event):
+        """!Remove layer from listbox"""
+        while self.layerBox.GetSelections():
+            sel = self.layerBox.GetSelections()[0]
+            self.layerBox.Delete(sel)
+            self.groupChanged = True
+                
+    def GetLayers(self):
+        """!Get layers"""
+        return self.layerBox.GetItems()
+        
+    def OnGroupSelected(self, event):
+        """!Text changed in group selector"""
+        # callAfter must be called to close popup before other actions
+        wx.CallAfter(self.GroupSelected)
+        
+    def GroupSelected(self):
+        """!Group was selected, check if changes were apllied"""
+        group = self.GetSelectedGroup()
+        if self.groupChanged:
+            dlg = wx.MessageDialog(self, message = _("Group <%s> was changed, "
+                                                     "do you want to apply changes?") % self.currentGroup,
+                                   caption = _("Unapplied changes"),
+                                   style = wx.YES_NO | wx.ICON_QUESTION | wx.YES_DEFAULT)
+            if dlg.ShowModal() == wx.ID_YES:
+                self.ApplyChanges(showResult = True)
+                
+            dlg.Destroy()
+            
+            
+        
+        groups = self.GetExistGroups()
+        if group in groups:
+            self.ShowGroupLayers(self.GetGroupLayers(group))
+            
+        self.currentGroup = group
+        self.groupChanged = False
+        
+        self.ClearNotification()
+        
+    def ShowGroupLayers(self, mapList):
+        """!Show map layers in currently selected group"""
+        self.layerBox.Set(mapList)
+        
+        
+    def EditGroup(self, group):
+        """!Edit selected group"""
+        layersNew = self.GetLayers()
+        layersOld = self.GetGroupLayers(group)
+        
+        add = []
+        remove = []
+        for layerNew in layersNew:
+            if layerNew not in layersOld:
+                add.append(layerNew)
+                
+        for layerOld in layersOld:
+            if layerOld not in layersNew:
+                remove.append(layerOld)
+        
+        kwargs = {}
+        if self.subGroup.IsChecked():
+            kwargs['subgroup'] = group
+        
+        ret = None
+        if remove:
+            ret = RunCommand('i.group',
+                             parent = self,
+                             group = group,
+                             flags = 'r',
+                             input = ','.join(remove),
+                             **kwargs)
+        
+        if add:
+            ret = RunCommand('i.group',
+                             parent = self,
+                             group = group,
+                             input = ','.join(add),
+                             **kwargs)
+        
+        return ret
+        
+    def CreateNewGroup(self, group):
+        """!Create new group"""
+        layers = self.GetLayers()
+        
+        kwargs = {}
+        if self.subGroup.IsChecked():
+            kwargs['subgroup'] = group
+        
+        return RunCommand('i.group',
+                          parent = self,
+                          group = group,
+                          input = layers,
+                          **kwargs)
+    
+    def GetExistGroups(self):
+        """!Returns existing groups in current mapset"""
+        return grass.list_grouped('group')[grass.gisenv()['MAPSET']]
+        
+    def ShowResult(self, group, returnCode, create):
+        """!Show if operation was successfull."""
+        group += '@' + grass.gisenv()['MAPSET']
+        if returnCode is None:
+            label = _("No changes to apply in group <%s>.") % group
+        elif returnCode == 0:
+            if create:
+                label = _("Group <%s> was successfully created.") % group
+            else:
+                label = _("Group <%s> was successfully changed.") % group
+        else:
+            if create:
+                label = _("Creating of new group <%s> failed.") % group
+            else:
+                label = _("Changing of group <%s> failed.") % group
+                
+        self.infoLabel.SetLabel(label)
+        wx.FutureCall(4000, self.ClearNotification)
+        
+    def GetSelectedGroup(self):
+        """!Return currently selected group (without mapset)"""
+        return self.groupSelect.GetValue().split('@')[0]
+        
+    def GetGroupLayers(self, group):
+        """!Get layers in group"""
+        res = RunCommand('i.group',
+                         parent = self,
+                         flags = 'g',
+                         group = group,
+                         read = True).strip()
+        if res.split('\n')[0]:
+            return res.split('\n')
+        return []
+        
+    def ClearNotification(self):
+        """!Clear notification string"""
+        self.infoLabel.SetLabel("")
+       
+    def ApplyChanges(self, showResult):
+        """!Create or edit group"""
+        group = self.currentGroup
+        if not group:
+            GMessage(parent = self,
+                     message = _("No group selected."))
+            return False
+        
+        groups = self.GetExistGroups()
+        if group in groups:
+            ret = self.EditGroup(group)
+            self.ShowResult(group = group, returnCode = ret, create = False)
+            
+        else:
+            ret = self.CreateNewGroup(group)
+            self.ShowResult(group = group, returnCode = ret, create = True)
+            
+        self.groupChanged = False
+        
+        return True
+        
+    def OnApply(self, event):
+        """!Apply changes"""
+        self.ApplyChanges(showResult = True)
+        
+    def OnOk(self, event):
+        """!Apply changes and close dialog"""
+        if self.ApplyChanges(showResult = False):
+            self.OnClose(event)
+        
+    def OnClose(self, event):
+        """!Close dialog"""
+        if not self.IsModal():
+            self.Destroy()
+        event.Skip()
+        
+class MapLayersDialog(wx.Dialog):
+    def __init__(self, parent, title, modeler = False,
+                 mapType = None, selectAll = True, fullyQualified = True, showFullyQualified = True, 
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
+        """!Dialog for selecting map layers (raster, vector)
+        
+        Valid mapType values:
+         - raster
+         - raster3d
+         - vector
+        
+        @param mapType type of map (if None: raster, vector, 3d raster, if one only: selects it and disables selection)
+        @param selectAll all/none maps should be selected by default
+        @param fullyQualified True if dialog should return full map names by default
+        @param showFullyQualified True to show 'fullyQualified' checkbox, otherwise hide it
+        """
+        wx.Dialog.__init__(self, parent = parent, id = wx.ID_ANY, title = title,
+                           style = style, **kwargs)
+        
+        self.parent = parent # GMFrame or ?
+        self.mapType = mapType
+        self.selectAll = selectAll
+        
+        # dialog body
+        self.bodySizer = self._createDialogBody()
+        # update list of layer to be loaded
+        self.map_layers = [] # list of map layers (full list type/mapset)
+        self.LoadMapLayers(self.GetLayerType(cmd = True),
+                           self.mapset.GetStringSelection())
+        
+        self.fullyQualified = wx.CheckBox(parent = self, id = wx.ID_ANY,
+                                          label = _("Use fully-qualified map names"))
+        self.fullyQualified.SetValue(fullyQualified)
+        self.fullyQualified.Show(showFullyQualified)
+
+        self.dseries = None
+        if modeler:
+            self.dseries = wx.CheckBox(parent = self, id = wx.ID_ANY,
+                                       label = _("Dynamic series (%s)") % 'g.mlist')
+            self.dseries.SetValue(False)
+        
+        # buttons
+        btnCancel = wx.Button(parent = self, id = wx.ID_CANCEL)
+        btnOk = wx.Button(parent = self, id = wx.ID_OK)
+        btnOk.SetDefault()
+        
+        # sizers & do layout
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(btnCancel)
+        btnSizer.AddButton(btnOk)
+        btnSizer.Realize()
+        
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        mainSizer.Add(item = self.bodySizer, proportion = 1,
+                      flag = wx.EXPAND | wx.ALL, border = 5)
+        mainSizer.Add(item = self.fullyQualified, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 5)
+        if self.dseries:
+            mainSizer.Add(item = self.dseries, proportion = 0,
+                          flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 5)
+        
+        mainSizer.Add(item = btnSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+
+        self.SetSizer(mainSizer)
+        mainSizer.Fit(self)
+
+        # set dialog min size
+        self.SetMinSize(self.GetSize())
+        
+    def _createDialogBody(self):
+        bodySizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        bodySizer.AddGrowableCol(1)
+        bodySizer.AddGrowableRow(3)
+        
+        # layer type
+        bodySizer.Add(item = wx.StaticText(parent = self, label = _("Map type:")),
+                      flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (0,0))
+        
+        self.layerType = wx.Choice(parent = self, id = wx.ID_ANY,
+                                   choices = [_('raster'), _('3D raster'), _('vector')], size = (100,-1))
+        
+        if self.mapType:
+            if self.mapType == 'raster':
+                self.layerType.SetSelection(0)
+            elif self.mapType == 'raster3d':
+                self.layerType.SetSelection(1)
+            elif self.mapType == 'vector':
+                self.layerType.SetSelection(2)
+            self.layerType.Disable()
+        else:
+            self.layerType.SetSelection(0)
+            
+        bodySizer.Add(item = self.layerType,
+                      pos = (0,1))
+        
+        # select toggle
+        self.toggle = wx.CheckBox(parent = self, id = wx.ID_ANY,
+                                  label = _("Select toggle"))
+        self.toggle.SetValue(self.selectAll)
+        bodySizer.Add(item = self.toggle,
+                      flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (0,2))
+        
+        # mapset filter
+        bodySizer.Add(item = wx.StaticText(parent = self, label = _("Mapset:")),
+                      flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (1,0))
+        
+        self.mapset = MapsetSelect(parent = self, searchPath = True)
+        self.mapset.SetStringSelection(grass.gisenv()['MAPSET'])
+        bodySizer.Add(item = self.mapset,
+                      pos = (1,1), span = (1, 2))
+        
+        # map name filter
+        bodySizer.Add(item = wx.StaticText(parent = self, label = _("Pattern:")),
+                      flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (2,0))
+        
+        self.filter = wx.TextCtrl(parent = self, id = wx.ID_ANY,
+                                  value = "",
+                                  size = (250,-1))
+        bodySizer.Add(item = self.filter,
+                      flag = wx.EXPAND,
+                      pos = (2,1), span = (1, 2))
+        
+        # layer list 
+        bodySizer.Add(item = wx.StaticText(parent = self, label = _("List of maps:")),
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_TOP,
+                      pos = (3,0))
+        self.layers = wx.CheckListBox(parent = self, id = wx.ID_ANY,
+                                      size = (250, 100),
+                                      choices = [])
+        bodySizer.Add(item = self.layers,
+                      flag = wx.EXPAND,
+                      pos = (3,1), span = (1, 2))
+        
+        # bindings
+        self.layerType.Bind(wx.EVT_CHOICE, self.OnChangeParams)
+        self.mapset.Bind(wx.EVT_COMBOBOX, self.OnChangeParams)
+        self.layers.Bind(wx.EVT_RIGHT_DOWN, self.OnMenu)
+        self.filter.Bind(wx.EVT_TEXT, self.OnFilter)
+        self.toggle.Bind(wx.EVT_CHECKBOX, self.OnToggle)
+        
+        return bodySizer
+
+    def LoadMapLayers(self, type, mapset):
+        """!Load list of map layers
+
+        @param type layer type ('raster' or 'vector')
+        @param mapset mapset name
+        """
+        self.map_layers = grass.mlist_grouped(type = type)[mapset]
+        self.layers.Set(self.map_layers)
+        
+        # check all items by default
+        for item in range(self.layers.GetCount()):
+            
+            self.layers.Check(item, check = self.selectAll)
+        
+    def OnChangeParams(self, event):
+        """!Filter parameters changed by user"""
+        # update list of layer to be loaded
+        self.LoadMapLayers(self.GetLayerType(cmd = True),
+                           self.mapset.GetStringSelection())
+        
+        event.Skip()
+        
+    def OnMenu(self, event):
+        """!Table description area, context menu"""
+        if not hasattr(self, "popupID1"):
+            self.popupDataID1 = wx.NewId()
+            self.popupDataID2 = wx.NewId()
+            self.popupDataID3 = wx.NewId()
+
+            self.Bind(wx.EVT_MENU, self.OnSelectAll,    id = self.popupDataID1)
+            self.Bind(wx.EVT_MENU, self.OnSelectInvert, id = self.popupDataID2)
+            self.Bind(wx.EVT_MENU, self.OnDeselectAll,  id = self.popupDataID3)
+        
+        # generate popup-menu
+        menu = wx.Menu()
+        menu.Append(self.popupDataID1, _("Select all"))
+        menu.Append(self.popupDataID2, _("Invert selection"))
+        menu.Append(self.popupDataID3, _("Deselect all"))
+        
+        self.PopupMenu(menu)
+        menu.Destroy()
+        
+    def OnSelectAll(self, event):
+        """!Select all map layer from list"""
+        for item in range(self.layers.GetCount()):
+            self.layers.Check(item, True)
+        
+    def OnSelectInvert(self, event):
+        """!Invert current selection"""
+        for item in range(self.layers.GetCount()):
+            if self.layers.IsChecked(item):
+                self.layers.Check(item, False)
+            else:
+                self.layers.Check(item, True)
+        
+    def OnDeselectAll(self, event):
+        """!Select all map layer from list"""
+        for item in range(self.layers.GetCount()):
+            self.layers.Check(item, False)
+        
+    def OnFilter(self, event):
+        """!Apply filter for map names"""
+        if len(event.GetString()) == 0:
+           self.layers.Set(self.map_layers) 
+           return 
+        
+        list = []
+        for layer in self.map_layers:
+            try:
+                if re.compile('^' + event.GetString()).search(layer):
+                    list.append(layer)
+            except:
+                pass
+        
+        self.layers.Set(list)
+        self.OnSelectAll(None)
+        
+        event.Skip()
+        
+    def OnToggle(self, event):
+        """!Select toggle (check or uncheck all layers)"""
+        check = event.Checked()
+        for item in range(self.layers.GetCount()):
+            self.layers.Check(item, check)
+        
+        event.Skip()
+        
+    def GetMapLayers(self):
+        """!Return list of checked map layers"""
+        layerNames = []
+        for indx in self.layers.GetSelections():
+            # layers.append(self.layers.GetStringSelec(indx))
+            pass
+
+        fullyQualified = self.fullyQualified.IsChecked()
+        mapset = self.mapset.GetStringSelection()
+        for item in range(self.layers.GetCount()):
+            if not self.layers.IsChecked(item):
+                continue
+            if fullyQualified:
+                layerNames.append(self.layers.GetString(item) + '@' + mapset)
+            else:
+                layerNames.append(self.layers.GetString(item))
+        
+        return layerNames
+    
+    def GetLayerType(self, cmd = False):
+        """!Get selected layer type
+
+        @param cmd True for g.mlist
+        """
+        if not cmd:
+            return self.layerType.GetStringSelection()
+        
+        sel = self.layerType.GetSelection()
+        if sel == 0:
+            ltype = 'rast'
+        elif sel == 1:
+            ltype = 'rast3d'
+        else:
+            ltype = 'vect'
+        
+        return ltype
+
+    def GetDSeries(self):
+        """!Used by modeler only
+
+        @return g.mlist command
+        """
+        if not self.dseries or not self.dseries.IsChecked():
+            return ''
+        
+        cond = 'map in `g.mlist type=%s ' % self.GetLayerType(cmd = True)
+        patt = self.filter.GetValue()
+        if patt:
+            cond += 'pattern=%s ' % patt
+        cond += 'mapset=%s`' % self.mapset.GetStringSelection()
+        
+        return cond
+
+class ImportDialog(wx.Dialog):
+    """!Dialog for bulk import of various data (base class)"""
+    def __init__(self, parent, itype,
+                 id = wx.ID_ANY, title = _("Multiple import"),
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER):
+        self.parent = parent    # GMFrame 
+        self.importType = itype
+        self.options = dict()   # list of options
+        
+        self.commandId = -1  # id of running command
+        
+        wx.Dialog.__init__(self, parent, id, title, style = style,
+                           name = "MultiImportDialog")
+        
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
+        
+        self.layerBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                     label = _(" List of %s layers ") % self.importType.upper())
+        
+        #
+        # list of layers
+        #
+        columns = [_('Layer id'),
+                   _('Layer name'),
+                   _('Name for GRASS map (editable)')]
+        self.list = LayersList(parent = self.panel, columns = columns)
+        self.list.LoadData()
+
+        self.optionBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                      label = "%s" % _("Options"))
+        
+        cmd = self._getCommand()
+        task = gtask.parse_interface(cmd)
+        for f in task.get_options()['flags']:
+            name = f.get('name', '')
+            desc = f.get('label', '')
+            if not desc:
+                desc = f.get('description', '')
+            if not name and not desc:
+                continue
+            if cmd == 'r.in.gdal' and name not in ('o', 'e', 'l', 'k'):
+                continue
+            elif cmd == 'r.external' and name not in ('o', 'e', 'r', 'h', 'v'):
+                continue
+            elif cmd == 'v.in.ogr' and name not in ('c', 'z', 't', 'o', 'r', 'e', 'w'):
+                continue
+            elif cmd == 'v.external' and name not in ('b'):
+                continue
+            elif cmd == 'v.in.dxf' and name not in ('e', 't', 'b', 'f', 'i'):
+                continue
+            self.options[name] = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
+                                             label = desc)
+        
+        if not self.options:
+            self.optionBox.Hide()
+        
+        self.overwrite = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
+                                     label = _("Allow output files to overwrite existing files"))
+        self.overwrite.SetValue(UserSettings.Get(group = 'cmd', key = 'overwrite', subkey = 'enabled'))
+        
+        self.add = wx.CheckBox(parent = self.panel, id = wx.ID_ANY)
+        self.closeOnFinish = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
+                                     label = _("Close dialog on finish"))
+        self.closeOnFinish.SetValue(UserSettings.Get(group = 'cmd', key = 'closeDlg', subkey = 'enabled'))
+        
+        #
+        # buttons
+        #
+        # cancel
+        self.btn_close = wx.Button(parent = self.panel, id = wx.ID_CLOSE)
+        self.btn_close.SetToolTipString(_("Close dialog"))
+        self.btn_close.Bind(wx.EVT_BUTTON, self.OnClose)
+        # run
+        self.btn_run = wx.Button(parent = self.panel, id = wx.ID_OK, label = _("&Import"))
+        self.btn_run.SetToolTipString(_("Import selected layers"))
+        self.btn_run.SetDefault()
+        self.btn_run.Enable(False)
+        self.btn_run.Bind(wx.EVT_BUTTON, self.OnRun)
+        # run command dialog
+        self.btn_cmd = wx.Button(parent = self.panel, id = wx.ID_ANY,
+                                 label = _("Command dialog"))
+        self.btn_cmd.Bind(wx.EVT_BUTTON, self.OnCmdDialog)
+        
+    def doLayout(self):
+        """!Do layout"""
+        dialogSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        # dsn input
+        dialogSizer.Add(item = self.dsnInput, proportion = 0,
+                        flag = wx.EXPAND)
+        
+        #
+        # list of DXF layers
+        #
+        layerSizer = wx.StaticBoxSizer(self.layerBox, wx.HORIZONTAL)
+
+        layerSizer.Add(item = self.list, proportion = 1,
+                      flag = wx.ALL | wx.EXPAND, border = 5)
+        
+        dialogSizer.Add(item = layerSizer, proportion = 1,
+                        flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
+
+        # options
+        if self.optionBox.IsShown():
+            optionSizer = wx.StaticBoxSizer(self.optionBox, wx.VERTICAL)
+            for key in self.options.keys():
+                optionSizer.Add(item = self.options[key], proportion = 0)
+            
+            dialogSizer.Add(item = optionSizer, proportion = 0,
+                            flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
+        
+        dialogSizer.Add(item = self.overwrite, proportion = 0,
+                        flag = wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
+        
+        dialogSizer.Add(item = self.add, proportion = 0,
+                        flag = wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
+        
+        dialogSizer.Add(item = self.closeOnFinish, proportion = 0,
+                        flag = wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
+        #
+        # buttons
+        #
+        btnsizer = wx.BoxSizer(orient = wx.HORIZONTAL)
+        
+        btnsizer.Add(item = self.btn_cmd, proportion = 0,
+                     flag = wx.RIGHT | wx.ALIGN_CENTER,
+                     border = 10)
+        
+        btnsizer.Add(item = self.btn_close, proportion = 0,
+                     flag = wx.LEFT | wx.RIGHT | wx.ALIGN_CENTER,
+                     border = 10)
+        
+        btnsizer.Add(item = self.btn_run, proportion = 0,
+                     flag = wx.RIGHT | wx.ALIGN_CENTER,
+                     border = 10)
+        
+        dialogSizer.Add(item = btnsizer, proportion = 0,
+                        flag = wx.ALIGN_CENTER_VERTICAL | wx.BOTTOM | wx.ALIGN_RIGHT,
+                        border = 10)
+        
+        # dialogSizer.SetSizeHints(self.panel)
+        self.panel.SetAutoLayout(True)
+        self.panel.SetSizer(dialogSizer)
+        dialogSizer.Fit(self.panel)
+        
+        # auto-layout seems not work here - FIXME
+        size = wx.Size(globalvar.DIALOG_GSELECT_SIZE[0] + 225, 550)
+        self.SetMinSize(size)
+        self.SetSize((size.width, size.height + 100))
+        # width = self.GetSize()[0]
+        # self.list.SetColumnWidth(col = 1, width = width / 2 - 50)
+        self.Layout()
+
+    def _getCommand(self):
+        """!Get command"""
+        return ''
+    
+    def OnClose(self, event = None):
+        """!Close dialog"""
+        self.Close()
+
+    def OnRun(self, event):
+        """!Import/Link data (each layes as separate vector map)"""
+        pass
+
+    def OnCmdDialog(self, event):
+        """!Show command dialog"""
+        pass
+    
+    def AddLayers(self, returncode, cmd = None):
+        """!Add imported/linked layers into layer tree"""
+        if not self.add.IsChecked() or returncode != 0:
+            return
+        
+        self.commandId += 1
+        maptree = self.parent.curr_page.maptree
+        
+        layer, output = self.list.GetLayers()[self.commandId]
+        
+        if '@' not in output:
+            name = output + '@' + grass.gisenv()['MAPSET']
+        else:
+            name = output
+        
+        # add imported layers into layer tree
+        if self.importType == 'gdal':
+            cmd = ['d.rast',
+                   'map=%s' % name]
+            if UserSettings.Get(group = 'cmd', key = 'rasterOverlay', subkey = 'enabled'):
+                cmd.append('-o')
+            
+            item = maptree.AddLayer(ltype = 'raster',
+                                    lname = name, lchecked = False,
+                                    lcmd = cmd, multiple = False)
+        else:
+            item = maptree.AddLayer(ltype = 'vector',
+                                    lname = name, lchecked = False,
+                                    lcmd = ['d.vect',
+                                            'map=%s' % name],
+                                    multiple = False)
+        
+        maptree.mapdisplay.MapWindow.ZoomToMap()
+        
+    def OnAbort(self, event):
+        """!Abort running import
+
+        @todo not yet implemented
+        """
+        pass
+
+class GdalImportDialog(ImportDialog):
+    def __init__(self, parent, ogr = False, link = False):
+        """!Dialog for bulk import of various raster/vector data
+
+        @param parent parent window
+        @param ogr True for OGR (vector) otherwise GDAL (raster)
+        @param link True for linking data otherwise importing data
+        """
+        self.link = link
+        self.ogr  = ogr
+        
+        if ogr:
+            ImportDialog.__init__(self, parent, itype = 'ogr')
+            if link:
+                self.SetTitle(_("Link external vector data"))
+            else:
+                self.SetTitle(_("Import vector data"))
+        else:
+            ImportDialog.__init__(self, parent, itype = 'gdal') 
+            if link:
+                self.SetTitle(_("Link external raster data"))
+            else:
+                self.SetTitle(_("Import raster data"))
+        
+        self.dsnInput = GdalSelect(parent = self, panel = self.panel,
+                                   ogr = ogr, link = link)
+        
+        if link:
+            self.add.SetLabel(_("Add linked layers into layer tree"))
+        else:
+            self.add.SetLabel(_("Add imported layers into layer tree"))
+        
+        self.add.SetValue(UserSettings.Get(group = 'cmd', key = 'addNewLayer', subkey = 'enabled'))
+
+        if link:
+            self.btn_run.SetLabel(_("&Link"))
+            self.btn_run.SetToolTipString(_("Link selected layers"))
+            if ogr:
+                self.btn_cmd.SetToolTipString(_('Open %s dialog') % 'v.external')
+            else:
+                self.btn_cmd.SetToolTipString(_('Open %s dialog') % 'r.external')
+        else:
+            self.btn_run.SetLabel(_("&Import"))
+            self.btn_run.SetToolTipString(_("Import selected layers"))
+            if ogr:
+                self.btn_cmd.SetToolTipString(_('Open %s dialog') % 'v.in.ogr')
+            else:
+                self.btn_cmd.SetToolTipString(_('Open %s dialog') % 'r.in.gdal')
+        
+        self.doLayout()
+
+    def OnRun(self, event):
+        """!Import/Link data (each layes as separate vector map)"""
+        self.commandId = -1
+        data = self.list.GetLayers()
+        if not data:
+            GMessage(_("No layers selected. Operation canceled."),
+                     parent = self)
+            return
+        
+        dsn  = self.dsnInput.GetDsn()
+        ext  = self.dsnInput.GetFormatExt()
+        
+        # determine data driver for PostGIS links
+        popOGR = False
+        if self.importType == 'ogr' and \
+                self.dsnInput.GetType() == 'db' and \
+                self.dsnInput.GetFormat() == 'PostgreSQL' and \
+                'GRASS_VECTOR_OGR' not in os.environ:
+            popOGR = True
+            os.environ['GRASS_VECTOR_OGR'] = '1'
+        
+        for layer, output in data:
+            if self.importType == 'ogr':
+                if ext and layer.rfind(ext) > -1:
+                    layer = layer.replace('.' + ext, '')
+                if self.link:
+                    cmd = ['v.external',
+                           'dsn=%s' % dsn,
+                           'output=%s' % output,
+                           'layer=%s' % layer]
+                else:
+                    cmd = ['v.in.ogr',
+                           'dsn=%s' % dsn,
+                           'layer=%s' % layer,
+                           'output=%s' % output]
+            else: # gdal
+                if self.dsnInput.GetType() == 'dir':
+                    idsn = os.path.join(dsn, layer)
+                else:
+                    idsn = dsn
+                
+                if self.link:
+                    cmd = ['r.external',
+                           'input=%s' % idsn,
+                           'output=%s' % output]
+                else:
+                    cmd = ['r.in.gdal',
+                           'input=%s' % idsn,
+                           'output=%s' % output]
+            
+            if self.overwrite.IsChecked():
+                cmd.append('--overwrite')
+            
+            for key in self.options.keys():
+                if self.options[key].IsChecked():
+                    cmd.append('-%s' % key)
+            
+            if UserSettings.Get(group = 'cmd', key = 'overwrite', subkey = 'enabled') and \
+                    '--overwrite' not in cmd:
+                cmd.append('--overwrite')
+            
+            # run in Layer Manager
+            self.parent.goutput.RunCmd(cmd, switchPage = True,
+                                       onDone = self.AddLayers)
+        
+        if popOGR:
+            os.environ.pop('GRASS_VECTOR_OGR')
+
+        if self.closeOnFinish.IsChecked():
+            self.Close()
+        
+    def _getCommand(self):
+        """!Get command"""
+        if self.link:
+            if self.ogr:
+                return 'v.external'
+            else:
+                return 'r.external'
+        else:
+            if self.ogr:
+                return 'v.in.ogr'
+            else:
+                return 'r.in.gdal'
+        
+        return ''
+    
+    def OnCmdDialog(self, event):
+        """!Show command dialog"""
+        name = self._getCommand()
+        GUI(parent = self, modal = False).ParseCommand(cmd = [name])
+           
+class DxfImportDialog(ImportDialog):
+    """!Dialog for bulk import of DXF layers""" 
+    def __init__(self, parent):
+        ImportDialog.__init__(self, parent, itype = 'dxf',
+                              title = _("Import DXF layers"))
+        
+        self.dsnInput = filebrowse.FileBrowseButton(parent = self.panel, id = wx.ID_ANY, 
+                                                    size = globalvar.DIALOG_GSELECT_SIZE, labelText = '',
+                                                    dialogTitle = _('Choose DXF file to import'),
+                                                    buttonText = _('Browse'),
+                                                    startDirectory = os.getcwd(), fileMode = 0,
+                                                    changeCallback = self.OnSetDsn,
+                                                    fileMask = "DXF File (*.dxf)|*.dxf")
+        
+        self.add.SetLabel(_("Add imported layers into layer tree"))
+        
+        self.add.SetValue(UserSettings.Get(group = 'cmd', key = 'addNewLayer', subkey = 'enabled'))
+        
+        self.doLayout()
+
+    def _getCommand(self):
+        """!Get command"""
+        return 'v.in.dxf'
+    
+    def OnRun(self, event):
+        """!Import/Link data (each layes as separate vector map)"""
+        data = self.list.GetLayers()
+        
+        # hide dialog
+        self.Hide()
+        
+        inputDxf = self.dsnInput.GetValue()
+        
+        for layer, output in data:
+            cmd = ['v.in.dxf',
+                   'input=%s' % inputDxf,
+                   'layers=%s' % layer,
+                   'output=%s' % output]
+
+            for key in self.options.keys():
+                if self.options[key].IsChecked():
+                    cmd.append('-%s' % key)
+            
+            if self.overwrite.IsChecked() or \
+                    UserSettings.Get(group = 'cmd', key = 'overwrite', subkey = 'enabled'):
+                cmd.append('--overwrite')
+            
+            # run in Layer Manager
+            self.parent.goutput.RunCmd(cmd, switchPage = True,
+                                       onDone = self.AddLayers)
+        
+        self.OnCancel()
+
+    def OnSetDsn(self, event):
+        """!Input DXF file defined, update list of layer widget"""
+        path = event.GetString()
+        if not path:
+            return 
+        
+        data = list()        
+        ret = RunCommand('v.in.dxf',
+                         quiet = True,
+                         parent = self,
+                         read = True,
+                         flags = 'l',
+                         input = path)
+        if not ret:
+            self.list.LoadData()
+            self.btn_run.Enable(False)
+            return
+            
+        for line in ret.splitlines():
+            layerId = line.split(':')[0].split(' ')[1]
+            layerName = line.split(':')[1].strip()
+            grassName = GetValidLayerName(layerName)
+            data.append((layerId, layerName.strip(), grassName.strip()))
+        
+        self.list.LoadData(data)
+        if len(data) > 0:
+            self.btn_run.Enable(True)
+        else:
+            self.btn_run.Enable(False)
+
+    def OnCmdDialog(self, event):
+        """!Show command dialog"""
+        GUI(parent = self, modal = True).ParseCommand(cmd = ['v.in.dxf'])
+                
+class LayersList(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin,
+                 listmix.CheckListCtrlMixin, listmix.TextEditMixin):
+    """!List of layers to be imported (dxf, shp...)"""
+    def __init__(self, parent, columns, log = None):
+        self.parent = parent
+        
+        wx.ListCtrl.__init__(self, parent, wx.ID_ANY,
+                             style = wx.LC_REPORT)
+        listmix.CheckListCtrlMixin.__init__(self)
+        self.log = log
+        
+        # setup mixins
+        listmix.ListCtrlAutoWidthMixin.__init__(self)
+        listmix.TextEditMixin.__init__(self)
+        
+        for i in range(len(columns)):
+            self.InsertColumn(i, columns[i])
+        
+        if len(columns) == 3:
+            width = (65, 200)
+        else:
+            width = (65, 180, 110)
+        
+        for i in range(len(width)):
+            self.SetColumnWidth(col = i, width = width[i])
+        
+        self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnPopupMenu) #wxMSW
+        self.Bind(wx.EVT_RIGHT_UP,            self.OnPopupMenu) #wxGTK
+
+    def LoadData(self, data = None):
+        """!Load data into list"""
+        self.DeleteAllItems()
+        if data is None:
+            return
+        
+        for item in data:
+            index = self.InsertStringItem(sys.maxint, str(item[0]))
+            for i in range(1, len(item)):
+                self.SetStringItem(index, i, "%s" % str(item[i]))
+        
+        # check by default only on one item
+        if len(data) == 1:
+            self.CheckItem(index, True)
+        
+    def OnPopupMenu(self, event):
+        """!Show popup menu"""
+        if self.GetItemCount() < 1:
+            return
+        
+        if not hasattr(self, "popupDataID1"):
+            self.popupDataID1 = wx.NewId()
+            self.popupDataID2 = wx.NewId()
+            
+            self.Bind(wx.EVT_MENU, self.OnSelectAll,  id = self.popupDataID1)
+            self.Bind(wx.EVT_MENU, self.OnSelectNone, id = self.popupDataID2)
+        
+        # generate popup-menu
+        menu = wx.Menu()
+        menu.Append(self.popupDataID1, _("Select all"))
+        menu.Append(self.popupDataID2, _("Deselect all"))
+        
+        self.PopupMenu(menu)
+        menu.Destroy()
+
+    def OnSelectAll(self, event):
+        """!Select all items"""
+        item = -1
+        
+        while True:
+            item = self.GetNextItem(item)
+            if item == -1:
+                break
+            self.CheckItem(item, True)
+        
+        event.Skip()
+        
+    def OnSelectNone(self, event):
+        """!Deselect items"""
+        item = -1
+        
+        while True:
+            item = self.GetNextItem(item, wx.LIST_STATE_SELECTED)
+            if item == -1:
+                break
+            self.CheckItem(item, False)
+        
+        event.Skip()
+        
+    def OnLeftDown(self, event):
+        """!Allow editing only output name
+        
+        Code taken from TextEditMixin class.
+        """
+        x, y = event.GetPosition()
+        
+        colLocs = [0]
+        loc = 0
+        for n in range(self.GetColumnCount()):
+            loc = loc + self.GetColumnWidth(n)
+            colLocs.append(loc)
+        
+        col = bisect(colLocs, x + self.GetScrollPos(wx.HORIZONTAL)) - 1
+        
+        if col == self.GetColumnCount() - 1:
+            listmix.TextEditMixin.OnLeftDown(self, event)
+        else:
+            event.Skip()
+        
+    def GetLayers(self):
+        """!Get list of layers (layer name, output name)"""
+        data = []
+        item = -1
+        while True:
+            item = self.GetNextItem(item)
+            if item == -1:
+                break
+            if not self.IsChecked(item):
+                continue
+            # layer / output name
+            data.append((self.GetItem(item, 1).GetText(),
+                         self.GetItem(item, self.GetColumnCount() - 1).GetText()))
+        
+        return data
+
+class SetOpacityDialog(wx.Dialog):
+    """!Set opacity of map layers"""
+    def __init__(self, parent, id = wx.ID_ANY, title = _("Set Map Layer Opacity"),
+                 size = wx.DefaultSize, pos = wx.DefaultPosition,
+                 style = wx.DEFAULT_DIALOG_STYLE, opacity = 100):
+
+        self.parent = parent    # GMFrame
+        self.opacity = opacity  # current opacity
+
+        super(SetOpacityDialog, self).__init__(parent, id = id, pos = pos,
+                                               size = size, style = style, title = title)
+
+        panel = wx.Panel(parent = self, id = wx.ID_ANY)
+        
+        sizer = wx.BoxSizer(wx.VERTICAL)
+
+        box = wx.GridBagSizer(vgap = 5, hgap = 5)
+        self.value = wx.Slider(panel, id = wx.ID_ANY, value = self.opacity,
+                               style = wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | \
+                                   wx.SL_TOP | wx.SL_LABELS,
+                               minValue = 0, maxValue = 100,
+                               size = (350, -1))
+
+        box.Add(item = self.value,
+                flag = wx.ALIGN_CENTRE, pos = (0, 0), span = (1, 2))
+        box.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                   label = _("transparent")),
+                pos = (1, 0))
+        box.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                   label = _("opaque")),
+                flag = wx.ALIGN_RIGHT,
+                pos = (1, 1))
+
+        sizer.Add(item = box, proportion = 0,
+                  flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border = 5)
+
+        line  =  wx.StaticLine(parent = panel, id = wx.ID_ANY,
+                             style = wx.LI_HORIZONTAL)
+        sizer.Add(item = line, proportion = 0,
+                  flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border = 5)
+
+        # buttons
+        btnsizer = wx.StdDialogButtonSizer()
+
+        btnOK = wx.Button(parent = panel, id = wx.ID_OK)
+        btnOK.SetDefault()
+        btnsizer.AddButton(btnOK)
+
+        btnCancel = wx.Button(parent = panel, id = wx.ID_CANCEL)
+        btnsizer.AddButton(btnCancel)
+
+        btnApply = wx.Button(parent = panel, id = wx.ID_APPLY)
+        btnApply.Bind(wx.EVT_BUTTON, self.OnApply)
+        btnsizer.AddButton(btnApply)
+        btnsizer.Realize()
+
+        sizer.Add(item = btnsizer, proportion = 0,
+                  flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border = 5)
+
+        panel.SetSizer(sizer)
+        sizer.Fit(panel)
+
+        self.SetSize(self.GetBestSize())
+
+        self.Layout()
+
+    def GetOpacity(self):
+        """!Button 'OK' pressed"""
+        # return opacity value
+        opacity = float(self.value.GetValue()) / 100
+        return opacity
+
+    def OnApply(self, event):
+        event = wxApplyOpacity(value = self.GetOpacity())
+        wx.PostEvent(self, event)
+
+def GetImageHandlers(image):
+    """!Get list of supported image handlers"""
+    lext = list()
+    ltype = list()
+    for h in image.GetHandlers():
+        lext.append(h.GetExtension())
+        
+    filetype = ''
+    if 'png' in lext:
+        filetype += "PNG file (*.png)|*.png|"
+        ltype.append({ 'type' : wx.BITMAP_TYPE_PNG,
+                       'ext'  : 'png' })
+    filetype +=  "BMP file (*.bmp)|*.bmp|"
+    ltype.append({ 'type' : wx.BITMAP_TYPE_BMP,
+                   'ext'  : 'bmp' })
+    if 'gif' in lext:
+        filetype += "GIF file (*.gif)|*.gif|"
+        ltype.append({ 'type' : wx.BITMAP_TYPE_GIF,
+                       'ext'  : 'gif' })
+        
+    if 'jpg' in lext:
+        filetype += "JPG file (*.jpg)|*.jpg|"
+        ltype.append({ 'type' : wx.BITMAP_TYPE_JPEG,
+                       'ext'  : 'jpg' })
+
+    if 'pcx' in lext:
+        filetype += "PCX file (*.pcx)|*.pcx|"
+        ltype.append({ 'type' : wx.BITMAP_TYPE_PCX,
+                       'ext'  : 'pcx' })
+        
+    if 'pnm' in lext:
+        filetype += "PNM file (*.pnm)|*.pnm|"
+        ltype.append({ 'type' : wx.BITMAP_TYPE_PNM,
+                       'ext'  : 'pnm' })
+
+    if 'tif' in lext:
+        filetype += "TIF file (*.tif)|*.tif|"
+        ltype.append({ 'type' : wx.BITMAP_TYPE_TIF,
+                       'ext'  : 'tif' })
+
+    if 'xpm' in lext:
+        filetype += "XPM file (*.xpm)|*.xpm"
+        ltype.append({ 'type' : wx.BITMAP_TYPE_XPM,
+                       'ext'  : 'xpm' })
+    
+    return filetype, ltype
+
+class ImageSizeDialog(wx.Dialog):
+    """!Set size for saved graphic file"""
+    def __init__(self, parent, id = wx.ID_ANY, title = _("Set image size"),
+                 style = wx.DEFAULT_DIALOG_STYLE, **kwargs):
+        self.parent = parent
+        
+        wx.Dialog.__init__(self, parent, id = id, style = style, title = title, **kwargs)
+        
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
+        
+        self.box = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                label = ' % s' % _("Image size"))
+        
+        size = self.parent.GetWindow().GetClientSize()
+        self.width = wx.SpinCtrl(parent = self.panel, id = wx.ID_ANY,
+                                 style = wx.SP_ARROW_KEYS)
+        self.width.SetRange(20, 1e6)
+        self.width.SetValue(size.width)
+        wx.CallAfter(self.width.SetFocus)
+        self.height = wx.SpinCtrl(parent = self.panel, id = wx.ID_ANY,
+                                  style = wx.SP_ARROW_KEYS)
+        self.height.SetRange(20, 1e6)
+        self.height.SetValue(size.height)
+        self.template = wx.Choice(parent = self.panel, id = wx.ID_ANY,
+                                  size = (125, -1),
+                                  choices = [ "",
+                                              "640x480",
+                                              "800x600",
+                                              "1024x768",
+                                              "1280x960",
+                                              "1600x1200",
+                                              "1920x1440" ])
+        
+        self.btnOK = wx.Button(parent = self.panel, id = wx.ID_OK)
+        self.btnOK.SetDefault()
+        self.btnCancel = wx.Button(parent = self.panel, id = wx.ID_CANCEL)
+        
+        self.template.Bind(wx.EVT_CHOICE, self.OnTemplate)
+        
+        self._layout()
+        self.SetSize(self.GetBestSize())
+        
+    def _layout(self):
+        """!Do layout"""
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        
+        # body
+        box = wx.StaticBoxSizer(self.box, wx.HORIZONTAL)
+        fbox = wx.FlexGridSizer(cols = 2, vgap = 5, hgap = 5)
+        fbox.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                      label = _("Width:")),
+                 flag = wx.ALIGN_CENTER_VERTICAL)
+        fbox.Add(item = self.width)
+        fbox.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                      label = _("Height:")),
+                 flag = wx.ALIGN_CENTER_VERTICAL)
+        fbox.Add(item = self.height)
+        fbox.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                      label = _("Template:")),
+                 flag = wx.ALIGN_CENTER_VERTICAL)
+        fbox.Add(item = self.template)
+        
+        box.Add(item = fbox, proportion = 1,
+                flag = wx.EXPAND | wx.ALL, border = 5)
+        sizer.Add(item = box, proportion = 1,
+                  flag = wx.EXPAND | wx.ALL, border = 3)
+        
+        # buttons
+        btnsizer = wx.StdDialogButtonSizer()
+        btnsizer.AddButton(self.btnOK)
+        btnsizer.AddButton(self.btnCancel)
+        btnsizer.Realize()
+
+        sizer.Add(item = btnsizer, proportion = 0,
+                  flag = wx.EXPAND | wx.ALIGN_RIGHT | wx.ALL, border = 5)
+        
+        self.panel.SetSizer(sizer)
+        sizer.Fit(self.panel)
+        self.Layout()
+    
+    def GetValues(self):
+        """!Get width/height values"""
+        return self.width.GetValue(), self.height.GetValue()
+    
+    def OnTemplate(self, event):
+        """!Template selected"""
+        sel = event.GetString()
+        if not sel:
+            width, height = self.parent.GetWindow().GetClientSize()
+        else:
+            width, height = map(int, sel.split('x'))
+        self.width.SetValue(width)
+        self.height.SetValue(height)
+
+class SymbolDialog(wx.Dialog):
+    """!Dialog for GRASS symbols selection.
+    
+    Dialog is called in gui_core::forms module.
+    """
+    def __init__(self, parent, symbolPath, currentSymbol = None, title = _("Symbols")):
+        """!Dialog constructor.
+        
+        It is assumed that symbolPath contains folders with symbols.
+        
+        @param parent dialog parent
+        @param symbolPath absolute path to symbols
+        @param currentSymbol currently selected symbol (e.g. 'basic/x')
+        @param title dialog title
+        """
+        wx.Dialog.__init__(self, parent = parent, title = title, id = wx.ID_ANY)
+        
+        self.symbolPath = symbolPath
+        self.currentSymbol = currentSymbol # default basic/x
+        self.selected = None
+        self.selectedDir = None
+        
+        self._layout()
+        
+    def _layout(self):
+        mainPanel = wx.Panel(self, id = wx.ID_ANY)
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        vSizer = wx.BoxSizer( wx.VERTICAL)
+        fgSizer = wx.FlexGridSizer(rows = 2, vgap = 5, hgap = 5)
+        self.folderChoice = wx.Choice(mainPanel, id = wx.ID_ANY, choices = os.listdir(self.symbolPath))
+        self.folderChoice.Bind(wx.EVT_CHOICE, self.OnFolderSelect)
+        
+        fgSizer.Add(item = wx.StaticText(mainPanel, id = wx.ID_ANY, label = _("Symbol directory:")),
+                   proportion = 0,
+                   flag = wx.ALIGN_CENTER_VERTICAL)
+                   
+        fgSizer.Add(item = self.folderChoice, proportion = 0,
+                   flag = wx.ALIGN_CENTER, border = 0)
+                   
+        self.infoLabel = wx.StaticText(mainPanel, id = wx.ID_ANY)
+        fgSizer.Add(wx.StaticText(mainPanel, id = wx.ID_ANY, label = _("Symbol name:")), 
+                    flag = wx.ALIGN_CENTRE_VERTICAL)
+        fgSizer.Add(self.infoLabel, proportion = 0, 
+                    flag = wx.ALIGN_CENTRE_VERTICAL)
+        vSizer.Add(fgSizer, proportion = 0, flag = wx.ALL, border = 5)
+        
+        self.panels = self._createSymbolPanels(mainPanel)
+        for panel in self.panels:
+            vSizer.Add(panel, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+            panel.Bind(EVT_SYMBOL_SELECTION_CHANGED, self.SelectionChanged)
+        
+        mainSizer.Add(vSizer, proportion = 1, flag = wx.ALL| wx.EXPAND, border = 5)
+        self.btnCancel = wx.Button(parent = mainPanel, id = wx.ID_CANCEL)
+        self.btnOK     = wx.Button(parent = mainPanel, id = wx.ID_OK)
+        self.btnOK.SetDefault()
+        self.btnOK.Enable(False)
+        
+        # buttons
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(self.btnCancel)
+        btnSizer.AddButton(self.btnOK)
+        btnSizer.Realize()
+        mainSizer.Add(item = btnSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL, border = 5)
+                      
+        # show panel with the largest number of images and fit size
+        count = []
+        for folder in os.listdir(self.symbolPath):
+            count.append(len(os.listdir(os.path.join(self.symbolPath, folder))))
+            
+        index = count.index(max(count))
+        self.folderChoice.SetSelection(index)
+        self.OnFolderSelect(None)
+        self.infoLabel.Show()
+        
+        mainPanel.SetSizerAndFit(mainSizer)
+        self.SetSize(self.GetBestSize())
+        
+        # show currently selected symbol
+        if self.currentSymbol:
+            # set directory
+            self.selectedDir, self.selected = os.path.split(self.currentSymbol)
+            self.folderChoice.SetStringSelection(self.selectedDir)
+            # select symbol
+            panelIdx = self.folderChoice.GetSelection()
+            for panel in self.symbolPanels[panelIdx]:
+                if panel.GetName() == self.selected:
+                    panel.Select()
+        else:
+            self.folderChoice.SetSelection(0)
+            
+        self.OnFolderSelect(None)
+        
+    def _createSymbolPanels(self, parent):
+        """!Creates multiple panels with symbols.
+        
+        Panels are shown/hidden according to selected folder."""
+        folders = os.listdir(self.symbolPath)
+        
+        panels = []
+        self.symbolPanels = []
+        maxImages = 0
+        
+        for folder in folders:
+            panel = wx.Panel(parent, style = wx.BORDER_RAISED)
+            sizer = wx.GridSizer(cols = 6, vgap = 3, hgap = 3)
+            images = self._getSymbols(path = os.path.join(self.symbolPath, folder))
+        
+            symbolPanels = []
+            for img in images:
+                iP = SingleSymbolPanel(parent = panel, symbolPath = img)
+                sizer.Add(item = iP, proportion = 0, flag = wx.ALIGN_CENTER)
+                symbolPanels.append(iP)
+            
+            panel.SetSizerAndFit(sizer)
+            panel.Hide()
+            panels.append(panel)
+            self.symbolPanels.append(symbolPanels)
+            
+        return panels
+        
+    def _getSymbols(self, path):
+        # we assume that images are in subfolders (1 level only)
+        imageList = []
+        for image in os.listdir(path):
+            imageList.append(os.path.join(path, image))
+                
+        return sorted(imageList)
+            
+    def OnFolderSelect(self, event):
+        """!Selected folder with symbols changed."""
+        idx = self.folderChoice.GetSelection()
+        for i in range(len(self.panels)):
+            sizer = self.panels[i].GetContainingSizer()
+            sizer.Show(self.panels[i], i == idx, recursive = True)
+            sizer.Layout()
+        
+        if self.selectedDir == self.folderChoice.GetStringSelection():
+            self.btnOK.Enable()
+            self.infoLabel.SetLabel(self.selected)
+        else:
+            self.btnOK.Disable()
+            self.infoLabel.SetLabel('')
+        
+    def SelectionChanged(self, event):
+        """!Selected symbol changed."""
+        if event.doubleClick:
+            self.EndModal(wx.ID_OK)
+        # deselect all
+        for i in range(len(self.panels)):
+            for panel in self.symbolPanels[i]:
+                if panel.GetName() != event.name:
+                    panel.Deselect()
+                
+        self.btnOK.Enable()
+        
+        self.selected = event.name
+        self.selectedDir = self.folderChoice.GetStringSelection()
+        
+        self.infoLabel.SetLabel(event.name)
+        
+    def GetSelectedSymbolName(self):
+        """!Returns currently selected symbol name (e.g. 'basic/x').
+        """ 
+        # separator must be '/' and not dependent on OS
+        return self.selectedDir + '/' + self.selected
+
+    def GetSelectedSymbolPath(self):
+        """!Returns currently selected symbol full path.
+        """
+        return os.path.join(self.symbolPath, self.selectedDir, self.selected)
+
+class TextEntryDialog(wx.Dialog):
+    """!Simple dialog with text field. 
+
+    It differs from wx.TextEntryDialog because it allows adding validator.
+    """
+    def __init__(self, parent, message, caption='',
+                 defaultValue='', pos=wx.DefaultPosition, validator=wx.DefaultValidator,
+                 style=wx.OK | wx.CANCEL):
+        wx.Dialog.__init__(self, parent=parent, id=wx.ID_ANY, title=caption, pos=pos)
+
+        vbox = wx.BoxSizer(wx.VERTICAL)
+
+        stline = wx.StaticText(self, id=wx.ID_ANY, label=message)
+        vbox.Add(item=stline, proportion=0, flag=wx.EXPAND | wx.ALL, border=10)
+
+        self._textCtrl = wx.TextCtrl(self, id=wx.ID_ANY, size = (300, -1),
+                                     value=defaultValue, validator=validator)
+        vbox.Add(item=self._textCtrl, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=10)
+        self._textCtrl.SetFocus()
+
+        sizer = self.CreateSeparatedButtonSizer(style)
+        vbox.Add(item=sizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)
+
+        self.SetSizerAndFit(vbox)
+        
+    def GetValue(self):
+        return self._textCtrl.GetValue()
+
+    def SetValue(self, value):
+        self._textCtrl.SetValue(value)
+
+
+class HyperlinkDialog(wx.Dialog):
+    """!Dialog for displaying message with hyperlink."""
+    def __init__(self, parent, title, message, hyperlink,
+                hyperlinkLabel=None, style=wx.OK):
+        """!Constructor
+
+        @param parent gui parent         
+        @param title dialog title
+        @param message message
+        @param hyperlink url
+        @param hyperlinkLabel label shown instead of url
+        @param style button style
+        """
+        wx.Dialog.__init__(self, parent=parent, id=wx.ID_ANY, title=title,
+                           style=wx.DEFAULT_DIALOG_STYLE)
+
+        sizer = wx.BoxSizer(wx.VERTICAL)
+
+        label = wx.StaticText(self, label=message)
+        sizer.Add(item=label, proportion=0, flag=wx.ALIGN_CENTRE|wx.ALL, border=10)
+        hyperlinkLabel = hyperlinkLabel if hyperlinkLabel else hyperlink
+        hyperlinkCtrl = wx.HyperlinkCtrl(self, id=wx.ID_ANY,
+                                         label=hyperlinkLabel, url=hyperlink,
+                                         style=wx.HL_ALIGN_LEFT|wx.HL_CONTEXTMENU)
+        sizer.Add(item=hyperlinkCtrl, proportion=0, flag=wx.EXPAND|wx.ALL, border=10)        
+
+        btnsizer = self.CreateSeparatedButtonSizer(style)
+        sizer.Add(item=btnsizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=10)
+    
+        self.SetSizer(sizer)
+        sizer.Fit(self)
diff --git a/gui/wxpython/gui_modules/menuform.py b/gui/wxpython/gui_core/forms.py
similarity index 87%
rename from gui/wxpython/gui_modules/menuform.py
rename to gui/wxpython/gui_core/forms.py
index f0fdb56..dc8fb55 100644
--- a/gui/wxpython/gui_modules/menuform.py
+++ b/gui/wxpython/gui_core/forms.py
@@ -1,16 +1,16 @@
-#!/usr/bin/env python
 """
- at brief Construct simple wx.Python GUI from a GRASS command interface
+ at package gui_core.forms
+
+ at brief Construct simple wxPython GUI from a GRASS command interface
 description.
 
 Classes:
- - helpPanel
- - mainFrame
- - cmdPanel
- - GrassGUIApp
- - GUI
- - FloatValidator
- - GNotebook
+ - forms::UpdateThread
+ - forms::UpdateQThread
+ - forms::TaskFrame
+ - forms::CmdPanel
+ - forms::GUI
+ - forms::GrassGUIApp
 
 This program is just a coarse approach to automatically build a GUI
 from a xml-based GRASS user interface description.
@@ -25,7 +25,15 @@ python <this file.py> r.basins.fill
 Or you set an alias or wrap the call up in a nice shell script, GUI
 environment ... please contribute your idea.
 
-Copyright(C) 2000-2011 by the GRASS Development Team
+Updated to wxPython 2.8 syntax and contrib widgets.  Methods added to
+make it callable by gui.  Method added to automatically re-run with
+pythonw on a Mac.
+
+ at todo
+ - verify option value types
+
+Copyright(C) 2000-2012 by the GRASS Development Team
+
 This program is free software under the GPL(>=v2) Read the file
 COPYING coming with GRASS for details.
 
@@ -34,39 +42,38 @@ COPYING coming with GRASS for details.
 @author Michael Barton, Arizona State University
 @author Daniel Calvelo <dca.gis at gmail.com>
 @author Martin Landa <landa.martin at gmail.com>
-
- at todo
- - verify option value types
+ at author Luca Delucchi <lucadeluge at gmail.com>
 """
 
 import sys
-import re
 import string
 import textwrap
 import os
 import time
 import copy
 import locale
-import types
 from threading import Thread
 import Queue
-import tempfile
+import re
 
-### i18N
-import gettext
-gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
+gisbase = os.getenv("GISBASE")
+if gisbase is None:
+    print >>sys.stderr, "We don't seem to be properly installed, or we are being run outside GRASS. Expect glitches."
+    gisbase = os.path.join(os.path.dirname(sys.argv[0]), os.path.pardir)
+    wxbase = gisbase
+else:
+    wxbase = os.path.join(gisbase, 'etc', 'wxpython')
+
+sys.path.append(wxbase)
 
-import globalvar
+from core import globalvar
 import wx
-import wx.html
 try:
     import wx.lib.agw.flatnotebook as FN
 except ImportError:
     import wx.lib.flatnotebook as FN
-import wx.lib.colourselect as csel
+import wx.lib.colourselect     as csel
 import wx.lib.filebrowsebutton as filebrowse
-import wx.lib.scrolledpanel as scrolled
-from wx.lib.expando import ExpandoTextCtrl, EVT_ETC_LAYOUT_NEEDED
 from wx.lib.newevent import NewEvent
 
 try:
@@ -74,31 +81,16 @@ try:
 except ImportError:
     import elementtree.ElementTree as etree # Python <= 2.4
 
-import gdialogs
-from ghelp import HelpPanel
-
-gisbase = os.getenv("GISBASE")
-if gisbase is None:
-    print >>sys.stderr, "We don't seem to be properly installed, or we are being run outside GRASS. Expect glitches."
-    gisbase = os.path.join(os.path.dirname(sys.argv[0]), os.path.pardir)
-    wxbase = gisbase
-else:
-    wxbase = os.path.join(globalvar.ETCWXDIR)
-
-sys.path.append(wxbase)
-
 from grass.script import core as grass
 from grass.script import task as gtask
 
-import gselect
-import gcmd
-import goutput
-import utils
-from preferences import globalSettings as UserSettings
-try:
-    import subprocess
-except:
-    from compat import subprocess
+from gui_core.widgets import StaticWrapText, ScrolledPanel
+from gui_core.ghelp   import HelpPanel
+from gui_core         import gselect
+from core             import gcmd
+from core             import utils
+from core.settings    import UserSettings
+from gui_core.widgets import FloatValidator, GNotebook
 
 wxUpdateDialog, EVT_DIALOG_UPDATE = NewEvent()
 
@@ -219,11 +211,13 @@ class UpdateThread(Thread):
                 continue
             
             name = win.GetName()
+            pBind = self.task.get_param(uid, element = 'wxId', raiseError = False)
+            if pBind:
+                pBind['value'] = ''
             
             if name == 'LayerSelect':
                 if map in cparams and not cparams[map]['layers']:
                     win.InsertLayers(vector = map)
-                    win.Reset()
                     cparams[map]['layers'] = win.GetItems()
             
             elif name == 'TableSelect':
@@ -273,9 +267,7 @@ class UpdateThread(Thread):
                             self.data[win.InsertTableColumns] = { 'table'  : pTable.get('value') }
             
             elif name == 'SubGroupSelect':
-                pGroup = self.task.get_param('group', element = 'element', raiseError = False)
-                if pGroup:
-                    self.data[win.Insert] = { 'group' : pGroup.get('value', '')}
+                self.data[win.Insert] = { 'group' : p.get('value', '')}
             
             elif name == 'LocationSelect':
                 pDbase = self.task.get_param('dbase', element = 'element', raiseError = False)
@@ -307,7 +299,7 @@ class UpdateQThread(Thread):
     def __init__(self, parent, requestQ, resultQ, **kwds):
         Thread.__init__(self, **kwds)
         
-        self.parent = parent # cmdPanel
+        self.parent = parent # CmdPanel
         self.setDaemon(True)
         
         self.requestQ = requestQ
@@ -337,7 +329,7 @@ class UpdateQThread(Thread):
                 event = wxUpdateDialog(data = self.request.data)
                 wx.PostEvent(self.parent, event)
     
-class mainFrame(wx.Frame):
+class TaskFrame(wx.Frame):
     """!This is the Frame containing the dialog for options input.
 
     The dialog is organized in a notebook according to the guisections
@@ -411,8 +403,8 @@ class mainFrame(wx.Frame):
             module_desc = self.task.label + ' ' + self.task.description
         else:
             module_desc = self.task.description
-        self.description = gdialogs.StaticWrapText(parent = self.panel,
-                                                   label = module_desc)
+        self.description = StaticWrapText(parent = self.panel,
+                                          label = module_desc)
         topsizer.Add(item = self.description, proportion = 1, border = 5,
                      flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
         
@@ -422,8 +414,8 @@ class mainFrame(wx.Frame):
         self.Layout()
         
         # notebooks
-        self.notebookpanel = cmdPanel(parent = self.panel, task = self.task,
-                                      mainFrame = self)
+        self.notebookpanel = CmdPanel(parent = self.panel, task = self.task,
+                                      frame = self)
         self.goutput = self.notebookpanel.goutput
         self.notebookpanel.OnUpdateValues = self.updateValuesHook
         guisizer.Add(item = self.notebookpanel, proportion = 1, flag = wx.EXPAND)
@@ -431,7 +423,7 @@ class mainFrame(wx.Frame):
         # status bar
         status_text = _("Enter parameters for '") + self.task.name + "'"
         try:
-            self.task.getCmd()
+            self.task.get_cmd()
             self.updateValuesHook()
         except ValueError:
             self.SetStatusText(status_text)
@@ -443,11 +435,12 @@ class mainFrame(wx.Frame):
         self.btn_cancel.SetToolTipString(_("Close this window without executing the command (Ctrl+Q)"))
         btnsizer.Add(item = self.btn_cancel, proportion = 0, flag = wx.ALL | wx.ALIGN_CENTER, border = 10)
         self.btn_cancel.Bind(wx.EVT_BUTTON, self.OnCancel)
+
         if self.get_dcmd is not None: # A callback has been set up
             btn_apply = wx.Button(parent = self.panel, id = wx.ID_APPLY)
             btn_ok = wx.Button(parent = self.panel, id = wx.ID_OK)
             btn_ok.SetDefault()
-            
+
             btnsizer.Add(item = btn_apply, proportion = 0,
                          flag = wx.ALL | wx.ALIGN_CENTER,
                          border = 10)
@@ -462,8 +455,10 @@ class mainFrame(wx.Frame):
             self.btn_run = wx.Button(parent = self.panel, id = wx.ID_OK, label =  _("&Run"))
             self.btn_run.SetToolTipString(_("Run the command (Ctrl+R)"))
             self.btn_run.SetDefault()
+            self.btn_run.SetForegroundColour(wx.Colour(35, 142, 35))
+            
             # copy
-            self.btn_clipboard = wx.Button(parent = self.panel, id = wx.ID_COPY, label = _("C&opy"))
+            self.btn_clipboard = wx.Button(parent = self.panel, id = wx.ID_COPY)
             self.btn_clipboard.SetToolTipString(_("Copy the current command string to the clipboard (Ctrl+C)"))
             
             btnsizer.Add(item = self.btn_run, proportion = 0,
@@ -548,10 +543,10 @@ class mainFrame(wx.Frame):
         self.SetSize(wx.Size(min(width, 650),
                              min(height, 500)))
         
-        # fix goutput's pane size
-        if self.goutput:
+        # fix goutput's pane size (required for Mac OSX)
+        if self.goutput:  	 	 
             self.goutput.SetSashPosition(int(self.GetSize()[1] * .75))
-
+        
     def updateValuesHook(self, event = None):
         """!Update status bar data"""
         self.SetStatusText(' '.join(self.notebookpanel.createCmd(ignoreErrors = True)))
@@ -597,14 +592,17 @@ class mainFrame(wx.Frame):
         if self.parent.GetName() ==  'LayerTree':
             display = self.parent.GetMapDisplay()
         else: # Layer Manager
-            display = self.parent.GetLayerTree().GetMapDisplay()
+            display = None
+            tree = self.parent.GetLayerTree()
+            if tree:
+                display = tree.GetMapDisplay()
             
         if not display or not display.IsAutoRendered():
             return
         
         mapLayers = map(lambda x: x.GetName(),
-                        display.GetRender().GetListOfLayers(l_type = 'raster') +
-                        display.GetRender().GetListOfLayers(l_type = 'vector'))
+                        display.GetMap().GetListOfLayers(l_type = 'raster') +
+                        display.GetMap().GetListOfLayers(l_type = 'vector'))
         
         task = GUI(show = None).ParseCommand(cmd)
         for p in task.get_options()['params']:
@@ -670,7 +668,8 @@ class mainFrame(wx.Frame):
         
     def OnAbort(self, event):
         """!Abort running command"""
-        event = goutput.wxCmdAbort(aborted = True)
+        from gui_core.goutput import wxCmdAbort
+        event = wxCmdAbort(aborted = True)
         wx.PostEvent(self.goutput, event)
 
     def OnCopy(self, event):
@@ -721,13 +720,13 @@ class mainFrame(wx.Frame):
         return self.notebookpanel.createCmd(ignoreErrors = ignoreErrors,
                                             ignoreRequired = ignoreRequired)
 
-class cmdPanel(wx.Panel):
+class CmdPanel(wx.Panel):
     """!A panel containing a notebook dividing in tabs the different
     guisections of the GRASS cmd.
     """
-    def __init__(self, parent, task, id = wx.ID_ANY, mainFrame = None, *args, **kwargs):
-        if mainFrame:
-            self.parent = mainFrame
+    def __init__(self, parent, task, id = wx.ID_ANY, frame = None, *args, **kwargs):
+        if frame:
+            self.parent = frame
         else:
             self.parent = parent
         self.task = task
@@ -768,14 +767,14 @@ class cmdPanel(wx.Panel):
         panelsizer = wx.BoxSizer(orient = wx.VERTICAL)
 
         # Build notebook
-        self.notebook = GNotebook(self, style = globalvar.FNPageStyle)
+        self.notebook = GNotebook(self, style = globalvar.FNPageStyle | FN.FNB_NO_X_BUTTON )
         self.notebook.SetTabAreaColour(globalvar.FNPageColor)
         self.notebook.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.OnPageChange)
 
         tab = {}
         tabsizer = {}
         for section in sections:
-            tab[section] = scrolled.ScrolledPanel(parent = self.notebook)
+            tab[section] = ScrolledPanel(parent = self.notebook)
             tab[section].SetScrollRate(10, 10)
             tabsizer[section] = wx.BoxSizer(orient = wx.VERTICAL)
             self.notebook.AddPage(page = tab[section], text = section)
@@ -783,13 +782,14 @@ class cmdPanel(wx.Panel):
         # are we running from command line?
         ### add 'command output' tab regardless standalone dialog
         if self.parent.GetName() ==  "MainFrame" and self.parent.get_dcmd is None:
-            self.goutput = goutput.GMConsole(parent = self, margin = False)
+            from gui_core.goutput import GMConsole
+            self.goutput = GMConsole(parent = self, margin = False)
             self.outpage = self.notebook.AddPage(page = self.goutput, text = _("Command output"), name = 'output')
         else:
             self.goutput = None
         
         self.manual_tab = HelpPanel(parent = self, grass_command = self.task.name)
-        if not self.manual_tab.IsFile():
+        if not self.manual_tab.GetFile():
             self.manual_tab.Hide()
         else:
             self.notebook.AddPage(page = self.manual_tab, text = _("Manual"), name = 'manual')
@@ -989,19 +989,37 @@ class cmdPanel(wx.Panel):
                         p['wxId'] = [ txt2.GetId(), ]
                         txt2.Bind(wx.EVT_TEXT, self.OnSetValue)
                     else:
-                        # list of values (combo)
                         title_txt.SetLabel(title + ':')
-                        cb = wx.ComboBox(parent = which_panel, id = wx.ID_ANY, value = p.get('default',''),
-                                         size = globalvar.DIALOG_COMBOBOX_SIZE,
-                                         choices = valuelist, style = wx.CB_DROPDOWN)
                         value = self._getValue(p)
-                        if value:
-                            cb.SetValue(value) # parameter previously set
-                        which_sizer.Add( item=cb, proportion=0,
-                                         flag=wx.ADJUST_MINSIZE | wx.BOTTOM | wx.LEFT, border=5)
-                        p['wxId'] = [ cb.GetId(), ]
-                        cb.Bind( wx.EVT_COMBOBOX, self.OnSetValue)
-                        cb.Bind(wx.EVT_TEXT, self.OnSetValue)
+                        
+                        if p['name'] == 'icon': # symbols
+                            bitmap = wx.Bitmap(os.path.join(globalvar.ETCSYMBOLDIR, value) + '.png')
+                            bb = wx.BitmapButton(parent = which_panel, id = wx.ID_ANY,
+                                                 bitmap = bitmap)
+                            iconLabel = wx.StaticText(parent = which_panel, id = wx.ID_ANY)
+                            iconLabel.SetLabel(value)
+                            p['value'] = value
+                            p['wxId'] = [bb.GetId(), iconLabel.GetId()]
+                            bb.Bind(wx.EVT_BUTTON, self.OnSetSymbol)
+                            this_sizer = wx.BoxSizer(wx.HORIZONTAL)
+                            this_sizer.Add(item = bb, proportion = 0,
+                                            flag = wx.ADJUST_MINSIZE | wx.BOTTOM | wx.LEFT, border = 5)
+                            this_sizer.Add(item = iconLabel, proportion = 0,
+                                            flag = wx.ADJUST_MINSIZE | wx.BOTTOM | wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border = 5)
+                            which_sizer.Add(item = this_sizer, proportion = 0,
+                                            flag = wx.ADJUST_MINSIZE, border = 0)
+                        else:
+                            # list of values (combo)
+                            cb = wx.ComboBox(parent = which_panel, id = wx.ID_ANY, value = p.get('default',''),
+                                             size = globalvar.DIALOG_COMBOBOX_SIZE,
+                                             choices = valuelist, style = wx.CB_DROPDOWN)
+                            if value:
+                                cb.SetValue(value) # parameter previously set
+                            which_sizer.Add(item = cb, proportion = 0,
+                                            flag = wx.ADJUST_MINSIZE | wx.BOTTOM | wx.LEFT, border = 5)
+                            p['wxId'] = [cb.GetId(),]
+                            cb.Bind(wx.EVT_COMBOBOX, self.OnSetValue)
+                            cb.Bind(wx.EVT_TEXT, self.OnSetValue)
             
             # text entry
             if (p.get('type','string') in ('string','integer','float')
@@ -1091,7 +1109,9 @@ class cmdPanel(wx.Panel):
                         selection = gselect.Select(parent = which_panel, id = wx.ID_ANY,
                                                    size = globalvar.DIALOG_GSELECT_SIZE,
                                                    type = p.get('element', ''),
-                                                   multiple = multiple, mapsets = mapsets)
+                                                   multiple = multiple, mapsets = mapsets,
+                                                   fullyQualified = p.get('age', 'old') == 'old')
+                        
                         
                         # A select.Select is a combobox with two children: a textctl and a popupwindow;
                         # we target the textctl here
@@ -1113,6 +1133,7 @@ class cmdPanel(wx.Panel):
                     selection = gselect.SubGroupSelect(parent = which_panel)
                     p['wxId'] = [ selection.GetId() ]
                     selection.Bind(wx.EVT_COMBOBOX, self.OnSetValue)
+                    selection.Bind(wx.EVT_TEXT,     self.OnSetValue)
                     which_sizer.Add(item = selection, proportion = 0,
                                     flag = wx.ADJUST_MINSIZE | wx.BOTTOM | wx.LEFT | wx.RIGHT | wx.TOP | wx.ALIGN_CENTER_VERTICAL,
                                     border = 5)
@@ -1231,21 +1252,36 @@ class cmdPanel(wx.Panel):
                     label_color = _("Select Color")
                     if p.get('default','') !=  '':
                         default_color, label_color = color_resolve(p['default'])
-                    if p.get('value','') !=  '': # parameter previously set
+                    if p.get('value','') !=  '' and p.get('value','') != 'none': # parameter previously set
                         default_color, label_color = color_resolve(p['value'])
-                    if p.get('prompt', '') ==  'color_none':
+                    if p.get('prompt', '') ==  'color_none' or p.get('multiple', False):
                         this_sizer = wx.BoxSizer(orient = wx.HORIZONTAL)
                     else:
                         this_sizer = which_sizer
+                    colorSize = 150
+                    # For color selectors, this is a three-member array, holding the IDs of
+                    # the text control for multiple colors (or None),
+                    # the selector proper and either a "transparent" checkbox or None
+                    if p.get('multiple', False):
+                        txt = wx.TextCtrl(parent = which_panel, id = wx.ID_ANY)
+                        this_sizer.Add(item = txt, proportion = 1,
+                                       flag = wx.ADJUST_MINSIZE | wx.LEFT | wx.TOP, border = 5)
+                        txt.Bind(wx.EVT_TEXT, self.OnSetValue)
+                        colorSize = 40
+                        label_color = ''
+                        p['wxId'] = [txt.GetId(),]
+                        which_sizer.Add(this_sizer, flag = wx.EXPAND | wx.RIGHT, border = 5)
+                    else:
+                        p['wxId'] = [None,]
+
                     btn_colour = csel.ColourSelect(parent = which_panel, id = wx.ID_ANY,
                                                    label = label_color, colour = default_color,
-                                                   pos = wx.DefaultPosition, size = (150,-1))
+                                                   pos = wx.DefaultPosition, size = (colorSize,-1))
                     this_sizer.Add(item = btn_colour, proportion = 0,
                                    flag = wx.ADJUST_MINSIZE | wx.BOTTOM | wx.LEFT, border = 5)
-                    # For color selectors, this is a two-member array, holding the IDs of
-                    # the selector proper and either a "transparent" button or None
-                    p['wxId'] = [btn_colour.GetId(),]
                     btn_colour.Bind(csel.EVT_COLOURSELECT,  self.OnColorChange)
+                    p['wxId'].append(btn_colour.GetId())
+
                     if p.get('prompt', '') ==  'color_none':
                         none_check = wx.CheckBox(which_panel, wx.ID_ANY, _("Transparent"))
                         if p.get('value','') !=  '' and p.get('value',[''])[0] ==  "none":
@@ -1261,12 +1297,16 @@ class cmdPanel(wx.Panel):
                         p['wxId'].append(None)
                 # file selector
                 elif p.get('prompt','') !=  'color' and p.get('element', '') ==  'file':
+                    if p.get('age', 'new_file') == 'new_file':
+                        fmode = wx.SAVE
+                    else:
+                        fmode = wx.OPEN
                     fbb = filebrowse.FileBrowseButton(parent = which_panel, id = wx.ID_ANY, fileMask = '*',
                                                       size = globalvar.DIALOG_GSELECT_SIZE, labelText = '',
                                                       dialogTitle = _('Choose %s') % \
                                                           p.get('description',_('File')),
                                                       buttonText = _('Browse'),
-                                                      startDirectory = os.getcwd(), fileMode = 0,
+                                                      startDirectory = os.getcwd(), fileMode = fmode,
                                                       changeCallback = self.OnSetValue)
                     value = self._getValue(p)
                     if value:
@@ -1288,17 +1328,33 @@ class cmdPanel(wx.Panel):
                             f = open(p['value'])
                             ifbb.SetValue(''.join(f.readlines()))
                             f.close()
-                    
+                        
                         ifbb.Bind(wx.EVT_TEXT, self.OnFileText)
+                        
+                        btnLoad = wx.Button(parent = which_panel, id = wx.ID_ANY, label = _("&Load"))
+                        btnLoad.Bind(wx.EVT_BUTTON, self.OnFileLoad)
+                        btnSave = wx.Button(parent = which_panel, id = wx.ID_SAVEAS)
+                        btnSave.Bind(wx.EVT_BUTTON, self.OnFileSave)
+                        
                         which_sizer.Add(item = wx.StaticText(parent = which_panel, id = wx.ID_ANY,
                                                              label = _('or enter values interactively')),
                                         proportion = 0,
                                         flag = wx.EXPAND | wx.RIGHT | wx.LEFT | wx.BOTTOM, border = 5)
                         which_sizer.Add(item = ifbb, proportion = 1,
                                         flag = wx.EXPAND | wx.RIGHT | wx.LEFT, border = 5)
+                        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+                        btnSizer.Add(item = btnLoad, proportion = 0,
+                                     flag = wx.ALIGN_RIGHT | wx.RIGHT, border = 10)
+                        btnSizer.Add(item = btnSave, proportion = 0,
+                                     flag = wx.ALIGN_RIGHT)
+                        which_sizer.Add(item = btnSizer, proportion = 0,
+                                        flag = wx.ALIGN_RIGHT | wx.RIGHT | wx.TOP, border = 5)
+                        
                         p['wxId'].append(ifbb.GetId())
-            
-            if self.parent.GetName() ==  'MainFrame' and self.parent.modeler:
+                        p['wxId'].append(btnLoad.GetId())
+                        p['wxId'].append(btnSave.GetId())
+                
+            if self.parent.GetName() == 'MainFrame' and self.parent.modeler:
                 parChk = wx.CheckBox(parent = which_panel, id = wx.ID_ANY,
                                      label = _("Parameterized in model"))
                 parChk.SetName('ModelParam')
@@ -1445,6 +1501,70 @@ class cmdPanel(wx.Panel):
             return p['value']
         return p.get('default', '')
         
+    def OnFileLoad(self, event):
+        """!Load file to interactive input"""
+        me = event.GetId()
+        win = dict()
+        for p in self.task.params:
+            if 'wxId' in p and me in p['wxId']:
+                win['file'] = self.FindWindowById(p['wxId'][0])
+                win['text'] = self.FindWindowById(p['wxId'][1])
+                break
+        
+        if not win:
+            return
+        
+        path = win['file'].GetValue()
+        if not path:
+            gcmd.GMessage(parent = self,
+                          message = _("Nothing to load."))
+            return
+        
+        data = ''
+        f = open(path, "r")
+        try:
+            data = f.read()
+        finally:
+            f.close()
+        
+        win['text'].SetValue(data)
+        
+    def OnFileSave(self, event):
+        """!Save interactive input to the file"""
+        wId = event.GetId()
+        win = {}
+        for p in self.task.params:
+            if wId in p.get('wxId', []):
+                win['file'] = self.FindWindowById(p['wxId'][0])
+                win['text'] = self.FindWindowById(p['wxId'][1])
+                break
+        
+        if not win:
+            return
+
+        text = win['text'].GetValue()
+        if not text:
+            gcmd.GMessage(parent = self,
+                          message = _("Nothing to save."))
+            return
+        
+        dlg = wx.FileDialog(parent = self,
+                            message = _("Save input as..."),
+                            defaultDir = os.getcwd(),
+                            style = wx.SAVE | wx.FD_OVERWRITE_PROMPT)
+
+        if dlg.ShowModal() == wx.ID_OK:
+            path = dlg.GetPath()
+            f = open(path, "w")
+            try:
+                f.write(text + os.linesep)
+            finally:
+                f.close()
+            
+            win['file'].SetValue(path)
+        
+        dlg.Destroy()
+        
     def OnFileText(self, event):
         """File input interactively entered"""
         text = event.GetString()
@@ -1462,6 +1582,8 @@ class cmdPanel(wx.Panel):
             f = open(filename, "w")
             try:
                 f.write(text)
+                if text[-1] != os.linesep:
+                    f.write(os.linesep)
             finally:
                 f.close()
         else:
@@ -1509,11 +1631,25 @@ class cmdPanel(wx.Panel):
         myId = event.GetId()
         for p in self.task.params:
             if 'wxId' in p and myId in p['wxId']:
-                has_button = p['wxId'][1] is not None
-                if has_button and wx.FindWindowById(p['wxId'][1]).GetValue() ==  True:
+                multiple = p['wxId'][0] is not None # multiple colors
+                hasTransp = p['wxId'][2] is not None
+                if multiple:
+                    # selected color is added at the end of textCtrl
+                    colorchooser = wx.FindWindowById(p['wxId'][1])
+                    new_color = colorchooser.GetValue()[:]
+                    new_label = rgb2str.get(new_color, ':'.join(map(str, new_color)))
+                    textCtrl = wx.FindWindowById(p['wxId'][0])
+                    val = textCtrl.GetValue()
+                    sep = ','
+                    if val and val[-1] != sep:
+                        val += sep
+                    val += new_label
+                    textCtrl.SetValue(val)
+                    p[ 'value' ] = val
+                elif hasTransp and wx.FindWindowById(p['wxId'][2]).GetValue():
                     p[ 'value' ] = 'none'
                 else:
-                    colorchooser = wx.FindWindowById(p['wxId'][0])
+                    colorchooser = wx.FindWindowById(p['wxId'][1])
                     new_color = colorchooser.GetValue()[:]
                     # This is weird: new_color is a 4-tuple and new_color[:] is a 3-tuple
                     # under wx2.8.1
@@ -1577,7 +1713,7 @@ class cmdPanel(wx.Panel):
         myId = event.GetId()
         me = wx.FindWindowById(myId)
         name = me.GetName()
-
+        
         found = False
         for porf in self.task.params + self.task.flags:
             if 'wxId' not in porf:
@@ -1605,6 +1741,29 @@ class cmdPanel(wx.Panel):
         
         event.Skip()
         
+    def OnSetSymbol(self, event):
+        """!Shows dialog for symbol selection"""
+        myId = event.GetId()
+        
+        for p in self.task.params:
+            if 'wxId' in p and myId in p['wxId']:
+                from gui_core.dialogs import SymbolDialog
+                dlg = SymbolDialog(self, symbolPath = globalvar.ETCSYMBOLDIR,
+                                   currentSymbol = p['value'])
+                if dlg.ShowModal() == wx.ID_OK:
+                    img = dlg.GetSelectedSymbolPath()
+                    p['value'] = dlg.GetSelectedSymbolName()
+                    
+                    bitmapButton = wx.FindWindowById(p['wxId'][0])
+                    label = wx.FindWindowById(p['wxId'][1])
+                    
+                    bitmapButton.SetBitmapLabel(wx.Bitmap(img + '.png'))
+                    label.SetLabel(p['value'])
+                    
+                    self.OnUpdateValues(event)
+                    
+                dlg.Destroy()
+ 
     def OnUpdateSelection(self, event):
         """!Update dialog (layers, tables, columns, etc.)
         """
@@ -1633,7 +1792,7 @@ class cmdPanel(wx.Panel):
         for GRASS
         """
         try:
-            cmd = self.task.getCmd(ignoreErrors = ignoreErrors,
+            cmd = self.task.get_cmd(ignoreErrors = ignoreErrors,
                                    ignoreRequired = ignoreRequired)
         except ValueError, err:
             dlg = wx.MessageDialog(parent = self,
@@ -1659,26 +1818,6 @@ class cmdPanel(wx.Panel):
             
         event.Skip()
         
-class GrassGUIApp(wx.App):
-    """!Stand-alone GRASS command GUI
-    """
-    def __init__(self, grass_task):
-        self.grass_task = grass_task
-        wx.App.__init__(self, False)
-        
-    def OnInit(self):
-        msg = self.grass_task.get_error_msg()
-        if msg:
-            gcmd.GError(msg + '\n\nTry to set up GRASS_ADDON_PATH variable.')
-            return True
-        
-        self.mf = mainFrame(parent = None, ID = wx.ID_ANY, task_description = self.grass_task)
-        self.mf.CentreOnScreen()
-        self.mf.Show(True)
-        self.SetTopWindow(self.mf)
-        
-        return True
-
 class GUI:
     def __init__(self, parent = None, show = True, modal = False,
                  centreOnParent = False, checkError = False):
@@ -1728,11 +1867,10 @@ class GUI:
         # parse the interface decription
         try:
             global _blackList
-            self.grass_task = gtask.parse_interface(cmd[0],
+            self.grass_task = gtask.parse_interface(gcmd.GetRealCmd(cmd[0]),
                                                     blackList = _blackList)
         except (grass.ScriptError, ValueError), e:
             raise gcmd.GException(e.value)
-            return
         
         # if layer parameters previously set, re-insert them into dialog
         if completed is not None:
@@ -1791,7 +1929,7 @@ class GUI:
             cmd = cmd_validated
         
         if self.show is not None:
-            self.mf = mainFrame(parent = self.parent, ID = wx.ID_ANY,
+            self.mf = TaskFrame(parent = self.parent, ID = wx.ID_ANY,
                                 task_description = self.grass_task,
                                 get_dcmd = get_dcmd, layer = layer)
         else:
@@ -1851,99 +1989,37 @@ class GUI:
                         return p.get('name', None)
         return None
 
-class FloatValidator(wx.PyValidator):
-    """!Validator for floating-point input"""
-    def __init__(self):
-        wx.PyValidator.__init__(self)
-        
-        self.Bind(wx.EVT_TEXT, self.OnText) 
-        
-    def Clone(self):
-        """!Clone validator"""
-        return FloatValidator()
-
-    def Validate(self):
-        """Validate input"""
-        textCtrl = self.GetWindow()
-        text = textCtrl.GetValue()
-
-        if text:
-            try:
-                float(text)
-            except ValueError:
-                textCtrl.SetBackgroundColour("grey")
-                textCtrl.SetFocus()
-                textCtrl.Refresh()
-                return False
+class GrassGUIApp(wx.App):
+    """!Stand-alone GRASS command GUI
+    """
+    def __init__(self, grass_task):
+        self.grass_task = grass_task
+        wx.App.__init__(self, False)
         
-        sysColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
-        textCtrl.SetBackgroundColour(sysColor)
+    def OnInit(self):
+        msg = self.grass_task.get_error_msg()
+        if msg:
+            gcmd.GError(msg + '\n\nTry to set up GRASS_ADDON_PATH variable.')
+            return True
         
-        textCtrl.Refresh()
+        self.mf = TaskFrame(parent = None, ID = wx.ID_ANY, task_description = self.grass_task)
+        self.mf.CentreOnScreen()
+        self.mf.Show(True)
+        self.SetTopWindow(self.mf)
         
         return True
 
-    def OnText(self, event):
-        """!Do validation"""
-        self.Validate()
-        
-        event.Skip()
-        
-    def TransferToWindow(self):
-        return True # Prevent wxDialog from complaining.
-    
-    def TransferFromWindow(self):
-        return True # Prevent wxDialog from complaining.
-
-class GNotebook(FN.FlatNotebook):
-    """!Generic notebook widget
-    """
-    def __init__(self, parent, style, **kwargs):
-        if globalvar.hasAgw:
-            FN.FlatNotebook.__init__(self, parent, id = wx.ID_ANY, agwStyle = style, **kwargs)
-        else:
-            FN.FlatNotebook.__init__(self, parent, id = wx.ID_ANY, style = style, **kwargs)
-        
-        self.notebookPages = {}
-            
-    def AddPage(self, **kwargs):
-        """!Add a page
-        """
-        if 'name' in kwargs:
-            self.notebookPages[kwargs['name']] = kwargs['page']
-            del kwargs['name']
-        super(GNotebook, self).AddPage(**kwargs)
-
-    def SetSelectionByName(self, page):
-        """!Set notebook
-        
-        @param page names, eg. 'layers', 'output', 'search', 'pyshell', 'nviz'
-        """
-        idx = self.GetPageIndexByName(page)
-        if self.GetSelection() != idx:
-            self.SetSelection(idx)
-        
-    def GetPageIndexByName(self, page):
-        """!Get notebook page index
-        
-        @param page name
-        """
-        if page not in self.notebookPages:
-            return -1
-        
-        return self.GetPageIndex(self.notebookPages[page])
-    
 if __name__ ==  "__main__":
-
+    import gettext
+    gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
+    
     if len(sys.argv) ==  1:
         sys.exit(_("usage: %s <grass command>") % sys.argv[0])
+    
     if sys.argv[1] !=  'test':
         q = wx.LogNull()
         cmd = utils.split(sys.argv[1])
-        if sys.platform == 'win32':
-            if cmd[0] in globalvar.grassCmd['script']:
-                cmd[0] += globalvar.EXT_SCT
-        task = gtask.grassTask(cmd[0], blackList = _blackList)
+        task = gtask.grassTask(gcmd.GetRealCmd(cmd[0]))
         task.set_options(cmd[1:])
         app = GrassGUIApp(task)
         app.MainLoop()
@@ -1955,7 +2031,7 @@ if __name__ ==  "__main__":
             task.get_flag('v')['value'] = True
             task.get_param('layer')['value'] = 1
             task.get_param('bcolor')['value'] = "red"
-            assert ' '.join(task.getCmd()) ==  "d.vect -v map = map_name layer = 1 bcolor = red"
+            assert ' '.join(task.get_cmd()) ==  "d.vect -v map = map_name layer = 1 bcolor = red"
         # Test interface building with handmade grassTask,
         # possibly outside of a GRASS session.
         task = gtask.grassTask()
diff --git a/gui/wxpython/gui_modules/ghelp.py b/gui/wxpython/gui_core/ghelp.py
similarity index 55%
rename from gui/wxpython/gui_modules/ghelp.py
rename to gui/wxpython/gui_core/ghelp.py
index acb5ad6..d54c81b 100644
--- a/gui/wxpython/gui_modules/ghelp.py
+++ b/gui/wxpython/gui_core/ghelp.py
@@ -1,23 +1,19 @@
 """!
- at package help.py
+ at package gui_core.ghelp
 
 @brief Help window
 
 Classes:
- - SearchModuleWindow
- - ItemTree
- - MenuTreeWindow
- - MenuTree
- - AboutWindow
- - InstallExtensionWindow
- - ExtensionTree
- - UninstallExtensionWindow
- - CheckListExtension
- - HelpFrame
- - HelpWindow
- - HelpPanel
+ - ghelp::SearchModuleWindow
+ - ghelp::MenuTreeWindow
+ - ghelp::MenuTree
+ - ghelp::AboutWindow
+ - ghelp::HelpFrame
+ - ghelp::HelpWindow
+ - ghelp::HelpPanel
 
 (C) 2008-2011 by the GRASS Development Team
+
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
@@ -25,46 +21,28 @@ This program is free software under the GNU General Public License
 """
 
 import os
-import codecs
 import sys
+import re
+import codecs
+import platform
 
 import wx
-import wx.lib.mixins.listctrl as listmix
+from wx.html import HtmlWindow
 try:
     import wx.lib.agw.customtreectrl as CT
-#    import wx.lib.agw.hyperlink as hl
+    from wx.lib.agw.hyperlink import HyperLinkCtrl
 except ImportError:
     import wx.lib.customtreectrl as CT
-#    import wx.lib.hyperlink as hl
+    from wx.lib.hyperlink import HyperLinkCtrl
 import wx.lib.flatnotebook as FN
-import  wx.lib.scrolledpanel as scrolled
-
-from grass.script import core as grass
-from grass.script import task as gtask
 
-import menudata
-import gcmd
-import globalvar
-import gdialogs
-import utils
-import menuform
+import grass.script as grass
 
-class HelpFrame(wx.Frame):
-    """!GRASS Quickstart help window"""
-    def __init__(self, parent, id, title, size, file):
-        wx.Frame.__init__(self, parent = parent, id = id, title = title, size = size)
-        
-        sizer = wx.BoxSizer(wx.VERTICAL)
-        
-        # text
-        content = HelpPanel(parent = self)
-        content.LoadPage(file)
-        
-        sizer.Add(item = content, proportion = 1, flag = wx.EXPAND)
-        
-        self.SetAutoLayout(True)
-        self.SetSizer(sizer)
-        self.Layout()
+from core             import globalvar
+from core             import utils
+from lmgr.menudata    import ManagerData
+from core.gcmd        import GError, DecodeString
+from gui_core.widgets import GNotebook, StaticWrapText, ItemTree, ScrolledPanel
 
 class SearchModuleWindow(wx.Panel):
     """!Search module window (used in MenuTreeWindow)"""
@@ -95,8 +73,8 @@ class SearchModuleWindow(wx.Panel):
         self.search.Bind(wx.EVT_TEXT, self.OnSearchModule)
         
         if self.showTip:
-            self.searchTip = gdialogs.StaticWrapText(parent = self, id = wx.ID_ANY,
-                                                     size = (-1, 35))
+            self.searchTip = StaticWrapText(parent = self, id = wx.ID_ANY,
+                                            size = (-1, 35))
         
         if self.showChoice:
             self.searchChoice = wx.Choice(parent = self, id = wx.ID_ANY)
@@ -223,7 +201,7 @@ class MenuTreeWindow(wx.Panel):
         self.dataBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
                                     label = " %s " % _("Menu tree (double-click to run command)"))
         # tree
-        self.tree = MenuTree(parent = self, data = menudata.ManagerData())
+        self.tree = MenuTree(parent = self, data = ManagerData())
         self.tree.Load()
 
         # search widget
@@ -352,86 +330,7 @@ class MenuTreeWindow(wx.Panel):
             self.parent.SetStatusText("", 0)
         
         event.Skip()
-        
-class ItemTree(CT.CustomTreeCtrl):
-    def __init__(self, parent, id = wx.ID_ANY,
-                 ctstyle = CT.TR_HIDE_ROOT | CT.TR_FULL_ROW_HIGHLIGHT | CT.TR_HAS_BUTTONS |
-                 CT.TR_LINES_AT_ROOT | CT.TR_SINGLE, **kwargs):
-        if globalvar.hasAgw:
-            super(ItemTree, self).__init__(parent, id, agwStyle = ctstyle, **kwargs)
-        else:
-            super(ItemTree, self).__init__(parent, id, style = ctstyle, **kwargs)
-        
-        self.root = self.AddRoot(_("Menu tree"))
-        self.itemsMarked = [] # list of marked items
-        self.itemSelected = None
-
-    def SearchItems(self, element, value):
-        """!Search item 
-
-        @param element element index (see self.searchBy)
-        @param value
 
-        @return list of found tree items
-        """
-        items = list()
-        if not value:
-            return items
-        
-        item = self.GetFirstChild(self.root)[0]
-        self._processItem(item, element, value, items)
-        
-        self.itemsMarked  = items
-        self.itemSelected = None
-        
-        return items
-    
-    def _processItem(self, item, element, value, listOfItems):
-        """!Search items (used by SearchItems)
-        
-        @param item reference item
-        @param listOfItems list of found items
-        """
-        while item and item.IsOk():
-            subItem = self.GetFirstChild(item)[0]
-            if subItem:
-                self._processItem(subItem, element, value, listOfItems)
-            data = self.GetPyData(item)
-            
-            if data and element in data and \
-                    value.lower() in data[element].lower():
-                listOfItems.append(item)
-            
-            item = self.GetNextSibling(item)
-            
-    def GetSelected(self):
-        """!Get selected item"""
-        return self.itemSelected
-
-    def OnShowItem(self, event):
-        """!Highlight first found item in menu tree"""
-        if len(self.itemsMarked) > 0:
-            if self.GetSelected():
-                self.ToggleItemSelection(self.GetSelected())
-                idx = self.itemsMarked.index(self.GetSelected()) + 1
-            else:
-                idx = 0
-            try:
-                self.ToggleItemSelection(self.itemsMarked[idx])
-                self.itemSelected = self.itemsMarked[idx]
-                self.EnsureVisible(self.itemsMarked[idx])
-            except IndexError:
-                self.ToggleItemSelection(self.itemsMarked[0]) # reselect first item
-                self.EnsureVisible(self.itemsMarked[0])
-                self.itemSelected = self.itemsMarked[0]
-        else:
-            for item in self.root.GetChildren():
-                self.Collapse(item)
-            itemSelected = self.GetSelection()
-            if itemSelected:
-                self.ToggleItemSelection(itemSelected)
-            self.itemSelected = None
-    
 class MenuTree(ItemTree):
     """!Menu tree class"""
     def __init__(self, parent, data, **kwargs):
@@ -481,77 +380,119 @@ class MenuTree(ItemTree):
         
 class AboutWindow(wx.Frame):
     """!Create custom About Window
-
-    @todo improve styling
     """
-    def __init__(self, parent, size = (750, 400), 
+    def __init__(self, parent, size = (650, 460), 
                  title = _('About GRASS GIS'), **kwargs):
-        wx.Frame.__init__(self, parent = parent, id = wx.ID_ANY, size = size, **kwargs)
+        wx.Frame.__init__(self, parent = parent, id = wx.ID_ANY, title = title, size = size, **kwargs)
         
         panel = wx.Panel(parent = self, id = wx.ID_ANY)
         
         # icon
         self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-
+        
         # get version and web site
         vInfo = grass.version()
         
-        infoTxt = wx.Panel(parent = panel, id = wx.ID_ANY)
+        infoTxt = ScrolledPanel(parent = panel)
+        infoTxt.SetupScrolling()
         infoSizer = wx.BoxSizer(wx.VERTICAL)
         infoGridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
         infoGridSizer.AddGrowableCol(0)
         infoGridSizer.AddGrowableCol(1)
-        logo = os.path.join(globalvar.ETCDIR, "gui", "icons", "grass.ico")
+        logo = os.path.join(globalvar.ETCDIR, "gui", "icons", "grass-64x64.png")
         logoBitmap = wx.StaticBitmap(parent = infoTxt, id = wx.ID_ANY,
                                      bitmap = wx.Bitmap(name = logo,
-                                                        type = wx.BITMAP_TYPE_ICO))
+                                                        type = wx.BITMAP_TYPE_PNG))
         infoSizer.Add(item = logoBitmap, proportion = 0,
-                      flag = wx.ALL | wx.ALIGN_CENTER, border = 25)
+                      flag = wx.ALL | wx.ALIGN_CENTER, border = 20)
         
         info = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
                              label = 'GRASS GIS ' + vInfo['version'] + '\n\n')
         info.SetFont(wx.Font(13, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
+        info.SetForegroundColour(wx.Colour(35, 142, 35))
         infoSizer.Add(item = info, proportion = 0,
-                          flag = wx.BOTTOM | wx.ALIGN_CENTER, border = 15)
-
+                      flag = wx.BOTTOM | wx.ALIGN_CENTER, border = 1)
+        
+        row = 0
         infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
                                                label = _('Official GRASS site:')),
-                          pos = (0, 0),
+                          pos = (row, 0),
                           flag = wx.ALIGN_RIGHT)
 
-        infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
+        infoGridSizer.Add(item = HyperLinkCtrl(parent = infoTxt, id = wx.ID_ANY,
                                                label = 'http://grass.osgeo.org'),
-                          pos = (0, 1),
+                          pos = (row, 1),
                           flag = wx.ALIGN_LEFT)
-        
+
+        row += 2
         infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
-                                               label = _('SVN Revision:')),
-                          pos = (2, 0),
+                                               label = '%s:' % _('SVN Revision')),
+                          pos = (row, 0),
                           flag = wx.ALIGN_RIGHT)
         
         infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
                                                label = vInfo['revision']),
-                          pos = (2, 1),
+                          pos = (row, 1),
                           flag = wx.ALIGN_LEFT)
-
+        
+        row += 1
         infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
-                                               label = _('GIS Library Revision:')),
-                          pos = (3, 0),
+                                               label = '%s:' % _('GIS Library Revision')),
+                          pos = (row, 0),
                           flag = wx.ALIGN_RIGHT)
         
         infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
                                                label = vInfo['libgis_revision'] + ' (' +
                                                vInfo['libgis_date'].split(' ')[0] + ')'),
-                          pos = (3, 1),
+                          pos = (row, 1),
                           flag = wx.ALIGN_LEFT)
 
+        row += 2
+        infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
+                                               label = 'Python:'),
+                          pos = (row, 0),
+                          flag = wx.ALIGN_RIGHT)
+        
+        infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
+                                               label = platform.python_version()),
+                          pos = (row, 1),
+                          flag = wx.ALIGN_LEFT)
+
+        row += 1
+        infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
+                                               label =  'wxPython:'),
+                          pos = (row, 0),
+                          flag = wx.ALIGN_RIGHT)
+        
+        infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
+                                               label = wx.__version__),
+                          pos = (row, 1),
+                          flag = wx.ALIGN_LEFT)
+        
         infoSizer.Add(item = infoGridSizer,
                       proportion = 1,
-                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL,
-                      border = 25)
+                      flag = wx.EXPAND | wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL)
+        
+        row += 2
+        infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
+                                               label = "%s:" % _('Language')),
+                          pos = (row, 0),
+                          flag = wx.ALIGN_RIGHT)
+        lang = grass.gisenv().get('LANG', None)
+        if not lang:
+            import locale
+            loc = locale.getdefaultlocale()
+            if loc == (None, None):
+                lang = _('unknown')
+            else:
+                lang = u'%s.%s' % (loc[0], loc[1]) 
+        infoGridSizer.Add(item = wx.StaticText(parent = infoTxt, id = wx.ID_ANY,
+                                               label = lang),
+                          pos = (row, 1),
+                          flag = wx.ALIGN_LEFT)        
         
         # create a flat notebook for displaying information about GRASS
-        aboutNotebook = menuform.GNotebook(panel, style = globalvar.FNPageStyle | FN.FNB_NO_X_BUTTON) 
+        aboutNotebook = GNotebook(panel, style = globalvar.FNPageStyle | FN.FNB_NO_X_BUTTON) 
         aboutNotebook.SetTabAreaColour(globalvar.FNPageColor)
         
         for title, win in ((_("Info"), infoTxt),
@@ -582,8 +523,10 @@ class AboutWindow(wx.Frame):
         sizer.Add(item = btnSizer, proportion = 0,
                   flag = wx.ALL | wx.ALIGN_RIGHT, border = 1)
         panel.SetSizer(sizer)
+        
         self.Layout()
-    
+        self.SetMinSize((400, 400))
+        
     def _pageCopyright(self):
         """Copyright information"""
         copyfile = os.path.join(os.getenv("GISBASE"), "COPYING")
@@ -595,9 +538,8 @@ class AboutWindow(wx.Frame):
             copytext = _('%s file missing') % 'COPYING'
         
         # put text into a scrolling panel
-        copyrightwin = scrolled.ScrolledPanel(self, id = wx.ID_ANY, 
-                                              size = wx.DefaultSize,
-                                              style = wx.TAB_TRAVERSAL | wx.SUNKEN_BORDER)
+        copyrightwin = ScrolledPanel(self)
+                                     
         copyrighttxt = wx.StaticText(copyrightwin, id = wx.ID_ANY, label = copytext)
         copyrightwin.SetAutoLayout(True)
         copyrightwin.sizer = wx.BoxSizer(wx.VERTICAL)
@@ -619,8 +561,7 @@ class AboutWindow(wx.Frame):
         else:
             license = _('%s file missing') % 'GPL.TXT'
         # put text into a scrolling panel
-        licensewin = scrolled.ScrolledPanel(self, id = wx.ID_ANY, 
-                                            style = wx.TAB_TRAVERSAL | wx.SUNKEN_BORDER)
+        licensewin = ScrolledPanel(self)
         licensetxt = wx.StaticText(licensewin, id = wx.ID_ANY, label = license)
         licensewin.SetAutoLayout(True)
         licensewin.sizer = wx.BoxSizer(wx.VERTICAL)
@@ -642,10 +583,9 @@ class AboutWindow(wx.Frame):
             authorsFile.close()
         else:
             authors = _('%s file missing') % 'AUTHORS'
-        authorwin = scrolled.ScrolledPanel(self, id = wx.ID_ANY, 
-                                           style  =  wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER)
+        authorwin = ScrolledPanel(self)
         authortxt = wx.StaticText(authorwin, id = wx.ID_ANY, label = authors)
-        authorwin.SetAutoLayout(1)
+        authorwin.SetAutoLayout(True)
         authorwin.SetupScrolling()
         authorwin.sizer = wx.BoxSizer(wx.VERTICAL)
         authorwin.sizer.Add(item = authortxt, proportion = 1,
@@ -683,15 +623,14 @@ class AboutWindow(wx.Frame):
             contribFile.close()
             
             if errLines:
-                gcmd.GError(parent = self,
-                            message = _("Error when reading file '%s'.") % contribfile + \
-                                "\n\n" + _("Lines:") + " %s" % \
-                                os.linesep.join(map(utils.UnicodeString, errLines)))
+                GError(parent = self,
+                       message = _("Error when reading file '%s'.") % contribfile + \
+                           "\n\n" + _("Lines:") + " %s" % \
+                           os.linesep.join(map(DecodeString, errLines)))
         else:
             contribs = None
         
-        contribwin = scrolled.ScrolledPanel(self, id = wx.ID_ANY, 
-                                           style = wx.TAB_TRAVERSAL | wx.SUNKEN_BORDER)
+        contribwin = ScrolledPanel(self)
         contribwin.SetAutoLayout(True)
         contribwin.SetupScrolling()
         contribwin.sizer = wx.BoxSizer(wx.VERTICAL)
@@ -710,7 +649,7 @@ class AboutWindow(wx.Frame):
             for item in items:
                 contribBox.Add(item = wx.StaticText(parent = contribwin, id = wx.ID_ANY,
                                                     label = item))
-            for vals in contribs:
+            for vals in sorted(contribs, key = lambda x: x[0]):
                 for item in vals:
                     contribBox.Add(item = wx.StaticText(parent = contribwin, id = wx.ID_ANY,
                                                         label = item))
@@ -743,16 +682,15 @@ class AboutWindow(wx.Frame):
             translatorsFile.close()
             
             if errLines:
-                gcmd.GError(parent = self,
-                            message = _("Error when reading file '%s'.") % translatorsfile + \
-                                "\n\n" + _("Lines:") + " %s" % \
-                                os.linesep.join(map(utils.UnicodeString, errLines)))
+                GError(parent = self,
+                       message = _("Error when reading file '%s'.") % translatorsfile + \
+                           "\n\n" + _("Lines:") + " %s" % \
+                           os.linesep.join(map(DecodeString, errLines)))
         else:
             translators = None
         
-        translatorswin = scrolled.ScrolledPanel(self, id = wx.ID_ANY, 
-                                           style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER)
-        translatorswin.SetAutoLayout(1)
+        translatorswin = ScrolledPanel(self)
+        translatorswin.SetAutoLayout(True)
         translatorswin.SetupScrolling()
         translatorswin.sizer = wx.BoxSizer(wx.VERTICAL)
         
@@ -793,475 +731,29 @@ class AboutWindow(wx.Frame):
         """!Close window"""
         self.Close()
 
-class InstallExtensionWindow(wx.Frame):
-    def __init__(self, parent, id = wx.ID_ANY,
-                 title = _("Fetch & install extension from GRASS Addons"), **kwargs):
-        self.parent = parent
-        self.options = dict() # list of options
-        
-        wx.Frame.__init__(self, parent = parent, id = id, title = title, **kwargs)
-        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-        
-        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
-
-        self.repoBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                    label = " %s " % _("Repository"))
-        self.treeBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                    label = " %s " % _("List of extensions"))
-        
-        self.repo = wx.TextCtrl(parent = self.panel, id = wx.ID_ANY)
-        self.fullDesc = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
-                                    label = _("Fetch full info including description and keywords"))
-        self.fullDesc.SetValue(True)
-        
-        self.search = SearchModuleWindow(parent = self.panel)
-        self.search.SetSelection(0) 
-        
-        self.tree   = ExtensionTree(parent = self.panel, log = parent.GetLogWindow())
-        
-        self.optionBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                      label = " %s " % _("Options"))
-        
-        task = gtask.parse_interface('g.extension.py')
-        
-        ignoreFlags = ['l', 'c', 'g', 'a', 'f', 'quiet', 'verbose']
-        if sys.platform == 'win32':
-            ignoreFlags.append('d')
-            ignoreFlags.append('i')
-        
-        for f in task.get_options()['flags']:
-            name = f.get('name', '')
-            desc = f.get('label', '')
-            if not desc:
-                desc = f.get('description', '')
-            if not name and not desc:
-                continue
-            if name in ignoreFlags:
-                continue
-            self.options[name] = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
-                                             label = desc)
-        self.repo.SetValue(task.get_param(value = 'svnurl').get('default',
-                                                                'http://svn.osgeo.org/grass/grass-addons'))
-        
-        self.statusbar = self.CreateStatusBar(number = 1)
-        
-        self.btnFetch = wx.Button(parent = self.panel, id = wx.ID_ANY,
-                                  label = _("&Fetch"))
-        self.btnFetch.SetToolTipString(_("Fetch list of available modules from GRASS Addons SVN repository"))
-        self.btnClose = wx.Button(parent = self.panel, id = wx.ID_CLOSE)
-        self.btnInstall = wx.Button(parent = self.panel, id = wx.ID_ANY,
-                                    label = _("&Install"))
-        self.btnInstall.SetToolTipString(_("Install selected add-ons GRASS module"))
-        self.btnInstall.Enable(False)
-        self.btnCmd = wx.Button(parent = self.panel, id = wx.ID_ANY,
-                                label = _("Command dialog"))
-        self.btnCmd.SetToolTipString(_('Open %s dialog') % 'g.extension.py')
-
-        self.btnClose.Bind(wx.EVT_BUTTON, self.OnCloseWindow)
-        self.btnFetch.Bind(wx.EVT_BUTTON, self.OnFetch)
-        self.btnInstall.Bind(wx.EVT_BUTTON, self.OnInstall)
-        self.btnCmd.Bind(wx.EVT_BUTTON, self.OnCmdDialog)
-        self.tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnItemActivated)
-        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED,    self.OnItemSelected)
-        self.search.Bind(wx.EVT_TEXT_ENTER,        self.OnShowItem)
-        self.search.Bind(wx.EVT_TEXT,              self.OnUpdateStatusBar)
-
-        self._layout()
+class HelpFrame(wx.Dialog):
+    """!GRASS Quickstart help window
 
-    def _layout(self):
-        """!Do layout"""
-        sizer = wx.BoxSizer(wx.VERTICAL)
-        repoSizer = wx.StaticBoxSizer(self.repoBox, wx.VERTICAL)
-        repo1Sizer = wx.BoxSizer(wx.HORIZONTAL)
-        repo1Sizer.Add(item = self.repo, proportion = 1,
-                      flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = 1)
-        repo1Sizer.Add(item = self.btnFetch, proportion = 0,
-                      flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = 1)
-        repoSizer.Add(item = repo1Sizer,
-                      flag = wx.EXPAND)
-        repoSizer.Add(item = self.fullDesc)
-        
-        findSizer = wx.BoxSizer(wx.HORIZONTAL)
-        findSizer.Add(item = self.search, proportion = 1)
-        
-        treeSizer = wx.StaticBoxSizer(self.treeBox, wx.HORIZONTAL)
-        treeSizer.Add(item = self.tree, proportion = 1,
-                      flag = wx.ALL | wx.EXPAND, border = 1)
-
-        # options
-        optionSizer = wx.StaticBoxSizer(self.optionBox, wx.VERTICAL)
-        for key in self.options.keys():
-            optionSizer.Add(item = self.options[key], proportion = 0)
-        
-        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
-        btnSizer.Add(item = self.btnCmd, proportion = 0,
-                     flag = wx.RIGHT, border = 5)
-        btnSizer.AddSpacer(10)
-        btnSizer.Add(item = self.btnClose, proportion = 0,
-                     flag = wx.RIGHT, border = 5)
-        btnSizer.Add(item = self.btnInstall, proportion = 0)
-        
-        sizer.Add(item = repoSizer, proportion = 0,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        sizer.Add(item = findSizer, proportion = 0,
-                  flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
-        sizer.Add(item = treeSizer, proportion = 1,
-                  flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
-        sizer.Add(item = optionSizer, proportion = 0,
-                        flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
-        sizer.Add(item = btnSizer, proportion = 0,
-                  flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
-        
-        self.panel.SetSizer(sizer)
-        sizer.Fit(self.panel)
-        
-        self.Layout()
-
-    def _getCmd(self):
-        item = self.tree.GetSelected()
-        if not item or not item.IsOk():
-            return ['g.extension.py']
-        
-        name = self.tree.GetItemText(item)
-        if not name:
-            gcmd.GError(_("Extension not defined"), parent = self)
-            return
-        flags = list()
-        for key in self.options.keys():
-            if self.options[key].IsChecked():
-                flags.append('-%s' % key)
-        
-        return ['g.extension.py'] + flags + ['extension=' + name,
-                                             'svnurl=' + self.repo.GetValue().strip()]
-    
-    def OnUpdateStatusBar(self, event):
-        """!Update statusbar text"""
-        element = self.search.GetSelection()
-        if not self.tree.IsLoaded():
-            self.SetStatusText(_("Fetch list of available extensions by clicking on 'Fetch' button"), 0)
-            return
-        
-        self.tree.SearchItems(element = element,
-                              value = event.GetString())
-        
-        nItems = len(self.tree.itemsMarked)
-        if event.GetString():
-            self.SetStatusText(_("%d items match") % nItems, 0)
-        else:
-            self.SetStatusText("", 0)
-        
-        event.Skip()
-    
-    def OnCloseWindow(self, event):
-        """!Close window"""
-        self.Destroy()
-
-    def OnFetch(self, event):
-        """!Fetch list of available extensions"""
-        wx.BeginBusyCursor()
-        self.SetStatusText(_("Fetching list of modules from GRASS-Addons SVN (be patient)..."), 0)
-        self.tree.Load(url = self.repo.GetValue().strip(), full = self.fullDesc.IsChecked())
-        self.SetStatusText("", 0)
-        wx.EndBusyCursor()
-
-    def OnItemActivated(self, event):
-        item = event.GetItem()
-        data = self.tree.GetPyData(item)
-        if data and 'command' in data:
-            self.OnInstall(event = None)
-        
-    def OnInstall(self, event):
-        """!Install selected extension"""
-        log = self.parent.GetLogWindow()
-        log.RunCmd(self._getCmd(), onDone = self.OnDone)
-        
-    def OnDone(self, cmd, returncode):
-        item = self.tree.GetSelected()
-        if not item or not item.IsOk() or \
-                returncode != 0 or \
-                not os.getenv('GRASS_ADDON_PATH'):
-            return
-        
-        name = self.tree.GetItemText(item)
-        globalvar.grassCmd['all'].append(name)
-        
-    def OnItemSelected(self, event):
-        """!Item selected"""
-        item = event.GetItem()
-        self.tree.itemSelected = item
-        data = self.tree.GetPyData(item)
-        if data is None:
-            self.SetStatusText('', 0)
-            self.btnInstall.Enable(False)
-        else:
-            self.SetStatusText(data.get('description', ''), 0)
-            self.btnInstall.Enable(True)
-
-    def OnShowItem(self, event):
-        """!Show selected item"""
-        self.tree.OnShowItem(event)
-        if self.tree.GetSelected():
-            self.btnInstall.Enable()
-        else:
-            self.btnInstall.Enable(False)
-
-    def OnCmdDialog(self, event):
-        """!Shows command dialog"""
-        menuform.GUI(parent = self).ParseCommand(cmd = self._getCmd())
-        
-class ExtensionTree(ItemTree):
-    """!List of available extensions"""
-    def __init__(self, parent, log, id = wx.ID_ANY,
-                 ctstyle = CT.TR_HIDE_ROOT | CT.TR_FULL_ROW_HIGHLIGHT | CT.TR_HAS_BUTTONS |
-                 CT.TR_LINES_AT_ROOT | CT.TR_SINGLE,
-                 **kwargs):
-        self.parent = parent # GMFrame
-        self.log    = log
-        
-        super(ExtensionTree, self).__init__(parent, id, ctstyle = ctstyle, **kwargs)
-        
-        self._initTree()
-        
-    def _initTree(self):
-        for prefix in ('display', 'database',
-                       'general', 'imagery',
-                       'misc', 'postscript', 'paint',
-                       'raster', 'raster3d', 'sites', 'vector', 'wxGUI', 'other'):
-            self.AppendItem(parentId = self.root,
-                            text = prefix)
-        self._loaded = False
-        
-    def _expandPrefix(self, c):
-        name = { 'd'  : 'display',
-                 'db' : 'database',
-                 'g'  : 'general',
-                 'i'  : 'imagery',
-                 'm'  : 'misc',
-                 'ps' : 'postscript',
-                 'p'  : 'paint',
-                 'r'  : 'raster',
-                 'r3' : 'raster3d',
-                 's'  : 'sites',
-                 'v'  : 'vector',
-                 'wx' : 'wxGUI',
-                 ''   : 'other' }
-        
-        if c in name:
-            return name[c]
-        
-        return c
-    
-    def _findItem(self, text):
-        """!Find item"""
-        item = self.GetFirstChild(self.root)[0]
-        while item and item.IsOk():
-            if text == self.GetItemText(item):
-                return item
-            
-            item = self.GetNextSibling(item)
-        
-        return None
-    
-    def Load(self, url, full = False):
-        """!Load list of extensions"""
-        self.DeleteAllItems()
-        self.root = self.AddRoot(_("Menu tree"))
-        self._initTree()
-        
-        if full:
-            flags = 'g'
-        else:
-            flags = 'l'
-        ret = gcmd.RunCommand('g.extension.py', read = True, parent = self,
-                              svnurl = url,
-                              flags = flags, quiet = True)
-        if not ret:
-            return
-        
-        mdict = dict()
-        for line in ret.splitlines():
-            if full:
-                try:
-                    key, value = line.split('=', 1)
-                except ValueError:
-                    key = 'name'
-                    value = line
-                
-                if key == 'name':
-                    try:
-                        prefix, name = value.split('.', 1)
-                    except ValueError:
-                        prefix = ''
-                        name = value
-                    if prefix not in mdict:
-                        mdict[prefix] = dict()
-                    mdict[prefix][name] = dict()
-                else:
-                    mdict[prefix][name][key] = value
-            else:
-                try:
-                    prefix, name = line.strip().split('.', 1)
-                except:
-                    prefix = ''
-                    name = line.strip()
-                
-                if self._expandPrefix(prefix) == prefix:
-                    prefix = ''
-                    
-                if prefix not in mdict:
-                    mdict[prefix] = dict()
-                    
-                mdict[prefix][name] = { 'command' : prefix + '.' + name }
-        
-        for prefix in mdict.keys():
-            prefixName = self._expandPrefix(prefix)
-            item = self._findItem(prefixName)
-            names = mdict[prefix].keys()
-            names.sort()
-            for name in names:
-                if prefix:
-                    text = prefix + '.' + name
-                else:
-                    text = name
-                new = self.AppendItem(parentId = item,
-                                      text = text)
-                data = dict()
-                for key in mdict[prefix][name].keys():
-                    data[key] = mdict[prefix][name][key]
-                
-                self.SetPyData(new, data)
-        
-        self._loaded = True
-
-    def IsLoaded(self):
-        """Check if items are loaded"""
-        return self._loaded
-
-class UninstallExtensionWindow(wx.Frame):
-    def __init__(self, parent, id = wx.ID_ANY,
-                 title = _("Uninstall GRASS Addons extensions"), **kwargs):
-        self.parent = parent
-        
-        wx.Frame.__init__(self, parent = parent, id = id, title = title, **kwargs)
-        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-        
-        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
-
-        self.extBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                   label = " %s " % _("List of installed extensions"))
-        
-        self.extList = CheckListExtension(parent = self.panel)
-
-        # buttons
-        self.btnUninstall = wx.Button(parent = self.panel, id = wx.ID_ANY,
-                                    label = _("&Uninstall"))
-        self.btnUninstall.SetToolTipString(_("Uninstall selected AddOns extensions"))
-        self.btnCmd = wx.Button(parent = self.panel, id = wx.ID_ANY,
-                                label = _("Command dialog"))
-        self.btnCmd.SetToolTipString(_('Open %s dialog') % 'g.extension')
-        self.btnClose = wx.Button(parent = self.panel, id = wx.ID_CLOSE)
-        
-        self.btnUninstall.Bind(wx.EVT_BUTTON, self.OnUninstall)
-        self.btnCmd.Bind(wx.EVT_BUTTON, self.OnCmdDialog)
-        self.btnClose.Bind(wx.EVT_BUTTON, self.OnCloseWindow)
-        
-        self._layout()
+    As a base class wx.Dialog is used, because of not working
+    close button with wx.Frame when dialog is called from wizard.
+    If parent is None, application TopLevelWindow is used (wxPython standard behaviour).
+    """
+    def __init__(self, parent, id, title, size, file):
+        wx.Dialog.__init__(self, parent = parent, id = id, title = title,
+                           size = size, style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.MINIMIZE_BOX)
         
-    def _layout(self):
-        """!Do layout"""
         sizer = wx.BoxSizer(wx.VERTICAL)
         
-        extSizer = wx.StaticBoxSizer(self.extBox, wx.HORIZONTAL)
-        extSizer.Add(item = self.extList, proportion = 1,
-                     flag = wx.ALL | wx.EXPAND, border = 1)
-        
-        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
-        btnSizer.Add(item = self.btnCmd, proportion = 0,
-                     flag = wx.RIGHT, border = 5)
-        btnSizer.AddSpacer(10)
-        btnSizer.Add(item = self.btnClose, proportion = 0,
-                     flag = wx.RIGHT, border = 5)
-        btnSizer.Add(item = self.btnUninstall, proportion = 0)
-        
-        sizer.Add(item = extSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        sizer.Add(item = btnSizer, proportion = 0,
-                  flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
+        # text
+        content = HelpPanel(parent = self)
+        content.LoadPage(file)
         
-        self.panel.SetSizer(sizer)
-        sizer.Fit(self.panel)
+        sizer.Add(item = content, proportion = 1, flag = wx.EXPAND)
         
+        self.SetAutoLayout(True)
+        self.SetSizer(sizer)
         self.Layout()
 
-    def OnCloseWindow(self, event):
-        """!Close window"""
-        self.Destroy()
-
-    def OnUninstall(self, event):
-        """!Uninstall selected extensions"""
-        log = self.parent.GetLogWindow()
-        eList = self.extList.GetExtensions()
-        if not eList:
-            gcmd.GError(_("No extension selected for removal. "
-                          "Operation canceled."),
-                        parent = self)
-            return
-        
-        for ext in eList:
-            files = gcmd.RunCommand('g.extension.py', parent = self, read = True, quiet = True,
-                                    extension = ext, operation = 'remove').splitlines()
-            dlg = wx.MessageDialog(parent = self,
-                                   message = _("List of files to be removed:\n%(files)s\n\n"
-                                               "Do you want really to remove <%(ext)s> extension?") % \
-                                       { 'files' : os.linesep.join(files), 'ext' : ext },
-                                   caption = _("Remove extension"),
-                                   style = wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
-            
-            if dlg.ShowModal() ==  wx.ID_YES:
-                gcmd.RunCommand('g.extension.py', flags = 'f', parent = self, quiet = True,
-                                extension = ext, operation = 'remove')
-        
-        self.extList.LoadData()
-        
-    def OnCmdDialog(self, event):
-        """!Shows command dialog"""
-        menuform.GUI(parent = self).ParseCommand(cmd = ['g.extension.py'])
-
-class CheckListExtension(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.CheckListCtrlMixin):
-    """!List of mapset/owner/group"""
-    def __init__(self, parent):
-        self.parent = parent
-        
-        wx.ListCtrl.__init__(self, parent, id = wx.ID_ANY,
-                             style = wx.LC_REPORT)
-        listmix.CheckListCtrlMixin.__init__(self)
-        
-        # setup mixins
-        listmix.ListCtrlAutoWidthMixin.__init__(self)
-
-        self.InsertColumn(0, _('Extension'))
-        self.LoadData()
-        
-    def LoadData(self):
-        """!Load data into list"""
-        self.DeleteAllItems()
-        for ext in gcmd.RunCommand('g.extension.py',
-                                   quiet = True, parent = self, read = True,
-                                   flags = 'a').splitlines():
-            if ext:
-                self.InsertStringItem(sys.maxint, ext)
-        
-    def GetExtensions(self):
-        """!Get extensions to be un-installed
-        """
-        extList = list()
-        for i in range(self.GetItemCount()):
-            if self.IsChecked(i):
-                name = self.GetItemText(i)
-                if name:
-                    extList.append(name)
-        
-        return extList
 
 class HelpWindow(wx.html.HtmlWindow):
     """!This panel holds the text from GRASS docs.
@@ -1396,13 +888,26 @@ class HelpPanel(wx.Panel):
     def LoadPage(self, path = None):
         """!Load page"""
         if not path:
-            path = os.path.join(self.content.fspath, self.grass_command + ".html")
+            path = self.GetFile()
         self.content.history.append(path)
         self.content.LoadPage(path)
         
-    def IsFile(self):
-        """!Check if file exists"""
-        return os.path.isfile(os.path.join(self.content.fspath, self.grass_command + ".html"))
+    def GetFile(self):
+        """!Get HTML file"""
+        fMan = os.path.join(self.content.fspath, self.grass_command + ".html")
+        if os.path.isfile(fMan):
+            return fMan
+        
+        # check also addons
+        aPath = os.getenv('GRASS_ADDON_PATH')
+        if aPath:
+            for path in aPath.split(os.pathsep):
+                faMan = os.path.join(path, "docs", "html",
+                                     self.grass_command + ".html")
+                if os.path.isfile(faMan):
+                    return faMan
+        
+        return None
 
     def IsLoaded(self):
         return self.content.loaded
diff --git a/gui/wxpython/gui_core/goutput.py b/gui/wxpython/gui_core/goutput.py
new file mode 100644
index 0000000..0bf8acd
--- /dev/null
+++ b/gui/wxpython/gui_core/goutput.py
@@ -0,0 +1,1476 @@
+"""!
+ at package gui_core.goutput
+
+ at brief Command output widgets
+
+Classes:
+ - goutput::CmdThread
+ - goutput::GMConsole
+ - goutput::GMStdout
+ - goutput::GMStderr
+ - goutput::GMStc
+ - goutput::PyStc
+
+(C) 2007-2012 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton (Arizona State University)
+ at author Martin Landa <landa.martin gmail.com>
+ at author Vaclav Petras <wenzeslaus gmail.com> (copy&paste customization)
+"""
+
+import os
+import sys
+import textwrap
+import time
+import threading
+import Queue
+import codecs
+import locale
+import keyword
+
+import wx
+from   wx import stc
+from wx.lib.newevent import NewEvent
+
+import grass.script as grass
+from   grass.script import task as gtask
+
+from core            import globalvar
+from core            import utils
+from core.gcmd       import CommandThread, GMessage, GError, GException, EncodeString
+from gui_core.forms  import GUI
+from gui_core.prompt import GPromptSTC
+from core.debug      import Debug
+from core.settings   import UserSettings
+from gui_core.ghelp  import SearchModuleWindow
+
+wxCmdOutput,   EVT_CMD_OUTPUT   = NewEvent()
+wxCmdProgress, EVT_CMD_PROGRESS = NewEvent()
+wxCmdRun,      EVT_CMD_RUN      = NewEvent()
+wxCmdDone,     EVT_CMD_DONE     = NewEvent()
+wxCmdAbort,    EVT_CMD_ABORT    = NewEvent()
+wxCmdPrepare,  EVT_CMD_PREPARE  = NewEvent()
+
+def GrassCmd(cmd, env = None, stdout = None, stderr = None):
+    """!Return GRASS command thread"""
+    return CommandThread(cmd, env = env,
+                         stdout = stdout, stderr = stderr)
+
+class CmdThread(threading.Thread):
+    """!Thread for GRASS commands"""
+    requestId = 0
+    def __init__(self, parent, requestQ, resultQ, **kwds):
+        threading.Thread.__init__(self, **kwds)
+
+        self.setDaemon(True)
+
+        self.parent = parent # GMConsole
+        self._want_abort_all = False
+        
+        self.requestQ = requestQ
+        self.resultQ = resultQ
+
+        self.start()
+
+    def RunCmd(self, *args, **kwds):
+        CmdThread.requestId += 1
+
+        self.requestCmd = None
+        self.requestQ.put((CmdThread.requestId, args, kwds))
+        
+        return CmdThread.requestId
+
+    def SetId(self, id):
+        """!Set starting id"""
+        CmdThread.requestId = id
+        
+    def run(self):
+        os.environ['GRASS_MESSAGE_FORMAT'] = 'gui'
+        while True:
+            requestId, args, kwds = self.requestQ.get()
+            for key in ('callable', 'onDone', 'onPrepare', 'userData'):
+                if key in kwds:
+                    vars()[key] = kwds[key]
+                    del kwds[key]
+                else:
+                    vars()[key] = None
+            
+            if not vars()['callable']:
+                vars()['callable'] = GrassCmd
+            
+            requestTime = time.time()
+            
+            # prepare
+            event = wxCmdPrepare(cmd = args[0],
+                                 time = requestTime,
+                                 pid = requestId,
+                                 onPrepare = vars()['onPrepare'],
+                                 userData = vars()['userData'])
+            wx.PostEvent(self.parent, event)
+            
+            # run command
+            event = wxCmdRun(cmd = args[0],
+                             pid = requestId)
+            wx.PostEvent(self.parent, event)
+            
+            time.sleep(.1)
+            self.requestCmd = vars()['callable'](*args, **kwds)
+            if self._want_abort_all:
+                self.requestCmd.abort()
+                if self.requestQ.empty():
+                    self._want_abort_all = False
+            
+            self.resultQ.put((requestId, self.requestCmd.run()))
+            
+            try:
+                returncode = self.requestCmd.module.returncode
+            except AttributeError:
+                returncode = 0 # being optimistic
+            
+            try:
+                aborted = self.requestCmd.aborted
+            except AttributeError:
+                aborted = False
+            
+            time.sleep(.1)
+
+            # set default color table for raster data
+            if UserSettings.Get(group = 'cmd', key = 'rasterColorTable', subkey = 'enabled') and \
+                    args[0][0][:2] == 'r.':
+                colorTable = UserSettings.Get(group = 'cmd', key = 'rasterColorTable', subkey = 'selection')
+                mapName = None
+                if args[0][0] == 'r.mapcalc':
+                    try:
+                        mapName = args[0][1].split('=', 1)[0].strip()
+                    except KeyError:
+                        pass
+                else:
+                    moduleInterface = GUI(show = None).ParseCommand(args[0])
+                    outputParam = moduleInterface.get_param(value = 'output', raiseError = False)
+                    if outputParam and outputParam['prompt'] == 'raster':
+                        mapName = outputParam['value']
+                
+                if mapName:
+                    argsColor = list(args)
+                    argsColor[0] = [ 'r.colors',
+                                     'map=%s' % mapName,
+                                     'color=%s' % colorTable ]
+                    self.requestCmdColor = vars()['callable'](*argsColor, **kwds)
+                    self.resultQ.put((requestId, self.requestCmdColor.run()))
+            
+            event = wxCmdDone(cmd = args[0],
+                              aborted = aborted,
+                              returncode = returncode,
+                              time = requestTime,
+                              pid = requestId,
+                              onDone = vars()['onDone'],
+                              userData = vars()['userData'])
+            
+            # send event
+            wx.PostEvent(self.parent, event)
+            
+    def abort(self, abortall = True):
+        """!Abort command(s)"""
+        if abortall:
+            self._want_abort_all = True
+        self.requestCmd.abort()
+        if self.requestQ.empty():
+            self._want_abort_all = False
+        
+class GMConsole(wx.SplitterWindow):
+    """!Create and manage output console for commands run by GUI.
+    """
+    def __init__(self, parent, id = wx.ID_ANY, margin = False,
+                 notebook = None,
+                 style = wx.TAB_TRAVERSAL | wx.FULL_REPAINT_ON_RESIZE,
+                 **kwargs):
+        wx.SplitterWindow.__init__(self, parent, id, style = style, *kwargs)
+        self.SetName("GMConsole")
+        
+        self.panelOutput = wx.Panel(parent = self, id = wx.ID_ANY)
+        self.panelPrompt = wx.Panel(parent = self, id = wx.ID_ANY)
+        
+        # initialize variables
+        self.parent          = parent # GMFrame | CmdPanel | ?
+        if notebook:
+            self._notebook = notebook
+        else:
+            self._notebook = self.parent.notebook
+        self.lineWidth       = 80
+        
+        # remember position of line begining (used for '\r')
+        self.linePos         = -1
+        
+        # create queues
+        self.requestQ = Queue.Queue()
+        self.resultQ = Queue.Queue()
+        
+        # progress bar
+        self.progressbar = wx.Gauge(parent = self.panelOutput, id = wx.ID_ANY,
+                                    range = 100, pos = (110, 50), size = (-1, 25),
+                                    style = wx.GA_HORIZONTAL)
+        self.progressbar.Bind(EVT_CMD_PROGRESS, self.OnCmdProgress)
+        
+        # text control for command output
+        self.cmdOutput = GMStc(parent = self.panelOutput, id = wx.ID_ANY, margin = margin,
+                               wrap = None) 
+        self.cmdOutputTimer = wx.Timer(self.cmdOutput, id = wx.ID_ANY)
+        self.cmdOutput.Bind(EVT_CMD_OUTPUT, self.OnCmdOutput)
+        self.cmdOutput.Bind(wx.EVT_TIMER, self.OnProcessPendingOutputWindowEvents)
+        self.Bind(EVT_CMD_RUN,     self.OnCmdRun)
+        self.Bind(EVT_CMD_DONE,    self.OnCmdDone)
+        self.Bind(EVT_CMD_PREPARE, self.OnCmdPrepare)
+        
+        # search & command prompt
+        self.cmdPrompt = GPromptSTC(parent = self)
+        
+        if self.parent.GetName() != 'LayerManager':
+            self.search = None
+            self.cmdPrompt.Hide()
+        else:
+            self.infoCollapseLabelExp = _("Click here to show search module engine")
+            self.infoCollapseLabelCol = _("Click here to hide search module engine")
+            self.searchPane = wx.CollapsiblePane(parent = self.panelOutput,
+                                                 label = self.infoCollapseLabelExp,
+                                                 style = wx.CP_DEFAULT_STYLE |
+                                                 wx.CP_NO_TLW_RESIZE | wx.EXPAND)
+            self.MakeSearchPaneContent(self.searchPane.GetPane())
+            self.searchPane.Collapse(True)
+            self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnSearchPaneChanged, self.searchPane) 
+            self.search.Bind(wx.EVT_TEXT,             self.OnUpdateStatusBar)
+        
+        # stream redirection
+        self.cmdStdOut = GMStdout(self)
+        self.cmdStdErr = GMStderr(self)
+        
+        # thread
+        self.cmdThread = CmdThread(self, self.requestQ, self.resultQ)
+        
+        self.outputBox = wx.StaticBox(parent = self.panelOutput, id = wx.ID_ANY,
+                                      label = " %s " % _("Output window"))
+        self.cmdBox = wx.StaticBox(parent = self.panelOutput, id = wx.ID_ANY,
+                                   label = " %s " % _("Command prompt"))
+        
+        # buttons
+        self.btnOutputClear = wx.Button(parent = self.panelOutput, id = wx.ID_CLEAR)
+        self.btnOutputClear.SetToolTipString(_("Clear output window content"))
+        self.btnCmdClear = wx.Button(parent = self.panelOutput, id = wx.ID_CLEAR)
+        self.btnCmdClear.SetToolTipString(_("Clear command prompt content"))
+        self.btnOutputSave  = wx.Button(parent = self.panelOutput, id = wx.ID_SAVE)
+        self.btnOutputSave.SetToolTipString(_("Save output window content to the file"))
+        self.btnCmdAbort = wx.Button(parent = self.panelOutput, id = wx.ID_STOP)
+        self.btnCmdAbort.SetToolTipString(_("Abort running command"))
+        self.btnCmdAbort.Enable(False)
+        self.btnCmdProtocol = wx.ToggleButton(parent = self.panelOutput, id = wx.ID_ANY,
+                                              label = _("&Log file"),
+                                              size = self.btnCmdClear.GetSize())
+        self.btnCmdProtocol.SetToolTipString(_("Toggle to save list of executed commands into "
+                                               "a file; content saved when switching off."))
+        
+        if self.parent.GetName() != 'LayerManager':
+            self.btnCmdClear.Hide()
+            self.btnCmdProtocol.Hide()
+        
+        self.btnCmdClear.Bind(wx.EVT_BUTTON,     self.cmdPrompt.OnCmdErase)
+        self.btnOutputClear.Bind(wx.EVT_BUTTON,  self.OnOutputClear)
+        self.btnOutputSave.Bind(wx.EVT_BUTTON,   self.OnOutputSave)
+        self.btnCmdAbort.Bind(wx.EVT_BUTTON,     self.OnCmdAbort)
+        self.Bind(EVT_CMD_ABORT,                 self.OnCmdAbort)
+        self.btnCmdProtocol.Bind(wx.EVT_TOGGLEBUTTON, self.OnCmdProtocol)
+        
+        self._layout()
+        
+    def _layout(self):
+        """!Do layout"""
+        outputSizer = wx.BoxSizer(wx.VERTICAL)
+        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+        outBtnSizer = wx.StaticBoxSizer(self.outputBox, wx.HORIZONTAL)
+        cmdBtnSizer = wx.StaticBoxSizer(self.cmdBox, wx.HORIZONTAL)
+        
+        if self.cmdPrompt.IsShown():
+            promptSizer = wx.BoxSizer(wx.VERTICAL)
+            promptSizer.Add(item = self.cmdPrompt, proportion = 1,
+                        flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, border = 3)
+        
+        if self.search and self.search.IsShown():
+            outputSizer.Add(item = self.searchPane, proportion = 0,
+                            flag = wx.EXPAND | wx.ALL, border = 3)
+        outputSizer.Add(item = self.cmdOutput, proportion = 1,
+                        flag = wx.EXPAND | wx.ALL, border = 3)
+        outputSizer.Add(item = self.progressbar, proportion = 0,
+                        flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 3)
+        outBtnSizer.Add(item = self.btnOutputClear, proportion = 1,
+                        flag = wx.ALIGN_LEFT | wx.LEFT | wx.RIGHT, border = 5)
+        outBtnSizer.Add(item = self.btnOutputSave, proportion = 1,
+                        flag = wx.ALIGN_RIGHT | wx.RIGHT, border = 5)
+        
+        cmdBtnSizer.Add(item = self.btnCmdProtocol, proportion = 1,
+                        flag = wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL | wx.LEFT | wx.RIGHT, border = 5)
+        cmdBtnSizer.Add(item = self.btnCmdClear, proportion = 1,
+                        flag = wx.ALIGN_CENTER | wx.RIGHT, border = 5)
+        cmdBtnSizer.Add(item = self.btnCmdAbort, proportion = 1,
+                        flag = wx.ALIGN_CENTER | wx.RIGHT, border = 5)
+        
+        if self.parent.GetName() != 'LayerManager':
+            proportion = (1, 1)
+        else:
+            proportion = (2, 3)
+        
+        btnSizer.Add(item = outBtnSizer, proportion = proportion[0],
+                     flag = wx.ALL | wx.ALIGN_CENTER, border = 5)
+        btnSizer.Add(item = cmdBtnSizer, proportion = proportion[1],
+                     flag = wx.ALIGN_CENTER | wx.TOP | wx.BOTTOM | wx.RIGHT, border = 5)
+        outputSizer.Add(item = btnSizer, proportion = 0,
+                        flag = wx.EXPAND)
+        
+        outputSizer.Fit(self)
+        outputSizer.SetSizeHints(self)
+        self.panelOutput.SetSizer(outputSizer)
+        
+        if self.cmdPrompt.IsShown():
+            promptSizer.Fit(self)
+            promptSizer.SetSizeHints(self)
+            self.panelPrompt.SetSizer(promptSizer)
+        
+        # split window
+        if self.cmdPrompt.IsShown():
+            self.SplitHorizontally(self.panelOutput, self.panelPrompt, -50)
+        else:
+            self.SplitHorizontally(self.panelOutput, self.panelPrompt, -45)
+            self.Unsplit()
+        self.SetMinimumPaneSize(self.btnCmdClear.GetSize()[1] + 25)
+        
+        self.SetSashGravity(1.0)
+        
+        # layout
+        self.SetAutoLayout(True)
+        self.Layout()
+
+    def MakeSearchPaneContent(self, pane):
+        """!Create search pane"""
+        border = wx.BoxSizer(wx.VERTICAL)
+        
+        self.search = SearchModuleWindow(parent = pane, cmdPrompt = self.cmdPrompt)
+        
+        border.Add(item = self.search, proportion = 0,
+                   flag = wx.EXPAND | wx.ALL, border = 1)
+        
+        pane.SetSizer(border)
+        border.Fit(pane)
+        
+    def OnSearchPaneChanged(self, event):
+        """!Collapse search module box"""
+        if self.searchPane.IsExpanded():
+            self.searchPane.SetLabel(self.infoCollapseLabelCol)
+        else:
+            self.searchPane.SetLabel(self.infoCollapseLabelExp)
+        
+        self.panelOutput.Layout()
+        self.panelOutput.SendSizeEvent()
+        
+    def GetPanel(self, prompt = True):
+        """!Get panel
+
+        @param prompt get prompt / output panel
+
+        @return wx.Panel reference
+        """
+        if prompt:
+            return self.panelPrompt
+
+        return self.panelOutput
+    
+    def Redirect(self):
+        """!Redirect stdout/stderr
+        """
+        if Debug.GetLevel() == 0 and int(grass.gisenv().get('DEBUG', 0)) == 0:
+            # don't redirect when debugging is enabled
+            sys.stdout = self.cmdStdOut
+            sys.stderr = self.cmdStdErr
+        else:
+            enc = locale.getdefaultlocale()[1]
+            if enc:
+                sys.stdout = codecs.getwriter(enc)(sys.__stdout__)
+                sys.stderr = codecs.getwriter(enc)(sys.__stderr__)
+            else:
+                sys.stdout = sys.__stdout__
+                sys.stderr = sys.__stderr__
+        
+    def WriteLog(self, text, style = None, wrap = None,
+                 switchPage = False):
+        """!Generic method for writing log message in 
+        given style
+
+        @param line text line
+        @param style text style (see GMStc)
+        @param stdout write to stdout or stderr
+        """
+
+        self.cmdOutput.SetStyle()
+
+        if switchPage:
+            self._notebook.SetSelectionByName('output')
+        
+        if not style:
+            style = self.cmdOutput.StyleDefault
+        
+        # p1 = self.cmdOutput.GetCurrentPos()
+        p1 = self.cmdOutput.GetEndStyled()
+        # self.cmdOutput.GotoPos(p1)
+        self.cmdOutput.DocumentEnd()
+        
+        for line in text.splitlines():
+            # fill space
+            if len(line) < self.lineWidth:
+                diff = self.lineWidth - len(line) 
+                line += diff * ' '
+            
+            self.cmdOutput.AddTextWrapped(line, wrap = wrap) # adds '\n'
+            
+            p2 = self.cmdOutput.GetCurrentPos()
+            
+            self.cmdOutput.StartStyling(p1, 0xff)
+            self.cmdOutput.SetStyling(p2 - p1, style)
+        
+        self.cmdOutput.EnsureCaretVisible()
+        
+    def WriteCmdLog(self, line, pid = None, switchPage = True):
+        """!Write message in selected style"""
+        if pid:
+            line = '(' + str(pid) + ') ' + line
+        
+        self.WriteLog(line, style = self.cmdOutput.StyleCommand, switchPage = switchPage)
+        
+    def WriteWarning(self, line):
+        """!Write message in warning style"""
+        self.WriteLog(line, style = self.cmdOutput.StyleWarning, switchPage = True)
+
+    def WriteError(self, line):
+        """!Write message in error style"""
+        self.WriteLog(line, style = self.cmdOutput.StyleError, switchPage = True)
+
+    def RunCmd(self, command, compReg = True, switchPage = False, skipInterface = False,
+               onDone = None, onPrepare = None, userData = None):
+        """!Run command typed into console command prompt (GPrompt).
+        
+        @todo Display commands (*.d) are captured and processed
+        separately by mapdisp.py. Display commands are rendered in map
+        display widget that currently has the focus (as indicted by
+        mdidx).
+        
+        @param command command given as a list (produced e.g. by utils.split())
+        @param compReg True use computation region
+        @param switchPage switch to output page
+        @param skipInterface True to do not launch GRASS interface
+        parser when command has no arguments given
+        @param onDone function to be called when command is finished
+        @param onPrepare function to be called before command is launched
+        @param userData data defined for the command
+        """
+        if len(command) == 0:
+            Debug.msg(2, "GPrompt:RunCmd(): empty command")
+            return
+        
+        # update history file
+        env = grass.gisenv()
+        try:
+            filePath = os.path.join(env['GISDBASE'],
+                                    env['LOCATION_NAME'],
+                                    env['MAPSET'],
+                                    '.bash_history')
+            fileHistory = codecs.open(filePath, encoding = 'utf-8', mode = 'a')
+        except IOError, e:
+            GError(_("Unable to write file '%(filePath)s'.\n\nDetails: %(error)s") % 
+                    {'filePath': filePath, 'error' : e },
+                   parent = self.parent)
+            fileHistory = None
+        
+        if fileHistory:
+            try:
+                fileHistory.write(' '.join(command) + os.linesep)
+            finally:
+                fileHistory.close()
+        
+        if command[0] in globalvar.grassCmd:
+            # send GRASS command without arguments to GUI command interface
+            # except display commands (they are handled differently)
+            if self.parent.GetName() == "LayerManager" and \
+                    command[0][0:2] == "d." and \
+                    'help' not in ' '.join(command[1:]):
+                # display GRASS commands
+                try:
+                    layertype = {'d.rast'         : 'raster',
+                                 'd.rast3d'       : '3d-raster',
+                                 'd.rgb'          : 'rgb',
+                                 'd.his'          : 'his',
+                                 'd.shadedmap'    : 'shaded',
+                                 'd.legend'       : 'rastleg',
+                                 'd.rast.arrow'   : 'rastarrow',
+                                 'd.rast.num'     : 'rastnum',
+                                 'd.vect'         : 'vector',
+                                 'd.vect.thematic': 'thememap',
+                                 'd.vect.chart'   : 'themechart',
+                                 'd.grid'         : 'grid',
+                                 'd.geodesic'     : 'geodesic',
+                                 'd.rhumbline'    : 'rhumb',
+                                 'd.labels'       : 'labels',
+                                 'd.barscale'     : 'barscale',
+                                 'd.redraw'       : 'redraw'}[command[0]]
+                except KeyError:
+                    GMessage(parent = self.parent,
+                             message = _("Command '%s' not yet implemented in the WxGUI. "
+                                         "Try adding it as a command layer instead.") % command[0])
+                    return
+                
+                if layertype == 'barscale':
+                    if len(command) > 1: 
+                        self.parent.curr_page.maptree.GetMapDisplay().AddBarscale(cmd = command, showDialog = False)
+                    else:
+                        self.parent.curr_page.maptree.GetMapDisplay().AddBarscale(showDialog = True)
+                elif layertype == 'rastleg':
+                    if len(command) > 1:
+                        self.parent.curr_page.maptree.GetMapDisplay().AddLegend(cmd = command, showDialog = False)
+                    else:
+                        self.parent.curr_page.maptree.GetMapDisplay().AddLegend(showDialog = True)
+                elif layertype == 'redraw':
+                    self.parent.curr_page.maptree.GetMapDisplay().OnRender(None)
+                else:
+                    # add layer into layer tree
+                    lname, found = utils.GetLayerNameFromCmd(command, fullyQualified = True,
+                                                             layerType = layertype)
+                    if self.parent.GetName() == "LayerManager":
+                        self.parent.curr_page.maptree.AddLayer(ltype = layertype,
+                                                               lname = lname,
+                                                               lcmd = command)
+            
+            else:
+                # other GRASS commands (r|v|g|...)
+                hasParams = False
+                if command[0] not in ('r.mapcalc', 'r3.mapcalc'):
+                    try:
+                        task = GUI(show = None).ParseCommand(command)
+                    except GException, e:
+                        GError(parent = self,
+                               message = unicode(e),
+                               showTraceback = False)
+                        return
+                    
+                    if task:
+                        options = task.get_options()
+                        hasParams = options['params'] and options['flags']
+                        # check for <input>=-
+                        for p in options['params']:
+                            if p.get('prompt', '') == 'input' and \
+                                    p.get('element', '') == 'file' and \
+                                    p.get('age', 'new') == 'old' and \
+                                    p.get('value', '') == '-':
+                                GError(parent = self,
+                                       message = _("Unable to run command:\n%(cmd)s\n\n"
+                                                   "Option <%(opt)s>: read from standard input is not "
+                                                   "supported by wxGUI") % { 'cmd': ' '.join(command),
+                                                                             'opt': p.get('name', '') })
+                                return
+                else:
+                    task = None
+                
+                if len(command) == 1 and hasParams and \
+                        command[0] != 'v.krige.py':
+                    # no arguments given
+                    try:
+                        GUI(parent = self).ParseCommand(command)
+                    except GException, e:
+                        print >> sys.stderr, e
+                    return
+                
+                # switch to 'Command output' if required
+                if switchPage:
+                    self._notebook.SetSelectionByName('output')
+                    
+                    self.parent.SetFocus()
+                    self.parent.Raise()
+                
+                # activate computational region (set with g.region)
+                # for all non-display commands.
+                if compReg:
+                    tmpreg = os.getenv("GRASS_REGION")
+                    if "GRASS_REGION" in os.environ:
+                        del os.environ["GRASS_REGION"]
+                
+                # process GRASS command with argument
+                self.cmdThread.RunCmd(command, stdout = self.cmdStdOut, stderr = self.cmdStdErr,
+                                      onDone = onDone, onPrepare = onPrepare, userData = userData,
+                                      env = os.environ.copy())
+                self.cmdOutputTimer.Start(50)
+                
+                # deactivate computational region and return to display settings
+                if compReg and tmpreg:
+                    os.environ["GRASS_REGION"] = tmpreg
+        else:
+            # Send any other command to the shell. Send output to
+            # console output window
+            if len(command) == 1 and not skipInterface:
+                try:
+                    task = gtask.parse_interface(command[0])
+                except:
+                    task = None
+            else:
+                task = None
+                
+            if task:
+                # process GRASS command without argument
+                GUI(parent = self).ParseCommand(command)
+            else:
+                self.cmdThread.RunCmd(command, stdout = self.cmdStdOut, stderr = self.cmdStdErr,
+                                      onDone = onDone, onPrepare = onPrepare, userData = userData)
+            self.cmdOutputTimer.Start(50)
+        
+    def OnOutputClear(self, event):
+        """!Clear content of output window"""
+        self.cmdOutput.SetReadOnly(False)
+        self.cmdOutput.ClearAll()
+        self.cmdOutput.SetReadOnly(True)
+        self.progressbar.SetValue(0)
+
+    def GetProgressBar(self):
+        """!Return progress bar widget"""
+        return self.progressbar
+    
+    def GetLog(self, err = False):
+        """!Get widget used for logging
+
+        @param err True to get stderr widget
+        """
+        if err:
+            return self.cmdStdErr
+        
+        return self.cmdStdOut
+    
+    def OnOutputSave(self, event):
+        """!Save (selected) text from output window to the file"""
+        text = self.cmdOutput.GetSelectedText()
+        if not text:
+            text = self.cmdOutput.GetText()
+        
+        # add newline if needed
+        if len(text) > 0 and text[-1] != '\n':
+            text += '\n'
+        
+        dlg = wx.FileDialog(self, message = _("Save file as..."),
+                            defaultFile = "grass_cmd_output.txt",
+                            wildcard = _("%(txt)s (*.txt)|*.txt|%(files)s (*)|*") % 
+                            {'txt': _("Text files"), 'files': _("Files")},
+                            style = wx.SAVE | wx.FD_OVERWRITE_PROMPT)
+        
+        # Show the dialog and retrieve the user response. If it is the OK response,
+        # process the data.
+        if dlg.ShowModal() == wx.ID_OK:
+            path = dlg.GetPath()
+            
+            try:
+                output = open(path, "w")
+                output.write(text)
+            except IOError, e:
+                GError(_("Unable to write file '%(path)s'.\n\nDetails: %(error)s") % {'path': path, 'error': e})
+            finally:
+                output.close()
+            message = _("Command output saved into '%s'") % path
+            if hasattr(self.parent, 'SetStatusText'):
+                self.parent.SetStatusText(message)
+            else:
+                self.parent.parent.SetStatusText(message)
+        
+        dlg.Destroy()
+
+    def GetCmd(self):
+        """!Get running command or None"""
+        return self.requestQ.get()
+    
+    def SetCopyingOfSelectedText(self, copy):
+        """!Enable or disable copying of selected text in to clipboard.
+        Effects prompt and output.
+        
+        @param copy True for enable, False for disable
+        """
+        if copy:
+            self.cmdPrompt.Bind(stc.EVT_STC_PAINTED, self.cmdPrompt.OnTextSelectionChanged)
+            self.cmdOutput.Bind(stc.EVT_STC_PAINTED, self.cmdOutput.OnTextSelectionChanged)
+        else:
+            self.cmdPrompt.Unbind(stc.EVT_STC_PAINTED)
+            self.cmdOutput.Unbind(stc.EVT_STC_PAINTED)
+        
+    def OnUpdateStatusBar(self, event):
+        """!Update statusbar text"""
+        if event.GetString():
+            nItems = len(self.cmdPrompt.GetCommandItems())
+            self.parent.SetStatusText(_('%d modules match') % nItems, 0)
+        else:
+            self.parent.SetStatusText('', 0)
+        
+        event.Skip()
+
+    def OnCmdOutput(self, event):
+        """!Print command output"""
+        message = event.text
+        type  = event.type
+        if self._notebook.GetSelection() != self._notebook.GetPageIndexByName('output'):
+            page = self._notebook.GetPageIndexByName('output')
+            textP = self._notebook.GetPageText(page)
+            if textP[-1] != ')':
+                textP += ' (...)'
+            self._notebook.SetPageText(page, textP)
+        
+        # message prefix
+        if type == 'warning':
+            message = 'WARNING: ' + message
+        elif type == 'error':
+            message = 'ERROR: ' + message
+        
+        p1 = self.cmdOutput.GetEndStyled()
+        self.cmdOutput.GotoPos(p1)
+        
+        if '\b' in message:
+            if self.linePos < 0:
+                self.linePos = p1
+            last_c = ''
+            for c in message:
+                if c == '\b':
+                    self.linePos -= 1
+                else:
+                    if c == '\r':
+                        pos = self.cmdOutput.GetCurLine()[1]
+                        # self.cmdOutput.SetCurrentPos(pos)
+                    else:
+                        self.cmdOutput.SetCurrentPos(self.linePos)
+                    self.cmdOutput.ReplaceSelection(c)
+                    self.linePos = self.cmdOutput.GetCurrentPos()
+                    if c != ' ':
+                        last_c = c
+            if last_c not in ('0123456789'):
+                self.cmdOutput.AddTextWrapped('\n', wrap = None)
+                self.linePos = -1
+        else:
+            self.linePos = -1 # don't force position
+            if '\n' not in message:
+                self.cmdOutput.AddTextWrapped(message, wrap = 60)
+            else:
+                self.cmdOutput.AddTextWrapped(message, wrap = None)
+
+        p2 = self.cmdOutput.GetCurrentPos()
+        
+        if p2 >= p1:
+            self.cmdOutput.StartStyling(p1, 0xff)
+        
+            if type == 'error':
+                self.cmdOutput.SetStyling(p2 - p1, self.cmdOutput.StyleError)
+            elif type == 'warning':
+                self.cmdOutput.SetStyling(p2 - p1, self.cmdOutput.StyleWarning)
+            elif type == 'message':
+                self.cmdOutput.SetStyling(p2 - p1, self.cmdOutput.StyleMessage)
+            else: # unknown
+                self.cmdOutput.SetStyling(p2 - p1, self.cmdOutput.StyleUnknown)
+        
+        self.cmdOutput.EnsureCaretVisible()
+        
+    def OnCmdProgress(self, event):
+        """!Update progress message info"""
+        self.progressbar.SetValue(event.value)
+
+    def CmdProtocolSave(self):
+        """Save list of manually entered commands into a text log file"""
+        if not hasattr(self, 'cmdFileProtocol'):
+            return # it should not happen
+        
+        try:
+            output = open(self.cmdFileProtocol, "a")
+            cmds = self.cmdPrompt.GetCommands()
+            output.write('\n'.join(cmds))
+            if len(cmds) > 0:
+                output.write('\n')
+        except IOError, e:
+            GError(_("Unable to write file '%(filePath)s'.\n\nDetails: %(error)s") % 
+                    {'filePath': self.cmdFileProtocol, 'error': e})
+        finally:
+            output.close()
+            
+        self.parent.SetStatusText(_("Command log saved to '%s'") % self.cmdFileProtocol)
+        del self.cmdFileProtocol
+        
+    def OnCmdProtocol(self, event = None):
+        """!Save commands into file"""
+        if not event.IsChecked():
+            # stop capturing commands, save list of commands to the
+            # protocol file
+            self.CmdProtocolSave()
+        else:
+            # start capturing commands
+            self.cmdPrompt.ClearCommands()
+            # ask for the file
+            dlg = wx.FileDialog(self, message = _("Save file as..."),
+                                defaultFile = "grass_cmd_log.txt",
+                                wildcard = _("%(txt)s (*.txt)|*.txt|%(files)s (*)|*") % 
+                                            {'txt': _("Text files"), 'files': _("Files")},
+                                style = wx.SAVE)
+            if dlg.ShowModal() == wx.ID_OK:
+                self.cmdFileProtocol = dlg.GetPath()
+            else:
+                wx.CallAfter(self.btnCmdProtocol.SetValue, False)
+            
+            dlg.Destroy()
+            
+        event.Skip()
+        
+    def OnCmdAbort(self, event):
+        """!Abort running command"""
+        self.cmdThread.abort()
+        
+    def OnCmdRun(self, event):
+        """!Run command"""
+        if self.parent.GetName() == 'Modeler':
+            self.parent.OnCmdRun(event)
+        
+        self.WriteCmdLog('(%s)\n%s' % (str(time.ctime()), ' '.join(event.cmd)))
+        self.btnCmdAbort.Enable()
+
+    def OnCmdPrepare(self, event):
+        """!Prepare for running command"""
+        if self.parent.GetName() == 'Modeler':
+            self.parent.OnCmdPrepare(event)
+        
+        event.Skip()
+        
+    def OnCmdDone(self, event):
+        """!Command done (or aborted)"""
+        if self.parent.GetName() == 'Modeler':
+            self.parent.OnCmdDone(event)
+            
+        # Process results here
+        try:
+            ctime = time.time() - event.time
+            if ctime < 60:
+                stime = _("%d sec") % int(ctime)
+            else:
+                mtime = int(ctime / 60)
+                stime = _("%(min)d min %(sec)d sec") %  { 'min' : mtime, 
+                                                          'sec' : int(ctime - (mtime * 60)) }
+        except KeyError:
+            # stopped deamon
+            stime = _("unknown")
+        
+        if event.aborted:
+            # Thread aborted (using our convention of None return)
+            self.WriteLog(_('Please note that the data are left in inconsistent state '
+                            'and may be corrupted'), self.cmdOutput.StyleWarning)
+            msg = _('Command aborted')
+        else:
+            msg = _('Command finished')
+            
+        self.WriteCmdLog('(%s) %s (%s)' % (str(time.ctime()), msg, stime))
+        self.btnCmdAbort.Enable(False)
+        
+        if event.onDone:
+            event.onDone(cmd = event.cmd, returncode = event.returncode)
+        
+        self.progressbar.SetValue(0) # reset progress bar on '0%'
+
+        self.cmdOutputTimer.Stop()
+
+        if event.cmd[0] == 'g.gisenv':
+            Debug.SetLevel()
+            self.Redirect()
+        
+        if self.parent.GetName() == "LayerManager":
+            self.btnCmdAbort.Enable(False)
+            if event.cmd[0] not in globalvar.grassCmd or \
+                    event.cmd[0] in ('r.mapcalc', 'r3.mapcalc'):
+                return
+            
+            tree = self.parent.GetLayerTree()
+            display = None
+            if tree:
+                display = tree.GetMapDisplay()
+            if not display or not display.IsAutoRendered():
+                return
+            mapLayers = map(lambda x: x.GetName(),
+                            display.GetMap().GetListOfLayers(l_type = 'raster') +
+                            display.GetMap().GetListOfLayers(l_type = 'vector'))
+            
+            try:
+                task = GUI(show = None).ParseCommand(event.cmd)
+            except GException, e:
+                print >> sys.stderr, e
+                task = None
+                return
+            
+            for p in task.get_options()['params']:
+                if p.get('prompt', '') not in ('raster', 'vector'):
+                    continue
+                mapName = p.get('value', '')
+                if '@' not in mapName:
+                    mapName = mapName + '@' + grass.gisenv()['MAPSET']
+                if mapName in mapLayers:
+                    display.GetWindow().UpdateMap(render = True)
+                    return
+        elif self.parent.GetName() == 'Modeler':
+            pass
+        else: # standalone dialogs
+            dialog = self.parent.parent
+            if hasattr(self.parent.parent, "btn_abort"):
+                dialog.btn_abort.Enable(False)
+            
+            if hasattr(self.parent.parent, "btn_cancel"):
+                dialog.btn_cancel.Enable(True)
+            
+            if hasattr(self.parent.parent, "btn_clipboard"):
+                dialog.btn_clipboard.Enable(True)
+            
+            if hasattr(self.parent.parent, "btn_help"):
+                dialog.btn_help.Enable(True)
+            
+            if hasattr(self.parent.parent, "btn_run"):
+                dialog.btn_run.Enable(True)
+            
+            if event.returncode == 0 and not event.aborted:
+                try:
+                    winName = self.parent.parent.parent.GetName()
+                except AttributeError:
+                    winName = ''
+                
+                if winName == 'LayerManager':
+                    mapTree = self.parent.parent.parent.GetLayerTree()
+                elif winName == 'LayerTree':
+                    mapTree = self.parent.parent.parent
+                elif winName: # GMConsole
+                    mapTree = self.parent.parent.parent.parent.GetLayerTree()
+                else:
+                    mapTree = None
+                
+                cmd = dialog.notebookpanel.createCmd(ignoreErrors = True)
+                if mapTree and hasattr(dialog, "addbox") and dialog.addbox.IsChecked():
+                    # add created maps into layer tree
+                    for p in dialog.task.get_options()['params']:
+                        prompt = p.get('prompt', '')
+                        if prompt in ('raster', 'vector', '3d-raster') and \
+                                p.get('age', 'old') == 'new' and \
+                                p.get('value', None):
+                            name, found = utils.GetLayerNameFromCmd(cmd, fullyQualified = True,
+                                                                    param = p.get('name', ''))
+                            
+                            if mapTree.GetMap().GetListOfLayers(l_name = name):
+                                display = mapTree.GetMapDisplay()
+                                if display and display.IsAutoRendered():
+                                    display.GetWindow().UpdateMap(render = True)
+                                continue
+                            
+                            if prompt == 'raster':
+                                lcmd = ['d.rast',
+                                        'map=%s' % name]
+                            elif prompt == '3d-raster':
+                                lcmd = ['d.rast3d',
+                                        'map=%s' % name]
+                            else:
+                                lcmd = ['d.vect',
+                                        'map=%s' % name]
+                            mapTree.AddLayer(ltype = prompt,
+                                             lcmd = lcmd,
+                                             lname = name)
+            
+            if hasattr(dialog, "get_dcmd") and \
+                    dialog.get_dcmd is None and \
+                    hasattr(dialog, "closebox") and \
+                    dialog.closebox.IsChecked() and \
+                    (event.returncode == 0 or event.aborted):
+                self.cmdOutput.Update()
+                time.sleep(2)
+                dialog.Close()
+        
+    def OnProcessPendingOutputWindowEvents(self, event):
+        wx.GetApp().ProcessPendingEvents()
+
+    def ResetFocus(self):
+        """!Reset focus"""
+        self.cmdPrompt.SetFocus()
+        
+    def GetPrompt(self):
+        """!Get prompt"""
+        return self.cmdPrompt
+
+class GMStdout:
+    """!GMConsole standard output
+
+    Based on FrameOutErr.py
+
+    Name:      FrameOutErr.py
+    Purpose:   Redirecting stdout / stderr
+    Author:    Jean-Michel Fauth, Switzerland
+    Copyright: (c) 2005-2007 Jean-Michel Fauth
+    Licence:   GPL
+    """
+    def __init__(self, parent):
+        self.parent = parent # GMConsole
+
+    def write(self, s):
+        if len(s) == 0 or s == '\n':
+            return
+
+        for line in s.splitlines():
+            if len(line) == 0:
+                continue
+            
+            evt = wxCmdOutput(text = line + '\n',
+                              type = '')
+            wx.PostEvent(self.parent.cmdOutput, evt)
+        
+class GMStderr:
+    """!GMConsole standard error output
+
+    Based on FrameOutErr.py
+
+    Name:      FrameOutErr.py
+    Purpose:   Redirecting stdout / stderr
+    Author:    Jean-Michel Fauth, Switzerland
+    Copyright: (c) 2005-2007 Jean-Michel Fauth
+    Licence:   GPL
+    """
+    def __init__(self, parent):
+        self.parent = parent # GMConsole
+        
+        self.type = ''
+        self.message = ''
+        self.printMessage = False
+        
+    def flush(self):
+        pass
+    
+    def write(self, s):
+        if "GtkPizza" in s:
+            return
+        
+        # remove/replace escape sequences '\b' or '\r' from stream
+        progressValue = -1
+        
+        for line in s.splitlines():
+            if len(line) == 0:
+                continue
+            
+            if 'GRASS_INFO_PERCENT' in line:
+                value = int(line.rsplit(':', 1)[1].strip())
+                if value >= 0 and value < 100:
+                    progressValue = value
+                else:
+                    progressValue = 0
+            elif 'GRASS_INFO_MESSAGE' in line:
+                self.type = 'message'
+                self.message += line.split(':', 1)[1].strip() + '\n'
+            elif 'GRASS_INFO_WARNING' in line:
+                self.type = 'warning'
+                self.message += line.split(':', 1)[1].strip() + '\n'
+            elif 'GRASS_INFO_ERROR' in line:
+                self.type = 'error'
+                self.message += line.split(':', 1)[1].strip() + '\n'
+            elif 'GRASS_INFO_END' in line:
+                self.printMessage = True
+            elif self.type == '':
+                if len(line) == 0:
+                    continue
+                evt = wxCmdOutput(text = line,
+                                  type = '')
+                wx.PostEvent(self.parent.cmdOutput, evt)
+            elif len(line) > 0:
+                self.message += line.strip() + '\n'
+
+            if self.printMessage and len(self.message) > 0:
+                evt = wxCmdOutput(text = self.message,
+                                  type = self.type)
+                wx.PostEvent(self.parent.cmdOutput, evt)
+
+                self.type = ''
+                self.message = ''
+                self.printMessage = False
+
+        # update progress message
+        if progressValue > -1:
+            # self.gmgauge.SetValue(progressValue)
+            evt = wxCmdProgress(value = progressValue)
+            wx.PostEvent(self.parent.progressbar, evt)
+            
+class GMStc(stc.StyledTextCtrl):
+    """!Styled GMConsole
+
+    Based on FrameOutErr.py
+
+    Name:      FrameOutErr.py
+    Purpose:   Redirecting stdout / stderr
+    Author:    Jean-Michel Fauth, Switzerland
+    Copyright: (c) 2005-2007 Jean-Michel Fauth
+    Licence:   GPL
+    """    
+    def __init__(self, parent, id, margin = False, wrap = None):
+        stc.StyledTextCtrl.__init__(self, parent, id)
+        self.parent = parent
+        self.SetUndoCollection(True)
+        self.SetReadOnly(True)
+
+        #
+        # styles
+        #                
+        self.SetStyle()
+        
+        #
+        # line margins
+        #
+        # TODO print number only from cmdlog
+        self.SetMarginWidth(1, 0)
+        self.SetMarginWidth(2, 0)
+        if margin:
+            self.SetMarginType(0, stc.STC_MARGIN_NUMBER)
+            self.SetMarginWidth(0, 30)
+        else:
+            self.SetMarginWidth(0, 0)
+
+        #
+        # miscellaneous
+        #
+        self.SetViewWhiteSpace(False)
+        self.SetTabWidth(4)
+        self.SetUseTabs(False)
+        self.UsePopUp(True)
+        self.SetSelBackground(True, "#FFFF00")
+        self.SetUseHorizontalScrollBar(True)
+
+        #
+        # bindings
+        #
+        self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy)
+        
+    def OnTextSelectionChanged(self, event):
+        """!Copy selected text to clipboard and skip event.
+        The same function is in TextCtrlAutoComplete class (prompt.py).
+        """
+        self.Copy()
+        event.Skip()
+        
+    def SetStyle(self):
+        """!Set styles for styled text output windows with type face 
+        and point size selected by user (Courier New 10 is default)"""
+        
+        typeface = UserSettings.Get(group = 'appearance', key = 'outputfont', subkey = 'type')   
+        if typeface == "":
+            typeface = "Courier New"
+        
+        typesize = UserSettings.Get(group = 'appearance', key = 'outputfont', subkey = 'size')
+        if typesize == None or typesize <= 0:
+            typesize = 10
+        typesize = float(typesize)
+        
+        self.StyleDefault     = 0
+        self.StyleDefaultSpec = "face:%s,size:%d,fore:#000000,back:#FFFFFF" % (typeface, typesize)
+        self.StyleCommand     = 1
+        self.StyleCommandSpec = "face:%s,size:%d,,fore:#000000,back:#bcbcbc" % (typeface, typesize)
+        self.StyleOutput      = 2
+        self.StyleOutputSpec  = "face:%s,size:%d,,fore:#000000,back:#FFFFFF" % (typeface, typesize)
+        # fatal error
+        self.StyleError       = 3
+        self.StyleErrorSpec   = "face:%s,size:%d,,fore:#7F0000,back:#FFFFFF" % (typeface, typesize)
+        # warning
+        self.StyleWarning     = 4
+        self.StyleWarningSpec = "face:%s,size:%d,,fore:#0000FF,back:#FFFFFF" % (typeface, typesize)
+        # message
+        self.StyleMessage     = 5
+        self.StyleMessageSpec = "face:%s,size:%d,,fore:#000000,back:#FFFFFF" % (typeface, typesize)
+        # unknown
+        self.StyleUnknown     = 6
+        self.StyleUnknownSpec = "face:%s,size:%d,,fore:#000000,back:#FFFFFF" % (typeface, typesize)
+        
+        # default and clear => init
+        self.StyleSetSpec(stc.STC_STYLE_DEFAULT, self.StyleDefaultSpec)
+        self.StyleClearAll()
+        self.StyleSetSpec(self.StyleCommand, self.StyleCommandSpec)
+        self.StyleSetSpec(self.StyleOutput,  self.StyleOutputSpec)
+        self.StyleSetSpec(self.StyleError,   self.StyleErrorSpec)
+        self.StyleSetSpec(self.StyleWarning, self.StyleWarningSpec)
+        self.StyleSetSpec(self.StyleMessage, self.StyleMessageSpec)
+        self.StyleSetSpec(self.StyleUnknown, self.StyleUnknownSpec)        
+
+    def OnDestroy(self, evt):
+        """!The clipboard contents can be preserved after
+        the app has exited"""
+        
+        wx.TheClipboard.Flush()
+        evt.Skip()
+
+    def AddTextWrapped(self, txt, wrap = None):
+        """!Add string to text area.
+
+        String is wrapped and linesep is also added to the end
+        of the string"""
+        # allow writing to output window
+        self.SetReadOnly(False)
+        
+        if wrap:
+            txt = textwrap.fill(txt, wrap) + '\n'
+        else:
+            if txt[-1] != '\n':
+                txt += '\n'
+        
+        if '\r' in txt:
+            self.parent.linePos = -1
+            for seg in txt.split('\r'):
+                if self.parent.linePos > -1:
+                    self.SetCurrentPos(self.parent.linePos)
+                    self.ReplaceSelection(seg)
+                else:
+                    self.parent.linePos = self.GetCurrentPos()
+                    self.AddText(seg)
+        else:
+            self.parent.linePos = self.GetCurrentPos()
+            try:
+                self.AddText(txt)
+            except UnicodeDecodeError:
+                enc = UserSettings.Get(group = 'atm', key = 'encoding', subkey = 'value')
+                if enc:
+                    txt = unicode(txt, enc)
+                elif 'GRASS_DB_ENCODING' in os.environ:
+                    txt = unicode(txt, os.environ['GRASS_DB_ENCODING'])
+                else:
+                    txt = EncodeString(txt)
+                
+                self.AddText(txt)
+        
+        # reset output window to read only
+        self.SetReadOnly(True)
+    
+class PyStc(stc.StyledTextCtrl):
+    """!Styled Python output (see gmodeler::frame::PythonPanel for
+    usage)
+
+    Based on StyledTextCtrl_2 from wxPython demo
+    """    
+    def __init__(self, parent, id = wx.ID_ANY, statusbar = None):
+        stc.StyledTextCtrl.__init__(self, parent, id)
+        
+        self.parent = parent
+        self.statusbar = statusbar
+        
+        self.modified = False # content modified ?
+        
+        self.faces = { 'times': 'Times New Roman',
+                       'mono' : 'Courier New',
+                       'helv' : 'Arial',
+                       'other': 'Comic Sans MS',
+                       'size' : 10,
+                       'size2': 8,
+                       }
+        
+        self.CmdKeyAssign(ord('B'), stc.STC_SCMOD_CTRL, stc.STC_CMD_ZOOMIN)
+        self.CmdKeyAssign(ord('N'), stc.STC_SCMOD_CTRL, stc.STC_CMD_ZOOMOUT)
+        
+        self.SetLexer(stc.STC_LEX_PYTHON)
+        self.SetKeyWords(0, " ".join(keyword.kwlist))
+        
+        self.SetProperty("fold", "1")
+        self.SetProperty("tab.timmy.whinge.level", "1")
+        self.SetMargins(0, 0)
+        self.SetTabWidth(4)
+        self.SetUseTabs(False)
+        
+        self.SetEdgeMode(stc.STC_EDGE_BACKGROUND)
+        self.SetEdgeColumn(78)
+        
+        # setup a margin to hold fold markers
+        self.SetMarginType(2, stc.STC_MARGIN_SYMBOL)
+        self.SetMarginMask(2, stc.STC_MASK_FOLDERS)
+        self.SetMarginSensitive(2, True)
+        self.SetMarginWidth(2, 12)
+        
+        # like a flattened tree control using square headers
+        self.MarkerDefine(stc.STC_MARKNUM_FOLDEROPEN,    stc.STC_MARK_BOXMINUS,          "white", "#808080")
+        self.MarkerDefine(stc.STC_MARKNUM_FOLDER,        stc.STC_MARK_BOXPLUS,           "white", "#808080")
+        self.MarkerDefine(stc.STC_MARKNUM_FOLDERSUB,     stc.STC_MARK_VLINE,             "white", "#808080")
+        self.MarkerDefine(stc.STC_MARKNUM_FOLDERTAIL,    stc.STC_MARK_LCORNER,           "white", "#808080")
+        self.MarkerDefine(stc.STC_MARKNUM_FOLDEREND,     stc.STC_MARK_BOXPLUSCONNECTED,  "white", "#808080")
+        self.MarkerDefine(stc.STC_MARKNUM_FOLDEROPENMID, stc.STC_MARK_BOXMINUSCONNECTED, "white", "#808080")
+        self.MarkerDefine(stc.STC_MARKNUM_FOLDERMIDTAIL, stc.STC_MARK_TCORNER,           "white", "#808080")
+        
+        self.Bind(stc.EVT_STC_UPDATEUI, self.OnUpdateUI)
+        self.Bind(stc.EVT_STC_MARGINCLICK, self.OnMarginClick)
+        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyPressed)
+        
+        # Make some styles, the lexer defines what each style is used
+        # for, we just have to define what each style looks like.
+        # This set is adapted from Scintilla sample property files.
+        
+        # global default styles for all languages
+        self.StyleSetSpec(stc.STC_STYLE_DEFAULT,     "face:%(helv)s,size:%(size)d" % self.faces)
+        self.StyleClearAll()  # reset all to be like the default
+        
+        # global default styles for all languages
+        self.StyleSetSpec(stc.STC_STYLE_DEFAULT,     "face:%(helv)s,size:%(size)d" % self.faces)
+        self.StyleSetSpec(stc.STC_STYLE_LINENUMBER,  "back:#C0C0C0,face:%(helv)s,size:%(size2)d" % self.faces)
+        self.StyleSetSpec(stc.STC_STYLE_CONTROLCHAR, "face:%(other)s" % self.faces)
+        self.StyleSetSpec(stc.STC_STYLE_BRACELIGHT,  "fore:#FFFFFF,back:#0000FF,bold")
+        self.StyleSetSpec(stc.STC_STYLE_BRACEBAD,    "fore:#000000,back:#FF0000,bold")
+        
+        # Python styles
+        # Default 
+        self.StyleSetSpec(stc.STC_P_DEFAULT, "fore:#000000,face:%(helv)s,size:%(size)d" % self.faces)
+        # Comments
+        self.StyleSetSpec(stc.STC_P_COMMENTLINE, "fore:#007F00,face:%(other)s,size:%(size)d" % self.faces)
+        # Number
+        self.StyleSetSpec(stc.STC_P_NUMBER, "fore:#007F7F,size:%(size)d" % self.faces)
+        # String
+        self.StyleSetSpec(stc.STC_P_STRING, "fore:#7F007F,face:%(helv)s,size:%(size)d" % self.faces)
+        # Single quoted string
+        self.StyleSetSpec(stc.STC_P_CHARACTER, "fore:#7F007F,face:%(helv)s,size:%(size)d" % self.faces)
+        # Keyword
+        self.StyleSetSpec(stc.STC_P_WORD, "fore:#00007F,bold,size:%(size)d" % self.faces)
+        # Triple quotes
+        self.StyleSetSpec(stc.STC_P_TRIPLE, "fore:#7F0000,size:%(size)d" % self.faces)
+        # Triple double quotes
+        self.StyleSetSpec(stc.STC_P_TRIPLEDOUBLE, "fore:#7F0000,size:%(size)d" % self.faces)
+        # Class name definition
+        self.StyleSetSpec(stc.STC_P_CLASSNAME, "fore:#0000FF,bold,underline,size:%(size)d" % self.faces)
+        # Function or method name definition
+        self.StyleSetSpec(stc.STC_P_DEFNAME, "fore:#007F7F,bold,size:%(size)d" % self.faces)
+        # Operators
+        self.StyleSetSpec(stc.STC_P_OPERATOR, "bold,size:%(size)d" % self.faces)
+        # Identifiers
+        self.StyleSetSpec(stc.STC_P_IDENTIFIER, "fore:#000000,face:%(helv)s,size:%(size)d" % self.faces)
+        # Comment-blocks
+        self.StyleSetSpec(stc.STC_P_COMMENTBLOCK, "fore:#7F7F7F,size:%(size)d" % self.faces)
+        # End of line where string is not closed
+        self.StyleSetSpec(stc.STC_P_STRINGEOL, "fore:#000000,face:%(mono)s,back:#E0C0E0,eol,size:%(size)d" % self.faces)
+        
+        self.SetCaretForeground("BLUE")
+        
+    def OnKeyPressed(self, event):
+        """!Key pressed
+        
+        @todo implement code completion (see wxPython demo)
+        """
+        if not self.modified:
+            self.modified = True
+            if self.statusbar:
+                self.statusbar.SetStatusText(_('Python script contains local modifications'), 0)
+        
+        event.Skip()
+        
+    def OnUpdateUI(self, evt):
+        # check for matching braces
+        braceAtCaret = -1
+        braceOpposite = -1
+        charBefore = None
+        caretPos = self.GetCurrentPos()
+        
+        if caretPos > 0:
+            charBefore  = self.GetCharAt(caretPos - 1)
+            styleBefore = self.GetStyleAt(caretPos - 1)
+        
+        # check before
+        if charBefore and chr(charBefore) in "[]{}()" and styleBefore == stc.STC_P_OPERATOR:
+            braceAtCaret = caretPos - 1
+        
+        # check after
+        if braceAtCaret < 0:
+            charAfter = self.GetCharAt(caretPos)
+            styleAfter = self.GetStyleAt(caretPos)
+            
+            if charAfter and chr(charAfter) in "[]{}()" and styleAfter == stc.STC_P_OPERATOR:
+                braceAtCaret = caretPos
+        
+        if braceAtCaret >= 0:
+            braceOpposite = self.BraceMatch(braceAtCaret)
+        
+        if braceAtCaret != -1  and braceOpposite == -1:
+            self.BraceBadLight(braceAtCaret)
+        else:
+            self.BraceHighlight(braceAtCaret, braceOpposite)
+        
+    def OnMarginClick(self, evt):
+        # fold and unfold as needed
+        if evt.GetMargin() == 2:
+            if evt.GetShift() and evt.GetControl():
+                self.FoldAll()
+            else:
+                lineClicked = self.LineFromPosition(evt.GetPosition())
+                
+                if self.GetFoldLevel(lineClicked) & stc.STC_FOLDLEVELHEADERFLAG:
+                    if evt.GetShift():
+                        self.SetFoldExpanded(lineClicked, True)
+                        self.Expand(lineClicked, True, True, 1)
+                    elif evt.GetControl():
+                        if self.GetFoldExpanded(lineClicked):
+                            self.SetFoldExpanded(lineClicked, False)
+                            self.Expand(lineClicked, False, True, 0)
+                        else:
+                            self.SetFoldExpanded(lineClicked, True)
+                            self.Expand(lineClicked, True, True, 100)
+                    else:
+                        self.ToggleFold(lineClicked)
+        
+    def FoldAll(self):
+        lineCount = self.GetLineCount()
+        expanding = True
+        
+        # find out if we are folding or unfolding
+        for lineNum in range(lineCount):
+            if self.GetFoldLevel(lineNum) & stc.STC_FOLDLEVELHEADERFLAG:
+                expanding = not self.GetFoldExpanded(lineNum)
+                break
+        
+        lineNum = 0
+        while lineNum < lineCount:
+            level = self.GetFoldLevel(lineNum)
+            if level & stc.STC_FOLDLEVELHEADERFLAG and \
+               (level & stc.STC_FOLDLEVELNUMBERMASK) == stc.STC_FOLDLEVELBASE:
+                
+                if expanding:
+                    self.SetFoldExpanded(lineNum, True)
+                    lineNum = self.Expand(lineNum, True)
+                    lineNum = lineNum - 1
+                else:
+                    lastChild = self.GetLastChild(lineNum, -1)
+                    self.SetFoldExpanded(lineNum, False)
+                    
+                    if lastChild > lineNum:
+                        self.HideLines(lineNum+1, lastChild)
+            
+            lineNum = lineNum + 1
+        
+    def Expand(self, line, doExpand, force=False, visLevels=0, level=-1):
+        lastChild = self.GetLastChild(line, level)
+        line = line + 1
+        
+        while line <= lastChild:
+            if force:
+                if visLevels > 0:
+                    self.ShowLines(line, line)
+                else:
+                    self.HideLines(line, line)
+            else:
+                if doExpand:
+                    self.ShowLines(line, line)
+            
+            if level == -1:
+                level = self.GetFoldLevel(line)
+            
+            if level & stc.STC_FOLDLEVELHEADERFLAG:
+                if force:
+                    if visLevels > 1:
+                        self.SetFoldExpanded(line, True)
+                    else:
+                        self.SetFoldExpanded(line, False)
+                    
+                    line = self.Expand(line, doExpand, force, visLevels-1)
+                else:
+                    if doExpand and self.GetFoldExpanded(line):
+                        line = self.Expand(line, True, force, visLevels-1)
+                    else:
+                        line = self.Expand(line, False, force, visLevels-1)
+            else:
+                line = line + 1
+        
+        return line
+
diff --git a/gui/wxpython/gui_modules/gselect.py b/gui/wxpython/gui_core/gselect.py
similarity index 75%
rename from gui/wxpython/gui_modules/gselect.py
rename to gui/wxpython/gui_core/gselect.py
index 079abbb..0d4f320 100644
--- a/gui/wxpython/gui_modules/gselect.py
+++ b/gui/wxpython/gui_core/gselect.py
@@ -1,29 +1,31 @@
 """!
- at package gselect
+ at package gui_core.gselect
 
 @brief Custom control that selects elements
 
 Classes:
- - Select
- - VectorSelect
- - TreeCrtlComboPopup
- - VectorDBInfo
- - LayerSelect
- - DriverSelect
- - DatabaseSelect
- - ColumnSelect
- - DbaseSelect
- - LocationSelect
- - MapsetSelect
- - SubGroupSelect
- - FormatSelect
- - GdalSelect
- - ProjSelect
- - ElementSelect
-
-(C) 2007-2011 by the GRASS Development Team This program is free
-software under the GNU General Public License (>=v2). Read the file
-COPYING that comes with GRASS for details.
+ - gselect::Select
+ - gselect::VectorSelect
+ - gselect::TreeCrtlComboPopup
+ - gselect::VectorDBInfo
+ - gselect::LayerSelect
+ - gselect::DriverSelect
+ - gselect::DatabaseSelect
+ - gselect::TableSelect
+ - gselect::ColumnSelect
+ - gselect::DbaseSelect
+ - gselect::LocationSelect
+ - gselect::MapsetSelect
+ - gselect::SubGroupSelect
+ - gselect::FormatSelect
+ - gselect::GdalSelect
+ - gselect::ProjSelect
+ - gselect::ElementSelect
+
+(C) 2007-2011 by the GRASS Development Team 
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Michael Barton
 @author Martin Landa <landa.martin gmail.com>
@@ -39,23 +41,24 @@ import wx.combo
 import wx.lib.filebrowsebutton as filebrowse
 from wx.lib.newevent import NewEvent
 
-import globalvar
+from core import globalvar
 
-sys.path.append(os.path.join(globalvar.ETCDIR, "python"))
 import grass.script as grass
 from   grass.script import task as gtask
 
-import gcmd
-import utils
-from preferences import globalSettings as UserSettings
-from debug       import Debug
+from core.gcmd     import RunCommand, GError, GMessage
+from core.utils    import GetListOfLocations, GetListOfMapsets, GetFormats
+from core.utils    import GetSettingsPath, GetValidLayerName, ListSortLower, GetAllVectorLayers
+from core.settings import UserSettings
+from core.debug    import Debug
 
 wxGdalSelect, EVT_GDALSELECT = NewEvent()
 
 class Select(wx.combo.ComboCtrl):
     def __init__(self, parent, id = wx.ID_ANY, size = globalvar.DIALOG_GSELECT_SIZE,
                  type = None, multiple = False, mapsets = None,
-                 updateOnPopup = True, onPopup = None):
+                 updateOnPopup = True, onPopup = None,
+                 fullyQualified = True):
         """!Custom control to create a ComboBox with a tree control to
         display and select GIS elements within acessible mapsets.
         Elements can be selected with mouse. Can allow multiple
@@ -67,6 +70,7 @@ class Select(wx.combo.ComboCtrl):
         @param mapsets force list of mapsets (otherwise search path)
         @param updateOnPopup True for updating list of elements on popup
         @param onPopup function to be called on Popup
+        @param fullyQualified True to provide fully qualified names (map at mapset)
         """
         wx.combo.ComboCtrl.__init__(self, parent=parent, id=id, size=size)
         self.GetChildren()[0].SetName("Select")
@@ -78,12 +82,13 @@ class Select(wx.combo.ComboCtrl):
         if type:
             self.tcp.SetData(type = type, mapsets = mapsets,
                              multiple = multiple,
-                             updateOnPopup = updateOnPopup, onPopup = onPopup)
+                             updateOnPopup = updateOnPopup, onPopup = onPopup,
+                             fullyQualified = fullyQualified)
         self.GetChildren()[0].Bind(wx.EVT_KEY_UP, self.OnKeyUp)
      
     def OnKeyUp(self, event):
         """!Shows popupwindow if down arrow key is released"""
-        if event.GetKeyCode() == wx.WXK_DOWN:
+        if event.GetKeyCode() == wx.WXK_DOWN and not self.IsPopupShown():
             self.ShowPopup() 
         else:
             event.Skip()
@@ -113,7 +118,7 @@ class Select(wx.combo.ComboCtrl):
 class VectorSelect(Select):
     def __init__(self, parent, ftype, **kwargs):
         """!Custom to create a ComboBox with a tree control to display and
-        select vector maps. Control allows to filter vector maps. If you
+        select vector maps. You can filter the vector maps. If you
         don't need this feature use Select class instead
         
         @ftype filter vector maps based on feature type
@@ -149,6 +154,7 @@ class TreeCtrlComboPopup(wx.combo.ComboPopup):
         self.mapsets = None
         self.updateOnPopup = True
         self.onPopup = None
+        self.fullyQualified = True
         
         self.SetFilter(None)
         
@@ -161,27 +167,16 @@ class TreeCtrlComboPopup(wx.combo.ComboPopup):
                                    |wx.TR_FULL_ROW_HIGHLIGHT)
         self.seltree.Bind(wx.EVT_KEY_UP, self.OnKeyUp)
         self.seltree.Bind(wx.EVT_MOTION, self.OnMotion)
-        self.seltree.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
-        self.seltree.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.mapsetExpanded)
-        self.seltree.Bind(wx.EVT_TREE_ITEM_COLLAPSED, self.mapsetCollapsed)
-        self.seltree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.mapsetActivated)
-        self.seltree.Bind(wx.EVT_TREE_SEL_CHANGED, self.mapsetSelected)
+        self.seltree.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)        
+        # the following dummy handler are needed to keep tree events
+        # from propagating up to the parent GIS Manager layer tree
+        self.seltree.Bind(wx.EVT_TREE_ITEM_EXPANDING, lambda x: None)
+        self.seltree.Bind(wx.EVT_TREE_ITEM_COLLAPSED, lambda x: None)
+        self.seltree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, lambda x: None)
+        self.seltree.Bind(wx.EVT_TREE_SEL_CHANGED, lambda x: None)
         self.seltree.Bind(wx.EVT_TREE_DELETE_ITEM, lambda x: None)
-        
-    # the following dummy handler are needed to keep tree events from propagating up to
-    # the parent GIS Manager layer tree
-    def mapsetExpanded(self, event):
-        pass
-
-    def mapsetCollapsed(self, event):
-        pass
-
-    def mapsetActivated(self, event):
-        pass
-
-    def mapsetSelected(self, event):
-        pass
-    # end of dummy events
+        self.seltree.Bind(wx.EVT_TREE_BEGIN_DRAG, lambda x: None)
+        self.seltree.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, lambda x: None)
 
     def GetControl(self):
         return self.seltree
@@ -275,6 +270,7 @@ class TreeCtrlComboPopup(wx.combo.ComboPopup):
                        'raster files':'rast',
                        'grid3':'rast3d',
                        'rast3d':'rast3d',
+                       '3d-raster':'rast3d',
                        'raster3d':'rast3d',
                        'raster3D files':'rast3d',
                        'vector':'vect',
@@ -469,8 +465,9 @@ class TreeCtrlComboPopup(wx.combo.ComboPopup):
                 self.value = [] 
             else:
                 mapsetItem = self.seltree.GetItemParent(item)
-                fullName = self.seltree.GetItemText(item) + '@' + \
-                    self.seltree.GetItemText(mapsetItem).split(':', -1)[1].strip()
+                fullName = self.seltree.GetItemText(item)
+                if self.fullyQualified:
+                    fullName += '@' + self.seltree.GetItemText(mapsetItem).split(':', -1)[1].strip()
                 
                 if self.multiple is True:
                     # text item should be unique
@@ -500,8 +497,9 @@ class TreeCtrlComboPopup(wx.combo.ComboPopup):
                 self.value = [] # cannot select mapset item
             else:
                 mapsetItem = self.seltree.GetItemParent(item)
-                fullName = self.seltree.GetItemText(item) + '@' + \
-                    self.seltree.GetItemText(mapsetItem).split(':', -1)[1].strip()
+                fullName = self.seltree.GetItemText(item)
+                if self.fullyQualified:
+                    fullName += '@' + self.seltree.GetItemText(mapsetItem).split(':', -1)[1].strip()
                 
                 if self.multiple is True:
                     # text item should be unique
@@ -525,7 +523,9 @@ class TreeCtrlComboPopup(wx.combo.ComboPopup):
             self.updateOnPopup = kargs['updateOnPopup']
         if 'onPopup' in kargs:
             self.onPopup = kargs['onPopup']
-
+        if 'fullyQualified' in kargs:
+            self.fullyQualified = kargs['fullyQualified']
+        
     def GetType(self):
         """!Get element type
         """
@@ -661,6 +661,8 @@ class LayerSelect(wx.ComboBox):
 
         # default value
         self.default = default
+        self.current = None
+        self.Bind(wx.EVT_COMBOBOX, self._selectionChanged)
 
         self.InsertLayers(vector = vector)
         
@@ -670,7 +672,7 @@ class LayerSelect(wx.ComboBox):
         @param vector name of vector map
         """
         if vector:
-            layers = utils.GetVectorNumberOfLayers(vector)
+            layers = GetAllVectorLayers(vector)
         else:
             layers = list()
         
@@ -684,16 +686,25 @@ class LayerSelect(wx.ComboBox):
                 layers.insert(0, str(self.default))
             elif self.default not in layers:
                 layers.append(self.default)
-        
+
         if len(layers) >= 1:
             self.SetItems(layers)
 
-    def Reset(self):
-        """!Reset value"""
+        self.Select()
+
+    def _selectionChanged(self, event):
+        """!Selection changed, store value."""
+        self.current = self.GetValue()
+        event.Skip()
+
+    def Select(self):
+        """!Select value (currently selected or default)"""
         items = self.GetItems()
         if items:
-            if '-1' in items:
-                self.SetStringSelection('-1')
+            if self.current is not None and self.current in items:
+                self.SetStringSelection(self.current)
+            elif self.default:
+                self.SetStringSelection(str(self.default))
             else:
                 self.SetSelection(0)
         else:
@@ -750,11 +761,11 @@ class TableSelect(wx.ComboBox):
             driver = connect['driver']
             database = connect['database']
         
-        ret = gcmd.RunCommand('db.tables',
-                              flags = 'p',
-                              read = True,
-                              driver = driver,
-                              database = database)
+        ret = RunCommand('db.tables',
+                         flags = 'p',
+                         read = True,
+                         driver = driver,
+                         database = database)
         
         if ret:
             for table in ret.splitlines():
@@ -788,12 +799,13 @@ class ColumnSelect(wx.ComboBox):
         if vector:
             self.InsertColumns(vector, layer)
     
-    def InsertColumns(self, vector, layer, excludeKey = False, type = None, dbInfo = None):
+    def InsertColumns(self, vector, layer, excludeKey = False, excludeCols = None, type = None, dbInfo = None):
         """!Insert columns for a vector attribute table into the columns combobox
 
         @param vector vector name
         @param layer vector layer number
         @param excludeKey exclude key column from the list?
+        @param excludeCols list of columns to be removed from the list
         @param type only columns of given type (given as list)
         """
         if not dbInfo:
@@ -808,18 +820,27 @@ class ColumnSelect(wx.ComboBox):
                 columns[val['index']] = key
             if excludeKey: # exclude key column
                 columns.remove(keyColumn)
+            if excludeCols: # exclude key column
+                for key in columnchoices.iterkeys():
+                    if key in excludeCols:
+                        columns.remove(key)
             if type: # only selected column types
                 for key, value in columnchoices.iteritems():
                     if value['type'] not in type:
-                        columns.remove(key)
+                        try:
+                            columns.remove(key)
+                        except ValueError:
+                            pass
         except (KeyError, ValueError):
             columns = list()
-        
+            
         self.SetItems(columns)
         self.SetValue(self.defaultValue)
         
         if self.param:
-            self.param['value'] = ''
+            value = self.param.get('value', '')
+            if value != '' and value in columns:
+                self.SetValue(value)
         
     def InsertTableColumns(self, table, driver=None, database=None):
         """!Insert table columns
@@ -830,11 +851,11 @@ class ColumnSelect(wx.ComboBox):
         """
         columns = list()
         
-        ret = gcmd.RunCommand('db.columns',
-                              read = True,
-                              driver = driver,
-                              database = database,
-                              table = table)
+        ret = RunCommand('db.columns',
+                         read = True,
+                         driver = driver,
+                         database = database,
+                         table = table)
         
         if ret:
             columns = ret.splitlines()
@@ -843,7 +864,9 @@ class ColumnSelect(wx.ComboBox):
         self.SetValue(self.defaultValue)
         
         if self.param:
-            self.param['value'] = ''
+            value = self.param.get('value', '')
+            if value != '' and value in columns:
+                self.SetValue(value)
 
 class DbaseSelect(wx.lib.filebrowsebutton.DirBrowseButton):
     """!Widget for selecting GRASS Database"""
@@ -868,7 +891,7 @@ class LocationSelect(wx.ComboBox):
         else:
             self.gisdbase = gisdbase
         
-        self.SetItems(utils.GetListOfLocations(self.gisdbase))
+        self.SetItems(GetListOfLocations(self.gisdbase))
 
     def UpdateItems(self, dbase):
         """!Update list of locations
@@ -877,16 +900,19 @@ class LocationSelect(wx.ComboBox):
         """
         self.gisdbase = dbase
         if dbase:
-            self.SetItems(utils.GetListOfLocations(self.gisdbase))
+            self.SetItems(GetListOfLocations(self.gisdbase))
         else:
             self.SetItems([])
         
 class MapsetSelect(wx.ComboBox):
     """!Widget for selecting GRASS mapset"""
     def __init__(self, parent, id = wx.ID_ANY, size = globalvar.DIALOG_COMBOBOX_SIZE, 
-                 gisdbase = None, location = None, setItems = True, **kwargs):
+                 gisdbase = None, location = None, setItems = True,
+                 searchPath = False, skipCurrent = False, **kwargs):
         super(MapsetSelect, self).__init__(parent, id, size = size, 
                                            style = wx.CB_READONLY, **kwargs)
+        self.searchPath  = searchPath
+        self.skipCurrent = skipCurrent
         
         self.SetName("MapsetSelect")
         if not gisdbase:
@@ -900,8 +926,8 @@ class MapsetSelect(wx.ComboBox):
             self.location = location
         
         if setItems:
-            self.SetItems(utils.GetListOfMapsets(self.gisdbase, self.location, selectable = False)) # selectable
-
+            self.SetItems(self._getMapsets())
+        
     def UpdateItems(self, location, dbase = None):
         """!Update list of mapsets for given location
 
@@ -912,16 +938,33 @@ class MapsetSelect(wx.ComboBox):
             self.gisdbase = dbase
         self.location = location
         if location:
-            self.SetItems(utils.GetListOfMapsets(self.gisdbase, self.location, selectable = False))
+            self.SetItems(self._getMapsets())
         else:
             self.SetItems([])
+     
+    def _getMapsets(self):
+        if self.searchPath:
+            mlist = RunCommand('g.mapsets',
+                               read = True, flags = 'p',
+                               fs = 'newline').splitlines()
+        else:
+            mlist = GetListOfMapsets(self.gisdbase, self.location,
+                                     selectable = False)
+        
+        gisenv = grass.gisenv()
+        if self.skipCurrent and \
+                gisenv['LOCATION_NAME'] == self.location and \
+                gisenv['MAPSET'] in mlist:
+            mlist.remove(gisenv['MAPSET'])
         
+        return mlist
+    
 class SubGroupSelect(wx.ComboBox):
     """!Widget for selecting subgroups"""
     def __init__(self, parent, id = wx.ID_ANY, size = globalvar.DIALOG_GSELECT_SIZE, 
                  **kwargs):
         super(SubGroupSelect, self).__init__(parent, id, size = size, 
-                                             style = wx.CB_READONLY, **kwargs)
+                                             **kwargs)
         self.SetName("SubGroupSelect")
 
     def Insert(self, group):
@@ -963,7 +1006,7 @@ class FormatSelect(wx.Choice):
             ftype = 'gdal'
         
         formats = list()
-        for f in utils.GetFormats()[ftype].values():
+        for f in GetFormats()[ftype].values():
             formats += f
         self.SetItems(formats)
         
@@ -1039,32 +1082,42 @@ class FormatSelect(wx.Choice):
             return ''
         
 class GdalSelect(wx.Panel):
-    def __init__(self, parent, panel, ogr = False,
-                 default = 'file',
-                 exclude = [],
-                 envHandler = None):
+    def __init__(self, parent, panel, ogr = False, link = False, dest = False, 
+                 default = 'file', exclude = [], envHandler = None):
         """!Widget for selecting GDAL/OGR datasource, format
         
         @param parent parent window
         @param ogr    use OGR selector instead of GDAL
+        @param dest   True for output (destination)
+        @param default deafult type (ignored when dest == True)
+        @param exclude list of types to be excluded
         """
         self.parent = parent
         self.ogr    = ogr
+        self.dest   = dest 
         wx.Panel.__init__(self, parent = panel, id = wx.ID_ANY)
 
-        self.settingsBox = wx.StaticBox(parent = self, id=wx.ID_ANY,
-                                        label=" %s " % _("Settings"))
+        self.settingsBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                                        label = " %s " % _("Settings"))
         
-        self.inputBox = wx.StaticBox(parent = self, id=wx.ID_ANY,
-                                     label=" %s " % _("Source"))
+        self.inputBox = wx.StaticBox(parent = self, id = wx.ID_ANY)
+        if dest:
+            self.inputBox.SetLabel(" %s " % _("Output settings"))
+        else:
+            self.inputBox.SetLabel(" %s " % _("Source settings"))
         
         # source type
         sources = list()
-        self.sourceMap = { 'file' : -1,
-                           'dir'  : -1,
-                           'db'   : -1,
-                           'pro'  : -1 }
+        self.sourceMap = { 'file'   : -1,
+                           'dir'    : -1,
+                           'db'     : -1,
+                           'pro'    : -1,
+                           'native' : -1 }
         idx = 0
+        if dest:
+            sources.append(_("Native"))
+            self.sourceMap['native'] = idx
+            idx += 1
         if 'file' not in exclude:
             sources.append(_("File"))
             self.sourceMap['file'] = idx
@@ -1080,23 +1133,31 @@ class GdalSelect(wx.Panel):
         if 'protocol' not in exclude:
             sources.append(_("Protocol"))
             self.sourceMap['pro'] = idx
+            idx += 1
         
         if self.ogr:
-            self.settingsFile = os.path.join(utils.GetSettingsPath(), 'wxOGR')
+            self.settingsFile = os.path.join(GetSettingsPath(), 'wxOGR')
         else:
-            self.settingsFile = os.path.join(utils.GetSettingsPath(), 'wxGDAL')
-        
-        self._settings = self._loadSettings()
+            self.settingsFile = os.path.join(GetSettingsPath(), 'wxGDAL')
+
         self.settingsChoice = wx.Choice(parent = self, id = wx.ID_ANY)
         self.settingsChoice.Bind(wx.EVT_CHOICE, self.OnSettingsLoad)
-        self.settingsChoice.SetItems(self._settings.keys())
-        self.btnSettings = wx.Button(parent = self, id = wx.ID_SAVE)
-        self.btnSettings.Bind(wx.EVT_BUTTON, self.OnSettingsSave)
+        self._settings = self._loadSettings() # -> self.settingsChoice.SetItems()
+        self.btnSettingsSave = wx.Button(parent = self, id = wx.ID_SAVE)
+        self.btnSettingsSave.Bind(wx.EVT_BUTTON, self.OnSettingsSave)
+        self.btnSettingsSave.SetToolTipString(_("Save current settings"))
+        self.btnSettingsDel = wx.Button(parent = self, id = wx.ID_REMOVE)
+        self.btnSettingsDel.Bind(wx.EVT_BUTTON, self.OnSettingsDelete)
+        self.btnSettingsSave.SetToolTipString(_("Delete currently selected settings"))
         
         self.source = wx.RadioBox(parent = self, id = wx.ID_ANY,
-                                  label = _('Source type'),
                                   style = wx.RA_SPECIFY_COLS,
                                   choices = sources)
+        if dest:
+            self.source.SetLabel(" %s " % _('Output type'))
+        else:
+            self.source.SetLabel(" %s " % _('Source type'))
+        
         self.source.SetSelection(0)
         self.source.Bind(wx.EVT_RADIOBOX, self.OnSetType)
         
@@ -1164,24 +1225,35 @@ class GdalSelect(wx.Panel):
             fType = 'gdal'
         self.input = { 'file' : [_("File:"),
                                  dsnFile,
-                                 utils.GetFormats()[fType]['file']],
-                       'dir'  : [_("Directory:"),
+                                 GetFormats()[fType]['file']],
+                       'dir'  : [_("Name:"),
                                  dsnDir,
-                                 utils.GetFormats()[fType]['file']],
-                       'db'   : [_("Database:"),
-                                 dsnDbFile,
-                                 utils.GetFormats()[fType]['database']],
+                                 GetFormats()[fType]['file']],
+                       'db'   : [_("Name:"),
+                                 dsnDbText,
+                                 GetFormats()[fType]['database']],
                        'pro'  : [_("Protocol:"),
                                  dsnPro,
-                                 utils.GetFormats()[fType]['protocol']],
+                                 GetFormats()[fType]['protocol']],
                        'db-win' : { 'file'   : dsnDbFile,
                                     'text'   : dsnDbText,
                                     'choice' : dsnDbChoice },
+                       'native' : [_("Name:"), dsnDir, ''],
                        }
         
-        self.dsnType = default
-        self.input[self.dsnType][1].Show()
-        self.format.SetItems(self.input[self.dsnType][2])
+        if self.dest:
+            current = RunCommand('v.external.out',
+                                 parent = self,
+                                 read = True, parse = grass.parse_key_val,
+                                 flags = 'g')
+            if current['format'] == 'native':
+                self.dsnType = 'native'
+            elif current['format'] in GetFormats()['ogr']['database']:
+                self.dsnType = 'db'
+            else:
+                self.dsnType = 'dir'
+        else:
+            self.dsnType = default
         
         self.dsnText = wx.StaticText(parent = self, id = wx.ID_ANY,
                                      label = self.input[self.dsnType][0],
@@ -1190,12 +1262,23 @@ class GdalSelect(wx.Panel):
                                            label = _("Extension:"))
         self.extensionText.Hide()
         
+        self.creationOpt = wx.TextCtrl(parent = self, id = wx.ID_ANY)
+        if not self.dest:
+            self.creationOpt.Hide()
+        
         self._layout()
         
-        if not ogr:
-            self.OnSetFormat(event = None, format = 'GeoTIFF')
+        self.OnSetType(event = None, sel = self.sourceMap[self.dsnType])
+        if self.dest:
+            if current['format'] != 'native':
+                self.OnSetFormat(event = None, format = current['format'])
+                self.OnSetDsn(event = None, path = current['dsn'])
+                self.creationOpt.SetValue(current['options'])
         else:
-            self.OnSetFormat(event = None, format = 'ESRI Shapefile')
+            if not ogr:
+                self.OnSetFormat(event = None, format = 'GeoTIFF')
+            else:
+                self.OnSetFormat(event = None, format = 'ESRI Shapefile')
         
     def _layout(self):
         """!Layout"""
@@ -1210,40 +1293,54 @@ class GdalSelect(wx.Panel):
         settingsSizer.Add(item = self.settingsChoice,
                           proportion = 1,
                           flag = wx.EXPAND)
-        settingsSizer.Add(item = self.btnSettings,
-                          flag = wx.LEFT,
+        settingsSizer.Add(item = self.btnSettingsSave,
+                          flag = wx.LEFT | wx.RIGHT,
+                          border = 5)
+        settingsSizer.Add(item = self.btnSettingsDel,
+                          flag = wx.RIGHT,
                           border = 5)
         
         inputSizer = wx.StaticBoxSizer(self.inputBox, wx.HORIZONTAL)
         
         self.dsnSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        self.dsnSizer.AddGrowableRow(1)
+        #self.dsnSizer.AddGrowableRow(0)
         self.dsnSizer.AddGrowableCol(3)
         
-        self.dsnSizer.Add(item=self.dsnText,
-                          flag=wx.ALIGN_CENTER_VERTICAL,
-                          pos = (0, 0))
-        self.dsnSizer.Add(item=self.input[self.dsnType][1],
-                          flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
-                          pos = (0, 1), span = (1, 3))
-        
+        row = 0
         self.dsnSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
                                                label = _("Format:")),
                           flag = wx.ALIGN_CENTER_VERTICAL,
-                          pos = (1, 0))
+                          pos = (row, 0))
         self.dsnSizer.Add(item=self.format,
                           flag = wx.ALIGN_CENTER_VERTICAL,
-                          pos = (1, 1))
+                          pos = (row, 1))
         self.dsnSizer.Add(item = self.extensionText,
                           flag=wx.ALIGN_CENTER_VERTICAL,
-                          pos = (1, 2))
+                          pos = (row, 2))
         self.dsnSizer.Add(item=self.extension,
                           flag = wx.ALIGN_CENTER_VERTICAL,
-                          pos = (1, 3))
+                          pos = (row, 3))
+        row += 1
+        self.dsnSizer.Add(item = self.dsnText,
+                          flag = wx.ALIGN_CENTER_VERTICAL,
+                          pos = (row, 0))
+        self.dsnSizer.Add(item = self.input[self.dsnType][1],
+                          flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
+                          pos = (row, 1), span = (1, 3))
+        row += 1
+        if self.creationOpt.IsShown():
+            self.dsnSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                                   label = _("Creation options:")),
+                              flag = wx.ALIGN_CENTER_VERTICAL,
+                              pos = (row, 0))
+            self.dsnSizer.Add(item = self.creationOpt,
+                              flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
+                              pos = (row, 1), span = (1, 3))
+            row += 1
+        
+        inputSizer.Add(item=self.dsnSizer, proportion = 1,
+                       flag=wx.EXPAND | wx.BOTTOM, border = 10)
         
-        inputSizer.Add(item=self.dsnSizer, proportion=1,
-                       flag=wx.EXPAND | wx.ALL)
-
         mainSizer.Add(item=settingsSizer, proportion=0,
                       flag=wx.ALL | wx.EXPAND, border=5)
         mainSizer.Add(item=self.source, proportion=0,
@@ -1269,13 +1366,14 @@ class GdalSelect(wx.Panel):
         """!Load named settings"""
         name = event.GetString()
         if name not in self._settings:
-            gcmd.GError(parent = self,
-                        message = _("Settings named '%s' not found") % name)
+            GError(parent = self,
+                   message = _("Settings <%s> not found") % name)
             return
         data = self._settings[name]
         self.OnSetType(event = None, sel = self.sourceMap[data[0]])
         self.OnSetFormat(event = None, format = data[2])
         self.OnSetDsn(event = None, path = data[1])
+        self.creationOpt.SetValue(data[3])
         
     def OnSettingsSave(self, event):
         """!Save settings"""
@@ -1285,30 +1383,69 @@ class GdalSelect(wx.Panel):
         if dlg.ShowModal() != wx.ID_OK:
             return
         
+        # check required params
         if not dlg.GetValue():
-            gcmd.GMessage(parent = self,
-                          message = _("Name not given, settings is not saved."))
+            GMessage(parent = self,
+                     message = _("Name not given, settings is not saved."))
             return
         
-        name = dlg.GetValue()
-        try:
-            fd = open(self.settingsFile, 'a')
-            fd.write(name + ';' + self.dsnType + ';' +
-                     self._getDsn() + ';' +
-                     self.format.GetStringSelection())
-            fd.write('\n')
-        except IOError:
-            gcmd.GError(parent = self,
-                        message = _("Unable to save settings"))
+        if not self.GetDsn():
+            GMessage(parent = self,
+                     message = _("No data source defined, settings is not saved."))
             return
-        fd.close()
         
-        self._settings = self._loadSettings()
-        self.settingsChoice.Append(name)
-        self.settingsChoice.SetStringSelection(name)
+        name = dlg.GetValue()
+        
+        # check if settings item already exists
+        if name in self._settings:
+            dlgOwt = wx.MessageDialog(self, message = _("Settings <%s> already exists. "
+                                                        "Do you want to overwrite the settings?") % name,
+                                      caption = _("Save settings"), style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+            if dlgOwt.ShowModal() != wx.ID_YES:
+                dlgOwt.Destroy()
+                return
+        
+        self._settings[name] = (self.dsnType, self.GetDsn(),
+                                self.format.GetStringSelection(),
+                                self.creationOpt.GetValue())
+        
+        if self._saveSettings() == 0:
+            self._settings = self._loadSettings()
+            self.settingsChoice.SetStringSelection(name)
         
         dlg.Destroy()
-                
+ 
+    def OnSettingsDelete(self, event):
+        """!Save settings"""
+        name = self.settingsChoice.GetStringSelection()
+        if not name:
+            GMessage(parent = self,
+                     message = _("No settings is defined. Operation canceled."))
+            return
+        
+        self._settings.pop(name)
+        if self._saveSettings() == 0:
+            self._settings = self._loadSettings()
+        
+    def _saveSettings(self):
+        """!Save settings into the file
+
+        @return 0 on success
+        @return -1 on failure
+        """
+        try:
+            fd = open(self.settingsFile, 'w')
+            for key, value in self._settings.iteritems():
+                fd.write('%s;%s;%s;%s\n' % (key, value[0], value[1], value[2]))
+        except IOError:
+            GError(parent = self,
+                   message = _("Unable to save settings"))
+            return -1
+        else:
+            fd.close()
+        
+        return 0
+
     def _loadSettings(self):
         """!Load settings from the file
 
@@ -1325,14 +1462,20 @@ class GdalSelect(wx.Panel):
             fd = open(self.settingsFile, 'r')
             for line in fd.readlines():
                 try:
-                    name, ftype, dsn, format = line.rstrip('\n').split(';')
-                    data[name] = (ftype, dsn, format)
+                    lineData = line.rstrip('\n').split(';')
+                    if len(lineData) > 4:
+                        # type, dsn, format, options
+                        data[lineData[0]] = (lineData[1], lineData[2], lineData[3], lineData[4])
+                    else:
+                        data[lineData[0]] = (lineData[1], lineData[2], lineData[3], '')
                 except ValueError:
                     pass
         except IOError:
             return data
+        else:
+            fd.close()
         
-        fd.close()
+        self.settingsChoice.SetItems(sorted(data.keys()))
         
         return data
 
@@ -1342,10 +1485,11 @@ class GdalSelect(wx.Panel):
             sel = event.GetSelection()
         else:
             self.source.SetSelection(sel)
-        
         win = self.input[self.dsnType][1]
-        self.dsnSizer.Remove(win)
-        win.Hide()
+        if win:
+            self.dsnSizer.Remove(win)
+            win.Hide()
+        
         if sel == self.sourceMap['file']:   # file
             self.dsnType = 'file'
             format = self.input[self.dsnType][2][0]
@@ -1369,39 +1513,46 @@ class GdalSelect(wx.Panel):
         
         elif sel == self.sourceMap['dir']: # directory
             self.dsnType = 'dir'
-        elif sel == self.sourceMap['db']: # database
+        elif sel == self.sourceMap['db']:  # database
             self.dsnType = 'db'
         elif sel == self.sourceMap['pro']: # protocol
             self.dsnType = 'pro'
+        elif sel == self.sourceMap['native']:
+            self.dsnType = 'native'
         
-        self.dsnText.SetLabel(self.input[self.dsnType][0])
-        if self.parent.GetName() == 'MultiImportDialog':
-            self.parent.list.DeleteAllItems()
-        self.format.SetItems(self.input[self.dsnType][2])        
-        
-        if sel in (self.sourceMap['file'],
-                   self.sourceMap['dir']):
-            win = self.input[self.dsnType][1]
-            self.dsnSizer.Add(item=self.input[self.dsnType][1],
-                              flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
-                              pos = (0, 1))
-            win.SetValue('')
-            win.Show()
-            
+        if self.dsnType == 'db':
+            self.input[self.dsnType][1] = self.input['db-win']['text']
+        win = self.input[self.dsnType][1]
+                
+        self.dsnSizer.Add(item = self.input[self.dsnType][1],
+                          flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
+                          pos = (1, 1), span = (1, 3))
+        win.SetValue('')
+        win.Show()
+        
+        if sel == self.sourceMap['native']: # native
+            win.Enable(False)
+            self.format.Enable(False)
+            self.creationOpt.Enable(False)
+            self.parent.btnOk.Enable(True)
+        else:
+            if not win.IsEnabled():
+                win.Enable(True)
+            if not self.format.IsEnabled():
+                self.format.Enable(True)
+                self.creationOpt.Enable(True)
+            self.dsnText.SetLabel(self.input[self.dsnType][0])
+            self.format.SetItems(self.input[self.dsnType][2])
+            if self.parent.GetName() == 'MultiImportDialog':
+                self.parent.list.DeleteAllItems()
+        
+        if sel in (self.sourceMap['file'], self.sourceMap['dir']):
             if not self.ogr:
                 self.OnSetFormat(event = None, format = 'GeoTIFF')
             else:
                 self.OnSetFormat(event = None, format = 'ESRI Shapefile')
-        else:
-            if sel == self.sourceMap['pro']:
-                win = self.input[self.dsnType][1]
-                self.dsnSizer.Add(item=self.input[self.dsnType][1],
-                                  flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
-                                  pos = (0, 1))
-                win.SetValue('')
-                win.Show()
-        
-        if sel == self.sourceMap['dir']:
+        
+        if sel == self.sourceMap['dir'] and not self.dest:
             if not self.extension.IsShown():
                 self.extensionText.Show()
                 self.extension.Show()
@@ -1409,18 +1560,22 @@ class GdalSelect(wx.Panel):
             if self.extension.IsShown():
                 self.extensionText.Hide()
                 self.extension.Hide()
-            
+        
         self.dsnSizer.Layout()
         
-    def _getDsn(self):
-        """!Get datasource name"""
+    def GetDsn(self):
+        """!Get datasource name
+        """
         if self.format.GetStringSelection() == 'PostgreSQL':
-            return 'PG:dbname=%s' % self.input[self.dsnType][1].GetStringSelection()
+            dsn = 'PG:dbname=%s' % self.input[self.dsnType][1].GetStringSelection()
+        else:
+            dsn = self.input[self.dsnType][1].GetValue()
         
-        return self.input[self.dsnType][1].GetValue()
+        return dsn
     
     def OnSetDsn(self, event, path = None):
-        """!Input DXF file/OGR dsn defined, update list of layer widget"""
+        """!Input DXF file/OGR dsn defined, update list of layer
+        widget"""
         if event:
             path = event.GetString()
         else:
@@ -1428,60 +1583,69 @@ class GdalSelect(wx.Panel):
                 for item in path.split(':', 1)[1].split(','):
                     key, value = item.split('=', 1)
                     if key == 'dbname':
-                        self.input[self.dsnType][1].SetStringSelection(value)
+                        if not self.input[self.dsnType][1].SetStringSelection(value):
+                            GMessage(_("Database <%s> not accessible.") % value,
+                                     parent = self)
                         break
             else:
                 self.input[self.dsnType][1].SetValue(path)
-        
+
         if not path:
-            return 
+            if self.dest:
+                self.parent.btnOk.Enable(False)
+            return
         
-        self._reloadLayers()
+        if self.dest:
+            self.parent.btnOk.Enable(True)
+        else:
+            self._reloadLayers()
         
         if event:
             event.Skip()
         
     def _reloadLayers(self):
         """!Reload list of layers"""
-        dsn = self._getDsn()
+        dsn = self.GetDsn()
         if not dsn:
             return
         
         data = list()        
-        
         layerId = 1
-        dsn = self._getDsn()
         
-        if self.dsnType == 'file':
-            baseName = os.path.basename(dsn)
-            grassName = utils.GetValidLayerName(baseName.split('.', -1)[0])
-            data.append((layerId, baseName, grassName))
-        elif self.dsnType == 'dir':
-            ext = self.extension.GetValue()
-            for file in glob.glob(os.path.join(dsn, "%s") % self._getExtPatternGlob(ext)):
-                baseName = os.path.basename(file)
-                grassName = utils.GetValidLayerName(baseName.split('.', -1)[0])
-                data.append((layerId, baseName, grassName))
-                layerId += 1
-        elif self.dsnType == 'db':
-            ret = gcmd.RunCommand('v.in.ogr',
-                                  quiet = True,
-                                  read = True,
-                                  flags = 'l',
-                                  dsn = dsn)
+        if self.ogr:
+            ret = RunCommand('v.in.ogr',
+                             quiet = True,
+                             read = True,
+                             flags = 'l',
+                             dsn = dsn)
             if not ret:
                 self.parent.list.LoadData()
                 if hasattr(self, "btn_run"):
                     self.btn_run.Enable(False)
                 return
+            
             layerId = 1
             for line in ret.split(','):
                 layerName = line.strip()
-                grassName = utils.GetValidLayerName(layerName)
-                data.append((layerId, layerName.strip(), grassName.strip()))
+                grassName = GetValidLayerName(layerName)
+                data.append((layerId, layerName, grassName))
                 layerId += 1
+        else:
+            if self.dsnType == 'file':
+                baseName = os.path.basename(dsn)
+                grassName = GetValidLayerName(baseName.split('.', -1)[0])
+                data.append((layerId, baseName, grassName))
+            elif self.dsnType == 'dir':
+                ext = self.extension.GetValue()
+                for filename in glob.glob(os.path.join(dsn, "%s") % self._getExtPatternGlob(ext)):
+                    baseName = os.path.basename(filename)
+                    grassName = GetValidLayerName(baseName.split('.', -1)[0])
+                    data.append((layerId, baseName, grassName))
+                    layerId += 1
+        if self.ogr:
+            dsn += '@OGR'
         
-        evt = wxGdalSelect(dsn = dsn + '@OGR')
+        evt = wxGdalSelect(dsn = dsn)
         evt.SetId(self.input[self.dsnType][1].GetId())
         wx.PostEvent(self.parent, evt)
         
@@ -1494,8 +1658,9 @@ class GdalSelect(wx.Panel):
         
     def OnSetExtension(self, event):
         """!Extension changed"""
-        # reload layers
-        self._reloadLayers()
+        if not self.dest:
+            # reload layers
+            self._reloadLayers()
         
     def OnSetFormat(self, event, format = None):
         """!Format changed"""
@@ -1555,36 +1720,32 @@ class GdalSelect(wx.Panel):
                                 if dbname:
                                     db.append(dbname)
                             win.SetItems(db)
+                    if self.dest and win.GetStringSelection():
+                        self.parent.btnOk.Enable(True)
                 else:
                     win = self.input['db-win']['text']
             else:
                 win = self.input['db-win']['text']
-            
+        
         self.input[self.dsnType][1] = win
         if not win.IsShown():
             win.Show()
         self.dsnSizer.Add(item = self.input[self.dsnType][1],
                           flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
-                          pos = (0, 1), span = (1, 3))
+                          pos = (1, 1), span = (1, 3))
         self.dsnSizer.Layout()
         
         # update extension
         self.extension.SetValue(self.GetFormatExt())
 
-        # reload layers
-        self._reloadLayers()
+        if not self.dest:
+            # reload layers
+            self._reloadLayers()
         
     def GetType(self):
         """!Get source type"""
         return self.dsnType
 
-    def GetDsn(self):
-        """!Get DSN"""
-        if self.format.GetStringSelection() == 'PostgreSQL':
-            return 'PG:dbname=%s' % self.input[self.dsnType][1].GetStringSelection()
-        
-        return self.input[self.dsnType][1].GetValue()
-
     def GetDsnWin(self):
         """!Get list of DSN windows"""
         win = list()
@@ -1595,10 +1756,21 @@ class GdalSelect(wx.Panel):
         
         return win
     
+    def GetFormat(self):
+        """!Get format as string"""
+        return self.format.GetStringSelection().replace(' ', '_')
+    
     def GetFormatExt(self):
         """!Get format extension"""
         return self.format.GetExtension(self.format.GetStringSelection())
     
+    def GetOptions(self):
+        """!Get creation options"""
+        if not self.creationOpt.IsShown():
+            return ''
+        
+        return self.creationOpt.GetValue()
+
 class ProjSelect(wx.ComboBox):
     """!Widget for selecting input raster/vector map used by
     r.proj/v.proj modules."""
@@ -1618,26 +1790,26 @@ class ProjSelect(wx.ComboBox):
         if not mapset:
             mapset = grass.gisenv()['MAPSET']
         if self.isRaster:
-            ret = gcmd.RunCommand('r.proj',
-                                  quiet = True,
-                                  read = True,
-                                  flags = 'l',
-                                  dbase = dbase,
-                                  location = location,
-                                  mapset = mapset)
+            ret = RunCommand('r.proj',
+                             quiet = True,
+                             read = True,
+                             flags = 'l',
+                             dbase = dbase,
+                             location = location,
+                             mapset = mapset)
         else:
-            ret = gcmd.RunCommand('v.proj',
-                                  quiet = True,
-                                  read = True,
-                                  flags = 'l',
-                                  dbase = dbase,
-                                  location = location,
-                                  mapset = mapset)
+            ret = RunCommand('v.proj',
+                             quiet = True,
+                             read = True,
+                             flags = 'l',
+                             dbase = dbase,
+                             location = location,
+                             mapset = mapset)
         listMaps = list()
         if ret:
             for line in ret.splitlines():
                 listMaps.append(line.strip())
-        utils.ListSortLower(listMaps)
+        ListSortLower(listMaps)
         
         self.SetItems(listMaps)
         self.SetValue('')
diff --git a/gui/wxpython/gui_core/mapdisp.py b/gui/wxpython/gui_core/mapdisp.py
new file mode 100644
index 0000000..ca07354
--- /dev/null
+++ b/gui/wxpython/gui_core/mapdisp.py
@@ -0,0 +1,342 @@
+"""!
+ at package gui_core.mapdisp
+
+ at brief Base classes for Map display window
+
+Classes:
+ - mapdisp::MapFrameBase
+
+(C) 2009-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+ at author Michael Barton <michael.barton at asu.edu>
+"""
+
+import os
+import sys
+
+import wx
+
+from core       import globalvar
+from core.debug import Debug
+
+from grass.script import core as grass
+
+class MapFrameBase(wx.Frame):
+    """!Base class for map display window
+    
+    Derived class must use statusbarManager or override
+    GetProperty, SetProperty and HasProperty methods.
+    If derived class enables and disables auto-rendering,
+    it should override IsAutoRendered method.
+    """
+    def __init__(self, parent = None, id = wx.ID_ANY, title = None,
+                 style = wx.DEFAULT_FRAME_STYLE, toolbars = None,
+                 Map = None, auimgr = None, name = None, **kwargs):
+        """!
+        @param toolbars array of activated toolbars, e.g. ['map', 'digit']
+        @param Map instance of render.Map
+        @param auimgs AUI manager
+        @param name frame name
+        @param kwargs wx.Frame attributes
+        """
+        
+
+        self.Map        = Map       # instance of render.Map
+        self.parent     = parent
+        
+        wx.Frame.__init__(self, parent, id, title, style = style, name = name, **kwargs)
+        
+        # available cursors
+        self.cursors = {
+            # default: cross
+            # "default" : wx.StockCursor(wx.CURSOR_DEFAULT),
+            "default" : wx.StockCursor(wx.CURSOR_ARROW),
+            "cross"   : wx.StockCursor(wx.CURSOR_CROSS),
+            "hand"    : wx.StockCursor(wx.CURSOR_HAND),
+            "pencil"  : wx.StockCursor(wx.CURSOR_PENCIL),
+            "sizenwse": wx.StockCursor(wx.CURSOR_SIZENWSE)
+            }
+                
+        #
+        # set the size & system icon
+        #
+        self.SetClientSize(self.GetSize())
+        self.iconsize = (16, 16)
+
+        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass_map.ico'), wx.BITMAP_TYPE_ICO))
+        
+        # toolbars
+        self.toolbars = {}
+        
+        #
+        # Fancy gui
+        #
+        self._mgr = wx.aui.AuiManager(self)
+        
+    def _initMap(self, map):
+        """!Initialize map display, set dimensions and map region
+        """
+        if not grass.find_program('g.region', ['--help']):
+            sys.exit(_("GRASS module '%s' not found. Unable to start map "
+                       "display window.") % 'g.region')
+        
+        self.width, self.height = self.GetClientSize()
+        
+        Debug.msg(2, "MapFrame._initMap():")
+        map.ChangeMapSize(self.GetClientSize())
+        map.region = map.GetRegion() # g.region -upgc
+        # self.Map.SetRegion() # adjust region to match display window
+        
+    def SetProperty(self, name, value):
+        """!Sets property"""
+        self.statusbarManager.SetProperty(name, value)
+        
+    def GetProperty(self, name):
+        """!Returns property"""
+        return self.statusbarManager.GetProperty(name)
+        
+    def HasProperty(self, name):
+        """!Checks whether object has property"""
+        return self.statusbarManager.HasProperty(name)
+    
+    def GetPPM(self):
+        """! Get pixel per meter
+        
+        @todo now computed every time, is it necessary?
+        @todo enable user to specify ppm (and store it in UserSettings)
+        """
+        # TODO: need to be fixed...
+        ### screen X region problem
+        ### user should specify ppm
+        dc = wx.ScreenDC()
+        dpSizePx = wx.DisplaySize()   # display size in pixels
+        dpSizeMM = wx.DisplaySizeMM() # display size in mm (system)
+        dpSizeIn = (dpSizeMM[0] / 25.4, dpSizeMM[1] / 25.4) # inches
+        sysPpi  = dc.GetPPI()
+        comPpi = (dpSizePx[0] / dpSizeIn[0],
+                  dpSizePx[1] / dpSizeIn[1])
+
+        ppi = comPpi                  # pixel per inch
+        ppm = ((ppi[0] / 2.54) * 100, # pixel per meter
+                    (ppi[1] / 2.54) * 100)
+        
+        Debug.msg(4, "MapFrameBase.GetPPM(): size: px=%d,%d mm=%f,%f "
+                  "in=%f,%f ppi: sys=%d,%d com=%d,%d; ppm=%f,%f" % \
+                  (dpSizePx[0], dpSizePx[1], dpSizeMM[0], dpSizeMM[1],
+                   dpSizeIn[0], dpSizeIn[1],
+                   sysPpi[0], sysPpi[1], comPpi[0], comPpi[1],
+                   ppm[0], ppm[1]))
+        
+        return ppm
+    
+    def SetMapScale(self, value, map = None):
+        """! Set current map scale
+        
+        @param value scale value (n if scale is 1:n)
+        @param map Map instance (if none self.Map is used)
+        """
+        if not map:
+            map = self.Map
+        
+        region = self.Map.region
+        dEW = value * (region['cols'] / self.GetPPM()[0])
+        dNS = value * (region['rows'] / self.GetPPM()[1])
+        region['n'] = region['center_northing'] + dNS / 2.
+        region['s'] = region['center_northing'] - dNS / 2.
+        region['w'] = region['center_easting']  - dEW / 2.
+        region['e'] = region['center_easting']  + dEW / 2.
+        
+        # add to zoom history
+        self.GetWindow().ZoomHistory(region['n'], region['s'],
+                                   region['e'], region['w'])
+    
+    def GetMapScale(self, map = None):
+        """! Get current map scale
+        
+        @param map Map instance (if none self.Map is used)
+        """
+        if not map:
+            map = self.Map
+        
+        region = map.region
+        ppm = self.GetPPM()
+
+        heightCm = region['rows'] / ppm[1] * 100
+        widthCm  = region['cols'] / ppm[0] * 100
+
+        Debug.msg(4, "MapFrame.GetMapScale(): width_cm=%f, height_cm=%f" %
+                  (widthCm, heightCm))
+
+        xscale = (region['e'] - region['w']) / (region['cols'] / ppm[0])
+        yscale = (region['n'] - region['s']) / (region['rows'] / ppm[1])
+        scale = (xscale + yscale) / 2.
+        
+        Debug.msg(3, "MapFrame.GetMapScale(): xscale=%f, yscale=%f -> scale=%f" % \
+                      (xscale, yscale, scale))
+        
+        return scale
+        
+    def GetProgressBar(self):
+        """!Returns progress bar
+        
+        Progress bar can be used by other classes.
+        """
+        return self.statusbarManager.GetProgressBar()
+        
+    def GetMap(self):
+        """!Returns current Map instance
+        """
+        return self.Map
+
+    def GetWindow(self):
+        """!Get map window"""
+        return self.MapWindow
+        
+    def GetMapToolbar(self):
+       """!Returns toolbar with zooming tools"""
+       raise NotImplementedError()
+       
+    def GetToolbar(self, name):
+        """!Returns toolbar if exists else None.
+        
+        Toolbars dictionary contains currently used toolbars only.
+        """
+        if name in self.toolbars:
+            return self.toolbars[name]
+        
+        return None
+       
+    def StatusbarUpdate(self):
+        """!Update statusbar content"""
+        self.statusbarManager.Update()
+        
+    def IsAutoRendered(self):
+        """!Check if auto-rendering is enabled"""
+        return self.GetProperty('render')
+        
+    def CoordinatesChanged(self):
+        """!Shows current coordinates on statusbar.
+        
+        Used in BufferedWindow to report change of map coordinates (under mouse cursor).
+        """
+        self.statusbarManager.ShowItem('coordinates')
+        
+    def StatusbarReposition(self):
+        """!Reposition items in statusbar"""
+        self.statusbarManager.Reposition()
+        
+    def StatusbarEnableLongHelp(self, enable = True):
+        """!Enable/disable toolbars long help"""
+        for toolbar in self.toolbars.itervalues():
+            toolbar.EnableLongHelp(enable)
+        
+    def IsStandalone(self):
+        """!Check if Map display is standalone"""
+        raise NotImplementedError("IsStandalone")
+   
+    def OnRender(self, event):
+        """!Re-render map composition (each map layer)
+        """
+        raise NotImplementedError("OnRender")
+        
+    def OnDraw(self, event):
+        """!Re-display current map composition
+        """
+        self.MapWindow.UpdateMap(render = False)
+        
+    def OnErase(self, event):
+        """!Erase the canvas
+        """
+        self.MapWindow.EraseMap()
+        
+    def OnZoomIn(self, event):
+        """!Zoom in the map.
+        Set mouse cursor, zoombox attributes, and zoom direction
+        """
+        toolbar = self.GetMapToolbar()
+        self._switchTool(toolbar, event)
+        
+        win = self.GetWindow()
+        self._prepareZoom(mapWindow = win, zoomType = 1)
+        
+    def OnZoomOut(self, event):
+        """!Zoom out the map.
+        Set mouse cursor, zoombox attributes, and zoom direction
+        """
+        toolbar = self.GetMapToolbar()
+        self._switchTool(toolbar, event)
+        
+        win = self.GetWindow()
+        self._prepareZoom(mapWindow = win, zoomType = -1)
+        
+    def _prepareZoom(self, mapWindow, zoomType):
+        """!Prepares MapWindow for zoom, toggles toolbar
+        
+        @param mapWindow MapWindow to prepare
+        @param zoomType 1 for zoom in, -1 for zoom out
+        """
+        mapWindow.mouse['use'] = "zoom"
+        mapWindow.mouse['box'] = "box"
+        mapWindow.zoomtype = zoomType
+        mapWindow.pen = wx.Pen(colour = 'Red', width = 2, style = wx.SHORT_DASH)
+        
+        # change the cursor
+        mapWindow.SetCursor(self.cursors["cross"])
+    
+    def _switchTool(self, toolbar, event):
+        """!Helper function to switch tools"""
+        if toolbar:
+            toolbar.OnTool(event)
+            toolbar.action['desc'] = ''
+            
+    def OnPointer(self, event):
+        """!Sets mouse mode to pointer."""
+        self.MapWindow.mouse['use'] = 'pointer'
+
+    def OnPan(self, event):
+        """!Panning, set mouse to drag
+        """
+        toolbar = self.GetMapToolbar()
+        self._switchTool(toolbar, event)
+        
+        win = self.GetWindow()
+        self._preparePan(mapWindow = win)
+    
+    def _preparePan(self, mapWindow):
+        """!Prepares MapWindow for pan, toggles toolbar
+        
+        @param mapWindow MapWindow to prepare
+        """
+        mapWindow.mouse['use'] = "pan"
+        mapWindow.mouse['box'] = "pan"
+        mapWindow.zoomtype = 0
+        
+        # change the cursor
+        mapWindow.SetCursor(self.cursors["hand"])
+        
+    def OnZoomBack(self, event):
+        """!Zoom last (previously stored position)
+        """
+        self.MapWindow.ZoomBack()
+        
+    def OnZoomToMap(self, event):
+        """!
+        Set display extents to match selected raster (including NULLs)
+        or vector map.
+        """
+        self.MapWindow.ZoomToMap(layers = self.Map.GetListOfLayers())
+    
+    def OnZoomToWind(self, event):
+        """!Set display geometry to match computational region
+        settings (set with g.region)
+        """
+        self.MapWindow.ZoomToWind()
+        
+    def OnZoomToDefault(self, event):
+        """!Set display geometry to match default region settings
+        """
+        self.MapWindow.ZoomToDefault()
diff --git a/gui/wxpython/gui_core/mapwindow.py b/gui/wxpython/gui_core/mapwindow.py
new file mode 100644
index 0000000..edb2de0
--- /dev/null
+++ b/gui/wxpython/gui_core/mapwindow.py
@@ -0,0 +1,240 @@
+"""!
+ at package gui_core.mapwindow
+
+ at brief Map display canvas - base class for buffered window.
+
+Classes:
+ - mapwindow::MapWindow
+
+(C) 2006-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+ at author Michael Barton
+ at author Jachym Cepicky
+"""
+
+import wx
+
+from core.settings import UserSettings
+
+class MapWindow(object):
+    """!Abstract map display window class
+    
+    Superclass for BufferedWindow class (2D display mode), and GLWindow
+    (3D display mode).
+    
+    Subclasses have to define
+     - _bindMouseEvents method which binds MouseEvent handlers
+     - Pixel2Cell
+     - Cell2Pixel (if it is possible)
+    
+    """
+    def __init__(self, parent, id = wx.ID_ANY,
+                 Map = None, tree = None, lmgr = None, **kwargs):
+        self.parent = parent # MapFrame
+        self.Map    = Map
+        self.tree   = tree
+        self.lmgr   = lmgr
+        
+        # mouse attributes -- position on the screen, begin and end of
+        # dragging, and type of drawing
+        self.mouse = {
+            'begin': [0, 0], # screen coordinates
+            'end'  : [0, 0],
+            'use'  : "pointer",
+            'box'  : "point"
+            }
+        # last east, north coordinates, changes on mouse motion
+        self.lastEN = None 
+        
+        # stores overridden cursor
+        self._overriddenCursor = None
+
+    def RegisterMouseEventHandler(self, event, handler, cursor = None):
+        """!Binds event handler
+        
+        Call event.Skip() in handler to allow default processing in MapWindow.
+        
+        \code
+        # your class methods
+        def OnButton(self, event):
+            # current map display's map window
+            # expects LayerManager to be the parent
+            self.mapwin = self.parent.GetLayerTree().GetMapDisplay().GetWindow()
+            if self.mapwin.RegisterMouseEventHandler(wx.EVT_LEFT_DOWN, self.OnMouseAction,
+                                                     wx.StockCursor(wx.CURSOR_CROSS)):
+                self.parent.GetLayerTree().GetMapDisplay().Raise()
+            else:
+                # handle that you cannot get coordinates
+        
+        def OnMouseAction(self, event):
+            # get real world coordinates of mouse click
+            coor = self.mapwin.Pixel2Cell(event.GetPositionTuple()[:])
+            self.text.SetLabel('Coor: ' + str(coor))
+            self.mapwin.UnregisterMouseEventHandler(wx.EVT_LEFT_DOWN)
+            event.Skip()
+        \endcode
+        
+        @param event one of mouse events
+        @param handler function to handle event
+        @param cursor cursor which temporary overrides current cursor
+        
+        @return True if successful
+        @return False if event cannot be bind
+        """
+        
+        # if it is a VDigitWindow it cannot be used
+        # hasattr is ugly
+        if hasattr(self, "digit"):
+            return False
+        
+        self.Bind(event, handler)
+        self.mouse['useBeforeGenericEvent'] = self.mouse['use']
+        self.mouse['use'] = 'genericEvent'
+        
+        if cursor:
+            self._overriddenCursor = self.GetCursor()
+            self.SetCursor(cursor)
+        
+        return True
+
+
+    def UnregisterMouseEventHandler(self, event):
+        """!Unbinds event handler a restores previous state
+        
+        You should unbind to restore normal MapWindow behaviour.
+        Note that this operation will unbind any other external (non-MapWindow) handlers.
+        
+        @param event event to unbind
+        
+        @return True if successful
+        @return False if event cannot be unbind
+        """
+        if hasattr(self, "digit"):
+            return False
+        
+        # it is not yet possible in wxPython to unbind exact event
+        ret = self.Unbind(event)
+        
+        # restore bind state
+        self._bindMouseEvents()
+        
+        # restore mouse use (previous state)
+        self.mouse['use'] = self.mouse['useBeforeGenericEvent']
+        
+        # restore overridden cursor
+        if self._overriddenCursor:
+            self.SetCursor(self._overriddenCursor)
+        
+        return ret
+    
+    def Pixel2Cell(self, (x, y)):
+        raise NotImplementedError()
+    
+    def Cell2Pixel(self, (east, north)):
+        raise NotImplementedError()
+
+    def OnMotion(self, event):
+        """!Tracks mouse motion and update statusbar
+        
+        @see GetLastEN
+        """
+        try:
+            self.lastEN = self.Pixel2Cell(event.GetPositionTuple())
+        except (ValueError):
+            self.lastEN = None
+        # FIXME: special case for vdigit and access to statusbarManager
+        if self.parent.statusbarManager.GetMode() == 0: # Coordinates            
+            updated = False
+            if hasattr(self, "digit"):
+                precision = int(UserSettings.Get(group = 'projection', key = 'format',
+                                             subkey = 'precision'))
+                updated = self._onMotion(self.lastEN, precision)
+
+            if not updated:
+                self.parent.CoordinatesChanged()
+        
+        event.Skip()
+
+    def GetLastEN(self):
+        """!Returns last coordinates of mouse cursor.
+        
+        @see OnMotion
+        """
+        return self.lastEN
+    
+    def GetLayerByName(self, name, mapType, dataType = 'layer'):
+        """!Get layer from layer tree by nam
+        
+        @param name layer name
+        @param type 'item' / 'layer' / 'nviz'
+
+        @return layer / map layer properties / nviz properties
+        @return None
+        """
+        if not self.tree:
+            return None
+        
+        try:
+            mapLayer = self.Map.GetListOfLayers(l_type = mapType, l_name = name)[0]
+        except IndexError:
+            return None
+        
+        if dataType == 'layer':
+            return mapLayer
+        item = self.tree.FindItemByData('maplayer', mapLayer)
+        if not item:
+            return None
+        if dataType == 'nviz':
+            return self.tree.GetPyData(item)[0]['nviz']
+        
+        return item
+        
+    def GetSelectedLayer(self, type = 'layer', multi = False):
+        """!Get selected layer from layer tree
+        
+        @param type 'item' / 'layer' / 'nviz'
+        @param multi return first selected layer or all
+        
+        @return layer / map layer properties / nviz properties
+        @return None / [] on failure
+        """
+        ret = []
+        if not self.tree or \
+                not self.tree.GetSelection():
+            if multi:
+                return []
+            else:
+                return None
+        
+        if multi and \
+                type == 'item':
+            return self.tree.GetSelections()
+        
+        for item in self.tree.GetSelections():
+            if not item.IsChecked():
+                if multi:
+                    continue
+                else:
+                    return None
+
+            if type == 'item': # -> multi = False
+                return item
+        
+            try:
+                if type == 'nviz':
+                    layer = self.tree.GetPyData(item)[0]['nviz']
+                else:
+                    layer = self.tree.GetPyData(item)[0]['maplayer']
+            except:
+                layer = None
+
+            if multi:
+                ret.append(layer)
+            else:
+                return layer
+            
+        return ret
diff --git a/gui/wxpython/gui_modules/menu.py b/gui/wxpython/gui_core/menu.py
similarity index 88%
rename from gui/wxpython/gui_modules/menu.py
rename to gui/wxpython/gui_core/menu.py
index 802ef44..a18ac44 100644
--- a/gui/wxpython/gui_modules/menu.py
+++ b/gui/wxpython/gui_core/menu.py
@@ -1,12 +1,13 @@
 """!
- at package menu.py
+ at package gui_core.menu
 
 @brief Menu classes for wxGUI
 
 Classes:
- - Menu
+ - menu::Menu
 
 (C) 2010 by the GRASS Development Team
+
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
@@ -19,10 +20,10 @@ This program is free software under the GNU General Public License
 
 import wx
 
-import globalvar
-import utils
-
-from preferences import globalSettings as UserSettings
+from core          import globalvar
+from core          import utils
+from core.gcmd     import EncodeString
+from core.settings import UserSettings
 
 class Menu(wx.MenuBar):
     def __init__(self, parent, data):
@@ -56,7 +57,7 @@ class Menu(wx.MenuBar):
         return menu
 
     def _createMenuItem(self, menu, menustyle, label, help, handler, gcmd, keywords,
-                        shortcut = '', kind = wx.ITEM_NORMAL):
+                        shortcut = '', wxId = wx.ID_ANY, kind = wx.ITEM_NORMAL):
         """!Creates menu items
         There are three menu styles (menu item text styles).
         1 -- label only, 2 -- label and cmd name, 3 -- cmd name only
@@ -77,7 +78,7 @@ class Menu(wx.MenuBar):
         if shortcut:
             label += '\t' + shortcut
         
-        menuItem = menu.Append(wx.ID_ANY, label, helpString, kind)
+        menuItem = menu.Append(wxId, label, helpString, kind)
         
         self.menucmd[menuItem.GetId()] = gcmd
         
@@ -85,8 +86,8 @@ class Menu(wx.MenuBar):
             try: 
                 cmd = utils.split(str(gcmd)) 
             except UnicodeError: 
-                cmd = utils.split(utils.EncodeString((gcmd))) 
-            if cmd and cmd[0] not in globalvar.grassCmd['all']: 
+                cmd = utils.split(EncodeString((gcmd))) 
+            if cmd and cmd[0] not in globalvar.grassCmd: 
                 menuItem.Enable(False)
         
         rhandler = eval('self.parent.' + handler)
diff --git a/gui/wxpython/gui_modules/preferences.py b/gui/wxpython/gui_core/preferences.py
similarity index 63%
rename from gui/wxpython/gui_modules/preferences.py
rename to gui/wxpython/gui_core/preferences.py
index 68778b0..176435d 100644
--- a/gui/wxpython/gui_modules/preferences.py
+++ b/gui/wxpython/gui_core/preferences.py
@@ -1,945 +1,62 @@
 """!
- at package preferences
+ at package gui_core.preferences
 
 @brief User preferences dialog
 
-Sets default display font, etc.
-If you want to add some value to settings you have to add default value 
-to defaultSettings and set constraints in internalSettings in Settings class.
-Everything can be used in PreferencesDialog.
+Sets default display font, etc.  If you want to add some value to
+settings you have to add default value to defaultSettings and set
+constraints in internalSettings in Settings class. Everything can be
+used in PreferencesDialog.
 
 Classes:
- - Settings
- - PreferencesBaseDialog
- - PreferencesDialog
- - DefaultFontDialog
- - MapsetAccess
- - NvizPreferencesDialog
-
-(C) 2007-2011 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+ - preferences::PreferencesBaseDialog
+ - preferences::PreferencesDialog
+ - preferences::DefaultFontDialog
+ - preferences::MapsetAccess
+ - preferences::CheckListMapset
+
+(C) 2007-2012 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Michael Barton (Arizona State University)
 @author Martin Landa <landa.martin gmail.com>
 @author Vaclav Petras <wenzeslaus gmail.com> (menu customization)
+ at author Luca Delucchi <lucadeluge gmail.com> (language choice)
 """
 
 import os
 import sys
 import copy
-import stat
-import types
+import locale
 try:
     import pwd
     havePwd = True
 except ImportError:
     havePwd = False
 
-### i18N
-import gettext
-gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
-
 import wx
-import wx.lib.filebrowsebutton as filebrowse
-import wx.lib.colourselect as csel
+import wx.lib.colourselect    as csel
 import wx.lib.mixins.listctrl as listmix
-
-from grass.script import core as grass
-
-import gcmd
-import utils
-import globalvar
-from debug import Debug as Debug
+import wx.lib.scrolledpanel as SP 
 
 from wx.lib.newevent import NewEvent
 
-wxSettingsChanged, EVT_SETTINGS_CHANGED = NewEvent()
-
-class Settings:
-    """!Generic class where to store settings"""
-    def __init__(self):
-        # settings file
-        self.filePath = os.path.join(utils.GetSettingsPath(), 'wx')
-        
-        # key/value separator
-        self.sep = ';'
-        
-        try:
-            projFile = utils.PathJoin(os.environ["GRASS_PROJSHARE"], 'epsg')
-        except KeyError:
-            projFile = ''
-        
-        #
-        # default settings
-        #
-        self.defaultSettings = {
-            #
-            # general
-            #
-            'general': {
-                # use default window layout (layer manager, displays, ...)
-                'defWindowPos' : {
-                    'enabled' : True,
-                    'dim' : '0,0,%d,%d,%d,0,%d,%d' % \
-                        (globalvar.GM_WINDOW_SIZE[0],
-                         globalvar.GM_WINDOW_SIZE[1],
-                         globalvar.GM_WINDOW_SIZE[0],
-                         globalvar.MAP_WINDOW_SIZE[0],
-                         globalvar.MAP_WINDOW_SIZE[1])
-                    },
-                # workspace
-                'workspace' : {
-                    'posDisplay' : {
-                        'enabled' : False
-                        },
-                    'posManager' : {
-                        'enabled' : False
-                        },
-                    },
-                },
-            'manager' : {
-                # show opacity level widget
-                'changeOpacityLevel' : {
-                    'enabled' : False
-                    }, 
-                # ask when removing layer from layer tree
-                'askOnRemoveLayer' : {
-                    'enabled' : True
-                    },
-                # ask when quiting wxGUI or closing display
-                'askOnQuit' : {
-                    'enabled' : True
-                    },
-                # hide tabs
-                'hideTabs' : {
-                    'search' : False,
-                    'pyshell' : False,
-                    },
-                'copySelectedTextToClipboard' : {
-                    'enabled' : False
-                    },
-                },
-            #
-            # appearance
-            #
-            'appearance': {
-                'outputfont' : {
-                    'type' : 'Courier New',
-                    'size': '10',
-                    },
-                # expand/collapse element list
-                'elementListExpand' : {
-                    'selection' : 0 
-                    },
-                'menustyle' : {
-                    'selection' : 1
-                    },
-                'gSelectPopupHeight' : {
-                    'value' : 200
-                    },
-                'iconTheme' : {
-                    'type' : 'grass2'
-                    }, # grass2, grass, silk
-                },
-            #
-            # display
-            #
-            'display': {
-                'font' : {
-                    'type' : '',
-                    'encoding': 'ISO-8859-1',
-                    },
-                'driver': {
-                    'type': 'default'
-                    },
-                'compResolution' : {
-                    'enabled' : False
-                    },
-                'autoRendering': {
-                    'enabled' : True
-                    },
-                'autoZooming' : {
-                    'enabled' : False
-                    },
-                'statusbarMode': {
-                    'selection' : 0
-                    },
-                'bgcolor': {
-                    'color' : (255, 255, 255, 255),
-                    },
-                },
-            #
-            # projection
-            #
-            'projection' : {
-                'statusbar' : {
-                    'proj4'    : '',
-                    'epsg'     : '',
-                    'projFile' : projFile,
-                    },
-                'format' : {
-                    'll'  : 'DMS',
-                    'precision' : 2,
-                    },
-                },
-            #
-            # Attribute Table Manager
-            #
-            'atm' : {
-                'highlight' : {
-                    'color' : (255, 255, 0, 255),
-                    'width' : 2
-                    },
-                'leftDbClick' : {
-                    'selection' : 1 # draw selected
-                    },
-                'askOnDeleteRec' : {
-                    'enabled' : True
-                    },
-                'keycolumn' : {
-                    'value' : 'cat'
-                    },
-                'encoding' : {
-                    'value' : '',
-                    }
-                },
-            #
-            # Command
-            #
-            'cmd': {
-                'overwrite' : {
-                    'enabled' : False
-                    },
-                'closeDlg' : {
-                    'enabled' : False
-                    },
-                'verbosity' : {
-                    'selection' : 'grassenv'
-                    },
-                # d.rast
-                'rasterOverlay' : {
-                    'enabled' : True
-                    },
-                'rasterColorTable' : {
-                    'enabled'   : False,
-                    'selection' : 'rainbow',
-                    },
-                # d.vect
-                'showType': {
-                    'point' : {
-                        'enabled' : True
-                        },
-                    'line' : {
-                        'enabled' : True
-                        },
-                    'centroid' : {
-                        'enabled' : True
-                        },
-                    'boundary' : {
-                        'enabled' : True
-                        },
-                    'area' : {
-                        'enabled' : True
-                        },
-                    'face' : {
-                        'enabled' : True
-                        },
-                    },
-                'addNewLayer' : {
-                    'enabled' : True,
-                    },
-                'interactiveInput' : {
-                    'enabled' : True,
-                    },
-                },
-            #
-            # vdigit
-            #
-            'vdigit' : {
-                # symbology
-                'symbol' : {
-                    'highlight' : {
-                        'enabled' : None,
-                        'color' : (255, 255, 0, 255)
-                        }, # yellow
-                    'highlightDupl' : {
-                        'enabled' : None,
-                        'color' : (255, 72, 0, 255)
-                        }, # red
-                    'point' : {
-                        'enabled' : True,
-                        'color' : (0, 0, 0, 255)
-                        }, # black
-                    'line' : {
-                        'enabled' : True,
-                        'color' : (0, 0, 0, 255)
-                        }, # black
-                    'boundaryNo' : {
-                        'enabled' : True,
-                        'color' : (126, 126, 126, 255)
-                        }, # grey
-                    'boundaryOne' : {
-                        'enabled' : True,
-                        'color' : (0, 255, 0, 255)
-                        }, # green
-                    'boundaryTwo' : {
-                        'enabled' : True,
-                        'color' : (255, 135, 0, 255)
-                        }, # orange
-                    'centroidIn' : {
-                        'enabled' : True,
-                        'color' : (0, 0, 255, 255)
-                        }, # blue
-                    'centroidOut' : {
-                        'enabled' : True,
-                        'color' : (165, 42, 42, 255)
-                        }, # brown
-                    'centroidDup' : {
-                        'enabled' : True,
-                        'color' : (156, 62, 206, 255)
-                        }, # violet
-                    'nodeOne' : {
-                        'enabled' : True,
-                        'color' : (255, 0, 0, 255)
-                        }, # red
-                    'nodeTwo' : {
-                        'enabled' : True,
-                        'color' : (0, 86, 45, 255)
-                        }, # dark green
-                    'vertex' : {
-                        'enabled' : False,
-                        'color' : (255, 20, 147, 255)
-                        }, # deep pink
-                    'area' : {
-                        'enabled' : False,
-                        'color' : (217, 255, 217, 255)
-                        }, # green
-                    'direction' : {
-                        'enabled' : False,
-                        'color' : (255, 0, 0, 255)
-                        }, # red
-                    },
-                # display
-                'lineWidth' : {
-                    'value' : 2,
-                    'units' : 'screen pixels'
-                    },
-                # snapping
-                'snapping' : {
-                    'value' : 10,
-                    'units' : 'screen pixels'
-                    },
-                'snapToVertex' : {
-                    'enabled' : False
-                    },
-                # digitize new record
-                'addRecord' : {
-                    'enabled' : True
-                    },
-                'layer' :{
-                    'value' : 1
-                    },
-                'category' : {
-                    'value' : 1
-                    },
-                'categoryMode' : {
-                    'selection' : 0
-                    },
-                # delete existing feature(s)
-                'delRecord' : {
-                    'enabled' : True
-                    },
-                # query tool
-                'query' : {
-                    'selection' : 0,
-                    'box' : True
-                    },
-                'queryLength' : {
-                    'than-selection' : 0,
-                    'thresh' : 0
-                    },
-                'queryDangle' : {
-                    'than-selection' : 0,
-                    'thresh' : 0
-                    },
-                # select feature (point, line, centroid, boundary)
-                'selectType': {
-                    'point' : {
-                        'enabled' : True
-                        },
-                    'line' : {
-                        'enabled' : True
-                        },
-                    'centroid' : {
-                        'enabled' : True
-                        },
-                    'boundary' : {
-                        'enabled' : True
-                        },
-                    },
-                'selectThresh' : {
-                    'value' : 10,
-                    'units' : 'screen pixels'
-                    },
-                'checkForDupl' : {
-                    'enabled' : False
-                    },
-                'selectInside' : {
-                    'enabled' : False
-                    },
-                # exit
-                'saveOnExit' : {
-                    'enabled' : False,
-                    },
-                # break lines on intersection
-                'breakLines' : {
-                    'enabled' : False,
-                    },
-                },
-            'profile': {
-                'raster0' : {
-                    'pcolor' : (0, 0, 255, 255), # profile line color
-                    'pwidth' : 1, # profile line width
-                    'pstyle' : 'solid', # profile line pen style
-                    },
-                'raster1' : {
-                    'pcolor' : (255, 0, 0, 255), 
-                    'pwidth' : 1, 
-                    'pstyle' : 'solid', 
-                    },
-                'raster2' : {
-                    'pcolor' : (0, 255, 0, 255), 
-                    'pwidth' : 1, 
-                    'pstyle' : 'solid', 
-                    },
-                'font' : {
-                    'titleSize' : 12,
-                    'axisSize' : 11,
-                    'legendSize' : 10,
-                    },
-                'marker' : {
-                    'color' : (0, 0, 0, 255),
-                    'fill' : 'transparent',
-                    'size' : 2,
-                    'type' : 'triangle',
-                    'legend' : _('Segment break'),
-                    },
-                'grid' : {
-                    'color' : (200, 200, 200, 255),
-                    'enabled' : True,
-                    },
-                'x-axis' : {
-                    'type' : 'auto', # axis format
-                    'min' : 0, # axis min for custom axis range
-                    'max': 0, # axis max for custom axis range
-                    'log' : False,
-                    },
-                'y-axis' : {
-                    'type' : 'auto', # axis format
-                    'min' : 0, # axis min for custom axis range
-                    'max': 0, # axis max for custom axis range
-                    'log' : False,
-                    },
-                'legend' : {
-                    'enabled' : True
-                    },
-                },
-            'gcpman' : {
-                'rms' : {
-                    'highestonly' : True,
-                    'sdfactor' : 1,
-                    },
-                'symbol' : {
-                    'color' : (0, 0, 255, 255),
-                    'hcolor' : (255, 0, 0, 255),
-                    'scolor' : (0, 255, 0, 255),
-                    'ucolor' : (255, 165, 0, 255),
-                    'unused' : True,
-                    'size' : 8,
-                    'width' : 2,
-                    },
-                },
-            'georect' : {
-                'symbol' : {
-                    'color' : (0, 0, 255, 255),
-                    'width' : 2,
-                    },
-                },
-            'nviz' : {
-                'view' : {
-                    'persp' : {
-                        'value' : 20,
-                        'step' : 5,
-                        },
-                    'position' : {
-                        'x' : 0.84,
-                        'y' : 0.16,
-                        },
-                    'height' : {
-                        'step' : 100,
-                        },
-                    'twist' : {
-                        'value' : 0,
-                        'step' : 5,
-                        },
-                    'z-exag' : {
-                        'step' : 1,
-                        },
-                    'background' : {
-                        'color' : (255, 255, 255, 255), # white
-                        },
-                    },
-                'surface' : {
-                    'shine': {
-                        'map' : False,
-                        'value' : 60.0,
-                        },
-                    'color' : {
-                        'map' : True,
-                        'value' : (0, 0, 0, 255), # constant: black
-                        },
-                    'draw' : {
-                        'wire-color' : (136, 136, 136, 255),
-                        'mode' : 1, # fine
-                        'style' : 1, # surface
-                        'shading' : 1, # gouraud
-                        'res-fine' : 6,
-                        'res-coarse' : 9,
-                        },
-                    'position' : {
-                        'x' : 0,
-                        'y' : 0,
-                        'z' : 0,
-                        },
-                    },
-                'vector' : {
-                    'lines' : {
-                        'show' : False,
-                        'width' : 2,
-                        'color' : (0, 0, 255, 255), # blue
-                        'flat' : False,
-                        'height' : 0,
-                        },
-                    'points' : {
-                        'show' : False,
-                        'size' : 100,
-                        'width' : 2,
-                        'marker' : 2,
-                        'color' : (0, 0, 255, 255), # blue
-                        'height' : 0,
-                        }
-                    },
-                'volume' : {
-                    'color' : {
-                        'map' : True,
-                        'value' : (0, 0, 0, 255), # constant: black
-                        },
-                    'draw' : {
-                        'mode'       : 0, # isosurfaces
-                        'shading'    : 1, # gouraud
-                        'resolution' : 3, # polygon resolution
-                        },
-                    'shine': {
-                        'map' : False,
-                        'value' : 60,
-                        },
-                    },
-                'light' : {
-                    'position' : {
-                        'x' : 0.68,
-                        'y' : 0.68,
-                        'z' : 80,
-                        },
-                    'bright'  : 80,
-                    'color'   : (255, 255, 255, 255), # white
-                    'ambient' : 20,
-                    },
-                'fringe' : {
-                    'elev'   : 55,
-                    'color'  : (128, 128, 128, 255), # grey
-                    },
-                },
-            'modeler' : {
-                'disabled': {
-                    'color': (211, 211, 211, 255), # light grey
-                    },
-                'action' : {
-                    'color' : {
-                        'valid'   :  (180, 234, 154, 255), # light green
-                        'invalid' :  (255, 255, 255, 255), # white
-                        'running' :  (255, 0, 0, 255),     # red
-                        },
-                    'size' : {
-                        'width'  : 100,
-                        'height' : 50,
-                        },
-                    'width': {
-                        'parameterized' : 2,
-                        'default'       : 1,
-                        },
-                    },
-                'data' : { 
-                    'color': {
-                        'raster'   : (215, 215, 248, 255), # light blue
-                        'raster3d' : (215, 248, 215, 255), # light green
-                        'vector'   : (248, 215, 215, 255), # light red
-                        },
-                    'size' : {
-                        'width' : 175,
-                        'height' : 50,
-                        },
-                    },
-                'loop' : {
-                    'color' : {
-                        'valid'   :  (234, 226, 154, 255), # light yellow
-                        },
-                    'size' : {
-                        'width' : 175,
-                        'height' : 40,
-                        },
-                    },
-                'if-else' : {
-                    'size' : {
-                        'width' : 150,
-                        'height' : 40,
-                        },
-                    },
-                },
-            }
-
-        # quick fix, http://trac.osgeo.org/grass/ticket/1233
-        # TODO
-        if sys.platform == 'darwin':
-            self.defaultSettings['general']['defWindowPos']['enabled'] = False
-        
-        #
-        # user settings
-        #
-        self.userSettings = copy.deepcopy(self.defaultSettings)
-        try:
-            self.ReadSettingsFile()
-        except gcmd.GException, e:
-            print >> sys.stderr, e.value
-
-        #
-        # internal settings (based on user settings)
-        #
-        self.internalSettings = {}
-        for group in self.userSettings.keys():
-            self.internalSettings[group] = {}
-            for key in self.userSettings[group].keys():
-                self.internalSettings[group][key] = {}
-
-        # self.internalSettings['general']["mapsetPath"]['value'] = self.GetMapsetPath()
-        self.internalSettings['appearance']['elementListExpand']['choices'] = \
-            (_("Collapse all except PERMANENT and current"),
-             _("Collapse all except PERMANENT"),
-             _("Collapse all except current"),
-             _("Collapse all"),
-             _("Expand all"))
-        self.internalSettings['atm']['leftDbClick']['choices'] = (_('Edit selected record'),
-                                                                  _('Display selected'))
-        
-        self.internalSettings['cmd']['verbosity']['choices'] = ('grassenv',
-                                                                'verbose',
-                                                                'quiet')
-        
-        self.internalSettings['appearance']['iconTheme']['choices'] = ('grass',
-                                                                       'grass2',
-                                                                       'silk')
-        self.internalSettings['appearance']['menustyle']['choices'] = \
-                   (_("Classic (labels only)"),
-                    _("Combined (labels and module names)"),
-                    _("Professional (module names only)"))
-        self.internalSettings['appearance']['gSelectPopupHeight']['min'] = 50
-        # there is also maxHeight given to TreeCtrlComboPopup.GetAdjustedSize
-        self.internalSettings['appearance']['gSelectPopupHeight']['max'] = 1000
-        
-        self.internalSettings['display']['driver']['choices'] = ['default']
-        self.internalSettings['display']['statusbarMode']['choices'] = globalvar.MAP_DISPLAY_STATUSBAR_MODE
-
-        self.internalSettings['nviz']['view'] = {}
-        self.internalSettings['nviz']['view']['twist'] = {}
-        self.internalSettings['nviz']['view']['twist']['min'] = -180
-        self.internalSettings['nviz']['view']['twist']['max'] = 180
-        self.internalSettings['nviz']['view']['persp'] = {}
-        self.internalSettings['nviz']['view']['persp']['min'] = 1
-        self.internalSettings['nviz']['view']['persp']['max'] = 100
-        self.internalSettings['nviz']['view']['height'] = {}
-        self.internalSettings['nviz']['view']['height']['value'] = -1
-        self.internalSettings['nviz']['vector'] = {}
-        self.internalSettings['nviz']['vector']['points'] = {}
-        self.internalSettings['nviz']['vector']['points']['marker'] = ("x",
-                                                                       _("box"),
-                                                                       _("sphere"),
-                                                                       _("cube"),
-                                                                       _("diamond"),
-                                                                       _("dtree"),
-                                                                       _("ctree"),
-                                                                       _("aster"),
-                                                                       _("gyro"),
-                                                                       _("histogram"))
-        self.internalSettings['vdigit']['bgmap'] = {}
-        self.internalSettings['vdigit']['bgmap']['value'] = ''
-        
-    def ReadSettingsFile(self, settings = None):
-        """!Reads settings file (mapset, location, gisdbase)"""
-        if settings is None:
-            settings = self.userSettings
-        
-        self._readFile(self.filePath, settings)
-        
-        # set environment variables
-        font = self.Get(group = 'display', key = 'font', subkey = 'type')
-        enc  = self.Get(group = 'display', key = 'font', subkey = 'encoding')
-        if font:
-            os.environ["GRASS_FONT"] = font
-        if enc:
-            os.environ["GRASS_ENCODING"] = enc
-        
-    def _readFile(self, filename, settings = None):
-        """!Read settings from file to dict
-
-        @param filename settings file path
-        @param settings dict where to store settings (None for self.userSettings)
-        """
-        if settings is None:
-            settings = self.userSettings
-        
-        if not os.path.exists(filename):
-            # try alternative path
-            filename = os.path.join(os.path.expanduser("~"), '.grasswx6')
-            if not os.path.exists(filename):
-                return
-        
-        try:
-            fd = open(filename, "r")
-        except IOError:
-            sys.stderr.write(_("Unable to read settings file <%s>\n") % filename)
-            return
-        
-        try:
-            line = ''
-            for line in fd.readlines():
-                line = line.rstrip('%s' % os.linesep)
-                group, key = line.split(self.sep)[0:2]
-                kv = line.split(self.sep)[2:]
-                subkeyMaster = None
-                if len(kv) % 2 != 0: # multiple (e.g. nviz)
-                    subkeyMaster = kv[0]
-                    del kv[0]
-                idx = 0
-                while idx < len(kv):
-                    if subkeyMaster:
-                        subkey = [subkeyMaster, kv[idx]]
-                    else:
-                        subkey = kv[idx]
-                    value = kv[idx+1]
-                    value = self._parseValue(value, read = True)
-                    self.Append(settings, group, key, subkey, value)
-                    idx += 2
-        except ValueError, e:
-            print >> sys.stderr, _("Error: Reading settings from file <%(file)s> failed.\n"
-                                   "\t\tDetails: %(detail)s\n"
-                                   "\t\tLine: '%(line)s'\n") % { 'file' : filename,
-                                                                 'detail' : e,
-                                                                 'line' : line }
-            fd.close()
-        
-        fd.close()
-        
-    def SaveToFile(self, settings = None):
-        """!Save settings to the file"""
-        if settings is None:
-            settings = self.userSettings
-        
-        dirPath = utils.GetSettingsPath()
-        if not os.path.exists(dirPath):
-            try:
-                os.mkdir(dirPath)
-            except:
-                gcmd.GError(_('Unable to create settings directory'))
-                return
-        
-        try:
-            file = open(self.filePath, "w")
-            for group in settings.keys():
-                for key in settings[group].keys():
-                    subkeys = settings[group][key].keys()
-                    file.write('%s%s%s%s' % (group, self.sep, key, self.sep))
-                    for idx in range(len(subkeys)):
-                        value = settings[group][key][subkeys[idx]]
-                        if type(value) == types.DictType:
-                            if idx > 0:
-                                file.write('%s%s%s%s%s' % (os.linesep, group, self.sep, key, self.sep))
-                            file.write('%s%s' % (subkeys[idx], self.sep))
-                            kvalues = settings[group][key][subkeys[idx]].keys()
-                            srange = range(len(kvalues))
-                            for sidx in srange:
-                                svalue = self._parseValue(settings[group][key][subkeys[idx]][kvalues[sidx]])
-                                file.write('%s%s%s' % (kvalues[sidx], self.sep,
-                                                       svalue))
-                                if sidx < len(kvalues) - 1:
-                                    file.write('%s' % self.sep)
-                        else:
-                            if idx > 0 and \
-                                    type(settings[group][key][subkeys[idx - 1]]) == types.DictType:
-                                file.write('%s%s%s%s%s' % (os.linesep, group, self.sep, key, self.sep))
-                            value = self._parseValue(settings[group][key][subkeys[idx]])
-                            file.write('%s%s%s' % (subkeys[idx], self.sep, value))
-                            if idx < len(subkeys) - 1 and \
-                                    type(settings[group][key][subkeys[idx + 1]]) != types.DictType:
-                                file.write('%s' % self.sep)
-                    file.write(os.linesep)
-        except IOError, e:
-            raise gcmd.GException(e)
-        except StandardError, e:
-            raise gcmd.GException(_('Writing settings to file <%(file)s> failed.'
-                                    '\n\nDetails: %(detail)s') % { 'file' : self.filePath,
-                                                                   'detail' : e })
-        
-        file.close()
-        
-    def _parseValue(self, value, read = False):
-        """!Parse value to be store in settings file"""
-        if read: # -> read settings (cast values)
-            if value == 'True':
-                value = True
-            elif value == 'False':
-                value = False
-            elif value == 'None':
-                value = None
-            elif ':' in value: # -> color
-                try:
-                    value = tuple(map(int, value.split(':')))
-                except ValueError: # -> string
-                    pass
-            else:
-                try:
-                    value = int(value)
-                except ValueError:
-                    try:
-                        value = float(value)
-                    except ValueError:
-                        pass
-        else: # -> write settings
-            if type(value) == type(()): # -> color
-                value = str(value[0]) + ':' +\
-                    str(value[1]) + ':' + \
-                    str(value[2])
-                
-        return value
-
-    def Get(self, group, key = None, subkey = None, internal = False):
-        """!Get value by key/subkey
-
-        Raise KeyError if key is not found
-        
-        @param group settings group
-        @param key (value, None)
-        @param subkey (value, list or None)
-        @param internal use internal settings instead
-
-        @return value
-        """
-        if internal is True:
-            settings = self.internalSettings
-        else:
-            settings = self.userSettings
-            
-        try:
-            if subkey is None:
-                if key is None:
-                    return settings[group]
-                else:
-                    return settings[group][key]
-            else:
-                if type(subkey) == type(tuple()) or \
-                        type(subkey) == type(list()):
-                    return settings[group][key][subkey[0]][subkey[1]]
-                else:
-                    return settings[group][key][subkey]  
-
-        except KeyError:
-            print >> sys.stderr, "Settings: unable to get value '%s:%s:%s'\n" % \
-                (group, key, subkey)
-        
-    def Set(self, group, value, key = None, subkey = None, internal = False):
-        """!Set value of key/subkey
-        
-        Raise KeyError if group/key is not found
-        
-        @param group settings group
-        @param key key (value, None)
-        @param subkey subkey (value, list or None)
-        @param value value
-        @param internal use internal settings instead
-        """
-        if internal is True:
-            settings = self.internalSettings
-        else:
-            settings = self.userSettings
-        
-        try:
-            if subkey is None:
-                if key is None:
-                    settings[group] = value
-                else:
-                    settings[group][key] = value
-            else:
-                if type(subkey) == type(tuple()) or \
-                        type(subkey) == type(list()):
-                    settings[group][key][subkey[0]][subkey[1]] = value
-                else:
-                    settings[group][key][subkey] = value
-        except KeyError:
-            raise gcmd.GException("%s '%s:%s:%s'" % (_("Unable to set "), group, key, subkey))
-        
-    def Append(self, dict, group, key, subkey, value):
-        """!Set value of key/subkey
+from grass.script import core as grass
 
-        Create group/key/subkey if not exists
-        
-        @param dict settings dictionary to use
-        @param group settings group
-        @param key key
-        @param subkey subkey (value or list)
-        @param value value
-        """
-        if group not in dict:
-            dict[group] = {}
-        
-        if key not in dict[group]:
-            dict[group][key] = {}
-        
-        if type(subkey) == types.ListType:
-            # TODO: len(subkey) > 2
-            if subkey[0] not in dict[group][key]:
-                dict[group][key][subkey[0]] = {}
-            try:
-                dict[group][key][subkey[0]][subkey[1]] = value
-            except TypeError:
-                print >> sys.stderr, _("Unable to parse settings '%s'") % value + \
-                    ' (' + group + ':' + key + ':' + subkey[0] + ':' + subkey[1] + ')'
-        else:
-            try:
-                dict[group][key][subkey] = value
-            except TypeError:
-                print >> sys.stderr, _("Unable to parse settings '%s'") % value + \
-                    ' (' + group + ':' + key + ':' + subkey + ')'
-        
-    def GetDefaultSettings(self):
-        """!Get default user settings"""
-        return self.defaultSettings
+from core          import globalvar
+from core.gcmd     import RunCommand
+from core.utils    import ListOfMapsets, GetColorTables, ReadEpsgCodes, GetSettingsPath
+from core.settings import UserSettings
+from gui_core.widgets import IntegerValidator
 
-globalSettings = Settings()
+wxSettingsChanged, EVT_SETTINGS_CHANGED = NewEvent()
 
 class PreferencesBaseDialog(wx.Dialog):
     """!Base preferences dialog"""
     def __init__(self, parent, settings, title = _("User settings"),
-                 size = (500, 375),
+                 size = (500, 475),
                  style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER):
         self.parent = parent # ModelerFrame
         self.title  = title
@@ -1014,6 +131,7 @@ class PreferencesBaseDialog(wx.Dialog):
                 group, key, subkey, subkey1 = gks.split(':')
                 value = self.settings.Get(group, key, [subkey, subkey1])
             win = self.FindWindowById(self.winId[gks])
+            
             if win.GetName() in ('GetValue', 'IsChecked'):
                 value = win.SetValue(value)
             elif win.GetName() == 'GetSelection':
@@ -1039,14 +157,27 @@ class PreferencesBaseDialog(wx.Dialog):
     def OnCancel(self, event):
         """!Button 'Cancel' pressed"""
         self.Close()
-        
+
     def OnSave(self, event):
         """!Button 'Save' pressed
         Posts event EVT_SETTINGS_CHANGED.
         """
         if self._updateSettings():
+            lang = self.settings.Get(group = 'language', key = 'locale', subkey = 'lc_all')
+            if lang == 'system':
+                # Most fool proof way to use system locale is to not provide any locale info at all
+                self.settings.Set(group = 'language', key = 'locale', subkey = 'lc_all', value = None)
+                lang = None
+            if lang == 'en':
+                # GRASS doesn't ship EN translation, default texts have to be used instead
+                self.settings.Set(group = 'language', key = 'locale', subkey = 'lc_all', value = 'C')
+                lang = 'C'
             self.settings.SaveToFile()
             self.parent.goutput.WriteLog(_('Settings saved to file \'%s\'.') % self.settings.filePath)
+            if lang:
+                RunCommand('g.gisenv', set = 'LANG=%s' % lang)
+            else:
+                RunCommand('g.gisenv', set = 'LANG=')
             event = wxSettingsChanged()
             wx.PostEvent(self, event)
             self.Close()
@@ -1115,7 +246,7 @@ class PreferencesBaseDialog(wx.Dialog):
 class PreferencesDialog(PreferencesBaseDialog):
     """!User preferences dialog"""
     def __init__(self, parent, title = _("GUI Settings"),
-                 settings = globalSettings):
+                 settings = UserSettings):
         
         PreferencesBaseDialog.__init__(self, parent = parent, title = title,
                                        settings = settings)
@@ -1133,7 +264,8 @@ class PreferencesDialog(PreferencesBaseDialog):
         
     def _createGeneralPage(self, notebook):
         """!Create notebook page for general settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        panel = SP.ScrolledPanel(parent = notebook, id = wx.ID_ANY)
+        panel.SetupScrolling(scroll_x = False, scroll_y = True)
         notebook.AddPage(page = panel, text = _("General"))
         
         border = wx.BoxSizer(wx.VERTICAL)
@@ -1263,8 +395,8 @@ class PreferencesDialog(PreferencesBaseDialog):
 
     def _createAppearancePage(self, notebook):
         """!Create notebook page for display settings"""
-   
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        panel = SP.ScrolledPanel(parent = notebook, id = wx.ID_ANY)
+        panel.SetupScrolling(scroll_x = False, scroll_y = True)
         notebook.AddPage(page = panel, text = _("Appearance"))
 
         border = wx.BoxSizer(wx.VERTICAL)
@@ -1295,6 +427,38 @@ class PreferencesDialog(PreferencesBaseDialog):
                       pos = (row, 1))
 
         #
+        # languages
+        #
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Language settings"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+
+        gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
+        gridSizer.AddGrowableCol(0)        
+        sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 3)
+
+        row = 0
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Choose language (requires to save and GRASS restart):")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        locales = self.settings.Get(group = 'language', key = 'locale', 
+                                         subkey = 'choices', internal = True)
+        loc = self.settings.Get(group = 'language', key = 'locale', subkey = 'lc_all')
+        elementList = wx.Choice(parent = panel, id = wx.ID_ANY, size = (325, -1),
+                                choices = locales, name = "GetStringSelection")
+        if loc in locales:
+            elementList.SetStringSelection(loc)
+        if loc == 'C':
+            elementList.SetStringSelection('en')
+        self.winId['language:locale:lc_all'] = elementList.GetId()
+
+        gridSizer.Add(item = elementList,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 1))
+        #
         # appearence
         #
         box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Appearance settings"))
@@ -1330,7 +494,7 @@ class PreferencesDialog(PreferencesBaseDialog):
         #
         row += 1
         gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                           label = _("Menu style (requires GUI restart):")),
+                                           label = _("Menu style (requires to save and GUI restart):")),
                       flag = wx.ALIGN_LEFT |
                       wx.ALIGN_CENTER_VERTICAL,
                       pos = (row, 0))
@@ -1406,8 +570,8 @@ class PreferencesDialog(PreferencesBaseDialog):
     
     def _createDisplayPage(self, notebook):
         """!Create notebook page for display settings"""
-   
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        panel = SP.ScrolledPanel(parent = notebook, id = wx.ID_ANY)
+        panel.SetupScrolling(scroll_x = False, scroll_y = True)
         notebook.AddPage(page = panel, text = _("Map Display"))
 
         border = wx.BoxSizer(wx.VERTICAL)
@@ -1459,11 +623,12 @@ class PreferencesDialog(PreferencesBaseDialog):
         listOfDrivers = self.settings.Get(group='display', key='driver', subkey='choices', internal=True)
         # check if cairo is available
         if 'cairo' not in listOfDrivers:
-            for line in gcmd.RunCommand('d.mon',
-                                        flags = 'l',
-                                        read = True).splitlines():
+            for line in RunCommand('d.mon',
+                                   flags = 'l',
+                                   read = True).splitlines():
                 if 'cairo' in line:
-                    listOfDrivers.append('cairo')
+                    # FIXME: commented out, d.mon<->cairo driver<->wxgui hangs the GUI: #943
+                    #listOfDrivers.append('cairo')
                     break
         
         driver = wx.Choice(parent=panel, id=wx.ID_ANY, size=(150, -1),
@@ -1476,7 +641,6 @@ class PreferencesDialog(PreferencesBaseDialog):
                       flag = wx.ALIGN_RIGHT,
                       pos = (row, 1))
 
-
         #
         # Statusbar mode
         #
@@ -1517,12 +681,25 @@ class PreferencesDialog(PreferencesBaseDialog):
                       pos = (row, 1))
         
         #
+        # Align extent to display size
+        #
+        row += 1
+        alignExtent = wx.CheckBox(parent = panel, id = wx.ID_ANY,
+                                  label = _("Align region extent based on display size"),
+                                  name = "IsChecked")
+        alignExtent.SetValue(self.settings.Get(group = 'display', key = 'alignExtent', subkey = 'enabled'))
+        self.winId['display:alignExtent:enabled'] = alignExtent.GetId()
+
+        gridSizer.Add(item = alignExtent,
+                      pos = (row, 0), span = (1, 2))
+        
+        #
         # Use computation resolution
         #
         row += 1
         compResolution = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                                    label = _("Constrain display resolution to computational settings"),
-                                    name = "IsChecked")
+                                     label = _("Constrain display resolution to computational settings"),
+                                     name = "IsChecked")
         compResolution.SetValue(self.settings.Get(group = 'display', key = 'compResolution', subkey = 'enabled'))
         self.winId['display:compResolution:enabled'] = compResolution.GetId()
 
@@ -1554,20 +731,89 @@ class PreferencesDialog(PreferencesBaseDialog):
 
         gridSizer.Add(item = autoZooming,
                       pos = (row, 0), span = (1, 2))
+        
+        #
+        # mouse wheel zoom
+        #
+        row += 1
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                          label = _("Mouse wheel action:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        listOfModes = self.settings.Get(group = 'display', key = 'mouseWheelZoom', subkey = 'choices', internal = True)
+        zoomAction = wx.Choice(parent = panel, id = wx.ID_ANY, size = (200, -1),
+                               choices = listOfModes,
+                               name = "GetSelection")
+        zoomAction.SetSelection(self.settings.Get(group = 'display', key = 'mouseWheelZoom', subkey = 'selection'))
+        self.winId['display:mouseWheelZoom:selection'] = zoomAction.GetId()
+        gridSizer.Add(item = zoomAction,
+                      flag = wx.ALIGN_RIGHT,
+                      pos = (row, 1))
+        row += 1
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                          label = _("Mouse scrolling direction:")),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 0))
+        listOfModes = self.settings.Get(group = 'display', key = 'scrollDirection', subkey = 'choices', internal = True)
+        scrollDir = wx.Choice(parent = panel, id = wx.ID_ANY, size = (200, -1),
+                               choices = listOfModes,
+                               name = "GetSelection")
+        scrollDir.SetSelection(self.settings.Get(group = 'display', key = 'scrollDirection', subkey = 'selection'))
+        self.winId['display:scrollDirection:selection'] = scrollDir.GetId()
+        gridSizer.Add(item = scrollDir,
+                      flag = wx.ALIGN_RIGHT,
+                      pos = (row, 1))
 
         sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
         border.Add(item = sizer, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
         
+        
+        #
+        # advanced
+        #
+        
+        # see initialization of nviz GLWindow
+        if globalvar.CheckWxVersion(version=[2, 8, 11]) and \
+           sys.platform not in ('win32', 'darwin'):
+            box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Advanced display settings"))
+            sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+    
+            gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
+            row = 0
+            gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                               label = _("3D view depth buffer (possible values are 16, 24, 32):")),
+                          flag = wx.ALIGN_LEFT |
+                          wx.ALIGN_CENTER_VERTICAL,
+                          pos = (row, 0))
+            value = self.settings.Get(group='display', key='nvizDepthBuffer', subkey='value')
+            textCtrl = wx.TextCtrl(parent=panel, id=wx.ID_ANY, value=str(value), validator=IntegerValidator())
+            self.winId['display:nvizDepthBuffer:value'] = textCtrl.GetId()
+            gridSizer.Add(item = textCtrl,
+                          flag = wx.ALIGN_RIGHT |
+                          wx.ALIGN_CENTER_VERTICAL,
+                          pos = (row, 1))
+    
+            gridSizer.AddGrowableCol(0)
+            sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
+            border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 3)
+        
         panel.SetSizer(border)
                 
         # bindings
         fontButton.Bind(wx.EVT_BUTTON, self.OnSetFont)
+        zoomAction.Bind(wx.EVT_CHOICE, self.OnEnableWheelZoom)
+        
+        # enable/disable controls according to settings
+        self.OnEnableWheelZoom(None)
         
         return panel
 
     def _createCmdPage(self, notebook):
         """!Create notebook page for commad dialog settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        panel = SP.ScrolledPanel(parent = notebook, id = wx.ID_ANY)
+        panel.SetupScrolling(scroll_x = False, scroll_y = True)
         notebook.AddPage(page = panel, text = _("Command"))
         
         border = wx.BoxSizer(wx.VERTICAL)
@@ -1635,7 +881,7 @@ class PreferencesDialog(PreferencesBaseDialog):
         self.winId['cmd:verbosity:selection'] = verbosity.GetId()
         
         gridSizer.Add(item = verbosity,
-                      pos = (row, 1))
+                      pos = (row, 1), flag = wx.ALIGN_RIGHT)
         
         sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
         border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 3)
@@ -1671,11 +917,11 @@ class PreferencesDialog(PreferencesBaseDialog):
         self.winId['cmd:rasterColorTable:enabled'] = rasterCTCheck.GetId()
         rasterCTCheck.Bind(wx.EVT_CHECKBOX, self.OnCheckColorTable)
         
-        gridSizer.Add(item = rasterCTCheck,
+        gridSizer.Add(item = rasterCTCheck, flag = wx.ALIGN_CENTER_VERTICAL,
                       pos = (row, 0))
         
         rasterCTName = wx.Choice(parent = panel, id = wx.ID_ANY, size = (200, -1),
-                               choices = utils.GetColorTables(),
+                               choices = GetColorTables(),
                                name = "GetStringSelection")
         rasterCTName.SetStringSelection(self.settings.Get(group = 'cmd', key = 'rasterColorTable', subkey = 'selection'))
         self.winId['cmd:rasterColorTable:selection'] = rasterCTName.GetId()
@@ -1718,7 +964,8 @@ class PreferencesDialog(PreferencesBaseDialog):
 
     def _createAttributeManagerPage(self, notebook):
         """!Create notebook page for 'Attribute Table Manager' settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        panel = SP.ScrolledPanel(parent = notebook, id = wx.ID_ANY)
+        panel.SetupScrolling(scroll_x = False, scroll_y = True)
         notebook.AddPage(page = panel, text = _("Attributes"))
 
         pageSizer = wx.BoxSizer(wx.VERTICAL)
@@ -1847,7 +1094,8 @@ class PreferencesDialog(PreferencesBaseDialog):
 
     def _createProjectionPage(self, notebook):
         """!Create notebook page for workspace settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        panel = SP.ScrolledPanel(parent = notebook, id = wx.ID_ANY)
+        panel.SetupScrolling(scroll_x = False, scroll_y = True)
         notebook.AddPage(page = panel, text = _("Projection"))
         
         border = wx.BoxSizer(wx.VERTICAL)
@@ -1861,8 +1109,23 @@ class PreferencesDialog(PreferencesBaseDialog):
         gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
         gridSizer.AddGrowableCol(1)
 
-        # epsg
+        # note for users expecting on-the-fly data reprojection
         row = 0
+        note0 = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                             label = _("\nNote: This only controls the coordinates "
+                                       "displayed in the lower-left of the Map "
+                                       "Display\nwindow's status bar. It is purely "
+                                       "cosmetic and does not affect the working "
+                                       "location's\nprojection in any way. You will "
+                                       "need to enable the Projection check box in "
+                                       "the drop-down\nmenu located at the bottom "
+                                       "of the Map Display window.\n"))
+        gridSizer.Add(item = note0,
+                      span = (1, 2),
+                      pos = (row, 0))
+
+        # epsg
+        row += 1
         label = wx.StaticText(parent = panel, id = wx.ID_ANY,
                               label = _("EPSG code:"))
         epsgCode = wx.ComboBox(parent = panel, id = wx.ID_ANY,
@@ -1877,7 +1140,7 @@ class PreferencesDialog(PreferencesBaseDialog):
                       flag = wx.ALIGN_CENTER_VERTICAL)
         gridSizer.Add(item = epsgCode,
                       pos = (row, 1), span = (1, 2))
-        
+
         # proj
         row += 1
         label = wx.StaticText(parent = panel, id = wx.ID_ANY,
@@ -1992,33 +1255,34 @@ class PreferencesDialog(PreferencesBaseDialog):
         """!Load EPSG codes from the file"""
         win = self.FindWindowById(self.winId['projection:statusbar:projFile'])
         path = win.GetValue()
+        wx.BeginBusyCursor()
+        self.epsgCodeDict = ReadEpsgCodes(path)
 
-        self.epsgCodeDict = utils.ReadEpsgCodes(path)
-        list = self.FindWindowById(self.winId['projection:statusbar:epsg'])
+        epsgCombo = self.FindWindowById(self.winId['projection:statusbar:epsg'])
         if type(self.epsgCodeDict) == type(''):
             wx.MessageBox(parent = self,
                           message = _("Unable to read EPSG codes: %s") % self.epsgCodeDict,
                           caption = _("Error"),  style = wx.OK | wx.ICON_ERROR | wx.CENTRE)
             self.epsgCodeDict = dict()
-            list.SetItems([])
-            list.SetValue('')
+            epsgCombo.SetItems([])
+            epsgCombo.SetValue('')
             self.FindWindowById(self.winId['projection:statusbar:proj4']).SetValue('')
+            wx.EndBusyCursor()
             return
         
-        choices = map(str, self.epsgCodeDict.keys())
+        choices = map(str, sorted(self.epsgCodeDict.keys()))
 
-        list.SetItems(choices)
-        try:
-            code = int(list.GetValue())
-        except ValueError:
-            code = -1
+        epsgCombo.SetItems(choices)
+        wx.EndBusyCursor()
+        code = 4326 # default
         win = self.FindWindowById(self.winId['projection:statusbar:proj4'])
         if code in self.epsgCodeDict:
-            win.SetValue(self.epsgCodeDict[code][1])
+            epsgCombo.SetStringSelection(str(code))
+            win.SetValue(self.epsgCodeDict[code][1].replace('<>', '').strip())
         else:
-            list.SetSelection(0)
-            code = int(list.GetStringSelection())
-            win.SetValue(self.epsgCodeDict[code][1])
+            epsgCombo.SetSelection(0)
+            code = int(epsgCombo.GetStringSelection())
+            win.SetValue(self.epsgCodeDict[code][1].replace('<>', '').strip())
     
     def OnSetEpsgCode(self, event):
         """!EPSG code selected"""
@@ -2040,7 +1304,6 @@ class PreferencesDialog(PreferencesBaseDialog):
             winCode.SetValue('')
             win.SetValue('')
         
-        
         try:
             win.SetValue(self.epsgCodeDict[code][1].replace('<>', '').strip())
         except KeyError:
@@ -2117,6 +1380,17 @@ class PreferencesDialog(PreferencesBaseDialog):
 
         event.Skip()
 
+    def OnEnableWheelZoom(self, event):
+        """!Enable/disable wheel zoom mode control"""
+        choiceId = self.winId['display:mouseWheelZoom:selection']
+        choice = self.FindWindowById(choiceId)
+        if choice.GetSelection() == 2:
+            enable = False
+        else:
+            enable = True
+        scrollId = self.winId['display:scrollDirection:selection']
+        self.FindWindowById(scrollId).Enable(enable)
+        
 class DefaultFontDialog(wx.Dialog):
     """
     Opens a file selection dialog to select default font
@@ -2125,7 +1399,7 @@ class DefaultFontDialog(wx.Dialog):
     def __init__(self, parent, title, id = wx.ID_ANY,
                  style = wx.DEFAULT_DIALOG_STYLE |
                  wx.RESIZE_BORDER,
-                 settings = globalSettings,
+                 settings = UserSettings,
                  type = 'font'):
         
         self.settings = settings
@@ -2263,11 +1537,9 @@ class DefaultFontDialog(wx.Dialog):
         """
         fontlist = []
 
-        cmd = ["d.font", "-l"]
-
-        ret = gcmd.RunCommand('d.font',
-                              read = True,
-                              flags = 'l')
+        ret = RunCommand('d.font',
+                         read = True,
+                         flags = 'l')
 
         if not ret:
             return fontlist
@@ -2290,11 +1562,10 @@ class MapsetAccess(wx.Dialog):
                  title = _('Manage access to mapsets'),
                  size  =  (350, 400),
                  style  =  wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
-        
         wx.Dialog.__init__(self, parent, id, title, size = size, style = style, **kwargs)
 
-        self.all_mapsets_ordered = utils.ListOfMapsets(get = 'ordered')
-        self.accessible_mapsets  = utils.ListOfMapsets(get = 'accessible')
+        self.all_mapsets_ordered = ListOfMapsets(get = 'ordered')
+        self.accessible_mapsets  = ListOfMapsets(get = 'accessible')
         self.curr_mapset = grass.gisenv()['MAPSET']
 
         # make a checklistbox from available mapsets and check those that are active
diff --git a/gui/wxpython/gui_modules/prompt.py b/gui/wxpython/gui_core/prompt.py
similarity index 90%
rename from gui/wxpython/gui_modules/prompt.py
rename to gui/wxpython/gui_core/prompt.py
index 4c28d4c..544e74e 100644
--- a/gui/wxpython/gui_modules/prompt.py
+++ b/gui/wxpython/gui_core/prompt.py
@@ -1,19 +1,19 @@
 """!
- at package prompt.py
+ at package gui_core.prompt
 
 @brief wxGUI command prompt
 
 Classes:
- - PromptListCtrl
- - TextCtrlAutoComplete
- - GPrompt
- - GPromptPopUp
- - GPromptSTC
+ - prompt::PromptListCtrl
+ - prompt::TextCtrlAutoComplete
+ - prompt::GPrompt
+ - prompt::GPromptPopUp
+ - prompt::GPromptSTC
 
 (C) 2009-2011 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Martin Landa <landa.martin gmail.com>
 @author Michael Barton <michael.barton at asu.edu>
@@ -22,7 +22,6 @@ for details.
 
 import os
 import sys
-import copy
 import difflib
 import codecs
 
@@ -33,11 +32,10 @@ import wx.lib.mixins.listctrl as listmix
 from grass.script import core as grass
 from grass.script import task as gtask
 
-import globalvar
-import menudata
-import menuform
-import gcmd
-import utils
+from core          import globalvar
+from core          import utils
+from lmgr.menudata import ManagerData
+from core.gcmd     import EncodeString, DecodeString, GetRealCmd
 
 class PromptListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
     """!PopUp window used by GPromptPopUp"""
@@ -92,7 +90,7 @@ class TextCtrlAutoComplete(wx.ComboBox, listmix.ColumnSorterMixin):
         listmix.ColumnSorterMixin.__init__(self, 1)
         
         # set choices (list of GRASS modules)
-        self._choicesCmd = globalvar.grassCmd['all']
+        self._choicesCmd = globalvar.grassCmd
         self._choicesMap = dict()
         for type in ('raster', 'vector'):
             self._choicesMap[type] = grass.list_strings(type = type[:4])
@@ -484,11 +482,12 @@ class GPrompt(object):
         # dictionary of modules (description, keywords, ...)
         if not self.standAlone:
             if self.parent.parent.GetName() == 'Modeler':
-                self.moduleDesc = menudata.ManagerData().GetModules()
+                self.moduleDesc = ManagerData().GetModules()
             else:
                 self.moduleDesc = parent.parent.menubar.GetData().GetModules()
             self.moduleList = self._getListOfModules()
-            self.mapList = self._getListOfMaps()
+            self.mapList    = self._getListOfMaps()
+            self.mapsetList = utils.ListOfMapsets()
         else:
             self.moduleDesc = self.moduleList = self.mapList = None
         
@@ -497,9 +496,12 @@ class GPrompt(object):
         self.autoCompFilter = None
         
         # command description (gtask.grassTask)
-        self.cmdDesc = None
+        self.cmdDesc   = None
         self.cmdbuffer = self._readHistory()
-        self.cmdindex = len(self.cmdbuffer)
+        self.cmdindex  = len(self.cmdbuffer)
+        
+        # list of traced commands
+        self.commands = list()
         
     def _readHistory(self):
         """!Get list of commands from history file"""
@@ -557,7 +559,7 @@ class GPrompt(object):
     def _getListOfModules(self):
         """!Get list of modules"""
         result = dict()
-        for module in globalvar.grassCmd['all']:
+        for module in globalvar.grassCmd:
             try:
                 group, name = module.split('.',1)
             except ValueError:
@@ -589,24 +591,41 @@ class GPrompt(object):
         result['vector'] = grass.list_strings('vect')
         
         return result
-
-    def OnRunCmd(self, event):
-        """!Run command"""
-        cmdString = event.GetString()
+    
+    def _runCmd(self, cmdString):
+        """!Run command
         
-        if self.standAlone:
+        @param cmdString command to run (given as a string)
+        """
+        if self.parent.GetName() == "ModelerDialog":
+            self.parent.OnOk(None)
             return
         
-        if cmdString[:2] == 'd.' and not self.parent.curr_page:
-            self.parent.NewDisplay(show=True)
+        if not cmdString or self.standAlone:
+            return
         
-        cmd = utils.split(cmdString)
-        if len(cmd) > 1:
-            self.parent.RunCmd(cmd, switchPage = True)
+        if cmdString[:2] == 'd.' and not self.parent.parent.curr_page:
+            self.parent.parent.NewDisplay(show = True)
+                
+        self.commands.append(cmdString) # trace commands
+
+        # parse command into list
+        try:
+            cmd = utils.split(str(cmdString))
+        except UnicodeError:
+            cmd = utils.split(EncodeString((cmdString)))
+        cmd = map(DecodeString, cmd)
+        
+        # send the command list to the processor 
+        if cmd[0] in ('r.mapcalc', 'r3.mapcalc') and len(cmd) == 1:
+            self.parent.parent.OnMapCalculator(event = None, cmd = cmd)
         else:
-            self.parent.RunCmd(cmd, switchPage = False)
-        
-        self.OnUpdateStatusBar(None)
+            self.parent.RunCmd(cmd)
+            
+        # add command to history & clean prompt
+        self.UpdateCmdHistory(cmd)
+        self.OnCmdErase(None)
+        self.parent.parent.statusbar.SetStatusText('')
         
     def OnUpdateStatusBar(self, event):
         """!Update Layer Manager status bar"""
@@ -644,6 +663,14 @@ class GPrompt(object):
             else:
                 self.dataList = self._getListOfMaps()
         
+    def GetCommands(self):
+        """!Get list of launched commands"""
+        return self.commands
+    
+    def ClearCommands(self):
+        """!Clear list of commands"""
+        del self.commands[:]
+        
 class GPromptPopUp(GPrompt, TextCtrlAutoComplete):
     """!Interactive wxGUI prompt - popup version"""
     def __init__(self, parent):
@@ -679,6 +706,10 @@ class GPromptPopUp(GPrompt, TextCtrlAutoComplete):
         """!Erase command prompt"""
         self.input.SetValue('')
 
+    def OnRunCmd(self, event):
+        """!Run command"""
+        self._runCmd(event.GetString())
+        
 class GPromptSTC(GPrompt, wx.stc.StyledTextCtrl):
     """!Styled wxGUI prompt with autocomplete and calltips"""    
     def __init__(self, parent, id = wx.ID_ANY, margin = False):
@@ -792,19 +823,20 @@ class GPromptSTC(GPrompt, wx.stc.StyledTextCtrl):
         self.SetCurrentPos(pos)
         
         cmd = text.strip().split(' ')[0]
-
+        
         if not self.cmdDesc or cmd != self.cmdDesc.get_name():
-            if cmd in ('r.mapcalc', 'r3.mapcalc'):
+            if cmd in ('r.mapcalc', 'v.type'):
+                cmd = cmd + '_wrapper'
+            
+            if cmd in ('r.mapcalc', 'r3.mapcalc') and \
+                    self.parent.parent.GetName() == 'LayerManager':
                 self.parent.parent.OnMapCalculator(event = None, cmd = [cmd])
                 # add command to history & clean prompt
                 self.UpdateCmdHistory([cmd])
                 self.OnCmdErase(None)
             else:
-                if sys.platform == 'win32':
-                    if cmd in globalvar.grassCmd['script']:
-                        cmd += globalvar.EXT_SCT
                 try:
-                    self.cmdDesc = gtask.parse_interface(cmd)
+                    self.cmdDesc = gtask.parse_interface(GetRealCmd(cmd))
                 except IOError:
                     self.cmdDesc = None
         
@@ -831,54 +863,53 @@ class GPromptSTC(GPrompt, wx.stc.StyledTextCtrl):
         except IndexError:
             return None
         
-        if len(entry.split(' ')) > 1:
-            if cmd in globalvar.grassCmd['all']:
+        try:
+            splitted = utils.split(str(entry))
+        except ValueError: # No closing quotation error
+            return None
+        if len(splitted) > 1:
+            if cmd in globalvar.grassCmd:
                 toComplete['cmd'] = cmd
                 if entry[-1] == ' ':
                     words = entry.split(' ')
                     if any(word.startswith('-') for word in words):
                         toComplete['entity'] = 'params'
-                        return toComplete
                     else:
                         toComplete['entity'] = 'params+flags'
-                        return toComplete
-                    
                 else:
-                    #get word left from current position
+                    # get word left from current position
                     word = self.GetWordLeft(withDelimiter = True)
-                    if word[0] == '=':
+                    
+                    if word[0] == '=' and word[-1] == '@':
+                        toComplete['entity'] = 'mapsets'
+                    elif word[0] == '=':
                         # get name of parameter
                         paramName = self.GetWordLeft(withDelimiter = False, ignoredDelimiter = '=').strip('=')
                         if paramName:
                             try:
                                 param = self.cmdDesc.get_param(paramName)
                             except (ValueError, AttributeError):
-                                return
+                                return None
                         else:
-                            return
-
+                            return None
+                        
                         if param['values']:
                             toComplete['entity'] = 'param values'
-                            return toComplete
                         elif param['prompt'] == 'raster' and param['element'] == 'cell':
                             toComplete['entity'] = 'raster map'
-                            return toComplete
                         elif param['prompt'] == 'vector' and param['element'] == 'vector':
                             toComplete['entity'] = 'vector map'
-                            return toComplete
                     elif word[0] == '-':
                         toComplete['entity'] = 'flags'
-                        return toComplete
                     elif word[0] == ' ':
                         toComplete['entity'] = 'params'
-                        return toComplete
-                                       
             else:
                 return None
         else:
             toComplete['entity'] = 'command'
             toComplete['cmd'] = cmd
-            return toComplete
+        
+        return toComplete
     
     def GetWordLeft(self, withDelimiter = False, ignoredDelimiter = None):
         """!Get word left from current cursor position. The beginning
@@ -914,7 +945,7 @@ class GPromptSTC(GPrompt, wx.stc.StyledTextCtrl):
         """
         # keycodes used: "." = 46, "=" = 61, "-" = 45 
         pos = self.GetCurrentPos()
-        #complete command after pressing '.'
+        # complete command after pressing '.'
         if event.GetKeyCode() == 46 and not event.ShiftDown():
             self.autoCompList = list()
             entry = self.GetTextLeft()
@@ -952,7 +983,7 @@ class GPromptSTC(GPrompt, wx.stc.StyledTextCtrl):
             self.InsertText(pos, '=')
             self.CharRight()
             self.toComplete = self.EntityToComplete()
-            if self.toComplete:
+            if self.toComplete and 'entity' in self.toComplete:
                 if self.toComplete['entity'] == 'raster map':
                     self.autoCompList = self.mapList['raster']
                 elif self.toComplete['entity'] == 'vector map':
@@ -961,6 +992,17 @@ class GPromptSTC(GPrompt, wx.stc.StyledTextCtrl):
                     param = self.GetWordLeft(withDelimiter = False, ignoredDelimiter='=').strip(' =')
                     self.autoCompList = self.cmdDesc.get_param(param)['values']
             self.ShowList()
+        
+        # complete mapset ('@')
+        elif event.GetKeyCode() == 50 and event.ShiftDown():
+            self.autoCompList = list()
+            self.InsertText(pos, '@')
+            self.CharRight()
+            self.toComplete = self.EntityToComplete()
+            
+            if self.toComplete and self.toComplete['entity'] == 'mapsets':
+                self.autoCompList = self.mapsetList
+            self.ShowList()
             
         # complete after pressing CTRL + Space          
         elif event.GetKeyCode() == wx.WXK_SPACE and event.ControlDown():
@@ -971,7 +1013,7 @@ class GPromptSTC(GPrompt, wx.stc.StyledTextCtrl):
 
             #complete command
             if self.toComplete['entity'] == 'command':
-                for command in globalvar.grassCmd['all']:
+                for command in globalvar.grassCmd:
                     if command.find(self.toComplete['cmd']) == 0:
                         dotNumber = list(self.toComplete['cmd']).count('.') 
                         self.autoCompList.append(command.split('.',dotNumber)[-1])
@@ -1033,14 +1075,10 @@ class GPromptSTC(GPrompt, wx.stc.StyledTextCtrl):
             except IndexError:
                 cmd = ''
             
-            if cmd not in globalvar.grassCmd['all']:
+            if cmd not in globalvar.grassCmd:
                 return
             
-            if sys.platform == 'win32':
-                if cmd in globalvar.grassCmd['script']:
-                    cmd += globalvar.EXT_SCT
-            
-            info = gtask.command_info(cmd)
+            info = gtask.command_info(GetRealCmd(cmd))
             
             self.CallTipSetBackground("#f4f4d1")
             self.CallTipSetForeground("BLACK")
@@ -1078,49 +1116,21 @@ class GPromptSTC(GPrompt, wx.stc.StyledTextCtrl):
             self.LineEnd()
             self.parent.parent.statusbar.SetStatusText('')
             
-        elif event.GetKeyCode() == wx.WXK_RETURN and \
+        elif event.GetKeyCode() in [wx.WXK_RETURN, wx.WXK_NUMPAD_ENTER] and \
                 self.AutoCompActive() == False:
             # run command on line when <return> is pressed
-            
-            if self.parent.GetName() == "ModelerDialog":
-                self.parent.OnOk(None)
-                return
-            
-            # find the command to run
-            line = self.GetCurLine()[0].strip()
-            if len(line) == 0:
-                return
-            
-            # parse command into list
-            try:
-                cmd = utils.split(str(line))
-            except UnicodeError:
-                cmd = utils.split(utils.EncodeString((line)))
-            cmd = map(utils.DecodeString, cmd)
-            
-            #  send the command list to the processor 
-            if cmd[0] in ('r.mapcalc', 'r3.mapcalc') and len(cmd) == 1:
-                self.parent.parent.OnMapCalculator(event = None, cmd = cmd)
-            else:
-                self.parent.RunCmd(cmd)
-            
-            # add command to history & clean prompt
-            self.UpdateCmdHistory(cmd)
-            self.OnCmdErase(None)
-            self.parent.parent.statusbar.SetStatusText('')
-            
+            self._runCmd(self.GetCurLine()[0].strip())
+                        
         elif event.GetKeyCode() == wx.WXK_SPACE:
             items = self.GetTextLeft().split()
             if len(items) == 1:
                 cmd = items[0].strip()
-                if cmd in globalvar.grassCmd['all'] and \
+                if cmd in globalvar.grassCmd and \
                         cmd != 'r.mapcalc' and \
                         (not self.cmdDesc or cmd != self.cmdDesc.get_name()):
-                    if sys.platform == 'win32':
-                        if cmd in globalvar.grassCmd['script']:
-                            cmd += globalvar.EXT_SCT
+                    
                     try:
-                        self.cmdDesc = gtask.parse_interface(cmd)
+                        self.cmdDesc = gtask.parse_interface(GetRealCmd(cmd))
                     except IOError:
                         self.cmdDesc = None
             event.Skip()
diff --git a/gui/wxpython/gui_core/toolbars.py b/gui/wxpython/gui_core/toolbars.py
new file mode 100644
index 0000000..bb859ad
--- /dev/null
+++ b/gui/wxpython/gui_core/toolbars.py
@@ -0,0 +1,231 @@
+"""!
+ at package gui_core.toolbars
+
+ at brief Base classes toolbar widgets
+
+Classes:
+ - toolbars::BaseToolbar
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton
+ at author Jachym Cepicky
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import os
+import sys
+import platform
+
+import wx
+
+from core               import globalvar
+from core.debug         import Debug
+from icons.icon         import MetaIcon
+
+BaseIcons = {
+    'display'    : MetaIcon(img = 'show',
+                            label = _('Display map'),
+                            desc  =  _('Re-render modified map layers only')),
+    'render'     : MetaIcon(img = 'layer-redraw',
+                            label = _('Render map'),
+                            desc = _('Force re-rendering all map layers')),
+    'erase'      : MetaIcon(img = 'erase',
+                            label = _('Erase display'),
+                            desc = _('Erase display canvas with given background color')),
+    'pointer'    : MetaIcon(img = 'pointer',
+                            label = _('Pointer')),
+    'zoomIn'     : MetaIcon(img = 'zoom-in',
+                            label = _('Zoom in'),
+                            desc = _('Drag or click mouse to zoom')),
+    'zoomOut'    : MetaIcon(img = 'zoom-out',
+                            label = _('Zoom out'),
+                            desc = _('Drag or click mouse to unzoom')),
+    'zoomBack'   : MetaIcon(img = 'zoom-last',
+                            label = _('Return to previous zoom')),
+    'zoomMenu'   : MetaIcon(img = 'zoom-more',
+                            label = _('Various zoom options'),
+                            desc = _('Zoom to computational, default, saved region, ...')),
+    'zoomExtent' : MetaIcon(img = 'zoom-extent',
+                            label = _('Zoom to selected map layer(s)')),
+    'pan'        : MetaIcon(img = 'pan',
+                            label = _('Pan'),
+                            desc = _('Drag with mouse to pan')),
+    'saveFile'   : MetaIcon(img = 'map-export',
+                            label = _('Save display to graphic file')),
+    'print'      : MetaIcon(img = 'print',
+                            label = _('Print display')),
+    'font'       : MetaIcon(img = 'font',
+                            label = _('Select font')),
+    'help'       : MetaIcon(img = 'help',
+                            label = _('Show manual')),
+    'quit'       : MetaIcon(img = 'quit',
+                            label = _('Quit')),
+    'addRast'    : MetaIcon(img = 'layer-raster-add',
+                            label = _('Add raster map layer')),
+    'addVect'    : MetaIcon(img = 'layer-vector-add',
+                            label = _('Add vector map layer')),
+    'overlay'    : MetaIcon(img = 'overlay-add',
+                            label = _('Add map elements'),
+                            desc = _('Overlay elements like scale and legend onto map')),
+    'histogramD' : MetaIcon(img = 'layer-raster-histogram',
+                            label = _('Create histogram with d.histogram')),
+    'settings'   : MetaIcon(img = 'settings',
+                            label = _("Settings")),
+    }
+    
+class BaseToolbar(wx.ToolBar):
+    """!Abstract toolbar class"""
+    def __init__(self, parent):
+        self.parent = parent
+        wx.ToolBar.__init__(self, parent = self.parent, id = wx.ID_ANY)
+        
+        self.action = dict()
+        
+        self.Bind(wx.EVT_TOOL, self.OnTool)
+        
+        self.SetToolBitmapSize(globalvar.toolbarSize)
+        
+    def InitToolbar(self, toolData):
+        """!Initialize toolbar, add tools to the toolbar
+        """
+        for tool in toolData:
+            self.CreateTool(*tool)
+        
+        self._data = toolData
+        
+    def _toolbarData(self):
+        """!Toolbar data (virtual)"""
+        return None
+    
+    def CreateTool(self, label, bitmap, kind,
+                   shortHelp, longHelp, handler, pos = -1):
+        """!Add tool to the toolbar
+        
+        @param pos if -1 add tool, if > 0 insert at given pos
+        @return id of tool
+        """
+        bmpDisabled = wx.NullBitmap
+        tool = -1
+        if label: 
+            tool = vars(self)[label] = wx.NewId()
+            Debug.msg(3, "CreateTool(): tool=%d, label=%s bitmap=%s" % \
+                          (tool, label, bitmap))
+            if pos < 0:
+                toolWin = self.AddLabelTool(tool, label, bitmap,
+                                            bmpDisabled, kind,
+                                            shortHelp, longHelp)
+            else:
+                toolWin = self.InsertLabelTool(pos, tool, label, bitmap,
+                                            bmpDisabled, kind,
+                                            shortHelp, longHelp)
+            self.Bind(wx.EVT_TOOL, handler, toolWin)
+        else: # separator
+            self.AddSeparator()
+        
+        return tool
+    
+    def EnableLongHelp(self, enable = True):
+        """!Enable/disable long help
+        
+        @param enable True for enable otherwise disable
+        """
+        for tool in self._data:
+            if tool[0] == '': # separator
+                continue
+            
+            if enable:
+                self.SetToolLongHelp(vars(self)[tool[0]], tool[4])
+            else:
+                self.SetToolLongHelp(vars(self)[tool[0]], "")
+        
+    def OnTool(self, event):
+        """!Tool selected
+        """
+        
+        if hasattr(self.parent, 'toolbars'):
+            if self.parent.GetToolbar('vdigit'):
+                # update vdigit toolbar (unselect currently selected tool)
+                id = self.parent.toolbars['vdigit'].GetAction(type = 'id')
+                self.parent.toolbars['vdigit'].ToggleTool(id, False)
+        
+        if event:
+            # deselect previously selected tool
+            id = self.action.get('id', -1)
+            if id != event.GetId():
+                self.ToggleTool(self.action['id'], False)
+            else:
+                self.ToggleTool(self.action['id'], True)
+            
+            self.action['id'] = event.GetId()
+            
+            event.Skip()
+        else:
+            # initialize toolbar
+            self.ToggleTool(self.action['id'], True)
+        
+    def GetAction(self, type = 'desc'):
+        """!Get current action info"""
+        return self.action.get(type, '')
+    
+    def SelectDefault(self, event):
+        """!Select default tool"""
+        self.ToggleTool(self.defaultAction['id'], True)
+        self.defaultAction['bind'](event)
+        self.action = { 'id' : self.defaultAction['id'],
+                        'desc' : self.defaultAction.get('desc', '') }
+        
+    def FixSize(self, width):
+        """!Fix toolbar width on Windows
+            
+        @todo Determine why combobox causes problems here
+        """
+        if platform.system() == 'Windows':
+            size = self.GetBestSize()
+            self.SetSize((size[0] + width, size[1]))
+
+    def Enable(self, tool, enable = True):
+        """!Enable defined tool
+        
+        @param tool name
+        @param enable True to enable otherwise disable tool
+        """
+        try:
+            id = getattr(self, tool)
+        except AttributeError:
+            return
+        
+        self.EnableTool(id, enable)
+        
+    def _getToolbarData(self, data):
+        """!Define tool
+        """
+        retData = list()
+        for args in data:
+            retData.append(self._defineTool(*args))
+        return retData
+
+    def _defineTool(self, name = None, icon = None, handler = None, item = wx.ITEM_NORMAL, pos = -1):
+        """!Define tool
+        """
+        if name:
+            return (name, icon.GetBitmap(),
+                    item, icon.GetLabel(), icon.GetDesc(),
+                    handler, pos)
+        return ("", "", "", "", "", "") # separator
+
+    def _onMenu(self, data):
+        """!Toolbar pop-up menu"""
+        menu = wx.Menu()
+        
+        for icon, handler in data:
+            item = wx.MenuItem(menu, wx.ID_ANY, icon.GetLabel())
+            item.SetBitmap(icon.GetBitmap(self.parent.iconsize))
+            menu.AppendItem(item)
+            self.Bind(wx.EVT_MENU, handler, item)
+        
+        self.PopupMenu(menu)
+        menu.Destroy()
diff --git a/gui/wxpython/gui_core/widgets.py b/gui/wxpython/gui_core/widgets.py
new file mode 100644
index 0000000..0016e58
--- /dev/null
+++ b/gui/wxpython/gui_core/widgets.py
@@ -0,0 +1,520 @@
+"""!
+ at package gui_core.widgets
+
+ at brief Core GUI widgets
+
+Classes:
+ - widgets::GNotebook
+ - widgets::ScrolledPanel
+ - widgets::NumTextCtrl
+ - widgets::FloatSlider
+ - widgets::SymbolButton
+ - widgets::StaticWrapText
+ - widgets::BaseValidator
+ - widgets::IntegerValidator
+ - widgets::FloatValidator
+ - widgets::ItemTree
+
+(C) 2008-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
+ at author Enhancements by Michael Barton <michael.barton asu.edu>
+ at author Anna Kratochvilova <kratochanna gmail.com> (Google SoC 2011)
+"""
+
+import os
+import sys
+import string
+
+import wx
+import wx.lib.scrolledpanel as SP
+try:
+    import wx.lib.agw.flatnotebook   as FN
+except ImportError:
+    import wx.lib.flatnotebook   as FN
+try:
+    from wx.lib.buttons import ThemedGenBitmapTextButton as BitmapTextButton
+except ImportError: # not sure about TGBTButton version
+    from wx.lib.buttons import GenBitmapTextButton as BitmapTextButton
+try:
+    import wx.lib.agw.customtreectrl as CT
+except ImportError:
+    import wx.lib.customtreectrl as CT
+
+from core        import globalvar
+from core.debug  import Debug
+
+from wx.lib.newevent import NewEvent
+wxSymbolSelectionChanged, EVT_SYMBOL_SELECTION_CHANGED  = NewEvent()
+
+class GNotebook(FN.FlatNotebook):
+    """!Generic notebook widget
+    """
+    def __init__(self, parent, style, **kwargs):
+        if globalvar.hasAgw:
+            FN.FlatNotebook.__init__(self, parent, id = wx.ID_ANY, agwStyle = style, **kwargs)
+        else:
+            FN.FlatNotebook.__init__(self, parent, id = wx.ID_ANY, style = style, **kwargs)
+        
+        self.notebookPages = {}
+            
+    def AddPage(self, **kwargs):
+        """!Add a page
+        """
+        if 'name' in kwargs:
+            self.notebookPages[kwargs['name']] = kwargs['page']
+            del kwargs['name']
+        super(GNotebook, self).AddPage(**kwargs)
+        
+    def InsertPage(self, **kwargs):
+        """!Insert a new page
+        """
+        if 'name' in kwargs:
+            self.notebookPages[kwargs['name']] = kwargs['page']
+            del kwargs['name']
+        super(GNotebook, self).InsertPage(**kwargs)
+        
+    def SetSelectionByName(self, page):
+        """!Set notebook
+        
+        @param page names, eg. 'layers', 'output', 'search', 'pyshell', 'nviz'
+        """
+        idx = self.GetPageIndexByName(page)
+        if self.GetSelection() != idx:
+            self.SetSelection(idx)
+        
+    def GetPageIndexByName(self, page):
+        """!Get notebook page index
+        
+        @param page name
+        """
+        if page not in self.notebookPages:
+            return -1
+        
+        return self.GetPageIndex(self.notebookPages[page])
+
+class ScrolledPanel(SP.ScrolledPanel):
+    """!Custom ScrolledPanel to avoid strange behaviour concerning focus"""
+    def __init__(self, parent, style = wx.TAB_TRAVERSAL):
+        SP.ScrolledPanel.__init__(self, parent = parent, id = wx.ID_ANY, style = style)
+
+    def OnChildFocus(self, event):
+        pass
+
+class NumTextCtrl(wx.TextCtrl):
+    """!Class derived from wx.TextCtrl for numerical values only"""
+    def __init__(self, parent,  **kwargs):
+##        self.precision = kwargs.pop('prec')
+        wx.TextCtrl.__init__(self, parent = parent,
+            validator = NTCValidator(flag = 'DIGIT_ONLY'), **kwargs)
+        
+            
+    def SetValue(self, value):
+        super(NumTextCtrl, self).SetValue( str(value))
+        
+    def GetValue(self):
+        val = super(NumTextCtrl, self).GetValue()
+        if val == '':
+            val = '0'
+        try:
+            return float(val)
+        except ValueError:
+            val = ''.join(''.join(val.split('-')).split('.'))
+            return float(val)
+        
+    def SetRange(self, min, max):
+        pass
+   
+class FloatSlider(wx.Slider):
+    """!Class derived from wx.Slider for floats"""
+    def __init__(self, **kwargs):
+        Debug.msg(1, "FloatSlider.__init__()")
+        wx.Slider.__init__(self, **kwargs)
+        self.coef = 1.
+        #init range
+        self.minValueOrig = 0
+        self.maxValueOrig = 1
+        
+    def SetValue(self, value):
+        value *= self.coef 
+        if abs(value) < 1 and value != 0:
+            while abs(value) < 1:
+                value *= 100
+                self.coef *= 100
+            super(FloatSlider, self).SetRange(self.minValueOrig * self.coef, self.maxValueOrig * self.coef)
+        super(FloatSlider, self).SetValue(value)
+        
+        Debug.msg(4, "FloatSlider.SetValue(): value = %f" % value)
+        
+    def SetRange(self, minValue, maxValue):
+        self.coef = 1.
+        self.minValueOrig = minValue
+        self.maxValueOrig = maxValue
+        if abs(minValue) < 1 or abs(maxValue) < 1:
+            while (abs(minValue) < 1 and minValue != 0) or (abs(maxValue) < 1 and maxValue != 0):
+                minValue *= 100
+                maxValue *= 100
+                self.coef *= 100
+            super(FloatSlider, self).SetValue(super(FloatSlider, self).GetValue() * self.coef)
+        super(FloatSlider, self).SetRange(minValue, maxValue)
+        Debug.msg(4, "FloatSlider.SetRange(): minValue = %f, maxValue = %f" % (minValue, maxValue))
+            
+    def GetValue(self):
+        val = super(FloatSlider, self).GetValue()
+        Debug.msg(4, "FloatSlider.GetValue(): value = %f" % (val/self.coef))
+        return val/self.coef
+           
+class SymbolButton(BitmapTextButton):
+    """!Button with symbol and label."""
+    def __init__(self, parent, usage, label, **kwargs):
+        """!Constructor
+        
+        @param parent parent (usually wx.Panel)
+        @param usage determines usage and picture
+        @param label displayed label
+        """
+        size = (15, 15)
+        buffer = wx.EmptyBitmap(*size)
+        BitmapTextButton.__init__(self, parent = parent, label = " " + label, bitmap = buffer, **kwargs)
+        
+        dc = wx.MemoryDC()
+        dc.SelectObject(buffer)
+        maskColor = wx.Color(255, 255, 255)
+        dc.SetBrush(wx.Brush(maskColor))
+        dc.Clear()
+        
+        if usage == 'record':
+            self.DrawRecord(dc, size)
+        elif usage == 'stop':
+            self.DrawStop(dc, size)
+        elif usage == 'play':
+            self.DrawPlay(dc, size)
+        elif usage == 'pause':
+            self.DrawPause(dc, size)
+
+        if sys.platform != "win32":
+            buffer.SetMaskColour(maskColor)
+        self.SetBitmapLabel(buffer)
+        dc.SelectObject(wx.NullBitmap)
+        
+    def DrawRecord(self, dc, size):
+        """!Draw record symbol"""
+        dc.SetBrush(wx.Brush(wx.Color(255, 0, 0)))
+        dc.DrawCircle(size[0]/2, size[1] / 2, size[0] / 2)
+        
+    def DrawStop(self, dc, size):
+        """!Draw stop symbol"""
+        dc.SetBrush(wx.Brush(wx.Color(50, 50, 50)))
+        dc.DrawRectangle(0, 0, size[0], size[1])
+        
+    def DrawPlay(self, dc, size):
+        """!Draw play symbol"""
+        dc.SetBrush(wx.Brush(wx.Color(0, 255, 0)))
+        points = (wx.Point(0, 0), wx.Point(0, size[1]), wx.Point(size[0], size[1] / 2))
+        dc.DrawPolygon(points)
+        
+    def DrawPause(self, dc, size):
+        """!Draw pause symbol"""
+        dc.SetBrush(wx.Brush(wx.Color(50, 50, 50)))
+        dc.DrawRectangle(0, 0, 2 * size[0] / 5, size[1])
+        dc.DrawRectangle(3 * size[0] / 5, 0, 2 * size[0] / 5, size[1])
+
+class StaticWrapText(wx.StaticText):
+    """!A Static Text field that wraps its text to fit its width,
+    enlarging its height if necessary.
+    """
+    def __init__(self, parent, id = wx.ID_ANY, label = '', *args, **kwds):
+        self.parent        = parent
+        self.originalLabel = label
+        
+        wx.StaticText.__init__(self, parent, id, label = '', *args, **kwds)
+        
+        self.SetLabel(label)
+        self.Bind(wx.EVT_SIZE, self.OnResize)
+    
+    def SetLabel(self, label):
+        self.originalLabel = label
+        self.wrappedSize = None
+        self.OnResize(None)
+
+    def OnResize(self, event):
+        if not getattr(self, "resizing", False):
+            self.resizing = True
+            newSize = wx.Size(self.parent.GetSize().width - 50,
+                              self.GetSize().height)
+            if self.wrappedSize != newSize:
+                wx.StaticText.SetLabel(self, self.originalLabel)
+                self.Wrap(newSize.width)
+                self.wrappedSize = newSize
+                
+                self.SetSize(self.wrappedSize)
+            del self.resizing
+
+class BaseValidator(wx.PyValidator):
+    def __init__(self):
+        wx.PyValidator.__init__(self)
+        
+        self.Bind(wx.EVT_TEXT, self.OnText) 
+
+    def OnText(self, event):
+        """!Do validation"""
+        self.Validate()
+        
+        event.Skip()
+        
+    def Validate(self):
+        """Validate input"""
+        textCtrl = self.GetWindow()
+        text = textCtrl.GetValue()
+
+        if text:
+            try:
+                self.type(text)
+            except ValueError:
+                textCtrl.SetBackgroundColour("grey")
+                textCtrl.SetFocus()
+                textCtrl.Refresh()
+                return False
+        
+        sysColor = wx.SystemSettings_GetColour(wx.SYS_COLOUR_WINDOW)
+        textCtrl.SetBackgroundColour(sysColor)
+        
+        textCtrl.Refresh()
+        
+        return True
+
+    def TransferToWindow(self):
+        return True # Prevent wxDialog from complaining.
+    
+    def TransferFromWindow(self):
+        return True # Prevent wxDialog from complaining.
+
+class IntegerValidator(BaseValidator):
+    """!Validator for floating-point input"""
+    def __init__(self):
+        BaseValidator.__init__(self)
+        self.type = int
+        
+    def Clone(self):
+        """!Clone validator"""
+        return IntegerValidator()
+
+class FloatValidator(BaseValidator):
+    """!Validator for floating-point input"""
+    def __init__(self):
+        BaseValidator.__init__(self)
+        self.type = float
+        
+    def Clone(self):
+        """!Clone validator"""
+        return FloatValidator()
+
+class NTCValidator(wx.PyValidator):
+    """!validates input in textctrls, taken from wxpython demo"""
+    def __init__(self, flag = None):
+        wx.PyValidator.__init__(self)
+        self.flag = flag
+        self.Bind(wx.EVT_CHAR, self.OnChar)
+
+    def Clone(self):
+        return NTCValidator(self.flag)
+
+    def OnChar(self, event):
+        key = event.GetKeyCode()
+        if key < wx.WXK_SPACE or key == wx.WXK_DELETE or key > 255:
+            event.Skip()
+            return
+        if self.flag == 'DIGIT_ONLY' and chr(key) in string.digits + '.-':
+            event.Skip()
+            return
+        if not wx.Validator_IsSilent():
+            wx.Bell()
+        # Returning without calling even.Skip eats the event before it
+        # gets to the text control
+        return  
+
+
+class GenericValidator(wx.PyValidator):
+    """ This validator checks condition and calls callback
+    in case the condition is not fulfilled.
+    """
+    def __init__(self, condition, callback):
+        """ Standard constructor.
+
+        @param condition function which accepts string value and returns T/F
+        @param callback function which is called when condition is not fulfilled
+        """
+        wx.PyValidator.__init__(self)
+        self._condition = condition
+        self._callback = callback
+
+    def Clone(self):
+        """ Standard cloner.
+
+        Note that every validator must implement the Clone() method.
+        """
+        return GenericValidator(self._condition, self._callback)
+
+    def Validate(self, win):
+        """ Validate the contents of the given text control.
+        """
+        ctrl = self.GetWindow()
+        text = ctrl.GetValue()
+        if not self._condition(text):
+            self._callback(ctrl)
+            return False
+        else:
+            return True
+
+    def TransferToWindow(self):
+        """ Transfer data from validator to window.
+        """
+        return True # Prevent wxDialog from complaining.
+
+
+    def TransferFromWindow(self):
+        """ Transfer data from window to validator.
+        """
+        return True # Prevent wxDialog from complaining.
+
+
+class ItemTree(CT.CustomTreeCtrl):
+    def __init__(self, parent, id = wx.ID_ANY,
+                 ctstyle = CT.TR_HIDE_ROOT | CT.TR_FULL_ROW_HIGHLIGHT | CT.TR_HAS_BUTTONS |
+                 CT.TR_LINES_AT_ROOT | CT.TR_SINGLE, **kwargs):
+        if globalvar.hasAgw:
+            super(ItemTree, self).__init__(parent, id, agwStyle = ctstyle, **kwargs)
+        else:
+            super(ItemTree, self).__init__(parent, id, style = ctstyle, **kwargs)
+        
+        self.root = self.AddRoot(_("Menu tree"))
+        self.itemsMarked = [] # list of marked items
+        self.itemSelected = None
+
+    def SearchItems(self, element, value):
+        """!Search item 
+
+        @param element element index (see self.searchBy)
+        @param value
+
+        @return list of found tree items
+        """
+        items = list()
+        if not value:
+            return items
+        
+        item = self.GetFirstChild(self.root)[0]
+        self._processItem(item, element, value, items)
+        
+        self.itemsMarked  = items
+        self.itemSelected = None
+        
+        return items
+    
+    def _processItem(self, item, element, value, listOfItems):
+        """!Search items (used by SearchItems)
+        
+        @param item reference item
+        @param listOfItems list of found items
+        """
+        while item and item.IsOk():
+            subItem = self.GetFirstChild(item)[0]
+            if subItem:
+                self._processItem(subItem, element, value, listOfItems)
+            data = self.GetPyData(item)
+            
+            if data and element in data and \
+                    value.lower() in data[element].lower():
+                listOfItems.append(item)
+            
+            item = self.GetNextSibling(item)
+            
+    def GetSelected(self):
+        """!Get selected item"""
+        return self.itemSelected
+
+    def OnShowItem(self, event):
+        """!Highlight first found item in menu tree"""
+        if len(self.itemsMarked) > 0:
+            if self.GetSelected():
+                self.ToggleItemSelection(self.GetSelected())
+                idx = self.itemsMarked.index(self.GetSelected()) + 1
+            else:
+                idx = 0
+            try:
+                self.ToggleItemSelection(self.itemsMarked[idx])
+                self.itemSelected = self.itemsMarked[idx]
+                self.EnsureVisible(self.itemsMarked[idx])
+            except IndexError:
+                self.ToggleItemSelection(self.itemsMarked[0]) # reselect first item
+                self.EnsureVisible(self.itemsMarked[0])
+                self.itemSelected = self.itemsMarked[0]
+        else:
+            for item in self.root.GetChildren():
+                self.Collapse(item)
+            itemSelected = self.GetSelection()
+            if itemSelected:
+                self.ToggleItemSelection(itemSelected)
+            self.itemSelected = None
+
+class SingleSymbolPanel(wx.Panel):
+    """!Panel for displaying one symbol.
+    
+    Changes background when selected. Assumes that parent will catch
+    events emitted on mouse click. Used in gui_core::dialog::SymbolDialog.
+    """
+    def __init__(self, parent, symbolPath):
+        """!Panel constructor
+        
+        @param parent parent (gui_core::dialog::SymbolDialog)
+        @param symbolPath absolute path to symbol
+        """
+        wx.Panel.__init__(self, parent, id = wx.ID_ANY, style = wx.BORDER_RAISED)
+        self.SetName(os.path.splitext(os.path.basename(symbolPath))[0])
+        self.sBmp = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(symbolPath))
+
+        self.selected = False
+        self.selectColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHT)
+        self.deselectColor = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOW)
+        
+        sizer = wx.BoxSizer()
+        sizer.Add(item = self.sBmp, proportion = 0, flag = wx.ALL | wx.ALIGN_CENTER, border = 5)
+        self.SetBackgroundColour(self.deselectColor)
+        self.SetMinSize(self.GetBestSize())
+        self.SetSizerAndFit(sizer)
+        
+        # binding to both (staticBitmap, Panel) necessary
+        self.sBmp.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
+        self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
+        self.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)
+        self.sBmp.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)
+        
+    def OnLeftDown(self, event):
+        """!Panel selected, background changes"""
+        self.selected = True
+        self.SetBackgroundColour(self.selectColor)
+        self.Refresh()
+        event.Skip()
+        
+        event = wxSymbolSelectionChanged(name = self.GetName(), doubleClick = False)
+        wx.PostEvent(self.GetParent(), event)
+        
+    def OnDoubleClick(self, event):
+        event = wxSymbolSelectionChanged(name = self.GetName(), doubleClick = True)
+        wx.PostEvent(self.GetParent(), event)
+        
+    def Deselect(self):
+        """!Panel deselected, background changes back to default"""
+        self.selected = False
+        self.SetBackgroundColour(self.deselectColor)
+        self.Refresh()
+        
+    def Select(self):
+        """!Select panel, no event emitted"""
+        self.selected = True
+        self.SetBackgroundColour(self.selectColor)
+        self.Refresh()
+        
diff --git a/gui/wxpython/gui_modules/__init__.py b/gui/wxpython/gui_modules/__init__.py
deleted file mode 100644
index f0185e4..0000000
--- a/gui/wxpython/gui_modules/__init__.py
+++ /dev/null
@@ -1,45 +0,0 @@
-all = [
-    "colorrules.py",
-    "dbm.py",
-    "dbm_base.py",
-    "dbm_dialogs.py",
-    "debug.py",
-    "disp_print.py",
-    "gcmd.py",
-    "gcpmanager.py",
-    "gcpmapdisp.py",
-    "gdialogs.py",
-    "georect.py",
-    "ghelp.py"
-    "globalvar.py",
-    "goutput.py",
-    "gselect.py",
-    "histogram.py",
-    "layertree.py",
-    "location_wizard.py",
-    "mapdisp_command.py",
-    "mapdisp_window.py",
-    "mapdisp.py",
-    "mcalc_builder.py",
-    "menu.py",
-    "menudata.py",
-    "menuform.py",
-    "nviz_mapdisp.py",
-    "nviz_preferences.py",
-    "nviz_tools.py",
-    "ogc_services.py",
-    "preferences.py",
-    "profile.py",
-    "render.py",
-    "rules.py",
-    "sqlbuilder.py",
-    "toolbars.py",
-    "units.py",
-    "utils.py",
-    "vclean.py",
-    "vdigit.py",
-    "workspace.py",
-    "wxnviz.py",
-    "wxvdriver.py",
-    "wxvdigit.py",
-]
diff --git a/gui/wxpython/gui_modules/colorrules.py b/gui/wxpython/gui_modules/colorrules.py
deleted file mode 100644
index 5eca833..0000000
--- a/gui/wxpython/gui_modules/colorrules.py
+++ /dev/null
@@ -1,869 +0,0 @@
-"""
- at package colorrules.py
-
- at brief Dialog for interactive management of raster color tables and
-vector rgb_column attributes.
-
-Classes:
- - ColorTable
- - BuferedWindow
-
-(C) 2008, 2010 by the GRASS Development Team
-This program is free software under the GNU General Public License
-(>=v2). Read the file COPYING that comes with GRASS for details.
-
- at author Michael Barton (Arizona State University)
- at author Martin Landa <landa.martin gmail.com> (various updates)
- at author Anna Kratochvilova (load/save raster color tables)
-"""
-
-import os
-import sys
-import shutil
-
-import wx
-import wx.lib.colourselect as csel
-import wx.lib.scrolledpanel as scrolled
-
-import grass.script as grass
-
-import dbm
-import gcmd
-import globalvar
-import gselect
-import render
-import utils
-from debug import Debug as Debug
-from preferences import globalSettings as UserSettings
-
-class ColorTable(wx.Frame):
-    def __init__(self, parent, raster, id=wx.ID_ANY, title = _("Set color table"),
-                 style=wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER,
-                 **kwargs):
-        """!Dialog for interactively entering rules for map management
-        commands
-
-        @param raster True to raster otherwise vector
-        """
-        self.parent = parent # GMFrame
-        self.raster = raster
-        
-        wx.Frame.__init__(self, parent, id, title, style = style, **kwargs)
-        
-        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-        
-        # input map to change
-        self.inmap = ''
-
-        if self.raster:
-            # raster properties
-            self.properties = {
-                # min cat in raster map
-                'min' : None,
-                # max cat in raster map
-                'max' : None,
-                }
-        else:
-            # vector properties
-            self.properties = {
-                # list of database layers for vector (minimum of 1)
-                'layers' : ['1'],
-                # list of database columns for vector
-                'columns' : [],
-                # vector layer for attribute table to use for setting color
-                'layer' : 1, 
-                # vector attribute table used for setting color         
-                'table' : '',
-                # vector attribute column for assigning colors
-                'column' : '', 
-                # vector attribute column to use for storing colors
-                'rgb' : '',
-                }
-
-        # rules for creating colortable
-        self.ruleslines = {}
-
-        # instance of render.Map to be associated with display
-        self.Map   = render.Map()  
-
-        # reference to layer with preview
-        self.layer = None          
-        
-        if self.raster:
-            self.SetTitle(_('Create new color table for raster map'))
-            crlabel = _('Enter raster category values or percents')
-        else:
-            self.SetTitle(_('Create new color table for vector map'))
-            crlabel = _('Enter vector attribute values or ranges (n or n1 to n2)')
-        
-        # top controls
-        if self.raster:
-            maplabel = _('Select raster map:')
-        else:
-            maplabel = _('Select vector map:')
-        inputBox = wx.StaticBox(parent=self, id=wx.ID_ANY,
-                                label=" %s " % maplabel)
-        self.inputSizer = wx.StaticBoxSizer(inputBox, wx.VERTICAL)
-        if self.raster:
-            elem = 'cell'
-        else:
-            elem = 'vector'
-        self.selectionInput = gselect.Select(parent=self, id=wx.ID_ANY,
-                                             size=globalvar.DIALOG_GSELECT_SIZE,
-                                             type=elem)
-        
-        self.ovrwrtcheck = wx.CheckBox(parent=self, id=wx.ID_ANY,
-                                       label=_('replace existing color table'))
-        self.ovrwrtcheck.SetValue(UserSettings.Get(group='cmd', key='overwrite', subkey='enabled'))
-        
-        if self.raster:
-            self.btnSave = wx.Button(parent=self, id=wx.ID_SAVE)
-            self.btnSave.SetToolTipString(_('Save color table to file'))
-        
-        if not self.raster:
-            self.cb_vl_label = wx.StaticText(parent=self, id=wx.ID_ANY,
-                                             label=_('Layer:'))
-            self.cb_vc_label = wx.StaticText(parent=self, id=wx.ID_ANY,
-                                             label=_('Attribute column:'))
-            self.cb_vrgb_label = wx.StaticText(parent=self, id=wx.ID_ANY,
-                                               label=_('RGB color column:'))
-            self.cb_vlayer = gselect.LayerSelect(self)
-            self.cb_vcol = gselect.ColumnSelect(self)
-            self.cb_vrgb = gselect.ColumnSelect(self)
-        
-        # color table and preview window
-        self.cr_label = wx.StaticText(parent=self, id=wx.ID_ANY,
-                                      label=crlabel)
-        self.cr_panel = self._colorRulesPanel()
-        # add two rules as default
-        self.AddRules(2)
-        
-        self.numRules = wx.SpinCtrl(parent=self, id=wx.ID_ANY,
-                                    min=1, max=1e6)
-        
-        # initialize preview display
-        self.InitDisplay()
-        self.preview = BufferedWindow(self, id=wx.ID_ANY, size=(400, 300),
-                                      Map=self.Map)
-        self.preview.EraseMap()
-        
-        self.btnCancel = wx.Button(parent=self, id=wx.ID_CANCEL)
-        self.btnApply = wx.Button(parent=self, id=wx.ID_APPLY) 
-        self.btnOK = wx.Button(parent=self, id=wx.ID_OK)
-        self.btnOK.SetDefault()
-        self.btnOK.Enable(False)
-        self.btnApply.Enable(False)
-        
-        self.btnPreview = wx.Button(parent=self, id=wx.ID_ANY,
-                                    label=_("Preview"))
-        self.btnPreview.Enable(False)
-        self.btnAdd = wx.Button(parent=self, id=wx.ID_ADD)
-        self.helpbtn = wx.Button(parent=self, id=wx.ID_HELP)
-            
-        
-        # bindings
-        self.Bind(wx.EVT_BUTTON, self.OnHelp, self.helpbtn)
-        self.selectionInput.Bind(wx.EVT_TEXT, self.OnSelectionInput)
-        self.Bind(wx.EVT_BUTTON, self.OnCancel, self.btnCancel)
-        self.Bind(wx.EVT_BUTTON, self.OnApply, self.btnApply)
-        self.Bind(wx.EVT_BUTTON, self.OnOK, self.btnOK)
-        self.Bind(wx.EVT_BUTTON, self.OnPreview, self.btnPreview)
-        self.Bind(wx.EVT_BUTTON, self.OnAddRules, self.btnAdd)
-        self.Bind(wx.EVT_CLOSE,  self.OnCloseWindow)
-        
-        # additional bindings for raster/vector color management
-        if self.raster:
-            self.Bind(wx.EVT_BUTTON, self.OnSaveTable, self.btnSave)
-        else:
-            self.Bind(wx.EVT_COMBOBOX, self.OnLayerSelection, self.cb_vlayer)
-            self.Bind(wx.EVT_COMBOBOX, self.OnColumnSelection, self.cb_vcol)
-            self.Bind(wx.EVT_COMBOBOX, self.OnRGBColSelection, self.cb_vrgb)
-
-        # set map layer from layer tree
-        try:
-            layer = self.parent.curr_page.maptree.layer_selected
-        except:
-            layer = None
-        if layer:
-            mapLayer = self.parent.curr_page.maptree.GetPyData(layer)[0]['maplayer']
-            name = mapLayer.GetName()
-            type = mapLayer.GetType()
-            self.selectionInput.SetValue(name)
-            self.inmap = name
-            self.OnSelectionInput(None)
-        
-        # layout
-        self.__doLayout()
-        self.SetMinSize(self.GetSize())
-        
-        self.CentreOnScreen()
-        self.Show()
-        
-    def __doLayout(self):
-        sizer = wx.BoxSizer(wx.VERTICAL)
-        
-        #
-        # input
-        #
-        self.inputSizer.Add(item=self.selectionInput,
-                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border=5)
-        replaceSizer = wx.BoxSizer(wx.HORIZONTAL)
-        replaceSizer.Add(item=self.ovrwrtcheck, proportion=1,
-                         flag=wx.ALL | wx.ALIGN_CENTER_VERTICAL, border=1)
-        if self.raster:
-            replaceSizer.Add(item=self.btnSave, proportion=0,
-                            flag=wx.ALIGN_RIGHT | wx.ALL, border=5)
-        
-        self.inputSizer.Add(item=replaceSizer, proportion=1,
-                       flag=wx.ALL | wx.EXPAND, border=0)
-
-        #
-        # body & preview
-        #
-        bodySizer =  wx.GridBagSizer(hgap=5, vgap=5)
-        row = 0
-        bodySizer.Add(item=self.cr_label, pos=(row, 0), span=(1, 3),
-                      flag=wx.ALL, border=5)
-        
-        if not self.raster:
-            vSizer = wx.GridBagSizer(hgap=5, vgap=5)
-            vSizer.Add(self.cb_vl_label, pos=(0, 0),
-                       flag=wx.ALIGN_CENTER_VERTICAL)
-            vSizer.Add(self.cb_vlayer,  pos=(0, 1),
-                       flag=wx.ALIGN_CENTER_VERTICAL)
-            vSizer.Add(self.cb_vc_label, pos=(0, 2),
-                       flag=wx.ALIGN_CENTER_VERTICAL)
-            vSizer.Add(self.cb_vcol, pos=(0, 3),
-                       flag=wx.ALIGN_CENTER_VERTICAL)
-            vSizer.Add(self.cb_vrgb_label, pos=(1, 2),
-                      flag=wx.ALIGN_CENTER_VERTICAL)
-            vSizer.Add(self.cb_vrgb, pos=(1, 3),
-                       flag=wx.ALIGN_CENTER_VERTICAL)
-            row += 1
-            bodySizer.Add(item=vSizer, pos=(row, 0), span=(1, 3))
-        
-        row += 1
-        bodySizer.Add(item=self.cr_panel, pos=(row, 0), span=(1, 2))
-        
-        bodySizer.Add(item=self.preview, pos=(row, 2),
-                      flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=10)
-        bodySizer.AddGrowableRow(row)
-        bodySizer.AddGrowableCol(2)
-        
-        row += 1
-        bodySizer.Add(item=self.numRules, pos=(row, 0),
-                      flag=wx.ALIGN_CENTER_VERTICAL)
-        
-        bodySizer.Add(item=self.btnAdd, pos=(row, 1))
-        bodySizer.Add(item=self.btnPreview, pos=(row, 2),
-                      flag=wx.ALIGN_RIGHT)
-        
-        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
-        btnSizer.Add(self.helpbtn,
-                     flag=wx.LEFT | wx.RIGHT, border=5)
-        btnSizer.Add(self.btnCancel,
-                     flag=wx.LEFT | wx.RIGHT, border=5)
-        btnSizer.Add(self.btnApply,
-                     flag=wx.LEFT | wx.RIGHT, border=5)
-        btnSizer.Add(self.btnOK,
-                     flag=wx.LEFT | wx.RIGHT, border=5)
-        
-        sizer.Add(item=self.inputSizer, proportion=0,
-                  flag=wx.ALL | wx.EXPAND, border=5)
-        
-        sizer.Add(item=bodySizer, proportion=1,
-                  flag=wx.ALL | wx.EXPAND, border=5)
-        
-        sizer.Add(item=wx.StaticLine(parent=self, id=wx.ID_ANY,
-                                     style=wx.LI_HORIZONTAL),
-                  proportion=0,
-                  flag=wx.EXPAND | wx.ALL, border=5) 
-        
-        sizer.Add(item=btnSizer, proportion=0,
-                  flag=wx.ALL | wx.ALIGN_RIGHT, border=5)
-        
-        self.SetSizer(sizer)
-        sizer.Fit(self)
-        self.Layout()
-        
-    def _colorRulesPanel(self):
-        """!Create rules panel"""
-        cr_panel = scrolled.ScrolledPanel(parent=self, id=wx.ID_ANY,
-                                          size=(180, 300),
-                                          style=wx.TAB_TRAVERSAL | wx.SUNKEN_BORDER)
-        cr_panel.SetupScrolling(scroll_x = False)
-        self.cr_sizer = wx.GridBagSizer(vgap=2, hgap=4)
-        
-        cr_panel.SetSizer(self.cr_sizer)
-        cr_panel.SetAutoLayout(True)
-        
-        return cr_panel        
-
-    def OnAddRules(self, event):
-        """!Add rules button pressed"""
-        nrules = self.numRules.GetValue()
-        self.AddRules(nrules)
-        
-    def AddRules(self, nrules):
-        """!Add rules"""
-        snum = len(self.ruleslines.keys())
-        for num in range(snum, snum + nrules):
-            # enable
-            enable = wx.CheckBox(parent=self.cr_panel, id=num)
-            enable.SetValue(True)
-            self.Bind(wx.EVT_CHECKBOX, self.OnRuleEnable, enable)
-            # value
-            txt_ctrl = wx.TextCtrl(parent=self.cr_panel, id=1000 + num,
-                                   size=(90, -1),
-                                   style=wx.TE_NOHIDESEL)
-            self.Bind(wx.EVT_TEXT, self.OnRuleValue, txt_ctrl)
-            # color
-            color_ctrl = csel.ColourSelect(self.cr_panel, id=2000 + num,
-                                           size = globalvar.DIALOG_COLOR_SIZE)
-            self.Bind(csel.EVT_COLOURSELECT, self.OnRuleColor, color_ctrl)
-            self.ruleslines[enable.GetId()] = { 'value' : '',
-                                                'color': "0:0:0" }
-            
-            self.cr_sizer.Add(item=enable, pos=(num, 0),
-                              flag=wx.ALIGN_CENTER_VERTICAL)
-            self.cr_sizer.Add(item=txt_ctrl, pos=(num, 1),
-                              flag=wx.ALIGN_CENTER | wx.RIGHT, border=5)
-            self.cr_sizer.Add(item=color_ctrl, pos=(num, 2),
-                              flag=wx.ALIGN_CENTER | wx.RIGHT, border=10)
-        
-        self.cr_panel.Layout()
-        self.cr_panel.SetupScrolling(scroll_x = False)
-        
-    def InitDisplay(self):
-        """!Initialize preview display, set dimensions and region
-        """
-        self.width = self.Map.width = 400
-        self.height = self.Map.height = 300
-        self.Map.geom = self.width, self.height
-
-    def OnErase(self, event):
-        """!Erase the histogram display
-        """
-        self.PreviewWindow.Draw(self.HistWindow.pdc, pdctype='clear')
-
-    def OnCloseWindow(self, event):
-        """!Window closed
-        Also remove associated rendered images
-        """
-        self.Map.Clean()
-        self.Destroy()
-        
-    def OnSelectionInput(self, event):
-        """!Raster/vector map selected"""
-        if event:
-            self.inmap = event.GetString()
-
-        if self.inmap:
-            if self.raster:
-                mapType = 'cell'
-            else:
-                mapType = 'vector'
-            if not grass.find_file(name = self.inmap, element = mapType)['file']:
-                self.inmap = None
-        
-        if not self.inmap:
-            self.btnPreview.Enable(False)
-            self.btnOK.Enable(False)
-            self.btnApply.Enable(False)
-            self.OnLoadTable(event)
-            return
-        
-        if self.raster:
-            info = grass.raster_info(map = self.inmap)
-            
-            if info:
-                self.properties['min'] = info['min']
-                self.properties['max'] = info['max']
-                self.OnLoadTable(event)
-            else:
-                self.inmap = ''
-                self.properties['min'] = self.properties['max'] = None
-                self.btnPreview.Enable(False)
-                self.btnOK.Enable(False)
-                self.btnApply.Enable(False)
-                self.preview.EraseMap()
-                self.cr_label.SetLabel(_('Enter raster category values or percents'))
-                return
-            
-            if info['datatype'] == 'CELL':
-                mapRange = _('range')
-            else:
-                mapRange = _('fp range')
-            self.cr_label.SetLabel(_('Enter raster category values or percents (%(range)s = %(min)d-%(max)d)') %
-                                     { 'range' : mapRange,
-                                       'min' : self.properties['min'],
-                                       'max' : self.properties['max'] })
-        
-        else:
-            # initialize layer selection combobox
-            self.cb_vlayer.InsertLayers(self.inmap)
-            # initialize attribute table for layer=1
-            layer = int(self.properties['layer'])
-            self.properties['table'] = gselect.VectorDBInfo(self.inmap).layers[layer]['table']
-            # initialize column selection comboboxes 
-            self.cb_vcol.InsertColumns(vector=self.inmap, layer=layer)
-            self.cb_vrgb.InsertColumns(vector=self.inmap, layer=layer)
-            self.Update()
-    
-        self.btnPreview.Enable(True)
-        self.btnOK.Enable(True)
-        self.btnApply.Enable(True)
-        
-    def OnLayerSelection(self, event):
-        # reset choices in column selection comboboxes if layer changes
-        self.vlayer = int(event.GetString())
-        self.vtable = gselect.VectorDBInfo(self.inmap).layers[str(self.vlayer)]
-        self.cb_vcol.InsertColumns(vector=self.inmap, layer=self.vlayer)
-        self.cb_vrgb.InsertColumns(vector=self.inmap, layer=self.vlayer)
-        self.Update()
-        
-    def OnColumnSelection(self, event):
-        self.properties['column'] = event.GetString()
-    
-    def OnRGBColSelection(self, event):
-        self.properties['rgb'] = event.GetString()
-        
-    def OnRuleEnable(self, event):
-        """!Rule enabled/disabled"""
-        id = event.GetId()
-        
-        if event.IsChecked():
-            value = self.FindWindowById(id+1000).GetValue()
-            color = self.FindWindowById(id+2000).GetValue()
-            color_str = str(color[0]) + ':' \
-                + str(color[1]) + ':' + \
-                str(color[2])
-            
-            self.ruleslines[id] = {
-                'value' : value,
-                'color' : color_str }
-        else:
-            del self.ruleslines[id]
-        
-    def OnRuleValue(self, event):
-        """!Rule value changed"""
-        num = event.GetId()
-        vals = event.GetString().strip()
-        
-        if vals == '':
-            return
-
-        tc = self.FindWindowById(num)
-        
-        if self.raster:
-            self.ruleslines[num-1000]['value'] = vals
-        
-        else:
-            if self.properties['column'] == '' or self.properties['rgb'] == '':
-                tc.SetValue('')
-                gcmd.GMessage(parent=self,
-                              message=_("Please select attribute column "
-                                        "and RGB color column first"))
-            else:
-                try:
-                    self.ruleslines[num-1000]['value'] = self.SQLConvert(vals)
-                except ValueError:
-                    tc.SetValue('')
-                    self.ruleslines[num-1000]['value'] = ''
-                    return
-        
-    def OnRuleColor(self, event):
-        """!Rule color changed"""
-        num = event.GetId()
-        
-        rgba_color = event.GetValue()
-        
-        rgb_string = str(rgba_color[0]) + ':' \
-            + str(rgba_color[1]) + ':' + \
-            str(rgba_color[2])
-        
-        self.ruleslines[num-2000]['color'] = rgb_string
-        
-    def SQLConvert(self, vals):
-        valslist = []
-        valslist = vals.split('to')
-        if len(valslist) == 1:
-            sqlrule = '%s=%s' % (self.properties['column'], valslist[0])
-        elif len(valslist) > 1:
-            sqlrule = '%s>=%s AND %s<=%s' % (self.properties['column'], valslist[0],
-                                             self.properties['column'], valslist[1])
-        else:
-            return None
-        
-        return sqlrule
-        
-    def OnLoadTable(self, event):
-        """!Load current color table (using `r.colors.out`)"""
-        self.ruleslines.clear()
-        self.cr_panel.DestroyChildren()
-        if self.inmap:
-            ctable = gcmd.RunCommand('r.colors.out',
-                                     parent = self,
-                                     read = True,
-                                     map = self.inmap,
-                                     rules = '-')
-        else:
-            self.OnPreview(event)
-            return
-        
-        rulesNumber = len(ctable.splitlines())
-        self.AddRules(rulesNumber)
-        
-        count = 0
-        for line in ctable.splitlines():
-            value, color = map(lambda x: x.strip(), line.split(' '))
-            self.ruleslines[count]['value'] = value
-            self.ruleslines[count]['color'] = color
-            self.FindWindowById(count + 1000).SetValue(value)
-            rgb = list()
-            for c in color.split(':'):
-                rgb.append(int(c))
-            self.FindWindowById(count + 2000).SetColour(rgb)
-            count += 1
-        
-        self.OnPreview(tmp = False)
-        
-    def OnSaveTable(self, event):
-        """!Save color table to file"""
-        rulestxt = ''   
-        for rule in self.ruleslines.itervalues():
-            if not rule['value']:
-                continue
-            rulestxt += rule['value'] + ' ' + rule['color'] + '\n'
-        if not rulestxt:
-            gcmd.GMessage(message = _("Nothing to save."),
-                          parent = self)
-            return
-        
-        dlg = wx.FileDialog(parent = self,
-                            message = _("Save color table to file"),
-                            defaultDir = os.getcwd(), style = wx.SAVE | wx.OVERWRITE_PROMPT)
-        if dlg.ShowModal() == wx.ID_OK:
-            path = dlg.GetPath()
-            fd = open(path, 'w')
-            fd.write(rulestxt)
-            fd.close()            
-        dlg.Destroy()
-          
-    def OnApply(self, event):
-        """!Apply selected color table
-
-        @return True on success otherwise False
-        """
-        ret = self.CreateColorTable()
-        display = self.parent.GetLayerTree().GetMapDisplay()
-        if display and display.IsAutoRendered():
-            display.GetWindow().UpdateMap(render = True)
-        
-        return ret
-
-    def OnOK(self, event):
-        """!Apply selected color table and close the dialog"""
-        if self.OnApply(event):
-            self.Destroy()
-    
-    def OnCancel(self, event):
-        """!Do not apply any changes and close the dialog"""
-        self.Destroy()
-        
-    def OnPreview(self, event = None, tmp = True):
-        """!Update preview (based on computational region)"""
-        if not self.inmap:
-            self.preview.EraseMap()
-            return
-        
-        # raster
-        if self.raster:
-            cmdlist = ['d.rast',
-                       'map=%s' % self.inmap]
-            ltype = 'raster'
-            
-            # find existing color table and copy to temp file
-            try:
-                name, mapset = self.inmap.split('@')
-            except ValueError:
-                name = self.inmap
-                mapset = grass.find_file(self.inmap, element = 'cell')['mapset']
-                if not mapset:
-                    return
-            old_colrtable = None
-            if mapset == grass.gisenv()['MAPSET']:
-                old_colrtable = grass.find_file(name=name, element='colr')['file']
-            else:
-                old_colrtable = grass.find_file(name=name, element='colr2/' + mapset)['file']
-            
-            if old_colrtable:
-                colrtemp = utils.GetTempfile()
-                shutil.copyfile(old_colrtable, colrtemp)
-        # vector
-        else:
-            cmdlist = ['d.vect',
-                        '-a',
-                       'map=%s' % self.inmap,
-                       'rgb_column=%s' % self.properties["rgb"],
-                       'type=point,line,boundary,area']
-            ltype = 'vector'
-        
-        if not self.layer:
-            self.layer = self.Map.AddLayer(type=ltype, name='preview', command=cmdlist,
-                                           l_active=True, l_hidden=False, l_opacity=1.0,
-                                           l_render=False) 
-        else:
-            self.layer.SetCmd(cmdlist)
-        
-        # apply new color table and display preview
-        self.CreateColorTable(force = True)
-        self.preview.UpdatePreview()
-        
-        # restore previous color table
-        if self.raster and tmp:
-            if old_colrtable:
-                shutil.copyfile(colrtemp, old_colrtable)
-                os.remove(colrtemp)
-            else:
-                gcmd.RunCommand('r.colors',
-                                parent = self,
-                                flags = 'r',
-                                map = self.inmap)
-        
-    def OnHelp(self, event):
-        """!Show GRASS manual page"""
-        if self.raster:
-            cmd = 'r.colors'
-        else:
-            cmd = 'vcolors'
-        gcmd.RunCommand('g.manual',
-                        quiet = True,
-                        parent = self,
-                        entry = cmd)
-        
-    def _IsNumber(self, s):
-        """!Check if 's' is a number"""
-        try:
-            float(s)
-            return True
-        except ValueError:
-            return False
-        
-    def CreateColorTable(self, force = False):
-        """!Creates color table
-
-        @return True on success
-        @return False on failure
-        """
-        rulestxt = ''
-        
-        for rule in self.ruleslines.itervalues():
-            if not rule['value']: # skip empty rules
-                continue
-            
-            if self.raster:
-                if rule['value'] not in ('nv', 'default') and \
-                        rule['value'][-1] != '%' and \
-                        not self._IsNumber(rule['value']):
-                    gcmd.GError(_("Invalid rule value '%s'. Unable to apply color table.") % rule['value'],
-                                parent = self)
-                    return False
-                
-                rulestxt += rule['value'] + ' ' + rule['color'] + '\n'
-            else:
-                rulestxt += "UPDATE %s SET %s='%s' WHERE %s ;\n" % (self.properties['table'],
-                                                                    self.properties['rgb'],
-                                                                    rule['color'],
-                                                                    rule['value'])
-        if not rulestxt:
-            return False
-        
-        gtemp = utils.GetTempfile()
-        output = open(gtemp, "w")
-        try:
-            output.write(rulestxt)
-        finally:
-            output.close()
-        
-        if self.raster:
-            if not force and \
-                    not self.ovrwrtcheck.IsChecked():
-                flags = 'w'
-            else:
-                flags = ''
-            
-            ret = gcmd.RunCommand('r.colors',
-                                  flags = flags,
-                                  map = self.inmap,
-                                  rules = gtemp)
-            if ret != 0:
-                gcmd.GMessage(_("Color table already exists. "
-                                "Check out 'replace existing color table' to "
-                                "overwrite it."),
-                              parent = self)
-                return False
-        
-        else:
-            gcmd.RunCommand('db.execute',
-                            parent = self,
-                            input = gtemp)
-        
-        return True
-    
-class BufferedWindow(wx.Window):
-    """!A Buffered window class"""
-    def __init__(self, parent, id,
-                 style=wx.NO_FULL_REPAINT_ON_RESIZE,
-                 Map=None, **kwargs):
-        
-        wx.Window.__init__(self, parent, id, style = style, **kwargs)
-
-        self.parent = parent
-        self.Map = Map
-        
-        # re-render the map from GRASS or just redraw image
-        self.render = True
-        # indicates whether or not a resize event has taken place
-        self.resize = False 
-
-        #
-        # event bindings
-        #
-        self.Bind(wx.EVT_PAINT,        self.OnPaint)
-        self.Bind(wx.EVT_IDLE,         self.OnIdle)
-        self.Bind(wx.EVT_ERASE_BACKGROUND, lambda x: None)
-
-        #
-        # render output objects
-        #
-        # image file to be rendered
-        self.mapfile = None 
-        # wx.Image object (self.mapfile)
-        self.img = None
-
-        self.pdc = wx.PseudoDC()
-        # will store an off screen empty bitmap for saving to file
-        self._Buffer = None 
-
-        # make sure that extents are updated at init
-        self.Map.region = self.Map.GetRegion()
-        self.Map.SetRegion()
-
-    def Draw(self, pdc, img=None, pdctype='image'):
-        """!Draws preview or clears window"""
-        pdc.BeginDrawing()
-
-        Debug.msg (3, "BufferedWindow.Draw(): pdctype=%s" % (pdctype))
-
-        if pdctype == 'clear': # erase the display
-            bg = wx.WHITE_BRUSH
-            pdc.SetBackground(bg)
-            pdc.Clear()
-            self.Refresh()
-            pdc.EndDrawing()
-            return
-
-        if pdctype == 'image' and img:
-            bg = wx.TRANSPARENT_BRUSH
-            pdc.SetBackground(bg)
-            bitmap = wx.BitmapFromImage(img)
-            w, h = bitmap.GetSize()
-            pdc.DrawBitmap(bitmap, 0, 0, True) # draw the composite map
-            
-        pdc.EndDrawing()
-        self.Refresh()
-
-    def OnPaint(self, event):
-        """!Draw pseudo DC to buffer"""
-        self._Buffer = wx.EmptyBitmap(self.Map.width, self.Map.height)
-        dc = wx.BufferedPaintDC(self, self._Buffer)
-        
-        # use PrepareDC to set position correctly
-        self.PrepareDC(dc)
-        
-        # we need to clear the dc BEFORE calling PrepareDC
-        bg = wx.Brush(self.GetBackgroundColour())
-        dc.SetBackground(bg)
-        dc.Clear()
-        
-        # create a clipping rect from our position and size
-        # and the Update Region
-        rgn = self.GetUpdateRegion()
-        r = rgn.GetBox()
-        
-        # draw to the dc using the calculated clipping rect
-        self.pdc.DrawToDCClipped(dc, r)
-        
-    def OnSize(self, event):
-        """!Init image size to match window size"""
-        # set size of the input image
-        self.Map.width, self.Map.height = self.GetClientSize()
-
-        # Make new off screen bitmap: this bitmap will always have the
-        # current drawing in it, so it can be used to save the image to
-        # a file, or whatever.
-        self._Buffer = wx.EmptyBitmap(self.Map.width, self.Map.height)
-
-        # get the image to be rendered
-        self.img = self.GetImage()
-
-        # update map display
-        if self.img and self.Map.width + self.Map.height > 0: # scale image during resize
-            self.img = self.img.Scale(self.Map.width, self.Map.height)
-            self.render = False
-            self.UpdatePreview()
-
-        # re-render image on idle
-        self.resize = True
-
-    def OnIdle(self, event):
-        """!Only re-render a preview image from GRASS during
-        idle time instead of multiple times during resizing.
-        """
-        if self.resize:
-            self.render = True
-            self.UpdatePreview()
-        event.Skip()
-
-    def GetImage(self):
-        """!Converts files to wx.Image"""
-        if self.Map.mapfile and os.path.isfile(self.Map.mapfile) and \
-                os.path.getsize(self.Map.mapfile):
-            img = wx.Image(self.Map.mapfile, wx.BITMAP_TYPE_ANY)
-        else:
-            img = None
-        
-        return img
-    
-    def UpdatePreview(self, img=None):
-        """!Update canvas if window changes geometry"""
-        Debug.msg (2, "BufferedWindow.UpdatePreview(%s): render=%s" % (img, self.render))
-        oldfont = ""
-        oldencoding = ""
-        
-        if self.render:
-            # make sure that extents are updated
-            self.Map.region = self.Map.GetRegion()
-            self.Map.SetRegion()
-            
-            # render new map images
-            self.mapfile = self.Map.Render(force=self.render)
-            self.img = self.GetImage()
-            self.resize = False
-        
-        if not self.img:
-            return
-        
-        # paint images to PseudoDC
-        self.pdc.Clear()
-        self.pdc.RemoveAll()
-        # draw map image background
-        self.Draw(self.pdc, self.img, pdctype='image')
-        
-        self.resize = False
-        
-    def EraseMap(self):
-        """!Erase preview"""
-        self.Draw(self.pdc, pdctype='clear')
-    
diff --git a/gui/wxpython/gui_modules/disp_print.py b/gui/wxpython/gui_modules/disp_print.py
deleted file mode 100644
index b29ea31..0000000
--- a/gui/wxpython/gui_modules/disp_print.py
+++ /dev/null
@@ -1,158 +0,0 @@
-"""
-MODULE:     disp_print.py
-
-CLASSES:
-    * MapPrint
-    * PrintOptions
-
-PURPOSE:    Print context and utility functions for printing
-            contents of map display window.
-
-AUTHORS:    The GRASS Development Team
-            Michael Barton (Arizona State University)
-            Based on generic example code from wxPython
-            demo program by Robin Dunn
-
-COPYRIGHT:  (C) 2007 by the GRASS Development Team
-            This program is free software under the GNU General Public
-            License (>=v2). Read the file COPYING that comes with GRASS
-            for details.
-
-"""
-
-import  wx
-
-
-class MapPrint(wx.Printout):
-    def __init__(self, canvas):
-        wx.Printout.__init__(self)
-        self.canvas = canvas
-
-    def OnBeginDocument(self, start, end):
-        return super(MapPrint, self).OnBeginDocument(start, end)
-
-    def OnEndDocument(self):
-        super(MapPrint, self).OnEndDocument()
-
-    def OnBeginPrinting(self):
-        super(MapPrint, self).OnBeginPrinting()
-
-    def OnEndPrinting(self):
-        super(MapPrint, self).OnEndPrinting()
-
-    def OnPreparePrinting(self):
-        super(MapPrint, self).OnPreparePrinting()
-
-    def HasPage(self, page):
-        if page <= 2:
-            return True
-        else:
-            return False
-
-    def GetPageInfo(self):
-        return (1, 2, 1, 2)
-
-    def OnPrintPage(self, page):
-        dc = self.GetDC()
-
-        #-------------------------------------------
-        # One possible method of setting scaling factors...
-        maxX, maxY = self.canvas.GetSize()
-
-        # Let's have at least 50 device units margin
-        marginX = 10
-        marginY = 10
-
-        # Add the margin to the graphic size
-        maxX = maxX + (2 * marginX)
-        maxY = maxY + (2 * marginY)
-
-        # Get the size of the DC in pixels
-        (w, h) = dc.GetSizeTuple()
-
-        # Calculate a suitable scaling factor
-        scaleX = float(w) / maxX
-        scaleY = float(h) / maxY
-
-        # Use x or y scaling factor, whichever fits on the DC
-        actualScale = min(scaleX, scaleY)
-
-        # Calculate the position on the DC for centering the graphic
-        posX = (w - (self.canvas.GetSize()[0] * actualScale)) / 2.0
-        posY = (h - (self.canvas.GetSize()[1] * actualScale)) / 2.0
-
-        # Set the scale and origin
-        dc.SetUserScale(actualScale, actualScale)
-        dc.SetDeviceOrigin(int(posX), int(posY))
-
-        #-------------------------------------------
-
-        self.canvas.pdc.DrawToDC(dc)
-
-        # prints a page number on the page
-#        dc.DrawText("Page: %d" % page, marginX/2, maxY-marginY)
-
-        return True
-
-class PrintOptions:
-    def __init__(self, parent, mapwin):
-        self.mapframe = parent
-        self.mapwin = mapwin
-	#self.frame = frame
-
-	self.printData = None
-
-	#self.canvas = ScrolledWindow.MyCanvas(self)
-
-    def setup(self):
-	if self.printData:
-	    return
-        self.printData = wx.PrintData()
-        self.printData.SetPaperId(wx.PAPER_LETTER)
-        self.printData.SetPrintMode(wx.PRINT_MODE_PRINTER)
-
-    def OnPageSetup(self, event):
-	self.setup()
-        psdd = wx.PageSetupDialogData(self.printData)
-        psdd.CalculatePaperSizeFromId()
-        dlg = wx.PageSetupDialog(self.mapwin, psdd)
-        dlg.ShowModal()
-
-        # this makes a copy of the wx.PrintData instead of just saving
-        # a reference to the one inside the PrintDialogData that will
-        # be destroyed when the dialog is destroyed
-        self.printData = wx.PrintData( dlg.GetPageSetupData().GetPrintData() )
-
-        dlg.Destroy()
-
-    def OnPrintPreview(self, event):
-	self.setup()
-        data = wx.PrintDialogData(self.printData)
-        printout = MapPrint(self.mapwin)
-        printout2 = MapPrint(self.mapwin)
-        self.preview = wx.PrintPreview(printout, printout2, data)
-
-        if not self.preview.Ok():
-            wx.MessageBox("There was a problem printing this display\n", wx.OK)
-            return
-
-        pfrm = wx.PreviewFrame(self.preview, self.mapframe, "Print preview")
-
-        pfrm.Initialize()
-        pfrm.SetPosition(self.mapframe.GetPosition())
-        pfrm.SetSize(self.mapframe.GetClientSize())
-        pfrm.Show(True)
-
-    def OnDoPrint(self, event):
-	self.setup()
-        pdd = wx.PrintDialogData(self.printData)
-        # set number of pages/copies
-        pdd.SetToPage(1)
-        printer = wx.Printer(pdd)
-        printout = MapPrint(self.mapwin)
-
-        if not printer.Print(self.mapframe, printout, True):
-            wx.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx.OK)
-        else:
-            self.printData = wx.PrintData( printer.GetPrintDialogData().GetPrintData() )
-        printout.Destroy()
diff --git a/gui/wxpython/gui_modules/gcpmapdisp.py b/gui/wxpython/gui_modules/gcpmapdisp.py
deleted file mode 100644
index d8f8e5c..0000000
--- a/gui/wxpython/gui_modules/gcpmapdisp.py
+++ /dev/null
@@ -1,1105 +0,0 @@
-"""!
- at package gcpmapdisp.py
-
- at brief display to manage ground control points with two toolbars, one for
-various display management functions, one for manipulating GCPs.
-
-Classes:
-- MapFrame
-
-(C) 2006-2010 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
-
-Derived from mapdisp.py
-
- at author Markus Metz
-"""
-
-import os
-import sys
-import glob
-import math
-import tempfile
-import copy
-import platform
-
-import globalvar
-import wx
-import wx.aui
-
-try:
-    import subprocess
-except:
-    CompatPath = os.path.join(globalvar.ETCWXDIR)
-    sys.path.append(CompatPath)
-    from compat import subprocess
-
-gmpath = os.path.join(globalvar.ETCWXDIR, "icons")
-sys.path.append(gmpath)
-
-grassPath = os.path.join(globalvar.ETCDIR, "python")
-sys.path.append(grassPath)
-
-import render
-import toolbars
-import menuform
-import gselect
-import disp_print
-import gcmd
-import dbm
-import dbm_dialogs
-import globalvar
-import utils
-import gdialogs
-from grass.script import core as grass
-from debug import Debug
-from icon  import Icons
-from preferences import globalSettings as UserSettings
-
-from mapdisp_command import Command
-from mapdisp_window import BufferedWindow
-
-# for standalone app
-cmdfilename = None
-
-class MapFrame(wx.Frame):
-    """!Main frame for map display window. Drawing takes place in
-    child double buffered drawing window.
-    """
-    def __init__(self, parent=None, id=wx.ID_ANY, title=_("GRASS GIS Manage Ground Control Points"),
-                 style=wx.DEFAULT_FRAME_STYLE, toolbars=["gcpdisp"],
-                 tree=None, notebook=None, lmgr=None, page=None,
-                 Map=None, auimgr=None, **kwargs):
-        """!Main map display window with toolbars, statusbar and
-        DrawWindow
-
-        @param toolbars array of activated toolbars, e.g. ['map', 'digit']
-        @param tree reference to layer tree
-        @param notebook control book ID in Layer Manager
-        @param lmgr Layer Manager
-        @param page notebook page with layer tree
-        @param Map instance of render.Map
-        @param auimgs AUI manager
-        @param kwargs wx.Frame attribures
-        """
-        self._layerManager = lmgr   # Layer Manager object
-        self.Map        = Map       # instance of render.Map
-        self.tree       = tree      # Layer Manager layer tree object
-        self.page       = page      # Notebook page holding the layer tree
-        self.layerbook  = notebook  # Layer Manager layer tree notebook
-        self.parent     = parent
-        
-        if 'name' not in kwargs:
-            kwargs['name'] = 'GCPMapWindow'
-        wx.Frame.__init__(self, parent, id, title, style = style, **kwargs)
-        
-        # available cursors
-        self.cursors = {
-            # default: cross
-            # "default" : wx.StockCursor(wx.CURSOR_DEFAULT),
-            "default" : wx.StockCursor(wx.CURSOR_ARROW),
-            "cross"   : wx.StockCursor(wx.CURSOR_CROSS),
-            "hand"    : wx.StockCursor(wx.CURSOR_HAND),
-            "pencil"  : wx.StockCursor(wx.CURSOR_PENCIL),
-            "sizenwse": wx.StockCursor(wx.CURSOR_SIZENWSE)
-            }
-        
-        #
-        # set the size & system icon
-        #
-        self.SetClientSize(self.GetSize())
-        self.iconsize = (16, 16)
-
-        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass_map.ico'), wx.BITMAP_TYPE_ICO))
-
-        #
-        # Fancy gui
-        #
-        self._mgr = wx.aui.AuiManager(self)
-
-        #
-        # Add toolbars
-        #
-        self.toolbars = { 'map' : None,
-                          'vdigit' : None,
-                          'georect' : None, 
-                          'gcpdisp' : None, 
-                          'gcpman' : None, 
-                          'nviz' : None }
-
-        for toolb in toolbars:
-            self.AddToolbar(toolb)
-
-        self.activemap = self.toolbars['gcpdisp'].togglemap
-        self.activemap.SetSelection(0)
-        self.SrcMap        = self.grwiz.SrcMap       # instance of render.Map
-        self.TgtMap        = self.grwiz.TgtMap       # instance of render.Map
-        self._mgr.SetDockSizeConstraint(0.5, 0.5)
-
-        #
-        # Add statusbar
-        #
-        self.statusbar = self.CreateStatusBar(number=4, style=0)
-        self.statusbar.SetStatusWidths([-5, -2, -1, -1])
-        self.statusbarWin = dict()
-        self.statusbarWin['toggle'] = wx.Choice(self.statusbar, wx.ID_ANY,
-                                  choices = [_("Coordinates"),
-                                             _("Extent"),
-                                             _("Comp. region"),
-                                             _("Show comp. extent"),
-                                             _("Display mode"),
-                                             _("Display geometry"),
-                                             _("Map scale"),
-                                             _("Go to GCP No."),
-                                             _("RMS error")])
-        # set StatusBar to Go to GCP No.
-        self.statusbarWin['toggle'].SetSelection(7)
-
-        self.statusbar.Bind(wx.EVT_CHOICE, self.OnToggleStatus, self.statusbarWin['toggle'])
-        # auto-rendering checkbox
-        self.statusbarWin['render'] = wx.CheckBox(parent=self.statusbar, id=wx.ID_ANY,
-                                                  label=_("Render"))
-        self.statusbar.Bind(wx.EVT_CHECKBOX, self.OnToggleRender, self.statusbarWin['render'])
-        self.statusbarWin['render'].SetValue(UserSettings.Get(group='display',
-                                                              key='autoRendering',
-                                                              subkey='enabled'))
-        self.statusbarWin['render'].SetToolTip(wx.ToolTip (_("Enable/disable auto-rendering")))
-        # show region
-        self.statusbarWin['region'] = wx.CheckBox(parent=self.statusbar, id=wx.ID_ANY,
-                                                  label=_("Show computational extent"))
-        self.statusbar.Bind(wx.EVT_CHECKBOX, self.OnToggleShowRegion, self.statusbarWin['region'])
-        
-        self.statusbarWin['region'].SetValue(False)
-        self.statusbarWin['region'].Hide()
-        self.statusbarWin['region'].SetToolTip(wx.ToolTip (_("Show/hide computational "
-                                                             "region extent (set with g.region). "
-                                                             "Display region drawn as a blue box inside the "
-                                                             "computational region, "
-                                                             "computational region inside a display region "
-                                                             "as a red box).")))
-        # set resolution
-        self.statusbarWin['resolution'] = wx.CheckBox(parent=self.statusbar, id=wx.ID_ANY,
-                                                      label=_("Constrain display resolution to computational settings"))
-        self.statusbar.Bind(wx.EVT_CHECKBOX, self.OnToggleResolution, self.statusbarWin['resolution'])
-        self.statusbarWin['resolution'].SetValue(UserSettings.Get(group='display', key='compResolution', subkey='enabled'))
-        self.statusbarWin['resolution'].Hide()
-        self.statusbarWin['resolution'].SetToolTip(wx.ToolTip (_("Constrain display resolution "
-                                                                 "to computational region settings. "
-                                                                 "Default value for new map displays can "
-                                                                 "be set up in 'User GUI settings' dialog.")))
-        # map scale
-        self.statusbarWin['mapscale'] = wx.ComboBox(parent = self.statusbar, id = wx.ID_ANY,
-                                                    style = wx.TE_PROCESS_ENTER,
-                                                    size=(150, -1))
-        self.statusbarWin['mapscale'].SetItems(['1:1000',
-                                                '1:5000',
-                                                '1:10000',
-                                                '1:25000',
-                                                '1:50000',
-                                                '1:100000',
-                                                '1:1000000'])
-        self.statusbarWin['mapscale'].Hide()
-        self.statusbar.Bind(wx.EVT_TEXT_ENTER, self.OnChangeMapScale, self.statusbarWin['mapscale'])
-        self.statusbar.Bind(wx.EVT_COMBOBOX, self.OnChangeMapScale, self.statusbarWin['mapscale'])
-
-        # go to
-        self.statusbarWin['goto'] = wx.SpinCtrl(parent=self.statusbar, id=wx.ID_ANY,
-                             min=0)
-        self.statusbar.Bind(wx.EVT_SPINCTRL, self.OnGoTo, self.statusbarWin['goto'])
-        self.statusbarWin['goto'].Hide()
-        self.statusbar.Bind(wx.EVT_TEXT_ENTER, self.OnGoTo, self.statusbarWin['goto'])
-
-        # projection, unused but BufferedWindow checks for it
-        self.statusbarWin['projection'] = wx.CheckBox(parent=self.statusbar, id=wx.ID_ANY,
-                                                      label=_("Use defined projection"))
-        self.statusbarWin['projection'].SetValue(False)
-        size = self.statusbarWin['projection'].GetSize()
-        self.statusbarWin['projection'].SetMinSize((size[0] + 150, size[1]))
-        self.statusbarWin['projection'].SetToolTip(wx.ToolTip (_("Reproject coordinates displayed "
-                                                                 "in the statusbar. Projection can be "
-                                                                 "defined in GUI preferences dialog "
-                                                                 "(tab 'Display')")))
-        self.statusbarWin['projection'].Hide()
-
-        # mask
-        self.statusbarWin['mask'] = wx.StaticText(parent = self.statusbar, id = wx.ID_ANY,
-                                                  label = '')
-        self.statusbarWin['mask'].SetForegroundColour(wx.Colour(255, 0, 0))
-        
-        # on-render gauge
-        self.statusbarWin['progress'] = wx.Gauge(parent=self.statusbar, id=wx.ID_ANY,
-                                      range=0, style=wx.GA_HORIZONTAL)
-        self.statusbarWin['progress'].Hide()
-        
-        self.StatusbarReposition() # reposition statusbar
-
-        #
-        # Init map display (buffered DC & set default cursor)
-        #
-        self.grwiz.SwitchEnv('source')
-        self.SrcMapWindow = BufferedWindow(self, id=wx.ID_ANY,
-                                          Map=self.SrcMap, tree=self.tree, lmgr=self._layerManager)
-
-        self.grwiz.SwitchEnv('target')
-        self.TgtMapWindow = BufferedWindow(self, id=wx.ID_ANY,
-                                          Map=self.TgtMap, tree=self.tree, lmgr=self._layerManager)
-        self.MapWindow = self.SrcMapWindow
-        self.Map = self.SrcMap
-        self.SrcMapWindow.SetCursor(self.cursors["cross"])
-        self.TgtMapWindow.SetCursor(self.cursors["cross"])
-
-        #
-        # initialize region values
-        #
-        self.__InitDisplay() 
-
-        #
-        # Bind various events
-        #
-        self.Bind(wx.EVT_ACTIVATE, self.OnFocus)
-        self.Bind(render.EVT_UPDATE_PRGBAR, self.OnUpdateProgress)
-        self.Bind(wx.EVT_SIZE,     self.OnDispResize)
-        self.activemap.Bind(wx.EVT_CHOICE, self.OnUpdateActive)
-        
-        #
-        # Update fancy gui style
-        #
-        # AuiManager wants a CentrePane, workaround to get two equally sized windows
-        self.list = self.CreateGCPList()
-
-        #self.SrcMapWindow.SetSize((300, 300))
-        #self.TgtMapWindow.SetSize((300, 300))
-        self.list.SetSize((100, 150))
-        self._mgr.AddPane(self.list, wx.aui.AuiPaneInfo().
-                  Name("gcplist").Caption(_("GCP List")).LeftDockable(False).
-                  RightDockable(False).PinButton().FloatingSize((600,200)).
-                  CloseButton(False).DestroyOnClose(True).
-                  Top().Layer(1).MinSize((200,100)))
-        self._mgr.AddPane(self.SrcMapWindow, wx.aui.AuiPaneInfo().
-                  Name("source").Caption(_("Source Display")).Dockable(False).
-                  CloseButton(False).DestroyOnClose(True).Floatable(False).
-                  Centre())
-        self._mgr.AddPane(self.TgtMapWindow, wx.aui.AuiPaneInfo().
-                  Name("target").Caption(_("Target Display")).Dockable(False).
-                  CloseButton(False).DestroyOnClose(True).Floatable(False).
-                  Right().Layer(0))
-
-        srcwidth, srcheight = self.SrcMapWindow.GetSize()
-        tgtwidth, tgtheight = self.TgtMapWindow.GetSize()
-        srcwidth = (srcwidth + tgtwidth) / 2
-        self._mgr.GetPane("target").Hide()
-        self._mgr.Update()
-        self._mgr.GetPane("source").BestSize((srcwidth, srcheight))
-        self._mgr.GetPane("target").BestSize((srcwidth, srcheight))
-        if self.show_target:
-            self._mgr.GetPane("target").Show()
-        else:
-            self.activemap.Enable(False)
-        # needed by Mac OS, does not harm on Linux, breaks display on Windows
-        if platform.system() != 'Windows':
-            self._mgr.Update()
-
-        #
-        # Init print module and classes
-        #
-        self.printopt = disp_print.PrintOptions(self, self.MapWindow)
-        
-        #
-        # Initialization of digitization tool
-        #
-        self.digit = None
-
-        # set active map
-        self.MapWindow = self.SrcMapWindow
-        self.Map = self.SrcMap
-        
-        # do not init zoom history here, that happens when zooming to map(s)
-
-        #
-        # Re-use dialogs
-        #
-        self.dialogs = {}
-        self.dialogs['attributes'] = None
-        self.dialogs['category'] = None
-        self.dialogs['barscale'] = None
-        self.dialogs['legend'] = None
-
-        self.decorationDialog = None # decoration/overlays
-
-    def AddToolbar(self, name):
-        """!Add defined toolbar to the window
-        
-        Currently known toolbars are:
-         - 'map'     - basic map toolbar
-         - 'vdigit'  - vector digitizer
-         - 'gcpdisp' - GCP Manager, Display
-         - 'gcpman'  - GCP Manager, points management
-         - 'georect' - georectifier
-         - 'nviz'    - 3D view mode
-        """
-        # default toolbar
-        if name == "map":
-            self.toolbars['map'] = toolbars.MapToolbar(self, self.Map)
-
-            self._mgr.AddPane(self.toolbars['map'],
-                              wx.aui.AuiPaneInfo().
-                              Name("maptoolbar").Caption(_("Map Toolbar")).
-                              ToolbarPane().Top().
-                              LeftDockable(False).RightDockable(False).
-                              BottomDockable(False).TopDockable(True).
-                              CloseButton(False).Layer(2).
-                              BestSize((self.toolbars['map'].GetSize())))
-
-        # GCP display
-        elif name == "gcpdisp":
-            self.toolbars['gcpdisp'] = toolbars.GCPDisplayToolbar(self)
-
-            self._mgr.AddPane(self.toolbars['gcpdisp'],
-                              wx.aui.AuiPaneInfo().
-                              Name("gcpdisplaytoolbar").Caption(_("GCP Display toolbar")).
-                              ToolbarPane().Top().
-                              LeftDockable(False).RightDockable(False).
-                              BottomDockable(False).TopDockable(True).
-                              CloseButton(False).Layer(2))
-
-            if self.show_target == False:
-                self.toolbars['gcpdisp'].Enable('zoommenu', enable = False)
-
-            self.toolbars['gcpman'] = toolbars.GCPManToolbar(self)
-
-            self._mgr.AddPane(self.toolbars['gcpman'],
-                              wx.aui.AuiPaneInfo().
-                              Name("gcpmanagertoolbar").Caption(_("GCP Manager toolbar")).
-                              ToolbarPane().Top().Row(1).
-                              LeftDockable(False).RightDockable(False).
-                              BottomDockable(False).TopDockable(True).
-                              CloseButton(False).Layer(2))
-            
-        self._mgr.Update()
-
-    def __InitDisplay(self):
-        """
-        Initialize map display, set dimensions and map region
-        """
-        self.width, self.height = self.GetClientSize()
-
-        Debug.msg(2, "MapFrame.__InitDisplay():")
-        self.grwiz.SwitchEnv('source')
-        self.SrcMap.ChangeMapSize(self.GetClientSize())
-        self.SrcMap.region = self.SrcMap.GetRegion() # g.region -upgc
-        self.grwiz.SwitchEnv('target')
-        self.TgtMap.ChangeMapSize(self.GetClientSize())
-        self.TgtMap.region = self.TgtMap.GetRegion() # g.region -upgc
-        # self.SrcMap.SetRegion() # adjust region to match display window
-        # self.TgtMap.SetRegion() # adjust region to match display window
-
-    def OnUpdateProgress(self, event):
-        """
-        Update progress bar info
-        """
-        self.statusbarWin['progress'].SetValue(event.value)
-        
-        event.Skip()
-        
-    def OnFocus(self, event):
-        """
-        Change choicebook page to match display.
-        Or set display for georectifying
-        """
-        if self._layerManager and \
-                self._layerManager.gcpmanagement:
-            # in GCP Management, set focus to current MapWindow for mouse actions
-            self.OnPointer(event)
-            self.MapWindow.SetFocus()
-        else:
-            # change bookcontrol page to page associated with display
-            # GCP Manager: use bookcontrol?
-            if self.page:
-                pgnum = self.layerbook.GetPageIndex(self.page)
-                if pgnum > -1:
-                    self.layerbook.SetSelection(pgnum)
-        
-        event.Skip()
-
-    def OnDraw(self, event):
-        """!Re-display current map composition
-        """
-        self.MapWindow.UpdateMap(render = False)
-        
-    def OnRender(self, event):
-        """!Re-render map composition (each map layer)
-        """
-        # delete tmp map layers (queries)
-        qlayer = self.Map.GetListOfLayers(l_name=globalvar.QUERYLAYER)
-        for layer in qlayer:
-            self.Map.DeleteLayer(layer)
-
-        self.SrcMapWindow.UpdateMap(render=True)
-        if self.show_target:
-            self.TgtMapWindow.UpdateMap(render=True)
-        
-        # update statusbar
-        self.StatusbarUpdate()
-
-    def OnPointer(self, event):
-        """!Pointer button clicked
-        """
-        # change the cursor
-        self.SrcMapWindow.SetCursor(self.cursors["cross"])
-        self.SrcMapWindow.mouse['use'] = "pointer"
-        self.SrcMapWindow.mouse['box'] = "point"
-        self.TgtMapWindow.SetCursor(self.cursors["cross"])
-        self.TgtMapWindow.mouse['use'] = "pointer"
-        self.TgtMapWindow.mouse['box'] = "point"
-
-    def OnZoomIn(self, event):
-        """
-        Zoom in the map.
-        Set mouse cursor, zoombox attributes, and zoom direction
-        """
-        if self.toolbars['map']:
-            self.toolbars['map'].OnTool(event)
-            self.toolbars['map'].action['desc'] = ''
-        
-        self.MapWindow.mouse['use'] = "zoom"
-        self.MapWindow.mouse['box'] = "box"
-        self.MapWindow.zoomtype = 1
-        self.MapWindow.pen = wx.Pen(colour='Red', width=2, style=wx.SHORT_DASH)
-        
-        # change the cursor
-        self.MapWindow.SetCursor(self.cursors["cross"])
-
-        if self.MapWindow == self.SrcMapWindow:
-            win = self.TgtMapWindow
-        elif self.MapWindow == self.TgtMapWindow:
-            win = self.SrcMapWindow
-
-        win.mouse['use'] = "zoom"
-        win.mouse['box'] = "box"
-        win.zoomtype = 1
-        win.pen = wx.Pen(colour='Red', width=2, style=wx.SHORT_DASH)
-        
-        # change the cursor
-        win.SetCursor(self.cursors["cross"])
-
-    def OnZoomOut(self, event):
-        """
-        Zoom out the map.
-        Set mouse cursor, zoombox attributes, and zoom direction
-        """
-        if self.toolbars['map']:
-            self.toolbars['map'].OnTool(event)
-            self.toolbars['map'].action['desc'] = ''
-        
-        self.MapWindow.mouse['use'] = "zoom"
-        self.MapWindow.mouse['box'] = "box"
-        self.MapWindow.zoomtype = -1
-        self.MapWindow.pen = wx.Pen(colour='Red', width=2, style=wx.SHORT_DASH)
-        
-        # change the cursor
-        self.MapWindow.SetCursor(self.cursors["cross"])
-
-        if self.MapWindow == self.SrcMapWindow:
-            win = self.TgtMapWindow
-        elif self.MapWindow == self.TgtMapWindow:
-            win = self.SrcMapWindow
-
-        win.mouse['use'] = "zoom"
-        win.mouse['box'] = "box"
-        win.zoomtype = -1
-        win.pen = wx.Pen(colour='Red', width=2, style=wx.SHORT_DASH)
-        
-        # change the cursor
-        win.SetCursor(self.cursors["cross"])
-
-    def OnZoomBack(self, event):
-        """
-        Zoom last (previously stored position)
-        """
-        self.MapWindow.ZoomBack()
-
-    def OnPan(self, event):
-        """
-        Panning, set mouse to drag
-        """
-        if self.toolbars['map']:
-            self.toolbars['map'].OnTool(event)
-            self.toolbars['map'].action['desc'] = ''
-        
-        self.MapWindow.mouse['use'] = "pan"
-        self.MapWindow.mouse['box'] = "pan"
-        self.MapWindow.zoomtype = 0
-        
-        # change the cursor
-        self.MapWindow.SetCursor(self.cursors["hand"])
-
-        if self.MapWindow == self.SrcMapWindow:
-            win = self.TgtMapWindow
-        elif self.MapWindow == self.TgtMapWindow:
-            win = self.SrcMapWindow
-
-        win.mouse['use'] = "pan"
-        win.mouse['box'] = "pan"
-        win.zoomtype = 0
-        
-        # change the cursor
-        win.SetCursor(self.cursors["hand"])
-
-    def OnErase(self, event):
-        """
-        Erase the canvas
-        """
-        self.MapWindow.EraseMap()
-
-        if self.MapWindow == self.SrcMapWindow:
-            win = self.TgtMapWindow
-        elif self.MapWindow == self.TgtMapWindow:
-            win = self.SrcMapWindow
-
-        win.EraseMap()
-
-    def OnZoomRegion(self, event):
-        """
-        Zoom to region
-        """
-        self.Map.getRegion()
-        self.Map.getResolution()
-        self.UpdateMap()
-        # event.Skip()
-
-    def OnAlignRegion(self, event):
-        """
-        Align region
-        """
-        if not self.Map.alignRegion:
-            self.Map.alignRegion = True
-        else:
-            self.Map.alignRegion = False
-        # event.Skip()
-
-    def OnToggleRender(self, event):
-        """
-        Enable/disable auto-rendering
-        """
-        if self.statusbarWin['render'].GetValue():
-            self.OnRender(None)
-
-    def OnToggleShowRegion(self, event):
-        """
-        Show/Hide extent in map canvas
-        """
-        if self.statusbarWin['region'].GetValue():
-            # show extent
-            self.MapWindow.regionCoords = []
-        else:
-            del self.MapWindow.regionCoords
-
-        # redraw map if auto-rendering is enabled
-        if self.statusbarWin['render'].GetValue():
-            self.OnRender(None)
-
-    def OnToggleResolution(self, event):
-        """
-        Use resolution of computation region settings
-        for redering image instead of display resolution
-        """
-        # redraw map if auto-rendering is enabled
-        if self.statusbarWin['render'].GetValue():
-            self.OnRender(None)
-        
-    def OnToggleStatus(self, event):
-        """
-        Toggle status text
-        """
-        self.StatusbarUpdate()
-
-    def OnChangeMapScale(self, event):
-        """
-        Map scale changed by user
-        """
-        scale = event.GetString()
-
-        try:
-            if scale[:2] != '1:':
-                raise ValueError
-            value = int(scale[2:])
-        except ValueError:
-            self.statusbarWin['mapscale'].SetValue('1:%ld' % int(self.mapScaleValue))
-            return
-
-        dEW = value * (self.Map.region['cols'] / self.ppm[0])
-        dNS = value * (self.Map.region['rows'] / self.ppm[1])
-        self.Map.region['n'] = self.Map.region['center_northing'] + dNS / 2.
-        self.Map.region['s'] = self.Map.region['center_northing'] - dNS / 2.
-        self.Map.region['w'] = self.Map.region['center_easting']  - dEW / 2.
-        self.Map.region['e'] = self.Map.region['center_easting']  + dEW / 2.
-        
-        # add to zoom history
-        self.MapWindow.ZoomHistory(self.Map.region['n'], self.Map.region['s'],
-                                   self.Map.region['e'], self.Map.region['w'])
-        
-        # redraw a map
-        self.MapWindow.UpdateMap()
-        self.statusbarWin['mapscale'].SetFocus()
-        
-    def OnGoTo(self, event):
-        """
-        Go to position
-        """
-        #GCPNo = int(event.GetString())
-        GCPNo = self.statusbarWin['goto'].GetValue()
-
-        if GCPNo < 0 or GCPNo > len(self.mapcoordlist):
-            wx.MessageBox(parent=self,
-                  message="%s 1 - %s." % (_("Valid Range:"),
-                                 len(self.mapcoordlist)),
-                  caption=_("Invalid GCP Number"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
-            return
-
-        if GCPNo == 0:
-            return
-
-        self.list.selectedkey = GCPNo
-        self.list.selected = self.list.FindItemData(-1, GCPNo)
-        self.list.render = False
-        self.list.SetItemState(self.list.selected,
-                          wx.LIST_STATE_SELECTED,
-                          wx.LIST_STATE_SELECTED)
-        self.list.render = True
-        
-        # Source MapWindow:
-        begin = (self.mapcoordlist[GCPNo][1], self.mapcoordlist[GCPNo][2])
-        begin = self.SrcMapWindow.Cell2Pixel(begin)
-        end = begin
-        self.SrcMapWindow.Zoom(begin, end, 0)
-
-        # redraw map
-        self.SrcMapWindow.UpdateMap()
-
-        if self.show_target:
-            # Target MapWindow:
-            begin = (self.mapcoordlist[GCPNo][3], self.mapcoordlist[GCPNo][4])
-            begin = self.TgtMapWindow.Cell2Pixel(begin)
-            end = begin
-            self.TgtMapWindow.Zoom(begin, end, 0)
-
-            # redraw map
-            self.TgtMapWindow.UpdateMap()
-
-        self.statusbarWin['goto'].SetFocus()
-        
-    def StatusbarUpdate(self):
-        """!Update statusbar content"""
-
-        self.statusbarWin['region'].Hide()
-        self.statusbarWin['resolution'].Hide()
-        self.statusbarWin['mapscale'].Hide()
-        self.statusbarWin['goto'].Hide()
-        self.mapScaleValue = self.ppm = None
-
-        if self.statusbarWin['toggle'].GetSelection() == 0: # Coordinates
-            self.statusbar.SetStatusText("", 0)
-            # enable long help
-            self.StatusbarEnableLongHelp()
-
-        elif self.statusbarWin['toggle'].GetSelection() in (1, 2): # Extent
-            sel = self.statusbarWin['toggle'].GetSelection()
-            if sel == 1:
-                region = self.Map.region
-            else:
-                region = self.Map.GetRegion() # computation region
-
-            precision = int(UserSettings.Get(group = 'projection', key = 'format',
-                                             subkey = 'precision'))
-            format = UserSettings.Get(group = 'projection', key = 'format',
-                                      subkey = 'll')
-            
-            if self.Map.projinfo['proj'] == 'll' and format == 'DMS':
-                w, s = utils.Deg2DMS(region["w"], region["s"],
-                                     string = False, precision = precision)
-                e, n = utils.Deg2DMS(region["e"], region["n"],
-                                     string = False, precision = precision)
-                if sel == 1:
-                    self.statusbar.SetStatusText("%s - %s, %s - %s" %
-                                                 (w, e, s, n), 0)
-                else:
-                    ewres, nsres = utils.Deg2DMS(region['ewres'], region['nsres'],
-                                                 string = False, precision = precision)
-                    self.statusbar.SetStatusText("%s - %s, %s - %s (%s, %s)" %
-                                                 (w, e, s, n, ewres, nsres), 0)
-            else:
-                w, s = region["w"], region["s"]
-                e, n = region["e"], region["n"]
-                if sel == 1:
-                    self.statusbar.SetStatusText("%.*f - %.*f, %.*f - %.*f" %
-                                                 (precision, w, precision, e,
-                                                  precision, s, precision, n), 0)
-                else:
-                    ewres, nsres = region['ewres'], region['nsres']
-                    self.statusbar.SetStatusText("%.*f - %.*f, %.*f - %.*f (%.*f, %.*f)" %
-                                                 (precision, w, precision, e,
-                                                  precision, s, precision, n,
-                                                  precision, ewres, precision, nsres), 0)
-            # enable long help
-            self.StatusbarEnableLongHelp()
-
-        elif self.statusbarWin['toggle'].GetSelection() == 3: # Show comp. extent
-            self.statusbar.SetStatusText("", 0)
-            self.statusbarWin['region'].Show()
-            # disable long help
-            self.StatusbarEnableLongHelp(False)
-
-        elif self.statusbarWin['toggle'].GetSelection() == 4: # Display mode
-            self.statusbar.SetStatusText("", 0)
-            self.statusbarWin['resolution'].Show()
-            # disable long help
-            self.StatusbarEnableLongHelp(False)
-
-        elif self.statusbarWin['toggle'].GetSelection() == 5: # Display geometry
-            self.statusbar.SetStatusText("rows=%d; cols=%d; nsres=%.2f; ewres=%.2f" %
-                                         (self.Map.region["rows"], self.Map.region["cols"],
-                                          self.Map.region["nsres"], self.Map.region["ewres"]), 0)
-            # enable long help
-            self.StatusbarEnableLongHelp()
-
-        elif self.statusbarWin['toggle'].GetSelection() == 6: # Map scale
-            # TODO: need to be fixed...
-            ### screen X region problem
-            ### user should specify ppm
-            dc = wx.ScreenDC()
-            dpSizePx = wx.DisplaySize()   # display size in pixels
-            dpSizeMM = wx.DisplaySizeMM() # display size in mm (system)
-            dpSizeIn = (dpSizeMM[0] / 25.4, dpSizeMM[1] / 25.4) # inches
-            sysPpi  = dc.GetPPI()
-            comPpi = (dpSizePx[0] / dpSizeIn[0],
-                      dpSizePx[1] / dpSizeIn[1])
-
-            ppi = comPpi                  # pixel per inch
-            self.ppm = ((ppi[0] / 2.54) * 100, # pixel per meter
-                        (ppi[1] / 2.54) * 100)
-
-            Debug.msg(4, "MapFrame.StatusbarUpdate(mapscale): size: px=%d,%d mm=%f,%f "
-                      "in=%f,%f ppi: sys=%d,%d com=%d,%d; ppm=%f,%f" % \
-                          (dpSizePx[0], dpSizePx[1], dpSizeMM[0], dpSizeMM[1],
-                           dpSizeIn[0], dpSizeIn[1],
-                           sysPpi[0], sysPpi[1], comPpi[0], comPpi[1],
-                           self.ppm[0], self.ppm[1]))
-
-            region = self.Map.region
-
-            heightCm = region['rows'] / self.ppm[1] * 100
-            widthCm  = region['cols'] / self.ppm[0] * 100
-
-            Debug.msg(4, "MapFrame.StatusbarUpdate(mapscale): width_cm=%f, height_cm=%f" %
-                      (widthCm, heightCm))
-
-            xscale = (region['e'] - region['w']) / (region['cols'] / self.ppm[0])
-            yscale = (region['n'] - region['s']) / (region['rows'] / self.ppm[1])
-            scale = (xscale + yscale) / 2.
-            
-            Debug.msg(3, "MapFrame.StatusbarUpdate(mapscale): xscale=%f, yscale=%f -> scale=%f" % \
-                          (xscale, yscale, scale))
-
-            self.statusbar.SetStatusText("")
-            try:
-                self.statusbarWin['mapscale'].SetValue("1:%ld" % (scale + 0.5))
-            except TypeError:
-                pass
-            self.mapScaleValue = scale
-            self.statusbarWin['mapscale'].Show()
-
-            # disable long help
-            self.StatusbarEnableLongHelp(False)
-
-        elif self.statusbarWin['toggle'].GetSelection() == 7: # go to
-
-            self.statusbar.SetStatusText("")
-            max = self.list.GetItemCount()
-            if max < 1:
-                max = 1
-            self.statusbarWin['goto'].SetRange(0, max)
-
-            self.statusbarWin['goto'].Show()
-
-            # disable long help
-            self.StatusbarEnableLongHelp(False)
-        
-        elif self.statusbarWin['toggle'].GetSelection() == 8: # RMS error
-            self.statusbar.SetStatusText(_("Forward: %(forw)s, Backward: %(back)s") %
-                                         { 'forw' : self.fwd_rmserror,
-                                           'back' : self.bkw_rmserror })
-            # disable long help
-            # self.StatusbarEnableLongHelp(False)
-            
-        else:
-            self.statusbar.SetStatusText("", 1)
-
-    def StatusbarEnableLongHelp(self, enable=True):
-        """!Enable/disable toolbars long help"""
-        for toolbar in self.toolbars.itervalues():
-            if toolbar:
-                toolbar.EnableLongHelp(enable)
-                
-    def StatusbarReposition(self):
-        """!Reposition checkbox in statusbar"""
-        # reposition checkbox
-        widgets = [(0, self.statusbarWin['region']),
-                   (0, self.statusbarWin['resolution']),
-                   (0, self.statusbarWin['mapscale']),
-                   (0, self.statusbarWin['progress']),
-                   (0, self.statusbarWin['goto']),
-                   (1, self.statusbarWin['toggle']),
-                   (2, self.statusbarWin['mask']),
-                   (3, self.statusbarWin['render'])]
-        for idx, win in widgets:
-            rect = self.statusbar.GetFieldRect(idx)
-            wWin, hWin = win.GetBestSize()
-            if idx == 0: # show region / mapscale / process bar
-                # -> size
-                if win == self.statusbarWin['progress']:
-                    wWin = rect.width - 6
-                # -> position
-                # if win == self.statusbarWin['region']:
-                # x, y = rect.x + rect.width - wWin, rect.y - 1
-                # align left
-                # else:
-                x, y = rect.x + 3, rect.y - 1
-                w, h = wWin, rect.height + 2
-            else: # choice || auto-rendering
-                x, y = rect.x, rect.y - 1
-                w, h = rect.width, rect.height + 2
-                if idx == 1: # choice
-                    h = hWin
-                elif idx == 2: # mask
-                    x += 5
-                    y += 4
-                elif idx == 3: # render
-                    x += 5
-
-            win.SetPosition((x, y))
-            win.SetSize((w, h))
-
-    def SaveToFile(self, event):
-        """!Save map to image
-        """
-        img = self.MapWindow.img
-        if not img:
-            gcmd.GMessage(parent = self,
-                          message = _("Nothing to render (empty map). Operation canceled."))
-            return
-        filetype, ltype = gdialogs.GetImageHandlers(img)
-
-        # get size
-        dlg = gdialogs.ImageSizeDialog(self)
-        dlg.CentreOnParent()
-        if dlg.ShowModal() != wx.ID_OK:
-            dlg.Destroy()
-            return
-        width, height = dlg.GetValues()
-        dlg.Destroy()
-        
-        # get filename
-        dlg = wx.FileDialog(parent = self,
-                            message = _("Choose a file name to save the image "
-                                        "(no need to add extension)"),
-                            wildcard = filetype,
-                            style=wx.SAVE | wx.FD_OVERWRITE_PROMPT)
-        
-        if dlg.ShowModal() == wx.ID_OK:
-            path = dlg.GetPath()
-            if not path:
-                dlg.Destroy()
-                return
-            
-            base, ext = os.path.splitext(path)
-            fileType = ltype[dlg.GetFilterIndex()]['type']
-            extType  = ltype[dlg.GetFilterIndex()]['ext']
-            if ext != extType:
-                path = base + '.' + extType
-            
-            self.MapWindow.SaveToFile(path, fileType,
-                                      width, height)
-            
-        dlg.Destroy()
-
-    def PrintMenu(self, event):
-        """
-        Print options and output menu for map display
-        """
-        point = wx.GetMousePosition()
-        printmenu = wx.Menu()
-        # Add items to the menu
-        setup = wx.MenuItem(printmenu, wx.ID_ANY, _('Page setup'))
-        printmenu.AppendItem(setup)
-        self.Bind(wx.EVT_MENU, self.printopt.OnPageSetup, setup)
-
-        preview = wx.MenuItem(printmenu, wx.ID_ANY, _('Print preview'))
-        printmenu.AppendItem(preview)
-        self.Bind(wx.EVT_MENU, self.printopt.OnPrintPreview, preview)
-
-        doprint = wx.MenuItem(printmenu, wx.ID_ANY, _('Print display'))
-        printmenu.AppendItem(doprint)
-        self.Bind(wx.EVT_MENU, self.printopt.OnDoPrint, doprint)
-
-        # Popup the menu.  If an item is selected then its handler
-        # will be called before PopupMenu returns.
-        self.PopupMenu(printmenu)
-        printmenu.Destroy()
-
-    def GetRender(self):
-        """!Returns current instance of render.Map()
-        """
-        return self.Map
-
-    def GetWindow(self):
-        """!Get map window"""
-        return self.MapWindow
-    
-    def FormatDist(self, dist):
-        """!Format length numbers and units in a nice way,
-        as a function of length. From code by Hamish Bowman
-        Grass Development Team 2006"""
-
-        mapunits = self.Map.projinfo['units']
-        if mapunits == 'metres': mapunits = 'meters'
-        outunits = mapunits
-        dist = float(dist)
-        divisor = 1.0
-
-        # figure out which units to use
-        if mapunits == 'meters':
-            if dist > 2500.0:
-                outunits = 'km'
-                divisor = 1000.0
-            else: outunits = 'm'
-        elif mapunits == 'feet':
-            # nano-bug: we match any "feet", but US Survey feet is really
-            #  5279.9894 per statute mile, or 10.6' per 1000 miles. As >1000
-            #  miles the tick markers are rounded to the nearest 10th of a
-            #  mile (528'), the difference in foot flavours is ignored.
-            if dist > 5280.0:
-                outunits = 'miles'
-                divisor = 5280.0
-            else:
-                outunits = 'ft'
-        elif 'degree' in mapunits:
-            if dist < 1:
-                outunits = 'min'
-                divisor = (1/60.0)
-            else:
-                outunits = 'deg'
-
-        # format numbers in a nice way
-        if (dist/divisor) >= 2500.0:
-            outdist = round(dist/divisor)
-        elif (dist/divisor) >= 1000.0:
-            outdist = round(dist/divisor,1)
-        elif (dist/divisor) > 0.0:
-            outdist = round(dist/divisor,int(math.ceil(3-math.log10(dist/divisor))))
-        else:
-            outdist = float(dist/divisor)
-
-        return (outdist, outunits)
-
-    def OnZoomToMap(self, event):
-        """!
-        Set display extents to match selected raster (including NULLs)
-        or vector map.
-        """
-        self.MapWindow.ZoomToMap(layers = self.Map.GetListOfLayers())
-
-    def OnZoomToRaster(self, event):
-        """!
-        Set display extents to match selected raster map (ignore NULLs)
-        """
-        self.MapWindow.ZoomToMap(ignoreNulls = True)
-
-    def OnZoomToWind(self, event):
-        """!Set display geometry to match computational region
-        settings (set with g.region)
-        """
-        self.MapWindow.ZoomToWind()
-        
-    def OnZoomToDefault(self, event):
-        """!Set display geometry to match default region settings
-        """
-        self.MapWindow.ZoomToDefault()
-        
-    def OnZoomToSaved(self, event):
-        """!Set display geometry to match extents in
-        saved region file
-        """
-        self.MapWindow.ZoomToSaved()
-        
-    def OnDisplayToWind(self, event):
-        """!Set computational region (WIND file) to match display
-        extents
-        """
-        self.MapWindow.DisplayToWind()
- 
-    def SaveDisplayRegion(self, event):
-        """!Save display extents to named region file.
-        """
-        self.MapWindow.SaveDisplayRegion()
-        
-    def OnZoomMenu(self, event):
-        """!Popup Zoom menu
-        """
-        point = wx.GetMousePosition()
-        zoommenu = wx.Menu()
-        # Add items to the menu
-
-        zoomwind = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to computational region (set with g.region)'))
-        zoommenu.AppendItem(zoomwind)
-        self.Bind(wx.EVT_MENU, self.OnZoomToWind, zoomwind)
-
-        zoomdefault = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to default region'))
-        zoommenu.AppendItem(zoomdefault)
-        self.Bind(wx.EVT_MENU, self.OnZoomToDefault, zoomdefault)
-
-        zoomsaved = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to saved region'))
-        zoommenu.AppendItem(zoomsaved)
-        self.Bind(wx.EVT_MENU, self.OnZoomToSaved, zoomsaved)
-
-        savewind = wx.MenuItem(zoommenu, wx.ID_ANY, _('Set computational region from display'))
-        zoommenu.AppendItem(savewind)
-        self.Bind(wx.EVT_MENU, self.OnDisplayToWind, savewind)
-
-        savezoom = wx.MenuItem(zoommenu, wx.ID_ANY, _('Save display geometry to named region'))
-        zoommenu.AppendItem(savezoom)
-        self.Bind(wx.EVT_MENU, self.SaveDisplayRegion, savezoom)
-
-        # Popup the menu. If an item is selected then its handler
-        # will be called before PopupMenu returns.
-        self.PopupMenu(zoommenu)
-        zoommenu.Destroy()
-        
-    def SetProperties(self, render=False, mode=0, showCompExtent=False,
-                      constrainRes=False, projection=False):
-        """!Set properies of map display window"""
-        self.statusbarWin['render'].SetValue(render)
-        self.statusbarWin['toggle'].SetSelection(mode)
-        self.StatusbarUpdate()
-        self.statusbarWin['region'].SetValue(showCompExtent)
-        self.statusbarWin['resolution'].SetValue(constrainRes)
-        if showCompExtent:
-            self.MapWindow.regionCoords = []
-        
-    def IsStandalone(self):
-        """!Check if Map display is standalone"""
-        if self._layerManager:
-            return False
-        
-        return True
-    
-    def GetLayerManager(self):
-        """!Get reference to Layer Manager
-
-        @return window reference
-        @return None (if standalone)
-        """
-        return self._layerManager
-    
-# end of class MapFrame
diff --git a/gui/wxpython/gui_modules/gdialogs.py b/gui/wxpython/gui_modules/gdialogs.py
deleted file mode 100644
index 865346e..0000000
--- a/gui/wxpython/gui_modules/gdialogs.py
+++ /dev/null
@@ -1,1797 +0,0 @@
-"""!
- at package gdialogs.py
-
- at brief Various dialogs used in wxGUI.
-
-List of classes:
- - ElementDialog
- - LocationDialog
- - MapsetDialog
- - NewVectorDialog
- - SavedRegion
- - DecorationDialog
- - TextLayerDialog 
- - AddMapLayersDialog
- - ImportDialog
- - GdalImportDialog
- - DxfImportDialog
- - LayersList (used by MultiImport) 
- - SetOpacityDialog
- - StaticWrapText
- - ImageSizeDialog
-
-(C) 2008-2011 by the GRASS Development Team
-
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
-
- at author Martin Landa <landa.martin gmail.com>
-"""
-
-import os
-import sys
-import re
-from bisect import bisect
-
-import wx
-import wx.lib.filebrowsebutton as filebrowse
-import wx.lib.mixins.listctrl as listmix
-
-from grass.script import core as grass
-from grass.script import task as gtask
-
-import gcmd
-import globalvar
-import gselect
-import menuform
-import utils
-from debug import Debug
-from preferences import globalSettings as UserSettings
-
-class ElementDialog(wx.Dialog):
-    def __init__(self, parent, title, label, id = wx.ID_ANY,
-                 etype = False, style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER,
-                 **kwargs):
-        """!General dialog to choose given element (location, mapset, vector map, etc.)
-        
-        @param parent window
-        @param title window title
-        @param label element label
-        @param etype show also ElementSelect
-        """
-        wx.Dialog.__init__(self, parent, id, title, style = style, **kwargs)
-        
-        self.etype = etype
-        self.label = label
-        
-        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
-        
-        self.btnCancel = wx.Button(parent = self.panel, id = wx.ID_CANCEL)
-        self.btnOK     = wx.Button(parent = self.panel, id = wx.ID_OK)
-        self.btnOK.SetDefault()
-        self.btnOK.Enable(False)
-        
-        if self.etype:
-            self.typeSelect = gselect.ElementSelect(parent = self.panel,
-                                                    size = globalvar.DIALOG_GSELECT_SIZE)
-            self.typeSelect.Bind(wx.EVT_CHOICE, self.OnType)
-        
-        self.element = None # must be defined 
-        
-        self.__layout()
-        
-    def PostInit(self):
-        self.element.SetFocus()
-        self.element.Bind(wx.EVT_TEXT, self.OnElement)
-        
-    def OnType(self, event):
-        """!Select element type"""
-        if not self.etype:
-            return
-        evalue = self.typeSelect.GetValue(event.GetString())
-        self.element.SetType(evalue)
-        
-    def OnElement(self, event):
-        """!Name for vector map layer given"""
-        if len(event.GetString()) > 0:
-            self.btnOK.Enable(True)
-        else:
-            self.btnOK.Enable(False)
-        
-    def __layout(self):
-        """!Do layout"""
-        self.sizer = wx.BoxSizer(wx.VERTICAL)
-        
-        self.dataSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        if self.etype:
-            self.dataSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
-                                                    label = _("Type of element:")),
-                               proportion=0, flag=wx.ALL, border=1)
-            self.dataSizer.Add(item = self.typeSelect,
-                               proportion=0, flag=wx.ALL, border=1)
-        
-        self.dataSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
-                                                label = self.label),
-                           proportion=0, flag=wx.ALL, border=1)
-        
-        # buttons
-        btnSizer = wx.StdDialogButtonSizer()
-        btnSizer.AddButton(self.btnCancel)
-        btnSizer.AddButton(self.btnOK)
-        btnSizer.Realize()
-        
-        self.sizer.Add(item=self.dataSizer, proportion=1,
-                       flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
-        
-        self.sizer.Add(item=btnSizer, proportion=0,
-                       flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
-        
-    def GetElement(self):
-        """!Return (mapName, overwrite)"""
-        return self.element.GetValue()
-    
-    def GetType(self):
-        """!Get element type"""
-        return self.element.tcp.GetType()
-        
-class LocationDialog(ElementDialog):
-    """!Dialog used to select location"""
-    def __init__(self, parent, title = _("Select GRASS location and mapset"), id =  wx.ID_ANY):
-        ElementDialog.__init__(self, parent, title, label = _("Name of GRASS location:"))
-
-        self.element = gselect.LocationSelect(parent = self.panel, id = wx.ID_ANY,
-                                              size = globalvar.DIALOG_GSELECT_SIZE)
-
-        self.element1 = gselect.MapsetSelect(parent = self.panel, id = wx.ID_ANY,
-                                             size = globalvar.DIALOG_GSELECT_SIZE,
-                                             setItems = False)
-        
-        self.PostInit()
-        
-        self.__Layout()
-        self.SetMinSize(self.GetSize())
-
-    def __Layout(self):
-        """!Do layout"""
-        self.dataSizer.Add(self.element, proportion=0,
-                      flag=wx.EXPAND | wx.ALL, border=1)
- 
-        self.dataSizer.Add(wx.StaticText(parent = self.panel, id = wx.ID_ANY,
-                                         label = _("Name of mapset:")), proportion=0,
-                           flag=wx.EXPAND | wx.ALL, border=1)
-
-        self.dataSizer.Add(self.element1, proportion=0,
-                      flag=wx.EXPAND | wx.ALL, border=1)
-       
-        self.panel.SetSizer(self.sizer)
-        self.sizer.Fit(self)
-
-    def OnElement(self, event):
-        """!Select mapset given location name"""
-        location = event.GetString()
-        
-        if location:
-            dbase = grass.gisenv()['GISDBASE']
-            self.element1.SetItems(utils.GetListOfMapsets(dbase, location, selectable = True))
-            self.element1.SetSelection(0)
-            mapset = self.element1.GetStringSelection()
-        
-        if location and mapset:
-            self.btnOK.Enable(True)
-        else:
-            self.btnOK.Enable(False)
-
-    def GetValues(self):
-        """!Get location, mapset"""
-        return (self.GetElement(), self.element1.GetStringSelection())
-    
-class MapsetDialog(ElementDialog):
-    """!Dialog used to select mapset"""
-    def __init__(self, parent, title = _("Select mapset in GRASS location"),
-                 location = None, id =  wx.ID_ANY):
-        ElementDialog.__init__(self, parent, title, label = _("Name of mapset:"))
-        if location:
-            self.SetTitle(self.GetTitle() + ' <%s>' % location)
-        else:
-            self.SetTitle(self.GetTitle() + ' <%s>' % grass.gisenv()['LOCATION_NAME'])
-        
-        self.element = gselect.MapsetSelect(parent = self.panel, id = wx.ID_ANY,
-                                            size = globalvar.DIALOG_GSELECT_SIZE)
-        
-        self.PostInit()
-        
-        self.__Layout()
-        self.SetMinSize(self.GetSize())
-
-    def __Layout(self):
-        """!Do layout"""
-        self.dataSizer.Add(self.element, proportion=0,
-                      flag=wx.EXPAND | wx.ALL, border=1)
-        
-        self.panel.SetSizer(self.sizer)
-        self.sizer.Fit(self)
-
-    def GetMapset(self):
-        return self.GetElement()
-    
-class NewVectorDialog(ElementDialog):
-    def __init__(self, parent, id = wx.ID_ANY, title = _('Create new vector map'),
-                 disableAdd = False, disableTable = False,
-                 style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, *kwargs):
-        """!Dialog for creating new vector map
-
-        @param parent parent window
-        @param id window id
-        @param title window title
-        @param disableAdd disable 'add layer' checkbox
-        @param disableTable disable 'create table' checkbox
-        @param style window style
-        @param kwargs other argumentes for ElementDialog
-        
-        @return dialog instance       
-        """
-        ElementDialog.__init__(self, parent, title, label = _("Name for new vector map:"))
-        
-        self.element = gselect.Select(parent = self.panel, id = wx.ID_ANY, size = globalvar.DIALOG_GSELECT_SIZE,
-                                      type = 'vector', mapsets = [grass.gisenv()['MAPSET'],])
-        
-        self.table = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
-                                 label = _("Create attribute table"))
-        self.table.SetValue(True)
-        if disableTable:
-            self.table.Enable(False)
-        
-        self.keycol = wx.TextCtrl(parent = self.panel, id =  wx.ID_ANY,
-                                  size = globalvar.DIALOG_SPIN_SIZE)
-        self.keycol.SetValue(UserSettings.Get(group = 'atm', key = 'keycolumn', subkey = 'value'))
-        if disableTable:
-            self.keycol.Enable(False)
-        
-        self.addbox = wx.CheckBox(parent = self.panel,
-                                  label = _('Add created map into layer tree'), style = wx.NO_BORDER)
-        if disableAdd:
-            self.addbox.SetValue(True)
-            self.addbox.Enable(False)
-        else:
-            self.addbox.SetValue(UserSettings.Get(group = 'cmd', key = 'addNewLayer', subkey = 'enabled'))
-
-        self.table.Bind(wx.EVT_CHECKBOX, self.OnTable)
-        
-        self.PostInit()
-        
-        self._layout()
-        self.SetMinSize(self.GetSize())
-        
-    def OnMapName(self, event):
-        """!Name for vector map layer given"""
-        self.OnElement(event)
-        
-    def OnTable(self, event):
-        self.keycol.Enable(event.IsChecked())
-        
-    def _layout(self):
-        """!Do layout"""
-        self.dataSizer.Add(self.element, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL, border = 1)
-        
-        self.dataSizer.Add(self.table, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL, border = 1)
-
-        keySizer = wx.BoxSizer(wx.HORIZONTAL)
-        keySizer.Add(item = wx.StaticText(parent = self.panel, label = _("Key column:")),
-                     proportion = 0,
-                     flag = wx.ALIGN_CENTER_VERTICAL)
-        keySizer.AddSpacer(10)
-        keySizer.Add(item = self.keycol, proportion = 0,
-                     flag = wx.ALIGN_RIGHT)
-        self.dataSizer.Add(item = keySizer, proportion = 1,
-                           flag = wx.EXPAND | wx.ALL, border = 1)
-
-        self.dataSizer.AddSpacer(5)
-        
-        self.dataSizer.Add(item = self.addbox, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL, border = 1)
-        
-        self.panel.SetSizer(self.sizer)
-        self.sizer.Fit(self)
-
-    def GetName(self, full = False):
-        """!Get name of vector map to be created
-
-        @param full True to get fully qualified name
-        """
-        name = self.GetElement()
-        if full:
-            if '@' in name:
-                return name
-            else:
-                return name + '@' + grass.gisenv()['MAPSET']
-        
-        return name.split('@', 1)[0]
-
-    def GetKey(self):
-        """!Get key column name"""
-        return self.keycol.GetValue()
-    
-    def IsChecked(self, key):
-        """!Get dialog properties
-
-        @param key window key ('add', 'table')
-
-        @return True/False
-        @return None on error
-        """
-        if key == 'add':
-            return self.addbox.IsChecked()
-        elif key == 'table':
-            return self.table.IsChecked()
-        
-        return None
-
-def CreateNewVector(parent, cmd, title = _('Create new vector map'),
-                    exceptMap = None, log = None, disableAdd = False, disableTable = False):
-    """!Create new vector map layer
-    
-    @param cmd (prog, **kwargs)
-    @param title window title
-    @param exceptMap list of maps to be excepted
-    @param log
-    @param disableAdd disable 'add layer' checkbox
-    @param disableTable disable 'create table' checkbox
-
-    @return dialog instance
-    @return None on error
-    """
-    dlg = NewVectorDialog(parent, title = title,
-                          disableAdd = disableAdd, disableTable = disableTable)
-    
-    if dlg.ShowModal() != wx.ID_OK:
-        dlg.Destroy()
-        return None
-
-    outmap = dlg.GetName()
-    key    = dlg.GetKey()
-    if outmap == exceptMap:
-        gcmd.GError(parent = parent,
-                    message = _("Unable to create vector map <%s>.") % outmap)
-        dlg.Destroy()
-        return None
-    if dlg.table.IsEnabled() and not key:
-        gcmd.GError(parent = parent,
-                    message = _("Invalid or empty key column.\n"
-                                "Unable to create vector map <%s>.") % outmap)
-        dlg.Destroy()
-        return
-        
-    if outmap == '': # should not happen
-        dlg.Destroy()
-        return None
-    
-    # update cmd -> output name defined
-    cmd[1][cmd[2]] = outmap
-        
-    listOfVectors = grass.list_grouped('vect')[grass.gisenv()['MAPSET']]
-    
-    overwrite = False
-    if not UserSettings.Get(group = 'cmd', key = 'overwrite', subkey = 'enabled') and \
-            outmap in listOfVectors:
-        dlgOw = wx.MessageDialog(parent, message = _("Vector map <%s> already exists "
-                                                     "in the current mapset. "
-                                                     "Do you want to overwrite it?") % outmap,
-                                 caption = _("Overwrite?"),
-                                 style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
-        if dlgOw.ShowModal() == wx.ID_YES:
-            overwrite = True
-        else:
-            dlgOw.Destroy()
-            dlg.Destroy()
-            return None
-    
-    if UserSettings.Get(group = 'cmd', key = 'overwrite', subkey = 'enabled'):
-        overwrite = True
-        
-    ret = gcmd.RunCommand(prog = cmd[0],
-                          parent = parent,
-                          overwrite = overwrite,
-                          **cmd[1])
-    if ret != 0:
-        dlg.Destroy()
-        return None
-    
-    # create attribute table
-    if dlg.table.IsEnabled() and dlg.table.IsChecked():
-        sql = 'CREATE TABLE %s (%s INTEGER)' % (outmap, key)
-        
-        gcmd.RunCommand('db.connect',
-                        flags = 'c')
-        
-        Debug.msg(1, "SQL: %s" % sql)
-        gcmd.RunCommand('db.execute',
-                        quiet = True,
-                        parent = parent,
-                        stdin = sql)
-        
-        gcmd.RunCommand('v.db.connect',
-                        quiet = True,
-                        parent = parent,
-                        map = outmap,
-                        table = outmap,
-                        key = key,
-                        layer = '1')
-    
-    # return fully qualified map name
-    if '@' not in outmap:
-        outmap += '@' + grass.gisenv()['MAPSET']
-    
-    if log:
-        log.WriteLog(_("New vector map <%s> created") % outmap)
-        
-    return dlg
-
-class SavedRegion(wx.Dialog):
-    def __init__(self, parent, id = wx.ID_ANY, title="", loadsave='load',
-                 **kwargs):
-        """!Loading and saving of display extents to saved region file
-
-        @param loadsave load or save region?
-        """
-        wx.Dialog.__init__(self, parent, id, title, **kwargs)
-
-        self.loadsave = loadsave
-        self.wind = ''
-        
-        sizer = wx.BoxSizer(wx.VERTICAL)
-        
-        box = wx.BoxSizer(wx.HORIZONTAL)
-        label = wx.StaticText(parent=self, id=wx.ID_ANY)
-        box.Add(item=label, proportion=0, flag=wx.ALIGN_CENTRE | wx.ALL, border=5)
-        if loadsave == 'load':
-            label.SetLabel(_("Load region:"))
-            selection = gselect.Select(parent=self, id=wx.ID_ANY, size=globalvar.DIALOG_GSELECT_SIZE,
-                                       type='windows')
-        elif loadsave == 'save':
-            label.SetLabel(_("Save region:"))
-            selection = gselect.Select(parent=self, id=wx.ID_ANY, size=globalvar.DIALOG_GSELECT_SIZE,
-                                       type='windows', mapsets = [grass.gisenv()['MAPSET']])
-        
-        box.Add(item=selection, proportion=0, flag=wx.ALIGN_CENTRE | wx.ALL, border=5)
-        selection.SetFocus()
-        selection.Bind(wx.EVT_TEXT, self.OnRegion)
-        
-        sizer.Add(item=box, proportion=0, flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL,
-                  border=5)
-        
-        line = wx.StaticLine(parent=self, id=wx.ID_ANY, size=(20, -1), style=wx.LI_HORIZONTAL)
-        sizer.Add(item=line, proportion=0,
-                  flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, border=5)
-        
-        btnsizer = wx.StdDialogButtonSizer()
-        
-        btn = wx.Button(parent = self, id = wx.ID_OK)
-        btn.SetDefault()
-        btnsizer.AddButton(btn)
-        
-        btn = wx.Button(parent = self, id = wx.ID_CANCEL)
-        btnsizer.AddButton(btn)
-        btnsizer.Realize()
-        
-        sizer.Add(item=btnsizer, proportion=0, flag=wx.ALIGN_RIGHT | wx.ALL, border=5)
-        
-        self.SetSizer(sizer)
-        sizer.Fit(self)
-        self.Layout()
-        
-    def OnRegion(self, event):
-        self.wind = event.GetString()
-    
-class DecorationDialog(wx.Dialog):
-    """
-    Controls setting options and displaying/hiding map overlay decorations
-    """
-    def __init__(self, parent, ovlId, title, cmd, name=None,
-                 pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE,
-                 checktxt='', ctrltxt=''):
-
-        wx.Dialog.__init__(self, parent, wx.ID_ANY, title, pos, size, style)
-
-        self.ovlId   = ovlId   # PseudoDC id
-        self.cmd     = cmd
-        self.name    = name    # overlay name
-        self.parent  = parent  # MapFrame
-
-        sizer = wx.BoxSizer(wx.VERTICAL)
-
-        box = wx.BoxSizer(wx.HORIZONTAL)
-        self.chkbox = wx.CheckBox(parent=self, id=wx.ID_ANY, label=checktxt)
-        if self.parent.Map.GetOverlay(self.ovlId) is None:
-            self.chkbox.SetValue(True)
-        else:
-            self.chkbox.SetValue(self.parent.MapWindow.overlays[self.ovlId]['layer'].IsActive())
-        box.Add(item=self.chkbox, proportion=0,
-                flag=wx.ALIGN_CENTRE|wx.ALL, border=5)
-        sizer.Add(item=box, proportion=0,
-                  flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border=5)
-
-        box = wx.BoxSizer(wx.HORIZONTAL)
-        optnbtn = wx.Button(parent=self, id=wx.ID_ANY, label=_("Set options"))
-        box.Add(item=optnbtn, proportion=0, flag=wx.ALIGN_CENTRE|wx.ALL, border=5)
-        sizer.Add(item=box, proportion=0,
-                  flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border=5)
-
-        box = wx.BoxSizer(wx.HORIZONTAL)
-        label = wx.StaticText(parent=self, id=wx.ID_ANY,
-                              label=_("Drag %s with mouse in pointer mode to position.\n"
-                                      "Double-click to change options." % ctrltxt))
-        if self.name == 'legend':
-            label.SetLabel(label.GetLabel() + _('\nDefine raster map name for legend in '
-                                                'properties dialog.'))
-        box.Add(item=label, proportion=0,
-                flag=wx.ALIGN_CENTRE|wx.ALL, border=5)
-        sizer.Add(item=box, proportion=0,
-                  flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border=5)
-
-        line = wx.StaticLine(parent=self, id=wx.ID_ANY, size=(20,-1), style=wx.LI_HORIZONTAL)
-        sizer.Add(item=line, proportion=0,
-                  flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border=5)
-
-        # buttons
-        btnsizer = wx.StdDialogButtonSizer()
-
-        self.btnOK = wx.Button(parent=self, id=wx.ID_OK)
-        self.btnOK.SetDefault()
-        if self.name == 'legend':
-            self.btnOK.Enable(False)
-        btnsizer.AddButton(self.btnOK)
-
-        btnCancel = wx.Button(parent=self, id=wx.ID_CANCEL)
-        btnsizer.AddButton(btnCancel)
-        btnsizer.Realize()
-
-        sizer.Add(item=btnsizer, proportion=0,
-                  flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5)
-
-        #
-        # bindings
-        #
-        self.Bind(wx.EVT_BUTTON,   self.OnOptions, optnbtn)
-        self.Bind(wx.EVT_BUTTON,   self.OnCancel,  btnCancel)
-        self.Bind(wx.EVT_BUTTON,   self.OnOK,      self.btnOK)
-
-        self.SetSizer(sizer)
-        sizer.Fit(self)
-
-        # create overlay if doesn't exist
-        self._CreateOverlay()
-
-        if len(self.parent.MapWindow.overlays[self.ovlId]['cmd']) > 1:
-            mapName, found = utils.GetLayerNameFromCmd(self.parent.MapWindow.overlays[self.ovlId]['cmd'])
-            if self.parent.MapWindow.overlays[self.ovlId]['propwin'] is None and mapName:
-                # build properties dialog
-                menuform.GUI(parent = self.parent, show = False).ParseCommand(cmd=self.cmd,
-                                                                              completed=(self.GetOptData, self.name, ''))
-                
-            if found:
-                # enable 'OK' button
-                self.btnOK.Enable()
-                if name == 'legend':
-                    # set title
-                    self.SetTitle(_('Legend of raster map <%s>') % \
-                                      mapName)
-        
-    def _CreateOverlay(self):
-        if not self.parent.Map.GetOverlay(self.ovlId):
-            overlay = self.parent.Map.AddOverlay(id=self.ovlId, type=self.name,
-                                                 command=self.cmd,
-                                                 l_active=False, l_render=False, l_hidden=True)
-
-            self.parent.MapWindow.overlays[self.ovlId] = {}
-            self.parent.MapWindow.overlays[self.ovlId] = { 'layer' : overlay,
-                                                           'params' : None,
-                                                           'propwin' : None,
-                                                           'cmd' : self.cmd,
-                                                           'coords': (10, 10),
-                                                           'pdcType': 'image' }
-        else:
-            if self.parent.MapWindow.overlays[self.ovlId]['propwin'] == None:
-                return
-
-            self.parent.MapWindow.overlays[self.ovlId]['propwin'].get_dcmd = self.GetOptData
-
-
-    def OnOptions(self, event):
-        """        self.SetSizer(sizer)
-        sizer.Fit(self)
-
-        Sets option for decoration map overlays
-        """
-        if self.parent.MapWindow.overlays[self.ovlId]['propwin'] is None:
-            # build properties dialog
-            menuform.GUI(parent = self.parent).ParseCommand(cmd=self.cmd,
-                                                            completed=(self.GetOptData, self.name, ''))
-            
-        else:
-            if self.parent.MapWindow.overlays[self.ovlId]['propwin'].IsShown():
-                self.parent.MapWindow.overlays[self.ovlId]['propwin'].SetFocus()
-            else:
-                self.parent.MapWindow.overlays[self.ovlId]['propwin'].Show()
-
-    def OnCancel(self, event):
-        """!Cancel dialog"""
-        self.parent.dialogs['barscale'] = None
-
-        self.Destroy()
-
-    def OnOK(self, event):
-        """!Button 'OK' pressed"""
-        # enable or disable overlay
-        self.parent.Map.GetOverlay(self.ovlId).SetActive(self.chkbox.IsChecked())
-
-        # update map
-        self.parent.MapWindow.UpdateMap()
-
-        # close dialog
-        self.OnCancel(None)
-
-    def GetOptData(self, dcmd, layer, params, propwin):
-        """!Process decoration layer data"""
-        # update layer data
-        if params:
-            self.parent.MapWindow.overlays[self.ovlId]['params'] = params
-        if dcmd:
-            self.parent.MapWindow.overlays[self.ovlId]['cmd'] = dcmd
-        self.parent.MapWindow.overlays[self.ovlId]['propwin'] = propwin
-
-        # change parameters for item in layers list in render.Map
-        # "Use mouse..." (-m) flag causes GUI freeze and is pointless here, trac #119
-        
-        try:
-            self.parent.MapWindow.overlays[self.ovlId]['cmd'].remove('-m')
-        except ValueError:
-            pass
-            
-        self.parent.Map.ChangeOverlay(id=self.ovlId, type=self.name,
-                                      command=self.parent.MapWindow.overlays[self.ovlId]['cmd'],
-                                      l_active=self.parent.MapWindow.overlays[self.ovlId]['layer'].IsActive(),
-                                      l_render=False, l_hidden=True)
-        if  self.name == 'legend':
-            if params and not self.btnOK.IsEnabled():
-                self.btnOK.Enable()
-            
-class TextLayerDialog(wx.Dialog):
-    """
-    Controls setting options and displaying/hiding map overlay decorations
-    """
-
-    def __init__(self, parent, ovlId, title, name='text',
-                 pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_DIALOG_STYLE):
-
-        wx.Dialog.__init__(self, parent, wx.ID_ANY, title, pos, size, style)
-        from wx.lib.expando import ExpandoTextCtrl, EVT_ETC_LAYOUT_NEEDED
-
-        self.ovlId = ovlId
-        self.parent = parent
-
-        if self.ovlId in self.parent.MapWindow.textdict.keys():
-            self.currText = self.parent.MapWindow.textdict[self.ovlId]['text']
-            self.currFont = self.parent.MapWindow.textdict[self.ovlId]['font']
-            self.currClr  = self.parent.MapWindow.textdict[self.ovlId]['color']
-            self.currRot  = self.parent.MapWindow.textdict[self.ovlId]['rotation']
-            self.currCoords = self.parent.MapWindow.textdict[self.ovlId]['coords']
-        else:
-            self.currClr = wx.BLACK
-            self.currText = ''
-            self.currFont = self.GetFont()
-            self.currRot = 0.0
-            self.currCoords = [10, 10, 10, 10]
-
-        self.sizer = wx.BoxSizer(wx.VERTICAL)
-        box = wx.GridBagSizer(vgap=5, hgap=5)
-
-        # show/hide
-        self.chkbox = wx.CheckBox(parent=self, id=wx.ID_ANY, \
-            label = _('Show text object'))
-        if self.parent.Map.GetOverlay(self.ovlId) is None:
-            self.chkbox.SetValue(True)
-        else:
-            self.chkbox.SetValue(self.parent.MapWindow.overlays[self.ovlId]['layer'].IsActive())
-        box.Add(item=self.chkbox, span=(1,2),
-                flag=wx.ALIGN_LEFT|wx.ALL, border=5,
-                pos=(0, 0))
-
-        # text entry
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Enter text:"))
-        box.Add(item=label,
-                flag=wx.ALIGN_CENTER_VERTICAL,
-                pos=(1, 0))
-
-        self.textentry = ExpandoTextCtrl(parent=self, id=wx.ID_ANY, value="", size=(300,-1))
-        self.textentry.SetFont(self.currFont)
-        self.textentry.SetForegroundColour(self.currClr)
-        self.textentry.SetValue(self.currText)
-        # get rid of unneeded scrollbar when text box first opened
-        self.textentry.SetClientSize((300,-1))
-        
-        box.Add(item=self.textentry,
-                pos=(1, 1))
-
-        # rotation
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Rotation:"))
-        box.Add(item=label,
-                flag=wx.ALIGN_CENTER_VERTICAL,
-                pos=(2, 0))
-        self.rotation = wx.SpinCtrl(parent=self, id=wx.ID_ANY, value="", pos=(30, 50),
-                                    size=(75,-1), style=wx.SP_ARROW_KEYS)
-        self.rotation.SetRange(-360, 360)
-        self.rotation.SetValue(int(self.currRot))
-        box.Add(item=self.rotation,
-                flag=wx.ALIGN_RIGHT,
-                pos=(2, 1))
-
-        # font
-        fontbtn = wx.Button(parent=self, id=wx.ID_ANY, label=_("Set font"))
-        box.Add(item=fontbtn,
-                flag=wx.ALIGN_RIGHT,
-                pos=(3, 1))
-
-        self.sizer.Add(item=box, proportion=1,
-                  flag=wx.ALL, border=10)
-
-        # note
-        box = wx.BoxSizer(wx.HORIZONTAL)
-        label = wx.StaticText(parent=self, id=wx.ID_ANY,
-                              label=_("Drag text with mouse in pointer mode "
-                                      "to position.\nDouble-click to change options"))
-        box.Add(item=label, proportion=0,
-                flag=wx.ALIGN_CENTRE | wx.ALL, border=5)
-        self.sizer.Add(item=box, proportion=0,
-                  flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER | wx.ALL, border=5)
-
-        line = wx.StaticLine(parent=self, id=wx.ID_ANY,
-                             size=(20,-1), style=wx.LI_HORIZONTAL)
-        self.sizer.Add(item=line, proportion=0,
-                  flag=wx.EXPAND | wx.ALIGN_CENTRE | wx.ALL, border=5)
-
-        btnsizer = wx.StdDialogButtonSizer()
-
-        btn = wx.Button(parent=self, id=wx.ID_OK)
-        btn.SetDefault()
-        btnsizer.AddButton(btn)
-
-        btn = wx.Button(parent=self, id=wx.ID_CANCEL)
-        btnsizer.AddButton(btn)
-        btnsizer.Realize()
-
-        self.sizer.Add(item=btnsizer, proportion=0,
-                  flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
-
-        self.SetSizer(self.sizer)
-        self.sizer.Fit(self)
-
-        # bindings
-        self.Bind(EVT_ETC_LAYOUT_NEEDED, self.OnRefit, self.textentry)
-        self.Bind(wx.EVT_BUTTON,     self.OnSelectFont, fontbtn)
-        self.Bind(wx.EVT_TEXT,       self.OnText,       self.textentry)
-        self.Bind(wx.EVT_SPINCTRL,   self.OnRotation,   self.rotation)
-
-    def OnRefit(self, event):
-        """!Resize text entry to match text"""
-        self.sizer.Fit(self)
-
-    def OnText(self, event):
-        """!Change text string"""
-        self.currText = event.GetString()
-
-    def OnRotation(self, event):
-        """!Change rotation"""
-        self.currRot = event.GetInt()
-
-        event.Skip()
-
-    def OnSelectFont(self, event):
-        """!Change font"""
-        data = wx.FontData()
-        data.EnableEffects(True)
-        data.SetColour(self.currClr)         # set colour
-        data.SetInitialFont(self.currFont)
-
-        dlg = wx.FontDialog(self, data)
-
-        if dlg.ShowModal() == wx.ID_OK:
-            data = dlg.GetFontData()
-            self.currFont = data.GetChosenFont()
-            self.currClr = data.GetColour()
-
-            self.textentry.SetFont(self.currFont)
-            self.textentry.SetForegroundColour(self.currClr)
-
-            self.Layout()
-
-        dlg.Destroy()
-
-    def GetValues(self):
-        """!Get text properties"""
-        return { 'text' : self.currText,
-                 'font' : self.currFont,
-                 'color' : self.currClr,
-                 'rotation' : self.currRot,
-                 'coords' : self.currCoords,
-                 'active' : self.chkbox.IsChecked() }
-
-class AddMapLayersDialog(wx.Dialog):
-    """!Add selected map layers (raster, vector) into layer tree"""
-    def __init__(self, parent, title, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER):
-        wx.Dialog.__init__(self, parent=parent, id=wx.ID_ANY, title=title, style=style)
-
-        self.parent = parent # GMFrame
-        
-        #
-        # dialog body
-        #
-        self.bodySizer = self.__createDialogBody()
-        # update list of layer to be loaded
-        self.map_layers = [] # list of map layers (full list type/mapset)
-        self.LoadMapLayers(self.layerType.GetStringSelection()[:4],
-                           self.mapset.GetStringSelection())
-        #
-        # buttons
-        #
-        btnCancel = wx.Button(parent = self, id = wx.ID_CANCEL)
-        btnOk = wx.Button(parent = self, id = wx.ID_OK, label = _("&Add"))
-        btnOk.SetDefault()
-        btnOk.SetToolTipString(_("Add selected map layers to current display"))
-
-        #
-        # sizers & do layout
-        #
-        btnSizer = wx.StdDialogButtonSizer()
-        btnSizer.AddButton(btnCancel)
-        btnSizer.AddButton(btnOk)
-        btnSizer.Realize()
-        
-        mainSizer = wx.BoxSizer(wx.VERTICAL)
-        mainSizer.Add(item=self.bodySizer, proportion=1,
-                      flag=wx.EXPAND | wx.ALL, border=5)
-        mainSizer.Add(item=btnSizer, proportion=0,
-                      flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
-
-        self.SetSizer(mainSizer)
-        mainSizer.Fit(self)
-
-        # set dialog min size
-        self.SetMinSize(self.GetSize())
-        
-    def __createDialogBody(self):
-        bodySizer = wx.GridBagSizer(vgap=3, hgap=3)
-        bodySizer.AddGrowableCol(1)
-        bodySizer.AddGrowableRow(3)
-        
-        # layer type
-        bodySizer.Add(item=wx.StaticText(parent=self, label=_("Map layer type:")),
-                      flag=wx.ALIGN_CENTER_VERTICAL,
-                      pos=(0,0))
-
-        self.layerType = wx.Choice(parent=self, id=wx.ID_ANY,
-                                   choices=['raster', 'vector'], size=(100,-1))
-        self.layerType.SetSelection(0)
-        bodySizer.Add(item=self.layerType,
-                      pos=(0,1))
-
-        # select toggle
-        self.toggle = wx.CheckBox(parent=self, id=wx.ID_ANY,
-                                  label=_("Select toggle"))
-        self.toggle.SetValue(True)
-        bodySizer.Add(item=self.toggle,
-                      flag=wx.ALIGN_CENTER_VERTICAL,
-                      pos=(0,2))
-        
-        # mapset filter
-        bodySizer.Add(item=wx.StaticText(parent=self, label=_("Mapset:")),
-                      flag=wx.ALIGN_CENTER_VERTICAL,
-                      pos=(1,0))
-
-        self.mapset = gselect.MapsetSelect(parent = self)
-        self.mapset.SetStringSelection(grass.gisenv()['MAPSET'])
-        bodySizer.Add(item=self.mapset,
-                      pos=(1,1), span=(1, 2))
-
-        # map name filter
-        bodySizer.Add(item=wx.StaticText(parent=self, label=_("Filter:")),
-                      flag=wx.ALIGN_CENTER_VERTICAL,
-                      pos=(2,0))
-
-        self.filter = wx.TextCtrl(parent=self, id=wx.ID_ANY,
-                                  value="",
-                                  size=(250,-1))
-        bodySizer.Add(item=self.filter,
-                      flag=wx.EXPAND,
-                      pos=(2,1), span=(1, 2))
-
-        # layer list 
-        bodySizer.Add(item=wx.StaticText(parent=self, label=_("List of maps:")),
-                      flag=wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_TOP,
-                      pos=(3,0))
-        self.layers = wx.CheckListBox(parent=self, id=wx.ID_ANY,
-                                      size=(250, 100),
-                                      choices=[])
-        bodySizer.Add(item=self.layers,
-                      flag=wx.EXPAND,
-                      pos=(3,1), span=(1, 2))
-
-        # bindings
-        self.layerType.Bind(wx.EVT_CHOICE, self.OnChangeParams)
-        self.mapset.Bind(wx.EVT_COMBOBOX, self.OnChangeParams)
-        self.layers.Bind(wx.EVT_RIGHT_DOWN, self.OnMenu)
-        self.filter.Bind(wx.EVT_TEXT, self.OnFilter)
-        self.toggle.Bind(wx.EVT_CHECKBOX, self.OnToggle)
-        return bodySizer
-
-    def LoadMapLayers(self, type, mapset):
-        """!Load list of map layers
-
-        @param type layer type ('raster' or 'vector')
-        @param mapset mapset name
-        """
-        self.map_layers = grass.mlist_grouped(type = type)[mapset]
-        self.layers.Set(self.map_layers)
-        
-        # check all items by default
-        for item in range(self.layers.GetCount()):
-            self.layers.Check(item)
-
-    def OnChangeParams(self, event):
-        """!Filter parameters changed by user"""
-        # update list of layer to be loaded
-        self.LoadMapLayers(self.layerType.GetStringSelection()[:4],
-                           self.mapset.GetStringSelection())
-    
-        event.Skip()
-
-    def OnMenu(self, event):
-        """!Table description area, context menu"""
-        if not hasattr(self, "popupID1"):
-            self.popupDataID1 = wx.NewId()
-            self.popupDataID2 = wx.NewId()
-            self.popupDataID3 = wx.NewId()
-
-            self.Bind(wx.EVT_MENU, self.OnSelectAll,    id=self.popupDataID1)
-            self.Bind(wx.EVT_MENU, self.OnSelectInvert, id=self.popupDataID2)
-            self.Bind(wx.EVT_MENU, self.OnDeselectAll,  id=self.popupDataID3)
-
-        # generate popup-menu
-        menu = wx.Menu()
-        menu.Append(self.popupDataID1, _("Select all"))
-        menu.Append(self.popupDataID2, _("Invert selection"))
-        menu.Append(self.popupDataID3, _("Deselect all"))
-
-        self.PopupMenu(menu)
-        menu.Destroy()
-
-    def OnSelectAll(self, event):
-        """!Select all map layer from list"""
-        for item in range(self.layers.GetCount()):
-            self.layers.Check(item, True)
-
-    def OnSelectInvert(self, event):
-        """!Invert current selection"""
-        for item in range(self.layers.GetCount()):
-            if self.layers.IsChecked(item):
-                self.layers.Check(item, False)
-            else:
-                self.layers.Check(item, True)
-        
-    def OnDeselectAll(self, event):
-        """!Select all map layer from list"""
-        for item in range(self.layers.GetCount()):
-            self.layers.Check(item, False)
-
-    def OnFilter(self, event):
-        """!Apply filter for map names"""
-        if len(event.GetString()) == 0:
-           self.layers.Set(self.map_layers) 
-           return 
-
-        list = []
-        for layer in self.map_layers:
-            try:
-                if re.compile('^' + event.GetString()).search(layer):
-                    list.append(layer)
-            except:
-                pass
-
-        self.layers.Set(list)
-        self.OnSelectAll(None)
-        
-        event.Skip()
-
-    def OnToggle(self, event):
-        """!Select toggle (check or uncheck all layers)"""
-        check = event.Checked()
-        for item in range(self.layers.GetCount()):
-            self.layers.Check(item, check)
-
-        event.Skip()
-        
-    def GetMapLayers(self):
-        """!Return list of checked map layers"""
-        layerNames = []
-        for indx in self.layers.GetSelections():
-            # layers.append(self.layers.GetStringSelec(indx))
-            pass
-
-        # return fully qualified map names
-        mapset = self.mapset.GetStringSelection()
-        for item in range(self.layers.GetCount()):
-            if not self.layers.IsChecked(item):
-                continue
-            layerNames.append(self.layers.GetString(item) + '@' + mapset)
-
-        return layerNames
-    
-    def GetLayerType(self):
-        """!Get selected layer type"""
-        return self.layerType.GetStringSelection()
-    
-class ImportDialog(wx.Dialog):
-    """!Dialog for bulk import of various data (base class)"""
-    def __init__(self, parent, itype,
-                 id = wx.ID_ANY, title = _("Multiple import"),
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER):
-        self.parent = parent    # GMFrame 
-        self.importType = itype
-        self.options = dict()   # list of options
-        
-        self.commandId = -1  # id of running command
-        
-        wx.Dialog.__init__(self, parent, id, title, style=style,
-                           name = "MultiImportDialog")
-        
-        self.panel = wx.Panel(parent=self, id=wx.ID_ANY)
-        
-        self.layerBox = wx.StaticBox(parent=self.panel, id=wx.ID_ANY,
-                                     label=_(" List of %s layers ") % self.importType.upper())
-        
-        #
-        # list of layers
-        #
-        self.list = LayersList(self.panel)
-        self.list.LoadData()
-
-        self.optionBox = wx.StaticBox(parent=self.panel, id=wx.ID_ANY,
-                                      label="%s" % _("Options"))
-        
-        cmd = self._getCommand()
-        task = gtask.parse_interface(cmd)
-        for f in task.get_options()['flags']:
-            name = f.get('name', '')
-            desc = f.get('label', '')
-            if not desc:
-                desc = f.get('description', '')
-            if not name and not desc:
-                continue
-            if cmd == 'r.in.gdal' and name not in ('o', 'e', 'l', 'k'):
-                continue
-            elif cmd == 'r.external' and name not in ('o', 'e', 'r', 'h', 'v'):
-                continue
-            elif cmd == 'v.in.ogr' and name not in ('c', 'z', 't', 'o', 'r', 'e', 'w'):
-                continue
-            elif cmd == 'v.external' and name not in ('b'):
-                continue
-            elif cmd == 'v.in.dxf' and name not in ('e', 't', 'b', 'f', 'i'):
-                continue
-            self.options[name] = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
-                                             label = desc)
-        
-        
-        self.overwrite = wx.CheckBox(parent=self.panel, id=wx.ID_ANY,
-                                     label=_("Allow output files to overwrite existing files"))
-        self.overwrite.SetValue(UserSettings.Get(group='cmd', key='overwrite', subkey='enabled'))
-        
-        self.add = wx.CheckBox(parent=self.panel, id=wx.ID_ANY)
-        
-        #
-        # buttons
-        #
-        # cancel
-        self.btn_cancel = wx.Button(parent=self.panel, id=wx.ID_CANCEL)
-        self.btn_cancel.SetToolTipString(_("Close dialog"))
-        self.btn_cancel.Bind(wx.EVT_BUTTON, self.OnCancel)
-        # run
-        self.btn_run = wx.Button(parent=self.panel, id=wx.ID_OK, label = _("&Import"))
-        self.btn_run.SetToolTipString(_("Import selected layers"))
-        self.btn_run.SetDefault()
-        self.btn_run.Enable(False)
-        self.btn_run.Bind(wx.EVT_BUTTON, self.OnRun)
-        # run command dialog
-        self.btn_cmd = wx.Button(parent = self.panel, id = wx.ID_ANY,
-                                 label = _("Command dialog"))
-        self.btn_cmd.Bind(wx.EVT_BUTTON, self.OnCmdDialog)
-        
-    def doLayout(self):
-        """!Do layout"""
-        dialogSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        # dsn input
-        dialogSizer.Add(item = self.dsnInput, proportion = 0,
-                        flag = wx.EXPAND)
-        
-        #
-        # list of DXF layers
-        #
-        layerSizer = wx.StaticBoxSizer(self.layerBox, wx.HORIZONTAL)
-
-        layerSizer.Add(item=self.list, proportion=1,
-                      flag=wx.ALL | wx.EXPAND, border=5)
-        
-        dialogSizer.Add(item=layerSizer, proportion=1,
-                        flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=5)
-
-        # options
-        optionSizer = wx.StaticBoxSizer(self.optionBox, wx.VERTICAL)
-        for key in self.options.keys():
-            optionSizer.Add(item=self.options[key], proportion=0)
-            
-        dialogSizer.Add(item=optionSizer, proportion=0,
-                        flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=5)
-        
-        dialogSizer.Add(item=self.overwrite, proportion=0,
-                        flag=wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5)
-        
-        dialogSizer.Add(item=self.add, proportion=0,
-                        flag=wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5)
-        
-        #
-        # buttons
-        #
-        btnsizer = wx.BoxSizer(orient=wx.HORIZONTAL)
-        
-        btnsizer.Add(item=self.btn_cmd, proportion=0,
-                     flag=wx.ALL | wx.ALIGN_CENTER,
-                     border=10)
-        
-        btnsizer.Add(item=self.btn_run, proportion=0,
-                     flag=wx.ALL | wx.ALIGN_CENTER,
-                     border=10)
-        
-        btnsizer.Add(item=self.btn_cancel, proportion=0,
-                     flag=wx.ALL | wx.ALIGN_CENTER,
-                     border=10)
-        
-        dialogSizer.Add(item=btnsizer, proportion=0,
-                        flag=wx.ALIGN_CENTER)
-        
-        # dialogSizer.SetSizeHints(self.panel)
-        self.panel.SetAutoLayout(True)
-        self.panel.SetSizer(dialogSizer)
-        dialogSizer.Fit(self.panel)
-        
-        # auto-layout seems not work here - FIXME
-        size = wx.Size(globalvar.DIALOG_GSELECT_SIZE[0] + 225, 550)
-        self.SetMinSize(size)
-        self.SetSize((size.width, size.height + 100))
-        width = self.GetSize()[0]
-        self.list.SetColumnWidth(col=1, width=width/2 - 50)
-        self.Layout()
-
-    def _getCommand(self):
-        """!Get command"""
-        return ''
-    
-    def OnCancel(self, event=None):
-        """!Close dialog"""
-        self.Close()
-
-    def OnRun(self, event):
-        """!Import/Link data (each layes as separate vector map)"""
-        pass
-
-    def OnCmdDialog(self, event):
-        """!Show command dialog"""
-        pass
-    
-    def AddLayers(self, returncode, cmd = None):
-        """!Add imported/linked layers into layer tree"""
-        if not self.add.IsChecked() or returncode != 0:
-            return
-        
-        self.commandId += 1
-        maptree = self.parent.curr_page.maptree
-        layer, output = self.list.GetLayers()[self.commandId]
-        
-        if '@' not in output:
-            name = output + '@' + grass.gisenv()['MAPSET']
-        else:
-            name = output
-        
-        # add imported layers into layer tree
-        if self.importType == 'gdal':
-            cmd = ['d.rast',
-                   'map=%s' % name]
-            if UserSettings.Get(group='cmd', key='rasterOverlay', subkey='enabled'):
-                cmd.append('-o')
-                
-            item = maptree.AddLayer(ltype = 'raster',
-                                    lname = name, lchecked = False,
-                                    lcmd = cmd)
-        else:
-            item = maptree.AddLayer(ltype = 'vector',
-                                    lname = name, lchecked = False,
-                                    lcmd = ['d.vect',
-                                            'map=%s' % name])
-        
-        maptree.mapdisplay.MapWindow.ZoomToMap()
-        
-    def OnAbort(self, event):
-        """!Abort running import
-
-        @todo not yet implemented
-        """
-        pass
-
-class GdalImportDialog(ImportDialog):
-    """!Dialog for bulk import of various raster/vector data"""
-    def __init__(self, parent, ogr = False, link = False):
-        self.link = link
-        self.ogr  = ogr
-        
-        if ogr:
-            ImportDialog.__init__(self, parent, itype = 'ogr')
-            if link:
-                self.SetTitle(_("Link external vector data"))
-            else:
-                self.SetTitle(_("Import vector data"))
-        else:
-            ImportDialog.__init__(self, parent, itype = 'gdal') 
-            if link:
-                self.SetTitle(_("Link external raster data"))
-            else:
-                self.SetTitle(_("Import raster data"))
-       
-        self.dsnInput = gselect.GdalSelect(parent = self, panel = self.panel, ogr = ogr)
-
-        if link:
-            self.add.SetLabel(_("Add linked layers into layer tree"))
-        else:
-            self.add.SetLabel(_("Add imported layers into layer tree"))
-        
-        self.add.SetValue(UserSettings.Get(group='cmd', key='addNewLayer', subkey='enabled'))
-
-        if link:
-            self.btn_run.SetLabel(_("&Link"))
-            self.btn_run.SetToolTipString(_("Link selected layers"))
-            if ogr:
-                self.btn_cmd.SetToolTipString(_('Open %s dialog') % 'v.external')
-            else:
-                self.btn_cmd.SetToolTipString(_('Open %s dialog') % 'r.external')
-        else:
-            self.btn_run.SetLabel(_("&Import"))
-            self.btn_run.SetToolTipString(_("Import selected layers"))
-            if ogr:
-                self.btn_cmd.SetToolTipString(_('Open %s dialog') % 'v.in.ogr')
-            else:
-                self.btn_cmd.SetToolTipString(_('Open %s dialog') % 'r.in.gdal')
-        
-        self.doLayout()
-
-    def OnRun(self, event):
-        """!Import/Link data (each layes as separate vector map)"""
-        self.commandId = -1
-        data = self.list.GetLayers()
-        if not data:
-            gcmd.GMessage(parent = self,
-                          message = _("No layers marked for import.\nOperation canceled."))
-            return
-        
-        dsn = self.dsnInput.GetDsn()
-        ext = self.dsnInput.GetFormatExt()
-            
-        for layer, output in data:
-            if self.importType == 'ogr':
-                if ext and layer.rfind(ext) > -1:
-                    layer = layer.replace('.' + ext, '')
-                if self.link:
-                    cmd = ['v.external',
-                           'dsn=%s' % dsn,
-                           'output=%s' % output,
-                           'layer=%s' % layer]
-                else:
-                    cmd = ['v.in.ogr',
-                           'dsn=%s' % dsn,
-                           'layer=%s' % layer,
-                           'output=%s' % output]
-            else: # gdal
-                if self.dsnInput.GetType() == 'dir':
-                    idsn = os.path.join(dsn, layer)
-                else:
-                    idsn = dsn
-                
-                if self.link:
-                    cmd = ['r.external',
-                           'input=%s' % idsn,
-                           'output=%s' % output]
-                else:
-                    cmd = ['r.in.gdal',
-                           'input=%s' % idsn,
-                           'output=%s' % output]
-            
-            if self.overwrite.IsChecked():
-                cmd.append('--overwrite')
-            
-            for key in self.options.keys():
-                if self.options[key].IsChecked():
-                    cmd.append('-%s' % key)
-            
-            if UserSettings.Get(group='cmd', key='overwrite', subkey='enabled'):
-                cmd.append('--overwrite')
-            
-            # run in Layer Manager
-            self.parent.goutput.RunCmd(cmd, switchPage = True,
-                                       onDone = self.AddLayers)
-            
-    def _getCommand(self):
-        """!Get command"""
-        if self.link:
-            if self.ogr:
-                return 'v.external'
-            else:
-                return 'r.external'
-        else:
-            if self.ogr:
-                return 'v.in.ogr'
-            else:
-                return 'r.in.gdal'
-        
-        return ''
-    
-    def OnCmdDialog(self, event):
-        """!Show command dialog"""
-        name = self._getCommand()
-        menuform.GUI(parent = self, modal = True).ParseCommand(cmd = [name])
-                
-class DxfImportDialog(ImportDialog):
-    """!Dialog for bulk import of DXF layers""" 
-    def __init__(self, parent):
-        ImportDialog.__init__(self, parent, itype = 'dxf',
-                              title = _("Import DXF layers"))
-        
-        self.dsnInput = filebrowse.FileBrowseButton(parent=self.panel, id=wx.ID_ANY, 
-                                                    size=globalvar.DIALOG_GSELECT_SIZE, labelText='',
-                                                    dialogTitle=_('Choose DXF file to import'),
-                                                    buttonText=_('Browse'),
-                                                    startDirectory=os.getcwd(), fileMode=0,
-                                                    changeCallback=self.OnSetDsn,
-                                                    fileMask="DXF File (*.dxf)|*.dxf")
-        
-        self.add.SetLabel(_("Add imported layers into layer tree"))
-        
-        self.add.SetValue(UserSettings.Get(group='cmd', key='addNewLayer', subkey='enabled'))
-        
-        self.doLayout()
-
-    def _getCommand(self):
-        """!Get command"""
-        return 'v.in.dxf'
-    
-    def OnRun(self, event):
-        """!Import/Link data (each layes as separate vector map)"""
-        data = self.list.GetLayers()
-        
-        # hide dialog
-        self.Hide()
-        
-        inputDxf = self.dsnInput.GetValue()
-        
-        for layer, output in data:
-            cmd = ['v.in.dxf',
-                   'input=%s' % inputDxf,
-                   'layers=%s' % layer,
-                   'output=%s' % output]
-
-            for key in self.options.keys():
-                if self.options[key].IsChecked():
-                    cmd.append('-%s' % key)
-            
-            if self.overwrite.IsChecked() or \
-                    UserSettings.Get(group='cmd', key='overwrite', subkey='enabled'):
-                cmd.append('--overwrite')
-            
-            # run in Layer Manager
-            self.parent.goutput.RunCmd(cmd, switchPage=True,
-                                       onDone = self.AddLayers)
-        
-        self.OnCancel()
-
-    def OnSetDsn(self, event):
-        """!Input DXF file defined, update list of layer widget"""
-        path = event.GetString()
-        if not path:
-            return 
-        
-        data = list()        
-        ret = gcmd.RunCommand('v.in.dxf',
-                              quiet = True,
-                              parent = self,
-                              read = True,
-                              flags = 'l',
-                              input = path)
-        if not ret:
-            self.list.LoadData()
-            self.btn_run.Enable(False)
-            return
-            
-        for line in ret.splitlines():
-            layerId = line.split(':')[0].split(' ')[1]
-            layerName = line.split(':')[1].strip()
-            grassName = utils.GetValidLayerName(layerName)
-            data.append((layerId, layerName.strip(), grassName.strip()))
-        
-        self.list.LoadData(data)
-        if len(data) > 0:
-            self.btn_run.Enable(True)
-        else:
-            self.btn_run.Enable(False)
-
-    def OnCmdDialog(self, event):
-        """!Show command dialog"""
-        menuform.GUI(parent = self, modal = True).ParseCommand(cmd = ['v.in.dxf'])
-                
-class LayersList(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin,
-                 listmix.CheckListCtrlMixin, listmix.TextEditMixin):
-    """!List of layers to be imported (dxf, shp...)"""
-    def __init__(self, parent, pos = wx.DefaultPosition,
-                 log = None):
-        self.parent = parent
-        
-        wx.ListCtrl.__init__(self, parent, wx.ID_ANY,
-                             style=wx.LC_REPORT)
-        listmix.CheckListCtrlMixin.__init__(self)
-        self.log = log
-
-        # setup mixins
-        listmix.ListCtrlAutoWidthMixin.__init__(self)
-        listmix.TextEditMixin.__init__(self)
-
-        self.InsertColumn(0, _('Layer id'))
-        self.InsertColumn(1, _('Layer name'))
-        self.InsertColumn(2, _('Name for GRASS map (editable)'))
-        
-        self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnPopupMenu) #wxMSW
-        self.Bind(wx.EVT_RIGHT_UP,            self.OnPopupMenu) #wxGTK
-
-    def LoadData(self, data=None):
-        """!Load data into list"""
-        if data is None:
-            return
-
-        self.DeleteAllItems()
-        
-        for id, name, grassName in data:
-            index = self.InsertStringItem(sys.maxint, str(id))
-            self.SetStringItem(index, 1, "%s" % str(name))
-            self.SetStringItem(index, 2, "%s" % str(grassName))
-        
-        if len(data) == 1:
-            self.CheckItem(0, True)
-        
-        self.SetColumnWidth(col = 0, width = wx.LIST_AUTOSIZE_USEHEADER)
-
-    def OnPopupMenu(self, event):
-        """!Show popup menu"""
-        if self.GetItemCount() < 1:
-            return
-        
-        if not hasattr(self, "popupDataID1"):
-            self.popupDataID1 = wx.NewId()
-            self.popupDataID2 = wx.NewId()
-            
-            self.Bind(wx.EVT_MENU, self.OnSelectAll,  id=self.popupDataID1)
-            self.Bind(wx.EVT_MENU, self.OnSelectNone, id=self.popupDataID2)
-        
-        # generate popup-menu
-        menu = wx.Menu()
-        menu.Append(self.popupDataID1, _("Select all"))
-        menu.Append(self.popupDataID2, _("Deselect all"))
-
-        self.PopupMenu(menu)
-        menu.Destroy()
-
-    def OnSelectAll(self, event):
-        """!Select all items"""
-        item = -1
-        
-        while True:
-            item = self.GetNextItem(item)
-            if item == -1:
-                break
-            self.CheckItem(item, True)
-
-        event.Skip()
-        
-    def OnSelectNone(self, event):
-        """!Deselect items"""
-        item = -1
-        
-        while True:
-            item = self.GetNextItem(item, wx.LIST_STATE_SELECTED)
-            if item == -1:
-                break
-            self.CheckItem(item, False)
-
-        event.Skip()
-        
-    def OnLeftDown(self, event):
-        """!Allow editing only output name
-
-        Code taken from TextEditMixin class.
-        """
-        x, y = event.GetPosition()
-        
-        colLocs = [0]
-        loc = 0
-        for n in range(self.GetColumnCount()):
-            loc = loc + self.GetColumnWidth(n)
-            colLocs.append(loc)
-        
-        col = bisect(colLocs, x + self.GetScrollPos(wx.HORIZONTAL)) - 1
-        
-        if col == 2:
-            listmix.TextEditMixin.OnLeftDown(self, event)
-        else:
-            event.Skip()
-        
-    def GetLayers(self):
-        """!Get list of layers (layer name, output name)"""
-        data = []
-        item = -1
-        while True:
-            item = self.GetNextItem(item)
-            if item == -1:
-                break
-            if self.IsChecked(item):
-                # layer / output name
-                data.append((self.GetItem(item, 1).GetText(),
-                             self.GetItem(item, 2).GetText()))
-
-        return data
-
-class SetOpacityDialog(wx.Dialog):
-    """!Set opacity of map layers"""
-    def __init__(self, parent, id=wx.ID_ANY, title=_("Set Map Layer Opacity"),
-                 size=wx.DefaultSize, pos=wx.DefaultPosition,
-                 style=wx.DEFAULT_DIALOG_STYLE, opacity=100):
-
-        self.parent = parent    # GMFrame
-        self.opacity = opacity  # current opacity
-
-        super(SetOpacityDialog, self).__init__(parent, id=id, pos=pos,
-                                               size=size, style=style, title=title)
-
-        panel = wx.Panel(parent=self, id=wx.ID_ANY)
-        
-        sizer = wx.BoxSizer(wx.VERTICAL)
-
-        box = wx.GridBagSizer(vgap=5, hgap=5)
-        self.value = wx.Slider(panel, id=wx.ID_ANY, value=self.opacity,
-                               style=wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | \
-                                   wx.SL_TOP | wx.SL_LABELS,
-                               minValue=0, maxValue=100,
-                               size=(350, -1))
-
-        box.Add(item=self.value,
-                flag=wx.ALIGN_CENTRE, pos=(0, 0), span=(1, 2))
-        box.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
-                                   label=_("transparent")),
-                pos=(1, 0))
-        box.Add(item=wx.StaticText(parent=panel, id=wx.ID_ANY,
-                                   label=_("opaque")),
-                flag=wx.ALIGN_RIGHT,
-                pos=(1, 1))
-
-        sizer.Add(item=box, proportion=0,
-                  flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5)
-
-        line = wx.StaticLine(parent=panel, id=wx.ID_ANY,
-                             style=wx.LI_HORIZONTAL)
-        sizer.Add(item=line, proportion=0,
-                  flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5)
-
-        # buttons
-        btnsizer = wx.StdDialogButtonSizer()
-
-        btnOK = wx.Button(parent=panel, id=wx.ID_OK)
-        btnOK.SetDefault()
-        btnsizer.AddButton(btnOK)
-
-        btnCancel = wx.Button(parent=panel, id=wx.ID_CANCEL)
-        btnsizer.AddButton(btnCancel)
-        btnsizer.Realize()
-
-        sizer.Add(item=btnsizer, proportion=0,
-                  flag=wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=5)
-
-        panel.SetSizer(sizer)
-        sizer.Fit(panel)
-
-        self.SetSize(self.GetBestSize())
-
-        self.Layout()
-
-    def GetOpacity(self):
-        """!Button 'OK' pressed"""
-        # return opacity value
-        opacity = float(self.value.GetValue()) / 100
-        return opacity
-
-def GetImageHandlers(image):
-    """!Get list of supported image handlers"""
-    lext = list()
-    ltype = list()
-    for h in image.GetHandlers():
-        lext.append(h.GetExtension())
-        
-    filetype = ''
-    if 'png' in lext:
-        filetype += "PNG file (*.png)|*.png|"
-        ltype.append({ 'type' : wx.BITMAP_TYPE_PNG,
-                       'ext'  : 'png' })
-    filetype +=  "BMP file (*.bmp)|*.bmp|"
-    ltype.append({ 'type' : wx.BITMAP_TYPE_BMP,
-                   'ext'  : 'bmp' })
-    if 'gif' in lext:
-        filetype += "GIF file (*.gif)|*.gif|"
-        ltype.append({ 'type' : wx.BITMAP_TYPE_GIF,
-                       'ext'  : 'gif' })
-        
-    if 'jpg' in lext:
-        filetype += "JPG file (*.jpg)|*.jpg|"
-        ltype.append({ 'type' : wx.BITMAP_TYPE_JPEG,
-                       'ext'  : 'jpg' })
-
-    if 'pcx' in lext:
-        filetype += "PCX file (*.pcx)|*.pcx|"
-        ltype.append({ 'type' : wx.BITMAP_TYPE_PCX,
-                       'ext'  : 'pcx' })
-        
-    if 'pnm' in lext:
-        filetype += "PNM file (*.pnm)|*.pnm|"
-        ltype.append({ 'type' : wx.BITMAP_TYPE_PNM,
-                       'ext'  : 'pnm' })
-
-    if 'tif' in lext:
-        filetype += "TIF file (*.tif)|*.tif|"
-        ltype.append({ 'type' : wx.BITMAP_TYPE_TIF,
-                       'ext'  : 'tif' })
-
-    if 'xpm' in lext:
-        filetype += "XPM file (*.xpm)|*.xpm"
-        ltype.append({ 'type' : wx.BITMAP_TYPE_XPM,
-                       'ext'  : 'xpm' })
-    
-    return filetype, ltype
-
-class StaticWrapText(wx.StaticText):
-    """!A Static Text field that wraps its text to fit its width,
-    enlarging its height if necessary.
-    """
-    def __init__(self, parent, id = wx.ID_ANY, label = '', *args, **kwds):
-        self.parent        = parent
-        self.originalLabel = label
-        
-        wx.StaticText.__init__(self, parent, id, label = '', *args, **kwds)
-        
-        self.SetLabel(label)
-        self.Bind(wx.EVT_SIZE, self.OnResize)
-    
-    def SetLabel(self, label):
-        self.originalLabel = label
-        self.wrappedSize = None
-        self.OnResize(None)
-
-    def OnResize(self, event):
-        if not getattr(self, "resizing", False):
-            self.resizing = True
-            newSize = wx.Size(self.parent.GetSize().width - 50,
-                              self.GetSize().height)
-            if self.wrappedSize != newSize:
-                wx.StaticText.SetLabel(self, self.originalLabel)
-                self.Wrap(newSize.width)
-                self.wrappedSize = newSize
-                
-                self.SetSize(self.wrappedSize)
-            del self.resizing
-
-class ImageSizeDialog(wx.Dialog):
-    """!Set size for saved graphic file"""
-    def __init__(self, parent, id = wx.ID_ANY, title=_("Set image size"),
-                 style = wx.DEFAULT_DIALOG_STYLE, **kwargs):
-        self.parent = parent
-        
-        wx.Dialog.__init__(self, parent, id = id, style=style, title=title, **kwargs)
-        
-        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
-        
-        self.box = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                label = ' % s' % _("Image size"))
-        
-        size = self.parent.GetWindow().GetClientSize()
-        self.width = wx.SpinCtrl(parent = self.panel, id = wx.ID_ANY,
-                                 style = wx.SP_ARROW_KEYS)
-        self.width.SetRange(20, 1e6)
-        self.width.SetValue(size.width)
-        wx.CallAfter(self.width.SetFocus)
-        self.height = wx.SpinCtrl(parent = self.panel, id = wx.ID_ANY,
-                                  style = wx.SP_ARROW_KEYS)
-        self.height.SetRange(20, 1e6)
-        self.height.SetValue(size.height)
-        self.template = wx.Choice(parent = self.panel, id = wx.ID_ANY,
-                                  size = (125, -1),
-                                  choices = [ "",
-                                              "640x480",
-                                              "800x600",
-                                              "1024x768",
-                                              "1280x960",
-                                              "1600x1200",
-                                              "1920x1440" ])
-        
-        self.btnOK = wx.Button(parent = self.panel, id = wx.ID_OK)
-        self.btnOK.SetDefault()
-        self.btnCancel = wx.Button(parent = self.panel, id = wx.ID_CANCEL)
-        
-        self.template.Bind(wx.EVT_CHOICE, self.OnTemplate)
-        
-        self._layout()
-        self.SetSize(self.GetBestSize())
-        
-    def _layout(self):
-        """!Do layout"""
-        sizer = wx.BoxSizer(wx.VERTICAL)
-        
-        # body
-        box = wx.StaticBoxSizer(self.box, wx.HORIZONTAL)
-        fbox = wx.FlexGridSizer(cols = 2, vgap = 5, hgap = 5)
-        fbox.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
-                                      label = _("Width:")),
-                 flag = wx.ALIGN_CENTER_VERTICAL)
-        fbox.Add(item = self.width)
-        fbox.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
-                                      label = _("Height:")),
-                 flag = wx.ALIGN_CENTER_VERTICAL)
-        fbox.Add(item = self.height)
-        fbox.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
-                                      label = _("Template:")),
-                 flag = wx.ALIGN_CENTER_VERTICAL)
-        fbox.Add(item = self.template)
-        
-        box.Add(item = fbox, proportion = 1,
-                flag = wx.EXPAND | wx.ALL, border = 5)
-        sizer.Add(item = box, proportion = 1,
-                  flag=wx.EXPAND | wx.ALL, border = 3)
-        
-        # buttons
-        btnsizer = wx.StdDialogButtonSizer()
-        btnsizer.AddButton(self.btnOK)
-        btnsizer.AddButton(self.btnCancel)
-        btnsizer.Realize()
-
-        sizer.Add(item = btnsizer, proportion = 0,
-                  flag = wx.EXPAND | wx.ALIGN_RIGHT | wx.ALL, border=5)
-        
-        self.panel.SetSizer(sizer)
-        sizer.Fit(self.panel)
-        self.Layout()
-    
-    def GetValues(self):
-        """!Get width/height values"""
-        return self.width.GetValue(), self.height.GetValue()
-    
-    def OnTemplate(self, event):
-        """!Template selected"""
-        sel = event.GetString()
-        if not sel:
-            width, height = self.parent.GetWindow().GetClientSize()
-        else:
-            width, height = map(int, sel.split('x'))
-        self.width.SetValue(width)
-        self.height.SetValue(height)
-        
diff --git a/gui/wxpython/gui_modules/globalvar.py b/gui/wxpython/gui_modules/globalvar.py
deleted file mode 100644
index b3326a7..0000000
--- a/gui/wxpython/gui_modules/globalvar.py
+++ /dev/null
@@ -1,193 +0,0 @@
-"""!
- at package global.py
-
- at brief Global variables
-
-This module provide the space for global variables
-used in the code.
-
-(C) 2007-2010 by the GRASS Development Team
-
-This program is free software under the GNU General Public License
-(>=v2). Read the file COPYING that comes with GRASS for details.
-
- at author Martin Landa <landa.martin gmail.com>
-"""
-
-import os
-import sys
-import locale
-
-if not os.getenv("GISBASE"):
-    sys.exit("GRASS is not running. Exiting...")
-### i18N
-import gettext
-gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode=True)
-
-# path to python scripts
-ETCDIR = os.path.join(os.getenv("GISBASE"), "etc")
-ETCICONDIR = os.path.join(os.getenv("GISBASE"), "etc", "gui", "icons")
-ETCWXDIR = os.path.join(ETCDIR, "wxpython")
-ETCIMGDIR = os.path.join(ETCDIR, "gui", "images")
-
-sys.path.append(os.path.join(ETCDIR, "python"))
-import grass.script as grass
-
-def CheckWxVersion(version = [2, 8, 11, 0]):
-    """!Check wx version"""
-    ver = wx.version().split(' ')[0]
-    if map(int, ver.split('.')) < version:
-        return False
-    
-    return True
-
-def CheckForWx():
-    """!Try to import wx module and check its version"""
-    if 'wx' in sys.modules.keys():
-        return
-    
-    minVersion = [2, 8, 1, 1]
-    try:
-        try:
-            import wxversion
-        except ImportError, e:
-            raise ImportError(e)
-        # wxversion.select(str(minVersion[0]) + '.' + str(minVersion[1]))
-        wxversion.ensureMinimal(str(minVersion[0]) + '.' + str(minVersion[1]))
-        import wx
-        version = wx.version().split(' ')[0]
-        
-        if map(int, version.split('.')) < minVersion:
-            raise ValueError('Your wxPython version is %s.%s.%s.%s' % tuple(version.split('.')))
-
-    except ImportError, e:
-        print >> sys.stderr, 'ERROR: wxGUI requires wxPython. %s' % str(e)
-        sys.exit(1)
-    except (ValueError, wxversion.VersionError), e:
-        print >> sys.stderr, 'ERROR: wxGUI requires wxPython >= %d.%d.%d.%d. ' % tuple(minVersion) + \
-            '%s.' % (str(e))
-        sys.exit(1)
-    except locale.Error, e:
-        print >> sys.stderr, "Unable to set locale:", e
-        os.environ['LC_ALL'] = ''
-    
-if not os.getenv("GRASS_WXBUNDLED"):
-    CheckForWx()
-import wx
-import wx.lib.flatnotebook as FN
-
-"""
-Query layer (generated for example by selecting item in the Attribute Table Manager)
-Deleted automatically on re-render action
-"""
-# temporal query layer (removed on re-render action)
-QUERYLAYER = 'qlayer'
-
-"""!Style definition for FlatNotebook pages"""
-FNPageStyle = FN.FNB_VC8 | \
-    FN.FNB_BACKGROUND_GRADIENT | \
-    FN.FNB_NODRAG | \
-    FN.FNB_TABS_BORDER_SIMPLE 
-
-FNPageDStyle = FN.FNB_FANCY_TABS | \
-    FN.FNB_BOTTOM | \
-    FN.FNB_NO_NAV_BUTTONS | \
-    FN.FNB_NO_X_BUTTON
-
-FNPageColor = wx.Colour(125,200,175)
-
-"""!Dialog widget dimension"""
-DIALOG_SPIN_SIZE = (150, -1)
-DIALOG_COMBOBOX_SIZE = (300, -1)
-DIALOG_GSELECT_SIZE = (400, -1)
-DIALOG_TEXTCTRL_SIZE = (400, -1)
-DIALOG_LAYER_SIZE = (100, -1)
-DIALOG_COLOR_SIZE = (30, 30)
-
-MAP_WINDOW_SIZE = (800, 600)
-HIST_WINDOW_SIZE = (500, 350)
-GM_WINDOW_SIZE = (500, 600)
-
-MAP_DISPLAY_STATUSBAR_MODE = [_("Coordinates"),
-                              _("Extent"),
-                              _("Comp. region"),
-                              _("Show comp. extent"),
-                              _("Display mode"),
-                              _("Display geometry"),
-                              _("Map scale"),
-                              _("Go to"),
-                              _("Projection"),]
-
-"""!File name extension binaries/scripts"""
-if sys.platform == 'win32':
-    EXT_BIN = '.exe'
-    EXT_SCT = '.bat'
-else:
-    EXT_BIN = ''
-    EXT_SCT = ''
-
-def GetGRASSCmds(bin = True, scripts = True, gui_scripts = True):
-    """!Create list of available GRASS commands to use when parsing
-    string from the command line
-
-    @param bin True to include executable into list
-    @param scripts True to include scripts into list
-    @param gui_scripts True to include GUI scripts into list
-    """
-    gisbase = os.environ['GISBASE']
-    cmd = list()
-    if bin:
-        for executable in os.listdir(os.path.join(gisbase, 'bin')):
-            ext = os.path.splitext(executable)[1]
-            if not EXT_BIN or \
-                    ext in (EXT_BIN, EXT_SCT):
-                cmd.append(executable)
-        
-        # add special call for setting vector colors
-        cmd.append('vcolors')
-    if scripts and sys.platform != "win32":
-        cmd = cmd + os.listdir(os.path.join(gisbase, 'scripts')) 
-    if gui_scripts:
-        os.environ["PATH"] = os.getenv("PATH") + os.pathsep + os.path.join(gisbase, 'etc', 'gui', 'scripts')
-        os.environ["PATH"] = os.getenv("PATH") + os.pathsep + os.path.join(gisbase, 'etc', 'wxpython', 'scripts')
-        cmd = cmd + os.listdir(os.path.join(gisbase, 'etc', 'gui', 'scripts'))
-    
-    if os.getenv('GRASS_ADDON_PATH'):
-        for path in os.getenv('GRASS_ADDON_PATH').split(os.pathsep):
-            if not os.path.exists(path) or not os.path.isdir(path):
-                continue
-            for fname in os.listdir(path):
-                name, ext = os.path.splitext(fname)
-                if bin:
-                    if ext == EXT_BIN:
-                        cmd.append(name)
-                if scripts:
-                    if ext == EXT_SCT:
-                        cmd.append(name)
-                    elif ext == '.py':
-                        cmd.append(fname)
-        
-    if sys.platform == 'win32':
-        for idx in range(len(cmd)):
-            name, ext = os.path.splitext(cmd[idx])
-            if ext in (EXT_BIN, EXT_SCT):
-                cmd[idx] = name
-    
-    return cmd
-
-"""@brief Collected GRASS-relared binaries/scripts"""
-grassCmd = {}
-grassCmd['all'] = GetGRASSCmds()
-grassCmd['script'] = GetGRASSCmds(bin = False, gui_scripts = False)
-
-"""@Toolbar icon size"""
-toolbarSize = (24, 24)
-
-"""@Is g.mlist available?"""
-if 'g.mlist' in grassCmd['all']:
-    have_mlist = True
-else:
-    have_mlist = False
-
-"""@Check version of wxPython, use agwStyle for 2.8.11+"""
-hasAgw = CheckWxVersion()
diff --git a/gui/wxpython/gui_modules/gmodeler.py b/gui/wxpython/gui_modules/gmodeler.py
deleted file mode 100644
index 3941d65..0000000
--- a/gui/wxpython/gui_modules/gmodeler.py
+++ /dev/null
@@ -1,4894 +0,0 @@
-"""!
- at package gmodeler.py
-
- at brief wxGUI Graphical Modeler for creating, editing, and managing models
-
-Classes:
- - Model
- - ModelFrame
- - ModelCanvas
- - ModelObject
- - ModelAction
- - ModelSearchDialog
- - ModelData
- - ModelDataDialog
- - ModelRelation
- - ModelRelationDialog
- - ProcessModelFile
- - WriteModelFile
- - PreferencesDialog
- - PropertiesDialog
- - ModelParamDialog
- - ModelListCtrl
- - VariablePanel
- - ValiableListCtrl
- - ModelItem
- - ModelItemDialog
- - ModelLoop
- - ModelLoopDialog
- - ItemPanel
- - ItemListCtrl
- - ItemCheckListCtrl
- - ModelCondition
- - ModelConditionDialog
- - WritePythonFile
-
-(C) 2010-2011 by the GRASS Development Team
-This program is free software under the GNU General Public License
-(>=v2). Read the file COPYING that comes with GRASS for details.
-
- at author Martin Landa <landa.martin gmail.com>
-"""
-
-import os
-import sys
-import time
-import traceback
-import getpass
-import stat
-import textwrap
-import tempfile
-import copy
-import re
-
-try:
-    import xml.etree.ElementTree as etree
-except ImportError:
-    import elementtree.ElementTree as etree # Python <= 2.4
-
-import globalvar
-import wx
-import wx.lib.ogl             as ogl
-import wx.lib.flatnotebook    as FN
-import wx.lib.colourselect    as csel
-import wx.lib.mixins.listctrl as listmix
-
-import menu
-import menudata
-import toolbars
-import menuform
-import prompt
-import utils
-import goutput
-import gselect
-from debug        import Debug
-from gcmd         import GMessage, GException, GWarning, GError, RunCommand
-from gdialogs     import ElementDialog, GetImageHandlers
-from preferences  import PreferencesBaseDialog, globalSettings as UserSettings
-from ghelp        import SearchModuleWindow
-
-from grass.script import core as grass
-from grass.script import task as gtask
-
-class Model(object):
-    """!Class representing the model"""
-    def __init__(self, canvas = None):
-        self.items      = list() # list of actions/loops/...
-        
-        # model properties
-        self.properties = { 'name'        : _("model"),
-                            'description' : _("Script generated by wxGUI Graphical Modeler."),
-                            'author'      : getpass.getuser() }
-        # model variables
-        self.variables = dict()
-        self.variablesParams = dict()
-        
-        self.canvas  = canvas
-        
-    def GetCanvas(self):
-        """!Get canvas or None"""
-        return self.canvas
-    
-    def GetItems(self, objType = None):
-        """!Get list of model items
-
-        @param objType Object type to filter model objects
-        """
-        if not objType:
-            return self.items
-        
-        result = list()
-        for item in self.items:
-            if isinstance(item, objType):
-                result.append(item)
-        
-        return result
-
-    def GetItem(self, aId):
-        """!Get item of given id
-
-        @param aId item id
-        
-        @return Model* instance
-        @return None if no item found
-        """
-        ilist = self.GetItems()
-        for item in ilist:
-            if item.GetId() == aId:
-                return item
-        
-        return None
-
-    def GetNumItems(self, actionOnly = False):
-        """!Get number of items"""
-        if actionOnly:
-            return len(self.GetItems(objType = ModelAction))
-        
-        return len(self.GetItems())
-
-    def GetNextId(self):
-        """!Get next id (data ignored)
-
-        @return next id to be used (default: 1)
-        """
-        if len(self.items) < 1:
-            return 1
-        
-        currId = self.items[-1].GetId()
-        if currId > 0:
-            return currId + 1
-        
-        return 1
-
-    def GetProperties(self):
-        """!Get model properties"""
-        return self.properties
-
-    def GetVariables(self, params = False):
-        """!Get model variables"""
-        if params:
-            return self.variablesParams
-        
-        return self.variables
-    
-    def SetVariables(self, data):
-        """!Set model variables"""
-        self.variables = data
-    
-    def Reset(self):
-        """!Reset model"""
-        self.items = list()
-        
-    def RemoveItem(self, item):
-        """!Remove item from model
-        
-        @return list of related items to remove/update
-        """
-        relList = list()
-        upList = list()
-        
-        if not isinstance(item, ModelData):
-            self.items.remove(item)
-        
-        if isinstance(item, ModelAction):
-            for rel in item.GetRelations():
-                relList.append(rel)
-                data = rel.GetData()
-                if len(data.GetRelations()) < 2:
-                    relList.append(data)
-                else:
-                    upList.append(data)
-            
-        elif isinstance(item, ModelData):
-            for rel in item.GetRelations():
-                relList.append(rel)
-                if rel.GetFrom() == self:
-                    relList.append(rel.GetTo())
-                else:
-                    relList.append(rel.GetFrom())
-        
-        elif isinstance(item, ModelLoop):
-            for rel in item.GetRelations():
-                relList.append(rel)
-            for action in self.GetItems():
-                action.UnSetBlock(item)
-        
-        return relList, upList
-    
-    def FindAction(self, aId):
-        """!Find action by id"""
-        alist = self.GetItems(objType = ModelAction)
-        for action in alist:
-            if action.GetId() == aId:
-                return action
-        
-        return None
-
-    def GetData(self):
-        """!Get list of data items"""
-        result = list()
-        dataItems = self.GetItems(objType = ModelData)
-        
-        for action in self.GetItems(objType = ModelAction):
-            for rel in action.GetRelations():
-                dataItem = rel.GetData()
-                if dataItem not in result:
-                    result.append(dataItem)
-                if dataItem in dataItems:
-                    dataItems.remove(dataItem)
-        
-        # standalone data
-        if dataItems:
-            result += dataItems
-        
-        return result
-
-    def FindData(self, value, prompt):
-        """!Find data item in the model
-
-        @param value value
-        @param prompt prompt
-
-        @return ModelData instance
-        @return None if not found
-        """
-        for data in self.GetData():
-            if data.GetValue() == value and \
-                    data.GetPrompt() == prompt:
-                return data
-        
-        return None
-                
-    def LoadModel(self, filename):
-        """!Load model definition stored in GRASS Model XML file (gxm)
-        
-        @todo Validate against DTD
-        
-        Raise exception on error.
-        """
-        dtdFilename = os.path.join(globalvar.ETCWXDIR, "xml", "grass-gxm.dtd")
-        
-        # parse workspace file
-        try:
-            gxmXml = ProcessModelFile(etree.parse(filename))
-        except StandardError, e:
-            raise GException(e)
-        
-        if self.canvas:
-            win = self.canvas.parent
-            if gxmXml.pos:
-                win.SetPosition(gxmXml.pos)
-            if gxmXml.size:
-                win.SetSize(gxmXml.size)
-        
-        # load properties
-        self.properties = gxmXml.properties
-        self.variables  = gxmXml.variables
-        
-        # load model.GetActions()
-        for action in gxmXml.actions:
-            actionItem = ModelAction(parent = self, 
-                                     x = action['pos'][0],
-                                     y = action['pos'][1],
-                                     width = action['size'][0],
-                                     height = action['size'][1],
-                                     task = action['task'],
-                                     id = action['id'])
-            
-            if action['disabled']:
-                actionItem.Enable(False)
-            
-            self.AddItem(actionItem)
-            
-            task = actionItem.GetTask()
-            parameterized = False
-            valid = True
-            for f in task.get_options()['flags']:
-                if f.get('parameterized', False):
-                    parameterized = True
-                    break
-            for p in task.get_options()['params']:
-                if p.get('required', 'no') != 'no' and \
-                        p.get('value', '') == '' and \
-                        p.get('default', '') == '':
-                    valid = False
-                if p.get('parameterized', False):
-                    parameterized = True
-            
-            actionItem.SetValid(valid)
-            actionItem.SetParameterized(parameterized)
-            actionItem.GetLog() # substitute variables (-> valid/invalid)
-        
-        # load data & relations
-        for data in gxmXml.data:
-            dataItem = ModelData(parent = self, 
-                                 x = data['pos'][0],
-                                 y = data['pos'][1],
-                                 width = data['size'][0],
-                                 height = data['size'][1],
-                                 prompt = data['prompt'],
-                                 value = data['value'])
-            dataItem.SetIntermediate(data['intermediate'])
-            
-            for rel in data['rels']:
-                actionItem = self.FindAction(rel['id'])
-                if rel['dir'] == 'from':
-                    relation = ModelRelation(parent = self, fromShape = dataItem,
-                                             toShape = actionItem, param = rel['name'])
-                else:
-                    relation = ModelRelation(parent = self, fromShape = actionItem,
-                                             toShape = dataItem, param = rel['name'])
-                relation.SetControlPoints(rel['points'])
-                actionItem.AddRelation(relation)
-                dataItem.AddRelation(relation)
-
-            if self.canvas:
-                dataItem.Update()
-           
-        # load loops
-        for loop in gxmXml.loops:
-            loopItem = ModelLoop(parent = self, 
-                                 x = loop['pos'][0],
-                                 y = loop['pos'][1],
-                                 width = loop['size'][0],
-                                 height = loop['size'][1],
-                                 text = loop['text'],
-                                 id = loop['id'])
-            self.AddItem(loopItem)
-
-        # load conditions
-        for condition in gxmXml.conditions:
-            conditionItem = ModelCondition(parent = self, 
-                                           x = condition['pos'][0],
-                                           y = condition['pos'][1],
-                                           width = condition['size'][0],
-                                           height = condition['size'][1],
-                                           text = condition['text'],
-                                           id = condition['id'])
-            self.AddItem(conditionItem)
-
-        # define loops & if/else items
-        for loop in gxmXml.loops:
-            alist = list()
-            for aId in loop['items']:
-                action = self.GetItem(aId)
-                alist.append(action)
-            
-            loopItem = self.GetItem(loop['id'])
-            loopItem.SetItems(alist)
-            
-            for action in loopItem.GetItems():
-                action.SetBlock(loopItem)
-        
-        for condition in gxmXml.conditions:
-            conditionItem = self.GetItem(condition['id'])
-            for b in condition['items'].keys():
-                alist = list()
-                for aId in condition['items'][b]:
-                    action = self.GetItem(aId)
-                    alist.append(action)
-                conditionItem.SetItems(alist, branch = b)
-            
-            items = conditionItem.GetItems()
-            for b in items.keys():
-                for action in items[b]:
-                    action.SetBlock(conditionItem)
-        
-    def AddItem(self, newItem):
-        """!Add item to the list"""
-        iId = newItem.GetId()
-        
-        i  = 0
-        for item in self.items:
-            if item.GetId() > iId:
-                self.items.insert(i, newItem)
-                return
-            i += 1
-        
-        self.items.append(newItem)
-        
-    def IsValid(self):
-        """Return True if model is valid"""
-        if self.Validate():
-            return False
-        
-        return True
-    
-    def Validate(self):
-        """!Validate model, return None if model is valid otherwise
-        error string"""
-        errList = list()
-        for action in self.GetItems(objType = ModelAction):
-            task = menuform.GUI(show = None).ParseCommand(cmd = action.GetLog(string = False))
-            errList += task.getCmdError()
-        
-        return errList
-
-    def RunAction(self, item, params, log, onDone, statusbar = None):
-        """!Run given action
-
-        @param item action item
-        @param params parameters dict
-        @param log logging window
-        @param onDone on-done method
-        @param statusbar wx.StatusBar instance or None
-        """
-        name = item.GetName()
-        if name in params:
-            paramsOrig = item.GetParams(dcopy = True)
-            item.MergeParams(params[name])
-        
-        if statusbar:
-            statusbar.SetStatusText(_('Running model...'), 0)
-        log.RunCmd(command = item.GetLog(string = False),
-                   onDone = onDone)
-        
-        if name in params:
-            item.SetParams(paramsOrig)
-        
-    def Run(self, log, onDone, parent = None):
-        """!Run model
-
-        @param log logging window (see goutput.GMConsole)
-        @param onDone on-done method
-        @param parent window for messages or None
-        """
-        if self.GetNumItems() < 1:
-            GMessage(parent = parent,
-                     message = _('Model is empty. Nothing to run.'))
-            return
-        
-        statusbar = None
-        if isinstance(parent, wx.Frame):
-            statusbar = parent.GetStatusBar()
-        
-        # validation
-        if statusbar:
-            statusbar.SetStatusText(_('Validating model...'), 0)
-        errList = self.Validate()
-        if statusbar:
-            statusbar.SetStatusText('', 0)
-        if errList:
-            dlg = wx.MessageDialog(parent = parent,
-                                   message = _('Model is not valid. Do you want to '
-                                               'run the model anyway?\n\n%s') % '\n'.join(errList),
-                                   caption = _("Run model?"),
-                                   style = wx.YES_NO | wx.NO_DEFAULT |
-                                   wx.ICON_QUESTION | wx.CENTRE)
-            ret = dlg.ShowModal()
-            if ret != wx.ID_YES:
-                return
-        
-        # parametrization
-        params = self.Parameterize()
-        if params:
-            dlg = ModelParamDialog(parent = parent,
-                                   params = params)
-            dlg.CenterOnParent()
-            
-            ret = dlg.ShowModal()
-            if ret != wx.ID_OK:
-                dlg.Destroy()
-                return
-            
-            err = dlg.GetErrors()
-            if err:
-                GError(parent = self, message = unicode('\n'.join(err)))
-                return
-        
-        log.cmdThread.SetId(-1)
-        for item in self.GetItems():
-            if not item.IsEnabled():
-                continue
-            if isinstance(item, ModelAction):
-                if item.GetBlockId():
-                    continue
-                self.RunAction(item, params, log, onDone)
-            elif isinstance(item, ModelLoop):
-                cond = item.GetText()
-                # substitute variables in condition
-                variables = self.GetVariables()
-                for variable in variables:
-                    pattern = re.compile('%' + variable)
-                    if pattern.search(cond):
-                        value = variables[variable].get('value', '')
-                        vtype = variables[variable].get('type', 'string')
-                        if vtype == 'string':
-                            value = '"' + value + '"'
-                        cond = pattern.sub(value, cond)
-                # split condition
-                condVar, condText = re.split('\s*in\s*', cond)
-                
-                for action in item.GetItems():
-                    for vars()[condVar] in eval(condText):
-                        if not isinstance(action, ModelAction) or \
-                                not action.IsEnabled():
-                            continue
-                        
-                            self.RunAction(action, params, log, onDone)
-                
-        if params:
-            dlg.Destroy()
-        
-    def DeleteIntermediateData(self, log):
-        """!Detele intermediate data"""
-        rast, vect, rast3d, msg = self.GetIntermediateData()
-        
-        if rast:
-            log.RunCmd(['g.remove', 'rast=%s' %','.join(rast)])
-        if rast3d:
-            log.RunCmd(['g.remove', 'rast3d=%s' %','.join(rast3d)])
-        if vect:
-            log.RunCmd(['g.remove', 'vect=%s' %','.join(vect)])
-        
-    def GetIntermediateData(self):
-        """!Get info about intermediate data"""
-        rast = list()
-        rast3d = list()
-        vect = list()
-        for data in self.GetData():
-            if not data.IsIntermediate():
-                continue
-            name = data.GetValue()
-            prompt = data.GetPrompt()
-            if prompt == 'raster':
-                rast.append(name)
-            elif prompt == 'vector':
-                vect.append(name)
-            elif prompt == 'rast3d':
-                rast3d.append(name)
-        
-        msg = ''
-        if rast:
-            msg += '\n\n%s: ' % _('Raster maps')
-            msg += ', '.join(rast)
-        if rast3d:
-            msg += '\n\n%s: ' % _('3D raster maps')
-            msg += ', '.join(rast3d)
-        if vect:
-            msg += '\n\n%s: ' % _('Vector maps')
-            msg += ', '.join(vect)
-        
-        return rast, vect, rast3d, msg
-
-    def Update(self):
-        """!Update model"""
-        for item in self.items:
-            item.Update()
-        
-    def IsParameterized(self):
-        """!Return True if model is parameterized"""
-        if self.Parameterize():
-            return True
-        
-        return False
-    
-    def Parameterize(self):
-        """!Return parameterized options"""
-        result = dict()
-        idx = 0
-        if self.variables:
-            params = list()
-            result[_("Variables")] = { 'flags'  : list(),
-                                       'params' : params,
-                                       'idx' : idx }
-            for name, values in self.variables.iteritems():
-                gtype = values.get('type', 'string')
-                if gtype in ('raster', 'vector'):
-                    gisprompt = True
-                    prompt = gtype
-                    if gtype == 'raster':
-                        element = 'cell'
-                    else:
-                        element = 'vector'
-                    ptype = 'string'
-                else:
-                    gisprompt = False
-                    prompt = None
-                    element = None
-                    ptype = gtype
-                params.append({ 'gisprompt' : gisprompt,
-                                'multiple'  : 'no',
-                                'description' : values.get('description', ''),
-                                'guidependency' : '',
-                                'default' : '',
-                                'age' : None,
-                                'required' : 'yes',
-                                'value' : values.get('value', ''),
-                                'label' : '',
-                                'guisection' : '',
-                                'key_desc' : '',
-                                'values' : list(),
-                                'parameterized' : False,
-                                'values_desc' : list(),
-                                'prompt' : prompt,
-                                'element' : element,
-                                'type' : ptype,
-                                'name' : name })
-            
-            idx += 1
-        
-        for action in self.GetItems(objType = ModelAction):
-            if not action.IsEnabled():
-                continue
-            name   = action.GetName()
-            params = action.GetParams()
-            for f in params['flags']:
-                if f.get('parameterized', False):
-                    if name not in result:
-                        result[name] = { 'flags' : list(),
-                                         'params': list(),
-                                         'idx'   : idx }
-                    result[name]['flags'].append(f)
-            for p in params['params']:
-                if p.get('parameterized', False):
-                    if name not in result:
-                        result[name] = { 'flags' : list(),
-                                         'params': list(),
-                                         'idx'   : idx }
-                    result[name]['params'].append(p)
-            idx += 1
-
-        self.variablesParams = result # record parameters
-        
-        return result
-    
-class ModelFrame(wx.Frame):
-    def __init__(self, parent, id = wx.ID_ANY,
-                 title = _("GRASS GIS Graphical Modeler (experimental prototype)"), **kwargs):
-        """!Graphical modeler main window
-        
-        @param parent parent window
-        @param id window id
-        @param title window title
-
-        @param kwargs wx.Frames' arguments
-        """
-        self.parent = parent
-        self.searchDialog = None # module search dialog
-        self.baseTitle = title
-        self.modelFile = None    # loaded model
-        self.modelChanged = False
-        
-        self.cursors = {
-            "default" : wx.StockCursor(wx.CURSOR_ARROW),
-            "cross"   : wx.StockCursor(wx.CURSOR_CROSS),
-            }
-        
-        wx.Frame.__init__(self, parent = parent, id = id, title = title, **kwargs)
-        self.SetName("Modeler")
-        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-        
-        self.menubar = menu.Menu(parent = self, data = menudata.ModelerData())
-        
-        self.SetMenuBar(self.menubar)
-        
-        self.toolbar = toolbars.ModelToolbar(parent = self)
-        self.SetToolBar(self.toolbar)
-        
-        self.statusbar = self.CreateStatusBar(number = 1)
-        
-        self.notebook = menuform.GNotebook(parent = self,
-                                           style = FN.FNB_FANCY_TABS | FN.FNB_BOTTOM |
-                                           FN.FNB_NO_NAV_BUTTONS | FN.FNB_NO_X_BUTTON)
-        
-        self.canvas = ModelCanvas(self)
-        self.canvas.SetBackgroundColour(wx.WHITE)
-        self.canvas.SetCursor(self.cursors["default"])
-        
-        self.model = Model(self.canvas)
-        
-        self.variablePanel = VariablePanel(parent = self)
-        
-        self.itemPanel = ItemPanel(parent = self)
-        
-        self.goutput = goutput.GMConsole(parent = self, notebook = self.notebook)
-        
-        self.notebook.AddPage(page = self.canvas, text=_('Model'), name = 'model')
-        self.notebook.AddPage(page = self.itemPanel, text=_('Items'), name = 'items')
-        self.notebook.AddPage(page = self.variablePanel, text=_('Variables'), name = 'variables')
-        self.notebook.AddPage(page = self.goutput, text=_('Command output'), name = 'output')
-        wx.CallAfter(self.notebook.SetSelectionByName, 'model')
-        wx.CallAfter(self.ModelChanged, False)
-
-        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
-        self.Bind(wx.EVT_SIZE, self.OnSize)
-        
-        self._layout()
-        self.SetMinSize((475, 300))
-        self.SetSize((640, 480))
-        
-        # fix goutput's pane size
-        if self.goutput:
-            self.goutput.SetSashPosition(int(self.GetSize()[1] * .75))
-        
-    def _layout(self):
-        """!Do layout"""
-        sizer = wx.BoxSizer(wx.VERTICAL)
-
-        sizer.Add(item = self.notebook, proportion = 1,
-                  flag = wx.EXPAND)
-        
-        self.SetAutoLayout(True)
-        self.SetSizer(sizer)
-        sizer.Fit(self)
-        
-        self.Layout()
-
-    def _addEvent(self, item):
-        """!Add event to item"""
-        evthandler = ModelEvtHandler(self.statusbar,
-                                     self)
-        evthandler.SetShape(item)
-        evthandler.SetPreviousHandler(item.GetEventHandler())
-        item.SetEventHandler(evthandler)
-
-    def GetCanvas(self):
-        """!Get canvas"""
-        return self.canvas
-    
-    def GetModel(self):
-        """!Get model"""
-        return self.model
-    
-    def ModelChanged(self, changed = True):
-        """!Update window title"""
-        self.modelChanged = changed
-        
-        if self.modelFile:
-            if self.modelChanged:
-                self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.modelFile) + '*')
-            else:
-                self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.modelFile))
-        else:
-            self.SetTitle(self.baseTitle)
-        
-    def OnVariables(self, event):
-        """!Switch to variables page"""
-        self.notebook.SetSelectionByName('variables')
-        
-    def OnRemoveItem(self, event):
-        """!Remove shape
-        """
-        self.GetCanvas().RemoveSelected()
-        
-    def OnCanvasRefresh(self, event):
-        """!Refresh canvas"""
-        self.SetStatusText(_("Redrawing model..."), 0)
-        self.GetCanvas().Refresh()
-        self.SetStatusText("", 0)
-
-    def OnCmdRun(self, event):
-        """!Run command"""
-        try:
-            action = self.GetModel().GetItems()[event.pid]
-            if hasattr(action, "task"):
-                action.Update(running = True)
-        except IndexError:
-            pass
-        
-    def OnCmdDone(self, event):
-        """!Command done (or aborted)"""
-        try:
-            action = self.GetModel().GetItems()[event.pid]
-            if hasattr(action, "task"):
-                action.Update(running = True)
-        except IndexError:
-            pass
-        
-    def OnCloseWindow(self, event):
-        """!Close window"""
-        if self.modelChanged and \
-                UserSettings.Get(group='manager', key='askOnQuit', subkey='enabled'):
-            if self.modelFile:
-                message = _("Do you want to save changes in the model?")
-            else:
-                message = _("Do you want to store current model settings "
-                            "to model file?")
-            
-            # ask user to save current settings
-            dlg = wx.MessageDialog(self,
-                                   message = message,
-                                   caption=_("Quit Graphical Modeler"),
-                                   style = wx.YES_NO | wx.YES_DEFAULT |
-                                   wx.CANCEL | wx.ICON_QUESTION | wx.CENTRE)
-            ret = dlg.ShowModal()
-            if ret == wx.ID_YES:
-                if not self.modelFile:
-                        self.OnWorkspaceSaveAs()
-                else:
-                    self.WriteModelFile(self.modelFile)
-            elif ret == wx.ID_CANCEL:
-                dlg.Destroy()
-                return
-            dlg.Destroy()
-        
-        self.Destroy()
-
-    def OnSize(self, event):
-        """Window resized, save to the model"""
-        self.ModelChanged()
-        event.Skip()
-        
-    def OnPreferences(self, event):
-        """!Open preferences dialog"""
-        dlg = PreferencesDialog(parent = self)
-        dlg.CenterOnParent()
-        
-        dlg.ShowModal()
-        self.canvas.Refresh()
-        
-    def OnHelp(self, event):
-        """!Show help"""
-        if self.parent and self.parent.GetName() == 'LayerManager':
-            log = self.parent.GetLogWindow()
-            log.RunCmd(['g.manual',
-                        'entry=wxGUI.Modeler'])
-        else:
-            RunCommand('g.manual',
-                       quiet = True,
-                       entry = 'wxGUI.Modeler')
-        
-    def OnModelProperties(self, event):
-        """!Model properties dialog"""
-        dlg = PropertiesDialog(parent = self)
-        dlg.CentreOnParent()
-        properties = self.model.GetProperties()
-        dlg.Init(properties)
-        if dlg.ShowModal() == wx.ID_OK:
-            self.ModelChanged()
-            for key, value in dlg.GetValues().iteritems():
-                properties[key] = value
-            for action in self.model.GetItems(objType = ModelAction):
-                action.GetTask().set_flag('overwrite', properties['overwrite'])
-        
-        dlg.Destroy()
-        
-    def OnDeleteData(self, event):
-        """!Delete intermediate data"""
-        rast, vect, rast3d, msg = self.model.GetIntermediateData()
-        
-        if not rast and not vect and not rast3d:
-            GMessage(parent = self,
-                     message = _('Nothing to delete.'))
-            return
-        
-        dlg = wx.MessageDialog(parent = self,
-                               message= _("Do you want to permanently delete data?%s" % msg),
-                               caption=_("Delete intermediate data?"),
-                               style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
-        
-        ret = dlg.ShowModal()
-        if ret == wx.ID_YES:
-            dlg.Destroy()
-            
-            if rast:
-                self.goutput.RunCmd(['g.remove', 'rast=%s' %','.join(rast)])
-            if rast3d:
-                self.goutput.RunCmd(['g.remove', 'rast3d=%s' %','.join(rast3d)])
-            if vect:
-                self.goutput.RunCmd(['g.remove', 'vect=%s' %','.join(vect)])
-            
-            self.SetStatusText(_("%d maps deleted from current mapset") % \
-                                 int(len(rast) + len(rast3d) + len(vect)))
-            return
-        
-        dlg.Destroy()
-                
-    def OnModelNew(self, event):
-        """!Create new model"""
-        Debug.msg(4, "ModelFrame.OnModelNew():")
-        
-        # ask user to save current model
-        if self.modelFile and self.modelChanged:
-            self.OnModelSave()
-        elif self.modelFile is None and \
-                (self.model.GetNumItems() > 0 or len(self.model.GetData()) > 0):
-            dlg = wx.MessageDialog(self, message=_("Current model is not empty. "
-                                                   "Do you want to store current settings "
-                                                   "to model file?"),
-                                   caption=_("Create new model?"),
-                                   style=wx.YES_NO | wx.YES_DEFAULT |
-                                   wx.CANCEL | wx.ICON_QUESTION)
-            ret = dlg.ShowModal()
-            if ret == wx.ID_YES:
-                self.OnModelSaveAs()
-            elif ret == wx.ID_CANCEL:
-                dlg.Destroy()
-                return
-            
-            dlg.Destroy()
-        
-        # delete all items
-        self.canvas.GetDiagram().DeleteAllShapes()
-        self.model.Reset()
-        self.canvas.Refresh()
-        self.itemPanel.Update()
-        self.variablePanel.Reset()
-        
-        # no model file loaded
-        self.modelFile = None
-        self.modelChanged = False
-        self.SetTitle(self.baseTitle)
-        
-    def OnModelOpen(self, event):
-        """!Load model from file"""
-        filename = ''
-        dlg = wx.FileDialog(parent = self, message=_("Choose model file"),
-                            defaultDir = os.getcwd(),
-                            wildcard=_("GRASS Model File (*.gxm)|*.gxm"))
-        if dlg.ShowModal() == wx.ID_OK:
-            filename = dlg.GetPath()
-                    
-        if not filename:
-            return
-        
-        Debug.msg(4, "ModelFrame.OnModelOpen(): filename=%s" % filename)
-        
-        # close current model
-        self.OnModelClose()
-        
-        self.LoadModelFile(filename)
-        
-        self.modelFile = filename
-        self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.modelFile))
-        self.SetStatusText(_('%(items)d items (%(actions)d actions) loaded into model') % \
-                               { 'items' : self.model.GetNumItems(),
-                                 'actions' : self.model.GetNumItems(actionOnly = True) }, 0)
-        
-    def OnModelSave(self, event = None):
-        """!Save model to file"""
-        if self.modelFile and self.modelChanged:
-            dlg = wx.MessageDialog(self, message=_("Model file <%s> already exists. "
-                                                   "Do you want to overwrite this file?") % \
-                                       self.modelFile,
-                                   caption=_("Save model"),
-                                   style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
-            if dlg.ShowModal() == wx.ID_NO:
-                dlg.Destroy()
-            else:
-                Debug.msg(4, "ModelFrame.OnModelSave(): filename=%s" % self.modelFile)
-                self.WriteModelFile(self.modelFile)
-                self.SetStatusText(_('File <%s> saved') % self.modelFile, 0)
-                self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.modelFile))
-        elif not self.modelFile:
-            self.OnModelSaveAs(None)
-        
-    def OnModelSaveAs(self, event):
-        """!Create model to file as"""
-        filename = ''
-        dlg = wx.FileDialog(parent = self,
-                            message = _("Choose file to save current model"),
-                            defaultDir = os.getcwd(),
-                            wildcard=_("GRASS Model File (*.gxm)|*.gxm"),
-                            style=wx.FD_SAVE)
-        
-        
-        if dlg.ShowModal() == wx.ID_OK:
-            filename = dlg.GetPath()
-        
-        if not filename:
-            return
-        
-        # check for extension
-        if filename[-4:] != ".gxm":
-            filename += ".gxm"
-        
-        if os.path.exists(filename):
-            dlg = wx.MessageDialog(parent = self,
-                                   message=_("Model file <%s> already exists. "
-                                             "Do you want to overwrite this file?") % filename,
-                                   caption=_("File already exists"),
-                                   style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
-            if dlg.ShowModal() != wx.ID_YES:
-                dlg.Destroy()
-                return
-        
-        Debug.msg(4, "GMFrame.OnModelSaveAs(): filename=%s" % filename)
-        
-        self.WriteModelFile(filename)
-        self.modelFile = filename
-        self.SetTitle(self.baseTitle + " - " + os.path.basename(self.modelFile))
-        self.SetStatusText(_('File <%s> saved') % self.modelFile, 0)
-
-    def OnModelClose(self, event = None):
-        """!Close model file"""
-        Debug.msg(4, "ModelFrame.OnModelClose(): file=%s" % self.modelFile)
-        # ask user to save current model
-        if self.modelFile and self.modelChanged:
-            self.OnModelSave()
-        elif self.modelFile is None and \
-                (self.model.GetNumItems() > 0 or len(self.model.GetData()) > 0):
-            dlg = wx.MessageDialog(self, message=_("Current model is not empty. "
-                                                   "Do you want to store current settings "
-                                                   "to model file?"),
-                                   caption=_("Create new model?"),
-                                   style=wx.YES_NO | wx.YES_DEFAULT |
-                                   wx.CANCEL | wx.ICON_QUESTION)
-            ret = dlg.ShowModal()
-            if ret == wx.ID_YES:
-                self.OnModelSaveAs()
-            elif ret == wx.ID_CANCEL:
-                dlg.Destroy()
-                return
-            
-            dlg.Destroy()
-        
-        self.modelFile = None
-        self.SetTitle(self.baseTitle)
-        
-        self.canvas.GetDiagram().DeleteAllShapes()
-        self.model.Reset()
-        
-        self.canvas.Refresh()
-        
-    def OnRunModel(self, event):
-        """!Run entire model"""
-        self.model.Run(self.goutput, self.OnDone, parent = self)
-        
-    def OnDone(self, cmd, returncode):
-        """!Computation finished"""
-        self.SetStatusText('', 0)
-        
-    def OnValidateModel(self, event, showMsg = True):
-        """!Validate entire model"""
-        if self.model.GetNumItems() < 1:
-            GMessage(parent = self, 
-                     message = _('Model is empty. Nothing to validate.'))
-            return
-        
-        
-        self.SetStatusText(_('Validating model...'), 0)
-        errList = self.model.Validate()
-        self.SetStatusText('', 0)
-        
-        if errList:
-            GWarning(parent = self,
-                     message = _('Model is not valid.\n\n%s') % '\n'.join(errList))
-        else:
-            GMessage(parent = self,
-                     message = _('Model is valid.'))
-    
-    def OnExportImage(self, event):
-        """!Export model to image (default image)
-        """
-        xminImg = 0
-        xmaxImg = 0
-        yminImg = 0
-        ymaxImg = 0
-        # get current size of canvas
-        for shape in self.canvas.GetDiagram().GetShapeList():
-            w, h = shape.GetBoundingBoxMax()
-            x    = shape.GetX()
-            y    = shape.GetY()
-            xmin = x - w / 2
-            xmax = x + w / 2
-            ymin = y - h / 2
-            ymax = y + h / 2
-            if xmin < xminImg:
-                xminImg = xmin
-            if xmax > xmaxImg:
-                xmaxImg = xmax
-            if ymin < yminImg:
-                yminImg = ymin
-            if ymax > ymaxImg:
-                ymaxImg = ymax
-        size = wx.Size(int(xmaxImg - xminImg) + 50,
-                       int(ymaxImg - yminImg) + 50)
-        bitmap = wx.EmptyBitmap(width = size.width, height = size.height)
-        
-        filetype, ltype = GetImageHandlers(wx.ImageFromBitmap(bitmap))
-        
-        dlg = wx.FileDialog(parent = self,
-                            message = _("Choose a file name to save the image (no need to add extension)"),
-                            defaultDir = "",
-                            defaultFile = "",
-                            wildcard = filetype,
-                            style=wx.SAVE | wx.FD_OVERWRITE_PROMPT)
-        
-        if dlg.ShowModal() == wx.ID_OK:
-            path = dlg.GetPath()
-            if not path:
-                dlg.Destroy()
-                return
-            
-            base, ext = os.path.splitext(path)
-            fileType = ltype[dlg.GetFilterIndex()]['type']
-            extType  = ltype[dlg.GetFilterIndex()]['ext']
-            if ext != extType:
-                path = base + '.' + extType
-            
-            dc = wx.MemoryDC(bitmap)
-            dc.SetBackground(wx.WHITE_BRUSH)
-            dc.SetBackgroundMode(wx.SOLID)
-            
-            dc.BeginDrawing()
-            self.canvas.GetDiagram().Clear(dc)
-            self.canvas.GetDiagram().Redraw(dc)
-            dc.EndDrawing()
-            
-            bitmap.SaveFile(path, fileType)
-            self.SetStatusText(_("Model exported to <%s>") % path)
-        
-        dlg.Destroy()
-        
-    def OnExportPython(self, event):
-        """!Export model to Python script"""
-        filename = ''
-        dlg = wx.FileDialog(parent = self,
-                            message = _("Choose file to save"),
-                            defaultDir = os.getcwd(),
-                            wildcard=_("Python script (*.py)|*.py"),
-                            style=wx.FD_SAVE)
-        
-        if dlg.ShowModal() == wx.ID_OK:
-            filename = dlg.GetPath()
-        
-        if not filename:
-            return
-        
-        # check for extension
-        if filename[-3:] != ".py":
-            filename += ".py"
-        
-        if os.path.exists(filename):
-            dlg = wx.MessageDialog(self, message=_("File <%s> already exists. "
-                                                   "Do you want to overwrite this file?") % filename,
-                                   caption=_("Save file"),
-                                   style=wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
-            if dlg.ShowModal() == wx.ID_NO:
-                dlg.Destroy()
-                return
-            
-            dlg.Destroy()
-        
-        fd = open(filename, "w")
-        try:
-            WritePythonFile(fd, self.model)
-        finally:
-            fd.close()
-        
-        # executable file
-        os.chmod(filename, stat.S_IRWXU | stat.S_IWUSR)
-        
-        self.SetStatusText(_("Model exported to <%s>") % filename)
-
-    def OnDefineRelation(self, event):
-        """!Define relation between data and action items"""
-        self.canvas.SetCursor(self.cursors["cross"])
-        self.defineRelation = { 'from' : None,
-                                'to'   : None }
-        
-    def OnDefineLoop(self, event):
-        """!Define new loop in the model"""
-        self.ModelChanged()
-        
-        width, height = self.canvas.GetSize()
-        loop = ModelLoop(self, x = width/2, y = height/2,
-                         id = self.model.GetNumItems() + 1)
-        self.canvas.diagram.AddShape(loop)
-        loop.Show(True)
-        
-        self._addEvent(loop)
-        self.model.AddItem(loop)
-        
-        self.canvas.Refresh()
-        
-    def OnDefineCondition(self, event):
-        """!Define new condition in the model"""
-        self.ModelChanged()
-        
-        width, height = self.canvas.GetSize()
-        cond = ModelCondition(self, x = width/2, y = height/2,
-                              id = self.model.GetNumItems() + 1)
-        self.canvas.diagram.AddShape(cond)
-        cond.Show(True)
-        
-        self._addEvent(cond)
-        self.model.AddItem(cond)
-        
-        self.canvas.Refresh()
-    
-    def OnAddAction(self, event):
-        """!Add action to model"""
-        if self.searchDialog is None:
-            self.searchDialog = ModelSearchDialog(self)
-            self.searchDialog.CentreOnParent()
-        else:
-            self.searchDialog.Reset()
-            
-        if self.searchDialog.ShowModal() == wx.ID_CANCEL:
-            self.searchDialog.Hide()
-            return
-            
-        cmd = self.searchDialog.GetCmd()
-        self.searchDialog.Hide()
-        
-        self.ModelChanged()
-        
-        # add action to canvas
-        width, height = self.canvas.GetSize()
-        if cmd[0] == 'r.mapcalc':
-            GMessage(parent = self,
-                     message = _("Module r.mapcalc cannot be used in the model. "
-                                 "Use r.mapcalculator instead."))
-            return
-        
-        action = ModelAction(self.model, cmd = cmd, x = width/2, y = height/2,
-                             id = self.model.GetNextId())
-        overwrite = self.model.GetProperties().get('overwrite', None)
-        if overwrite is not None:
-            action.GetTask().set_flag('overwrite', overwrite)
-        
-        self.canvas.diagram.AddShape(action)
-        action.Show(True)
-
-        self._addEvent(action)
-        self.model.AddItem(action)
-        
-        self.itemPanel.Update()
-        self.canvas.Refresh()
-        time.sleep(.1)
-        
-        # show properties dialog
-        win = action.GetPropDialog()
-        if not win:
-            if len(action.GetLog(string = False)) > 1:
-                self.GetOptData(dcmd = action.GetLog(string = False), layer = action,
-                                params = action.GetParams(), propwin = None)
-            else:
-                menuform.GUI(parent = self, show = True).ParseCommand(action.GetLog(string = False),
-                                                                      completed = (self.GetOptData, action, action.GetParams()))
-        elif win and not win.IsShown():
-            win.Show()
-        
-        if win:
-            win.Raise()
-        
-    def OnAddData(self, event):
-        """!Add data item to model
-        """
-        # add action to canvas
-        width, height = self.canvas.GetSize()
-        data = ModelData(self, x = width/2, y = height/2)
-       
-        dlg = ModelDataDialog(parent = self, shape = data)
-        data.SetPropDialog(dlg)
-        dlg.CentreOnParent()
-        ret = dlg.ShowModal()
-        dlg.Destroy()
-        if ret != wx.ID_OK:
-            return
-        
-        data.Update()
-        self.canvas.diagram.AddShape(data)
-        data.Show(True)
-        
-        self.ModelChanged()
-        
-        self._addEvent(data)
-        self.model.AddItem(data)
-        
-        self.canvas.Refresh()
-        
-        
-    def OnHelp(self, event):
-        """!Display manual page"""
-        grass.run_command('g.manual',
-                          entry = 'wxGUI.Modeler')
-
-    def OnAbout(self, event):
-        """!Display About window"""
-        info = wx.AboutDialogInfo()
-
-        info.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-        info.SetName(_('wxGUI Graphical Modeler'))
-        info.SetWebSite('http://grass.osgeo.org')
-        year = grass.version()['date']
-        info.SetDescription(_('(C) 2010-%s by the GRASS Development Team\n\n') % year + 
-                            '\n'.join(textwrap.wrap(_('This program is free software under the GNU General Public License'
-                                                      '(>=v2). Read the file COPYING that comes with GRASS for details.'), 75)))
-        
-        wx.AboutBox(info)
-        
-    def GetOptData(self, dcmd, layer, params, propwin):
-        """!Process action data"""
-        if params: # add data items
-            width, height = self.canvas.GetSize()
-            x = [width/2 + 200, width/2 - 200]
-            for p in params['params']:
-                if p.get('prompt', '') in ('raster', 'vector', 'raster3d') and \
-                        (p.get('value', None) or \
-                             (p.get('age', 'old') != 'old' and p.get('required', 'no') == 'yes')):
-                    data = layer.FindData(p.get('name', ''))
-                    if data:
-                        data.SetValue(p.get('value', ''))
-                        data.Update()
-                        continue
-                    
-                    data = self.model.FindData(p.get('value', ''),
-                                               p.get('prompt', ''))
-                    if data:
-                        if p.get('age', 'old') == 'old':
-                            rel = ModelRelation(parent = self, fromShape = data,
-                                                toShape = layer, param = p.get('name', ''))
-                        else:
-                            rel = ModelRelation(parent = self, fromShape = layer,
-                                                toShape = data, param = p.get('name', ''))
-                        layer.AddRelation(rel)
-                        data.AddRelation(rel)
-                        self.AddLine(rel)
-                        data.Update()
-                        continue
-                    
-                    data = ModelData(self, value = p.get('value', ''),
-                                     prompt = p.get('prompt', ''),
-                                     x = x.pop(), y = height/2)
-                    self._addEvent(data)
-                    self.canvas.diagram.AddShape(data)
-                    data.Show(True)
-                                                            
-                    if p.get('age', 'old') == 'old':
-                        rel = ModelRelation(parent = self, fromShape = data,
-                                            toShape = layer, param = p.get('name', ''))
-                    else:
-                        rel = ModelRelation(parent = self, fromShape = layer,
-                                            toShape = data, param = p.get('name', ''))
-                    layer.AddRelation(rel)
-                    data.AddRelation(rel)
-                    self.AddLine(rel)
-                    data.Update()
-            
-            # valid ?
-            valid = True
-            for p in params['params']:
-                if p.get('required', False) and \
-                        p.get('value', '') == '' and \
-                        p.get('default', '') == '':
-                    valid = False
-                    break
-            layer.SetValid(valid)
-
-            # parameterized ?
-            parameterized = False
-            for f in params['flags']:
-                if f.get('parameterized', False):
-                    parameterized = True
-                    break
-            if not parameterized:
-                for p in params['params']:
-                    if p.get('parameterized', False):
-                        parameterized = True
-                        break
-            layer.SetParameterized(parameterized)
-            
-            self.canvas.Refresh()
-        
-        if dcmd:
-            layer.SetProperties(params, propwin)
-            
-        self.SetStatusText(layer.GetLog(), 0)
-        
-    def AddLine(self, rel):
-        """!Add connection between model objects
-        
-        @param rel relation
-        """
-        fromShape = rel.GetFrom()
-        toShape   = rel.GetTo()
-        
-        rel.SetCanvas(self)
-        rel.SetPen(wx.BLACK_PEN)
-        rel.SetBrush(wx.BLACK_BRUSH)
-        rel.AddArrow(ogl.ARROW_ARROW)
-        points = rel.GetControlPoints()
-        rel.MakeLineControlPoints(2)
-        if points:
-            for x, y in points:
-                rel.InsertLineControlPoint(point = wx.RealPoint(x, y))
-        
-        self._addEvent(rel)
-        try:
-            fromShape.AddLine(rel, toShape)
-        except TypeError:
-            pass # bug when connecting ModelCondition and ModelLoop - to be fixed
-        
-        self.canvas.diagram.AddShape(rel)
-        rel.Show(True)
-        
-    def LoadModelFile(self, filename):
-        """!Load model definition stored in GRASS Model XML file (gxm)
-        """
-        try:
-            self.model.LoadModel(filename)
-        except GException, e:
-            GError(parent = self,
-                   message = _("Reading model file <%s> failed.\n"
-                               "Invalid file, unable to parse XML document.") % filename)
-        
-        self.modelFile = filename
-        self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.modelFile))
-        
-        self.SetStatusText(_("Please wait, loading model..."), 0)
-        
-        # load actions
-        for item in self.model.GetItems(objType = ModelAction):
-            self._addEvent(item)
-            self.canvas.diagram.AddShape(item)
-            item.Show(True)
-            # relations/data
-            for rel in item.GetRelations():
-                if rel.GetFrom() == item:
-                    dataItem = rel.GetTo()
-                else:
-                    dataItem = rel.GetFrom()
-                self._addEvent(dataItem)
-                self.canvas.diagram.AddShape(dataItem)
-                self.AddLine(rel)
-                dataItem.Show(True)
-        
-        # load loops
-        for item in self.model.GetItems(objType = ModelLoop):
-            self._addEvent(item)
-            self.canvas.diagram.AddShape(item)
-            item.Show(True)
-            
-            # connect items in the loop
-            self.DefineLoop(item)
-
-        # load conditions
-        for item in self.model.GetItems(objType = ModelCondition):
-            self._addEvent(item)
-            self.canvas.diagram.AddShape(item)
-            item.Show(True)
-            
-            # connect items in the condition
-            self.DefineCondition(item)
-        
-        # load variables
-        self.variablePanel.Update()
-        self.itemPanel.Update()
-        self.SetStatusText('', 0)
-        
-        self.canvas.Refresh(True)
-        
-    def WriteModelFile(self, filename):
-        """!Save model to model file, recover original file on error.
-        
-        @return True on success
-        @return False on failure
-        """
-        self.ModelChanged(False)
-        tmpfile = tempfile.TemporaryFile(mode='w+b')
-        try:
-            WriteModelFile(fd = tmpfile, model = self.model)
-        except StandardError:
-            GError(parent = self,
-                   message = _("Writing current settings to model file failed."))
-            return False
-        
-        try:
-            mfile = open(filename, "w")
-            tmpfile.seek(0)
-            for line in tmpfile.readlines():
-                mfile.write(line)
-        except IOError:
-            wx.MessageBox(parent = self,
-                          message = _("Unable to open file <%s> for writing.") % filename,
-                          caption = _("Error"),
-                          style = wx.OK | wx.ICON_ERROR | wx.CENTRE)
-            return False
-        
-        mfile.close()
-        
-        return True
-    
-    def DefineLoop(self, loop):
-        """!Define loop with given list of items"""
-        parent = loop
-        items = loop.GetItems()
-        if not items:
-            return
-        
-        # remove defined relations first
-        for rel in loop.GetRelations():
-            self.canvas.GetDiagram().RemoveShape(rel)
-        loop.Clear()
-        
-        for item in items:
-            rel = ModelRelation(parent = self, fromShape = parent, toShape = item)
-            dx = item.GetX() - parent.GetX()
-            dy = item.GetY() - parent.GetY()
-            loop.AddRelation(rel)
-            if dx != 0:
-                rel.SetControlPoints(((parent.GetX(), parent.GetY() + dy / 2),
-                                      (parent.GetX() + dx, parent.GetY() + dy / 2)))
-            self.AddLine(rel)
-            parent = item
-        
-        # close loop
-        item = loop.GetItems()[-1]
-        rel = ModelRelation(parent = self, fromShape = item, toShape = loop)
-        loop.AddRelation(rel)
-        self.AddLine(rel)
-        dx = (item.GetX() - loop.GetX()) + loop.GetWidth() / 2 + 50
-        dy = item.GetHeight() / 2 + 50
-        rel.MakeLineControlPoints(0)
-        rel.InsertLineControlPoint(point = wx.RealPoint(loop.GetX() - loop.GetWidth() / 2 ,
-                                                        loop.GetY()))
-        rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX(),
-                                                        item.GetY() + item.GetHeight() / 2))
-        rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX(),
-                                                        item.GetY() + dy))
-        rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX() - dx,
-                                                        item.GetY() + dy))
-        rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX() - dx,
-                                                        loop.GetY()))
-        
-        self.canvas.Refresh()
-
-    def DefineCondition(self, condition):
-        """!Define if-else statement with given list of items"""
-        parent = condition
-        items = condition.GetItems()
-        if not items['if'] and not items['else']:
-            return
-        
-        # remove defined relations first
-        for rel in condition.GetRelations():
-            self.canvas.GetDiagram().RemoveShape(rel)
-        condition.Clear()
-        dxIf   = condition.GetX() + condition.GetWidth() / 2
-        dxElse = condition.GetX() - condition.GetWidth() / 2
-        dy     = condition.GetY()
-        for branch in items.keys():
-            for item in items[branch]:
-                rel = ModelRelation(parent = self, fromShape = parent,
-                                    toShape = item)
-                condition.AddRelation(rel)
-                self.AddLine(rel)
-                rel.MakeLineControlPoints(0)
-                if branch == 'if':
-                    rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX() - item.GetWidth() / 2, item.GetY()))
-                    rel.InsertLineControlPoint(point = wx.RealPoint(dxIf, dy))
-                else:
-                    rel.InsertLineControlPoint(point = wx.RealPoint(dxElse, dy))
-                    rel.InsertLineControlPoint(point = wx.RealPoint(item.GetX() - item.GetWidth() / 2, item.GetY()))
-                parent = item
-        
-        self.canvas.Refresh()
-        
-class ModelCanvas(ogl.ShapeCanvas):
-    """!Canvas where model is drawn"""
-    def __init__(self, parent):
-        self.parent = parent
-        ogl.OGLInitialize()
-        ogl.ShapeCanvas.__init__(self, parent)
-        
-        self.diagram = ogl.Diagram()
-        self.SetDiagram(self.diagram)
-        self.diagram.SetCanvas(self)
-        
-        self.SetScrollbars(20, 20, 1000/20, 1000/20)
-        
-        self.Bind(wx.EVT_CHAR,  self.OnChar)
-        
-    def OnChar(self, event):
-        """!Key pressed"""
-        kc = event.GetKeyCode()
-        diagram = self.GetDiagram()
-        if kc == wx.WXK_DELETE:
-            self.RemoveSelected()
-        
-    def RemoveSelected(self):
-        """!Remove selected shapes"""
-        self.parent.ModelChanged()
-        
-        diagram = self.GetDiagram()
-        for shape in diagram.GetShapeList():
-            if not shape.Selected():
-                continue
-            remList, upList = self.parent.GetModel().RemoveItem(shape)
-            shape.Select(False)
-            diagram.RemoveShape(shape)
-            shape.__del__()
-            for item in remList:
-                diagram.RemoveShape(item)
-                item.__del__()
-            
-            for item in upList:
-                item.Update()
-        
-        self.Refresh()
-        
-class ModelObject:
-    def __init__(self, id = -1):
-        self.id   = id
-        self.rels = list() # list of ModelRelations
-        
-        self.isEnabled = True
-        self.inBlock   = list() # list of related loops/conditions
-        
-    def __del__(self):
-        pass
-    
-    def GetId(self):
-        """!Get id"""
-        return self.id
-    
-    def AddRelation(self, rel):
-        """!Record new relation
-        """
-        self.rels.append(rel)
-
-    def GetRelations(self, fdir = None):
-        """!Get list of relations
-        
-        @param fdir True for 'from'
-        """
-        if fdir is None:
-            return self.rels
-        
-        result = list()
-        for rel in self.rels:
-            if fdir == 'from':
-                if rel.GetFrom() == self:
-                    result.append(rel)
-            else:
-                if rel.GetTo() == self:
-                    result.append(rel)
-        
-        return result
-    
-    def IsEnabled(self):
-        """!Get True if action is enabled, otherwise False"""
-        return self.isEnabled
-    
-    def Enable(self, enabled = True):
-        """!Enable/disable action"""
-        self.isEnabled = enabled
-        self.Update()
-
-    def Update(self):
-        pass
-
-    def SetBlock(self, item):
-        """!Add object to the block (loop/condition)
-
-        @param item reference to ModelLoop or ModelCondition which
-        defines loops/condition
-        """
-        if item not in self.inBlock:
-            self.inBlock.append(item)
-        
-    def UnSetBlock(self, item):
-        """!Remove object from the block (loop/consition)
-
-        @param item reference to ModelLoop or ModelCondition which
-        defines loops/codition
-        """
-        if item in self.inBlock:
-            self.inBlock.remove(item)
-        
-    def GetBlock(self):
-        """!Get list of related ModelObject(s) which defines block
-        (loop/condition)
-
-        @return list of ModelObjects
-        """
-        return self.inBlock
-    
-    def GetBlockId(self):
-        """!Get list of related ids which defines block
-
-        @return list of ids
-        """
-        ret = list()
-        for mo in self.inBlock:
-            ret.append(mo.GetId())
-        
-        return ret
-    
-class ModelAction(ModelObject, ogl.RectangleShape):
-    """!Action class (GRASS module)"""
-    def __init__(self, parent, x, y, id = -1, cmd = None, task = None, width = None, height = None):
-        ModelObject.__init__(self, id)
-        
-        self.parent  = parent
-        self.task    = task
-        
-        if not width:
-            width = UserSettings.Get(group='modeler', key='action', subkey=('size', 'width'))
-        if not height:
-            height = UserSettings.Get(group='modeler', key='action', subkey=('size', 'height'))
-        
-        if cmd:
-            self.task = menuform.GUI(show = None).ParseCommand(cmd = cmd)
-        else:
-            if task:
-                self.task = task
-            else:
-                self.task = None
-        
-        self.propWin = None
-        
-        self.data = list()   # list of connected data items
-        
-        self.isValid = False
-        self.isParameterized = False
-        
-        if self.parent.GetCanvas():
-            ogl.RectangleShape.__init__(self, width, height)
-            
-            self.SetCanvas(self.parent)
-            self.SetX(x)
-            self.SetY(y)
-            self.SetPen(wx.BLACK_PEN)
-            self._setPen()
-            self._setBrush()
-            self.SetId(id)
-            
-    def _setBrush(self, running = False):
-        """!Set brush"""
-        if running:
-            color = UserSettings.Get(group='modeler', key='action',
-                                     subkey=('color', 'running'))
-        elif not self.isEnabled:
-            color = UserSettings.Get(group='modeler', key='disabled',
-                                     subkey='color')
-        elif self.isValid:
-            color = UserSettings.Get(group='modeler', key='action',
-                                     subkey=('color', 'valid'))
-        else:
-            color = UserSettings.Get(group='modeler', key='action',
-                                     subkey=('color', 'invalid'))
-        
-        wxColor = wx.Color(color[0], color[1], color[2])
-        self.SetBrush(wx.Brush(wxColor))
-        
-    def _setPen(self):
-        """!Set pen"""
-        if self.isParameterized:
-            width = int(UserSettings.Get(group='modeler', key='action',
-                                         subkey=('width', 'parameterized')))
-        else:
-            width = int(UserSettings.Get(group='modeler', key='action',
-                                         subkey=('width', 'default')))
-        pen = self.GetPen()
-        pen.SetWidth(width)
-        self.SetPen(pen)
-
-    def SetId(self, id):
-        """!Set id"""
-        self.id = id
-        cmd = self.task.getCmd(ignoreErrors = True)
-        if cmd and len(cmd) > 0:
-            self.ClearText()
-            self.AddText('(%d) %s' % (self.id, cmd[0]))
-        else:
-            self.AddText('(%d) <<%s>>' % (self.id, _("unknown")))
-        
-    def SetProperties(self, params, propwin):
-        """!Record properties dialog"""
-        self.task.params = params['params']
-        self.task.flags  = params['flags']
-        self.propWin = propwin
-
-    def GetPropDialog(self):
-        """!Get properties dialog"""
-        return self.propWin
-
-    def GetLog(self, string = True):
-        """!Get logging info"""
-        cmd = self.task.getCmd(ignoreErrors = True, ignoreRequired = True)
-        
-        # substitute variables
-        variables = self.parent.GetVariables()
-        fparams = self.parent.GetVariables(params = True)
-        params = None
-        for values in fparams.itervalues():
-            params = values['params']
-            break
-        
-        for variable in variables:
-            pattern= re.compile('%' + variable)
-            value = None
-            if params:
-                for p in params:
-                    if variable == p.get('name', ''):
-                        value = p.get('value', '')
-                        break
-            if not value:
-                value = variables[variable].get('value', '')
-            
-            for idx in range(len(cmd)):
-                if pattern.search(cmd[idx]):
-                    if value:
-                        cmd[idx] = pattern.sub(value, cmd[idx])
-                    else:
-                        self.isValid = False
-                    break
-                idx += 1
-        
-        if string:
-            if cmd is None:
-                return ''
-            else:
-                return ' '.join(cmd)
-        
-        return cmd
-    
-    def GetName(self):
-        """!Get name"""
-        cmd = self.task.getCmd(ignoreErrors = True)
-        if cmd and len(cmd) > 0:
-            return cmd[0]
-        
-        return _('unknown')
-
-    def GetParams(self, dcopy = False):
-        """!Get dictionary of parameters"""
-        if dcopy:
-            return copy.deepcopy(self.task.get_options())
-        
-        return self.task.get_options()
-
-    def GetTask(self):
-        """!Get grassTask instance"""
-        return self.task
-    
-    def SetParams(self, params):
-        """!Set dictionary of parameters"""
-        self.task.params = params['params']
-        self.task.flags  = params['flags']
-        
-    def MergeParams(self, params):
-        """!Merge dictionary of parameters"""
-        if 'flags' in params:
-            for f in params['flags']:
-                self.task.set_flag(f['name'],
-                                   f.get('value', False))
-        if 'params' in params:
-            for p in params['params']:
-                self.task.set_param(p['name'],
-                                    p.get('value', ''))
-        
-    def SetValid(self, isvalid):
-        """!Set instance to be valid/invalid"""
-        self.isValid = isvalid
-        self._setBrush()
-        
-    def SetParameterized(self, isparameterized):
-        """!Set action parameterized"""
-        self.isParameterized = isparameterized
-        if self.parent.GetCanvas():                
-            self._setPen()
-        
-    def IsParameterized(self):
-        """!Check if action is parameterized"""
-        return self.isParameterized
-    
-    def FindData(self, name):
-        """!Find data item by name"""
-        for rel in self.GetRelations():
-            data = rel.GetData()
-            if name == rel.GetName() and name in data.GetName():
-                return data
-        
-        return None
-
-    def Update(self, running = False):
-        """!Update action"""
-        if running:
-            self._setBrush(running = True)
-        else:
-            self._setBrush()
-        self._setPen()
-
-    def OnDraw(self, dc):
-        """!Draw action in canvas"""
-        self._setBrush()
-        self._setPen()
-        ogl.RectangleShape.OnDraw(self, dc)
-    
-class ModelData(ModelObject, ogl.EllipseShape):
-    def __init__(self, parent, x, y, value = '', prompt = '', width = None, height = None):
-        """Data item class
-        
-        @param parent window parent
-        @param x, y   position of the shape
-        @param fname, tname list of parameter names from / to
-        @param value  value
-        @param prompt type of GIS element
-        @param width,height dimension of the shape
-        """
-        ModelObject.__init__(self)
-        
-        self.parent  = parent
-        self.value   = value
-        self.prompt  = prompt
-        self.intermediate = False
-        self.propWin = None
-        if not width:
-            width = UserSettings.Get(group='modeler', key='data', subkey=('size', 'width'))
-        if not height:
-            height = UserSettings.Get(group='modeler', key='data', subkey=('size', 'height'))
-        
-        if self.parent.GetCanvas():
-            ogl.EllipseShape.__init__(self, width, height)
-            
-            self.SetCanvas(self.parent)
-            self.SetX(x)
-            self.SetY(y)
-            self.SetPen(wx.BLACK_PEN)
-            self._setBrush()
-            
-            self._setText()
-            
-    def IsIntermediate(self):
-        """!Checks if data item is intermediate"""
-        return self.intermediate
-    
-    def SetIntermediate(self, im):
-        """!Set intermediate flag"""
-        self.intermediate = im
-  
-    def OnDraw(self, dc):
-        pen = self.GetPen()
-        pen.SetWidth(1)
-        if self.intermediate:
-            pen.SetStyle(wx.SHORT_DASH)
-        else:
-            pen.SetStyle(wx.SOLID)
-        self.SetPen(pen)
-        
-        ogl.EllipseShape.OnDraw(self, dc)
-        
-    def GetLog(self, string = True):
-        """!Get logging info"""
-        name = list()
-        for rel in self.GetRelations():
-            name.append(rel.GetName())
-        if name:
-            return '/'.join(name) + '=' + self.value + ' (' + self.prompt + ')'
-        else:
-            return self.value + ' (' + self.prompt + ')'
-
-    def GetName(self):
-        """!Get list of names"""
-        name = list()
-        for rel in self.GetRelations():
-            name.append(rel.GetName())
-        
-        return name
-    
-    def GetPrompt(self):
-        """!Get prompt"""
-        return self.prompt
-
-    def SetPrompt(self, prompt):
-        """!Set prompt
-        
-        @param prompt
-        """
-        self.prompt = prompt
-        
-    def GetValue(self):
-        """!Get value"""
-        return self.value
-
-    def SetValue(self, value):
-        """!Set value
-
-        @param value
-        """
-        self.value = value
-        self._setText()
-        for direction in ('from', 'to'):
-            for rel in self.GetRelations(direction):
-                if direction == 'from':
-                    action = rel.GetTo()
-                else:
-                    action = rel.GetFrom()
-                
-                task = menuform.GUI(show = None).ParseCommand(cmd = action.GetLog(string = False))
-                task.set_param(rel.GetName(), self.value)
-                action.SetParams(params = task.get_options())
-        
-    def GetPropDialog(self):
-        """!Get properties dialog"""
-        return self.propWin
-
-    def SetPropDialog(self, win):
-        """!Get properties dialog"""
-        self.propWin = win
-
-    def _setBrush(self):
-        """!Set brush"""
-        if self.prompt == 'raster':
-            color = UserSettings.Get(group = 'modeler', key = 'data',
-                                     subkey = ('color', 'raster'))
-        elif self.prompt == 'raster3d':
-            color = UserSettings.Get(group = 'modeler', key = 'data',
-                                     subkey = ('color', 'raster3d'))
-        elif self.prompt == 'vector':
-            color = UserSettings.Get(group = 'modeler', key = 'data',
-                                     subkey = ('color', 'vector'))
-        else:
-            color = UserSettings.Get(group = 'modeler', key = 'action',
-                                     subkey = ('color', 'invalid'))
-        wxColor = wx.Color(color[0], color[1], color[2])
-        self.SetBrush(wx.Brush(wxColor))
-        
-    def _setPen(self):
-        """!Set pen"""
-        isParameterized = False
-        for rel in self.GetRelations('from'):
-            if rel.GetTo().IsParameterized():
-                isParameterized = True
-                break
-        if not isParameterized:
-            for rel in self.GetRelations('to'):
-                if rel.GetFrom().IsParameterized():
-                    isParameterized = True
-                    break
-
-        if isParameterized:
-            width = int(UserSettings.Get(group = 'modeler', key = 'action',
-                                         subkey = ('width', 'parameterized')))
-        else:
-            width = int(UserSettings.Get(group = 'modeler', key = 'action',
-                                         subkey = ('width', 'default')))
-        pen = self.GetPen()
-        pen.SetWidth(width)
-        self.SetPen(pen)
-        
-    def _setText(self):
-        """!Update text"""
-        self.ClearText()
-        name = []
-        for rel in self.GetRelations():
-            name.append(rel.GetName())
-        self.AddText('/'.join(name))
-        if self.value:
-            self.AddText(self.value)
-        else:
-            self.AddText(_('<not defined>'))
-        
-    def Update(self):
-        """!Update action"""
-        self._setBrush()
-        self._setPen()
-        self._setText()
-        
-class ModelDataDialog(ElementDialog):
-    """!Data item properties dialog"""
-    def __init__(self, parent, shape, id = wx.ID_ANY, title = _("Data properties"),
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER):
-        self.parent = parent
-        self.shape = shape
-        
-        label, etype = self._getLabel()
-        ElementDialog.__init__(self, parent, title, label = label, etype = etype)
-                
-        self.element = gselect.Select(parent = self.panel,
-                                      type = prompt)
-        self.element.SetValue(shape.GetValue())
-        
-        self.Bind(wx.EVT_BUTTON, self.OnOK,     self.btnOK)
-        self.Bind(wx.EVT_BUTTON, self.OnCancel, self.btnCancel)
-        
-        self.PostInit()
-        
-        if shape.GetValue():
-            self.btnOK.Enable()
-        
-        self._layout()
-        self.SetMinSize(self.GetSize())
-        
-    def _getLabel(self):
-        etype = False
-        prompt = self.shape.GetPrompt()
-        if prompt == 'raster':
-            label = _('Name of raster map:')
-        elif prompt == 'vector':
-            label = _('Name of vector map:')
-        else:
-            etype = True
-            label = _('Name of element:')
-
-        return label, etype
-    
-    def _layout(self):
-        """!Do layout"""
-        self.dataSizer.Add(self.element, proportion=0,
-                      flag=wx.EXPAND | wx.ALL, border=1)
-        
-        self.panel.SetSizer(self.sizer)
-        self.sizer.Fit(self)
-
-    def OnOK(self, event):
-        """!Ok pressed"""
-        self.shape.SetValue(self.GetElement())
-        if self.etype:
-            elem = self.GetType()
-            if elem == 'rast':
-                self.shape.SetPrompt('raster')
-            elif elem == 'vect':
-                self.shape.SetPrompt('raster')
-        
-        self.parent.canvas.Refresh()
-        self.parent.SetStatusText('', 0)
-        self.shape.SetPropDialog(None)
-        
-        if self.IsModal():
-            event.Skip() 
-        else:
-            self.Destroy()
-    
-    def OnCancel(self, event):
-        """!Cancel pressed"""
-        self.shape.SetPropDialog(None)
-        if self.IsModal():
-            event.Skip()
-        else:
-            self.Destroy()
-        
-class ModelEvtHandler(ogl.ShapeEvtHandler):
-    """!Model event handler class"""
-    def __init__(self, log, frame):
-        ogl.ShapeEvtHandler.__init__(self)
-        self.log = log
-        self.frame = frame
-        self.x = self.y = None
-        
-    def OnLeftClick(self, x, y, keys = 0, attachment = 0):
-        """!Left mouse button pressed -> select item & update statusbar"""
-        shape = self.GetShape()
-        canvas = shape.GetCanvas()
-        dc = wx.ClientDC(canvas)
-        canvas.PrepareDC(dc)
-        
-        if hasattr(self.frame, 'defineRelation'):
-            drel = self.frame.defineRelation
-            if drel['from'] is None:
-                drel['from'] = shape
-            elif drel['to'] is None:
-                drel['to'] = shape
-                rel = ModelRelation(parent = self.frame, fromShape = drel['from'],
-                                    toShape = drel['to'])
-                dlg = ModelRelationDialog(parent = self.frame,
-                                          shape = rel)
-                if dlg.IsValid():
-                    ret = dlg.ShowModal()
-                    if ret == wx.ID_OK:
-                        option = dlg.GetOption()
-                        rel.SetName(option)
-                        drel['from'].AddRelation(rel)
-                        drel['to'].AddRelation(rel)
-                        drel['from'].Update()
-                        params = { 'params' : [{ 'name' : option,
-                                                 'value' : drel['from'].GetValue()}] }
-                        drel['to'].MergeParams(params)
-                        self.frame.AddLine(rel)
-                
-                    dlg.Destroy()
-                del self.frame.defineRelation
-        
-        if shape.Selected():
-            shape.Select(False, dc)
-        else:
-            redraw = False
-            shapeList = canvas.GetDiagram().GetShapeList()
-            toUnselect = list()
-            
-            for s in shapeList:
-                if s.Selected():
-                    toUnselect.append(s)
-            
-            shape.Select(True, dc)
-            
-            for s in toUnselect:
-                s.Select(False, dc)
-                
-        canvas.Refresh(False)
-
-        if hasattr(shape, "GetLog"):
-            self.log.SetStatusText(shape.GetLog(), 0)
-        else:
-            self.log.SetStatusText('', 0)
-        
-    def OnLeftDoubleClick(self, x, y, keys = 0, attachment = 0):
-        """!Left mouse button pressed (double-click) -> show properties"""
-        self.OnProperties()
-        
-    def OnProperties(self, event = None):
-        """!Show properties dialog"""
-        self.frame.ModelChanged()
-        shape = self.GetShape()
-        if isinstance(shape, ModelAction):
-            module = menuform.GUI(parent = self.frame, show = True).ParseCommand(shape.GetLog(string = False),
-                                                                                 completed = (self.frame.GetOptData, shape, shape.GetParams()))
-        
-        elif isinstance(shape, ModelData):
-            dlg = ModelDataDialog(parent = self.frame, shape = shape)
-            shape.SetPropDialog(dlg)
-            dlg.CentreOnParent()
-            dlg.Show()
-        
-        elif isinstance(shape, ModelLoop):
-            dlg = ModelLoopDialog(parent = self.frame, shape = shape)
-            dlg.CentreOnParent()
-            if dlg.ShowModal() == wx.ID_OK:
-                shape.SetText(dlg.GetCondition())
-                alist = list()
-                ids = dlg.GetItems()
-                for aId in ids['unchecked']:
-                    action = self.frame.GetModel().GetItem(aId)
-                    action.UnSetBlock(shape)
-                for aId in ids['checked']:
-                    action = self.frame.GetModel().GetItem(aId)
-                    action.SetBlock(shape)
-                    if action:
-                        alist.append(action)
-                shape.SetItems(alist)
-                self.frame.DefineLoop(shape)
-            self.frame.GetCanvas().Refresh()
-            
-            dlg.Destroy()
-        
-        elif isinstance(shape, ModelCondition):
-            dlg = ModelConditionDialog(parent = self.frame, shape = shape)
-            dlg.CentreOnParent()
-            if dlg.ShowModal() == wx.ID_OK:
-                shape.SetText(dlg.GetCondition())
-                ids = dlg.GetItems()
-                for b in ids.keys():
-                    alist = list()
-                    for aId in ids[b]['unchecked']:
-                        action = self.frame.GetModel().GetItem(aId)
-                        action.UnSetBlock(shape)
-                    for aId in ids[b]['checked']:
-                        action = self.frame.GetModel().GetItem(aId)
-                        action.SetBlock(shape)
-                        if action:
-                            alist.append(action)
-                    shape.SetItems(alist, branch = b)
-                self.frame.DefineCondition(shape)
-            self.frame.GetCanvas().Refresh()
-            
-            dlg.Destroy()
-                   
-    def OnBeginDragLeft(self, x, y, keys = 0, attachment = 0):
-        """!Drag shape (begining)"""
-        self.frame.ModelChanged()
-        if self._previousHandler:
-            self._previousHandler.OnBeginDragLeft(x, y, keys, attachment)
-        
-    def OnEndDragLeft(self, x, y, keys = 0, attachment = 0):
-        """!Drag shape (end)"""
-        if self._previousHandler:
-            self._previousHandler.OnEndDragLeft(x, y, keys, attachment)
-        
-        shape = self.GetShape()
-        if isinstance(shape, ModelLoop):
-            self.frame.DefineLoop(shape)
-        elif isinstance(shape, ModelCondition):
-            self.frame.DefineCondition(shape)
-        
-        for mo in shape.GetBlock():
-            if isinstance(mo, ModelLoop):
-                self.frame.DefineLoop(mo)
-            elif isinstance(mo, ModelCondition):
-                self.frame.DefineCondition(mo)
-        
-    def OnEndSize(self, x, y):
-        """!Resize shape"""
-        self.frame.ModelChanged()
-        if self._previousHandler:
-            self._previousHandler.OnEndSize(x, y)
-        
-    def OnRightClick(self, x, y, keys = 0, attachment = 0):
-        """!Right click -> pop-up menu"""
-        if not hasattr (self, "popupID"):
-            self.popupID = dict()
-            for key in ('remove', 'enable', 'addPoint',
-                        'delPoint', 'intermediate', 'props', 'id'):
-                self.popupID[key] = wx.NewId()
-        
-        # record coordinates
-        self.x = x
-        self.y = y
-        
-        shape = self.GetShape()
-        popupMenu = wx.Menu()
-        popupMenu.Append(self.popupID['remove'], text=_('Remove'))
-        self.frame.Bind(wx.EVT_MENU, self.OnRemove, id = self.popupID['remove'])
-        if isinstance(shape, ModelAction) or isinstance(shape, ModelLoop):
-            if shape.IsEnabled():
-                popupMenu.Append(self.popupID['enable'], text=_('Disable'))
-                self.frame.Bind(wx.EVT_MENU, self.OnDisable, id = self.popupID['enable'])
-            else:
-                popupMenu.Append(self.popupID['enable'], text=_('Enable'))
-                self.frame.Bind(wx.EVT_MENU, self.OnEnable, id = self.popupID['enable'])
-        
-        if isinstance(shape, ModelRelation):
-            popupMenu.AppendSeparator()
-            popupMenu.Append(self.popupID['addPoint'], text=_('Add control point'))
-            self.frame.Bind(wx.EVT_MENU, self.OnAddPoint, id = self.popupID['addPoint'])
-            popupMenu.Append(self.popupID['delPoint'], text=_('Remove control point'))
-            self.frame.Bind(wx.EVT_MENU, self.OnRemovePoint, id = self.popupID['delPoint'])
-            if len(shape.GetLineControlPoints()) == 2:
-                popupMenu.Enable(self.popupID['delPoint'], False)
-        
-        if isinstance(shape, ModelData) and '@' not in shape.GetValue():
-            popupMenu.AppendSeparator()
-            popupMenu.Append(self.popupID['intermediate'], text=_('Intermediate'),
-                             kind = wx.ITEM_CHECK)
-            if self.GetShape().IsIntermediate():
-                popupMenu.Check(self.popupID['intermediate'], True)
-            
-            self.frame.Bind(wx.EVT_MENU, self.OnIntermediate, id = self.popupID['intermediate'])
-            
-        if isinstance(shape, ModelData) or \
-                isinstance(shape, ModelAction) or \
-                isinstance(shape, ModelLoop):
-            popupMenu.AppendSeparator()
-            popupMenu.Append(self.popupID['props'], text=_('Properties'))
-            self.frame.Bind(wx.EVT_MENU, self.OnProperties, id = self.popupID['props'])
-        
-        if isinstance(shape, ModelAction):
-            popupMenu.Append(self.popupID['id'], text=_('Change ID'))
-            self.frame.Bind(wx.EVT_MENU, self.OnChangeId, id = self.popupID['id'])
-        
-        self.frame.PopupMenu(popupMenu)
-        popupMenu.Destroy()
-
-    def OnChangeId(self, event):
-        """!Change action id"""
-        pass
-    
-    def OnDisable(self, event):
-        """!Disable action"""
-        self._onEnable(False)
-        
-    def OnEnable(self, event):
-        """!Disable action"""
-        self._onEnable(True)
-        
-    def _onEnable(self, enable):
-        shape = self.GetShape()
-        shape.Enable(enable)
-        self.frame.ModelChanged()
-        self.frame.canvas.Refresh()
-        
-    def OnAddPoint(self, event):
-        """!Add control point"""
-        shape = self.GetShape()
-        shape.InsertLineControlPoint(point = wx.RealPoint(self.x, self.y))
-        shape.ResetShapes()
-        shape.Select(True)
-        self.frame.ModelChanged()
-        self.frame.canvas.Refresh()
-        
-    def OnRemovePoint(self, event):
-        """!Remove control point"""
-        shape = self.GetShape()
-        shape.DeleteLineControlPoint()
-        shape.Select(False)
-        shape.Select(True)
-        self.frame.ModelChanged()
-        self.frame.canvas.Refresh()
-        
-    def OnIntermediate(self, event):
-        """!Mark data as intermediate"""
-        self.frame.ModelChanged()
-        shape = self.GetShape()
-        shape.SetIntermediate(event.IsChecked())
-        self.frame.canvas.Refresh()
-
-    def OnRemove(self, event):
-        """!Remove shape
-        """
-        self.frame.GetCanvas().RemoveSelected()
-        self.frame.itemPanel.Update()
-        
-class ModelSearchDialog(wx.Dialog):
-    def __init__(self, parent, id = wx.ID_ANY, title = _("Add new GRASS module to the model"),
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
-        """!Graphical modeler module search window
-        
-        @param parent parent window
-        @param id window id
-        @param title window title
-        @param kwargs wx.Dialogs' arguments
-        """
-        self.parent = parent
-        
-        wx.Dialog.__init__(self, parent = parent, id = id, title = title, **kwargs)
-        self.SetName("ModelerDialog")
-        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-        
-        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
-        
-        self.cmdBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                   label=" %s " % _("Command"))
-        
-        self.cmd_prompt = prompt.GPromptSTC(parent = self)
-        self.search = SearchModuleWindow(parent = self.panel, cmdPrompt = self.cmd_prompt, showTip = True)
-        wx.CallAfter(self.cmd_prompt.SetFocus)
-        
-        # get commands
-        items = self.cmd_prompt.GetCommandItems()
-        
-        self.btnCancel = wx.Button(self.panel, wx.ID_CANCEL)
-        self.btnOk     = wx.Button(self.panel, wx.ID_OK)
-        self.btnOk.SetDefault()
-        self.btnOk.Enable(False)
-
-        self.cmd_prompt.Bind(wx.EVT_KEY_UP, self.OnText)
-        self.search.searchChoice.Bind(wx.EVT_CHOICE, self.OnText)
-        self.Bind(wx.EVT_BUTTON, self.OnOk, self.btnOk)
-        
-        self._layout()
-        
-        self.SetSize((500, 275))
-        
-    def _layout(self):
-        cmdSizer = wx.StaticBoxSizer(self.cmdBox, wx.VERTICAL)
-        cmdSizer.Add(item = self.cmd_prompt, proportion = 1,
-                     flag = wx.EXPAND)
-        
-        btnSizer = wx.StdDialogButtonSizer()
-        btnSizer.AddButton(self.btnCancel)
-        btnSizer.AddButton(self.btnOk)
-        btnSizer.Realize()
-        
-        mainSizer = wx.BoxSizer(wx.VERTICAL)
-        mainSizer.Add(item = self.search, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL, border = 3)
-        mainSizer.Add(item = cmdSizer, proportion = 1,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, border = 3)
-        mainSizer.Add(item = btnSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
-        
-        self.panel.SetSizer(mainSizer)
-        mainSizer.Fit(self.panel)
-        
-        self.Layout()
-
-    def GetPanel(self):
-        """!Get dialog panel"""
-        return self.panel
-
-    def GetCmd(self):
-        """!Get command"""
-        line = self.cmd_prompt.GetCurLine()[0].strip()
-        if len(line) == 0:
-            list()
-        
-        try:
-            cmd = utils.split(str(line))
-        except UnicodeError:
-            cmd = utils.split(utils.EncodeString((line)))
-            
-        return cmd
-    
-    def OnOk(self, event):
-        """!Button 'OK' pressed"""
-        self.btnOk.SetFocus()
-        cmd = self.GetCmd()
-        
-        if len(cmd) < 1:
-            GError(parent = self,
-                   message = _("Command not defined.\n\n"
-                               "Unable to add new action to the model."))
-            return
-        
-        if cmd[0] not in globalvar.grassCmd['all']:
-            GError(parent = self,
-                   message = _("'%s' is not a GRASS module.\n\n"
-                               "Unable to add new action to the model.") % cmd[0])
-            return
-        
-        self.EndModal(wx.ID_OK)
-        
-    def OnText(self, event):
-        """!Text in prompt changed"""
-        if self.cmd_prompt.AutoCompActive():
-            event.Skip()
-            return
-        
-        if isinstance(event, wx.KeyEvent):
-            entry = self.cmd_prompt.GetTextLeft()
-        elif isinstance(event, wx.stc.StyledTextEvent):
-            entry = event.GetText()
-        else:
-            entry = event.GetString()
-        
-        if entry:
-            self.btnOk.Enable()
-        else:
-            self.btnOk.Enable(False)
-            
-        event.Skip()
-        
-    def Reset(self):
-        """!Reset dialog"""
-        self.search.Reset()
-        self.cmd_prompt.OnCmdErase(None)
-        self.btnOk.Enable(False)
-        self.cmd_prompt.SetFocus()
-
-class ModelRelation(ogl.LineShape):
-    """!Data - action relation"""
-    def __init__(self, parent, fromShape, toShape, param = ''):
-        self.fromShape = fromShape
-        self.toShape   = toShape
-        self.param     = param
-        self.parent    = parent
-        
-        self._points    = None
-        
-        if self.parent.GetCanvas():        
-            ogl.LineShape.__init__(self)
-    
-    def __del__(self):
-        if self in self.fromShape.rels:
-            self.fromShape.rels.remove(self)
-        if self in self.toShape.rels:
-            self.toShape.rels.remove(self)
-        
-    def GetFrom(self):
-        """!Get id of 'from' shape"""
-        return self.fromShape
-    
-    def GetTo(self):
-        """!Get id of 'to' shape"""
-        return self.toShape
-    
-    def GetData(self):
-        """!Get related ModelData instance
-
-        @return ModelData instance
-        @return None if not found
-        """
-        if isinstance(self.fromShape, ModelData):
-            return self.fromShape
-        elif isinstance(self.toShape, ModelData):
-            return self.toShape
-        
-        return None
-    
-    def GetName(self):
-        """!Get parameter name"""
-        return self.param
-    
-    def ResetShapes(self):
-        """!Reset related objects"""
-        self.fromShape.ResetControlPoints()
-        self.toShape.ResetControlPoints()
-        self.ResetControlPoints()
-        
-    def SetControlPoints(self, points):
-        """!Set control points"""
-        self._points = points
-        
-    def GetControlPoints(self):
-        """!Get list of control points"""
-        return self._points
-    
-    def _setPen(self):
-        """!Set pen"""
-        pen = self.GetPen()
-        pen.SetWidth(1)
-        pen.SetStyle(wx.SOLID)
-        self.SetPen(pen)
-        
-    def OnDraw(self, dc):
-        """!Draw relation"""
-        self._setPen()
-        ogl.LineShape.OnDraw(self, dc)
-    
-    def SetName(self, param):
-        self.param = param
-        
-class ModelRelationDialog(wx.Dialog):
-    """!Relation properties dialog"""
-    def __init__(self, parent, shape, id = wx.ID_ANY, title = _("Relation properties"),
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
-        self.parent = parent
-        self.shape = shape
-        
-        options = self._getOptions()
-        if not options:
-            self.valid = False
-            return
-        
-        self.valid = True
-        wx.Dialog.__init__(self, parent, id, title, style = style, **kwargs)
-        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-        
-        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
-        
-        self.fromBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                    label = " %s " % _("From"))
-        self.toBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                  label = " %s " % _("To"))
-        
-        self.option = wx.ComboBox(parent = self.panel, id = wx.ID_ANY,
-                                  style = wx.CB_READONLY,
-                                  choices = options)
-        self.option.Bind(wx.EVT_COMBOBOX, self.OnOption)
-        
-        self.btnCancel = wx.Button(self.panel, wx.ID_CANCEL)
-        self.btnOk     = wx.Button(self.panel, wx.ID_OK)
-        self.btnOk.Enable(False)
-        
-        self._layout()
-
-    def _layout(self):
-        mainSizer = wx.BoxSizer(wx.VERTICAL)
-
-        fromSizer = wx.StaticBoxSizer(self.fromBox, wx.VERTICAL)
-        self._layoutShape(shape = self.shape.GetFrom(), sizer = fromSizer)
-        toSizer = wx.StaticBoxSizer(self.toBox, wx.VERTICAL)
-        self._layoutShape(shape = self.shape.GetTo(), sizer = toSizer)
-
-        btnSizer = wx.StdDialogButtonSizer()
-        btnSizer.AddButton(self.btnCancel)
-        btnSizer.AddButton(self.btnOk)
-        btnSizer.Realize()
-        
-        mainSizer.Add(item = fromSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL, border = 5)
-        mainSizer.Add(item = toSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
-        mainSizer.Add(item = btnSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
-        
-        self.panel.SetSizer(mainSizer)
-        mainSizer.Fit(self.panel)
-        
-        self.Layout()
-        self.SetSize(self.GetBestSize())
-        
-    def _layoutShape(self, shape, sizer):
-        if isinstance(shape, ModelData):
-            sizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
-                                           label = _("Data: %s") % shape.GetLog()),
-                      proportion = 1, flag = wx.EXPAND | wx.ALL,
-                      border = 5)
-        elif isinstance(shape, ModelAction):
-            gridSizer = wx.GridBagSizer (hgap = 5, vgap = 5)
-            gridSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
-                                               label = _("Command:")),
-                          pos = (0, 0))
-            gridSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
-                                               label = shape.GetName()),
-                          pos = (0, 1))
-            gridSizer.Add(item = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
-                                               label = _("Option:")),
-                          flag = wx.ALIGN_CENTER_VERTICAL,
-                          pos = (1, 0))
-            gridSizer.Add(item = self.option,
-                          pos = (1, 1))
-            sizer.Add(item = gridSizer,
-                      proportion = 1, flag = wx.EXPAND | wx.ALL,
-                      border = 5)
-            
-    def _getOptions(self):
-        """!Get relevant options"""
-        items = []
-        fromShape = self.shape.GetFrom()
-        if not isinstance(fromShape, ModelData):
-            GError(parent = self.parent,
-                   message = _("Relation doesn't start with data item.\n"
-                               "Unable to add relation."))
-            return items
-        
-        toShape = self.shape.GetTo()
-        if not isinstance(toShape, ModelAction):
-            GError(parent = self.parent,
-                   message = _("Relation doesn't point to GRASS command.\n"
-                               "Unable to add relation."))
-            return items
-        
-        prompt = fromShape.GetPrompt()
-        task = toShape.GetTask()
-        for p in task.get_options()['params']:
-            if p.get('prompt', '') == prompt and \
-                    'name' in p:
-                items.append(p['name'])
-        
-        if not items:
-            GError(parent = self.parent,
-                   message = _("No relevant option found.\n"
-                               "Unable to add relation."))
-        return items
-    
-    def GetOption(self):
-        """!Get selected option"""
-        return self.option.GetStringSelection()
-    
-    def IsValid(self):
-        """!Check if relation is valid"""
-        return self.valid
-    
-    def OnOption(self, event):
-        """!Set option"""
-        if event.GetString():
-            self.btnOk.Enable()
-        else:
-            self.btnOk.Enable(False)
-        
-class ProcessModelFile:
-    """!Process GRASS model file (gxm)"""
-    def __init__(self, tree):
-        """!A ElementTree handler for the GXM XML file, as defined in
-        grass-gxm.dtd.
-        """
-        self.tree = tree
-        self.root = self.tree.getroot()
-        
-        # list of actions, data
-        self.properties = dict()
-        self.variables  = dict() 
-        self.actions = list()
-        self.data    = list()
-        self.loops   = list()
-        self.conditions = list()
-        
-        self._processWindow()
-        self._processProperties()
-        self._processVariables()
-        self._processItems()
-        self._processData()
-        
-    def _filterValue(self, value):
-        """!Filter value
-        
-        @param value
-        """
-        value = value.replace('<', '<')
-        value = value.replace('>', '>')
-        
-        return value
-        
-    def _getNodeText(self, node, tag, default = ''):
-        """!Get node text"""
-        p = node.find(tag)
-        if p is not None:
-            if p.text:
-                return utils.normalize_whitespace(p.text)
-            else:
-                return ''
-        
-        return default
-    
-    def _processWindow(self):
-        """!Process window properties"""
-        node = self.root.find('window')
-        if node is None:
-            self.pos = self.size = None
-            return
-        
-        self.pos, self.size = self._getDim(node)
-        
-    def _processProperties(self):
-        """!Process model properties"""
-        node = self.root.find('properties')
-        if node is None:
-            return
-        for key in ('name', 'description', 'author'):
-            self._processProperty(node, key)
-        
-        for f in node.findall('flag'):
-            name = f.get('name', '')
-            if name == 'overwrite':
-                self.properties['overwrite'] = True
-        
-    def _processProperty(self, pnode, name):
-        """!Process given property"""
-        node = pnode.find(name)
-        if node is not None:
-            self.properties[name] = node.text
-        else:
-            self.properties[name] = ''
-
-    def _processVariables(self):
-        """!Process model variables"""
-        vnode = self.root.find('variables')
-        if vnode is None:
-            return
-        for node in vnode.findall('variable'):
-            name = node.get('name', '')
-            if not name:
-                continue # should not happen
-            self.variables[name] = { 'type' : node.get('type', 'string') }
-            for key in ('description', 'value'):
-                self._processVariable(node, name, key)
-        
-    def _processVariable(self, pnode, name, key):
-        """!Process given variable"""
-        node = pnode.find(key)
-        if node is not None:
-            if node.text:
-                self.variables[name][key] = node.text
-
-    def _processItems(self):
-        """!Process model items (actions, loops, conditions)"""
-        self._processActions()
-        self._processLoops()
-        self._processConditions()
-        
-    def _processActions(self):
-        """!Process model file"""
-        for action in self.root.findall('action'):
-            pos, size = self._getDim(action)
-            disabled  = False
-            
-            task = action.find('task')
-            if task is not None:
-                if task.find('disabled') is not None:
-                    disabled = True
-                task = self._processTask(task)
-            else:
-                task = None
-            
-            aId = int(action.get('id', -1))
-            
-            self.actions.append({ 'pos'      : pos,
-                                  'size'     : size,
-                                  'task'     : task,
-                                  'id'       : aId,
-                                  'disabled' : disabled })
-            
-    def _getDim(self, node):
-        """!Get position and size of shape"""
-        pos = size = None
-        posAttr = node.get('pos', None)
-        if posAttr:
-            posVal = map(int, posAttr.split(','))
-            try:
-                pos = (posVal[0], posVal[1])
-            except:
-                pos = None
-        
-        sizeAttr = node.get('size', None)
-        if sizeAttr:
-            sizeVal = map(int, sizeAttr.split(','))
-            try:
-                size = (sizeVal[0], sizeVal[1])
-            except:
-                size = None
-        
-        return pos, size        
-    
-    def _processData(self):
-        """!Process model file"""
-        for data in self.root.findall('data'):
-            pos, size = self._getDim(data)
-            param = data.find('data-parameter')
-            prompt = value = None
-            if param is not None:
-                prompt = param.get('prompt', None)
-                value = self._filterValue(self._getNodeText(param, 'value'))
-            
-            if data.find('intermediate') is None:
-                intermediate = False
-            else:
-                intermediate = True
-            
-            rels = list()
-            for rel in data.findall('relation'):
-                defrel = { 'id'  : int(rel.get('id', -1)),
-                           'dir' : rel.get('dir', 'to'),
-                           'name' : rel.get('name', '') }
-                points = list()
-                for point in rel.findall('point'):
-                    x = self._filterValue(self._getNodeText(point, 'x'))
-                    y = self._filterValue(self._getNodeText(point, 'y'))
-                    points.append((float(x), float(y)))
-                defrel['points'] = points
-                rels.append(defrel)
-            
-            self.data.append({ 'pos' : pos,
-                               'size': size,
-                               'prompt' : prompt,
-                               'value' : value,
-                               'intermediate' : intermediate,
-                               'rels' : rels })
-        
-    def _processTask(self, node):
-        """!Process task
-
-        @return grassTask instance
-        @return None on error
-        """
-        cmd = list()
-        parameterized = list()
-        
-        name = node.get('name', None)
-        if not name:
-            return None
-        
-        cmd.append(name)
-        
-        # flags
-        for f in node.findall('flag'):
-            flag = f.get('name', '')
-            if f.get('parameterized', '0') == '1':
-                parameterized.append(('flag', flag))
-                if f.get('value', '1') == '0':
-                    continue
-            if len(flag) > 1:
-                cmd.append('--' + flag)
-            else:
-                cmd.append('-' + flag)
-        # parameters
-        for p in node.findall('parameter'):
-            name = p.get('name', '')
-            if p.find('parameterized') is not None:
-                parameterized.append(('param', name))
-            cmd.append('%s=%s' % (name,
-                                  self._filterValue(self._getNodeText(p, 'value'))))
-        
-        task, err = menuform.GUI(show = None, checkError = True).ParseCommand(cmd = cmd)
-        if err:
-            GWarning(os.linesep.join(err))
-        
-        for opt, name in parameterized:
-            if opt == 'flag':
-                task.set_flag(name, True, element = 'parameterized')
-            else:
-                task.set_param(name, True, element = 'parameterized')
-        
-        return task
-
-    def _processLoops(self):
-        """!Process model loops"""
-        for node in self.root.findall('loop'):
-            pos, size = self._getDim(node)
-            text = self._filterValue(self._getNodeText(node, 'condition')).strip()
-            aid = list()
-            for anode in node.findall('item'):
-                try:
-                    aid.append(int(anode.text))
-                except ValueError:
-                    pass
-            
-            self.loops.append({ 'pos'     : pos,
-                                'size'    : size,
-                                'text'    : text,
-                                'id'      : int(node.get('id', -1)),
-                                'items'   : aid })
-        
-    def _processConditions(self):
-        """!Process model conditions"""
-        for node in self.root.findall('if-else'):
-            pos, size = self._getDim(node)
-            text = self._filterValue(self._getNodeText(node, 'condition')).strip()
-            aid = { 'if'   : list(),
-                    'else' : list() }
-            for b in aid.keys():
-                bnode = node.find(b)
-                if bnode is None:
-                    continue
-                for anode in bnode.findall('item'):
-                    try:
-                        aid[b].append(int(anode.text))
-                    except ValueError:
-                        pass
-            
-            self.conditions.append({ 'pos'     : pos,
-                                     'size'    : size,
-                                     'text'    : text,
-                                     'id'      : int(node.get('id', -1)),
-                                     'items'   : aid })
-        
-class WriteModelFile:
-    """!Generic class for writing model file"""
-    def __init__(self, fd, model):
-        self.fd         = fd
-        self.model      = model
-        self.properties = model.GetProperties()
-        self.variables  = model.GetVariables()
-        self.items      = model.GetItems()
-        
-        self.indent = 0
-        
-        self._header()
-        
-        self._window()
-        self._properties()
-        self._variables()
-        self._items()
-        
-        dataList = list()
-        for action in model.GetItems(objType = ModelAction):
-            for rel in action.GetRelations():
-                dataItem = rel.GetData()
-                if dataItem not in dataList:
-                    dataList.append(dataItem)
-        self._data(dataList)
-        
-        self._footer()
-
-    def _filterValue(self, value):
-        """!Make value XML-valid"""
-        value = value.replace('<', '<')
-        value = value.replace('>', '>')
-        
-        return value
-        
-    def _header(self):
-        """!Write header"""
-        self.fd.write('<?xml version="1.0" encoding="UTF-8"?>\n')
-        self.fd.write('<!DOCTYPE gxm SYSTEM "grass-gxm.dtd">\n')
-        self.fd.write('%s<gxm>\n' % (' ' * self.indent))
-        self.indent += 4
-                
-    def _footer(self):
-        """!Write footer"""
-        self.indent -= 4
-        self.fd.write('%s</gxm>\n' % (' ' * self.indent))
-
-    def _window(self):
-        """!Write window properties"""
-        canvas = self.model.GetCanvas()
-        if canvas is None:
-            return
-        win  = canvas.parent
-        pos  = win.GetPosition()
-        size = win.GetSize()
-        self.fd.write('%s<window pos="%d,%d" size="%d,%d" />\n' % \
-                          (' ' * self.indent, pos[0], pos[1], size[0], size[1]))
-        
-    def _properties(self):
-        """!Write model properties"""
-        self.fd.write('%s<properties>\n' % (' ' * self.indent))
-        self.indent += 4
-        if self.properties['name']:
-            self.fd.write('%s<name>%s</name>\n' % (' ' * self.indent, self.properties['name']))
-        if self.properties['description']:
-            self.fd.write('%s<description>%s</description>\n' % (' ' * self.indent,
-                                                                 utils.EncodeString(self.properties['description'])))
-        if self.properties['author']:
-            self.fd.write('%s<author>%s</author>\n' % (' ' * self.indent,
-                                                       utils.EncodeString(self.properties['author'])))
-        
-        if 'overwrite' in self.properties and \
-                self.properties['overwrite']:
-            self.fd.write('%s<flag name="overwrite" />\n' % (' ' * self.indent))
-        self.indent -= 4
-        self.fd.write('%s</properties>\n' % (' ' * self.indent))
-
-    def _variables(self):
-        """!Write model variables"""
-        if not self.variables:
-            return
-        self.fd.write('%s<variables>\n' % (' ' * self.indent))
-        self.indent += 4
-        for name, values in self.variables.iteritems():
-            self.fd.write('%s<variable name="%s" type="%s">\n' % \
-                              (' ' * self.indent, name, values['type']))
-            self.indent += 4
-            if 'value' in values:
-                self.fd.write('%s<value>%s</value>\n' % \
-                                  (' ' * self.indent, values['value']))
-            if 'description' in values:
-                self.fd.write('%s<description>%s</description>\n' % \
-                                  (' ' * self.indent, values['description']))
-            self.indent -= 4
-            self.fd.write('%s</variable>\n' % (' ' * self.indent))
-        self.indent -= 4
-        self.fd.write('%s</variables>\n' % (' ' * self.indent))
-        
-    def _items(self):
-        """!Write actions/loops/conditions"""
-        for item in self.items:
-            if isinstance(item, ModelAction):
-                self._action(item)
-            elif isinstance(item, ModelLoop):
-                self._loop(item)
-            elif isinstance(item, ModelCondition):
-                self._condition(item)
-        
-    def _action(self, action):
-        """!Write actions"""
-        self.fd.write('%s<action id="%d" name="%s" pos="%d,%d" size="%d,%d">\n' % \
-                          (' ' * self.indent, action.GetId(), action.GetName(), action.GetX(), action.GetY(),
-                           action.GetWidth(), action.GetHeight()))
-        self.indent += 4
-        self.fd.write('%s<task name="%s">\n' % (' ' * self.indent, action.GetLog(string = False)[0]))
-        self.indent += 4
-        if not action.IsEnabled():
-            self.fd.write('%s<disabled />\n' % (' ' * self.indent))
-        for key, val in action.GetParams().iteritems():
-            if key == 'flags':
-                for f in val:
-                    if f.get('value', False) or f.get('parameterized', False):
-                        if f.get('parameterized', False):
-                            if f.get('value', False) == False:
-                                self.fd.write('%s<flag name="%s" value="0" parameterized="1" />\n' %
-                                              (' ' * self.indent, f.get('name', '')))
-                            else:
-                                self.fd.write('%s<flag name="%s" parameterized="1" />\n' %
-                                              (' ' * self.indent, f.get('name', '')))
-                        else:
-                            self.fd.write('%s<flag name="%s" />\n' %
-                                          (' ' * self.indent, f.get('name', '')))
-            else: # parameter
-                for p in val:
-                    if not p.get('value', ''):
-                        continue
-                    self.fd.write('%s<parameter name="%s">\n' %
-                                  (' ' * self.indent, p.get('name', '')))
-                    self.indent += 4
-                    if p.get('parameterized', False):
-                        self.fd.write('%s<parameterized />\n' % (' ' * self.indent))
-                    self.fd.write('%s<value>%s</value>\n' %
-                                  (' ' * self.indent, self._filterValue(p.get('value', ''))))
-                    self.indent -= 4
-                    self.fd.write('%s</parameter>\n' % (' ' * self.indent))
-        self.indent -= 4
-        self.fd.write('%s</task>\n' % (' ' * self.indent))
-        self.indent -= 4
-        self.fd.write('%s</action>\n' % (' ' * self.indent))
-                
-    def _data(self, dataList):
-        """!Write data"""
-        for data in dataList:
-            self.fd.write('%s<data pos="%d,%d" size="%d,%d">\n' % \
-                              (' ' * self.indent, data.GetX(), data.GetY(),
-                               data.GetWidth(), data.GetHeight()))
-            self.indent += 4
-            self.fd.write('%s<data-parameter prompt="%s">\n' % \
-                              (' ' * self.indent, data.GetPrompt()))
-            self.indent += 4
-            self.fd.write('%s<value>%s</value>\n' %
-                          (' ' * self.indent, self._filterValue(data.GetValue())))
-            self.indent -= 4
-            self.fd.write('%s</data-parameter>\n' % (' ' * self.indent))
-            
-            if data.IsIntermediate():
-                self.fd.write('%s<intermediate />\n' % (' ' * self.indent))
-
-            # relations
-            for ft in ('from', 'to'):
-                for rel in data.GetRelations(ft):
-                    if ft == 'from':
-                        aid = rel.GetTo().GetId()
-                    else:
-                        aid  = rel.GetFrom().GetId()
-                    self.fd.write('%s<relation dir="%s" id="%d" name="%s">\n' % \
-                                      (' ' * self.indent, ft, aid, rel.GetName()))
-                    self.indent += 4
-                    for point in rel.GetLineControlPoints()[1:-1]:
-                        self.fd.write('%s<point>\n' % (' ' * self.indent))
-                        self.indent += 4
-                        x, y = point.Get()
-                        self.fd.write('%s<x>%d</x>\n' % (' ' * self.indent, int(x)))
-                        self.fd.write('%s<y>%d</y>\n' % (' ' * self.indent, int(y)))
-                        self.indent -= 4
-                        self.fd.write('%s</point>\n' % (' ' * self.indent))
-                    self.indent -= 4
-                    self.fd.write('%s</relation>\n' % (' ' * self.indent))
-                
-            self.indent -= 4
-            self.fd.write('%s</data>\n' % (' ' * self.indent))
-
-    def _loop(self, loop):
-        """!Write loops"""
-        self.fd.write('%s<loop id="%d" pos="%d,%d" size="%d,%d">\n' % \
-                          (' ' * self.indent, loop.GetId(), loop.GetX(), loop.GetY(),
-                           loop.GetWidth(), loop.GetHeight()))
-        text = loop.GetText()
-        self.indent += 4
-        if text:
-            self.fd.write('%s<condition>%s</condition>\n' %
-                          (' ' * self.indent, self._filterValue(text)))
-        for item in loop.GetItems():
-            self.fd.write('%s<item>%d</item>\n' %
-                          (' ' * self.indent, item.GetId()))
-        self.indent -= 4
-        self.fd.write('%s</loop>\n' % (' ' * self.indent))
-
-    def _condition(self, condition):
-        """!Write conditions"""
-        bbox = condition.GetBoundingBoxMin()
-        self.fd.write('%s<if-else id="%d" pos="%d,%d" size="%d,%d">\n' % \
-                          (' ' * self.indent, condition.GetId(), condition.GetX(), condition.GetY(),
-                           bbox[0], bbox[1]))
-        text = condition.GetText()
-        self.indent += 4
-        if text:
-            self.fd.write('%s<condition>%s</condition>\n' %
-                          (' ' * self.indent, self._filterValue(text)))
-        items = condition.GetItems()
-        for b in items.keys():
-            if len(items[b]) < 1:
-                continue
-            self.fd.write('%s<%s>\n' % (' ' * self.indent, b))
-            self.indent += 4
-            for item in items[b]:
-                self.fd.write('%s<item>%d</item>\n' %
-                              (' ' * self.indent, item.GetId()))
-            self.indent -= 4
-            self.fd.write('%s</%s>\n' % (' ' * self.indent, b))
-        
-        self.indent -= 4
-        self.fd.write('%s</if-else>\n' % (' ' * self.indent))
-        
-class PreferencesDialog(PreferencesBaseDialog):
-    """!User preferences dialog"""
-    def __init__(self, parent, settings = UserSettings,
-                 title = _("Modeler settings")):
-        
-        PreferencesBaseDialog.__init__(self, parent = parent, title = title,
-                                       settings = settings)
-        
-        # create notebook pages
-        self._createGeneralPage(self.notebook)
-        self._createActionPage(self.notebook)
-        self._createDataPage(self.notebook)
-        self._createLoopPage(self.notebook)
-        
-        self.SetMinSize(self.GetBestSize())
-        self.SetSize(self.size)
-
-    def _createGeneralPage(self, notebook):
-        """!Create notebook page for action settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
-        notebook.AddPage(page = panel, text = _("General"))
-        
-        # colors
-        border = wx.BoxSizer(wx.VERTICAL)
-        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                              label = " %s " % _("Item properties"))
-        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        
-        gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
-        gridSizer.AddGrowableCol(0)
-        
-        row = 0
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                           label = _("Disabled:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        rColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
-                                   colour = self.settings.Get(group='modeler', key='disabled', subkey='color'),
-                                   size = globalvar.DIALOG_COLOR_SIZE)
-        rColor.SetName('GetColour')
-        self.winId['modeler:disabled:color'] = rColor.GetId()
-        
-        gridSizer.Add(item = rColor,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-        
-        sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
-        border.Add(item = sizer, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
-
-        panel.SetSizer(border)
-        
-        return panel
-
-    def _createActionPage(self, notebook):
-        """!Create notebook page for action settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
-        notebook.AddPage(page = panel, text = _("Action"))
-        
-        # colors
-        border = wx.BoxSizer(wx.VERTICAL)
-        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                              label = " %s " % _("Color"))
-        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        
-        gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
-        gridSizer.AddGrowableCol(0)
-        
-        row = 0
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Valid:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        vColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
-                                   colour = self.settings.Get(group='modeler', key='action', subkey=('color', 'valid')),
-                                   size = globalvar.DIALOG_COLOR_SIZE)
-        vColor.SetName('GetColour')
-        self.winId['modeler:action:color:valid'] = vColor.GetId()
-        
-        gridSizer.Add(item = vColor,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-
-        row += 1
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Invalid:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        iColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
-                                   colour = self.settings.Get(group='modeler', key='action', subkey=('color', 'invalid')),
-                                   size = globalvar.DIALOG_COLOR_SIZE)
-        iColor.SetName('GetColour')
-        self.winId['modeler:action:color:invalid'] = iColor.GetId()
-        
-        gridSizer.Add(item = iColor,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-
-        row += 1
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Running:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        rColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
-                                   colour = self.settings.Get(group='modeler', key='action', subkey=('color', 'running')),
-                                   size = globalvar.DIALOG_COLOR_SIZE)
-        rColor.SetName('GetColour')
-        self.winId['modeler:action:color:running'] = rColor.GetId()
-        
-        gridSizer.Add(item = rColor,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-        
-        sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
-        border.Add(item = sizer, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
-        
-        # size
-        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                              label = " %s " % _("Shape size"))
-        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        
-        gridSizer = wx.GridBagSizer (hgap=3, vgap=3)
-        gridSizer.AddGrowableCol(0)
-
-        row = 0
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Width:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        
-        width = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
-                            min = 0, max = 500,
-                            initial = self.settings.Get(group='modeler', key='action', subkey=('size', 'width')))
-        width.SetName('GetValue')
-        self.winId['modeler:action:size:width'] = width.GetId()
-        
-        gridSizer.Add(item = width,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-
-        row += 1
-        gridSizer.Add(item = wx.StaticText(parent=panel, id=wx.ID_ANY,
-                                         label=_("Height:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos=(row, 0))
-        
-        height = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
-                             min = 0, max = 500,
-                             initial = self.settings.Get(group='modeler', key='action', subkey=('size', 'height')))
-        height.SetName('GetValue')
-        self.winId['modeler:action:size:height'] = height.GetId()
-        
-        gridSizer.Add(item = height,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-        
-        sizer.Add(item=gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5)
-        border.Add(item=sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3)
-                
-        panel.SetSizer(border)
-        
-        return panel
-
-    def _createDataPage(self, notebook):
-        """!Create notebook page for data settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
-        notebook.AddPage(page = panel, text = _("Data"))
-        
-        # colors
-        border = wx.BoxSizer(wx.VERTICAL)
-        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                              label = " %s " % _("Type"))
-        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        
-        gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
-        gridSizer.AddGrowableCol(0)
-        
-        row = 0
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Raster:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        rColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
-                                   colour = self.settings.Get(group='modeler', key='data', subkey=('color', 'raster')),
-                                   size = globalvar.DIALOG_COLOR_SIZE)
-        rColor.SetName('GetColour')
-        self.winId['modeler:data:color:raster'] = rColor.GetId()
-        
-        gridSizer.Add(item = rColor,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-
-        row += 1
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("3D raster:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        r3Color = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
-                                    colour = self.settings.Get(group='modeler', key='data', subkey=('color', 'raster3d')),
-                                    size = globalvar.DIALOG_COLOR_SIZE)
-        r3Color.SetName('GetColour')
-        self.winId['modeler:data:color:raster3d'] = r3Color.GetId()
-        
-        gridSizer.Add(item = r3Color,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-        
-        row += 1
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Vector:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        vColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
-                                   colour = self.settings.Get(group='modeler', key='data', subkey=('color', 'vector')),
-                                   size = globalvar.DIALOG_COLOR_SIZE)
-        vColor.SetName('GetColour')
-        self.winId['modeler:data:color:vector'] = vColor.GetId()
-        
-        gridSizer.Add(item = vColor,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-        
-        sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
-        border.Add(item = sizer, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
-
-        # size
-        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                              label = " %s " % _("Shape size"))
-        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        
-        gridSizer = wx.GridBagSizer (hgap=3, vgap=3)
-        gridSizer.AddGrowableCol(0)
-        
-        row = 0
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Width:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        
-        width = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
-                            min = 0, max = 500,
-                            initial = self.settings.Get(group='modeler', key='data', subkey=('size', 'width')))
-        width.SetName('GetValue')
-        self.winId['modeler:data:size:width'] = width.GetId()
-        
-        gridSizer.Add(item = width,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-
-        row += 1
-        gridSizer.Add(item = wx.StaticText(parent=panel, id=wx.ID_ANY,
-                                         label=_("Height:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos=(row, 0))
-        
-        height = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
-                             min = 0, max = 500,
-                             initial = self.settings.Get(group='modeler', key='data', subkey=('size', 'height')))
-        height.SetName('GetValue')
-        self.winId['modeler:data:size:height'] = height.GetId()
-        
-        gridSizer.Add(item = height,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-        
-        sizer.Add(item=gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5)
-        border.Add(item=sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3)
-        
-        panel.SetSizer(border)
-        
-        return panel
-
-    def _createLoopPage(self, notebook):
-        """!Create notebook page for loop settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
-        notebook.AddPage(page = panel, text = _("Loop"))
-        
-        # colors
-        border = wx.BoxSizer(wx.VERTICAL)
-        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                              label = " %s " % _("Color"))
-        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        
-        gridSizer = wx.GridBagSizer (hgap = 3, vgap = 3)
-        gridSizer.AddGrowableCol(0)
-        
-        row = 0
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Valid:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        vColor = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
-                                   colour = self.settings.Get(group='modeler', key='loop', subkey=('color', 'valid')),
-                                   size = globalvar.DIALOG_COLOR_SIZE)
-        vColor.SetName('GetColour')
-        self.winId['modeler:loop:color:valid'] = vColor.GetId()
-        
-        gridSizer.Add(item = vColor,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-        
-        sizer.Add(item = gridSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
-        border.Add(item = sizer, proportion = 0, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
-        
-        # size
-        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                              label = " %s " % _("Shape size"))
-        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        
-        gridSizer = wx.GridBagSizer (hgap=3, vgap=3)
-        gridSizer.AddGrowableCol(0)
-
-        row = 0
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Width:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 0))
-        
-        width = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
-                            min = 0, max = 500,
-                            initial = self.settings.Get(group='modeler', key='loop', subkey=('size', 'width')))
-        width.SetName('GetValue')
-        self.winId['modeler:loop:size:width'] = width.GetId()
-        
-        gridSizer.Add(item = width,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-
-        row += 1
-        gridSizer.Add(item = wx.StaticText(parent=panel, id=wx.ID_ANY,
-                                         label=_("Height:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos=(row, 0))
-        
-        height = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
-                             min = 0, max = 500,
-                             initial = self.settings.Get(group='modeler', key='loop', subkey=('size', 'height')))
-        height.SetName('GetValue')
-        self.winId['modeler:loop:size:height'] = height.GetId()
-        
-        gridSizer.Add(item = height,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 1))
-        
-        sizer.Add(item=gridSizer, proportion=1, flag=wx.ALL | wx.EXPAND, border=5)
-        border.Add(item=sizer, proportion=0, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3)
-                
-        panel.SetSizer(border)
-        
-        return panel
-
-    def OnApply(self, event):
-        """!Button 'Apply' pressed"""
-        PreferencesBaseDialog.OnApply(self, event)
-        
-        self.parent.GetModel().Update()
-        self.parent.GetCanvas().Refresh()
-
-    def OnSave(self, event):
-        """!Button 'Save' pressed"""
-        PreferencesBaseDialog.OnSave(self, event)
-        
-        self.parent.GetModel().Update()
-        self.parent.GetCanvas().Refresh()
-
-class PropertiesDialog(wx.Dialog):
-    """!Model properties dialog
-    """
-    def __init__(self, parent, id = wx.ID_ANY,
-                 title = _('Model properties'),
-                 size = (350, 400),
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER):
-        wx.Dialog.__init__(self, parent, id, title, size = size,
-                           style = style)
-        
-        self.metaBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
-                                    label=" %s " % _("Metadata"))
-        self.cmdBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
-                                   label=" %s " % _("Commands"))
-        
-        self.name = wx.TextCtrl(parent = self, id = wx.ID_ANY,
-                                size = (300, 25))
-        self.desc = wx.TextCtrl(parent = self, id = wx.ID_ANY,
-                                style = wx.TE_MULTILINE,
-                                size = (300, 50))
-        self.author = wx.TextCtrl(parent = self, id = wx.ID_ANY,
-                                size = (300, 25))
-        
-        # commands
-        self.overwrite = wx.CheckBox(parent = self, id=wx.ID_ANY,
-                                     label=_("Allow output files to overwrite existing files"))
-        self.overwrite.SetValue(UserSettings.Get(group='cmd', key='overwrite', subkey='enabled'))
-        
-        # buttons
-        self.btnOk     = wx.Button(self, wx.ID_OK)
-        self.btnCancel = wx.Button(self, wx.ID_CANCEL)
-        self.btnOk.SetDefault()
-        
-        self.btnOk.SetToolTipString(_("Apply properties"))
-        self.btnOk.SetDefault()
-        self.btnCancel.SetToolTipString(_("Close dialog and ignore changes"))
-        
-        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
-        
-        self._layout()
-
-    def _layout(self):
-        metaSizer = wx.StaticBoxSizer(self.metaBox, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(hgap = 3, vgap = 3)
-        gridSizer.AddGrowableCol(0)
-        gridSizer.AddGrowableRow(1)
-        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
-                                         label = _("Name:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (0, 0))
-        gridSizer.Add(item = self.name,
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
-                      pos = (0, 1))
-        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
-                                         label = _("Description:")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (1, 0))
-        gridSizer.Add(item = self.desc,
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
-                      pos = (1, 1))
-        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
-                                         label = _("Author(s):")),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL,
-                      pos = (2, 0))
-        gridSizer.Add(item = self.author,
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
-                      pos = (2, 1))
-        metaSizer.Add(item = gridSizer)
-        
-        cmdSizer = wx.StaticBoxSizer(self.cmdBox, wx.VERTICAL)
-        cmdSizer.Add(item = self.overwrite,
-                     flag = wx.EXPAND | wx.ALL, border = 3)
-        
-        btnStdSizer = wx.StdDialogButtonSizer()
-        btnStdSizer.AddButton(self.btnCancel)
-        btnStdSizer.AddButton(self.btnOk)
-        btnStdSizer.Realize()
-        
-        mainSizer = wx.BoxSizer(wx.VERTICAL)
-        mainSizer.Add(item=metaSizer, proportion=1,
-                      flag=wx.EXPAND | wx.ALL, border=5)
-        mainSizer.Add(item=cmdSizer, proportion=0,
-                      flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, border=5)
-        mainSizer.Add(item=btnStdSizer, proportion=0,
-                      flag=wx.EXPAND | wx.ALL | wx.ALIGN_RIGHT, border=5)
-        
-        self.SetSizer(mainSizer)
-        mainSizer.Fit(self)
-
-    def OnCloseWindow(self, event):
-        self.Hide()
-        
-    def GetValues(self):
-        """!Get values"""
-        return { 'name'        : self.name.GetValue(),
-                 'description' : self.desc.GetValue(),
-                 'author'      : self.author.GetValue(),
-                 'overwrite'   : self.overwrite.IsChecked() }
-    
-    def Init(self, prop):
-        """!Initialize dialog"""
-        self.name.SetValue(prop['name'])
-        self.desc.SetValue(prop['description'])
-        self.author.SetValue(prop['author'])
-        if 'overwrite' in prop:
-            self.overwrite.SetValue(prop['overwrite'])
-
-class ModelParamDialog(wx.Dialog):
-    def __init__(self, parent, params, id = wx.ID_ANY, title = _("Model parameters"),
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
-        """!Model parameters dialog
-        """
-        self.parent = parent
-        self.params = params
-        self.tasks  = list() # list of tasks/pages
-        
-        wx.Dialog.__init__(self, parent = parent, id = id, title = title, style = style, **kwargs)
-        
-        if globalvar.hasAgw:
-            self.notebook = FN.FlatNotebook(self, id = wx.ID_ANY,
-                                            agwStyle = FN.FNB_FANCY_TABS |
-                                            FN.FNB_BOTTOM |
-                                            FN.FNB_NO_NAV_BUTTONS |
-                                            FN.FNB_NO_X_BUTTON)
-        else:
-            self.notebook = FN.FlatNotebook(self, id = wx.ID_ANY,
-                                            style = FN.FNB_FANCY_TABS |
-                                            FN.FNB_BOTTOM |
-                                            FN.FNB_NO_NAV_BUTTONS |
-                                            FN.FNB_NO_X_BUTTON)
-        
-        panel = self._createPages()
-        wx.CallAfter(self.notebook.SetSelection, 0)
-        
-        self.btnCancel = wx.Button(parent = self, id = wx.ID_CANCEL)
-        self.btnRun    = wx.Button(parent = self, id = wx.ID_OK,
-                                   label = _("&Run"))
-        self.btnRun.SetDefault()
-        
-        self._layout()
-        
-        size = self.GetBestSize()
-        self.SetMinSize(size)
-        self.SetSize((size.width, size.height +
-                      panel.constrained_size[1] -
-                      panel.panelMinHeight))
-                
-    def _layout(self):
-        btnSizer = wx.StdDialogButtonSizer()
-        btnSizer.AddButton(self.btnCancel)
-        btnSizer.AddButton(self.btnRun)
-        btnSizer.Realize()
-        
-        mainSizer = wx.BoxSizer(wx.VERTICAL)
-        mainSizer.Add(item = self.notebook, proportion = 1,
-                      flag = wx.EXPAND)
-        mainSizer.Add(item=btnSizer, proportion=0,
-                      flag=wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
-        
-        self.SetSizer(mainSizer)
-        mainSizer.Fit(self)
-        
-    def _createPages(self):
-        """!Create for each parameterized module its own page"""
-        nameOrdered = [''] * len(self.params.keys())
-        for name, params in self.params.iteritems():
-            nameOrdered[params['idx']] =  name
-        for name in nameOrdered:
-            params = self.params[name]
-            panel = self._createPage(name, params)
-            self.notebook.AddPage(panel, text = name)
-        
-        return panel
-    
-    def _createPage(self, name, params):
-        """!Define notebook page"""
-        if name in globalvar.grassCmd['all']:
-            task = gtask.grassTask(name)
-        else:
-            task = gtask.grassTask()
-        task.flags  = params['flags']
-        task.params = params['params']
-        
-        panel = menuform.cmdPanel(parent = self, id = wx.ID_ANY, task = task)
-        self.tasks.append(task)
-        
-        return panel
-
-    def GetErrors(self):
-        """!Check for errors, get list of messages"""
-        errList = list()
-        for task in self.tasks:
-            errList += task.getCmdError()
-        
-        return errList
-    
-class ModelListCtrl(wx.ListCtrl,
-                    listmix.ListCtrlAutoWidthMixin,
-                    listmix.TextEditMixin,
-                    listmix.ColumnSorterMixin):
-    def __init__(self, parent, columns, id = wx.ID_ANY,
-                 style = wx.LC_REPORT | wx.BORDER_NONE |
-                 wx.LC_SORT_ASCENDING |wx.LC_HRULES |
-                 wx.LC_VRULES, **kwargs):
-        """!List of model variables"""
-        self.parent = parent
-        self.columns = columns
-        self.shape = None
-        try:
-            self.frame  = parent.parent
-        except AttributeError:
-            self.frame = None
-        
-        wx.ListCtrl.__init__(self, parent, id = id, style = style, **kwargs)
-        listmix.ListCtrlAutoWidthMixin.__init__(self)
-        listmix.TextEditMixin.__init__(self)
-        listmix.ColumnSorterMixin.__init__(self, 4)
-        
-        i = 0
-        for col in columns:
-            self.InsertColumn(i, col)
-            self.SetColumnWidth(i, wx.LIST_AUTOSIZE_USEHEADER)
-            i += 1
-        
-        self.itemDataMap = {} # requested by sorter
-        self.itemCount   = 0
-        
-        self.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT, self.OnBeginEdit)
-        self.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEndEdit)
-        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick)
-        self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightUp) #wxMSW
-        self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)            #wxGTK
-                
-    def OnBeginEdit(self, event):
-        """!Editing of item started"""
-        event.Allow()
-
-    def OnEndEdit(self, event):
-        """!Finish editing of item"""
-        pass
-    
-    def OnColClick(self, event):
-        """!Click on column header (order by)"""
-        event.Skip()
-
-class VariablePanel(wx.Panel):
-    def __init__(self, parent, id = wx.ID_ANY,
-                 **kwargs):
-        """!Manage model variables panel
-        """
-        self.parent = parent
-        
-        wx.Panel.__init__(self, parent = parent, id = id, **kwargs)
-        
-        self.listBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
-                                    label=" %s " % _("List of variables - right-click to delete"))
-        
-        self.list = VariableListCtrl(parent = self,
-                                     columns = [_("Name"), _("Data type"),
-                                                _("Default value"), _("Description")])
-        
-        # add new category
-        self.addBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
-                                   label = " %s " % _("Add new variable"))
-        self.name = wx.TextCtrl(parent = self, id = wx.ID_ANY)
-        wx.CallAfter(self.name.SetFocus)
-        self.type = wx.Choice(parent = self, id = wx.ID_ANY,
-                              choices = [_("integer"),
-                                         _("float"),
-                                         _("string"),
-                                         _("raster"),
-                                         _("vector")])
-        self.value = wx.TextCtrl(parent = self, id = wx.ID_ANY)
-        self.desc = wx.TextCtrl(parent = self, id = wx.ID_ANY)
-        
-        # buttons
-        self.btnAdd = wx.Button(parent = self, id = wx.ID_ADD)
-        self.btnAdd.SetToolTipString(_("Add new variable to the model"))
-        self.btnAdd.Enable(False)
-        
-        # bindings
-        self.name.Bind(wx.EVT_TEXT, self.OnText)
-        self.value.Bind(wx.EVT_TEXT, self.OnText)
-        self.desc.Bind(wx.EVT_TEXT, self.OnText)
-        self.btnAdd.Bind(wx.EVT_BUTTON, self.OnAdd)
-        
-        self._layout()
-
-    def _layout(self):
-        """!Layout dialog"""
-        listSizer = wx.StaticBoxSizer(self.listBox, wx.VERTICAL)
-        listSizer.Add(item = self.list, proportion = 1,
-                      flag = wx.EXPAND)
-        
-        addSizer = wx.StaticBoxSizer(self.addBox, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
-        gridSizer.AddGrowableCol(1)
-        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
-                                           label = "%s:" % _("Name")),
-                      flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (0, 0))
-        gridSizer.Add(item = self.name,
-                      pos = (0, 1),
-                      flag = wx.EXPAND)
-        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
-                                           label = "%s:" % _("Data type")),
-                      flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (0, 2))
-        gridSizer.Add(item = self.type,
-                      pos = (0, 3))
-        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
-                                           label = "%s:" % _("Default value")),
-                      flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (1, 0))
-        gridSizer.Add(item = self.value,
-                      pos = (1, 1), span = (1, 3),
-                      flag = wx.EXPAND)
-        gridSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
-                                           label = "%s:" % _("Description")),
-                      flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (2, 0))
-        gridSizer.Add(item = self.desc,
-                      pos = (2, 1), span = (1, 3),
-                      flag = wx.EXPAND)
-        addSizer.Add(item = gridSizer,
-                     flag = wx.EXPAND)
-        addSizer.Add(item = self.btnAdd, proportion = 0,
-                     flag = wx.TOP | wx.ALIGN_RIGHT, border = 5)
-        
-        mainSizer = wx.BoxSizer(wx.VERTICAL)
-        mainSizer.Add(item = listSizer, proportion = 1,
-                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
-        mainSizer.Add(item = addSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALIGN_CENTER |
-                      wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
-        
-        self.SetSizer(mainSizer)
-        mainSizer.Fit(self)
-        
-    def OnText(self, event):
-        """!Text entered"""
-        if self.name.GetValue():
-            self.btnAdd.Enable()
-        else:
-            self.btnAdd.Enable(False)
-    
-    def OnAdd(self, event):
-        """!Add new variable to the list"""
-        msg = self.list.Append(self.name.GetValue(),
-                               self.type.GetStringSelection(),
-                               self.value.GetValue(),
-                               self.desc.GetValue())
-        self.name.SetValue('')
-        self.name.SetFocus()
-        
-        if msg:
-            GError(parent = self,
-                   message = msg)
-        else:
-            self.type.SetSelection(0)
-            self.value.SetValue('')
-            self.desc.SetValue('')
-            self.UpdateModelVariables()
-        
-    def UpdateModelVariables(self):
-        """!Update model variables"""
-        variables = dict()
-        for values in self.list.GetData().itervalues():
-            name = values[0]
-            variables[name] = { 'type' : str(values[1]) }
-            if values[2]:
-                variables[name]['value'] = values[2]
-            if values[3]:
-                variables[name]['description'] = values[3]
-        
-        self.parent.GetModel().SetVariables(variables)
-        self.parent.ModelChanged()
-
-    def Update(self):
-        """!Reload list of variables"""
-        self.list.OnReload(None)
-        
-    def Reset(self):
-        """!Remove all variables"""
-        self.list.DeleteAllItems()
-        self.parent.GetModel().SetVariables([])
-        
-class VariableListCtrl(ModelListCtrl):
-    def __init__(self, parent, columns, **kwargs):
-        """!List of model variables"""
-        ModelListCtrl.__init__(self, parent, columns, **kwargs)
-        
-    def GetListCtrl(self):
-        """!Used by ColumnSorterMixin"""
-        return self
-    
-    def GetData(self):
-        """!Get list data"""
-        return self.itemDataMap
-    
-    def Populate(self, data):
-        """!Populate the list"""
-        self.itemDataMap = dict()
-        i = 0
-        for name, values in data.iteritems():
-            self.itemDataMap[i] = [name, values['type'],
-                                   values.get('value', ''),
-                                   values.get('description', '')]
-            i += 1
-        
-        self.itemCount = len(self.itemDataMap.keys())
-        self.DeleteAllItems()
-        i = 0
-        for name, vtype, value, desc in self.itemDataMap.itervalues():
-            index = self.InsertStringItem(sys.maxint, name)
-            self.SetStringItem(index, 0, name)
-            self.SetStringItem(index, 1, vtype)
-            self.SetStringItem(index, 2, value)
-            self.SetStringItem(index, 3, desc)
-            self.SetItemData(index, i)
-            i += 1
-        
-    def Append(self, name, vtype, value, desc):
-        """!Append new item to the list
-
-        @return None on success
-        @return error string
-        """
-        for iname, ivtype, ivalue, idesc in self.itemDataMap.itervalues():
-            if iname == name:
-                return _("Variable <%s> already exists in the model. "
-                         "Adding variable failed.") % name
-        
-        index = self.InsertStringItem(sys.maxint, name)
-        self.SetStringItem(index, 0, name)
-        self.SetStringItem(index, 1, vtype)
-        self.SetStringItem(index, 2, value)
-        self.SetStringItem(index, 3, desc)
-        self.SetItemData(index, self.itemCount)
-        
-        self.itemDataMap[self.itemCount] = [name, vtype, value, desc]
-        self.itemCount += 1
-        
-        return None
-
-    def OnRemove(self, event):
-        """!Remove selected variable(s) from the model"""
-        item = self.GetFirstSelected()
-        while item != -1:
-            self.DeleteItem(item)
-            del self.itemDataMap[item]
-            item = self.GetFirstSelected()
-        self.parent.UpdateModelVariables()
-        
-        event.Skip()
-        
-    def OnRemoveAll(self, event):
-        """!Remove all variable(s) from the model"""
-        dlg = wx.MessageBox(parent=self,
-                            message=_("Do you want to delete all variables from "
-                                      "the model?"),
-                            caption=_("Delete variables"),
-                            style=wx.YES_NO | wx.CENTRE)
-        if dlg != wx.YES:
-            return
-        
-        self.DeleteAllItems()
-        self.itemDataMap = dict()
-        
-        self.parent.UpdateModelVariables()
-        
-    def OnEndEdit(self, event):
-        """!Finish editing of item"""
-        itemIndex = event.GetIndex()
-        columnIndex = event.GetColumn()
-        nameOld = self.GetItem(itemIndex, 0).GetText()
-
-        if columnIndex == 0: # TODO
-            event.Veto()
-        
-        self.itemDataMap[itemIndex][columnIndex] = event.GetText()
-        
-        self.parent.UpdateModelVariables()
-
-    def OnReload(self, event):
-        """!Reload list of variables"""
-        self.Populate(self.parent.parent.GetModel().GetVariables())
-
-    def OnRightUp(self, event):
-        """!Mouse right button up"""
-        if not hasattr(self, "popupID1"):
-            self.popupID1 = wx.NewId()
-            self.popupID2 = wx.NewId()
-            self.popupID3 = wx.NewId()
-            self.Bind(wx.EVT_MENU, self.OnRemove,    id = self.popupID1)
-            self.Bind(wx.EVT_MENU, self.OnRemoveAll, id = self.popupID2)
-            self.Bind(wx.EVT_MENU, self.OnReload,    id = self.popupID3)
-        
-        # generate popup-menu
-        menu = wx.Menu()
-        menu.Append(self.popupID1, _("Delete selected"))
-        menu.Append(self.popupID2, _("Delete all"))
-        if self.GetFirstSelected() == -1:
-            menu.Enable(self.popupID1, False)
-            menu.Enable(self.popupID2, False)
-        
-        menu.AppendSeparator()
-        menu.Append(self.popupID3, _("Reload"))
-        
-        self.PopupMenu(menu)
-        menu.Destroy()
-        
-class ModelItem(ModelObject):
-    def __init__(self, parent, x, y, id = -1, width = None, height = None, text = '', items = []):
-        """!Abstract class for loops and conditions"""
-        ModelObject.__init__(self, id)
-        self.parent  = parent
-        self.text    = text
-        self.items   = items  # list of items in the loop
-        
-    def GetText(self):
-        """!Get loop text"""
-        return self.text
-
-    def GetItems(self):
-        """!Get items (id)"""
-        return self.items
-
-    def SetId(self, id):
-        """!Set loop id"""
-        self.id = id
-
-    def SetText(self, cond):
-        """!Set loop text (condition)"""
-        self.text = cond
-        self.ClearText()
-        self.AddText('(' + str(self.id) + ') ' + self.text)
-
-    def GetLog(self):
-        """!Get log info"""
-        if self.text:
-            return _("Condition: ") + self.text
-        else:
-            return _("Condition: not defined")
-
-    def AddRelation(self, rel):
-        """!Record relation"""
-        self.rels.append(rel)
-        
-    def Clear(self):
-        """!Clear object, remove rels"""
-        self.rels = list()
-        
-class ModelItemDialog(wx.Dialog):
-    """!Abstract item properties dialog"""
-    def __init__(self, parent, shape, title, id = wx.ID_ANY,
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
-        self.parent = parent
-        self.shape = shape
-        
-        wx.Dialog.__init__(self, parent, id, title = title, style = style, **kwargs)
-        
-        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
-        
-        self.condBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                    label=" %s " % _("Condition"))
-        self.condText = wx.TextCtrl(parent = self.panel, id = wx.ID_ANY,
-                                    value = shape.GetText())
-        
-        self.itemList = ItemCheckListCtrl(parent = self.panel,
-                                          window = self,
-                                          columns = [_("ID"), _("Name"),
-                                                     _("Command")],
-                                          shape = shape)
-        self.itemList.Populate(self.parent.GetModel().GetItems())
-        
-        self.btnCancel = wx.Button(parent = self.panel, id = wx.ID_CANCEL)
-        self.btnOk     = wx.Button(parent = self.panel, id = wx.ID_OK)
-        self.btnOk.SetDefault()
-        
-    def _layout(self):
-        """!Do layout (virtual method)"""
-        pass
-    
-    def GetCondition(self):
-        """!Get loop condition"""
-        return self.condText.GetValue()
-    
-class ModelLoop(ModelItem, ogl.RectangleShape):
-    def __init__(self, parent, x, y, id = -1, width = None, height = None, text = '', items = []):
-        """!Defines a loop"""
-        ModelItem.__init__(self, parent, x, y, id, width, height, text, items)
-        
-        if not width:
-            width = UserSettings.Get(group='modeler', key='loop', subkey=('size', 'width'))
-        if not height:
-            height = UserSettings.Get(group='modeler', key='loop', subkey=('size', 'height'))
-        
-        if self.parent.GetCanvas():
-            ogl.RectangleShape.__init__(self, width, height)
-            
-            self.SetCanvas(self.parent)
-            self.SetX(x)
-            self.SetY(y)
-            self.SetPen(wx.BLACK_PEN)
-            self.SetCornerRadius(100)
-            if text:
-                self.AddText('(' + str(self.id) + ') ' + text)
-            else:
-                self.AddText('(' + str(self.id) + ')')
-        
-        self._setBrush()
-        
-    def _setBrush(self):
-        """!Set brush"""
-        if not self.isEnabled:
-            color = UserSettings.Get(group='modeler', key='disabled',
-                                     subkey='color')
-        else:
-            color = UserSettings.Get(group='modeler', key='loop',
-                                     subkey=('color', 'valid'))
-        
-        wxColor = wx.Color(color[0], color[1], color[2])
-        self.SetBrush(wx.Brush(wxColor))
-
-    def Enable(self, enabled = True):
-        """!Enable/disable action"""
-        for item in self.items:
-            if not isinstance(item, ModelAction):
-                continue
-            item.Enable(enabled)
-        
-        ModelObject.Enable(self, enabled)
-        
-    def Update(self):
-        self._setBrush()
-        
-    def GetName(self):
-        """!Get name"""
-        return _("loop")
-    
-    def SetItems(self, items):
-        """!Set items (id)"""
-        self.items = items
-
-class ModelLoopDialog(ModelItemDialog):
-    """!Loop properties dialog"""
-    def __init__(self, parent, shape, id = wx.ID_ANY, title = _("Loop properties"),
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
-        ModelItemDialog.__init__(self, parent, shape, title,
-                                 style = style, **kwargs)
-        
-        self.listBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                    label=" %s " % _("List of items in loop"))
-        
-        self._layout()
-        self.SetMinSize(self.GetSize())
-        self.SetSize((500, 400))
-        
-    def _layout(self):
-        """!Do layout"""
-        sizer = wx.BoxSizer(wx.VERTICAL)
-        
-        condSizer = wx.StaticBoxSizer(self.condBox, wx.VERTICAL)
-        condSizer.Add(item = self.condText, proportion = 1,
-                      flag = wx.EXPAND)
-        
-        listSizer = wx.StaticBoxSizer(self.listBox, wx.VERTICAL)
-        listSizer.Add(item = self.itemList, proportion = 1,
-                      flag = wx.EXPAND)
-        
-        btnSizer = wx.StdDialogButtonSizer()
-        btnSizer.AddButton(self.btnCancel)
-        btnSizer.AddButton(self.btnOk)
-        btnSizer.Realize()
-
-        sizer.Add(item = condSizer, proportion = 0,
-                  flag = wx.EXPAND | wx.ALL, border = 3)
-        sizer.Add(item = listSizer, proportion = 1,
-                  flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 3)
-        sizer.Add(item = btnSizer, proportion=0,
-                  flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
-        
-        self.panel.SetSizer(sizer)
-        sizer.Fit(self.panel)
-        
-        self.Layout()
-        
-    def GetItems(self):
-        """!Get list of selected actions"""
-        return self.itemList.GetItems()
-
-class ItemPanel(wx.Panel):
-    def __init__(self, parent, id = wx.ID_ANY,
-                 **kwargs):
-        """!Manage model items
-        """
-        self.parent = parent
-        
-        wx.Panel.__init__(self, parent = parent, id = id, **kwargs)
-        
-        self.listBox = wx.StaticBox(parent = self, id = wx.ID_ANY,
-                                    label=" %s " % _("List of items - right-click to delete"))
-        
-        self.list = ItemListCtrl(parent = self,
-                                 columns = [_("ID"), _("Name"), _("In block"),
-                                            _("Command / Condition")])
-        
-        self._layout()
-
-    def _layout(self):
-        """!Layout dialog"""
-        listSizer = wx.StaticBoxSizer(self.listBox, wx.VERTICAL)
-        listSizer.Add(item = self.list, proportion = 1,
-                      flag = wx.EXPAND)
-        
-        mainSizer = wx.BoxSizer(wx.VERTICAL)
-        mainSizer.Add(item = listSizer, proportion = 1,
-                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
-        
-        self.SetSizer(mainSizer)
-        mainSizer.Fit(self)
-        
-    def Update(self):
-        """!Reload list of variables"""
-        self.list.OnReload(None)
-        
-class ItemListCtrl(ModelListCtrl):
-    def __init__(self, parent, columns, disablePopup = False, **kwargs):
-        """!List of model actions"""
-        self.disablePopup = disablePopup
-                
-        ModelListCtrl.__init__(self, parent, columns, **kwargs)
-        self.SetColumnWidth(1, 100)
-        self.SetColumnWidth(2, 65)
-        
-    def GetListCtrl(self):
-        """!Used by ColumnSorterMixin"""
-        return self
-    
-    def GetData(self):
-        """!Get list data"""
-        return self.itemDataMap
-    
-    def Populate(self, data):
-        """!Populate the list"""
-        self.itemDataMap = dict()
-        
-        if self.shape:
-            if isinstance(self.shape, ModelCondition):
-                if self.GetName() == 'ElseBlockList':
-                    shapeItems = map(lambda x: x.GetId(), self.shape.GetItems()['else'])
-                else:
-                    shapeItems = map(lambda x: x.GetId(), self.shape.GetItems()['if'])
-            else:
-                shapeItems = map(lambda x: x.GetId(), self.shape.GetItems())
-        else:
-            shapeItems = list()
-        i = 0
-        if len(self.columns) == 3: # ItemCheckList
-            checked = list()
-        for action in data:
-            if isinstance(action, ModelData):
-                continue
-            
-            if len(self.columns) == 3:
-                self.itemDataMap[i] = [str(action.GetId()),
-                                       action.GetName(),
-                                       action.GetLog()]
-                aId = action.GetBlockId()
-                if action.GetId() in shapeItems:
-                    checked.append(aId)
-                else:
-                    checked.append(None)
-            else:
-                bId = action.GetBlockId()
-                if not bId:
-                    bId = ''
-                self.itemDataMap[i] = [str(action.GetId()),
-                                       action.GetName(),
-                                       ','.join(map(str, bId)),
-                                       action.GetLog()]
-            
-            i += 1
-        
-        self.itemCount = len(self.itemDataMap.keys())
-        self.DeleteAllItems()
-        i = 0
-        if len(self.columns) == 3:
-            for aid, name, desc in self.itemDataMap.itervalues():
-                index = self.InsertStringItem(sys.maxint, aid)
-                self.SetStringItem(index, 0, aid)
-                self.SetStringItem(index, 1, name)
-                self.SetStringItem(index, 2, desc)
-                self.SetItemData(index, i)
-                if checked[i]:
-                    self.CheckItem(index, True)
-                i += 1
-        else:
-            for aid, name, inloop, desc in self.itemDataMap.itervalues():
-                index = self.InsertStringItem(sys.maxint, aid)
-                self.SetStringItem(index, 0, aid)
-                self.SetStringItem(index, 1, name)
-                self.SetStringItem(index, 2, inloop)
-                self.SetStringItem(index, 3, desc)
-                self.SetItemData(index, i)
-                i += 1
-                
-    def OnRemove(self, event):
-        """!Remove selected action(s) from the model"""
-        model = self.frame.GetModel()
-        canvas = self.frame.GetCanvas()
-        
-        item = self.GetFirstSelected()
-        while item != -1:
-            self.DeleteItem(item)
-            del self.itemDataMap[item]
-            
-            aId = self.GetItem(item, 0).GetText()
-            action = model.GetItem(int(aId))
-            if not action:
-                item = self.GetFirstSelected()
-                continue
-            
-            model.RemoveItem(action)
-            canvas.GetDiagram().RemoveShape(action)
-            self.frame.ModelChanged()
-            
-            item = self.GetFirstSelected()
-        
-        canvas.Refresh()
-        
-        event.Skip()
-    
-    def OnRemoveAll(self, event):
-        """!Remove all variable(s) from the model"""
-        deleteDialog = wx.MessageBox(parent=self,
-                                     message=_("Selected data records (%d) will permanently deleted "
-                                               "from table. Do you want to delete them?") % \
-                                         (len(self.listOfSQLStatements)),
-                                     caption=_("Delete records"),
-                                     style=wx.YES_NO | wx.CENTRE)
-        if deleteDialog != wx.YES:
-            return False
-        
-        self.DeleteAllItems()
-        self.itemDataMap = dict()
-
-        self.parent.UpdateModelVariables()
-
-    def OnEndEdit(self, event):
-        """!Finish editing of item"""
-        itemIndex = event.GetIndex()
-        columnIndex = event.GetColumn()
-        
-        self.itemDataMap[itemIndex][columnIndex] = event.GetText()
-        
-        aId = int(self.GetItem(itemIndex, 0).GetText())
-        action = self.frame.GetModel().GetItem(aId)
-        if not action:
-            event.Veto()
-        if columnIndex == 0:
-            action.SetId(int(event.GetText()))
-        
-        self.frame.ModelChanged()
-
-    def OnReload(self, event = None):
-        """!Reload list of actions"""
-        self.Populate(self.frame.GetModel().GetItems())
-
-    def OnRightUp(self, event):
-        """!Mouse right button up"""
-        if self.disablePopup:
-            return
-        
-        if not hasattr(self, "popupID1"):
-            self.popupID1 = wx.NewId()
-            self.popupID2 = wx.NewId()
-            self.popupID3 = wx.NewId()
-            self.popupID4 = wx.NewId()
-            self.Bind(wx.EVT_MENU, self.OnRemove,    id = self.popupID1)
-            self.Bind(wx.EVT_MENU, self.OnRemoveAll, id = self.popupID2)
-            self.Bind(wx.EVT_MENU, self.OnReload,    id = self.popupID3)
-            self.Bind(wx.EVT_MENU, self.OnNormalize, id = self.popupID4)
-
-        # generate popup-menu
-        menu = wx.Menu()
-        menu.Append(self.popupID1, _("Delete selected"))
-        menu.Append(self.popupID2, _("Delete all"))
-        if self.GetFirstSelected() == -1:
-            menu.Enable(self.popupID1, False)
-            menu.Enable(self.popupID2, False)
-        
-        menu.AppendSeparator()
-        menu.Append(self.popupID4, _("Normalize"))
-        menu.Append(self.popupID3, _("Reload"))
-        
-        self.PopupMenu(menu)
-        menu.Destroy()
-    
-    def OnNormalize(self, event):
-        """!Update id of actions"""
-        model = self.frame.GetModel()
-        
-        aId = 1
-        for item in model.GetItems():
-            item.SetId(aId)
-            aId += 1
-        
-        self.OnReload(None)
-        self.frame.GetCanvas().Refresh()
-        self.frame.ModelChanged()
-
-class ItemCheckListCtrl(ItemListCtrl, listmix.CheckListCtrlMixin):
-    def __init__(self, parent, shape, columns, window = None, **kwargs):
-        self.parent = parent
-        self.window = window
-        
-        ItemListCtrl.__init__(self, parent, columns, disablePopup = True, **kwargs)
-        listmix.CheckListCtrlMixin.__init__(self)
-        self.SetColumnWidth(0, 50)
-        
-        self.shape  = shape
-        
-    def OnBeginEdit(self, event):
-        """!Disable editing"""
-        event.Veto()
-        
-    def OnCheckItem(self, index, flag):
-        """!Item checked/unchecked"""
-        name = self.GetName()
-        if name == 'IfBlockList' and self.window:
-            self.window.OnCheckItemIf(index, flag)
-        elif name == 'ElseBlockList' and self.window:
-            self.window.OnCheckItemElse(index, flag)
-        
-    def GetItems(self):
-        """!Get list of selected actions"""
-        ids = { 'checked'   : list(),
-                'unchecked' : list() }
-        for i in range(self.GetItemCount()):
-            iId = int(self.GetItem(i, 0).GetText())
-            if self.IsChecked(i):
-                ids['checked'].append(iId)
-            else:
-                ids['unchecked'].append(iId)
-            
-        return ids
-
-    def CheckItemById(self, aId, flag):
-        """!Check/uncheck given item by id"""
-        for i in range(self.GetItemCount()):
-            iId = int(self.GetItem(i, 0).GetText())
-            if iId == aId:
-                self.CheckItem(i, flag)
-                break
-        
-class ModelCondition(ModelItem, ogl.PolygonShape):
-    def __init__(self, parent, x, y, id = -1, width = None, height = None, text = '',
-                 items = { 'if' : [], 'else' : [] }):
-        """!Defines a if-else condition"""
-        ModelItem.__init__(self, parent, x, y, id, width, height, text, items)
-        
-        if not width:
-            self.width = UserSettings.Get(group='modeler', key='if-else', subkey=('size', 'width'))
-        else:
-            self.width = width
-        if not height:
-            self.height = UserSettings.Get(group='modeler', key='if-else', subkey=('size', 'height'))
-        else:
-            self.height = height
-        
-        if self.parent.GetCanvas():
-            ogl.PolygonShape.__init__(self)
-            
-            points = [(0, - self.height / 2),
-                      (self.width / 2, 0),
-                      (0, self.height / 2),
-                      (- self.width / 2, 0)]
-            self.Create(points)
-            
-            self.SetCanvas(self.parent)
-            self.SetX(x)
-            self.SetY(y)
-            self.SetPen(wx.BLACK_PEN)
-            if text:
-                self.AddText('(' + str(self.id) + ') ' + text)
-            else:
-                self.AddText('(' + str(self.id) + ')')
-
-    def GetName(self):
-        """!Get name"""
-        return _("if-else")
-
-    def GetWidth(self):
-        """!Get object width"""
-        return self.width
-
-    def GetHeight(self):
-        """!Get object height"""
-        return self.height
-
-    def SetItems(self, items, branch = 'if'):
-        """!Set items (id)
-
-        @param items list of items
-        @param branch 'if' / 'else'
-        """
-        if branch in ['if', 'else']:
-            self.items[branch] = items
-        
-class ModelConditionDialog(ModelItemDialog):
-    """!Condition properties dialog"""
-    def __init__(self, parent, shape, id = wx.ID_ANY, title = _("If-else properties"),
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
-        ModelItemDialog.__init__(self, parent, shape, title,
-                                 style = style, **kwargs)
-        
-        self.listBoxIf = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                      label=" %s " % _("List of items in 'if' block"))
-        self.itemListIf = self.itemList
-        self.itemListIf.SetName('IfBlockList')
-        
-        self.listBoxElse = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
-                                        label=" %s " % _("List of items in 'else' block"))
-        self.itemListElse = ItemCheckListCtrl(parent = self.panel,
-                                              window = self,
-                                              columns = [_("ID"), _("Name"),
-                                                         _("Command")],
-                                              shape = shape)
-        self.itemListElse.SetName('ElseBlockList')
-        self.itemListElse.Populate(self.parent.GetModel().GetItems())
-        
-        self._layout()
-        self.SetMinSize(self.GetSize())
-        self.SetSize((500, 400))
-        
-    def _layout(self):
-        """!Do layout"""
-        sizer = wx.BoxSizer(wx.VERTICAL)
-        
-        condSizer = wx.StaticBoxSizer(self.condBox, wx.VERTICAL)
-        condSizer.Add(item = self.condText, proportion = 1,
-                      flag = wx.EXPAND)
-        
-        listIfSizer = wx.StaticBoxSizer(self.listBoxIf, wx.VERTICAL)
-        listIfSizer.Add(item = self.itemListIf, proportion = 1,
-                        flag = wx.EXPAND)
-        listElseSizer = wx.StaticBoxSizer(self.listBoxElse, wx.VERTICAL)
-        listElseSizer.Add(item = self.itemListElse, proportion = 1,
-                          flag = wx.EXPAND)
-        
-        btnSizer = wx.StdDialogButtonSizer()
-        btnSizer.AddButton(self.btnCancel)
-        btnSizer.AddButton(self.btnOk)
-        btnSizer.Realize()
-
-        sizer.Add(item = condSizer, proportion = 0,
-                  flag = wx.EXPAND | wx.ALL, border = 3)
-        sizer.Add(item = listIfSizer, proportion = 1,
-                  flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 3)
-        sizer.Add(item = listElseSizer, proportion = 1,
-                  flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 3)
-        sizer.Add(item = btnSizer, proportion=0,
-                  flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border=5)
-        
-        self.panel.SetSizer(sizer)
-        sizer.Fit(self.panel)
-        
-        self.Layout()
-
-    def OnCheckItemIf(self, index, flag):
-        """!Item in if-block checked/unchecked"""
-        if flag is False:
-            return
-        
-        aId = int(self.itemListIf.GetItem(index, 0).GetText())
-        if aId in self.itemListElse.GetItems()['checked']:
-            self.itemListElse.CheckItemById(aId, False)
-            
-    def OnCheckItemElse(self, index, flag):
-        """!Item in else-block checked/unchecked"""
-        if flag is False:
-            return
-        
-        aId = int(self.itemListElse.GetItem(index, 0).GetText())
-        if aId in self.itemListIf.GetItems()['checked']:
-            self.itemListIf.CheckItemById(aId, False)
-        
-    def GetItems(self):
-        """!Get items"""
-        return { 'if'   : self.itemListIf.GetItems(),
-                 'else' : self.itemListElse.GetItems() }
-
-class WritePythonFile:
-    def __init__(self, fd, model):
-        """!Class for exporting model to Python script
-
-        @param fd file desciptor
-        """
-        self.fd     = fd
-        self.model  = model
-        self.indent = 4
-
-        self._writePython()
-        
-    def _writePython(self):
-        """!Write model to file"""
-        properties = self.model.GetProperties()
-        
-        self.fd.write(
-r"""#!/usr/bin/env python
-#
-############################################################################
-#
-# MODULE:       %s
-#
-# AUTHOR(S):	%s
-#               
-# PURPOSE:      %s
-#
-# DATE:         %s
-#
-#############################################################################
-""" % (properties['name'],
-       properties['author'],
-       properties['description'],
-       time.asctime()))
-        
-        self.fd.write(
-r"""
-import sys
-import os
-import atexit
-
-import grass.script as grass
-""")
-        
-        # cleanup()
-        rast, vect, rast3d, msg = self.model.GetIntermediateData()
-        self.fd.write(
-r"""
-def cleanup():
-""")
-        if rast:
-            self.fd.write(
-r"""    grass.run_command('g.remove',
-                      rast=%s)
-""" % ','.join(map(lambda x: "'" + x + "'", rast)))
-        if vect:
-            self.fd.write(
-r"""    grass.run_command('g.remove',
-                      vect = %s)
-""" % ','.join(map(lambda x: "'" + x + "'", vect)))
-        if rast3d:
-            self.fd.write(
-r"""    grass.run_command('g.remove',
-                      rast3d = %s)
-""" % ','.join(map(lambda x: "'" + x + "'", rast3d)))
-        if not rast and not vect and not rast3d:
-            self.fd.write('    pass\n')
-        
-        self.fd.write("\ndef main():\n")
-        for item in self.model.GetItems():
-            self._writePythonItem(item)
-        
-        self.fd.write("\n    return 0\n")
-        
-        self.fd.write(
-r"""
-if __name__ == "__main__":
-    options, flags = grass.parser()
-    atexit.register(cleanup)
-    sys.exit(main())
-""")
-        
-    def _writePythonItem(self, item, ignoreBlock = True):
-        """!Write model object to Python file"""
-        if isinstance(item, ModelAction):
-            if ignoreBlock and item.GetBlockId(): # ignore items in loops of conditions
-                return
-            self._writePythonAction(item)
-        elif isinstance(item, ModelLoop) or isinstance(item, ModelCondition):
-            # substitute condition
-            variables = self.model.GetVariables()
-            cond = item.GetText()
-            for variable in variables:
-                pattern= re.compile('%' + variable)
-                if pattern.search(cond):
-                    value = variables[variable].get('value', '')
-                    if variables[variable].get('type', 'string') == 'string':
-                        value = '"' + value + '"'
-                    cond = pattern.sub(value, cond)
-            if isinstance(item, ModelLoop):
-                self.fd.write('%sfor %s:\n' % (' ' * self.indent, cond))
-                self.indent += 4
-                for action in item.GetItems():
-                    self._writePythonItem(action, ignoreBlock = False)
-                self.indent -= 4
-            else: # ModelCondition
-                self.fd.write('%sif %s:\n' % (' ' * self.indent, cond))
-                self.indent += 4
-                condItems = item.GetItems()
-                for action in condItems['if']:
-                    self._writePythonItem(action, ignoreBlock = False)
-                if condItems['else']:
-                    self.indent -= 4
-                    self.fd.write('%selse:\n' % (' ' * self.indent))
-                    self.indent += 4
-                    for action in condItems['else']:
-                        self._writePythonItem(action, ignoreBlock = False)
-                self.indent += 4
-        
-    def _writePythonAction(self, item):
-        """!Write model action to Python file"""
-        task = menuform.GUI(show = None).ParseCommand(cmd = item.GetLog(string = False))
-        opts = task.get_options()
-        flags = ''
-        params = list()
-        strcmd = "%sgrass.run_command(" % (' ' * self.indent)
-        cmdIndent = len(strcmd)
-        for f in opts['flags']:
-            if f.get('value', False) == True:
-                name = f.get('name', '')
-                if len(name) > 1:
-                    params.append('%s = True' % name)
-                else:
-                    flags += name
-            
-        for p in opts['params']:
-            name = p.get('name', None)
-            value = p.get('value', None)
-            if name and value:
-                ptype = p.get('type', 'string')
-                if ptype == 'string':
-                    params.append('%s = "%s"' % (name, value))
-                else:
-                    params.append("%s = %s" % (name, value))
-        
-        self.fd.write(strcmd + '"%s"' % task.get_name())
-        if flags:
-            self.fd.write(",\n%sflags = '%s'" % (' ' * cmdIndent, flags))
-        if len(params) > 0:
-            self.fd.write(",\n")
-            for opt in params[:-1]:
-                self.fd.write("%s%s,\n" % (' ' * cmdIndent, opt))
-            self.fd.write("%s%s)\n" % (' ' * cmdIndent, params[-1]))
-        else:
-            self.fd.write(")\n")
-
-        
-def main():
-    app = wx.PySimpleApp()
-    wx.InitAllImageHandlers()
-    frame = ModelFrame(parent = None)
-    if len(sys.argv) > 1:
-        frame.LoadModelFile(sys.argv[1])
-    frame.Show()
-    
-    app.MainLoop()
-    
-if __name__ == "__main__":
-    main()
diff --git a/gui/wxpython/gui_modules/goutput.py b/gui/wxpython/gui_modules/goutput.py
deleted file mode 100644
index f8b7f7b..0000000
--- a/gui/wxpython/gui_modules/goutput.py
+++ /dev/null
@@ -1,1128 +0,0 @@
-"""!
- at package goutput
-
- at brief Command output log widget
-
-Classes:
- - GMConsole
- - GMStc
- - GMStdout
- - GMStderr
-
-(C) 2007-2011 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
-
- at author Michael Barton (Arizona State University)
- at author Martin Landa <landa.martin gmail.com>
- at author Vaclav Petras <wenzeslaus gmail.com> (copy&paste customization)
-"""
-
-import os
-import sys
-import textwrap
-import time
-import threading
-import Queue
-import codecs
-import locale
-
-import wx
-import wx.stc
-from wx.lib.newevent import NewEvent
-
-import grass.script as grass
-from   grass.script import task as gtask
-
-import globalvar
-import gcmd
-import utils
-import preferences
-import menuform
-import prompt
-
-from debug       import Debug
-from preferences import globalSettings as UserSettings
-from ghelp       import SearchModuleWindow
-
-wxCmdOutput,   EVT_CMD_OUTPUT   = NewEvent()
-wxCmdProgress, EVT_CMD_PROGRESS = NewEvent()
-wxCmdRun,      EVT_CMD_RUN      = NewEvent()
-wxCmdDone,     EVT_CMD_DONE     = NewEvent()
-wxCmdAbort,    EVT_CMD_ABORT    = NewEvent()
-
-def GrassCmd(cmd, stdout = None, stderr = None):
-    """!Return GRASS command thread"""
-    return gcmd.CommandThread(cmd,
-                              stdout = stdout, stderr = stderr)
-
-class CmdThread(threading.Thread):
-    """!Thread for GRASS commands"""
-    requestId = 0
-    def __init__(self, parent, requestQ, resultQ, **kwds):
-        threading.Thread.__init__(self, **kwds)
-
-        self.setDaemon(True)
-
-        self.parent = parent # GMConsole
-        self._want_abort_all = False
-        
-        self.requestQ = requestQ
-        self.resultQ = resultQ
-
-        self.start()
-
-    def RunCmd(self, *args, **kwds):
-        CmdThread.requestId += 1
-
-        self.requestCmd = None
-        self.requestQ.put((CmdThread.requestId, args, kwds))
-        
-        return CmdThread.requestId
-
-    def SetId(self, id):
-        """!Set starting id"""
-        CmdThread.requestId = id
-        
-    def run(self):
-        os.environ['GRASS_MESSAGE_FORMAT'] = 'gui'
-        while True:
-            requestId, args, kwds = self.requestQ.get()
-            for key in ('callable', 'onDone', 'userData'):
-                if key in kwds:
-                    vars()[key] = kwds[key]
-                    del kwds[key]
-                else:
-                    vars()[key] = None
-            
-            if not vars()['callable']:
-                vars()['callable'] = GrassCmd
-            
-            requestTime = time.time()
-            event = wxCmdRun(cmd = args[0],
-                             pid = requestId)
-            wx.PostEvent(self.parent, event)
-            
-            time.sleep(.1)
-            self.requestCmd = vars()['callable'](*args, **kwds)
-            if self._want_abort_all:
-                self.requestCmd.abort()
-                if self.requestQ.empty():
-                    self._want_abort_all = False
-            
-            self.resultQ.put((requestId, self.requestCmd.run()))
-            
-            try:
-                returncode = self.requestCmd.module.returncode
-            except AttributeError:
-                returncode = 0 # being optimistic
-            
-            try:
-                aborted = self.requestCmd.aborted
-            except AttributeError:
-                aborted = False
-            
-            time.sleep(.1)
-
-            # set default color table for raster data
-            if UserSettings.Get(group='cmd', key='rasterColorTable', subkey='enabled') and \
-                    args[0][0][:2] == 'r.':
-                colorTable = UserSettings.Get(group='cmd', key='rasterColorTable', subkey='selection')
-                mapName = None
-                if args[0][0] == 'r.mapcalc':
-                    try:
-                        mapName = args[0][1].split('=', 1)[0].strip()
-                    except KeyError:
-                        pass
-                else:
-                    moduleInterface = menuform.GUI(show = None).ParseCommand(args[0])
-                    outputParam = moduleInterface.get_param(value = 'output', raiseError = False)
-                    if outputParam and outputParam['prompt'] == 'raster':
-                        mapName = outputParam['value']
-                
-                if mapName:
-                    argsColor = list(args)
-                    argsColor[0] = [ 'r.colors',
-                                     'map=%s' % mapName,
-                                     'color=%s' % colorTable ]
-                    self.requestCmdColor = vars()['callable'](*argsColor, **kwds)
-                    self.resultQ.put((requestId, self.requestCmdColor.run()))
-            
-            event = wxCmdDone(cmd = args[0],
-                              aborted = aborted,
-                              returncode = returncode,
-                              time = requestTime,
-                              pid = requestId,
-                              onDone = vars()['onDone'],
-                              userData = vars()['userData'])
-            
-            # send event
-            wx.PostEvent(self.parent, event)
-                
-    def abort(self, abortall = True):
-        """!Abort command(s)"""
-        if abortall:
-            self._want_abort_all = True
-        self.requestCmd.abort()
-        if self.requestQ.empty():
-            self._want_abort_all = False
-        
-class GMConsole(wx.SplitterWindow):
-    """!Create and manage output console for commands run by GUI.
-    """
-    def __init__(self, parent, id = wx.ID_ANY, margin = False,
-                 notebook = None,
-                 style = wx.TAB_TRAVERSAL | wx.FULL_REPAINT_ON_RESIZE,
-                 **kwargs):
-        wx.SplitterWindow.__init__(self, parent, id, style = style, *kwargs)
-        self.SetName("GMConsole")
-        
-        self.panelOutput = wx.Panel(parent = self, id = wx.ID_ANY)
-        self.panelPrompt = wx.Panel(parent = self, id = wx.ID_ANY)
-        
-        # initialize variables
-        self.parent          = parent # GMFrame | CmdPanel | ?
-        if notebook:
-            self._notebook = notebook
-        else:
-            self._notebook = self.parent.notebook
-        self.lineWidth       = 80
-        
-        # remember position of line begining (used for '\r')
-        self.linePos         = -1
-        
-        #
-        # create queues
-        #
-        self.requestQ = Queue.Queue()
-        self.resultQ = Queue.Queue()
-        
-        #
-        # progress bar
-        #
-        self.console_progressbar = wx.Gauge(parent=self.panelOutput, id=wx.ID_ANY,
-                                            range=100, pos=(110, 50), size=(-1, 25),
-                                            style=wx.GA_HORIZONTAL)
-        self.console_progressbar.Bind(EVT_CMD_PROGRESS, self.OnCmdProgress)
-        
-        #
-        # text control for command output
-        #
-        self.cmd_output = GMStc(parent=self.panelOutput, id=wx.ID_ANY, margin=margin,
-                                wrap=None) 
-        self.cmd_output_timer = wx.Timer(self.cmd_output, id=wx.ID_ANY)
-        self.cmd_output.Bind(EVT_CMD_OUTPUT, self.OnCmdOutput)
-        self.cmd_output.Bind(wx.EVT_TIMER, self.OnProcessPendingOutputWindowEvents)
-        self.Bind(EVT_CMD_RUN, self.OnCmdRun)
-        self.Bind(EVT_CMD_DONE, self.OnCmdDone)
-        
-        # search & command prompt
-        self.cmd_prompt = prompt.GPromptSTC(parent = self)
-        
-        if self.parent.GetName() != 'LayerManager':
-            self.search = None
-            self.cmd_prompt.Hide()
-        else:
-            self.infoCollapseLabelExp = _("Click here to show search module engine")
-            self.infoCollapseLabelCol = _("Click here to hide search module engine")
-            self.searchPane = wx.CollapsiblePane(parent = self.panelOutput,
-                                                 label = self.infoCollapseLabelExp,
-                                                 style = wx.CP_DEFAULT_STYLE |
-                                                 wx.CP_NO_TLW_RESIZE | wx.EXPAND)
-            self.MakeSearchPaneContent(self.searchPane.GetPane())
-            self.searchPane.Collapse(True)
-            self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnSearchPaneChanged, self.searchPane) 
-            self.search.Bind(wx.EVT_TEXT,             self.OnUpdateStatusBar)
-        
-        #
-        # stream redirection
-        #
-        self.cmd_stdout = GMStdout(self)
-        self.cmd_stderr = GMStderr(self)
-        
-        #
-        # thread
-        #
-        self.cmdThread = CmdThread(self, self.requestQ, self.resultQ)
-        
-        #
-        # buttons
-        #
-        self.btn_console_clear = wx.Button(parent = self.panelPrompt, id = wx.ID_ANY,
-                                           label = _("&Clear output"), size=(100,-1))
-        self.btn_cmd_clear = wx.Button(parent = self.panelPrompt, id = wx.ID_ANY,
-                                       label = _("C&lear cmd"), size=(100,-1))
-        if self.parent.GetName() != 'LayerManager':
-            self.btn_cmd_clear.Hide()
-        self.btn_console_save  = wx.Button(parent = self.panelPrompt, id = wx.ID_ANY,
-                                           label = _("&Save output"), size=(100,-1))
-        # abort
-        self.btn_abort = wx.Button(parent = self.panelPrompt, id = wx.ID_ANY, label = _("&Abort cmd"),
-                                   size=(100,-1))
-        self.btn_abort.SetToolTipString(_("Abort the running command"))
-        self.btn_abort.Enable(False)
-        
-        self.btn_cmd_clear.Bind(wx.EVT_BUTTON,     self.cmd_prompt.OnCmdErase)
-        self.btn_console_clear.Bind(wx.EVT_BUTTON, self.ClearHistory)
-        self.btn_console_save.Bind(wx.EVT_BUTTON,  self.SaveHistory)
-        self.btn_abort.Bind(wx.EVT_BUTTON,         self.OnCmdAbort)
-        self.btn_abort.Bind(EVT_CMD_ABORT,         self.OnCmdAbort)
-        
-        self.__layout()
-        
-    def __layout(self):
-        """!Do layout"""
-        OutputSizer = wx.BoxSizer(wx.VERTICAL)
-        PromptSizer = wx.BoxSizer(wx.VERTICAL)
-        ButtonSizer = wx.BoxSizer(wx.HORIZONTAL)
-
-        if self.search and self.search.IsShown():
-            OutputSizer.Add(item=self.searchPane, proportion=0,
-                            flag=wx.EXPAND | wx.ALL, border=3)
-        OutputSizer.Add(item=self.cmd_output, proportion=1,
-                        flag=wx.EXPAND | wx.ALL, border=3)
-        OutputSizer.Add(item=self.console_progressbar, proportion=0,
-                        flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=3)
-        
-        PromptSizer.Add(item=self.cmd_prompt, proportion=1,
-                        flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, border=3)
-        
-        ButtonSizer.Add(item=self.btn_console_clear, proportion=0,
-                        flag=wx.ALIGN_CENTER | wx.FIXED_MINSIZE | wx.ALL, border=5)
-        ButtonSizer.Add(item=self.btn_console_save, proportion=0,
-                        flag=wx.ALIGN_CENTER | wx.FIXED_MINSIZE | wx.ALL, border=5)
-        ButtonSizer.Add(item=self.btn_cmd_clear, proportion=0,
-                        flag=wx.ALIGN_CENTER | wx.FIXED_MINSIZE | wx.ALL, border=5)
-        ButtonSizer.Add(item=self.btn_abort, proportion=0,
-                        flag=wx.ALIGN_CENTER | wx.FIXED_MINSIZE | wx.ALL, border=5)
-        PromptSizer.Add(item=ButtonSizer, proportion=0,
-                        flag=wx.ALIGN_CENTER)
-        
-        OutputSizer.Fit(self)
-        OutputSizer.SetSizeHints(self)
-        
-        PromptSizer.Fit(self)
-        PromptSizer.SetSizeHints(self)
-        
-        self.panelOutput.SetSizer(OutputSizer)
-        self.panelPrompt.SetSizer(PromptSizer)
-        
-        # split window
-        if self.parent.GetName() == 'LayerManager':
-            self.SplitHorizontally(self.panelOutput, self.panelPrompt, -50)
-            self.SetMinimumPaneSize(self.btn_cmd_clear.GetSize()[1] + 50)
-        else:
-            self.SplitHorizontally(self.panelOutput, self.panelPrompt, -45)
-            self.SetMinimumPaneSize(self.btn_cmd_clear.GetSize()[1] + 10)
-        
-        self.SetSashGravity(1.0)
-        
-        # layout
-        self.SetAutoLayout(True)
-        self.Layout()
-
-    def MakeSearchPaneContent(self, pane):
-        """!Create search pane"""
-        border = wx.BoxSizer(wx.VERTICAL)
-        
-        self.search = SearchModuleWindow(parent = pane, cmdPrompt = self.cmd_prompt)
-        
-        border.Add(item = self.search, proportion = 0,
-                   flag = wx.EXPAND | wx.ALL, border = 1)
-        
-        pane.SetSizer(border)
-        border.Fit(pane)
-        
-    def OnSearchPaneChanged(self, event):
-        """!Collapse search module box"""
-        if self.searchPane.IsExpanded():
-            self.searchPane.SetLabel(self.infoCollapseLabelCol)
-        else:
-            self.searchPane.SetLabel(self.infoCollapseLabelExp)
-        
-        self.panelOutput.Layout()
-        self.panelOutput.SendSizeEvent()
-        
-    def GetPanel(self, prompt = True):
-        """!Get panel
-
-        @param prompt get prompt / output panel
-
-        @return wx.Panel reference
-        """
-        if prompt:
-            return self.panelPrompt
-
-        return self.panelOutput
-    
-    def Redirect(self):
-        """!Redirect stdout/stderr
-        """
-        if Debug.GetLevel() == 0 and int(grass.gisenv().get('DEBUG', 0)) == 0:
-            # don't redirect when debugging is enabled
-            sys.stdout = self.cmd_stdout
-            sys.stderr = self.cmd_stderr
-        else:
-            enc = locale.getdefaultlocale()[1]
-            if enc:
-                sys.stdout = codecs.getwriter(enc)(sys.__stdout__)
-                sys.stderr = codecs.getwriter(enc)(sys.__stderr__)
-            else:
-                sys.stdout = sys.__stdout__
-                sys.stderr = sys.__stderr__
-        
-    def WriteLog(self, text, style = None, wrap = None,
-                 switchPage = False):
-        """!Generic method for writing log message in 
-        given style
-
-        @param line text line
-        @param style text style (see GMStc)
-        @param stdout write to stdout or stderr
-        """
-
-        self.cmd_output.SetStyle()
-
-        if switchPage:
-            self._notebook.SetSelectionByName('output')
-        
-        if not style:
-            style = self.cmd_output.StyleDefault
-        
-        # p1 = self.cmd_output.GetCurrentPos()
-        p1 = self.cmd_output.GetEndStyled()
-#        self.cmd_output.GotoPos(p1)
-        self.cmd_output.DocumentEnd()
-        
-        for line in text.splitlines():
-            # fill space
-            if len(line) < self.lineWidth:
-                diff = self.lineWidth - len(line) 
-                line += diff * ' '
-            
-            self.cmd_output.AddTextWrapped(line, wrap=wrap) # adds '\n'
-            
-            p2 = self.cmd_output.GetCurrentPos()
-            
-            self.cmd_output.StartStyling(p1, 0xff)
-            self.cmd_output.SetStyling(p2 - p1, style)
-        
-        self.cmd_output.EnsureCaretVisible()
-        
-    def WriteCmdLog(self, line, pid = None, switchPage = True):
-        """!Write message in selected style"""
-        if pid:
-            line = '(' + str(pid) + ') ' + line
-        self.WriteLog(line, style=self.cmd_output.StyleCommand, switchPage = switchPage)
-
-    def WriteWarning(self, line):
-        """!Write message in warning style"""
-        self.WriteLog(line, style=self.cmd_output.StyleWarning, switchPage = True)
-
-    def WriteError(self, line):
-        """!Write message in error style"""
-        self.WriteLog(line, style = self.cmd_output.StyleError, switchPage = True)
-
-    def RunCmd(self, command, compReg = True, switchPage = False,
-               onDone = None):
-        """!Run command typed into console command prompt (GPrompt).
-        
-        @todo Display commands (*.d) are captured and processed
-        separately by mapdisp.py. Display commands are rendered in map
-        display widget that currently has the focus (as indicted by
-        mdidx).
-        
-        @param command command given as a list (produced e.g. by utils.split())
-        @param compReg True use computation region
-        @param switchPage switch to output page
-        @param onDone function to be called when command is finished
-        """
-        if len(command) == 0:
-            Debug.msg(2, "GPrompt:RunCmd(): empty command")
-            return
-        
-        # update history file
-        env = grass.gisenv()
-        try:
-            fileHistory = codecs.open(os.path.join(env['GISDBASE'],
-                                                   env['LOCATION_NAME'],
-                                                   env['MAPSET'],
-                                                   '.bash_history'),
-                                      encoding = 'utf-8', mode = 'a')
-        except IOError, e:
-            self.WriteError(e)
-            fileHistory = None
-        
-        if fileHistory:
-            try:
-                fileHistory.write(' '.join(command) + os.linesep)
-            finally:
-                fileHistory.close()
-        
-        # update history items
-        if self.parent.GetName() == 'LayerManager':
-            try:
-                self.parent.cmdinput.SetHistoryItems()
-            except AttributeError:
-                pass
-        
-        if command[0] in globalvar.grassCmd['all']:
-            # send GRASS command without arguments to GUI command interface
-            # except display commands (they are handled differently)
-            if self.parent.GetName() == "LayerManager" and \
-                    command[0][0:2] == "d." and \
-                    'help' not in ' '.join(command[1:]):
-                # display GRASS commands
-                try:
-                    layertype = {'d.rast'         : 'raster',
-                                 'd.rast3d'       : '3d-raster',
-                                 'd.rgb'          : 'rgb',
-                                 'd.his'          : 'his',
-                                 'd.shaded'       : 'shaded',
-                                 'd.legend'       : 'rastleg',
-                                 'd.rast.arrow'   : 'rastarrow',
-                                 'd.rast.num'     : 'rastnum',
-                                 'd.vect'         : 'vector',
-                                 'd.vect.thematic': 'thememap',
-                                 'd.vect.chart'   : 'themechart',
-                                 'd.grid'         : 'grid',
-                                 'd.geodesic'     : 'geodesic',
-                                 'd.rhumbline'    : 'rhumb',
-                                 'd.labels'       : 'labels',
-                                 'd.barscale'     : 'barscale',
-                                 'd.redraw'       : 'redraw'}[command[0]]
-                except KeyError:
-                    gcmd.GMessage(parent = self.parent,
-                                  message = _("Command '%s' not yet implemented in the WxGUI. "
-                                              "Try adding it as a command layer instead.") % command[0])
-                    return None
-                
-                if layertype == 'barscale':
-                    self.parent.curr_page.maptree.GetMapDisplay().OnAddBarscale(None)
-                elif layertype == 'rastleg':
-                    self.parent.curr_page.maptree.GetMapDisplay().OnAddLegend(None)
-                elif layertype == 'redraw':
-                    self.parent.curr_page.maptree.GetMapDisplay().OnRender(None)
-                else:
-                    # add layer into layer tree
-                    lname, found = utils.GetLayerNameFromCmd(command, fullyQualified = True,
-                                                             layerType = layertype)
-                    if self.parent.GetName() == "LayerManager":
-                        self.parent.curr_page.maptree.AddLayer(ltype = layertype,
-                                                               lname = lname,
-                                                               lcmd = command)
-            
-            else:
-                # other GRASS commands (r|v|g|...)
-                if sys.platform == 'win32':
-                    if command[0] in globalvar.grassCmd['script']:
-                        command[0] += globalvar.EXT_SCT
-                hasParams = False
-                if command[0] != 'r.mapcalc':
-                    task = menuform.GUI(show = None).ParseCommand(command)
-                    if task:
-                        options = task.get_options()
-                        hasParams = options['params'] and options['flags']
-                        # check for <input>=-
-                        for p in options['params']:
-                            if p.get('prompt', '') == 'input' and \
-                                    p.get('element', '') == 'file' and \
-                                    p.get('age', 'new') == 'old_file' and \
-                                    p.get('value', '') == '-':
-                                gcmd.GError(parent = self,
-                                            message = _("Unable to run command:\n%(cmd)s\n\n"
-                                                        "Option <%(opt)s>: read from standard input is not "
-                                                        "supported by wxGUI") % { 'cmd': ' '.join(command),
-                                                                                  'opt': p.get('name', '') })
-                                return None
-                else:
-                    task = None
-                
-                if len(command) == 1 and hasParams:
-                    # no arguments given
-                    try:
-                        menuform.GUI(parent = self).ParseCommand(command)
-                    except gcmd.GException, e:
-                        print >> sys.stderr, e
-                    return 0
-                
-                # switch to 'Command output' if required
-                if switchPage:
-                    self._notebook.SetSelectionByName('output')
-                    
-                    self.parent.SetFocus()
-                    self.parent.Raise()
-                
-                # activate computational region (set with g.region)
-                # for all non-display commands.
-                if compReg:
-                    tmpreg = os.getenv("GRASS_REGION")
-                    if "GRASS_REGION" in os.environ:
-                        del os.environ["GRASS_REGION"]
-                
-                # process GRASS command with argument
-                self.cmdThread.RunCmd(command, stdout = self.cmd_stdout, stderr = self.cmd_stderr,
-                                      onDone = onDone)
-                self.cmd_output_timer.Start(50)
-                
-                # deactivate computational region and return to display settings
-                if compReg and tmpreg:
-                    os.environ["GRASS_REGION"] = tmpreg
-        else:
-            # Send any other command to the shell. Send output to
-            # console output window
-            if len(command) == 1:
-                try:
-                    task = gtask.parse_interface(command[0])
-                except:
-                    task = None
-            else:
-                task = None
-                
-            if task:
-                # process GRASS command without argument
-                menuform.GUI(parent = self).ParseCommand(command)
-            else:
-                self.cmdThread.RunCmd(command, stdout = self.cmd_stdout, stderr = self.cmd_stderr,
-                                      onDone = onDone)
-            self.cmd_output_timer.Start(50)
-        
-        return None
-
-    def ClearHistory(self, event):
-        """!Clear history of commands"""
-        self.cmd_output.SetReadOnly(False)
-        self.cmd_output.ClearAll()
-        self.cmd_output.SetReadOnly(True)
-        self.console_progressbar.SetValue(0)
-
-    def GetProgressBar(self):
-        """!Return progress bar widget"""
-        return self.console_progressbar
-    
-    def GetLog(self, err = False):
-        """!Get widget used for logging
-
-        @param err True to get stderr widget
-        """
-        if err:
-            return self.cmd_stderr
-        
-        return self.cmd_stdout
-    
-    def SaveHistory(self, event):
-        """!Save history of commands"""
-        self.history = self.cmd_output.GetSelectedText()
-        if self.history == '':
-            self.history = self.cmd_output.GetText()
-
-        # add newline if needed
-        if len(self.history) > 0 and self.history[-1] != '\n':
-            self.history += '\n'
-
-        wildcard = "Text file (*.txt)|*.txt"
-        dlg = wx.FileDialog(self, message = _("Save file as..."), defaultDir = os.getcwd(),
-            defaultFile = "grass_cmd_history.txt", wildcard = wildcard,
-            style = wx.SAVE | wx.FD_OVERWRITE_PROMPT)
-
-        # Show the dialog and retrieve the user response. If it is the OK response,
-        # process the data.
-        if dlg.ShowModal() == wx.ID_OK:
-            path = dlg.GetPath()
-
-            output = open(path, "w")
-            output.write(self.history)
-            output.close()
-
-        dlg.Destroy()
-
-    def GetCmd(self):
-        """!Get running command or None"""
-        return self.requestQ.get()
-    
-    def SetCopyingOfSelectedText(self, copy):
-        """!Enable or disable copying of selected text in to clipboard.
-        Effects prompt and output.
-        
-        @param copy True for enable, False for disable
-        """
-        if copy:
-            self.cmd_prompt.Bind(wx.stc.EVT_STC_PAINTED, self.cmd_prompt.OnTextSelectionChanged)
-            self.cmd_output.Bind(wx.stc.EVT_STC_PAINTED, self.cmd_output.OnTextSelectionChanged)
-        else:
-            self.cmd_prompt.Unbind(wx.stc.EVT_STC_PAINTED)
-            self.cmd_output.Unbind(wx.stc.EVT_STC_PAINTED)
-        
-    def OnUpdateStatusBar(self, event):
-        """!Update statusbar text"""
-        if event.GetString():
-            nItems = len(self.cmd_prompt.GetCommandItems())
-            self.parent.SetStatusText(_('%d modules match') % nItems, 0)
-        else:
-            self.parent.SetStatusText('', 0)
-        
-        event.Skip()
-
-    def OnCmdOutput(self, event):
-        """!Print command output"""
-        message = event.text
-        type  = event.type
-        if self._notebook.GetSelection() != self._notebook.GetPageIndexByName('output'):
-            page = self._notebook.GetPageIndexByName('output')
-            textP = self._notebook.GetPageText(page)
-            if textP[-1] != ')':
-                textP += ' (...)'
-            self._notebook.SetPageText(page, textP)
-        
-        # message prefix
-        if type == 'warning':
-            messege = 'WARNING: ' + message
-        elif type == 'error':
-            message = 'ERROR: ' + message
-        
-        p1 = self.cmd_output.GetEndStyled()
-        self.cmd_output.GotoPos(p1)
-        
-        if '\b' in message:
-            if self.linepos < 0:
-                self.linepos = p1
-            last_c = ''
-            for c in message:
-                if c == '\b':
-                   self.linepos -= 1
-                else:
-                    if c == '\r':
-                        pos = self.cmd_output.GetCurLine()[1]
-                        # self.cmd_output.SetCurrentPos(pos)
-                    else:
-                        self.cmd_output.SetCurrentPos(self.linepos)
-                    self.cmd_output.ReplaceSelection(c)
-                    self.linepos = self.cmd_output.GetCurrentPos()
-                    if c != ' ':
-                        last_c = c
-            if last_c not in ('0123456789'):
-                self.cmd_output.AddTextWrapped('\n', wrap=None)
-                self.linepos = -1
-        else:
-            self.linepos = -1 # don't force position
-            if '\n' not in message:
-                self.cmd_output.AddTextWrapped(message, wrap=60)
-            else:
-                self.cmd_output.AddTextWrapped(message, wrap=None)
-
-        p2 = self.cmd_output.GetCurrentPos()
-        
-        if p2 >= p1:
-            self.cmd_output.StartStyling(p1, 0xff)
-        
-            if type == 'error':
-                self.cmd_output.SetStyling(p2 - p1, self.cmd_output.StyleError)
-            elif type == 'warning':
-                self.cmd_output.SetStyling(p2 - p1, self.cmd_output.StyleWarning)
-            elif type == 'message':
-                self.cmd_output.SetStyling(p2 - p1, self.cmd_output.StyleMessage)
-            else: # unknown
-                self.cmd_output.SetStyling(p2 - p1, self.cmd_output.StyleUnknown)
-        
-        self.cmd_output.EnsureCaretVisible()
-        
-    def OnCmdProgress(self, event):
-        """!Update progress message info"""
-        self.console_progressbar.SetValue(event.value)
-
-    def OnCmdAbort(self, event):
-        """!Abort running command"""
-        self.cmdThread.abort()
-        
-    def OnCmdRun(self, event):
-        """!Run command"""
-        if self.parent.GetName() == 'Modeler':
-            self.parent.OnCmdRun(event)
-        
-        self.WriteCmdLog('(%s)\n%s' % (str(time.ctime()), ' '.join(event.cmd)))
-        self.btn_abort.Enable()
-
-    def OnCmdDone(self, event):
-        """!Command done (or aborted)"""
-        if self.parent.GetName() == 'Modeler':
-            self.parent.OnCmdDone(event)
-        
-        if event.aborted:
-            # Thread aborted (using our convention of None return)
-            self.WriteLog(_('Please note that the data are left in inconsistent state '
-                            'and may be corrupted'), self.cmd_output.StyleWarning)
-            self.WriteCmdLog('(%s) %s (%d sec)' % (str(time.ctime()),
-                                                   _('Command aborted'),
-                                                   (time.time() - event.time)))
-            # pid=self.cmdThread.requestId)
-            self.btn_abort.Enable(False)
-        else:
-            try:
-                # Process results here
-                self.WriteCmdLog('(%s) %s (%d sec)' % (str(time.ctime()),
-                                                       _('Command finished'),
-                                                       (time.time() - event.time)))
-            except KeyError:
-                # stopped deamon
-                pass
-
-            self.btn_abort.Enable(False)
-        
-        if event.onDone:
-            event.onDone(cmd = event.cmd, returncode = event.returncode)
-        
-        self.console_progressbar.SetValue(0) # reset progress bar on '0%'
-
-        self.cmd_output_timer.Stop()
-
-        if event.cmd[0] == 'g.gisenv':
-            Debug.SetLevel()
-            self.Redirect()
-        
-        if self.parent.GetName() == "LayerManager":
-            self.btn_abort.Enable(False)
-            if event.cmd[0] not in globalvar.grassCmd['all'] or \
-                    event.cmd[0] == 'r.mapcalc':
-                return
-            
-            display = self.parent.GetLayerTree().GetMapDisplay()
-            if not display or not display.IsAutoRendered():
-                return
-            mapLayers = map(lambda x: x.GetName(),
-                            display.GetRender().GetListOfLayers(l_type = 'raster') +
-                            display.GetRender().GetListOfLayers(l_type = 'vector'))
-            
-            try:
-                task = menuform.GUI(show = None).ParseCommand(event.cmd)
-            except gcmd.GException, e:
-                print >> sys.stderr, e
-                task = None
-                return
-            
-            for p in task.get_options()['params']:
-                if p.get('prompt', '') not in ('raster', 'vector'):
-                    continue
-                mapName = p.get('value', '')
-                if '@' not in mapName:
-                    mapName = mapName + '@' + grass.gisenv()['MAPSET']
-                if mapName in mapLayers:
-                    display.GetWindow().UpdateMap(render = True)
-                    return
-        elif self.parent.GetName() == 'Modeler':
-            pass
-        else: # standalone dialogs
-            dialog = self.parent.parent
-            if hasattr(self.parent.parent, "btn_abort"):
-                dialog.btn_abort.Enable(False)
-            
-            if hasattr(self.parent.parent, "btn_cancel"):
-                dialog.btn_cancel.Enable(True)
-            
-            if hasattr(self.parent.parent, "btn_clipboard"):
-                dialog.btn_clipboard.Enable(True)
-            
-            if hasattr(self.parent.parent, "btn_help"):
-                dialog.btn_help.Enable(True)
-            
-            if hasattr(self.parent.parent, "btn_run"):
-                dialog.btn_run.Enable(True)
-            
-            if event.returncode == 0 and not event.aborted:
-                try:
-                    winName = self.parent.parent.parent.GetName()
-                except AttributeError:
-                    winName = ''
-                
-                if winName == 'LayerManager':
-                    mapTree = self.parent.parent.parent.GetLayerTree()
-                elif winName == 'LayerTree':
-                    mapTree = self.parent.parent.parent
-                elif winName: # GMConsole
-                    mapTree = self.parent.parent.parent.parent.GetLayerTree()
-                else:
-                    mapTree = None
-                
-                cmd = dialog.notebookpanel.createCmd(ignoreErrors = True)
-                if hasattr(dialog, "addbox") and dialog.addbox.IsChecked():
-                    # add created maps into layer tree
-                    for p in dialog.task.get_options()['params']:
-                        prompt = p.get('prompt', '')
-                        if prompt in ('raster', 'vector', '3d-raster') and \
-                                p.get('age', 'old') == 'new' and \
-                                p.get('value', None):
-                            name, found = utils.GetLayerNameFromCmd(cmd, fullyQualified = True,
-                                                                    param = p.get('name', ''))
-                            
-                            if mapTree.GetMap().GetListOfLayers(l_name = name):
-                                continue
-                            
-                            if prompt == 'raster':
-                                lcmd = ['d.rast',
-                                        'map=%s' % name]
-                            else:
-                                lcmd = ['d.vect',
-                                        'map=%s' % name]
-                            mapTree.AddLayer(ltype = prompt,
-                                             lcmd = lcmd,
-                                             lname = name)
-            
-            if hasattr(dialog, "get_dcmd") and \
-                    dialog.get_dcmd is None and \
-                    hasattr(dialog, "closebox") and \
-                    dialog.closebox.IsChecked() and \
-                    (event.returncode == 0 or event.aborted):
-                self.cmd_output.Update()
-                time.sleep(2)
-                dialog.Close()
-        
-    def OnProcessPendingOutputWindowEvents(self, event):
-        self.ProcessPendingEvents()
-
-class GMStdout:
-    """!GMConsole standard output
-
-    Based on FrameOutErr.py
-
-    Name:      FrameOutErr.py
-    Purpose:   Redirecting stdout / stderr
-    Author:    Jean-Michel Fauth, Switzerland
-    Copyright: (c) 2005-2007 Jean-Michel Fauth
-    Licence:   GPL
-    """
-    def __init__(self, parent):
-        self.parent = parent # GMConsole
-
-    def write(self, s):
-        if len(s) == 0 or s == '\n':
-            return
-
-        for line in s.splitlines():
-            if len(line) == 0:
-                continue
-            
-            evt = wxCmdOutput(text=line + '\n',
-                              type='')
-            wx.PostEvent(self.parent.cmd_output, evt)
-        
-class GMStderr:
-    """!GMConsole standard error output
-
-    Based on FrameOutErr.py
-
-    Name:      FrameOutErr.py
-    Purpose:   Redirecting stdout / stderr
-    Author:    Jean-Michel Fauth, Switzerland
-    Copyright: (c) 2005-2007 Jean-Michel Fauth
-    Licence:   GPL
-    """
-    def __init__(self, parent):
-        self.parent = parent # GMConsole
- 
-        self.type = ''
-        self.message = ''
-        self.printMessage = False
-        
-    def flush(self):
-        pass
-    
-    def write(self, s):
-        if "GtkPizza" in s:
-            return
-        
-        # remove/replace escape sequences '\b' or '\r' from stream
-        progressValue = -1
-        
-        for line in s.splitlines():
-            if len(line) == 0:
-                continue
-            
-            if 'GRASS_INFO_PERCENT' in line:
-                value = int(line.rsplit(':', 1)[1].strip())
-                if value >= 0 and value < 100:
-                    progressValue = value
-                else:
-                    progressValue = 0
-            elif 'GRASS_INFO_MESSAGE' in line:
-                self.type = 'message'
-                self.message += line.split(':', 1)[1].strip() + '\n'
-            elif 'GRASS_INFO_WARNING' in line:
-                self.type = 'warning'
-                self.message += line.split(':', 1)[1].strip() + '\n'
-            elif 'GRASS_INFO_ERROR' in line:
-                self.type = 'error'
-                self.message += line.split(':', 1)[1].strip() + '\n'
-            elif 'GRASS_INFO_END' in line:
-                self.printMessage = True
-            elif self.type == '':
-                if len(line) == 0:
-                    continue
-                evt = wxCmdOutput(text=line,
-                                  type='')
-                wx.PostEvent(self.parent.cmd_output, evt)
-            elif len(line) > 0:
-                self.message += line.strip() + '\n'
-
-            if self.printMessage and len(self.message) > 0:
-                evt = wxCmdOutput(text=self.message,
-                                  type=self.type)
-                wx.PostEvent(self.parent.cmd_output, evt)
-
-                self.type = ''
-                self.message = ''
-                self.printMessage = False
-
-        # update progress message
-        if progressValue > -1:
-            # self.gmgauge.SetValue(progressValue)
-            evt = wxCmdProgress(value=progressValue)
-            wx.PostEvent(self.parent.console_progressbar, evt)
-            
-class GMStc(wx.stc.StyledTextCtrl):
-    """!Styled GMConsole
-
-    Based on FrameOutErr.py
-
-    Name:      FrameOutErr.py
-    Purpose:   Redirecting stdout / stderr
-    Author:    Jean-Michel Fauth, Switzerland
-    Copyright: (c) 2005-2007 Jean-Michel Fauth
-    Licence:   GPL
-    """    
-    def __init__(self, parent, id, margin=False, wrap=None):
-        wx.stc.StyledTextCtrl.__init__(self, parent, id)
-        self.parent = parent
-        self.SetUndoCollection(True)
-        self.SetReadOnly(True)
-
-        #
-        # styles
-        #                
-        self.SetStyle()
-        
-        #
-        # line margins
-        #
-        # TODO print number only from cmdlog
-        self.SetMarginWidth(1, 0)
-        self.SetMarginWidth(2, 0)
-        if margin:
-            self.SetMarginType(0, wx.stc.STC_MARGIN_NUMBER)
-            self.SetMarginWidth(0, 30)
-        else:
-            self.SetMarginWidth(0, 0)
-
-        #
-        # miscellaneous
-        #
-        self.SetViewWhiteSpace(False)
-        self.SetTabWidth(4)
-        self.SetUseTabs(False)
-        self.UsePopUp(True)
-        self.SetSelBackground(True, "#FFFF00")
-        self.SetUseHorizontalScrollBar(True)
-
-        #
-        # bindings
-        #
-        self.Bind(wx.EVT_WINDOW_DESTROY, self.OnDestroy)
-        
-    def OnTextSelectionChanged(self, event):
-        """!Copy selected text to clipboard and skip event.
-        The same function is in TextCtrlAutoComplete class (prompt.py).
-        """
-        self.Copy()
-        event.Skip()
-        
-    def SetStyle(self):
-        """!Set styles for styled text output windows with type face 
-        and point size selected by user (Courier New 10 is default)"""
-
-        settings = preferences.Settings()
-        
-        typeface = settings.Get(group = 'appearance', key = 'outputfont', subkey = 'type')   
-        if typeface == "":
-            typeface = "Courier New"
-        
-        typesize = settings.Get(group = 'appearance', key = 'outputfont', subkey = 'size')
-        if typesize == None or typesize <= 0:
-            typesize = 10
-        typesize = float(typesize)
-        
-        self.StyleDefault     = 0
-        self.StyleDefaultSpec = "face:%s,size:%d,fore:#000000,back:#FFFFFF" % (typeface, typesize)
-        self.StyleCommand     = 1
-        self.StyleCommandSpec = "face:%s,size:%d,,fore:#000000,back:#bcbcbc" % (typeface, typesize)
-        self.StyleOutput      = 2
-        self.StyleOutputSpec  = "face:%s,size:%d,,fore:#000000,back:#FFFFFF" % (typeface, typesize)
-        # fatal error
-        self.StyleError       = 3
-        self.StyleErrorSpec   = "face:%s,size:%d,,fore:#7F0000,back:#FFFFFF" % (typeface, typesize)
-        # warning
-        self.StyleWarning     = 4
-        self.StyleWarningSpec = "face:%s,size:%d,,fore:#0000FF,back:#FFFFFF" % (typeface, typesize)
-        # message
-        self.StyleMessage     = 5
-        self.StyleMessageSpec = "face:%s,size:%d,,fore:#000000,back:#FFFFFF" % (typeface, typesize)
-        # unknown
-        self.StyleUnknown     = 6
-        self.StyleUnknownSpec = "face:%s,size:%d,,fore:#000000,back:#FFFFFF" % (typeface, typesize)
-        
-        # default and clear => init
-        self.StyleSetSpec(wx.stc.STC_STYLE_DEFAULT, self.StyleDefaultSpec)
-        self.StyleClearAll()
-        self.StyleSetSpec(self.StyleCommand, self.StyleCommandSpec)
-        self.StyleSetSpec(self.StyleOutput,  self.StyleOutputSpec)
-        self.StyleSetSpec(self.StyleError,   self.StyleErrorSpec)
-        self.StyleSetSpec(self.StyleWarning, self.StyleWarningSpec)
-        self.StyleSetSpec(self.StyleMessage, self.StyleMessageSpec)
-        self.StyleSetSpec(self.StyleUnknown, self.StyleUnknownSpec)        
-
-    def OnDestroy(self, evt):
-        """!The clipboard contents can be preserved after
-        the app has exited"""
-        
-        wx.TheClipboard.Flush()
-        evt.Skip()
-
-    def AddTextWrapped(self, txt, wrap=None):
-        """!Add string to text area.
-
-        String is wrapped and linesep is also added to the end
-        of the string"""
-        # allow writing to output window
-        self.SetReadOnly(False)
-        
-        if wrap:
-            txt = textwrap.fill(txt, wrap) + '\n'
-        else:
-            if txt[-1] != '\n':
-                txt += '\n'
-        
-        if '\r' in txt:
-            self.parent.linePos = -1
-            for seg in txt.split('\r'):
-                if self.parent.linePos > -1:
-                    self.SetCurrentPos(self.parent.linePos)
-                    self.ReplaceSelection(seg)
-                else:
-                    self.parent.linePos = self.GetCurrentPos()
-                    self.AddText(seg)
-        else:
-            self.parent.linePos = self.GetCurrentPos()
-            try:
-                self.AddText(txt)
-            except UnicodeDecodeError:
-                enc = UserSettings.Get(group='atm', key='encoding', subkey='value')
-                if enc:
-                    txt = unicode(txt, enc)
-                elif 'GRASS_DB_ENCODING' in os.environ:
-                    txt = unicode(txt, os.environ['GRASS_DB_ENCODING'])
-                else:
-                    txt = utils.EncodeString(txt)
-                
-                self.AddText(txt)
-        
-        # reset output window to read only
-        self.SetReadOnly(True)
-    
diff --git a/gui/wxpython/gui_modules/mapdisp.py b/gui/wxpython/gui_modules/mapdisp.py
deleted file mode 100644
index f313766..0000000
--- a/gui/wxpython/gui_modules/mapdisp.py
+++ /dev/null
@@ -1,2025 +0,0 @@
-"""!
- at package mapdisp.py
-
- at brief GIS map display canvas, with toolbar for various display
-management functions, and additional toolbars (vector digitizer, 3d
-view).
-
-Can be used either from Layer Manager or as p.mon backend.
-
-Classes:
-- MapFrame
-- MapApp
-
-Usage:
-python mapdisp.py monitor-identifier /path/to/command/file
-
-(C) 2006-2011 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
-
- at author Michael Barton
- at author Jachym Cepicky
- at author Martin Landa <landa.martin gmail.com>
-"""
-
-import os
-import sys
-import glob
-import math
-import tempfile
-import copy
-
-import globalvar
-import wx
-import wx.aui
-
-try:
-    import subprocess
-except:
-    CompatPath = os.path.join(globalvar.ETCWXDIR)
-    sys.path.append(CompatPath)
-    from compat import subprocess
-
-gmpath = os.path.join(globalvar.ETCWXDIR, "icons")
-sys.path.append(gmpath)
-
-grassPath = os.path.join(globalvar.ETCDIR, "python")
-sys.path.append(grassPath)
-
-import render
-import toolbars
-import menuform
-import gselect
-import disp_print
-import gcmd
-import dbm
-import dbm_dialogs
-import histogram
-import profile
-import globalvar
-import utils
-import gdialogs
-from grass.script import core as grass
-from debug import Debug
-from icon  import Icons
-from preferences import globalSettings as UserSettings
-
-from mapdisp_command import Command
-from mapdisp_window import BufferedWindow
-
-# for standalone app
-cmdfilename = None
-
-haveCtypes = False
-
-class MapFrame(wx.Frame):
-    """!Main frame for map display window. Drawing takes place in
-    child double buffered drawing window.
-    """
-    def __init__(self, parent = None, id = wx.ID_ANY, title = _("GRASS GIS - Map display"),
-                 style = wx.DEFAULT_FRAME_STYLE, toolbars = ["map"],
-                 tree = None, notebook = None, lmgr = None, page = None,
-                 Map = None, auimgr = None, **kwargs):
-        """!Main map display window with toolbars, statusbar and
-        DrawWindow
-
-        @param toolbars array of activated toolbars, e.g. ['map', 'digit']
-        @param tree reference to layer tree
-        @param notebook control book ID in Layer Manager
-        @param lmgr Layer Manager
-        @param page notebook page with layer tree
-        @param Map instance of render.Map
-        @param auimgs AUI manager
-        @param kwargs wx.Frame attribures
-        """
-        self._layerManager = lmgr   # Layer Manager object
-        self.Map        = Map       # instance of render.Map
-        self.tree       = tree      # Layer Manager layer tree object
-        self.page       = page      # Notebook page holding the layer tree
-        self.layerbook  = notebook  # Layer Manager layer tree notebook
-        self.parent     = parent
-        
-        if 'name' not in kwargs:
-            kwargs['name'] = 'MapWindow'
-        wx.Frame.__init__(self, parent, id, title, style = style, **kwargs)
-        
-        # available cursors
-        self.cursors = {
-            # default: cross
-            # "default" : wx.StockCursor(wx.CURSOR_DEFAULT),
-            "default" : wx.StockCursor(wx.CURSOR_ARROW),
-            "cross"   : wx.StockCursor(wx.CURSOR_CROSS),
-            "hand"    : wx.StockCursor(wx.CURSOR_HAND),
-            "pencil"  : wx.StockCursor(wx.CURSOR_PENCIL),
-            "sizenwse": wx.StockCursor(wx.CURSOR_SIZENWSE)
-            }
-        
-        #
-        # set the size & system icon
-        #
-        self.SetClientSize(self.GetSize())
-        self.iconsize = (16, 16)
-
-        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass_map.ico'), wx.BITMAP_TYPE_ICO))
-
-        #
-        # Fancy gui
-        #
-        self._mgr = wx.aui.AuiManager(self)
-
-        #
-        # Add toolbars
-        #
-        self.toolbars = { 'map' : None,
-                          'vdigit' : None,
-                          'georect' : None, 
-                          'gcpdisp' : None, 
-                          'nviz' : None }
-        for toolb in toolbars:
-            self.AddToolbar(toolb)
-
-        #
-        # Add statusbar
-        #
-        self.statusbar = self.CreateStatusBar(number = 4, style = 0)
-        self.statusbar.SetStatusWidths([-5, -2, -1, -1])
-        self.statusbarWin = dict()
-        self.statusbarWin['toggle'] = wx.Choice(self.statusbar, wx.ID_ANY,
-                                                choices = globalvar.MAP_DISPLAY_STATUSBAR_MODE)
-        self.statusbarWin['toggle'].SetSelection(UserSettings.Get(group = 'display',
-                                                                  key = 'statusbarMode',
-                                                                  subkey = 'selection'))
-        self.statusbar.Bind(wx.EVT_CHOICE, self.OnToggleStatus, self.statusbarWin['toggle'])
-        # auto-rendering checkbox
-        self.statusbarWin['render'] = wx.CheckBox(parent = self.statusbar, id = wx.ID_ANY,
-                                                  label = _("Render"))
-        self.statusbar.Bind(wx.EVT_CHECKBOX, self.OnToggleRender, self.statusbarWin['render'])
-        self.statusbarWin['render'].SetValue(UserSettings.Get(group = 'display',
-                                                              key = 'autoRendering',
-                                                              subkey = 'enabled'))
-        self.statusbarWin['render'].SetToolTip(wx.ToolTip (_("Enable/disable auto-rendering")))
-        # show region
-        self.statusbarWin['region'] = wx.CheckBox(parent = self.statusbar, id = wx.ID_ANY,
-                                                  label = _("Show computational extent"))
-        self.statusbar.Bind(wx.EVT_CHECKBOX, self.OnToggleShowRegion, self.statusbarWin['region'])
-        
-        self.statusbarWin['region'].SetValue(False)
-        self.statusbarWin['region'].Hide()
-        self.statusbarWin['region'].SetToolTip(wx.ToolTip (_("Show/hide computational "
-                                                             "region extent (set with g.region). "
-                                                             "Display region drawn as a blue box inside the "
-                                                             "computational region, "
-                                                             "computational region inside a display region "
-                                                             "as a red box).")))
-        # set resolution
-        self.statusbarWin['resolution'] = wx.CheckBox(parent = self.statusbar, id = wx.ID_ANY,
-                                                      label = _("Constrain display resolution to computational settings"))
-        self.statusbar.Bind(wx.EVT_CHECKBOX, self.OnToggleResolution, self.statusbarWin['resolution'])
-        self.statusbarWin['resolution'].SetValue(UserSettings.Get(group = 'display', key = 'compResolution', subkey = 'enabled'))
-        self.statusbarWin['resolution'].Hide()
-        self.statusbarWin['resolution'].SetToolTip(wx.ToolTip (_("Constrain display resolution "
-                                                                 "to computational region settings. "
-                                                                 "Default value for new map displays can "
-                                                                 "be set up in 'User GUI settings' dialog.")))
-        # map scale
-        self.statusbarWin['mapscale'] = wx.ComboBox(parent = self.statusbar, id = wx.ID_ANY,
-                                                    style = wx.TE_PROCESS_ENTER,
-                                                    size = (150, -1))
-        self.statusbarWin['mapscale'].SetItems(['1:1000',
-                                                '1:5000',
-                                                '1:10000',
-                                                '1:25000',
-                                                '1:50000',
-                                                '1:100000',
-                                                '1:1000000'])
-        self.statusbarWin['mapscale'].Hide()
-        self.statusbar.Bind(wx.EVT_TEXT_ENTER, self.OnChangeMapScale, self.statusbarWin['mapscale'])
-        self.statusbar.Bind(wx.EVT_COMBOBOX, self.OnChangeMapScale, self.statusbarWin['mapscale'])
-
-        # go to
-        self.statusbarWin['goto'] = wx.TextCtrl(parent = self.statusbar, id = wx.ID_ANY,
-                                                value = "", style = wx.TE_PROCESS_ENTER,
-                                                size = (300, -1))
-        self.statusbarWin['goto'].Hide()
-        self.statusbar.Bind(wx.EVT_TEXT_ENTER, self.OnGoTo, self.statusbarWin['goto'])
-
-        # projection
-        self.statusbarWin['projection'] = wx.CheckBox(parent = self.statusbar, id = wx.ID_ANY,
-                                                      label = _("Use defined projection"))
-        self.statusbarWin['projection'].SetValue(False)
-        size = self.statusbarWin['projection'].GetSize()
-        self.statusbarWin['projection'].SetMinSize((size[0] + 150, size[1]))
-        self.statusbarWin['projection'].SetToolTip(wx.ToolTip (_("Reproject coordinates displayed "
-                                                                 "in the statusbar. Projection can be "
-                                                                 "defined in GUI preferences dialog "
-                                                                 "(tab 'Display')")))
-        self.statusbarWin['projection'].Hide()
-        
-        # mask
-        self.statusbarWin['mask'] = wx.StaticText(parent = self.statusbar, id = wx.ID_ANY,
-                                                  label = '')
-        self.statusbarWin['mask'].SetForegroundColour(wx.Colour(255, 0, 0))
-        
-        # on-render gauge
-        self.statusbarWin['progress'] = wx.Gauge(parent = self.statusbar, id = wx.ID_ANY,
-                                      range = 0, style = wx.GA_HORIZONTAL)
-        self.statusbarWin['progress'].Hide()
-        
-        self.StatusbarReposition() # reposition statusbar
-
-        #
-        # Init map display (buffered DC & set default cursor)
-        #
-        self.MapWindow2D = BufferedWindow(self, id = wx.ID_ANY,
-                                          Map = self.Map, tree = self.tree, lmgr = self._layerManager)
-        # default is 2D display mode
-        self.MapWindow = self.MapWindow2D
-        self.MapWindow.SetCursor(self.cursors["default"])
-        # used by vector digitizer
-        self.MapWindowVDigit = None
-        # used by Nviz (3D display mode)
-        self.MapWindow3D = None 
-
-        #
-        # initialize region values
-        #
-        self._initDisplay() 
-
-        #
-        # Bind various events
-        #
-        self.Bind(wx.EVT_ACTIVATE, self.OnFocus)
-        self.Bind(wx.EVT_CLOSE,    self.OnCloseWindow)
-        self.Bind(render.EVT_UPDATE_PRGBAR, self.OnUpdateProgress)
-        
-        #
-        # Update fancy gui style
-        #
-        self._mgr.AddPane(self.MapWindow, wx.aui.AuiPaneInfo().CentrePane().
-                          Dockable(False).BestSize((-1,-1)).
-                          CloseButton(False).DestroyOnClose(True).
-                          Layer(0))
-        self._mgr.Update()
-
-        #
-        # Init print module and classes
-        #
-        self.printopt = disp_print.PrintOptions(self, self.MapWindow)
-        
-        #
-        # Init zoom history
-        #
-        self.MapWindow.ZoomHistory(self.Map.region['n'],
-                                   self.Map.region['s'],
-                                   self.Map.region['e'],
-                                   self.Map.region['w'])
-
-        #
-        # Re-use dialogs
-        #
-        self.dialogs = {}
-        self.dialogs['attributes'] = None
-        self.dialogs['category'] = None
-        self.dialogs['barscale'] = None
-        self.dialogs['legend'] = None
-
-        self.decorationDialog = None # decoration/overlays
-
-    def _addToolbarVDigit(self):
-        """!Add vector digitizer toolbar
-        """
-        from vdigit import haveVDigit
-        
-        if not haveVDigit:
-            from vdigit import errorMsg
-            msg = _("Unable to start wxGUI vector digitizer.\nDo you want to start "
-                    "TCL/TK digitizer (v.digit) instead?\n\n"
-                    "Details: %s" % errorMsg)
-            
-            self.toolbars['map'].combo.SetValue(_("2D view"))
-            dlg = wx.MessageDialog(parent = self,
-                                   message = msg,
-                                   caption=_("Vector digitizer failed"),
-                                   style = wx.YES_NO | wx.CENTRE)
-            if dlg.ShowModal() == wx.ID_YES:
-                mapName = self.tree.GetPyData(self.tree.layer_selected)[0]['maplayer'].GetName()
-                self._layerManager.goutput.RunCmd(['v.digit', 'map=%s' % mapName],
-                                                  switchPage = False)
-            dlg.Destroy()
-            
-            self.toolbars['map'].combo.SetValue(_("2D view"))
-            return
-        
-        if self._layerManager:
-            log = self._layerManager.goutput
-        else:
-            log = None
-        
-        if not self.MapWindowVDigit:
-            from mapdisp_vdigit import VDigitWindow
-            self.MapWindowVDigit = VDigitWindow(self, id = wx.ID_ANY,
-                                                Map = self.Map, tree = self.tree,
-                                                lmgr = self._layerManager)
-            self.MapWindowVDigit.Show()
-        
-        self.MapWindow = self.MapWindowVDigit
-        
-        self._mgr.DetachPane(self.MapWindow2D)
-        self.MapWindow2D.Hide()
-        
-        self.toolbars['vdigit'] = toolbars.VDigitToolbar(parent = self, mapcontent = self.Map,
-                                                         layerTree = self.tree,
-                                                         log = log)
-        self.MapWindowVDigit.SetToolbar(self.toolbars['vdigit'])
-        
-        self._mgr.AddPane(self.MapWindowVDigit, wx.aui.AuiPaneInfo().CentrePane().
-                          Dockable(False).BestSize((-1,-1)).
-                          CloseButton(False).DestroyOnClose(True).
-                          Layer(0))
-        self._mgr.AddPane(self.toolbars['vdigit'],
-                          wx.aui.AuiPaneInfo().
-                          Name("vdigittoolbar").Caption(_("Vector Digitizer Toolbar")).
-                          ToolbarPane().Top().Row(1).
-                          LeftDockable(False).RightDockable(False).
-                          BottomDockable(False).TopDockable(True).
-                          CloseButton(False).Layer(2).
-                          BestSize((self.toolbars['vdigit'].GetBestSize())))
-        # change mouse to draw digitized line
-        self.MapWindow.mouse['box'] = "point"
-        self.MapWindow.zoomtype     = 0
-        self.MapWindow.pen          = wx.Pen(colour = 'red',   width = 2, style = wx.SOLID)
-        self.MapWindow.polypen      = wx.Pen(colour = 'green', width = 2, style = wx.SOLID)
-
-    def _addToolbarNviz(self):
-        """!Add 3D view mode toolbar
-        """
-        import nviz
-        
-        # check for GLCanvas and OpenGL
-        if not nviz.haveNviz:
-            self.toolbars['map'].combo.SetValue (_("2D view"))
-            gcmd.GError(parent = self,
-                        message = _("Unable to switch to 3D display mode.\nThe Nviz python extension "
-                                    "was not found or loaded properly.\n"
-                                    "Switching back to 2D display mode.\n\nDetails: %s" % nviz.errorMsg))
-            return
-        
-        # add Nviz toolbar and disable 2D display mode tools
-        self.toolbars['nviz'] = toolbars.NvizToolbar(self, self.Map)
-        self.toolbars['map'].Enable2D(False)
-        
-        # update status bar
-        self.statusbarWin['toggle'].Enable(False)
-        
-        # erase map window
-        self.MapWindow.EraseMap()
-        
-        self._layerManager.goutput.WriteCmdLog(_("Starting 3D view mode..."))
-        self.statusbar.SetStatusText(_("Please wait, loading data..."), 0)
-        
-        # create GL window & NVIZ toolbar
-        if not self.MapWindow3D:
-            self.MapWindow3D = nviz.GLWindow(self, id = wx.ID_ANY,
-                                             Map = self.Map, tree = self.tree, lmgr = self._layerManager)
-            self.MapWindow = self.MapWindow3D
-            self.MapWindow.SetCursor(self.cursors["default"])
-            
-                # add Nviz notebookpage
-            self._layerManager.AddNviz()
-            
-            self.MapWindow3D.OnPaint(None) # -> LoadData
-            self.MapWindow3D.Show()
-            self.MapWindow3D.UpdateView(None)
-        else:
-            self.MapWindow = self.MapWindow3D
-            # add Nviz notebookpage
-            self._layerManager.AddNviz()
-            self._layerManager.nviz.UpdatePage('view')
-            self._layerManager.nviz.UpdatePage('light')
-        
-        # switch from MapWindow to MapWindowGL
-        # add nviz toolbar
-        self._mgr.DetachPane(self.MapWindow2D)
-        self.MapWindow2D.Hide()
-        self._mgr.AddPane(self.MapWindow3D, wx.aui.AuiPaneInfo().CentrePane().
-                          Dockable(False).BestSize((-1,-1)).
-                          CloseButton(False).DestroyOnClose(True).
-                          Layer(0))
-        self._mgr.AddPane(self.toolbars['nviz'],
-                          wx.aui.AuiPaneInfo().
-                          Name("nviztoolbar").Caption(_("3D View Toolbar")).
-                          ToolbarPane().Top().Row(1).
-                          LeftDockable(False).RightDockable(False).
-                          BottomDockable(False).TopDockable(True).
-                          CloseButton(False).Layer(2).
-                          BestSize((self.toolbars['nviz'].GetBestSize())))
-        
-        self.SetStatusText("", 0)
-        
-    def AddToolbar(self, name):
-        """!Add defined toolbar to the window
-        
-        Currently known toolbars are:
-         - 'map'     - basic map toolbar
-         - 'vdigit'  - vector digitizer
-         - 'gcpdisp' - GCP Manager Display
-         - 'georect' - georectifier
-         - 'nviz'    - 3D view mode
-        """
-        # default toolbar
-        if name == "map":
-            self.toolbars['map'] = toolbars.MapToolbar(self, self.Map)
-            
-            self._mgr.AddPane(self.toolbars['map'],
-                              wx.aui.AuiPaneInfo().
-                              Name("maptoolbar").Caption(_("Map Toolbar")).
-                              ToolbarPane().Top().
-                              LeftDockable(False).RightDockable(False).
-                              BottomDockable(False).TopDockable(True).
-                              CloseButton(False).Layer(2).
-                              BestSize((self.toolbars['map'].GetBestSize())))
-            
-        # vector digitizer
-        elif name == "vdigit":
-            self._addToolbarVDigit()
-        # georectifier
-        elif name == "georect":
-            self.toolbars['georect'] = toolbars.GRToolbar(self, self.Map)
-            
-            self._mgr.AddPane(self.toolbars['georect'],
-                              wx.aui.AuiPaneInfo().
-                              Name("georecttoolbar").Caption(_("Georectification Toolbar")).
-                              ToolbarPane().Top().
-                              LeftDockable(False).RightDockable(False).
-                              BottomDockable(False).TopDockable(True).
-                              CloseButton(False).Layer(2).
-                              BestSize((self.toolbars['georect'].GetBestSize())))
-        # nviz
-        elif name == "nviz":
-            self._addToolbarNviz()
-        
-        self._mgr.Update()
-        
-    def RemoveToolbar (self, name):
-        """!Removes defined toolbar from the window
-
-        @todo Only hide, activate by calling AddToolbar()
-        """
-        # cannot hide main toolbar
-        if name == "map":
-            return
-        
-        self._mgr.DetachPane(self.toolbars[name])
-        self.toolbars[name].Destroy()
-        self.toolbars[name] = None
-        
-        if name == 'vdigit':
-            self._mgr.DetachPane(self.MapWindowVDigit)
-            self.MapWindowVDigit.Hide()
-            self.MapWindow2D.Show()
-            self._mgr.AddPane(self.MapWindow2D, wx.aui.AuiPaneInfo().CentrePane().
-                              Dockable(False).BestSize((-1,-1)).
-                              CloseButton(False).DestroyOnClose(True).
-                              Layer(0))
-            self.MapWindow = self.MapWindow2D
-        
-        elif name == 'nviz':
-            # unload data
-            # self.MapWindow3D.Reset()
-            # switch from MapWindowGL to MapWindow
-            self._mgr.DetachPane(self.MapWindow3D)
-            self.MapWindow3D.Hide()
-            self.MapWindow2D.Show()
-            self._mgr.AddPane(self.MapWindow2D, wx.aui.AuiPaneInfo().CentrePane().
-                              Dockable(False).BestSize((-1,-1)).
-                              CloseButton(False).DestroyOnClose(True).
-                              Layer(0))
-            self.MapWindow = self.MapWindow2D
-            # remove nviz notebook page
-            self._layerManager.RemoveNviz()
-            
-            self.MapWindow.UpdateMap()
-        
-        self.toolbars['map'].combo.SetValue(_("2D view"))
-        self.toolbars['map'].Enable2D(True)
-        self.statusbarWin['toggle'].Enable(True)
-        
-        self._mgr.Update()
-
-    def _initDisplay(self):
-        """!Initialize map display, set dimensions and map region
-        """
-        if not grass.find_program('g.region', ['--help']):
-            sys.exit(_("GRASS module '%s' not found. Unable to start map "
-                       "display window.") % 'g.region')
-        
-        self.width, self.height = self.GetClientSize()
-        
-        Debug.msg(2, "MapFrame._initDisplay():")
-        self.Map.ChangeMapSize(self.GetClientSize())
-        self.Map.region = self.Map.GetRegion() # g.region -upgc
-        # self.Map.SetRegion() # adjust region to match display window
-
-    def OnUpdateProgress(self, event):
-        """!Update progress bar info
-        """
-        self.statusbarWin['progress'].SetValue(event.value)
-        
-        event.Skip()
-        
-    def OnFocus(self, event):
-        """
-        Change choicebook page to match display.
-        Or set display for georectifying
-        """
-        if self._layerManager and \
-                self._layerManager.georectifying:
-            # in georectifying session; display used to get geographic
-            # coordinates for GCPs
-            self.OnPointer(event)
-        else:
-            # change bookcontrol page to page associated with display
-            if self.page:
-                pgnum = self.layerbook.GetPageIndex(self.page)
-                if pgnum > -1:
-                    self.layerbook.SetSelection(pgnum)
-        
-        event.Skip()
-        
-    def OnDraw(self, event):
-        """!Re-display current map composition
-        """
-        self.MapWindow.UpdateMap(render = False)
-        
-    def OnRender(self, event):
-        """!Re-render map composition (each map layer)
-        """
-        # delete tmp map layers (queries)
-        qlayer = self.Map.GetListOfLayers(l_name = globalvar.QUERYLAYER)
-        for layer in qlayer:
-            self.Map.DeleteLayer(layer)
-        
-        # delete tmp lines
-        if self.MapWindow.mouse["use"] in ("measure",
-                                           "profile"):
-            self.MapWindow.polycoords = []
-            self.MapWindow.ClearLines()
-        
-        # deselect features in vdigit
-        if self.toolbars['vdigit']:
-            if self.MapWindow.digit:
-                self.MapWindow.digit.GetDisplay().SetSelected([])
-            self.MapWindow.UpdateMap(render = True, renderVector = True)
-        else:
-            self.MapWindow.UpdateMap(render = True)
-        
-        # update statusbar
-        self.StatusbarUpdate()
-
-    def OnPointer(self, event):
-        """!Pointer button clicked
-        """
-        if self.toolbars['map']:
-            if event:
-                self.toolbars['map'].OnTool(event)
-            self.toolbars['map'].action['desc'] = ''
-        
-        self.MapWindow.mouse['use'] = "pointer"
-        self.MapWindow.mouse['box'] = "point"
-
-        # change the cursor
-        if self.toolbars['vdigit']:
-            # digitization tool activated
-            self.MapWindow.SetCursor(self.cursors["cross"])
-
-            # reset mouse['box'] if needed
-            if self.toolbars['vdigit'].GetAction() in ['addLine']:
-                if self.toolbars['vdigit'].GetAction('type') in ['point', 'centroid']:
-                    self.MapWindow.mouse['box'] = 'point'
-                else: # line, boundary
-                    self.MapWindow.mouse['box'] = 'line'
-            elif self.toolbars['vdigit'].GetAction() in ['addVertex', 'removeVertex', 'splitLine',
-                                                         'editLine', 'displayCats', 'queryMap',
-                                                         'copyCats']:
-                self.MapWindow.mouse['box'] = 'point'
-            else: # moveLine, deleteLine
-                self.MapWindow.mouse['box'] = 'box'
-        
-        elif self._layerManager and self._layerManager.georectifying:
-            self.MapWindow.SetCursor(self.cursors["cross"])
-        
-        else:
-            self.MapWindow.SetCursor(self.cursors["default"])
-
-    def OnZoomIn(self, event):
-        """
-        Zoom in the map.
-        Set mouse cursor, zoombox attributes, and zoom direction
-        """
-        if self.toolbars['map']:
-            self.toolbars['map'].OnTool(event)
-            self.toolbars['map'].action['desc'] = ''
-        
-        self.MapWindow.mouse['use'] = "zoom"
-        self.MapWindow.mouse['box'] = "box"
-        self.MapWindow.zoomtype = 1
-        self.MapWindow.pen = wx.Pen(colour = 'Red', width = 2, style = wx.SHORT_DASH)
-        
-        # change the cursor
-        self.MapWindow.SetCursor(self.cursors["cross"])
-
-    def OnZoomOut(self, event):
-        """
-        Zoom out the map.
-        Set mouse cursor, zoombox attributes, and zoom direction
-        """
-        if self.toolbars['map']:
-            self.toolbars['map'].OnTool(event)
-            self.toolbars['map'].action['desc'] = ''
-        
-        self.MapWindow.mouse['use'] = "zoom"
-        self.MapWindow.mouse['box'] = "box"
-        self.MapWindow.zoomtype = -1
-        self.MapWindow.pen = wx.Pen(colour = 'Red', width = 2, style = wx.SHORT_DASH)
-        
-        # change the cursor
-        self.MapWindow.SetCursor(self.cursors["cross"])
-
-    def OnZoomBack(self, event):
-        """
-        Zoom last (previously stored position)
-        """
-        self.MapWindow.ZoomBack()
-
-    def OnPan(self, event):
-        """
-        Panning, set mouse to drag
-        """
-        if self.toolbars['map']:
-            self.toolbars['map'].OnTool(event)
-            self.toolbars['map'].action['desc'] = ''
-        
-        self.MapWindow.mouse['use'] = "pan"
-        self.MapWindow.mouse['box'] = "pan"
-        self.MapWindow.zoomtype = 0
-        
-        # change the cursor
-        self.MapWindow.SetCursor(self.cursors["hand"])
-
-    def OnErase(self, event):
-        """
-        Erase the canvas
-        """
-        self.MapWindow.EraseMap()
-
-    def OnZoomRegion(self, event):
-        """
-        Zoom to region
-        """
-        self.Map.getRegion()
-        self.Map.getResolution()
-        self.UpdateMap()
-        # event.Skip()
-
-    def OnAlignRegion(self, event):
-        """
-        Align region
-        """
-        if not self.Map.alignRegion:
-            self.Map.alignRegion = True
-        else:
-            self.Map.alignRegion = False
-        # event.Skip()
-
-    def OnToggleRender(self, event):
-        """!Enable/disable auto-rendering
-        """
-        if self.statusbarWin['render'].GetValue():
-            self.OnRender(None)
-
-    def IsAutoRendered(self):
-        """!Check if auto-rendering is enabled"""
-        return self.statusbarWin['render'].IsChecked()
-    
-    def OnToggleShowRegion(self, event):
-        """!Show/Hide extent in map canvas
-        """
-        if self.statusbarWin['region'].GetValue():
-            # show extent
-            self.MapWindow.regionCoords = []
-        else:
-            del self.MapWindow.regionCoords
-
-        # redraw map if auto-rendering is enabled
-        if self.statusbarWin['render'].GetValue():
-            self.OnRender(None)
-
-    def OnToggleResolution(self, event):
-        """
-        Use resolution of computation region settings
-        for redering image instead of display resolution
-        """
-        # redraw map if auto-rendering is enabled
-        if self.statusbarWin['render'].GetValue():
-            self.OnRender(None)
-        
-    def OnToggleStatus(self, event):
-        """
-        Toggle status text
-        """
-        self.StatusbarUpdate()
-
-    def OnChangeMapScale(self, event):
-        """
-        Map scale changed by user
-        """
-        scale = event.GetString()
-
-        try:
-            if scale[:2] != '1:':
-                raise ValueError
-            value = int(scale[2:])
-        except ValueError:
-            self.statusbarWin['mapscale'].SetValue('1:%ld' % int(self.mapScaleValue))
-            return
-
-        dEW = value * (self.Map.region['cols'] / self.ppm[0])
-        dNS = value * (self.Map.region['rows'] / self.ppm[1])
-        self.Map.region['n'] = self.Map.region['center_northing'] + dNS / 2.
-        self.Map.region['s'] = self.Map.region['center_northing'] - dNS / 2.
-        self.Map.region['w'] = self.Map.region['center_easting']  - dEW / 2.
-        self.Map.region['e'] = self.Map.region['center_easting']  + dEW / 2.
-        
-        # add to zoom history
-        self.MapWindow.ZoomHistory(self.Map.region['n'], self.Map.region['s'],
-                                   self.Map.region['e'], self.Map.region['w'])
-        
-        # redraw a map
-        self.MapWindow.UpdateMap()
-        self.statusbarWin['mapscale'].SetFocus()
-        
-    def OnGoTo(self, event):
-        """
-        Go to position
-        """
-        try:
-            if self.statusbarWin['projection'].IsChecked():
-                if not UserSettings.Get(group = 'projection', key = 'statusbar', subkey = 'proj4'):
-                    self.statusbar.SetStatusText(_("Projection not defined (check the settings)"), 0)
-                else:
-                    # reproject values
-                    projIn = UserSettings.Get(group = 'projection',
-                                              key = 'statusbar',
-                                              subkey = 'proj4')
-                    projOut = gcmd.RunCommand('g.proj',
-                                              flags = 'jf',
-                                              read = True)
-                    proj = projIn.split(' ')[0].split('=')[1]
-                    if proj in ('ll', 'latlong', 'longlat'):
-                        e, n = self.statusbarWin['goto'].GetValue().split(';')
-                        e, n = utils.DMS2Deg(e, n)
-                        proj, coord1 = utils.ReprojectCoordinates(coord = (e, n),
-                                                                  projIn = projIn,
-                                                                  projOut = projOut, flags = 'd')
-                        e, n = coord1
-                    else:
-                        e, n = map(float, self.statusbarWin['goto'].GetValue().split(';'))
-                        proj, coord1 = utils.ReprojectCoordinates(coord = (e, n),
-                                                                  projIn = projIn,
-                                                                  projOut = projOut, flags = 'd')
-                        e, n = coord1
-            else:
-                if self.Map.projinfo['proj'] == 'll':
-                    e, n = self.statusbarWin['goto'].GetValue().split(';')
-                else:
-                    e, n = map(float, self.statusbarWin['goto'].GetValue().split(';'))
-                    
-            region = self.Map.GetCurrentRegion()
-            if self.statusbarWin['projection'].IsChecked():
-                if not UserSettings.Get(group = 'projection', key = 'statusbar', subkey = 'proj4'):
-                    self.statusbar.SetStatusText(_("Projection not defined (check the settings)"), 0)
-                else:
-                    region['center_easting'], region['center_northing'] = e, n
-            else:
-                if self.Map.projinfo['proj'] == 'll':
-                    region['center_easting'], region['center_northing'] = utils.DMS2Deg(e, n)
-                else:
-                    region['center_easting'], region['center_northing'] = e, n
-        except ValueError:
-            region = self.Map.GetCurrentRegion()
-            precision = int(UserSettings.Get(group = 'projection', key = 'format',
-                                             subkey = 'precision'))
-            format = UserSettings.Get(group = 'projection', key = 'format',
-                                      subkey = 'll')
-            if self.Map.projinfo['proj'] == 'll' and format == 'DMS':
-                    self.statusbarWin['goto'].SetValue("%s" % utils.Deg2DMS(region['center_easting'], 
-                                                                            region['center_northing'],
-                                                                            precision = precision))
-            else:
-                self.statusbarWin['goto'].SetValue("%.*f; %.*f" % \
-                                                       (precision, region['center_easting'],
-                                                        precision, region['center_northing']))
-            return
-        
-        
-        dn = (region['nsres'] * region['rows']) / 2.
-        region['n'] = region['center_northing'] + dn
-        region['s'] = region['center_northing'] - dn
-        de = (region['ewres'] * region['cols']) / 2.
-        region['e'] = region['center_easting'] + de
-        region['w'] = region['center_easting'] - de
-        
-        self.Map.AdjustRegion()
-
-        # add to zoom history
-        self.MapWindow.ZoomHistory(region['n'], region['s'],
-                                   region['e'], region['w'])
-        
-        # redraw a map
-        self.MapWindow.UpdateMap()
-        self.statusbarWin['goto'].SetFocus()
-        
-    def StatusbarUpdate(self):
-        """!Update statusbar content"""
-
-        self.statusbarWin['region'].Hide()
-        self.statusbarWin['resolution'].Hide()
-        self.statusbarWin['mapscale'].Hide()
-        self.statusbarWin['goto'].Hide()
-        self.statusbarWin['projection'].Hide()
-        self.mapScaleValue = self.ppm = None
-
-        if self.statusbarWin['toggle'].GetSelection() == 0: # Coordinates
-            self.statusbar.SetStatusText("", 0)
-            # enable long help
-            self.StatusbarEnableLongHelp()
-
-        elif self.statusbarWin['toggle'].GetSelection() in (1, 2): # Extent
-            sel = self.statusbarWin['toggle'].GetSelection()
-            if sel == 1:
-                region = self.Map.region
-            else:
-                region = self.Map.GetRegion() # computation region
-
-            precision = int(UserSettings.Get(group = 'projection', key = 'format',
-                                             subkey = 'precision'))
-            format = UserSettings.Get(group = 'projection', key = 'format',
-                                      subkey = 'll')
-            
-            if self.statusbarWin['projection'].IsChecked():
-                if not UserSettings.Get(group = 'projection', key = 'statusbar', subkey = 'proj4'):
-                    self.statusbar.SetStatusText(_("Projection not defined (check the settings)"), 0)
-                else:
-                    projOut = UserSettings.Get(group = 'projection',
-                                               key = 'statusbar',
-                                               subkey = 'proj4')
-                    proj, coord1 = utils.ReprojectCoordinates(coord = (region["w"], region["s"]),
-                                                              projOut = projOut, flags = 'd')
-                    proj, coord2 = utils.ReprojectCoordinates(coord = (region["e"], region["n"]),
-                                                          projOut = projOut, flags = 'd')
-                    if sel == 2:
-                        proj, coord3 = utils.ReprojectCoordinates(coord = (0.0, 0.0),
-                                                                  projOut = projOut, flags = 'd')
-                        proj, coord4 = utils.ReprojectCoordinates(coord = (region["ewres"], region["nsres"]),
-                                                                  projOut = projOut, flags = 'd')
-                    if coord1 and coord2:
-                        if proj in ('ll', 'latlong', 'longlat') and format == 'DMS':
-                            w, s = utils.Deg2DMS(coord1[0], coord1[1], string = False,
-                                                 precision = precision)
-                            e, n = utils.Deg2DMS(coord2[0], coord2[1], string = False,
-                                                 precision = precision)
-                            if sel == 1:
-                                self.statusbar.SetStatusText("%s - %s, %s - %s" %
-                                                             (w, e, s, n), 0)
-                            else:
-                                ewres, nsres = utils.Deg2DMS(abs(coord3[0]) - abs(coord4[0]),
-                                                             abs(coord3[1]) - abs(coord4[1]),
-                                                             string = False, hemisphere = False,
-                                                             precision = precision)
-                                self.statusbar.SetStatusText("%s - %s, %s - %s (%s, %s)" %
-                                                             (w, e, s, n, ewres, nsres), 0)
-                        else:
-                            w, s = coord1
-                            e, n = coord2
-                            if sel == 1:
-                                self.statusbar.SetStatusText("%.*f - %.*f, %.*f - %.*f" %
-                                                         (precision, w, precision, e,
-                                                          precision, s, precision, n), 0)
-                            else:
-                                ewres, nsres = coord3
-                                self.statusbar.SetStatusText("%.*f - %.*f, %.*f - %.*f (%.*f, %.*f)" %
-                                                             (precision, w, precision, e,
-                                                              precision, s, precision, n,
-                                                              precision, ewres, precision, nsres), 0)
-                    else:
-                        self.statusbar.SetStatusText(_("Error in projection (check the settings)"), 0)
-            else:
-                if self.Map.projinfo['proj'] == 'll' and format == 'DMS':
-                    w, s = utils.Deg2DMS(region["w"], region["s"],
-                                         string = False, precision = precision)
-                    e, n = utils.Deg2DMS(region["e"], region["n"],
-                                         string = False, precision = precision)
-                    if sel == 1:
-                        self.statusbar.SetStatusText("%s - %s, %s - %s" %
-                                                     (w, e, s, n), 0)
-                    else:
-                        ewres, nsres = utils.Deg2DMS(region['ewres'], region['nsres'],
-                                                     string = False, precision = precision)
-                        self.statusbar.SetStatusText("%s - %s, %s - %s (%s, %s)" %
-                                                     (w, e, s, n, ewres, nsres), 0)
-                else:
-                    w, s = region["w"], region["s"]
-                    e, n = region["e"], region["n"]
-                    if sel == 1:
-                        self.statusbar.SetStatusText("%.*f - %.*f, %.*f - %.*f" %
-                                                     (precision, w, precision, e,
-                                                      precision, s, precision, n), 0)
-                    else:
-                        ewres, nsres = region['ewres'], region['nsres']
-                        self.statusbar.SetStatusText("%.*f - %.*f, %.*f - %.*f (%.*f, %.*f)" %
-                                                     (precision, w, precision, e,
-                                                      precision, s, precision, n,
-                                                      precision, ewres, precision, nsres), 0)
-            # enable long help
-            self.StatusbarEnableLongHelp()
-
-        elif self.statusbarWin['toggle'].GetSelection() == 3: # Show comp. extent
-            self.statusbar.SetStatusText("", 0)
-            self.statusbarWin['region'].Show()
-            # disable long help
-            self.StatusbarEnableLongHelp(False)
-
-        elif self.statusbarWin['toggle'].GetSelection() == 4: # Display mode
-            self.statusbar.SetStatusText("", 0)
-            self.statusbarWin['resolution'].Show()
-            # disable long help
-            self.StatusbarEnableLongHelp(False)
-
-        elif self.statusbarWin['toggle'].GetSelection() == 5: # Display geometry
-            self.statusbar.SetStatusText("rows=%d; cols=%d; nsres=%.2f; ewres=%.2f" %
-                                         (self.Map.region["rows"], self.Map.region["cols"],
-                                          self.Map.region["nsres"], self.Map.region["ewres"]), 0)
-            # enable long help
-            self.StatusbarEnableLongHelp()
-
-        elif self.statusbarWin['toggle'].GetSelection() == 6: # Map scale
-            # TODO: need to be fixed...
-            ### screen X region problem
-            ### user should specify ppm
-            dc = wx.ScreenDC()
-            dpSizePx = wx.DisplaySize()   # display size in pixels
-            dpSizeMM = wx.DisplaySizeMM() # display size in mm (system)
-            dpSizeIn = (dpSizeMM[0] / 25.4, dpSizeMM[1] / 25.4) # inches
-            sysPpi  = dc.GetPPI()
-            comPpi = (dpSizePx[0] / dpSizeIn[0],
-                      dpSizePx[1] / dpSizeIn[1])
-
-            ppi = comPpi                  # pixel per inch
-            self.ppm = ((ppi[0] / 2.54) * 100, # pixel per meter
-                        (ppi[1] / 2.54) * 100)
-
-            Debug.msg(4, "MapFrame.StatusbarUpdate(mapscale): size: px=%d,%d mm=%f,%f "
-                      "in=%f,%f ppi: sys=%d,%d com=%d,%d; ppm=%f,%f" % \
-                          (dpSizePx[0], dpSizePx[1], dpSizeMM[0], dpSizeMM[1],
-                           dpSizeIn[0], dpSizeIn[1],
-                           sysPpi[0], sysPpi[1], comPpi[0], comPpi[1],
-                           self.ppm[0], self.ppm[1]))
-
-            region = self.Map.region
-
-            heightCm = region['rows'] / self.ppm[1] * 100
-            widthCm  = region['cols'] / self.ppm[0] * 100
-
-            Debug.msg(4, "MapFrame.StatusbarUpdate(mapscale): width_cm=%f, height_cm=%f" %
-                      (widthCm, heightCm))
-
-            xscale = (region['e'] - region['w']) / (region['cols'] / self.ppm[0])
-            yscale = (region['n'] - region['s']) / (region['rows'] / self.ppm[1])
-            scale = (xscale + yscale) / 2.
-            
-            Debug.msg(3, "MapFrame.StatusbarUpdate(mapscale): xscale=%f, yscale=%f -> scale=%f" % \
-                          (xscale, yscale, scale))
-
-            self.statusbar.SetStatusText("")
-            try:
-                self.statusbarWin['mapscale'].SetValue("1:%ld" % (scale + 0.5))
-            except TypeError:
-                pass
-            self.mapScaleValue = scale
-            self.statusbarWin['mapscale'].Show()
-
-            # disable long help
-            self.StatusbarEnableLongHelp(False)
-
-        elif self.statusbarWin['toggle'].GetSelection() == 7: # go to
-            self.statusbar.SetStatusText("")
-            region = self.Map.GetCurrentRegion()
-            precision = int(UserSettings.Get(group = 'projection', key = 'format',
-                                             subkey = 'precision'))
-            format = UserSettings.Get(group = 'projection', key = 'format',
-                                      subkey = 'll')
-            
-            if self.statusbarWin['projection'].IsChecked():
-                if not UserSettings.Get(group='projection', key='statusbar', subkey='proj4'):
-                    self.statusbar.SetStatusText(_("Projection not defined (check the settings)"), 0)
-                else:
-                    proj, coord  = utils.ReprojectCoordinates(coord = (region['center_easting'],
-                                                                       region['center_northing']),
-                                                              projOut = UserSettings.Get(group = 'projection',
-                                                                                         key = 'statusbar',
-                                                                                         subkey = 'proj4'),
-                                                              flags = 'd')
-                    if coord:
-                        if proj in ('ll', 'latlong', 'longlat') and format == 'DMS':
-                            self.statusbarWin['goto'].SetValue("%s" % utils.Deg2DMS(coord[0],
-                                                                                    coord[1],
-                                                                                    precision = precision))
-                        else:
-                            self.statusbarWin['goto'].SetValue("%.*f; %.*f" % (precision, coord[0],
-                                                                               precision, coord[1]))
-                    else:
-                        self.statusbar.SetStatusText(_("Error in projection (check the settings)"), 0)
-            else:
-                if self.Map.projinfo['proj'] == 'll' and format == 'DMS':
-                    self.statusbarWin['goto'].SetValue("%s" % utils.Deg2DMS(region['center_easting'], 
-                                                                            region['center_northing'],
-                                                                            precision = precision))
-                else:
-                    self.statusbarWin['goto'].SetValue("%.*f; %.*f" % (precision, region['center_easting'],
-                                                                       precision, region['center_northing']))
-            self.statusbarWin['goto'].Show()
-
-            # disable long help
-            self.StatusbarEnableLongHelp(False)
-        
-        elif self.statusbarWin['toggle'].GetSelection() == 8: # projection
-            self.statusbar.SetStatusText("")
-            epsg = UserSettings.Get(group = 'projection', key = 'statusbar', subkey = 'epsg')
-            if epsg:
-                label = '%s (EPSG: %s)' % (_("Use defined projection"), epsg)
-                self.statusbarWin['projection'].SetLabel(label)
-            else:
-                self.statusbarWin['projection'].SetLabel(_("Use defined projection"))
-            self.statusbarWin['projection'].Show()
-            
-            # disable long help
-            self.StatusbarEnableLongHelp(False)
-            
-        else:
-            self.statusbar.SetStatusText("", 1)
-
-    def StatusbarEnableLongHelp(self, enable = True):
-        """!Enable/disable toolbars long help"""
-        for toolbar in self.toolbars.itervalues():
-            if toolbar:
-                toolbar.EnableLongHelp(enable)
-                
-    def StatusbarReposition(self):
-        """!Reposition checkbox in statusbar"""
-        # reposition checkbox
-        widgets = [(0, self.statusbarWin['region']),
-                   (0, self.statusbarWin['resolution']),
-                   (0, self.statusbarWin['mapscale']),
-                   (0, self.statusbarWin['progress']),
-                   (0, self.statusbarWin['projection']),
-                   (1, self.statusbarWin['toggle']),
-                   (2, self.statusbarWin['mask']),
-                   (3, self.statusbarWin['render'])]
-        for idx, win in widgets:
-            rect = self.statusbar.GetFieldRect(idx)
-            if idx == 0: # show region / mapscale / process bar
-                # -> size
-                wWin, hWin = win.GetBestSize()
-                if win == self.statusbarWin['progress']:
-                    wWin = rect.width - 6
-                # -> position
-                # if win == self.statusbarWin['region']:
-                # x, y = rect.x + rect.width - wWin, rect.y - 1
-                # align left
-                # else:
-                x, y = rect.x + 3, rect.y - 1
-                w, h = wWin, rect.height + 2
-            else: # choice || auto-rendering
-                x, y = rect.x, rect.y - 1
-                w, h = rect.width, rect.height + 2
-                if idx == 2: # mask
-                    x += 5
-                    y += 4
-                elif idx == 3: # render
-                    x += 5
-            win.SetPosition((x, y))
-            win.SetSize((w, h))
-
-    def SaveToFile(self, event):
-        """!Save map to image
-        """
-        if self.toolbars['nviz']:
-            filetype = "PPM file (*.ppm)|*.ppm|TIF file (*.tif)|*.tif"
-            ltype = [{ 'ext' : 'ppm', 'type' : -1 },
-                     { 'ext' : 'tif', 'type' : wx.BITMAP_TYPE_TIF }]
-        else:
-            img = self.MapWindow.img
-            if not img:
-                gcmd.GMessage(parent = self,
-                              message = _("Nothing to render (empty map). Operation canceled."))
-                return
-            filetype, ltype = gdialogs.GetImageHandlers(img)
-        
-        # get size
-        dlg = gdialogs.ImageSizeDialog(self)
-        dlg.CentreOnParent()
-        if dlg.ShowModal() != wx.ID_OK:
-            dlg.Destroy()
-            return
-        width, height = dlg.GetValues()
-        dlg.Destroy()
-        
-        # get filename
-        dlg = wx.FileDialog(parent = self,
-                            message = _("Choose a file name to save the image "
-                                        "(no need to add extension)"),
-                            wildcard = filetype,
-                            style = wx.SAVE | wx.FD_OVERWRITE_PROMPT)
-        
-        if dlg.ShowModal() == wx.ID_OK:
-            path = dlg.GetPath()
-            if not path:
-                dlg.Destroy()
-                return
-            
-            base, ext = os.path.splitext(path)
-            fileType = ltype[dlg.GetFilterIndex()]['type']
-            extType  = ltype[dlg.GetFilterIndex()]['ext']
-            if ext != extType:
-                path = base + '.' + extType
-            
-            self.MapWindow.SaveToFile(path, fileType,
-                                      width, height)
-            
-        dlg.Destroy()
-
-    def PrintMenu(self, event):
-        """
-        Print options and output menu for map display
-        """
-        point = wx.GetMousePosition()
-        printmenu = wx.Menu()
-        # Add items to the menu
-        setup = wx.MenuItem(printmenu, wx.ID_ANY, _('Page setup'))
-        printmenu.AppendItem(setup)
-        self.Bind(wx.EVT_MENU, self.printopt.OnPageSetup, setup)
-
-        preview = wx.MenuItem(printmenu, wx.ID_ANY, _('Print preview'))
-        printmenu.AppendItem(preview)
-        self.Bind(wx.EVT_MENU, self.printopt.OnPrintPreview, preview)
-
-        doprint = wx.MenuItem(printmenu, wx.ID_ANY, _('Print display'))
-        printmenu.AppendItem(doprint)
-        self.Bind(wx.EVT_MENU, self.printopt.OnDoPrint, doprint)
-
-        # Popup the menu.  If an item is selected then its handler
-        # will be called before PopupMenu returns.
-        self.PopupMenu(printmenu)
-        printmenu.Destroy()
-
-    def OnCloseWindow(self, event):
-        """!Window closed.
-        Also close associated layer tree page
-        """
-        pgnum = None
-        self.Map.Clean()
-        
-        # close edited map and 3D tools properly
-        if self.toolbars['vdigit']:
-            maplayer = self.toolbars['vdigit'].GetLayer()
-            if maplayer:
-                self.toolbars['vdigit'].OnExit()
-        
-        if self.toolbars['nviz']:
-            self.toolbars['nviz'].OnExit()
-        
-        if not self._layerManager:
-            self.Destroy()
-        elif self.page:
-            pgnum = self.layerbook.GetPageIndex(self.page)
-            if pgnum > -1:
-                self.layerbook.DeletePage(pgnum)
-        
-    def GetRender(self):
-        """!Returns current instance of render.Map()
-        """
-        return self.Map
-
-    def GetWindow(self):
-        """!Get map window"""
-        return self.MapWindow
-    
-    def OnNvizQuerySurface(self, event):
-        """!Query current surface in 3D view mode"""
-        if self.toolbars['map'].GetAction() == 'nvizQuerySurface':
-            self.toolbars['map'].SelectDefault(event)
-            return
-        
-        self.toolbars['map'].action['desc'] = 'nvizQuerySurface'
-        
-        self.MapWindow.mouse['use'] = "nvizQuerySurface"
-        self._OnQuery()
-
-    def OnNvizQueryVector(self, event):
-        """!Query current vector in 3D view mode"""
-        if self.toolbars['map'].GetAction() == 'nvizQueryVector':
-            self.toolbars['map'].SelectDefault(event)
-            return
-        
-        self.toolbars['map'].action['desc'] = 'nvizQueryVector'
-        
-        self.MapWindow.mouse['use'] = "nvizQueryVector"
-        self._OnQuery()
-        
-    def QueryMap(self, x, y):
-        """!Query raster or vector map layers by r/v.what
-        
-        @param x,y coordinates
-        """
-        # set query snap distance for v.what at map unit equivalent of 10 pixels
-        qdist = 10.0 * ((self.Map.region['e'] - self.Map.region['w']) / self.Map.width)
-        east, north = self.MapWindow.Pixel2Cell((x, y))
-        
-        if not self.IsStandalone():
-            num = 0
-            for layer in self.tree.GetSelections():
-                ltype = self.tree.GetPyData(layer)[0]['maplayer'].GetType()
-                if ltype in ('raster', 'rgb', 'his',
-                             'vector', 'thememap', 'themechart'):
-                    num += 1
-            
-            if num < 1:
-                gcmd.GMessage(parent = self,
-                              message = _('No raster or vector map layer selected for querying.'))
-                return
-        
-        rast = list()
-        vect = list()
-        rcmd = ['r.what', '--v']
-        vcmd = ['v.what', '--v']
-        
-        if self.IsStandalone():
-            pass
-        else:
-            for layer in self.tree.GetSelections():
-                ltype = self.tree.GetPyData(layer)[0]['maplayer'].GetType()
-                dcmd = self.tree.GetPyData(layer)[0]['cmd']
-                name, found = utils.GetLayerNameFromCmd(dcmd)
-                
-                if not found:
-                    continue
-                if ltype == 'raster':
-                    rast.append(name)
-                elif ltype in ('rgb', 'his'):
-                    for iname in name.split('\n'):
-                        rast.append(iname)
-                elif ltype in ('vector', 'thememap', 'themechart'):
-                    vect.append(name)
-        
-        # use display region settings instead of computation region settings
-        self.tmpreg = os.getenv("GRASS_REGION")
-        os.environ["GRASS_REGION"] = self.Map.SetRegion(windres = False)
-        
-        # build query commands for any selected rasters and vectors
-        if rast:
-            rcmd.append('-f')
-            rcmd.append('-n')
-            rcmd.append('input=%s' % ','.join(rast))
-            rcmd.append('east_north=%f,%f' % (float(east), float(north)))
-        
-        if vect:
-            # check for vector maps open to be edited
-            digitToolbar = self.toolbars['vdigit']
-            if digitToolbar:
-                lmap = digitToolbar.GetLayer().GetName()
-                for name in vect:
-                    if lmap == name:
-                        self._layerManager.goutput.WriteWarning(_("Vector map <%s> "
-                                                                  "opened for editing - skipped.") % map)
-                        vect.remove(name)
-            
-            if len(vect) < 1:
-                self._layerManager.goutput.WriteCmdLog(_("Nothing to query."))
-                return
-            
-            vcmd.append('-a')
-            vcmd.append('map=%s' % ','.join(vect))
-            vcmd.append('east_north=%f,%f' % (float(east), float(north)))
-            vcmd.append('distance=%f' % float(qdist))
-        
-        Debug.msg(1, "QueryMap(): raster=%s vector=%s" % (','.join(rast),
-                                                          ','.join(vect)))
-        # parse query command(s)
-        if not self.IsStandalone():
-            if rast:
-                self._layerManager.goutput.RunCmd(rcmd,
-                                                  compReg = False,
-                                                  onDone  =  self._QueryMapDone)
-            if vect:
-                self._layerManager.goutput.RunCmd(vcmd,
-                                                  onDone = self._QueryMapDone)
-        else:
-            if rast:
-                gcmd.RunCommand(rcmd)
-            if vect:
-                gcmd.RunCommand(vcmd)
-        
-    def _QueryMapDone(self, cmd, returncode):
-        """!Restore settings after querying (restore GRASS_REGION)
-        
-        @param returncode command return code
-        """
-        if hasattr(self, "tmpreg"):
-            if self.tmpreg:
-                os.environ["GRASS_REGION"] = self.tmpreg
-            elif 'GRASS_REGION' in os.environ:
-                del os.environ["GRASS_REGION"]
-        elif 'GRASS_REGION' in os.environ:
-            del os.environ["GRASS_REGION"]
-        
-        if hasattr(self, "tmpreg"):
-            del self.tmpreg
-        
-    def QueryVector(self, x, y):
-        """!Query vector map layer features
-
-        Attribute data of selected vector object are displayed in GUI dialog.
-        Data can be modified (On Submit)
-        """
-        if not self.tree.layer_selected or \
-                self.tree.GetPyData(self.tree.layer_selected)[0]['type'] != 'vector':
-            gcmd.GMessage(parent = self,
-                          message = _("No map layer selected for querying."))
-            return
-        
-        posWindow = self.ClientToScreen((x + self.MapWindow.dialogOffset,
-                                         y + self.MapWindow.dialogOffset))
-        
-        qdist = 10.0 * ((self.Map.region['e'] - self.Map.region['w']) /
-                        self.Map.width)
-        
-        east, north = self.MapWindow.Pixel2Cell((x, y))
-        
-        mapName = self.tree.GetPyData(self.tree.layer_selected)[0]['maplayer'].name
-        
-        if self.tree.GetPyData(self.tree.layer_selected)[0]['maplayer'].GetMapset() != \
-                grass.gisenv()['MAPSET']:
-            mode = 'display'
-        else:
-            mode = 'update'
-        
-        if self.dialogs['attributes'] is None:
-            dlg = dbm_dialogs.DisplayAttributesDialog(parent = self.MapWindow,
-                                                      map = mapName,
-                                                      query = ((east, north), qdist),
-                                                      pos = posWindow,
-                                                      action = mode)
-            self.dialogs['attributes'] = dlg
-        
-        else:
-            # selection changed?
-            if not self.dialogs['attributes'].mapDBInfo or \
-                    self.dialogs['attributes'].mapDBInfo.map != mapName:
-                self.dialogs['attributes'].UpdateDialog(map = mapName, query = ((east, north), qdist),
-                                                        action = mode)
-            else:
-                self.dialogs['attributes'].UpdateDialog(query = ((east, north), qdist),
-                                                        action = mode)
-        if not self.dialogs['attributes'].IsFound():
-            self._layerManager.goutput.WriteLog(_('Nothing found.'))
-        
-        cats = self.dialogs['attributes'].GetCats()
-        
-        try:
-            qlayer = self.Map.GetListOfLayers(l_name = globalvar.QUERYLAYER)[0]
-        except IndexError:
-            qlayer = None
-        
-        if self.dialogs['attributes'].mapDBInfo and cats:
-            # highlight feature & re-draw map
-            if qlayer:
-                qlayer.SetCmd(self.AddTmpVectorMapLayer(mapName, cats,
-                                                        useId = False,
-                                                        addLayer = False))
-            else:
-                qlayer = self.AddTmpVectorMapLayer(mapName, cats, useId = False)
-            
-            # set opacity based on queried layer
-            opacity = self.tree.GetPyData(self.tree.layer_selected)[0]['maplayer'].GetOpacity(float = True)
-            qlayer.SetOpacity(opacity)
-            
-            self.MapWindow.UpdateMap(render = False, renderVector = False)
-            if not self.dialogs['attributes'].IsShown():
-                self.dialogs['attributes'].Show()
-        else:
-            if qlayer:
-                self.Map.DeleteLayer(qlayer)
-                self.MapWindow.UpdateMap(render = False, renderVector = False)
-            if self.dialogs['attributes'].IsShown():
-                self.dialogs['attributes'].Hide()
-        
-    def OnQuery(self, event):
-        """!Query tools menu"""
-        if self.toolbars['map']:
-            self.toolbars['map'].OnTool(event)
-            action = self.toolbars['map'].GetAction()
-        
-        if self.toolbars['nviz']:
-            toolsmenu = wx.Menu()
-            raster = wx.MenuItem(parentMenu = toolsmenu, id = wx.ID_ANY,
-                                 text = _("Query surface (raster map)"),
-                                 kind = wx.ITEM_CHECK)
-            toolsmenu.AppendItem(raster)
-            self.Bind(wx.EVT_MENU, self.OnNvizQuerySurface, raster)
-            if action == "nvizQuerySurface":
-                raster.Check(True)
-            vector = wx.MenuItem(parentMenu = toolsmenu, id = wx.ID_ANY,
-                                 text = _("Query vector map"),
-                                 kind = wx.ITEM_CHECK)
-            toolsmenu.AppendItem(vector)
-            self.Bind(wx.EVT_MENU, self.OnNvizQueryVector, vector)
-            if action == "nvizQueryVector":
-                vector.Check(True)
-
-            self.PopupMenu(toolsmenu)
-            toolsmenu.Destroy()
-        else:
-            self.toolbars['map'].action['desc'] = 'queryMap'
-            self.MapWindow.mouse['use'] = "query"
-            
-            if not self.IsStandalone():
-                # switch to output console to show query results
-                self._layerManager.notebook.SetSelectionByName('output')
-            
-            self.MapWindow.mouse['box'] = "point"
-            self.MapWindow.zoomtype = 0
-            
-            # change the cursor
-            self.MapWindow.SetCursor(self.cursors["cross"])
-        
-    def AddTmpVectorMapLayer(self, name, cats, useId = False, addLayer = True):
-        """!Add temporal vector map layer to map composition
-
-        @param name name of map layer
-        @param useId use feature id instead of category 
-        """
-        # color settings from ATM
-        color = UserSettings.Get(group = 'atm', key = 'highlight', subkey = 'color')
-        colorStr = str(color[0]) + ":" + \
-            str(color[1]) + ":" + \
-            str(color[2])
-
-        # icon used in vector display and its size
-        icon = ''
-        size = 0
-        vparam = self.tree.GetPyData(self.tree.layer_selected)[0]['cmd']
-        for p in vparam:
-            if '=' in p:
-                parg,pval = p.split('=')
-                if parg == 'icon': icon = pval
-                elif parg == 'size': size = int(pval)
-
-        pattern = ["d.vect",
-                   "map=%s" % name,
-                   "color=%s" % colorStr,
-                   "fcolor=%s" % colorStr,
-                   "width=%d"  % UserSettings.Get(group = 'atm', key = 'highlight', subkey = 'width')]
-        if icon != '':
-            pattern.append('icon=%s' % icon)
-        if size > 0:
-            pattern.append('size=%i' % size)
-        
-        if useId:
-            cmd = pattern
-            cmd.append('-i')
-            cmd.append('cats=%s' % str(cats))
-        else:
-            cmd = []
-            for layer in cats.keys():
-                cmd.append(copy.copy(pattern))
-                lcats = cats[layer]
-                cmd[-1].append("layer=%d" % layer)
-                cmd[-1].append("cats=%s" % utils.ListOfCatsToRange(lcats))
-        
-        if addLayer:
-            if useId:
-                return self.Map.AddLayer(type = 'vector', name = globalvar.QUERYLAYER, command = cmd,
-                                         l_active = True, l_hidden = True, l_opacity = 1.0)
-            else:
-                return self.Map.AddLayer(type = 'command', name = globalvar.QUERYLAYER, command = cmd,
-                                         l_active = True, l_hidden = True, l_opacity = 1.0)
-        else:
-            return cmd
-
-    def OnAnalyze(self, event):
-        """!Analysis tools menu
-        """
-        point = wx.GetMousePosition()
-        toolsmenu = wx.Menu()
-        icons = Icons['displayWindow']
-        
-        # Add items to the menu
-        measure = wx.MenuItem(toolsmenu, wx.ID_ANY, icons["measure"].GetLabel())
-        measure.SetBitmap(icons["measure"].GetBitmap(self.iconsize))
-        toolsmenu.AppendItem(measure)
-        self.Bind(wx.EVT_MENU, self.OnMeasure, measure)
-        
-        profile = wx.MenuItem(toolsmenu, wx.ID_ANY, icons["profile"].GetLabel())
-        profile.SetBitmap(icons["profile"].GetBitmap(self.iconsize))
-        toolsmenu.AppendItem(profile)
-        self.Bind(wx.EVT_MENU, self.Profile, profile)
-
-        histogram = wx.MenuItem(toolsmenu, wx.ID_ANY, icons["histogram"].GetLabel())
-        histogram.SetBitmap(icons["histogram"].GetBitmap(self.iconsize))
-        toolsmenu.AppendItem(histogram)
-        self.Bind(wx.EVT_MENU, self.Histogram, histogram)
-
-        # Popup the menu.  If an item is selected then its handler
-        # will be called before PopupMenu returns.
-        self.PopupMenu(toolsmenu)
-        toolsmenu.Destroy()
-
-    def OnMeasure(self, event):
-        """!Init measurement routine that calculates map distance
-        along transect drawn on map display
-        """
-        self.totaldist = 0.0 # total measured distance
-        
-        # switch Layer Manager to output console to show measure results
-        self._layerManager.notebook.SetSelectionByName('output')
-        
-        # change mouse to draw line for measurement
-        self.MapWindow.mouse['use'] = "measure"
-        self.MapWindow.mouse['box'] = "line"
-        self.MapWindow.zoomtype = 0
-        self.MapWindow.pen     = wx.Pen(colour = 'red', width = 2, style = wx.SHORT_DASH)
-        self.MapWindow.polypen = wx.Pen(colour = 'green', width = 2, style = wx.SHORT_DASH)
-        
-        # change the cursor
-        self.MapWindow.SetCursor(self.cursors["pencil"])
-        
-        # initiating output
-        style = self._layerManager.goutput.cmd_output.StyleWarning
-        self._layerManager.goutput.WriteLog(_('Click and drag with left mouse button '
-                                              'to measure.%s'
-                                              'Double click with left button to clear.') % \
-                                                (os.linesep), style)
-        if self.Map.projinfo['proj'] != 'xy':
-            units = self.Map.projinfo['units']
-            self._layerManager.goutput.WriteCmdLog(_('Measuring distance') + ' ('
-                                                   + units + '):')
-        else:
-            self._layerManager.goutput.WriteCmdLog(_('Measuring distance:'))
-        
-        if self.Map.projinfo['proj'] == 'll':
-            try:
-                import grass.lib.gis as gislib
-                global haveCtypes
-                haveCtypes = True
-
-                gislib.G_begin_distance_calculations()
-            except ImportError, e:
-                self._layerManager.goutput.WriteWarning(_('Geodesic distance is not yet '
-                                                          'supported by this tool.\n'
-                                                          'Reason: %s' % e))
-        
-    def MeasureDist(self, beginpt, endpt):
-        """!Calculate map distance from screen distance
-        and print to output window
-        """
-        self._layerManager.notebook.SetSelectionByName('output')
-        
-        dist, (north, east) = self.MapWindow.Distance(beginpt, endpt)
-        
-        dist = round(dist, 3)
-        d, dunits = self.FormatDist(dist)
-        
-        self.totaldist += dist
-        td, tdunits = self.FormatDist(self.totaldist)
-        
-        strdist = str(d)
-        strtotdist = str(td)
-        
-        if self.Map.projinfo['proj'] == 'xy' or 'degree' not in self.Map.projinfo['unit']:
-            angle = int(math.degrees(math.atan2(north,east)) + 0.5)
-            angle = 180 - angle
-            if angle < 0:
-                angle = 360 + angle
-            
-            mstring = '%s = %s %s\n%s = %s %s\n%s = %d %s\n%s' \
-                % (_('segment'), strdist, dunits,
-                   _('total distance'), strtotdist, tdunits,
-                   _('bearing'), angle, _('deg'),
-                   '-' * 60)
-        else:
-            mstring = '%s = %s %s\n%s = %s %s\n%s' \
-                % (_('segment'), strdist, dunits,
-                   _('total distance'), strtotdist, tdunits,
-                   '-' * 60)
-        
-        self._layerManager.goutput.WriteLog(mstring)
-        
-        return dist
-
-    def Profile(self, event):
-        """!Init profile canvas and tools
-        """
-        raster = []
-        if self.tree.layer_selected and \
-                self.tree.GetPyData(self.tree.layer_selected)[0]['type'] == 'raster':
-            raster.append(self.tree.GetPyData(self.tree.layer_selected)[0]['maplayer'].name)
-
-        self.profile = profile.ProfileFrame(self,
-                                            id = wx.ID_ANY, pos = wx.DefaultPosition, size = (700,300),
-                                            style = wx.DEFAULT_FRAME_STYLE, rasterList = raster)
-        self.profile.Show()
-        # Open raster select dialog to make sure that a raster (and the desired raster)
-        # is selected to be profiled
-        self.profile.OnSelectRaster(None)
-
-    def FormatDist(self, dist):
-        """!Format length numbers and units in a nice way,
-        as a function of length. From code by Hamish Bowman
-        Grass Development Team 2006"""
-        
-        mapunits = self.Map.projinfo['units']
-        if mapunits == 'metres':
-            mapunits = 'meters'
-        outunits = mapunits
-        dist = float(dist)
-        divisor = 1.0
-        
-        # figure out which units to use
-        if mapunits == 'meters':
-            if dist > 2500.0:
-                outunits = 'km'
-                divisor = 1000.0
-            else: outunits = 'm'
-        elif mapunits == 'feet':
-            # nano-bug: we match any "feet", but US Survey feet is really
-            #  5279.9894 per statute mile, or 10.6' per 1000 miles. As >1000
-            #  miles the tick markers are rounded to the nearest 10th of a
-            #  mile (528'), the difference in foot flavours is ignored.
-            if dist > 5280.0:
-                outunits = 'miles'
-                divisor = 5280.0
-            else:
-                outunits = 'ft'
-        elif 'degree' in mapunits and \
-                not haveCtypes:
-            if dist < 1:
-                outunits = 'min'
-                divisor = (1/60.0)
-            else:
-                outunits = 'deg'
-        else:
-            outunits = 'meters'
-        
-        # format numbers in a nice way
-        if (dist/divisor) >= 2500.0:
-            outdist = round(dist/divisor)
-        elif (dist/divisor) >= 1000.0:
-            outdist = round(dist/divisor,1)
-        elif (dist/divisor) > 0.0:
-            outdist = round(dist/divisor,int(math.ceil(3-math.log10(dist/divisor))))
-        else:
-            outdist = float(dist/divisor)
-        
-        return (outdist, outunits)
-    
-    def Histogram(self, event):
-        """!Init histogram display canvas and tools
-        """
-        self.histogram = histogram.HistFrame(self,
-                                             id = wx.ID_ANY, size = globalvar.HIST_WINDOW_SIZE,
-                                             style = wx.DEFAULT_FRAME_STYLE)
-
-        #show new display
-        self.histogram.Show()
-        self.histogram.Refresh()
-        self.histogram.Update()
-
-
-    def OnDecoration(self, event):
-        """!Decorations overlay menu
-        """
-        point = wx.GetMousePosition()
-        decmenu = wx.Menu()
-        icons = Icons['displayWindow']
-        
-        # Add items to the menu
-        AddScale = wx.MenuItem(decmenu, wx.ID_ANY, icons["addBarscale"].GetLabel())
-        AddScale.SetBitmap(icons["addBarscale"].GetBitmap(self.iconsize))
-        decmenu.AppendItem(AddScale)
-        self.Bind(wx.EVT_MENU, self.OnAddBarscale, AddScale)
-        
-        AddLegend = wx.MenuItem(decmenu, wx.ID_ANY, icons["addLegend"].GetLabel())
-        AddLegend.SetBitmap(icons["addLegend"].GetBitmap(self.iconsize))
-        decmenu.AppendItem(AddLegend)
-        self.Bind(wx.EVT_MENU, self.OnAddLegend, AddLegend)
-        
-        AddText = wx.MenuItem(decmenu, wx.ID_ANY, icons["addText"].GetLabel())
-        AddText.SetBitmap(icons["addText"].GetBitmap(self.iconsize))
-        decmenu.AppendItem(AddText)
-        self.Bind(wx.EVT_MENU, self.OnAddText, AddText)
-        
-        # Popup the menu.  If an item is selected then its handler
-        # will be called before PopupMenu returns.
-        self.PopupMenu(decmenu)
-        decmenu.Destroy()
-        
-    def OnAddBarscale(self, event):
-        """!Handler for scale/arrow map decoration menu selection.
-        """
-        if self.dialogs['barscale']:
-            return
-        
-        id = 0 # unique index for overlay layer
-
-        # If location is latlon, only display north arrow (scale won't work)
-        #        proj = self.Map.projinfo['proj']
-        #        if proj == 'll':
-        #            barcmd = 'd.barscale -n'
-        #        else:
-        #            barcmd = 'd.barscale'
-
-        # decoration overlay control dialog
-        self.dialogs['barscale'] = \
-            gdialogs.DecorationDialog(parent = self, title = _('Scale and North arrow'),
-                                      size = (350, 200),
-                                      style = wx.DEFAULT_DIALOG_STYLE | wx.CENTRE,
-                                      cmd = ['d.barscale', 'at=0,5'],
-                                      ovlId = id,
-                                      name = 'barscale',
-                                      checktxt = _("Show/hide scale and North arrow"),
-                                      ctrltxt = _("scale object"))
-
-        self.dialogs['barscale'].CentreOnParent()
-        ### dialog cannot be show as modal - in the result d.barscale is not selectable
-        ### self.dialogs['barscale'].ShowModal()
-        self.dialogs['barscale'].Show()
-        self.MapWindow.mouse['use'] = 'pointer'        
-
-    def OnAddLegend(self, event):
-        """!Handler for legend map decoration menu selection.
-        """
-        if self.dialogs['legend']:
-            return
-        
-        id = 1 # index for overlay layer in render
-
-        cmd = ['d.legend', 'at=5,50,2,5']
-        if self.tree.layer_selected and \
-                self.tree.GetPyData(self.tree.layer_selected)[0]['type'] == 'raster':
-            cmd.append('map=%s' % self.tree.GetPyData(self.tree.layer_selected)[0]['maplayer'].name)
-
-        # Decoration overlay control dialog
-        self.dialogs['legend'] = \
-            gdialogs.DecorationDialog(parent = self, title = ('Legend'),
-                                      size = (350, 200),
-                                      style = wx.DEFAULT_DIALOG_STYLE | wx.CENTRE,
-                                      cmd = cmd,
-                                      ovlId = id,
-                                      name = 'legend',
-                                      checktxt = _("Show/hide legend"),
-                                      ctrltxt = _("legend object")) 
-
-        self.dialogs['legend'].CentreOnParent() 
-        ### dialog cannot be show as modal - in the result d.legend is not selectable
-        ### self.dialogs['legend'].ShowModal()
-        self.dialogs['legend'].Show()
-        self.MapWindow.mouse['use'] = 'pointer'
-
-    def OnAddText(self, event):
-        """!Handler for text decoration menu selection.
-        """
-        if self.MapWindow.dragid > -1:
-            id = self.MapWindow.dragid
-        else:
-            # index for overlay layer in render
-            if len(self.MapWindow.textdict.keys()) > 0:
-                id = self.MapWindow.textdict.keys()[-1] + 1
-            else:
-                id = 101
-
-        self.dialogs['text'] = gdialogs.TextLayerDialog(parent = self, ovlId = id, 
-                                                        title = _('Add text layer'),
-                                                        size = (400, 200))
-        self.dialogs['text'].CenterOnParent()
-
-        # If OK button pressed in decoration control dialog
-        if self.dialogs['text'].ShowModal() == wx.ID_OK:
-            text = self.dialogs['text'].GetValues()['text']
-            active = self.dialogs['text'].GetValues()['active']
-            coords, w, h = self.MapWindow.TextBounds(self.dialogs['text'].GetValues())
-        
-            # delete object if it has no text or is not active
-            if text == '' or active == False:
-                try:
-                    self.MapWindow.pdc.ClearId(id)
-                    self.MapWindow.pdc.RemoveId(id)
-                    del self.MapWindow.textdict[id]
-                except:
-                    pass
-                return
-
-            self.MapWindow.pdc.ClearId(id)
-            self.MapWindow.pdc.SetId(id)
-            self.MapWindow.textdict[id] = self.dialogs['text'].GetValues()
-            
-            self.MapWindow.Draw(self.MapWindow.pdcDec, img = self.MapWindow.textdict[id],
-                                drawid = id, pdctype = 'text', coords = coords)
-            
-            self.MapWindow.UpdateMap(render = False, renderVector = False)
-            
-        self.MapWindow.mouse['use'] = 'pointer'
-
-    def GetOptData(self, dcmd, type, params, propwin):
-        """!Callback method for decoration overlay command generated by
-        dialog created in menuform.py
-        """
-        # Reset comand and rendering options in render.Map. Always render decoration.
-        # Showing/hiding handled by PseudoDC
-        self.Map.ChangeOverlay(ovltype = type, type = 'overlay', name = '', command = dcmd,
-                               l_active = True, l_render = False)
-        self.params[type] = params
-        self.propwin[type] = propwin
-
-    def OnZoomToMap(self, event):
-        """!Set display extents to match selected raster (including
-        NULLs) or vector map.
-        """
-        self.MapWindow.ZoomToMap()
-
-    def OnZoomToRaster(self, event):
-        """!Set display extents to match selected raster map (ignore NULLs)
-        """
-        self.MapWindow.ZoomToMap(ignoreNulls = True)
-
-    def OnZoomToWind(self, event):
-        """!Set display geometry to match computational region
-        settings (set with g.region)
-        """
-        self.MapWindow.ZoomToWind()
-        
-    def OnZoomToDefault(self, event):
-        """!Set display geometry to match default region settings
-        """
-        self.MapWindow.ZoomToDefault()
-        
-    def OnZoomToSaved(self, event):
-        """!Set display geometry to match extents in
-        saved region file
-        """
-        self.MapWindow.ZoomToSaved()
-        
-    def OnDisplayToWind(self, event):
-        """!Set computational region (WIND file) to match display
-        extents
-        """
-        self.MapWindow.DisplayToWind()
- 
-    def SaveDisplayRegion(self, event):
-        """!Save display extents to named region file.
-        """
-        self.MapWindow.SaveDisplayRegion()
-        
-    def OnZoomMenu(self, event):
-        """!Popup Zoom menu
-        """
-        point = wx.GetMousePosition()
-        zoommenu = wx.Menu()
-        # Add items to the menu
-
-        zoomwind = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to computational region (set with g.region)'))
-        zoommenu.AppendItem(zoomwind)
-        self.Bind(wx.EVT_MENU, self.OnZoomToWind, zoomwind)
-
-        zoomdefault = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to default region'))
-        zoommenu.AppendItem(zoomdefault)
-        self.Bind(wx.EVT_MENU, self.OnZoomToDefault, zoomdefault)
-
-        zoomsaved = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to saved region'))
-        zoommenu.AppendItem(zoomsaved)
-        self.Bind(wx.EVT_MENU, self.OnZoomToSaved, zoomsaved)
-
-        savewind = wx.MenuItem(zoommenu, wx.ID_ANY, _('Set computational region from display extent'))
-        zoommenu.AppendItem(savewind)
-        self.Bind(wx.EVT_MENU, self.OnDisplayToWind, savewind)
-
-        savezoom = wx.MenuItem(zoommenu, wx.ID_ANY, _('Save display geometry to named region'))
-        zoommenu.AppendItem(savezoom)
-        self.Bind(wx.EVT_MENU, self.SaveDisplayRegion, savezoom)
-
-        # Popup the menu. If an item is selected then its handler
-        # will be called before PopupMenu returns.
-        self.PopupMenu(zoommenu)
-        zoommenu.Destroy()
-        
-    def SetProperties(self, render = False, mode = 0, showCompExtent = False,
-                      constrainRes = False, projection = False):
-        """!Set properies of map display window"""
-        self.statusbarWin['render'].SetValue(render)
-        self.statusbarWin['toggle'].SetSelection(mode)
-        self.StatusbarUpdate()
-        self.statusbarWin['region'].SetValue(showCompExtent)
-        self.statusbarWin['resolution'].SetValue(constrainRes)
-        self.statusbarWin['projection'].SetValue(projection)
-        if showCompExtent:
-            self.MapWindow.regionCoords = []
-        
-    def IsStandalone(self):
-        """!Check if Map display is standalone"""
-        if self._layerManager:
-            return False
-        
-        return True
-    
-    def GetLayerManager(self):
-        """!Get reference to Layer Manager
-
-        @return window reference
-        @return None (if standalone)
-        """
-        return self._layerManager
-    
-# end of class MapFrame
-
-class MapApp(wx.App):
-    def OnInit(self):
-        wx.InitAllImageHandlers()
-        if __name__ == "__main__":
-            Map = render.Map() # instance of Map class to render GRASS display output to PPM file
-        else:
-            Map = None
-
-        self.mapFrm = MapFrame(parent = None, id = wx.ID_ANY, Map = Map,
-                               size = globalvar.MAP_WINDOW_SIZE)
-        #self.SetTopWindow(Map)
-        self.mapFrm.Show()
-
-        if __name__ == "__main__":
-            # redraw map, if new command appears
-            self.redraw = False
-            status = Command(self, Map, cmdfilename)
-            status.start()
-            self.timer = wx.PyTimer(self.watcher)
-            # check each 0.1s
-            self.timer.Start(100)
-
-        return 1
-
-    def OnExit(self):
-        if __name__ == "__main__":
-            # stop the timer
-            self.timer.Stop()
-            # terminate thread (a bit ugly)
-            os.system("""!echo "quit" >> %s""" % (cmdfilename))
-
-    def watcher(self):
-        """!Redraw, if new layer appears"""
-        if self.redraw:
-            self.mapFrm.OnDraw(None)
-        self.redraw = False
-        return
-# end of class MapApp
-
-if __name__ == "__main__":
-
-    ###### SET command variable
-    if len(sys.argv) != 3:
-        print __doc__
-        sys.exit()
-
-    title = sys.argv[1]
-    cmdfilename = sys.argv[2]
-
-    import gettext
-    gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
-
-    print >> sys.stderr, "\nStarting monitor <%s>...\n" % (title)
-
-    gm_map = MapApp(0)
-    # set title
-    gm_map.mapFrm.SetTitle(_("GRASS GIS Map Display: " +
-                             title + 
-                             " - Location: " + grass.gisenv()["LOCATION_NAME"]))
-    
-    gm_map.MainLoop()
-
-    if grass.gisenv().has_key("MONITOR"):
-        os.system("d.mon sel=%s" % grass.gisenv()["MONITOR"])
-
-    os.remove(cmdfilename)
-    os.system("""!g.gisenv set="GRASS_PYCMDFILE" """)
-
-    print >> sys.stderr, "\nStoping monitor <%s>...\n" % (title)
-
-    sys.exit(0)
diff --git a/gui/wxpython/gui_modules/mapdisp_command.py b/gui/wxpython/gui_modules/mapdisp_command.py
deleted file mode 100644
index e5a65d0..0000000
--- a/gui/wxpython/gui_modules/mapdisp_command.py
+++ /dev/null
@@ -1,63 +0,0 @@
-"""
- at package mapdisp.py
-
- at brief Command line useg of GIS map display canvas.view).
-
-Classes:
- - Command
-
-(C) 2006-2009 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
-
- at author Jachym Cepicky
-"""
-
-import sys
-import time
-
-from threading import Thread
-
-class Command(Thread):
-    """
-    Creates thread which will observe the command file and see, if
-    there is new command to be executed
-    """
-    def __init__ (self, parent, Map, cmdfile):
-        Thread.__init__(self)
-
-        global cmdfilename
-
-        self.parent = parent
-        self.map = Map
-        self.cmdfile = open(cmdfile, "r")
-
-    def run(self):
-        """
-        Run this in thread
-        """
-        dispcmd = []
-        while 1:
-            self.parent.redraw = False
-            line = self.cmdfile.readline().strip()
-            if line == "quit":
-                break
-
-            if line:
-                try:
-                    Debug.msg (3, "Command.run(): cmd=%s" % (line))
-
-                    self.map.AddLayer(item=None, type="raster",
-                                      name='',
-                                      command=line,
-                                      l_opacity=1)
-
-                    self.parent.redraw =True
-
-                except Exception, e:
-                    print "Command Thread: ",e
-
-            time.sleep(0.1)
-
-        sys.exit()
diff --git a/gui/wxpython/gui_modules/nviz.py b/gui/wxpython/gui_modules/nviz.py
deleted file mode 100644
index bdd5e63..0000000
--- a/gui/wxpython/gui_modules/nviz.py
+++ /dev/null
@@ -1,44 +0,0 @@
-"""!
- at package nviz.py
-
- at brief Nviz (3D view) module
-
-This module implements 3D visualization mode for map display.
-
-Map Display supports standard 2D view mode ('mapdisp' module) and
-2.5/3D mode ('nviz_mapdisp' module).
-
-(C) 2008, 2010 by the GRASS Development Team
-
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
-
- at author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
-"""
-
-errorMsg = ''
-
-import os
-import sys
-
-import wx
-import globalvar
-try:
-    # from wx import glcanvas
-    # disable wxNviz for 6.4.2
-    # TODO: backport wxNviz from devbr6 *after* releasing 6.4.2
-    # import nviz_mapdisp
-    # import nviz_tools
-    # import wxnviz
-    haveNviz = False
-except (ImportError, NameError), err:
-    haveNviz = False
-    errorMsg = err
-
-if haveNviz:
-    GLWindow = nviz_mapdisp.GLWindow
-    NvizToolWindow = nviz_tools.NvizToolWindow
-else:
-    GLWindow = None
-    NvizToolWindow = None
diff --git a/gui/wxpython/gui_modules/nviz_mapdisp.py b/gui/wxpython/gui_modules/nviz_mapdisp.py
deleted file mode 100644
index 7946c1a..0000000
--- a/gui/wxpython/gui_modules/nviz_mapdisp.py
+++ /dev/null
@@ -1,1160 +0,0 @@
-"""
- at package nviz_mapdisp.py
-
- at brief Nviz extension for wxGUI
-
-This module implements 3D visualization mode of map display.
-
-List of classes:
- - GLWindow
-
-(C) 2008-2009 by the GRASS Development Team
-
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
-
- at author Martin Landa <landa.martin gmail.com> (Google SoC 2008)
-"""
-
-import os
-import sys
-import time
-import copy
-import math
-
-from threading import Thread
-
-import wx
-import wx.lib.scrolledpanel as scrolled
-from wx.lib.newevent import NewEvent
-from wx import glcanvas
-
-import gcmd
-import globalvar
-from debug          import Debug
-from mapdisp_window import MapWindow
-from goutput        import wxCmdOutput
-from preferences    import globalSettings as UserSettings
-from workspace      import Nviz as NvizDefault
-
-try:
-    import wxnviz
-except (ImportError, NameError):
-    pass
-
-wxUpdateProperties, EVT_UPDATE_PROP  = NewEvent()
-wxUpdateView,       EVT_UPDATE_VIEW  = NewEvent()
-wxUpdateLight,      EVT_UPDATE_LIGHT = NewEvent()
-
-class NvizThread(Thread):
-    def __init__(self, log, progressbar, window):
-        Thread.__init__(self)
-        
-        self.log = log
-        self.progressbar = progressbar
-        self.window = window
-        
-        self._display = None
-        
-        self.setDaemon(True)
-
-    def run(self):
-        self._display = wxnviz.Nviz(self.log, self.progressbar)
-        
-    def GetDisplay(self):
-        """!Get display instance"""
-        return self._display
-    
-class GLWindow(MapWindow, glcanvas.GLCanvas):
-    """!OpenGL canvas for Map Display Window"""
-    def __init__(self, parent, id = wx.ID_ANY,
-                 Map = None, tree = None, lmgr = None):
-        self.parent = parent # MapFrame
-        
-        glcanvas.GLCanvas.__init__(self, parent, id)
-        MapWindow.__init__(self, parent, id, 
-                           Map, tree, lmgr)
-        self.Hide()
-        
-        self.init = False
-        self.initView = False
-        
-        # render mode 
-        self.render = { 'quick' : False,
-                        # do not render vector lines in quick mode
-                        'vlines' : False,
-                        'vpoints' : False }
-        
-        # list of loaded map layers (layer tree items)
-        self.layers  = list()
-        # list of query points
-        self.qpoints = list()
-        
-        #
-        # use display region instead of computational
-        #
-        os.environ['GRASS_REGION'] = self.Map.SetRegion()
-        
-        #
-        # create nviz instance
-        #
-        if self.lmgr:
-            self.log = self.lmgr.goutput
-            logerr = self.lmgr.goutput.GetLog(err = True)
-            logmsg = self.lmgr.goutput.GetLog()
-        else:
-            self.log = logmsg = sys.stdout
-            logerr = sys.stderr
-        
-        self.nvizThread = NvizThread(logerr,
-                                     self.parent.statusbarWin['progress'],
-                                     logmsg)
-        self.nvizThread.start()
-        time.sleep(.1)
-        self._display = self.nvizThread.GetDisplay()
-        
-        # GRASS_REGION needed only for initialization
-        del os.environ['GRASS_REGION']
-        
-        self.img = wx.Image(self.Map.mapfile, wx.BITMAP_TYPE_ANY)
-        
-        # size of MapWindow, to avoid resizing if size is the same
-        self.size = (0,0)
-        
-        #
-        # default values
-        #
-        self.view = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'view')) # copy
-        self.iview = UserSettings.Get(group = 'nviz', key = 'view', internal = True)
-        
-        self.nvizDefault = NvizDefault()
-        self.light = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'light')) # copy
-        
-        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
-        self.Bind(wx.EVT_SIZE,             self.OnSize)
-        self.Bind(wx.EVT_PAINT,            self.OnPaint)
-        self.Bind(wx.EVT_LEFT_UP,          self.OnLeftUp)
-        self.Bind(wx.EVT_MOUSE_EVENTS,     self.OnMouseAction)
-        self.Bind(wx.EVT_MOTION,           self.OnMotion)
-        
-        self.Bind(EVT_UPDATE_PROP,  self.UpdateMapObjProperties)
-        self.Bind(EVT_UPDATE_VIEW,  self.UpdateView)
-        self.Bind(EVT_UPDATE_LIGHT, self.UpdateLight)
-        
-        self.Bind(wx.EVT_CLOSE, self.OnClose)
-        
-    def OnClose(self, event):
-        # cleanup when window actually closes (on quit) and not just is hidden
-        self.Reset()
-        
-    def OnEraseBackground(self, event):
-        pass # do nothing, to avoid flashing on MSW
-    
-    def OnSize(self, event):
-        size = self.GetClientSize()
-        if self.size != size \
-            and self.GetContext():
-            Debug.msg(3, "GLCanvas.OnSize(): w = %d, h = %d" % \
-                      (size.width, size.height))
-            self.SetCurrent()
-            self._display.ResizeWindow(size.width,
-                                       size.height)
-        self.size = size
-        event.Skip()
-        
-    def OnPaint(self, event):
-        Debug.msg(1, "GLCanvas.OnPaint()")
-        
-        dc = wx.PaintDC(self)
-        self.SetCurrent()
-        
-        if not self.initView:
-            self._display.InitView()
-            self.initView = True
-        
-        self.LoadDataLayers()
-        self.UnloadDataLayers()
-        
-        if not self.init:
-            self.ResetView()
-            
-            if hasattr(self.lmgr, "nviz"):
-                self.lmgr.nviz.UpdatePage('view')
-                self.lmgr.nviz.UpdatePage('light')
-                layer = self.GetSelectedLayer()
-                if layer:
-                    if layer.type ==  'raster':
-                        self.lmgr.nviz.UpdatePage('surface')
-                        self.lmgr.nviz.UpdatePage('fringe')
-                    elif layer.type ==  'vector':
-                        self.lmgr.nviz.UpdatePage('vector')
-                
-                ### self.lmgr.nviz.UpdateSettings()
-                
-                # update widgets
-                win = self.lmgr.nviz.FindWindowById( \
-                    self.lmgr.nviz.win['vector']['lines']['surface'])
-                win.SetItems(self.GetLayerNames('raster'))
-            
-            self.init = True
-        
-        self.UpdateMap()
-                
-    def OnMouseAction(self, event):
-        # change perspective with mouse wheel
-        wheel = event.GetWheelRotation()
-        
-        if wheel !=  0:
-            current  = event.GetPositionTuple()[:]
-            Debug.msg (5, "GLWindow.OnMouseMotion(): wheel = %d" % wheel)
-            prev_value = self.view['persp']['value']
-            if wheel > 0:
-                value = -1 * self.view['persp']['step']
-            else:
-                value = self.view['persp']['step']
-            self.view['persp']['value'] +=  value
-            if self.view['persp']['value'] < 1:
-                self.view['persp']['value'] = 1
-            elif self.view['persp']['value'] > 100:
-                self.view['persp']['value'] = 100
-            
-            if prev_value !=  self.view['persp']['value']:
-                if hasattr(self.lmgr, "nviz"):
-                    self.lmgr.nviz.UpdateSettings()
-                    
-                    self._display.SetView(self.view['position']['x'], self.view['position']['y'],
-                                          self.iview['height']['value'],
-                                          self.view['persp']['value'],
-                                          self.view['twist']['value'])
-                
-                # redraw map
-                self.OnPaint(None)
-                
-                # update statusbar
-                ### self.parent.StatusbarUpdate()
-        
-        event.Skip()
-
-    def Pixel2Cell(self, (x, y)):
-        """!Convert image coordinates to real word coordinates
-
-        @param x, y image coordinates
-        
-        @return easting, northing
-        @return None on error
-        """
-        size = self.GetClientSize()
-        # UL -> LL
-        sid, x, y, z = self._display.GetPointOnSurface(x, y)
-        
-        if not sid:
-            return None
-        
-        return (x, y)
-    
-    def OnLeftUp(self, event):
-        self.ReleaseMouse()
-        if self.mouse["use"] == "nvizQuerySurface":
-            self.OnQuerySurface(event)
-        elif self.mouse["use"] == "nvizQueryVector":
-            self.OnQueryVector(event)
-    
-    def OnQuerySurface(self, event):
-        """!Query surface on given position"""
-        result = self._display.QueryMap(event.GetX(), event.GetY())
-        if result:
-            self.qpoints.append((result['x'], result['y'], result['z']))
-            self.log.WriteLog("%-30s: %.3f" % (_("Easting"),   result['x']))
-            self.log.WriteLog("%-30s: %.3f" % (_("Northing"),  result['y']))
-            self.log.WriteLog("%-30s: %.3f" % (_("Elevation"), result['z']))
-            self.log.WriteLog("%-30s: %s" % (_("Surface map elevation"), result['elevation']))
-            self.log.WriteLog("%-30s: %s" % (_("Surface map color"), result['color']))
-            if len(self.qpoints) > 1:
-                prev = self.qpoints[-2]
-                curr = self.qpoints[-1]
-                dxy = math.sqrt(pow(prev[0]-curr[0], 2) +
-                                pow(prev[1]-curr[1], 2))
-                dxyz = math.sqrt(pow(prev[0]-curr[0], 2) +
-                                 pow(prev[1]-curr[1], 2) +
-                                 pow(prev[2]-curr[2], 2))
-                self.log.WriteLog("%-30s: %.3f" % (_("XY distance from previous"), dxy))
-                self.log.WriteLog("%-30s: %.3f" % (_("XYZ distance from previous"), dxyz))
-                self.log.WriteLog("%-30s: %.3f" % (_("Distance along surface"),
-                                              self._display.GetDistanceAlongSurface(result['id'],
-                                                                                    (curr[0], curr[1]),
-                                                                                    (prev[0], prev[1]),
-                                                                                    useExag = False)))
-                self.log.WriteLog("%-30s: %.3f" % (_("Distance along exag. surface"),
-                                              self._display.GetDistanceAlongSurface(result['id'],
-                                                                                    (curr[0], curr[1]),
-                                                                                    (prev[0], prev[1]),
-                                                                                      useExag = True)))
-            self.log.WriteCmdLog('-' * 80)
-        else:
-            self.log.WriteLog(_("No point on surface"))
-            self.log.WriteCmdLog('-' * 80)
-    
-    def OnQueryVector(self, event):
-        """!Query vector on given position"""
-        self.log.WriteWarning(_("Function not implemented yet"))
-        self.log.WriteCmdLog('-' * 80)
-        
-    def UpdateView(self, event):
-        """!Change view settings"""
-        data = self.view
-        self._display.SetView(data['position']['x'], data['position']['y'],
-                              self.iview['height']['value'],
-                              data['persp']['value'],
-                              data['twist']['value'])
-        
-        if event and event.zExag and 'value' in data['z-exag']:
-            self._display.SetZExag(data['z-exag']['value'])
-        
-        if event:
-            event.Skip()
-
-    def UpdateLight(self, event):
-        """!Change light settings"""
-        data = self.light
-        self._display.SetLight(x = data['position']['x'], y = data['position']['y'],
-                               z = data['position']['z'] / 100., color = data['color'],
-                               bright = data['bright'] / 100.,
-                               ambient = data['ambient'] / 100.)
-        self._display.DrawLightingModel()
-        
-    def UpdateMap(self, render = True):
-        """!Updates the canvas anytime there is a change to the
-        underlaying images or to the geometry of the canvas.
-        
-        @param render re-render map composition
-        """
-        start = time.clock()
-        
-        self.resize = False
-        
-        if self.render['quick'] is False:
-            self.parent.statusbarWin['progress'].Show()
-            self.parent.statusbarWin['progress'].SetRange(2)
-            self.parent.statusbarWin['progress'].SetValue(0)
-        
-        if self.render['quick'] is False:
-            self.parent.statusbarWin['progress'].SetValue(1)
-            self._display.Draw(False, -1)
-        elif self.render['quick'] is True:
-            # quick
-            mode = wxnviz.DRAW_QUICK_SURFACE | wxnviz.DRAW_QUICK_VOLUME
-            if self.render['vlines']:
-                mode |=  wxnviz.DRAW_QUICK_VLINES
-            if self.render['vpoints']:
-                mode |=  wxnviz.DRAW_QUICK_VPOINTS
-            self._display.Draw(True, mode)
-        else: # None -> reuse last rendered image
-            pass # TODO
-        
-        self.SwapBuffers()
-        
-        stop = time.clock()
-        
-        if self.render['quick'] is False:
-            self.parent.statusbarWin['progress'].SetValue(2)
-            # hide process bar
-            self.parent.statusbarWin['progress'].Hide()
-        
-        Debug.msg(3, "GLWindow.UpdateMap(): quick = %d, -> time = %g" % \
-                      (self.render['quick'], (stop-start)))
-        
-    def EraseMap(self):
-        """!Erase the canvas
-        """
-        self._display.EraseMap()
-        self.SwapBuffers()
-        
-    def IsLoaded(self, item):
-        """!Check if layer (item) is already loaded
-        
-        @param item layer item
-        """
-        layer = self.tree.GetPyData(item)[0]['maplayer']
-        data = self.tree.GetPyData(item)[0]['nviz']
-        
-        if not data:
-            return 0
-        
-        if layer.type ==  'raster':
-            if 'object' not in data['surface']:
-                return 0
-        elif layer.type ==  'vector':
-            if 'object' not in data['vlines'] and \
-                    'object' not in data['points']:
-                return 0
-        
-        return 1
-
-    def _GetDataLayers(self, item, litems):
-        """!Return get list of enabled map layers"""
-        # load raster & vector maps
-        while item and item.IsOk():
-            type = self.tree.GetPyData(item)[0]['type']
-            if type ==  'group':
-                subItem = self.tree.GetFirstChild(item)[0]
-                self._GetDataLayers(subItem, litems)
-                item = self.tree.GetNextSibling(item)
-                
-            if not item.IsChecked() or \
-                    type not in ('raster', 'vector', '3d-raster'):
-                item = self.tree.GetNextSibling(item)
-                continue
-            
-            litems.append(item)
-            
-            item = self.tree.GetNextSibling(item)
-        
-    def LoadDataLayers(self):
-        """!Load raster/vector from current layer tree
-        
-        @todo volumes
-        """
-        if not self.tree:
-            return
-        
-        listOfItems = []
-        item = self.tree.GetFirstChild(self.tree.root)[0]
-        self._GetDataLayers(item, listOfItems)
-        
-        start = time.time()
-        
-        while(len(listOfItems) > 0):
-            item = listOfItems.pop()
-            type = self.tree.GetPyData(item)[0]['type']
-            if item in self.layers:
-                continue
-            try:
-                if type ==  'raster':
-                    self.LoadRaster(item)
-                elif type ==  '3d-raster':
-                    self.LoadRaster3d(item)
-                elif type ==  'vector':
-                    # data = self.tree.GetPyData(item)[0]['nviz']
-                    # vecType = []
-                    # if data and 'vector' in data:
-                    #     for v in ('lines', 'points'):
-                    #         if data['vector'][v]:
-                    #             vecType.append(v)
-                    layer = self.tree.GetPyData(item)[0]['maplayer']
-                    npoints, nlines, nfeatures, mapIs3D = self.lmgr.nviz.VectorInfo(layer)
-                    if npoints > 0:
-                        self.LoadVector(item, points = True)
-                    if nlines > 0:
-                        self.LoadVector(item, points = False)
-            except gcmd.GException, e:
-                GError(parent = self,
-                       message = e.value)
-            self.init = False
-        
-        stop = time.time()
-        
-        Debug.msg(3, "GLWindow.LoadDataLayers(): time = %f" % (stop-start))
-                
-    def UnloadDataLayers(self):
-        """!Unload any layers that have been deleted from layer tree"""
-        if not self.tree:
-            return
-        
-        listOfItems = []
-        item = self.tree.GetFirstChild(self.tree.root)[0]
-        self._GetDataLayers(item, listOfItems)
-        
-        start = time.time()
-        
-        for layer in self.layers:
-            if layer not in listOfItems:
-                ltype = self.tree.GetPyData(layer)[0]['type']
-                try:
-                    if ltype ==  'raster':
-                        self.UnloadRaster(layer)
-                    elif ltype ==  '3d-raster':
-                        self.UnloadRaster3d(layer) 
-                    elif ltype ==  'vector':
-                        self.UnloadVector(layer, True)
-                        self.UnloadVector(layer, False)
-                    
-                    self.UpdateView(None)
-                except gcmd.GException, e:
-                    gcmd.GError(parent = self,
-                                message = e.value)
-                
-                self.lmgr.nviz.UpdateSettings()        
-        
-        stop = time.time()
-        
-        Debug.msg(3, "GLWindow.UnloadDataLayers(): time = %f" % (stop-start))        
-
-    def SetVectorFromCmd(self, item, data):
-        """!Set 3D view properties from cmd (d.vect)
-
-        @param item Layer Tree item
-        @param nviz data
-        """
-        cmd = self.tree.GetPyData(item)[0]['cmd']
-        if cmd[0] != 'd.vect':
-            return
-        for opt in cmd[1:]:
-            try:
-                key, value = opt.split('=')
-            except ValueError:
-                continue
-            if key == 'color':
-                data['lines']['color']['value'] = value
-                data['points']['color']['value'] = value
-
-    def SetMapObjProperties(self, item, id, nvizType):
-        """!Set map object properties
-        
-        Properties must be afterwards updated by
-        UpdateMapObjProperties().
-        
-        @param item layer item
-        @param id nviz layer id (or -1)
-        @param nvizType nviz data type (surface, points, vector)
-        """
-        type = self.tree.GetPyData(item)[0]['maplayer'].type
-        # reference to original layer properties (can be None)
-        data = self.tree.GetPyData(item)[0]['nviz']
-        
-        if not data:
-            # init data structure
-            self.tree.GetPyData(item)[0]['nviz'] = {}
-            data = self.tree.GetPyData(item)[0]['nviz']
-            
-            if type ==  'raster':
-                # reset to default properties
-                data[nvizType] = self.nvizDefault.SetSurfaceDefaultProp()
-                        
-            elif type ==  'vector':
-                # reset to default properties (lines/points)
-                data['vector'] = self.nvizDefault.SetVectorDefaultProp()
-                self.SetVectorFromCmd(item, data['vector'])
-                
-            elif type ==  '3d-raster':
-                # reset to default properties 
-                data[nvizType] = self.nvizDefault.SetVolumeDefaultProp()
-        
-        else:
-            # complete data (use default values)
-            if type ==  'raster':
-                data['surface'] = self.nvizDefault.SetSurfaceDefaultProp()
-            if type ==  'vector':
-                if not data['vector']['lines']:
-                    self.nvizDefault.SetVectorLinesDefaultProp(data['vector']['lines'])
-                if not data['vector']['points']:
-                    self.nvizDefault.SetVectorPointsDefaultProp(data['vector']['points'])
-                    
-            # set updates
-            for sec in data.keys():
-                for sec1 in data[sec].keys():
-                    for sec2 in data[sec][sec1].keys():
-                        if sec2 !=  'all':
-                            data[sec][sec1][sec2]['update'] = None
-            
-            event = wxUpdateProperties(data = data)
-            wx.PostEvent(self, event)
-        
-        # set id
-        if id > 0:
-            if type in ('raster', '3d-raster'):
-               data[nvizType]['object'] = { 'id' : id,
-                                            'init' : False }
-            elif type ==  'vector':
-                data['vector'][nvizType]['object'] = { 'id' : id,
-                                                       'init' : False }
-        
-        return data
-
-    def LoadRaster(self, item):
-        """!Load 2d raster map and set surface attributes
-        
-        @param layer item
-        """
-        return self._loadRaster(item)
-    
-    def LoadRaster3d(self, item):
-        """!Load 3d raster map and set surface attributes
-        
-        @param layer item
-        """
-        return self._loadRaster(item)
-    
-    def _loadRaster(self, item):
-        """!Load 2d/3d raster map and set its attributes
-        
-        @param layer item
-        """
-        layer = self.tree.GetPyData(item)[0]['maplayer']
-        
-        if layer.type not in ('raster', '3d-raster'):
-            return
-        
-        if layer.type ==  'raster':
-            id = self._display.LoadSurface(str(layer.name), None, None)
-            nvizType = 'surface'
-            errorMsg = _("Loading raster map")
-        elif layer.type ==  '3d-raster':
-            id = self._display.LoadVolume(str(layer.name), None, None)
-            nvizType = 'volume'
-            errorMsg = _("Loading 3d raster map")
-        else:
-            id = -1
-        
-        if id < 0:
-            if layer.type in ('raster', '3d-raster'):
-                self.log.WriteError("%s <%s> %s" % (errorMsg, layer.name, _("failed")))
-            else:
-                self.log.WriteError(_("Unsupported layer type '%s'") % layer.type)
-        
-        self.layers.append(item)
-        
-        # set default/workspace layer properties
-        data = self.SetMapObjProperties(item, id, nvizType)
-        
-        # update properties
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self, event)
-        
-        # update tools window
-        if hasattr(self.lmgr, "nviz") and \
-                item ==  self.GetSelectedLayer(type = 'item'):
-            toolWin = self.lmgr.nviz
-            if layer.type ==  'raster':
-                win = toolWin.FindWindowById( \
-                    toolWin.win['vector']['lines']['surface'])
-                win.SetItems(self.GetLayerNames(layer.type))
-            
-            #toolWin.UpdatePage(nvizType)
-            #toolWin.SetPage(nvizType)
-        
-        return id
-    
-    def UnloadRaster(self, item):
-        """!Unload 2d raster map
-        
-        @param layer item
-        """
-        return self._unloadRaster(item)
-    
-    def UnloadRaster3d(self, item):
-        """!Unload 3d raster map
-        
-        @param layer item
-        """
-        return self._unloadRaster(item)
-    
-    def _unloadRaster(self, item):
-        """!Unload 2d/3d raster map
-        
-        @param item layer item
-        """
-        layer = self.tree.GetPyData(item)[0]['maplayer']
-        
-        if layer.type not in ('raster', '3d-raster'):
-            return
-        
-        data = self.tree.GetPyData(item)[0]['nviz']
-        
-        if layer.type ==  'raster':
-            nvizType = 'surface'
-            unloadFn = self._display.UnloadSurface
-            errorMsg = _("Unable to unload raster map")
-            successMsg = _("Raster map")
-        else:
-            nvizType = 'volume'
-            unloadFn = self._display.UnloadVolume
-            errorMsg = _("Unable to unload 3d raster map")
-            successMsg = _("3d raster map")
-        
-        id = data[nvizType]['object']['id']
-        
-        if unloadFn(id) ==  0:
-            self.log.WriteError("%s <%s>" % (errorMsg, layer.name))
-        else:
-            self.log.WriteLog("%s <%s> %s" % (successMsg, layer.name, _("unloaded successfully")))
-        
-        data[nvizType].pop('object')
-        
-        self.layers.remove(item)
-        
-        # update tools window
-        if hasattr(self.lmgr, "nviz") and \
-                layer.type ==  'raster':
-            toolWin = self.lmgr.nviz
-            win = toolWin.FindWindowById( \
-                toolWin.win['vector']['lines']['surface'])
-            win.SetItems(self.GetLayerNames(layer.type))
-            
-    def LoadVector(self, item, points = None):
-        """!Load 2D or 3D vector map overlay
-        
-        @param item layer item
-        @param points True to load points, False to load lines, None
-        to load both
-        """
-        layer = self.tree.GetPyData(item)[0]['maplayer']
-        if layer.type !=  'vector':
-            return
-        
-        # set default properties
-        if points is None:
-            self.SetMapObjProperties(item, -1, 'lines')
-            self.SetMapObjProperties(item, -1, 'points')
-            vecTypes = ('points', 'lines')
-        elif points:
-            self.SetMapObjProperties(item, -1, 'points')
-            vecTypes = ('points', )
-        else:
-            self.SetMapObjProperties(item, -1, 'lines')
-            vecTypes = ('lines', )
-        
-        id = -1
-        for vecType in vecTypes:
-            if vecType == 'lines':
-                id = self._display.LoadVector(str(layer.GetName()), False)
-            else:
-                id = self._display.LoadVector(str(layer.GetName()), True)
-            if id < 0:
-                self.log.WriteError(_("Loading vector map <%(name)s> (%(type)s) failed") % \
-                    { 'name' : layer.name, 'type' : vecType })
-            # update layer properties
-            self.SetMapObjProperties(item, id, vecType)
-        
-        self.layers.append(item)
-        
-        # update properties
-        data = self.tree.GetPyData(item)[0]['nviz']
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self, event)
-        
-        # update tools window
-        if hasattr(self.lmgr, "nviz") and \
-                item ==  self.GetSelectedLayer(type = 'item'):
-            toolWin = self.lmgr.nviz
-            
-            toolWin.UpdatePage('vector')
-            ### toolWin.SetPage('vector')
-        
-        return id
-
-    def UnloadVector(self, item, points = None):
-        """!Unload vector map overlay
-        
-        @param item layer item
-        @param points,lines True to unload given feature type
-        """
-        layer = self.tree.GetPyData(item)[0]['maplayer']
-        data = self.tree.GetPyData(item)[0]['nviz']['vector']
-        
-        # if vecType is None:
-        #     vecType = []
-        #     for v in ('lines', 'points'):
-        #         if UserSettings.Get(group = 'nviz', key = 'vector',
-        #                             subkey = [v, 'show']):
-        #             vecType.append(v)
-        
-        if points is None:
-            vecTypes = ('points', 'lines')
-        elif points:
-            vecTypes = ('points', )
-        else:
-            vecTypes = ('lines', )
-        
-        for vecType in vecTypes:
-            if 'object' not in data[vecType]:
-                continue
-            
-            id = data[vecType]['object']['id']
-            
-            if vecType ==  'lines':
-                ret = self._display.UnloadVector(id, False)
-            else:
-                ret = self._display.UnloadVector(id, True)
-            if ret ==  0:
-                self.log.WriteError(_("Unable to unload vector map <%(name)s> (%(type)s)") % \
-                    { 'name': layer.name, 'type' : vecType })
-            else:
-                self.log.WriteLog(_("Vector map <%(name)s> (%(type)s) unloaded successfully") % \
-                    { 'name' : layer.name, 'type' : vecType })
-            
-            data[vecType].pop('object')
-            
-            ### self.layers.remove(id)
-        
-    def Reset(self):
-        """!Reset (unload data)"""
-        for item in self.layers:
-            type = self.tree.GetPyData(item)[0]['maplayer'].type
-            if type ==  'raster':
-                self.UnloadRaster(item)
-            elif type ==  '3d-raster':
-                self.UnloadRaster3d(item)
-            elif type ==  'vector':
-                self.UnloadVector(item)
-        
-        self.init = False
-
-    def OnZoomToMap(self, event):
-        """!Set display extents to match selected raster or vector
-        map or volume.
-        
-        @todo vector, volume
-        """
-        layer = self.GetSelectedLayer()
-        
-        if layer is None:
-            return
-        
-        Debug.msg (3, "GLWindow.OnZoomToMap(): layer = %s, type = %s" % \
-                       (layer.name, layer.type))
-        
-        self._display.SetViewportDefault()
-
-    def ResetView(self):
-        """!Reset to default view"""
-        self.view['z-exag']['value'], \
-            self.iview['height']['value'], \
-            self.iview['height']['min'], \
-            self.iview['height']['max'] = self._display.SetViewDefault()
-        
-        self.view['z-exag']['min'] = 0
-        self.view['z-exag']['max'] = self.view['z-exag']['value'] * 10
-        
-        self.view['position']['x'] = UserSettings.Get(group = 'nviz', key = 'view',
-                                                 subkey = ('position', 'x'))
-        self.view['position']['y'] = UserSettings.Get(group = 'nviz', key = 'view',
-                                                 subkey = ('position', 'y'))
-        self.view['persp']['value'] = UserSettings.Get(group = 'nviz', key = 'view',
-                                                       subkey = ('persp', 'value'))
-        
-        self.view['twist']['value'] = UserSettings.Get(group = 'nviz', key = 'view',
-                                                       subkey = ('twist', 'value'))
-        
-        event = wxUpdateView(zExag = False)
-        wx.PostEvent(self, event)
-        
-    def UpdateMapObjProperties(self, event):
-        """!Generic method to update data layer properties"""
-        data = event.data
-        
-        if 'surface' in data:
-            id = data['surface']['object']['id']
-            self.UpdateSurfaceProperties(id, data['surface'])
-            # -> initialized
-            data['surface']['object']['init'] = True
-            
-        elif 'volume' in data:
-            id = data['volume']['object']['id']
-            self.UpdateVolumeProperties(id, data['volume'])
-            # -> initialized
-            data['volume']['object']['init'] = True
-            
-        elif 'vector' in data:
-            for type in ('lines', 'points'):
-                if 'object' in data['vector'][type]:
-                    id = data['vector'][type]['object']['id']
-                    self.UpdateVectorProperties(id, data['vector'], type)
-                    # -> initialized
-                    data['vector'][type]['object']['init'] = True
-        
-    def UpdateSurfaceProperties(self, id, data):
-        """!Update surface map object properties"""
-        # surface attributes
-        for attrb in ('topo', 'color', 'mask',
-                     'transp', 'shine', 'emit'):
-            if attrb not in data['attribute'] or \
-                    'update' not in data['attribute'][attrb]:
-                continue
-            
-            map = data['attribute'][attrb]['map']
-            value = data['attribute'][attrb]['value']
-            
-            if map is None: # unset
-                # only optional attributes
-                if attrb ==  'mask':
-                    # TODO: invert mask
-                    # TODO: broken in NVIZ
-                    self._display.UnsetSurfaceMask(id)
-                elif attrb ==  'transp':
-                    self._display.UnsetSurfaceTransp(id)
-                elif attrb ==  'emit':
-                    self._display.UnsetSurfaceEmit(id) 
-            else:
-                if type(value) ==  type('') and \
-                        len(value) <=  0: # ignore empty values (TODO: warning)
-                    continue
-                if attrb ==  'topo':
-                    self._display.SetSurfaceTopo(id, map, str(value)) 
-                elif attrb ==  'color':
-                    self._display.SetSurfaceColor(id, map, str(value))
-                elif attrb ==  'mask':
-                    # TODO: invert mask
-                    # TODO: broken in NVIZ
-                    self._display.SetSurfaceMask(id, False, str(value))
-                elif attrb ==  'transp':
-                    self._display.SetSurfaceTransp(id, map, str(value)) 
-                elif attrb ==  'shine':
-                    self._display.SetSurfaceShine(id, map, str(value)) 
-                elif attrb ==  'emit':
-                    self._display.SetSurfaceEmit(id, map, str(value)) 
-            data['attribute'][attrb].pop('update')
-        
-        # draw res
-        if 'update' in data['draw']['resolution']:
-            coarse = data['draw']['resolution']['coarse']
-            fine   = data['draw']['resolution']['fine']
-            
-            if data['draw']['all']:
-                self._display.SetSurfaceRes(-1, fine, coarse)
-            else:
-                self._display.SetSurfaceRes(id, fine, coarse)
-            data['draw']['resolution'].pop('update')
-        
-        # draw style
-        if 'update' in data['draw']['mode']:
-            if data['draw']['mode']['value'] < 0: # need to calculate
-                data['draw']['mode']['value'] = \
-                    self.nvizDefault.GetDrawMode(mode = data['draw']['mode']['desc']['mode'],
-                                                 style = data['draw']['mode']['desc']['style'],
-                                                 shade = data['draw']['mode']['desc']['shading'],
-                                                 string = True)
-            style = data['draw']['mode']['value']
-            if data['draw']['all']:
-                self._display.SetSurfaceStyle(-1, style)
-            else:
-                self._display.SetSurfaceStyle(id, style)
-            data['draw']['mode'].pop('update')
-        
-        # wire color
-        if 'update' in data['draw']['wire-color']:
-            color = data['draw']['wire-color']['value']
-            if data['draw']['all']:
-                self._display.SetWireColor(-1, str(color))
-            else:
-                self._display.SetWireColor(id, str(color))
-            data['draw']['wire-color'].pop('update')
-        
-        # position
-        if 'update' in data['position']:
-            x = data['position']['x']
-            y = data['position']['y']
-            z = data['position']['z']
-            self._display.SetSurfacePosition(id, x, y, z)
-            data['position'].pop('update')
-        data['draw']['all'] = False
-        
-    def UpdateVolumeProperties(self, id, data, isosurfId = None):
-        """!Update volume (isosurface/slice) map object properties"""
-        if 'update' in data['draw']['resolution']:
-            self._display.SetIsosurfaceRes(id, data['draw']['resolution']['value'])
-            data['draw']['resolution'].pop('update')
-        
-        if 'update' in data['draw']['shading']:
-            if data['draw']['shading']['value'] < 0: # need to calculate
-                data['draw']['shading']['value'] = \
-                    self.nvizDefault.GetDrawMode(shade = data['draw']['shading'],
-                                                 string = False)
-            data['draw']['shading'].pop('update')
-        
-        #
-        # isosurface attributes
-        #
-        isosurfId = 0
-        for isosurf in data['isosurface']:
-            for attrb in ('color', 'mask',
-                          'transp', 'shine', 'emit'):
-                if attrb not in isosurf or \
-                        'update' not in isosurf[attrb]:
-                    continue
-                map = isosurf[attrb]['map']
-                value = isosurf[attrb]['value']
-                
-                if map is None: # unset
-                    # only optional attributes
-                    if attrb ==  'mask':
-                        # TODO: invert mask
-                        # TODO: broken in NVIZ
-                        self._display.UnsetIsosurfaceMask(id, isosurfId)
-                    elif attrb ==  'transp':
-                        self._display.UnsetIsosurfaceTransp(id, isosurfId)
-                    elif attrb ==  'emit':
-                        self._display.UnsetIsosurfaceEmit(id, isosurfId) 
-                else:
-                    if type(value) ==  type('') and \
-                            len(value) <=  0: # ignore empty values (TODO: warning)
-                        continue
-                    elif attrb ==  'color':
-                        self._display.SetIsosurfaceColor(id, isosurfId, map, str(value))
-                    elif attrb ==  'mask':
-                        # TODO: invert mask
-                        # TODO: broken in NVIZ
-                        self._display.SetIsosurfaceMask(id, isosurfId, False, str(value))
-                    elif attrb ==  'transp':
-                        self._display.SetIsosurfaceTransp(id, isosurfId, map, str(value)) 
-                    elif attrb ==  'shine':
-                        self._display.SetIsosurfaceShine(id, isosurfId, map, str(value)) 
-                    elif attrb ==  'emit':
-                        self._display.SetIsosurfaceEmit(id, isosurfId, map, str(value)) 
-                isosurf[attrb].pop('update')
-            isosurfId +=  1
-        
-    def UpdateVectorProperties(self, id, data, type):
-        """!Update vector layer properties
-        
-        @param id layer id
-        @param data properties
-        @param type lines/points
-        """
-        if type ==  'points':
-            self.UpdateVectorPointsProperties(id, data[type])
-        else:
-            self.UpdateVectorLinesProperties(id, data[type])
-        
-    def UpdateVectorLinesProperties(self, id, data):
-        """!Update vector line map object properties"""
-        # mode
-        if 'update' in data['color'] or \
-                'update' in data['width'] or \
-                'update' in data['mode']:
-            width = data['width']['value']
-            color = data['color']['value']
-            if data['mode']['type'] ==  'flat':
-                flat = True
-                if 'surface' in data:
-                    data.pop('surface')
-            else:
-                flat = False
-            
-            self._display.SetVectorLineMode(id, color,
-                                            width, flat)
-            
-            if 'update' in data['color']:
-                data['color'].pop('update')
-            if 'update' in data['width']:
-                data['width'].pop('update')
-            if 'update' in data['mode']:
-                data['mode'].pop('update')
-        
-        # height
-        if 'update' in data['height']:
-            self._display.SetVectorLineHeight(id,
-                                              data['height']['value'])
-            data['height'].pop('update')
-        
-        # surface
-        if 'update' in data['mode']:
-            sid = self.GetLayerId(type = 'raster', name = data['mode']['surface'])
-            if sid > -1:
-                self._display.SetVectorLineSurface(id, sid)
-            
-            data['mode'].pop('update')
-        
-    def UpdateVectorPointsProperties(self, id, data):
-        """!Update vector point map object properties"""
-        if 'update' in data['size'] or \
-                'update' in data['width'] or \
-                'update' in data['marker'] or \
-                'update' in data['color']:
-            ret = self._display.SetVectorPointMode(id, data['color']['value'],
-                                                   data['width']['value'], float(data['size']['value']),
-                                                   data['marker']['value'] + 1)
-            
-            error = None
-            if ret ==  -1:
-                error = _("Vector point layer not found (id = %d)") % id
-            elif ret ==  -2:
-                error = _("Unable to set data layer properties (id = %d)") % id
-
-            if error:
-                raise gcmd.GException(_("Setting data layer properties failed.\n\n%s") % error)
-            
-            for prop in ('size', 'width', 'marker', 'color'):
-                if 'update' in data[prop]:
-                    data[prop].pop('update')
-        
-        # height
-        if 'update' in data['height']:
-            self._display.SetVectorPointHeight(id,
-                                               data['height']['value'])
-            data['height'].pop('update')
-        
-        # surface
-        if 'update' in data['mode']:
-            sid = self.GetLayerId(type = 'raster', name = data['mode']['surface'])
-            if sid > -1:
-                self._display.SetVectorPointSurface(id, sid)
-            
-            data['mode'].pop('update')
-            
-    def GetLayerNames(self, type):
-        """!Return list of map layer names of given type"""
-        layerName = []
-        
-        for item in self.layers:
-            mapLayer = self.tree.GetPyData(item)[0]['maplayer']
-            if type !=  mapLayer.GetType():
-                continue
-            
-            layerName.append(mapLayer.GetName())
-        
-        return layerName
-    
-    def GetLayerId(self, type, name):
-        """!Get layer object id or -1"""
-        if len(name) < 1:
-            return -1
-        
-        for item in self.layers:
-            mapLayer = self.tree.GetPyData(item)[0]['maplayer']
-            if type !=  mapLayer.GetType() or \
-                    name !=  mapLayer.GetName():
-                continue
-            
-            data = self.tree.GetPyData(item)[0]['nviz']
-            
-            if type ==  'raster':
-                return data['surface']['object']['id']
-            elif type ==  'vpoint':
-                return data['vector']['points']['object']['id']
-            elif type ==  'vline':
-                return data['vector']['lines']['object']['id']
-            elif type ==  '3d-raster':
-                return data['volume']['object']['id']
-        
-        return -1
-    
-    def SaveToFile(self, FileName, FileType, width, height):
-        """!This draws the DC to a buffer that can be saved to a file.
-        
-        @todo fix BufferedPaintDC
-        
-        @param FileName file name
-        @param FileType type of bitmap
-        @param width image width
-        @param height image height
-        """
-        self._display.SaveToFile(FileName, width, height)
-                
-        # pbuffer = wx.EmptyBitmap(max(1, self.Map.width), max(1, self.Map.height))
-        # dc = wx.BufferedPaintDC(self, pbuffer)
-        # dc.Clear()
-        # self.SetCurrent()
-        # self._display.Draw(False, -1)
-        # pbuffer.SaveFile(FileName, FileType)
-        # self.SwapBuffers()
-        
-    def GetDisplay(self):
-        """!Get display instance"""
-        return self._display
-        
-    def ZoomToMap(self):
-        """!Reset view
-        """
-        self.lmgr.nviz.OnResetView(None)
-
diff --git a/gui/wxpython/gui_modules/nviz_preferences.py b/gui/wxpython/gui_modules/nviz_preferences.py
deleted file mode 100644
index 652b267..0000000
--- a/gui/wxpython/gui_modules/nviz_preferences.py
+++ /dev/null
@@ -1,475 +0,0 @@
-"""
- at package nviz_preferences.py
-
- at brief Nviz (3D view) preferences window
-
-Classes:
- - NvizPreferencesDialog
-
-(C) 2008-2010 by the GRASS Development Team
-
-This program is free software under the GNU General Public License
-(>=v2). Read the file COPYING that comes with GRASS for details.
-
- at author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
- at author Enhancements by Michael Barton <michael.barton at asu.edu>
-"""
-
-import types
-
-import wx
-import wx.lib.colourselect as csel
-
-import globalvar
-from preferences import globalSettings as UserSettings
-from preferences import PreferencesBaseDialog
-
-class NvizPreferencesDialog(PreferencesBaseDialog):
-    """!Nviz preferences dialog"""
-    def __init__(self, parent, title = _("3D view settings"),
-                 settings = UserSettings):
-        PreferencesBaseDialog.__init__(self, parent = parent, title = title,
-                                       settings = settings)
-        self.toolWin = self.parent.GetLayerManager().nviz
-        self.win = dict()
-        
-        # create notebook pages
-        self._createViewPage(self.notebook)
-        self._createVectorPage(self.notebook)
-        
-        self.SetMinSize(self.GetBestSize())
-        self.SetSize(self.size)
-        
-    def _createViewPage(self, notebook):
-        """!Create notebook page for general settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
-        
-        notebook.AddPage(page = panel,
-                         text = " %s " % _("View"))
-        
-        pageSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        self.win['general'] = {}
-        self.win['view'] = {}
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("View")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        
-        # perspective
-        self.win['view']['persp'] = {}
-        pvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'persp')
-        ipvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'persp', internal = True)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Perspective:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(value)")),
-                      pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        pval = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = pvals['value'],
-                           min = ipvals['min'],
-                           max = ipvals['max'])
-        self.win['view']['persp']['value'] = pval.GetId()
-        gridSizer.Add(item = pval, pos = (0, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(step)")),
-                      pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        pstep = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = pvals['step'],
-                           min = ipvals['min'],
-                           max = ipvals['max']-1)
-        self.win['view']['persp']['step'] = pstep.GetId()
-        gridSizer.Add(item = pstep, pos = (0, 4),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # position
-        self.win['view']['pos'] = {}
-        posvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'position')
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Position:")),
-                      pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(x)")),
-                      pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        px = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = posvals['x'] * 100,
-                           min = 0,
-                           max = 100)
-        self.win['view']['pos']['x'] = px.GetId()
-        gridSizer.Add(item = px, pos = (1, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = "(y)"),
-                      pos = (1, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        py = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = posvals['y'] * 100,
-                           min = 0,
-                           max = 100)
-        self.win['view']['pos']['y'] = py.GetId()
-        gridSizer.Add(item = py, pos = (1, 4),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # height
-        self.win['view']['height'] = {}
-        hvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'height')
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Height:")),
-                      pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(step)")),
-                      pos = (2, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        hstep = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = hvals['step'],
-                           min = 1,
-                           max = 1e6)
-        self.win['view']['height']['step'] = hstep.GetId()
-        gridSizer.Add(item = hstep, pos = (2, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # twist
-        self.win['view']['twist'] = {}
-        tvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'twist')
-        itvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'twist', internal = True)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Twist:")),
-                      pos = (3, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(value)")),
-                      pos = (3, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        tval = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = tvals['value'],
-                           min = itvals['min'],
-                           max = itvals['max'])
-        self.win['view']['twist']['value'] = tval.GetId()
-        gridSizer.Add(item = tval, pos = (3, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(step)")),
-                      pos = (3, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        tstep = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = tvals['step'],
-                           min = itvals['min'],
-                           max = itvals['max']-1)
-        self.win['view']['twist']['step'] = tstep.GetId()
-        gridSizer.Add(item = tstep, pos = (3, 4),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # z-exag
-        self.win['view']['z-exag'] = {}
-        zvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'z-exag')
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Z-exag:")),
-                      pos = (4, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(value)")),
-                      pos = (4, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        zval = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           min = -1e6,
-                           max = 1e6)
-        self.win['view']['z-exag']['value'] = zval.GetId()
-        gridSizer.Add(item = zval, pos = (4, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(step)")),
-                      pos = (4, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        zstep = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = zvals['step'],
-                           min = -1e6,
-                           max = 1e6)
-        self.win['view']['z-exag']['step'] = zstep.GetId()
-        gridSizer.Add(item = zstep, pos = (4, 4),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-
-        box = wx.StaticBox(parent = panel, id = wx.ID_ANY,
-                           label = " %s " % (_("Image Appearance")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        gridSizer.AddGrowableCol(0)
-        
-        # background color
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Background color:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        color = csel.ColourSelect(panel, id = wx.ID_ANY,
-                                  colour = UserSettings.Get(group = 'nviz', key = 'settings',
-                                                            subkey = ['general', 'bgcolor']),
-                                  size = globalvar.DIALOG_COLOR_SIZE)
-        self.win['general']['bgcolor'] = color.GetId()
-        gridSizer.Add(item = color, pos = (0, 1))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL,
-                      border = 3)
-        
-        panel.SetSizer(pageSizer)
-        
-        return panel
-    
-    def _createVectorPage(self, notebook):
-        """!Create notebook page for general settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
-        
-        notebook.AddPage(page = panel,
-                         text = " %s " % _("Vector"))
-        
-        pageSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        # vector lines
-        self.win['vector'] = {}
-        self.win['vector']['lines'] = {}
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Vector lines")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        
-        # show
-        row = 0
-        showLines = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                                label = _("Show lines"))
-        self.win['vector']['lines']['show'] = showLines.GetId()
-        showLines.SetValue(UserSettings.Get(group = 'nviz', key = 'vector',
-                                            subkey = ['lines', 'show']))
-        gridSizer.Add(item = showLines, pos = (row, 0))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        # vector points
-        self.win['vector']['points'] = {}
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Vector points")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 5)
-        
-        # show
-        row = 0
-        showPoints = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                                 label = _("Show points"))
-        showPoints.SetValue(UserSettings.Get(group = 'nviz', key = 'vector',
-                                             subkey = ['points', 'show']))
-        self.win['vector']['points']['show'] = showPoints.GetId()
-        gridSizer.Add(item = showPoints, pos = (row, 0), span = (1, 8))
-        
-        # icon size
-        row += 1 
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Size:")),
-                      pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        isize = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                            initial = 100,
-                            min = 1,
-                            max = 1e6)
-        self.win['vector']['points']['size'] = isize.GetId()
-        isize.SetValue(UserSettings.Get(group = 'nviz', key = 'vector',
-                                        subkey = ['points', 'size']))
-        gridSizer.Add(item = isize, pos = (row, 1),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # icon width
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Width:")),
-                      pos = (row, 2), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        iwidth = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                            initial = 2,
-                            min = 1,
-                            max = 1e6)
-        self.win['vector']['points']['width'] = isize.GetId()
-        iwidth.SetValue(UserSettings.Get(group = 'nviz', key = 'vector',
-                                         subkey = ['points', 'width']))
-        gridSizer.Add(item = iwidth, pos = (row, 3),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # icon symbol
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Marker:")),
-                      pos = (row, 4), flag = wx.ALIGN_CENTER_VERTICAL)
-        isym = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
-                          choices = UserSettings.Get(group = 'nviz', key = 'vector',
-                                                   subkey = ['points', 'marker'], internal = True))
-        isym.SetName("selection")
-        self.win['vector']['points']['marker'] = isym.GetId()
-        isym.SetSelection(UserSettings.Get(group = 'nviz', key = 'vector',
-                                           subkey = ['points', 'marker']))
-        gridSizer.Add(item = isym, flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 5))
-        
-        # icon color
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Color:")),
-                      pos = (row, 6), flag = wx.ALIGN_CENTER_VERTICAL)
-        icolor = csel.ColourSelect(panel, id = wx.ID_ANY)
-        icolor.SetName("color")
-        self.win['vector']['points']['color'] = icolor.GetId()
-        icolor.SetColour(UserSettings.Get(group = 'nviz', key = 'vector',
-                                          subkey = ['points', 'color']))
-        gridSizer.Add(item = icolor, flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 7))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        panel.SetSizer(pageSizer)
-        
-        return panel
-    
-    def OnDefault(self, event):
-        """Restore default settings"""
-        settings = copy.deepcopy(UserSettings.GetDefaultSettings()['nviz'])
-        UserSettings.Set(group = 'nviz',
-                         value = settings)
-        
-        for subgroup, key in settings.iteritems(): # view, surface, vector...
-            if subgroup != 'view':
-                continue
-            for subkey, value in key.iteritems():
-                for subvalue in value.keys():
-                    win = self.FindWindowById(self.win[subgroup][subkey][subvalue])
-                    val = settings[subgroup][subkey][subvalue]
-                    if subkey == 'position':
-                        val = int(val * 100)
-                    
-                    win.SetValue(val)
-        
-        event.Skip()
-        
-    def OnApply(self, event):
-        """Apply Nviz settings for current session"""
-        settings = UserSettings.Get(group = 'nviz')
-        for subgroup, key in settings.iteritems(): # view, surface, vector...
-            for subkey, value in key.iteritems():
-                if type(value) == types.DictType:
-                    for subvalue in value.keys():
-                        try: # TODO
-                            win = self.FindWindowById(self.win[subgroup][subkey][subvalue])
-                        except:
-                            # print 'e', subgroup, subkey, subvalue
-                            continue
-                        
-                        if win.GetName() == "selection":
-                            value = win.GetSelection()
-                        elif win.GetName() == "color":
-                            value = tuple(win.GetColour())
-                        else:
-                            value = win.GetValue()
-                        if subkey == 'pos':
-                            value = float(value) / 100
-                            
-                        settings[subgroup][subkey][subvalue] = value
-        
-    def OnSave(self, event):
-        """!Apply changes, update map and save settings of selected
-        layer
-        """
-        # apply changes
-        self.OnApply(None)
-        
-        if self.GetSelection() == self.page['id']:
-            fileSettings = {}
-            UserSettings.ReadSettingsFile(settings = fileSettings)
-            fileSettings['nviz'] = UserSettings.Get(group = 'nviz')
-            file = UserSettings.SaveToFile(fileSettings)
-            self.parent.goutput.WriteLog(_('Nviz settings saved to file <%s>.') % file)
-        
-    def OnLoad(self, event):
-        """!Apply button pressed"""
-        self.LoadSettings()
-        
-        if event:
-            event.Skip()
-
-    def LoadSettings(self):
-        """!Load saved Nviz settings and apply to current session"""
-        UserSettings.ReadSettingsFile()
-        settings = copy.deepcopy(UserSettings.Get(group = 'nviz'))
-        
-        for subgroup, key in settings.iteritems(): # view, surface, vector...
-            for subkey, value in key.iteritems():
-                for subvalue in value.keys():
-                    if subvalue == 'step':
-                        continue
-                    else:
-                        insetting = value[subvalue]                                                    
-                    if subgroup == 'view':
-                        for viewkey, viewitem in self.mapWindow.view[subkey].iteritems(): 
-                            if viewkey == subvalue:
-                                self.mapWindow.view[subkey][viewkey] = insetting 
-                            else:
-                                continue
-                    else:
-                        for otherkey, otheritem in self.win[subgroup][subkey].iteritems():
-                            if type(otheritem) == data:
-                                for endkey, enditem in otheritem.iteritems():
-                                    if endkey == subvalue:
-                                        paramwin = self.FindWindowById(enditem)
-                                    else:
-                                        continue
-                            else:
-                                if otherkey == subvalue:
-                                    paramwin = self.FindWindowById(otheritem)
-                                else:
-                                    continue
-                            if type(insetting) in [tuple, list] and len(insetting) > 2:
-                                insetting = tuple(insetting)
-                                paramwin.SetColour(insetting)
-                            else:
-                                try:
-                                    paramwin.SetValue(insetting)
-                                except:
-                                    try:
-                                        paramwin.SetStringSelection(insetting)
-                                    except:
-                                        continue
-                                
-        self.toolWin.UpdateSettings()
-        self.FindWindowById(self.win['view']['pos']).Draw()
-        self.FindWindowById(self.win['view']['pos']).Refresh(False)
-        
-        self.mapWindow.render['quick'] = False
-        self.mapWindow.Refresh(False)
-        
-    def OnSave(self, event):
-        """!Save button pressed
-        
-        Save settings to configuration file
-        """
-        fileSettings = {}
-        UserSettings.ReadSettingsFile(settings = fileSettings)
-        fileSettings['nviz'] = UserSettings.Get(group = 'nviz')
-        
-        fileName = UserSettings.SaveToFile(fileSettings)
-        self.parent.GetLayerManager().goutput.WriteLog(_('3D view settings saved to file <%s>.') % fileName)
-        
-        self.Destroy()
-        
diff --git a/gui/wxpython/gui_modules/nviz_tools.py b/gui/wxpython/gui_modules/nviz_tools.py
deleted file mode 100644
index d81a601..0000000
--- a/gui/wxpython/gui_modules/nviz_tools.py
+++ /dev/null
@@ -1,3445 +0,0 @@
-"""!
- at package nviz_tools.py
-
- at brief Nviz (3D view) tools window
-
-Classes:
- - NvizToolWindow
- - PositionWindow
- - ViewPositionWindow
- - LightPositionWindow
-
-(C) 2008-2010 by the GRASS Development Team
-
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
-
- at author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
- at author Enhancements by Michael Barton <michael.barton at asu.edu>
-"""
-
-import os
-import sys
-import copy
-import types
-
-import wx
-import wx.lib.colourselect as csel
-import wx.lib.scrolledpanel as SP
-try:
-    import wx.lib.agw.flatnotebook as FN
-except ImportError:
-    import wx.lib.flatnotebook as FN
-
-import grass.script as grass
-
-import globalvar
-import gselect
-import gcmd
-from preferences import globalSettings as UserSettings
-from preferences import PreferencesBaseDialog
-try:
-    from nviz_mapdisp import wxUpdateView, wxUpdateLight, wxUpdateProperties
-    import wxnviz
-except (ImportError, NameError):
-    pass
-from debug import Debug
-
-class NvizToolWindow(FN.FlatNotebook):
-    """!Nviz (3D view) tools panel
-    """
-    def __init__(self, parent, display, id = wx.ID_ANY,
-                 style = globalvar.FNPageStyle, **kwargs):
-        self.parent     = parent # GMFrame
-        self.mapDisplay = display
-        self.mapWindow  = display.GetWindow()
-        self._display   = self.mapWindow.GetDisplay()
-        
-        if globalvar.hasAgw:
-            kwargs['agwStyle'] = style
-        else:
-            kwargs['style'] = style
-        FN.FlatNotebook.__init__(self, parent, id, **kwargs)
-        self.SetTabAreaColour(globalvar.FNPageColor)
-        
-        self.win  = {} # window ids
-        self.page = {} # page ids
-
-        # view page
-        self.AddPage(page = self._createViewPage(),
-                     text = " %s " % _("View"))
-
-        # data page
-        self.AddPage(page = self._createDataPage(),
-                     text = " %s " % _("Data"))
-
-        # appearance page
-        self.AddPage(page = self._createAppearancePage(),
-                     text = " %s " % _("Appearance"))
-        
-        self.UpdateSettings()
-        self.pageChanging = False
-        self.mapWindow.render['quick'] = False
-        self.mapWindow.Refresh(False)
-        
-        # bindings
-        self.Bind(wx.EVT_CLOSE, self.OnClose)
-        self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
-        
-        self.Update()
-        wx.CallAfter(self.SetPage, 'view')
-        wx.CallAfter(self.notebookData.SetSelection, 0)
-        wx.CallAfter(self.notebookAppearance.SetSelection, 0)
-        
-    def OnPageChanged(self, event):
-        new = event.GetSelection()
-        # self.ChangeSelection(new)
-    
-    def PostViewEvent(self, zExag = False):
-        """!Change view settings"""
-        event = wxUpdateView(zExag = zExag)
-        wx.PostEvent(self.mapWindow, event)
-
-    def _createViewPage(self):
-        """!Create view settings page"""
-        panel = SP.ScrolledPanel(parent = self, id = wx.ID_ANY)
-        panel.SetupScrolling(scroll_x = False)
-        self.page['view'] = { 'id' : 0,
-                              'notebook' : self.GetId()}
-        
-        pageSizer = wx.BoxSizer(wx.VERTICAL)
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Control View")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        
-        self.win['view'] = {}
-        
-        # position
-        posSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        posSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("W")),
-                     pos = (1, 0), flag = wx.ALIGN_CENTER)
-        posSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("N")),
-                     pos = (0, 1), flag = wx.ALIGN_CENTER | wx.ALIGN_BOTTOM)
-        view = ViewPositionWindow(panel, size = (175, 175),
-                                  mapwindow = self.mapWindow)
-        self.win['view']['position'] = view.GetId()
-        posSizer.Add(item = view,
-                     pos = (1, 1), flag = wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL)
-        posSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("S")),
-                     pos = (2, 1), flag = wx.ALIGN_CENTER | wx.ALIGN_TOP)
-        posSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("E")),
-                     pos = (1, 2), flag = wx.ALIGN_CENTER)
-        gridSizer.Add(item = posSizer, pos = (0, 0))
-                  
-        # perspective
-        # set initial defaults here (or perhaps in a default values file), not in user settings
-        self._createControl(panel, data = self.win['view'], name = 'persp',
-                            range = (1,100),
-                            bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedSpin))
-        gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Perspective:")),
-                      pos = (1, 0), flag = wx.ALIGN_CENTER)
-        gridSizer.Add(item = self.FindWindowById(self.win['view']['persp']['slider']), pos = (2, 0))
-        gridSizer.Add(item = self.FindWindowById(self.win['view']['persp']['spin']), pos = (3, 0),
-                      flag = wx.ALIGN_CENTER)        
-        
-        # twist
-        self._createControl(panel, data = self.win['view'], name = 'twist',
-                            range = (-180,180),
-                            bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedSpin))
-        gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Twist:")),
-                      pos = (1, 1), flag = wx.ALIGN_CENTER)
-        gridSizer.Add(item = self.FindWindowById(self.win['view']['twist']['slider']), pos = (2, 1))
-        gridSizer.Add(item = self.FindWindowById(self.win['view']['twist']['spin']), pos = (3, 1),
-                      flag = wx.ALIGN_CENTER)        
-        
-        # height + z-exag
-        self._createControl(panel, data = self.win['view'], name = 'height', sliderHor = False,
-                            range = (0, 1),
-                            bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedSpin))
-        
-        self._createControl(panel, data = self.win['view'], name = 'z-exag', sliderHor = False,
-                            range = (0, 5),
-                            bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedSpin))
-        self.FindWindowById(self.win['view']['z-exag']['slider']).SetValue(1)
-        self.FindWindowById(self.win['view']['z-exag']['spin']).SetValue(1)
-        
-        heightSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        heightSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Height:")),
-                      pos = (0, 0), flag = wx.ALIGN_LEFT, span = (1, 2))
-        heightSizer.Add(item = self.FindWindowById(self.win['view']['height']['slider']),
-                        flag = wx.ALIGN_RIGHT, pos = (1, 0))
-        heightSizer.Add(item = self.FindWindowById(self.win['view']['height']['spin']),
-                        flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.TOP |
-                        wx.BOTTOM | wx.RIGHT, pos = (1, 1))
-        heightSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Z-exag:")),
-                      pos = (0, 2), flag = wx.ALIGN_LEFT, span = (1, 2))
-        heightSizer.Add(item = self.FindWindowById(self.win['view']['z-exag']['slider']),
-                        flag = wx.ALIGN_RIGHT, pos = (1, 2))
-        heightSizer.Add(item = self.FindWindowById(self.win['view']['z-exag']['spin']),
-                        flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.TOP |
-                        wx.BOTTOM | wx.RIGHT, pos = (1, 3))
-        
-        gridSizer.Add(item = heightSizer, pos = (0, 1), flag = wx.ALIGN_RIGHT)
-        
-        # view setup + reset
-        viewSizer = wx.BoxSizer(wx.HORIZONTAL)
-        
-        viewSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY,
-                                           label = _("Look at:")),
-                      flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL,
-                      border = 5)
-        
-        viewType = wx.Choice (parent = panel, id = wx.ID_ANY, size = (125, -1),
-                              choices = [_("top"),
-                                         _("north"),
-                                         _("south"),
-                                         _("east"),
-                                         _("west"),
-                                         _("north-west"),
-                                         _("north-east"),
-                                         _("south-east"),
-                                         _("south-west")])
-        viewType.SetSelection(0)
-        viewType.Bind(wx.EVT_CHOICE, self.OnLookAt)
-        # self.win['lookAt'] = viewType.GetId()
-        viewSizer.Add(item = viewType,
-                      flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL,
-                      border = 5)
-        
-        reset = wx.Button(panel, id = wx.ID_ANY, label = _("Reset"))
-        reset.SetToolTipString(_("Reset to default view"))
-        # self.win['reset'] = reset.GetId()
-        reset.Bind(wx.EVT_BUTTON, self.OnResetView)
-        
-        viewSizer.Add(item = wx.Size(-1, -1), proportion = 1,
-                      flag = wx.EXPAND)
-        viewSizer.Add(item = reset, proportion = 0,
-                      flag = wx.ALL | wx.ALIGN_RIGHT,
-                      border = 5)
-        
-        gridSizer.AddGrowableCol(2)
-        gridSizer.Add(item = viewSizer, pos = (4, 0), span = (1, 2),
-                      flag = wx.EXPAND)
-        
-        # body
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 2)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL,
-                      border = 3)
-        
-        box = wx.StaticBox(parent = panel, id = wx.ID_ANY,
-                           label = " %s " % (_("Image Appearance")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        gridSizer.AddGrowableCol(0)
-        
-        # background color
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Background color:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        color = csel.ColourSelect(panel, id = wx.ID_ANY,
-                                  colour = UserSettings.Get(group = 'nviz', key = 'view',
-                                                            subkey = ['background', 'color']),
-                                  size = globalvar.DIALOG_COLOR_SIZE)
-        self.win['view']['bgcolor'] = color.GetId()
-        color.Bind(csel.EVT_COLOURSELECT, self.OnBgColor)
-        gridSizer.Add(item = color, pos = (0, 1))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT,
-                      border = 3)
-        
-        panel.SetSizer(pageSizer)
-        
-        return panel
-
-    def _createDataPage(self):
-        """!Create data (surface, vector, volume) settings page"""
-        if globalvar.hasAgw:
-            self.notebookData = FN.FlatNotebook(parent = self, id = wx.ID_ANY,
-                                                agwStyle = globalvar.FNPageDStyle)
-        else:
-            self.notebookData = FN.FlatNotebook(parent = self, id = wx.ID_ANY,
-                                                style = globalvar.FNPageDStyle)
-        
-        # surface page
-        self.notebookData.AddPage(page = self._createSurfacePage(),
-                                  text = " %s " % _("Surface"))
-        self.EnablePage('surface', False)
-        
-        # vector page
-        self.notebookData.AddPage(page = self._createVectorPage(),
-                                  text = " %s " % _("Vector"))
-        self.EnablePage('vector', False)
-        
-        # volume page
-        self.notebookData.AddPage(page = self._createVolumePage(),
-                                  text = " %s " % _("Volume"))
-        self.EnablePage('volume', False)
-        
-        return self.notebookData
-    
-    def _createAppearancePage(self):
-        """!Create data (surface, vector, volume) settings page"""
-        if globalvar.hasAgw:
-            self.notebookAppearance = FN.FlatNotebook(parent = self, id = wx.ID_ANY,
-                                                      agwStyle = globalvar.FNPageDStyle)
-        else:
-            self.notebookAppearance = FN.FlatNotebook(parent = self, id = wx.ID_ANY,
-                                                      style = globalvar.FNPageDStyle)
-        
-        # light page
-        self.notebookAppearance.AddPage(page = self._createLightPage(),
-                                        text = " %s " % _("Lighting"))
-    
-        # fringe page
-        self.notebookAppearance.AddPage(page = self._createFringePage(),
-                                        text = " %s " % _("Fringe"))
-        self.EnablePage('fringe', False)
-
-        return self.notebookAppearance
-    
-    def _createSurfacePage(self):
-        """!Create view settings page"""
-        panel = SP.ScrolledPanel(parent = self, id = wx.ID_ANY)
-        panel.SetupScrolling(scroll_x = False)
-        self.page['surface'] = { 'id' : 0,
-                                 'panel' : panel.GetId(),
-                                 'notebook' : self.notebookData.GetId() }
-        pageSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        self.win['surface'] = {}
-        
-        # selection
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Raster map")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        rmaps = gselect.Select(parent = panel, type = 'raster',
-                               onPopup = self.GselectOnPopup)
-        rmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetRaster)
-        self.win['surface']['map'] = rmaps.GetId()
-        desc = wx.StaticText(parent = panel, id = wx.ID_ANY)
-        self.win['surface']['desc'] = desc.GetId()
-        boxSizer.Add(item = rmaps, proportion = 0,
-                     flag = wx.ALL,
-                     border = 3)
-        boxSizer.Add(item = desc, proportion = 0,
-                     flag = wx.ALL,
-                     border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        #
-        # surface attributes
-        #
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Surface attributes")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        
-        # type 
-        self.win['surface']['attr'] = {}
-        row = 0
-        for code, attrb in (('topo', _("Topography")),
-                           ('color', _("Color")),
-                           ('mask', _("Mask")),
-                           ('transp', _("Transparency")),
-                           ('shine', _("Shininess")),
-                           ('emit', _("Emission"))):
-            self.win['surface'][code] = {} 
-            gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                             label = attrb + ':'),
-                          pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-            use = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
-                             choices = [_("map")])
-            
-            if code not in ('topo', 'color', 'shine'):
-                use.Insert(item = _("unset"), pos = 0)
-                self.win['surface'][code]['required'] = False
-            else:
-                self.win['surface'][code]['required'] = True
-            if code != 'mask':
-                use.Append(item = _('constant'))
-            self.win['surface'][code]['use'] = use.GetId()
-            use.Bind(wx.EVT_CHOICE, self.OnMapObjUse)
-            gridSizer.Add(item = use, flag = wx.ALIGN_CENTER_VERTICAL,
-                          pos = (row, 1))
-            
-            map = gselect.Select(parent = panel, id = wx.ID_ANY,
-                                 # size = globalvar.DIALOG_GSELECT_SIZE,
-                                 size = (200, -1),
-                                 type = "raster")
-            self.win['surface'][code]['map'] = map.GetId() - 1 # FIXME
-            map.Bind(wx.EVT_TEXT, self.OnSurfaceMap)
-            # changing map topography not allowed
-            if code == 'topo':
-                map.Enable(False)
-            gridSizer.Add(item = map, flag = wx.ALIGN_CENTER_VERTICAL,
-                          pos = (row, 2))
-            
-            if code == 'color':
-                value = csel.ColourSelect(panel, id = wx.ID_ANY,
-                                          colour = (0,0,0),
-                                          size = globalvar.DIALOG_COLOR_SIZE)
-                value.Bind(csel.EVT_COLOURSELECT, self.OnSurfaceMap)
-            elif code == 'mask':
-                value = None
-            else:
-                value = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                                    initial = 0)
-                if code == 'topo':
-                    value.SetRange(minVal = -1e9, maxVal = 1e9)
-                elif code in ('shine', 'transp', 'emit'):
-                    value.SetRange(minVal = 0, maxVal = 255)
-                else:
-                    value.SetRange(minVal = 0, maxVal = 100)
-                value.Bind(wx.EVT_TEXT, self.OnSurfaceMap)
-            
-            if value:
-                self.win['surface'][code]['const'] = value.GetId()
-                value.Enable(False)
-                gridSizer.Add(item = value, flag = wx.ALIGN_CENTER_VERTICAL,
-                              pos = (row, 3))
-            else:
-                self.win['surface'][code]['const'] = None
-            
-            self.SetMapObjUseMap(nvizType = 'surface',
-                                 attrb = code) # -> enable map / disable constant
-                
-            row += 1
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL,
-                      border = 3)
-        
-        #
-        # draw
-        #
-        self.win['surface']['draw'] = {}
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Draw")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
-        gridSizer.AddGrowableCol(6)
-        
-        # mode
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Mode:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        mode = wx.Choice (parent = panel, id = wx.ID_ANY, size = (-1, -1),
-                          choices = [_("coarse"),
-                                     _("fine"),
-                                     _("both")])
-        mode.SetSelection(0)
-        mode.SetName("selection")
-        mode.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
-        self.win['surface']['draw']['mode'] = mode.GetId()
-        gridSizer.Add(item = mode, flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (0, 1))
-        
-        # shading
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Shading:")),
-                      pos = (0, 2), flag = wx.ALIGN_CENTER_VERTICAL)
-        shade = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
-                           choices = [_("flat"),
-                                      _("gouraud")])
-        shade.SetName("selection")
-        self.win['surface']['draw']['shading'] = shade.GetId()
-        shade.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
-        gridSizer.Add(item = shade, flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (0, 3))
-        
-        # set to all
-        all = wx.Button(panel, id = wx.ID_ANY, label = _("Set to all"))
-        all.SetToolTipString(_("Use draw settings for all loaded surfaces"))
-        all.Bind(wx.EVT_BUTTON, self.OnSurfaceModeAll)
-        gridSizer.Add(item = all, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
-                      pos = (0, 4), span = (1,2), border = 3 )
-        
-        # resolution coarse
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Coarse:")),
-                      pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        resSizer = wx.BoxSizer(wx.HORIZONTAL)
-        resSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                        label = _("res.")),
-                     flag = wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 
-                     border = 3)
-        resC = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = 6,
-                           min = 1,
-                           max = 100)
-        resC.SetName("value")
-        resC.SetValue(6)
-        
-        self.win['surface']['draw']['res-coarse'] = resC.GetId()
-        resC.Bind(wx.EVT_SPINCTRL, self.OnSurfaceResolution)
-        resSizer.Add(item = resC, flag = wx.ALL | wx.ALIGN_LEFT | 
-                      wx.ALIGN_CENTER_VERTICAL, border = 3)
-        gridSizer.Add(item = resSizer, pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # Coarse style
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("style")),
-                      pos = (1, 2), flag = wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
-        style = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
-                          choices = [_("wire"),
-                                     _("surface")])
-        style.SetName("selection")
-        self.win['surface']['draw']['style'] = style.GetId()
-        style.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
-        gridSizer.Add(item = style, flag = wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL,
-                      pos = (1, 3))
-        
-        # color
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("wire color")),
-                      pos = (1, 4), flag = wx.ALIGN_CENTER_VERTICAL | 
-                      wx.ALIGN_RIGHT | wx.LEFT, border = 3)
-        color = csel.ColourSelect(panel, id = wx.ID_ANY,
-                                  size = globalvar.DIALOG_COLOR_SIZE)
-        color.SetColour((136,136,136))
-        color.SetName("colour")
-        color.Bind(csel.EVT_COLOURSELECT, self.OnSurfaceWireColor)
-        self.win['surface']['draw']['wire-color'] = color.GetId()
-        gridSizer.Add(item = color, flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT,
-                      pos = (1, 5))
-        
-        # resolution fine
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Fine:")),
-                      pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        resSizer = wx.BoxSizer(wx.HORIZONTAL)
-        resSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                        label = _("res.")),
-                     flag = wx.ALL | wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 
-                     border = 3)
-        resF = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = 3,
-                           min = 1,
-                           max = 100)
-        resF.SetName("value")
-        resF.SetValue(3)
-        self.win['surface']['draw']['res-fine'] = resF.GetId()
-        resF.Bind(wx.EVT_SPINCTRL, self.OnSurfaceResolution)
-        resSizer.Add(item = resF, flag = wx.ALL | wx.ALIGN_LEFT | 
-                      wx.ALIGN_CENTER_VERTICAL, border = 3)
-        gridSizer.Add(item = resSizer, pos = (2, 1), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        #
-        # mask
-        #
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Mask")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
-        
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Mask zeros:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        elev = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                           label = _("by elevation"))
-        elev.Enable(False) # TODO: not implemented yet
-        gridSizer.Add(item = elev, pos = (0, 1))
-        
-        color = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                           label = _("by color"))
-        color.Enable(False) # TODO: not implemented yet
-        gridSizer.Add(item = color, pos = (0, 2))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        #
-        # position
-        #
-        self.win['surface']['position'] = {}
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Position")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
-        
-        # position
-        self._createControl(panel, data = self.win['surface'], name = 'position',
-                            range = (-10000, 10000),
-                            bind = (self.OnSurfacePosition, self.OnSurfacePosition, self.OnSurfacePosition))
-        
-        axis = wx.Choice (parent = panel, id = wx.ID_ANY, size = (75, -1),
-                          choices = ["X",
-                                     "Y",
-                                     "Z"])
-        
-        self.win['surface']['position']['axis'] = axis.GetId()
-        axis.SetSelection(0)
-        axis.Bind(wx.EVT_CHOICE, self.OnSurfaceAxis)
-        
-        pslide = self.FindWindowById(self.win['surface']['position']['slider'])
-        pspin = self.FindWindowById(self.win['surface']['position']['spin'])
-        
-        gridSizer.Add(item = axis, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 0))
-        gridSizer.Add(item = pslide, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 1))
-        gridSizer.Add(item = pspin, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 2))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        box.SetSizer(boxSizer)
-        box.Layout()
-        
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        panel.SetSizer(pageSizer)
-        
-        return panel
-
-    def _createVectorPage(self):
-        """!Create view settings page"""
-        panel = SP.ScrolledPanel(parent = self, id = wx.ID_ANY)
-        panel.SetupScrolling(scroll_x = False)
-        self.page['vector'] = { 'id' : 1,
-                                'panel' : panel.GetId(),
-                                'notebook' : self.notebookData.GetId() }
-        pageSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        self.win['vector'] = {}
-        
-        # selection
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Vector map")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        vmaps = gselect.Select(parent = panel, type = 'vector',
-                               onPopup = self.GselectOnPopup)
-        vmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetVector)
-        self.win['vector']['map'] = vmaps.GetId()
-        desc = wx.StaticText(parent = panel, id = wx.ID_ANY)
-        self.win['vector']['desc'] = desc.GetId()
-        boxSizer.Add(item = vmaps, proportion = 0,
-                     flag = wx.ALL,
-                     border = 3)
-        boxSizer.Add(item = desc, proportion = 0,
-                     flag = wx.ALL,
-                     border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        #
-        # vector lines
-        #
-        self.win['vector']['lines'] = {}
-        
-        showLines = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                                label = _("Show vector lines"))
-        showLines.SetValue(True)
-        
-        self.win['vector']['lines']['show'] = showLines.GetId()
-        showLines.Bind(wx.EVT_CHECKBOX, self.OnVectorShow)
-        
-        pageSizer.Add(item = showLines, proportion = 0,
-                      flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
-        
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Vector lines")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
-        
-        # width
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Line:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("width")),
-                      pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL | 
-                      wx.ALIGN_RIGHT)
-        
-        width = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                            initial = 1,
-                            min = 0,
-                            max = 100)
-        width.SetValue(1)
-        self.win['vector']['lines']['width'] = width.GetId()
-        width.Bind(wx.EVT_SPINCTRL, self.OnVectorLines)
-        gridSizer.Add(item = width, pos = (0, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
-        
-        # color
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("color")),
-                      pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALIGN_RIGHT)
-        
-        color = csel.ColourSelect(panel, id = wx.ID_ANY,
-                                  colour = (0,0,0),
-                                  size = globalvar.DIALOG_COLOR_SIZE)
-        self.win['vector']['lines']['color'] = color.GetId()
-        color.Bind(csel.EVT_COLOURSELECT, self.OnVectorLines)
-
-        gridSizer.Add(item = color, pos = (0, 4), flag = wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALIGN_LEFT)
-        
-        # display
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("display")),
-                      pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALIGN_RIGHT)
-        
-        display = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
-                             choices = [_("on surface"),
-                                        _("flat")])
-        self.win['vector']['lines']['flat'] = display.GetId()
-        display.Bind(wx.EVT_CHOICE, self.OnVectorDisplay)
-        
-        gridSizer.Add(item = display, flag = wx.ALIGN_CENTER_VERTICAL | 
-                      wx.ALIGN_LEFT, pos = (1, 2), span = (1,2))
-        
-        # height
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Height above surface:")),
-                      pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL,
-                      span = (1, 3))
-        
-        surface = wx.ComboBox(parent = panel, id = wx.ID_ANY, size = (250, -1),
-                              style = wx.CB_SIMPLE | wx.CB_READONLY,
-                              choices = [])
-        surface.Bind(wx.EVT_COMBOBOX, self.OnVectorSurface)
-        self.win['vector']['lines']['surface'] = surface.GetId()
-        gridSizer.Add(item = surface, 
-                      pos = (2, 3), span = (1, 6),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        self._createControl(panel, data = self.win['vector']['lines'], name = 'height', size = 300,
-                            range = (0, 1000),
-                            bind = (self.OnVectorHeight, self.OnVectorHeightFull, self.OnVectorHeightSpin))
-        self.FindWindowById(self.win['vector']['lines']['height']['slider']).SetValue(0)
-        self.FindWindowById(self.win['vector']['lines']['height']['spin']).SetValue(0)
-        gridSizer.Add(item = self.FindWindowById(self.win['vector']['lines']['height']['slider']),
-                      pos = (3, 0), span = (1, 7))
-        gridSizer.Add(item = self.FindWindowById(self.win['vector']['lines']['height']['spin']),
-                      pos = (3, 7),
-                      flag = wx.ALIGN_CENTER)
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                     flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        #
-        # vector points
-        #
-        self.win['vector']['points'] = {}
-        
-        showPoints = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                                 label = _("Show vector points"))
-        showPoints.SetValue(True)
-        self.win['vector']['points']['show'] = showPoints.GetId()
-        showPoints.Bind(wx.EVT_CHECKBOX, self.OnVectorShow)
-        
-        pageSizer.Add(item = showPoints, proportion = 0,
-                      flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
-        
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Vector points")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
-        
-        # icon size
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Icon:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("size")),
-                      pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALIGN_RIGHT)
-        
-        isize = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                            initial = 1,
-                            min = 1,
-                            max = 1e6)
-        isize.SetName('value')
-        isize.SetValue(100)
-        self.win['vector']['points']['size'] = isize.GetId()
-        isize.Bind(wx.EVT_SPINCTRL, self.OnVectorPoints)
-        isize.Bind(wx.EVT_TEXT, self.OnVectorPoints)
-        gridSizer.Add(item = isize, pos = (0, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
-        
-        # icon color
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("color")),
-                      pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALIGN_RIGHT)
-        icolor = csel.ColourSelect(panel, id = wx.ID_ANY,
-                                   size = globalvar.DIALOG_COLOR_SIZE)
-        icolor.SetName("color")
-        icolor.SetColour((0,0,255))
-        self.win['vector']['points']['color'] = icolor.GetId()
-        icolor.Bind(csel.EVT_COLOURSELECT, self.OnVectorPoints)
-        gridSizer.Add(item = icolor, flag = wx.ALIGN_CENTER_VERTICAL | 
-                      wx.ALIGN_LEFT,
-                      pos = (0, 4))
-
-        # icon width
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                           label = _("width")),
-                      pos = (0, 5), flag = wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALIGN_RIGHT)
-        
-        iwidth = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                             initial = 1,
-                             min = 1,
-                             max = 1e6)
-        iwidth.SetName('value')
-        iwidth.SetValue(100)
-        self.win['vector']['points']['width'] = iwidth.GetId()
-        iwidth.Bind(wx.EVT_SPINCTRL, self.OnVectorPoints)
-        iwidth.Bind(wx.EVT_TEXT, self.OnVectorPoints)
-        gridSizer.Add(item = iwidth, pos = (0, 6),
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
-        
-        # icon symbol
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("symbol")),
-                      pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
-        isym = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
-                          choices = UserSettings.Get(group = 'nviz', key = 'vector',
-                                                   subkey = ['points', 'marker'], internal = True))
-        isym.SetName("selection")
-        self.win['vector']['points']['marker'] = isym.GetId()
-        isym.Bind(wx.EVT_CHOICE, self.OnVectorPoints)
-        gridSizer.Add(item = isym, flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (1, 2), span = (1,2))
-        
-        # high
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Height above surface:")),
-                      pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL,
-                      span = (1, 3))
-        
-        surface = wx.ComboBox(parent = panel, id = wx.ID_ANY, size = (250, -1),
-                              style = wx.CB_SIMPLE | wx.CB_READONLY,
-                              choices = [])
-        surface.Bind(wx.EVT_COMBOBOX, self.OnVectorSurface)
-        self.win['vector']['points']['surface'] = surface.GetId()
-        gridSizer.Add(item = surface, 
-                      pos = (2, 3), span = (1, 5),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        self._createControl(panel, data = self.win['vector']['points'], name = 'height', size = 300,
-                            range = (0, 1000),
-                            bind = (self.OnVectorHeight, self.OnVectorHeightFull, self.OnVectorHeightSpin))
-        
-        self.FindWindowById(self.win['vector']['points']['height']['slider']).SetValue(0)
-        self.FindWindowById(self.win['vector']['points']['height']['spin']).SetValue(0)
-        
-        gridSizer.Add(item = self.FindWindowById(self.win['vector']['points']['height']['slider']),
-                      pos = (3, 0), span = (1, 7))
-        gridSizer.Add(item = self.FindWindowById(self.win['vector']['points']['height']['spin']),
-                      pos = (3, 7),
-                      flag = wx.ALIGN_CENTER)
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                     flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        panel.SetSizer(pageSizer)
-
-        return panel
-
-    def GselectOnPopup(self, ltype, exclude = False):
-        """Update gselect.Select() items"""
-        maps = list()
-        for layer in self.mapWindow.Map.GetListOfLayers(l_type = ltype):
-            maps.append(layer.GetName())
-        return maps, exclude
-    
-    def _createVolumePage(self):
-        """!Create view settings page"""
-        panel = SP.ScrolledPanel(parent = self, id = wx.ID_ANY)
-        panel.SetupScrolling(scroll_x = False)
-        self.page['volume'] = { 'id' : 2,
-                                'panel' : panel.GetId(),
-                                'notebook' : self.notebookData.GetId() }
-        pageSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        self.win['volume'] = {}
-        
-        # selection
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("3D raster map")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        rmaps = gselect.Select(parent = panel, type = 'raster3d',
-                               onPopup = self.GselectOnPopup)
-        rmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetRaster3D)
-        self.win['volume']['map'] = rmaps.GetId()
-        desc = wx.StaticText(parent = panel, id = wx.ID_ANY)
-        self.win['volume']['desc'] = desc.GetId()
-        boxSizer.Add(item = rmaps, proportion = 0,
-                     flag = wx.ALL,
-                     border = 3)
-        boxSizer.Add(item = desc, proportion = 0,
-                     flag = wx.ALL,
-                     border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-                
-        #
-        # draw
-        #
-        self.win['volume']['draw'] = {}
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Draw")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
-        gridSizer.AddGrowableCol(4)
-        
-        # mode
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Mode:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        mode = wx.Choice (parent = panel, id = wx.ID_ANY, size = (150, -1),
-                          choices = [_("isosurfaces"),
-                                     _("slides")])
-        mode.SetSelection(0)
-        mode.SetName("selection")
-        # mode.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
-        self.win['volume']['draw']['mode'] = mode.GetId()
-        gridSizer.Add(item = mode, flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (0, 1))
-        
-        # shading
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Shading:")),
-                      pos = (0, 2), flag = wx.ALIGN_CENTER_VERTICAL)
-        shade = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
-                           choices = [_("flat"),
-                                      _("gouraud")])
-        shade.SetName("selection")
-        self.win['volume']['draw']['shading'] = shade.GetId()
-        shade.Bind(wx.EVT_CHOICE, self.OnVolumeIsosurfMode)
-        gridSizer.Add(item = shade, flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (0, 3))
-        
-        # resolution (mode)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Resolution:")),
-                      pos = (0, 4), flag = wx.ALIGN_CENTER_VERTICAL)
-        resol = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                            initial = 1,
-                            min = 1,
-                            max = 100)
-        resol.SetName("value")
-        self.win['volume']['draw']['resolution'] = resol.GetId()
-        resol.Bind(wx.EVT_SPINCTRL, self.OnVolumeIsosurfResolution)
-        resol.Bind(wx.EVT_TEXT, self.OnVolumeIsosurfResolution)
-        gridSizer.Add(item = resol, pos = (0, 5))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                     flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL,
-                      border = 3)
-        
-        #
-        # manage isosurfaces
-        #
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("List of isosurfaces")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        
-        # list
-        isolevel = wx.CheckListBox(parent = panel, id = wx.ID_ANY,
-                                   size = (300, 150))
-        self.Bind(wx.EVT_CHECKLISTBOX, self.OnVolumeIsosurfCheck, isolevel)
-        self.Bind(wx.EVT_LISTBOX, self.OnVolumeIsosurfSelect, isolevel)
-        
-        self.win['volume']['isosurfs'] = isolevel.GetId()
-        gridSizer.Add(item = isolevel, pos = (0, 0), span = (4, 1))
-        
-        # buttons (add, delete, move up, move down)
-        btnAdd = wx.Button(parent = panel, id = wx.ID_ADD)
-        self.win['volume']['btnIsosurfAdd'] = btnAdd.GetId()
-        btnAdd.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfAdd)
-        gridSizer.Add(item = btnAdd,
-                      pos = (0, 1))
-        btnDelete = wx.Button(parent = panel, id = wx.ID_DELETE)
-        self.win['volume']['btnIsosurfDelete'] = btnDelete.GetId()
-        btnDelete.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfDelete)
-        btnDelete.Enable(False)
-        gridSizer.Add(item = btnDelete,
-                      pos = (1, 1))
-        btnMoveUp = wx.Button(parent = panel, id = wx.ID_UP)
-        self.win['volume']['btnIsosurfMoveUp'] = btnMoveUp.GetId()
-        btnMoveUp.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfMoveUp)
-        btnMoveUp.Enable(False)
-        gridSizer.Add(item = btnMoveUp,
-                      pos = (2, 1))
-        btnMoveDown = wx.Button(parent = panel, id = wx.ID_DOWN)
-        self.win['volume']['btnIsosurfMoveDown'] = btnMoveDown.GetId()
-        btnMoveDown.Bind(wx.EVT_BUTTON, self.OnVolumeIsosurfMoveDown)
-        btnMoveDown.Enable(False)
-        gridSizer.Add(item = btnMoveDown,
-                      pos = (3, 1))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                     flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        #
-        # isosurface attributes
-        #
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Isosurface attributes")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        
-        self.win['volume']['attr'] = {}
-        row = 0
-        for code, attrb in (('topo', _("Topography level")),
-                            ('color', _("Color")),
-                            ('mask', _("Mask")),
-                            ('transp', _("Transparency")),
-                            ('shine', _("Shininess")),
-                            ('emit', _("Emission"))):
-            self.win['volume'][code] = {} 
-            # label
-            gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                             label = attrb + ':'),
-                          pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-            if code != 'topo':
-                use = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
-                                 choices = [_("map")])
-            else:
-                use = None
-            # check for required properties
-            if code not in ('topo', 'color', 'shine'):
-                use.Insert(item = _("unset"), pos = 0)
-                self.win['volume'][code]['required'] = False
-            else:
-                self.win['volume'][code]['required'] = True
-            if use and code != 'mask':
-                use.Append(item = _('constant'))
-            if use:
-                self.win['volume'][code]['use'] = use.GetId()
-                use.Bind(wx.EVT_CHOICE, self.OnMapObjUse)
-                gridSizer.Add(item = use, flag = wx.ALIGN_CENTER_VERTICAL,
-                              pos = (row, 1))
-            
-            if code != 'topo':
-                map = gselect.Select(parent = panel, id = wx.ID_ANY,
-                                     # size = globalvar.DIALOG_GSELECT_SIZE,
-                                     size = (200, -1),
-                                     type = "grid3")
-                self.win['volume'][code]['map'] = map.GetId() - 1 # FIXME
-                map.Bind(wx.EVT_TEXT, self.OnVolumeIsosurfMap)
-                gridSizer.Add(item = map, flag = wx.ALIGN_CENTER_VERTICAL,
-                              pos = (row, 2))
-            else:
-                map = None
-            
-            if code == 'color':
-                value = csel.ColourSelect(panel, id = wx.ID_ANY,
-                                          colour = (0,0,0),
-                                          size = globalvar.DIALOG_COLOR_SIZE)
-                value.Bind(csel.EVT_COLOURSELECT, self.OnVolumeIsosurfMap)
-            elif code == 'mask':
-                value = None
-            else:
-                if code == 'topo':
-                    size = (200, -1)
-                else:
-                    size = (65, -1)
-                value = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = size,
-                                    initial = 0)
-                if code == 'topo':
-                    value.SetRange(minVal = -1e9, maxVal = 1e9)
-                elif code in ('shine', 'transp', 'emit'):
-                    value.SetRange(minVal = 0, maxVal = 255)
-                else:
-                    value.SetRange(minVal = 0, maxVal = 100)
-                value.Bind(wx.EVT_SPINCTRL, self.OnVolumeIsosurfMap)
-                value.Bind(wx.EVT_TEXT, self.OnVolumeIsosurfMap)
-            
-            if value:
-                self.win['volume'][code]['const'] = value.GetId()
-                if code == 'topo':
-                    gridSizer.Add(item = value, flag = wx.ALIGN_CENTER_VERTICAL,
-                                  pos = (row, 2))
-                else:
-                    value.Enable(False)
-                    gridSizer.Add(item = value, flag = wx.ALIGN_CENTER_VERTICAL,
-                                  pos = (row, 3))
-            else:
-                self.win['volume'][code]['const'] = None
-            
-            if code != 'topo':
-                self.SetMapObjUseMap(nvizType = 'volume',
-                                     attrb = code) # -> enable map / disable constant
-            
-            row += 1
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                     flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        panel.SetSizer(pageSizer)
-        
-        return panel
-    
-    def _createLightPage(self):
-        """!Create light page"""
-        panel = SP.ScrolledPanel(parent = self, id = wx.ID_ANY)
-        panel.SetupScrolling(scroll_x = False)
-        
-        self.page['light'] = { 'id' : 0, 
-                               'notebook' : self.notebookAppearance.GetId() }
-        self.win['light'] = {}
-        
-        pageSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        show = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                           label = _("Show light model"))
-        show.Bind(wx.EVT_CHECKBOX, self.OnShowLightModel)
-        pageSizer.Add(item = show, proportion = 0,
-                      flag = wx.ALL, border = 3)
-        surface = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                              label = _("Follow source viewpoint"))
-        pageSizer.Add(item = surface, proportion = 0,
-                      flag = wx.ALL, border = 3)
-        
-        # position
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Light source position")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        posSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        posSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("W")),
-                     pos = (1, 0), flag = wx.ALIGN_CENTER)
-        posSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("N")),
-                     pos = (0, 1), flag = wx.ALIGN_CENTER | wx.ALIGN_BOTTOM)
-        pos = LightPositionWindow(panel, id = wx.ID_ANY, size = (175, 175),
-                                  mapwindow = self.mapWindow)
-        self.win['light']['position'] = pos.GetId()
-        posSizer.Add(item = pos,
-                     pos = (1, 1), flag = wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL)
-        posSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("S")),
-                     pos = (2, 1), flag = wx.ALIGN_CENTER | wx.ALIGN_TOP)
-        posSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("E")),
-                     pos = (1, 2), flag = wx.ALIGN_CENTER)
-        gridSizer.Add(item = posSizer, pos = (0, 0))
-        
-        # height
-        self._createControl(panel, data = self.win['light'], name = 'z', sliderHor = False,
-                            range = (0, 100),
-                            bind = (self.OnLightChange, None, self.OnLightChange))
-        
-        heightSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        heightSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Height:")),
-                      pos = (0, 0), flag = wx.ALIGN_LEFT, span = (1, 2))
-        heightSizer.Add(item = self.FindWindowById(self.win['light']['z']['slider']),
-                        flag = wx.ALIGN_RIGHT, pos = (1, 0))
-        heightSizer.Add(item = self.FindWindowById(self.win['light']['z']['spin']),
-                        flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.TOP |
-                        wx.BOTTOM | wx.RIGHT, pos = (1, 1))
-        
-        gridSizer.Add(item = heightSizer, pos = (0, 1), flag = wx.ALIGN_RIGHT)
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                     flag = wx.ALL | wx.EXPAND, border = 2)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        # position
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Light color and intensity")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-
-        gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Color:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        color = csel.ColourSelect(panel, id = wx.ID_ANY,
-                                  colour = UserSettings.Get(group = 'nviz', key = 'light',
-                                                            subkey = 'color'),
-                                  size = globalvar.DIALOG_COLOR_SIZE)
-        self.win['light']['color'] = color.GetId()
-        color.Bind(csel.EVT_COLOURSELECT, self.OnLightColor)
-        gridSizer.Add(item = color, pos = (0, 2))
-
-        gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Brightness:")),
-                      pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        self._createControl(panel, data = self.win['light'], name = 'bright', size = 300,
-                            range = (0, 100),
-                            bind = (self.OnLightValue, None, self.OnLightValue))
-        gridSizer.Add(item = self.FindWindowById(self.win['light']['bright']['slider']),
-                      pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = self.FindWindowById(self.win['light']['bright']['spin']),
-                      pos = (1, 2),
-                      flag = wx.ALIGN_CENTER)
-        gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Ambient:")),
-                      pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        self._createControl(panel, data = self.win['light'], name = 'ambient', size = 300,
-                            range = (0, 100),
-                            bind = (self.OnLightValue, None, self.OnLightValue))
-        gridSizer.Add(item = self.FindWindowById(self.win['light']['ambient']['slider']),
-                      pos = (2, 1), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = self.FindWindowById(self.win['light']['ambient']['spin']),
-                      pos = (2, 2),
-                      flag = wx.ALIGN_CENTER)
-
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                     flag = wx.ALL | wx.EXPAND, border = 2)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        # reset = wx.Button(panel, id = wx.ID_ANY, label = _("Reset"))
-        # reset.SetToolTipString(_("Reset to default view"))
-        # # self.win['reset'] = reset.GetId()
-        # reset.Bind(wx.EVT_BUTTON, self.OnResetView)
-        
-        # viewSizer.Add(item = reset, proportion = 1,
-        #               flag = wx.EXPAND | wx.ALL | wx.ALIGN_RIGHT,
-        #               border = 5)
-        
-        # gridSizer.AddGrowableCol(3)
-        # gridSizer.Add(item = viewSizer, pos = (4, 0), span = (1, 2),
-        #               flag = wx.EXPAND)
-        
-        panel.SetSizer(pageSizer)
-        
-        return panel
-
-    def _createFringePage(self):
-        """!Create fringe page"""
-        panel = SP.ScrolledPanel(parent = self, id = wx.ID_ANY)
-        panel.SetupScrolling(scroll_x = False)
-        
-        self.page['fringe'] = { 'id' : 1,
-                                'notebook' : self.notebookAppearance.GetId() }
-        self.win['fringe'] = {}
-
-        pageSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        # selection
-        rbox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                             label = " %s " % (_("Surface")))
-        rboxSizer = wx.StaticBoxSizer(rbox, wx.VERTICAL)
-        rmaps = gselect.Select(parent = panel, type = 'raster',
-                               onPopup = self.GselectOnPopup)
-        rmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetSurface)
-        self.win['fringe']['map'] = rmaps.GetId()
-        rboxSizer.Add(item = rmaps, proportion = 0,
-                      flag = wx.ALL,
-                      border = 3)
-        pageSizer.Add(item = rboxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        ebox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                             label = " %s " % (_("Edges with fringe")))
-        eboxSizer = wx.StaticBoxSizer(ebox, wx.HORIZONTAL)
-        for edge in [(_("N && W"), "nw"),
-                     (_("N && E"), "ne"),
-                     (_("S && W"), "sw"),
-                     (_("S && E"), "se")]:
-            chkbox = wx.CheckBox(parent = panel,
-                                 label = edge[0],
-                                 name = edge[1])
-            self.win['fringe'][edge[1]] = chkbox.GetId()
-            eboxSizer.Add(item = chkbox, proportion = 0,
-                         flag = wx.ADJUST_MINSIZE | wx.LEFT | wx.RIGHT, border = 5)
-            chkbox.Bind(wx.EVT_CHECKBOX, self.OnFringe)
-        
-        pageSizer.Add(item = eboxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-
-        sbox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                             label = " %s " % (_("Settings")))
-        sboxSizer = wx.StaticBoxSizer(sbox, wx.HORIZONTAL)
-        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
-        
-        # elevation
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                           label = _("Elevation of fringe from bottom:")),
-                      pos = (0, 0),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        spin = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
-                           size = (65, -1), min = -1e6, max = 1e6)
-        spin.SetValue(UserSettings.Get(group = 'nviz', key = 'fringe', subkey = 'elev'))
-        spin.Bind(wx.EVT_SPINCTRL, self.OnFringe)
-        self.win['fringe']['elev'] = spin.GetId()
-        gridSizer.Add(item = spin, pos = (0, 1))
-        
-        # color
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                           label = _("Color:")),
-                      pos = (1, 0),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        color = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
-                                  size = globalvar.DIALOG_COLOR_SIZE)
-        color.SetColour(UserSettings.Get(group = 'nviz', key = 'fringe',
-                                         subkey = 'color'))
-        color.Bind(csel.EVT_COLOURSELECT, self.OnFringe)
-        self.win['fringe']['color'] = color.GetId()
-        gridSizer.Add(item = color, pos = (1, 1))
-        
-        sboxSizer.Add(item = gridSizer, proportion = 1,
-                      flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = sboxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        panel.SetSizer(pageSizer)
-
-        return panel
-
-    def GetLayerData(self, nvizType):
-        """!Get nviz data"""
-        name = self.FindWindowById(self.win[nvizType]['map']).GetValue()
-        
-        if nvizType == 'surface' or nvizType == 'fringe':
-            return self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
-        elif nvizType == 'vector':
-            return self.mapWindow.GetLayerByName(name, mapType = 'vector', dataType = 'nviz')
-        elif nvizType == 'volume':
-            return self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')
-        
-        return None
-    
-    def OnFringe(self, event):
-        """!Show/hide fringe"""
-        enabled = event.IsChecked()
-        win = self.FindWindowById(event.GetId())
-        
-        data = self.GetLayerData('fringe')['surface']
-        
-        sid = data['object']['id']
-        elev = self.FindWindowById(self.win['fringe']['elev']).GetValue()
-        color = self.FindWindowById(self.win['fringe']['color']).GetValue()
-        
-        self._display.SetFringe(sid, color, elev,
-                                self.FindWindowById(self.win['fringe']['nw']).IsChecked(),
-                                self.FindWindowById(self.win['fringe']['ne']).IsChecked(),
-                                self.FindWindowById(self.win['fringe']['sw']).IsChecked(),
-                                self.FindWindowById(self.win['fringe']['se']).IsChecked())
-        self.mapWindow.Refresh(False)
-        
-    def OnScroll(self, event, win, data):
-        """!Generic scrolling handler"""
-        winName = self.__GetWindowName(win, event.GetId())
-        if not winName:
-            return
-        data[winName] = event.GetInt()
-        for w in win[winName].itervalues():
-            self.FindWindowById(w).SetValue(data[winName])
-        
-        event.Skip()
-        
-    def _createControl(self, parent, data, name, range, bind = (None, None, None),
-                       sliderHor = True, size = 200):
-        """!Add control (Slider + SpinCtrl)"""
-        data[name] = dict()
-        if sliderHor:
-            style = wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | \
-                wx.SL_BOTTOM
-            sizeW = (size, -1)
-        else:
-            style = wx.SL_VERTICAL | wx.SL_AUTOTICKS | \
-                wx.SL_INVERSE
-            sizeW = (-1, size)
-        
-        slider = wx.Slider(parent = parent, id = wx.ID_ANY,
-                           minValue = range[0],
-                           maxValue = range[1],
-                           style = style,
-                           size = sizeW)
-        slider.SetName('slider')
-        if bind[0]:
-            slider.Bind(wx.EVT_SCROLL, bind[0])
-        
-        # slider.Bind(wx.EVT_SCROLL_THUMBRELEASE, bind[1])
-        if bind[1]:
-            slider.Bind(wx.EVT_SCROLL_CHANGED, bind[1]) # this only works in MSW
-        data[name]['slider'] = slider.GetId()
-        
-        spin = wx.SpinCtrl(parent = parent, id = wx.ID_ANY, size = (65, -1),
-                           min = range[0],
-                           max = range[1])
-        
-        # no 'changed' event ... (FIXME)
-        spin.SetName('spin')
-        if bind[2]:
-            spin.Bind(wx.EVT_SPINCTRL, bind[2])
-        
-        data[name]['spin'] = spin.GetId()
-        
-    def __GetWindowName(self, data, id):
-        for name in data.iterkeys():
-            if type(data[name]) is type({}):
-                for win in data[name].itervalues():
-                    if win == id:
-                        return name
-            else:
-                if data[name] == id:
-                    return name
-        
-        return None
-
-    def UpdateSettings(self):
-        """!Update view from settings values 
-        stored in self.mapWindow.view dictionary"""
-        for control in ('height',
-                        'persp',
-                        'twist',
-                        'z-exag'):
-            for win in self.win['view'][control].itervalues():                
-                if control == 'height':
-                    value = UserSettings.Get(group = 'nviz', key = 'view',
-                                             subkey = ['height', 'value'], internal = True)
-                else:
-                    try:
-                        value = self.mapWindow.view[control]['value']
-                    except KeyError:
-                        value = -1
-                
-                self.FindWindowById(win).SetValue(value)
-        
-        viewWin = self.FindWindowById(self.win['view']['position'])
-        x, y = viewWin.UpdatePos(self.mapWindow.view['position']['x'],
-                                 self.mapWindow.view['position']['y'])
-        viewWin.Draw(pos = (x, y), scale = True)
-        viewWin.Refresh(False)
-        
-        # bgcolor = self.FindWindowById(self.win['settings']['general']['bgcolor']).GetColour()
-        # self.OnBgColor(event = bgcolor)
-        self.Update()
-        
-        self.mapWindow.Refresh(eraseBackground = False)
-        self.mapWindow.render['quick'] = False
-        self.mapWindow.Refresh(False)
-        
-    def OnShowLightModel(self, event):
-        """!Show light model"""
-        self._display.showLight = event.IsChecked()
-        self._display.DrawLightingModel()
-        
-    def OnLightChange(self, event):
-        """!Position of the light changed"""
-        winName = self.__GetWindowName(self.win['light'], event.GetId())
-        if not winName:
-            return
-        
-        val = event.GetInt()
-        self.mapWindow.light['position']['z'] = val
-        for win in self.win['light'][winName].itervalues():
-            self.FindWindowById(win).SetValue(val)
-        
-        event = wxUpdateLight()
-        wx.PostEvent(self.mapWindow, event)
-        
-        event.Skip()
-
-    def OnLightColor(self, event):
-        """!Color of the light changed"""
-        self.mapWindow.light['color'] = event.GetValue()
-        
-        event = wxUpdateLight()
-        wx.PostEvent(self.mapWindow, event)
-        
-        event.Skip()
-        
-    def OnLightValue(self, event):
-        """!Light brightness changed"""
-        data = self.mapWindow.light
-        self.OnScroll(event, self.win['light'], data)
-        
-        event = wxUpdateLight()
-        wx.PostEvent(self.mapWindow, event)
-        
-        event.Skip()
-        
-    def OnBgColor(self, event):
-        """!Background color changed"""
-        color = event.GetValue()
-        self.mapWindow.view['background']['color'] = event.GetValue()
-        color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
-        
-        self._display.SetBgColor(str(color))
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-    def OnSetSurface(self, event):
-        """!Surface selected, currently used for fringes"""
-        name = event.GetString()
-        try:
-            data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')['surface']
-        except:
-            self.EnablePage('fringe', False)
-            return
-        
-        layer = self.mapWindow.GetLayerByName(name, mapType = 'raster')
-        self.EnablePage('fringe', True)
-        
-    def OnSetRaster(self, event):
-        """!Raster map selected, update surface page"""
-        name = event.GetString()
-        try:
-            data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')['surface']
-        except:
-            self.EnablePage('surface', False)
-            return
-        
-        layer = self.mapWindow.GetLayerByName(name, mapType = 'raster')
-        self.EnablePage('surface', True)
-        self.UpdateSurfacePage(layer, data, updateName = False)
-        
-    def OnSetVector(self, event):
-        """!Vector map selected, update properties page"""
-        name = event.GetString()
-        try:
-            data = self.mapWindow.GetLayerByName(name, mapType = 'vector', dataType = 'nviz')['vector']
-        except:
-            self.EnablePage('vector', False)
-            return
-        
-        layer = self.mapWindow.GetLayerByName(name, mapType = 'vector')
-        self.EnablePage('vector', True)
-        self.UpdateVectorPage(layer, data, updateName = False)
-
-    def OnSetRaster3D(self, event):
-        """!3D Raster map selected, update surface page"""
-        name = event.GetString()
-        try:
-            data = self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')['volume']
-        except:
-            self.EnablePage('volume', False)
-            return
-        
-        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
-        self.EnablePage('volume', True)
-        self.UpdateVolumePage(layer, data, updateName = False)
-        
-    def OnViewChange(self, event):
-        """!Change view, render in quick mode"""
-        # find control
-        winName = self.__GetWindowName(self.win['view'], event.GetId())
-        if not winName:
-            return
-        
-        if winName == 'height':
-            view = self.mapWindow.iview # internal
-        else:
-            view = self.mapWindow.view
-        
-        if winName == 'z-exag' and event.GetInt() >= 0:
-            self.PostViewEvent(zExag = True)
-        else:
-            self.PostViewEvent(zExag = False)
-        
-        view[winName]['value'] = event.GetInt()
-        
-        for win in self.win['view'][winName].itervalues():
-            self.FindWindowById(win).SetValue(view[winName]['value'])
-                
-        self.mapWindow.render['quick'] = True
-        self.mapWindow.Refresh(False)
-        
-        event.Skip()
-        
-    def OnViewChanged(self, event):
-        """!View changed, render in full resolution"""
-        self.mapWindow.render['quick'] = False
-        self.mapWindow.Refresh(False)
-        
-        self.UpdateSettings()
-        
-    def OnViewChangedSpin(self, event):
-        """!View changed, render in full resolution"""
-        self.mapWindow.render['quick'] = False
-        self.OnViewChange(event)
-        self.OnViewChanged(None)
-        self.Update()
-        
-        event.Skip()
-        
-    def OnResetView(self, event):
-        """!Reset to default view (view page)"""
-        self.mapWindow.ResetView()
-        self.UpdateSettings()
-        self.mapWindow.Refresh(False)
-        
-    def OnLookAt(self, event):
-        """!Look at (view page)"""
-        sel = event.GetSelection()
-        if sel == 0: # top
-            self.mapWindow.view['position']['x'] = 0.5
-            self.mapWindow.view['position']['y'] = 0.5
-        elif sel == 1: # north
-            self.mapWindow.view['position']['x'] = 0.5
-            self.mapWindow.view['position']['y'] = 0.0
-        elif sel == 2: # south
-            self.mapWindow.view['position']['x'] = 0.5
-            self.mapWindow.view['position']['y'] = 1.0
-        elif sel == 3: # east
-            self.mapWindow.view['position']['x'] = 1.0
-            self.mapWindow.view['position']['y'] = 0.5
-        elif sel == 4: # west
-            self.mapWindow.view['position']['x'] = 0.0
-            self.mapWindow.view['position']['y'] = 0.5
-        elif sel == 5: # north-west
-            self.mapWindow.view['position']['x'] = 0.0
-            self.mapWindow.view['position']['y'] = 0.0
-        elif sel == 6: # north-east
-            self.mapWindow.view['position']['x'] = 1.0
-            self.mapWindow.view['position']['y'] = 0.0
-        elif sel == 7: # south-east
-            self.mapWindow.view['position']['x'] = 1.0
-            self.mapWindow.view['position']['y'] = 1.0
-        elif sel == 8: # south-west
-            self.mapWindow.view['position']['x'] = 0.0
-            self.mapWindow.view['position']['y'] = 1.0
-        
-        self.PostViewEvent(zExag = True)
-        
-        self.UpdateSettings()
-        self.mapWindow.render['quick'] = False
-        self.mapWindow.Refresh(False)
-
-    def OnClose(self, event):
-        """!Close button pressed
-        
-        Close dialog
-        """
-        self.Hide()
-        
-    def OnMapObjUse(self, event):
-        """!Set surface attribute -- use -- map/constant"""
-        if not self.mapWindow.init:
-            return
-        
-        wx.Yield()
-        
-        # find attribute row
-        attrb = self.__GetWindowName(self.win['surface'], event.GetId())
-        if not attrb:
-            attrb = self.__GetWindowName(self.win['volume'], event.GetId())
-            nvizType = 'volume'
-        else:
-            nvizType = 'surface'
-        
-        selection = event.GetSelection()
-        if self.win[nvizType][attrb]['required']: # no 'unset'
-            selection += 1
-        if selection == 0: # unset
-            useMap = None
-            value = ''
-        elif selection == 1: # map
-            useMap = True
-            value = self.FindWindowById(self.win[nvizType][attrb]['map']).GetValue()
-        elif selection == 2: # constant
-            useMap = False
-            if attrb == 'color':
-                value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetColour()
-                value = self._getColorString(value)
-            else:
-                value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetValue()
-        
-        self.SetMapObjUseMap(nvizType = nvizType,
-                             attrb = attrb, map = useMap)
-        
-        name = self.FindWindowById(self.win[nvizType]['map']).GetValue()
-        if nvizType == 'surface':
-            data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
-            data[nvizType]['attribute'][attrb] = { 'map' : useMap,
-                                                   'value' : str(value),
-                                                   'update' : None }
-        else: # volume / isosurface
-            data = self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')
-            list = self.FindWindowById(self.win['volume']['isosurfs'])
-            id = list.GetSelection()
-            data[nvizType]['isosurface'][id][attrb] = { 'map' : useMap,
-                                                        'value' : str(value),
-                                                        'update' : None }
-        
-        # update properties
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self.mapWindow, event)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-    def EnablePage(self, name, enabled = True):
-        """!Enable/disable all widgets on page"""
-        for key, item in self.win[name].iteritems():
-            if key == 'map' or key == 'surface':
-                continue
-            if type(item) == types.DictType:
-                for sitem in self.win[name][key].itervalues():
-                    if type(sitem) == types.IntType:
-                        self.FindWindowById(sitem).Enable(enabled)
-            else:
-                if type(item) == types.IntType:
-                    self.FindWindowById(item).Enable(enabled)
-        
-    def SetMapObjUseMap(self, nvizType, attrb, map = None):
-        """!Update dialog widgets when attribute type changed"""
-        if attrb in ('topo', 'color', 'shine'):
-            incSel = -1 # decrement selection (no 'unset')
-        else:
-            incSel = 0
-        
-        if map is True: # map
-            if attrb != 'topo': # changing map topography not allowed
-                # not sure why, but here must be disabled both ids, should be fixed!
-                self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(True)
-            if self.win[nvizType][attrb]['const']:
-                self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(False)
-            self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(1 + incSel)
-        elif map is False: # const
-            self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(False)
-            if self.win[nvizType][attrb]['const']:
-                self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(True)
-            self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(2 + incSel)
-        else: # unset
-            self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(False)
-            if self.win[nvizType][attrb]['const']:
-                self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(False)
-            self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(0)
-        
-    def OnSurfaceMap(self, event):
-        """!Set surface attribute"""
-        self.SetMapObjAttrb(nvizType = 'surface', winId = event.GetId())
-        
-    def SetMapObjAttrb(self, nvizType, winId):
-        """!Set map object (surface/isosurface) attribute (map/constant)"""
-        if not self.mapWindow.init:
-            return
-        
-        attrb = self.__GetWindowName(self.win[nvizType], winId) 
-        if not attrb:
-            return
-        
-        if nvizType == 'volume' and attrb == 'topo':
-            return
-        
-        selection = self.FindWindowById(self.win[nvizType][attrb]['use']).GetSelection()
-        if self.win[nvizType][attrb]['required']:
-            selection += 1
-        
-        if selection == 0: # unset
-            useMap = None
-            value = ''
-        elif selection == 1: # map
-            value = self.FindWindowById(self.win[nvizType][attrb]['map']).GetValue()
-            useMap = True
-        else: # constant
-            if attrb == 'color':
-                value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetColour()
-                # tuple to string
-                value = self._getColorString(value)
-            else:
-                value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetValue()
-            useMap = False
-        
-        if not self.pageChanging:
-            name = self.FindWindowById(self.win[nvizType]['map']).GetValue()
-            if nvizType == 'surface':
-                data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
-                data[nvizType]['attribute'][attrb] = { 'map' : useMap,
-                                                       'value' : str(value),
-                                                       'update' : None }
-            else:
-                data = self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')
-                list = self.FindWindowById(self.win['volume']['isosurfs'])
-                id = list.GetSelection()
-                if id > -1:
-                    data[nvizType]['isosurface'][id][attrb] = { 'map' : useMap,
-                                                                'value' : str(value),
-                                                                'update' : None }
-            
-            # update properties
-            event = wxUpdateProperties(data = data)
-            wx.PostEvent(self.mapWindow, event)
-            
-            if self.mapDisplay.statusbarWin['render'].IsChecked():
-                self.mapWindow.Refresh(False)
-        
-    def OnSurfaceResolution(self, event):
-        """!Draw resolution changed"""
-        self.SetSurfaceResolution()
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-    def SetSurfaceResolution(self):
-        """!Set draw resolution"""
-        coarse = self.FindWindowById(self.win['surface']['draw']['res-coarse']).GetValue()
-        fine = self.FindWindowById(self.win['surface']['draw']['res-fine']).GetValue()
-        
-        data = self.GetLayerData('surface')
-        data['surface']['draw']['resolution'] = { 'coarse' : coarse,
-                                                  'fine' : fine,
-                                                  'update' : None }
-        
-        # update properties
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self.mapWindow, event)
-        
-    def SetSurfaceMode(self):
-        """!Set draw mode"""
-        mode = self.FindWindowById(self.win['surface']['draw']['mode']).GetSelection()
-        if mode == 0: # coarse
-            self.FindWindowById(self.win['surface']['draw']['res-coarse']).Enable(True)
-            self.FindWindowById(self.win['surface']['draw']['res-fine']).Enable(False)
-        elif mode == 1: # fine
-            self.FindWindowById(self.win['surface']['draw']['res-coarse']).Enable(False)
-            self.FindWindowById(self.win['surface']['draw']['res-fine']).Enable(True)
-        else: # both
-            self.FindWindowById(self.win['surface']['draw']['res-coarse']).Enable(True)
-            self.FindWindowById(self.win['surface']['draw']['res-fine']).Enable(True)
-        
-        style = self.FindWindowById(self.win['surface']['draw']['style']).GetSelection()
-        
-        shade = self.FindWindowById(self.win['surface']['draw']['shading']).GetSelection()
-        
-        value, desc = self.mapWindow.nvizDefault.GetDrawMode(mode, style, shade)
-        
-        return value, desc
-
-    def OnSurfaceMode(self, event):
-        """!Set draw mode"""
-        value, desc = self.SetSurfaceMode()
-        
-        data = self.GetLayerData('surface')
-        data['surface']['draw']['mode'] = { 'value' : value,
-                                            'desc' : desc,
-                                            'update' : None }
-        
-        # update properties
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self.mapWindow, event)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-
-    def OnSurfaceModeAll(self, event):
-        """!Set draw mode (including wire color) for all loaded surfaces"""
-        value, desc = self.SetSurfaceMode()
-        coarse = self.FindWindowById(self.win['surface']['draw']['res-coarse']).GetValue()
-        fine = self.FindWindowById(self.win['surface']['draw']['res-fine']).GetValue()
-        color = self.FindWindowById(self.win['surface']['draw']['wire-color']).GetColour()
-        cvalue = self._getColorString(color)
-        
-        for name in self.mapWindow.GetLayerNames(type = 'raster'):
-            
-            data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
-            if not data:
-                continue # shouldy no happen
-            
-            data['surface']['draw']['all'] = True
-            data['surface']['draw']['mode'] = { 'value' : value,
-                                                'desc' : desc,
-                                                'update' : None }
-            data['surface']['draw']['resolution'] = { 'coarse' : coarse,
-                                                      'fine' : fine,
-                                                      'update' : None }
-            data['surface']['draw']['wire-color'] = { 'value' : cvalue,
-                                                      'update' : None }
-            
-            # update properties
-            event = wxUpdateProperties(data = data)
-            wx.PostEvent(self.mapWindow, event)
-            
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-    def _getColorString(self, color):
-        """!Set wire color"""
-        return str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
-    
-    def OnSurfaceWireColor(self, event):
-        """!Set wire color"""
-        data = self.GetLayerData('surface')
-        value = self._getColorString(event.GetValue())
-        data['surface']['draw']['wire-color'] = { 'value' : value,
-                                                  'update' : None }
-        
-        # update properties
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self.mapWindow, event)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-    def OnSurfaceAxis(self, event):
-        """!Surface position, axis changed"""
-        data = self.GetLayerData('surface')
-        id = data['surface']['object']['id']
-        
-        axis = self.FindWindowById(self.win['surface']['position']['axis']).GetSelection()
-        slider = self.FindWindowById(self.win['surface']['position']['slider'])
-        spin = self.FindWindowById(self.win['surface']['position']['spin'])
-        
-        x, y, z = self._display.GetSurfacePosition(id)
-        
-        if axis == 0: # x
-            slider.SetValue(x)
-            spin.SetValue(x)
-        elif axis == 1: # y
-            slider.SetValue(y)
-            spin.SetValue(y)
-        else: # z
-            slider.SetValue(z)
-            spin.SetValue(z)
-        
-    def OnSurfacePosition(self, event):
-        """!Surface position"""
-        winName = self.__GetWindowName(self.win['surface'], event.GetId())
-        if not winName:
-            return
-        axis = self.FindWindowById(self.win['surface']['position']['axis']).GetSelection()
-        value = event.GetInt()
-        
-        for win in self.win['surface']['position'].itervalues():
-            if win == self.win['surface']['position']['axis']:
-                continue
-            else:
-                self.FindWindowById(win).SetValue(value)
-        
-        data = self.GetLayerData('surface')
-        id = data['surface']['object']['id']
-        x, y, z = self._display.GetSurfacePosition(id)
-        
-        if axis == 0: # x
-            x = value
-        elif axis == 1: # y
-            y = value
-        else: # z
-            z = value
-        
-        data = self.GetLayerData('surface')
-        data['surface']['position']['x'] = x
-        data['surface']['position']['y'] = y
-        data['surface']['position']['z'] = z
-        data['surface']['position']['update'] = None
-        # update properties
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self.mapWindow, event)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        #        self.UpdatePage('surface')
-
-    def UpdateVectorShow(self, vecType, enabled):
-        """!Enable/disable lines/points widgets
-        
-        @param vecType vector type (lines, points)
-        """
-        if vecType != 'lines' and vecType != 'points':
-            return False
-        
-        for win in self.win['vector'][vecType].keys():
-            if win == 'show':
-                continue
-            if type(self.win['vector'][vecType][win]) == type({}):
-                for swin in self.win['vector'][vecType][win].keys():
-                    if enabled:
-                        self.FindWindowById(self.win['vector'][vecType][win][swin]).Enable(True)
-                    else:
-                        self.FindWindowById(self.win['vector'][vecType][win][swin]).Enable(False)
-            else:
-                if enabled:
-                    self.FindWindowById(self.win['vector'][vecType][win]).Enable(True)
-                else:
-                    self.FindWindowById(self.win['vector'][vecType][win]).Enable(False)
-        
-        return True
-    
-    def OnVectorShow(self, event):
-        """!Show vector lines/points"""
-        winId = event.GetId()
-        if winId == self.win['vector']['lines']['show']:
-            vecType = 'lines'
-            points = False
-        else: # points
-            vecType = 'points' 
-            points = True
-       
-        checked = event.IsChecked()
-        name = self.FindWindowById(self.win['vector']['map']).GetValue()
-        item = self.mapWindow.GetLayerByName(name, mapType = 'vector', dataType = 'item')
-        data = self.GetLayerData('vector')['vector']
-        
-        if checked:
-            self.mapWindow.LoadVector(item, points = points)
-        else:
-            self.mapWindow.UnloadVector(item, points = points)
-        
-        self.UpdateVectorShow(vecType, checked)
-        
-        if checked:
-            try:
-                id = data[vecType]['object']['id']
-            except KeyError:
-                id = -1
-            
-            if id > 0:
-                self.mapWindow.SetMapObjProperties(item, id, vecType)
-                
-                # update properties
-                event = wxUpdateProperties(data = data)
-                wx.PostEvent(self.mapWindow, event)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-        event.Skip()
-    
-    def OnVectorDisplay(self, event):
-        """!Display vector lines on surface/flat"""
-        rasters = self.mapWindow.GetLayerNames('raster')
-        if event.GetSelection() == 0: # surface
-            if len(rasters) < 1:
-                self.FindWindowById(self.win['vector']['lines']['surface']).Enable(False)
-                self.FindWindowById(self.win['vector']['lines']['flat']).SetSelection(1)
-                return
-            
-            self.FindWindowById(self.win['vector']['lines']['surface']).Enable(True)
-            # set first found surface
-            data = self.GetLayerData('vector')
-            data['vector']['lines']['mode']['surface'] = rasters[0]
-            self.FindWindowById(self.win['vector']['lines']['surface']).SetStringSelection( \
-                rasters[0])
-        else: # flat
-            self.FindWindowById(self.win['vector']['lines']['surface']).Enable(False)
-        
-        self.OnVectorLines(event)
-        
-        event.Skip()
-
-    def OnVectorLines(self, event):
-        """!Set vector lines mode, apply changes if auto-rendering is enabled"""
-        data = self.GetLayerData('vector')
-        width = self.FindWindowById(self.win['vector']['lines']['width']).GetValue()
-        
-        mode = {}
-        if self.FindWindowById(self.win['vector']['lines']['flat']).GetSelection() == 0:
-            mode['type'] = 'surface'
-            mode['surface'] = self.FindWindowById(self.win['vector']['lines']['surface']).GetValue()
-            mode['update'] = None
-        else:
-            mode['type'] = 'flat'
-        
-        for attrb in ('width', 'mode'):
-            data['vector']['lines'][attrb]['update'] = None
-        data['vector']['lines']['width']['value'] = width
-        data['vector']['lines']['mode']['value'] = mode
-        
-        color = self.FindWindowById(self.win['vector']['lines']['color']).GetColour()
-        
-        if isinstance(color, csel.ColourSelect):
-            pass #color picker not yet instantiated
-        else:
-            color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
-            data['vector']['lines']['color']['update'] = None
-            data['vector']['lines']['color']['value'] = color
-        
-        # update properties
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self.mapWindow, event)
-                        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-    def OnVectorHeight(self, event):
-        value = event.GetInt()
-        id = event.GetId()
-        if id == self.win['vector']['lines']['height']['spin'] or \
-                id == self.win['vector']['lines']['height']['slider']:
-            vtype = 'lines'
-        else:
-            vtype = 'points'
-        
-        if type(event) == type(wx.ScrollEvent()):
-            # slider
-            win = self.FindWindowById(self.win['vector'][vtype]['height']['spin'])
-        else:
-            # spin
-            win = self.FindWindowById(self.win['vector'][vtype]['height']['slider'])
-        win.SetValue(value)
-
-        data = self.GetLayerData('vector')['vector'][vtype]
-        data['height'] = { 'value' : value,
-                           'update' : None }
-        
-        # update properties
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self.mapWindow, event)
-        
-        self.mapWindow.render['quick'] = True
-        self.mapWindow.render['v' + vtype] = True
-        self.mapWindow.Refresh(False)
-        
-        event.Skip()
-    
-    def OnVectorHeightFull(self, event):
-        """!Vector height changed, render in full resolution"""
-        self.OnVectorHeight(event)
-        self.OnVectorSurface(event)
-        id = event.GetId()
-        if id == self.win['vector']['lines']['height']['spin'] or \
-                id == self.win['vector']['lines']['height']['slider']:
-            vtype = 'lines'
-        else:
-            vtype = 'points'
-        
-        self.mapWindow.render['quick'] = False
-        self.mapWindow.render['v' + vtype] = False
-        self.mapWindow.Refresh(False)
-
-    def OnVectorHeightSpin(self, event):
-        """!Vector height changed, render in full resolution"""
-        # TODO: use step value instead
-        
-        #        self.OnVectorHeight(event)
-        self.OnVectorHeightFull(event)
-        
-    def OnVectorSurface(self, event):
-        """!Reference surface for vector map (lines/points)"""
-        id = event.GetId()
-        if id == self.win['vector']['lines']['surface']:
-            vtype = 'lines'
-        else:
-            vtype = 'points'
-        data = self.GetLayerData('vector')
-        data['vector'][vtype]['mode']['surface'] = { 'value' : event.GetString(),
-                                                     'update' : None }
-        
-        # update properties
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self.mapWindow, event)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-    def OnVectorPoints(self, event):
-        """!Set vector points mode, apply changes if auto-rendering is enabled"""
-        data = self.GetLayerData('vector')
-        
-        size  = self.FindWindowById(self.win['vector']['points']['size']).GetValue()
-        marker = self.FindWindowById(self.win['vector']['points']['marker']).GetSelection()
-        #        width = self.FindWindowById(self.win['vector']['points']['width']).GetValue()
-        
-        for attrb in ('size', 'marker'):
-            data['vector']['points'][attrb]['update'] = None
-        data['vector']['points']['size']['value'] = size
-        #        data['vector']['points']['width']['value'] = width
-        data['vector']['points']['marker']['value'] = marker
-        
-        color = self.FindWindowById(self.win['vector']['points']['color']).GetColour()
-        if isinstance(color, csel.ColourSelect):
-            pass #color picker not yet instantiated
-        else:
-            color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
-            data['vector']['points']['color']['update'] = None
-            data['vector']['points']['color']['value'] = color
-        
-        # update properties
-        event = wxUpdateProperties(data = data)
-        wx.PostEvent(self.mapWindow, event)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-
-    def UpdateIsosurfButtons(self, list):
-        """!Enable/disable buttons 'add', 'delete',
-        'move up', 'move down'"""
-        nitems = list.GetCount()
-        add = self.parent.FindWindowById(self.win['volume']['btnIsosurfAdd'])
-        delete = self.parent.FindWindowById(self.win['volume']['btnIsosurfDelete'])
-        moveDown = self.parent.FindWindowById(self.win['volume']['btnIsosurfMoveDown'])
-        moveUp = self.parent.FindWindowById(self.win['volume']['btnIsosurfMoveUp'])
-        if nitems >= wxnviz.MAX_ISOSURFS:
-            # disable add button on max
-            add.Enable(False)
-        else:
-            add.Enable(True)
-        
-        if nitems < 1:
-            # disable 'delete' if only one item in the lis
-            delete.Enable(False)
-        else:
-            delete.Enable(True)
-        
-        if list.GetSelection() >= nitems - 1:
-            # disable 'move-down' if last
-            moveDown.Enable(False)
-        else:
-            moveDown.Enable(True)
-        
-        if list.GetSelection() < 1:
-            # disable 'move-up' if first
-            moveUp.Enable(False)
-        else:
-            moveUp.Enable(True)
-        
-    def OnVolumeIsosurfMode(self, event):
-        """!Set isosurface draw mode"""
-        self.SetIsosurfaceMode(event.GetSelection())
-    
-    def SetIsosurfaceMode(self, selection):
-        """!Set isosurface draw mode"""
-        data = self.GetLayerData('volume')['volume']
-        id = data['object']['id']
-        
-        mode = 0
-        if selection == 0:
-            mode |= wxnviz.DM_FLAT
-        else:
-            mode |= wxnviz.DM_GOURAUD
-        
-        self._display.SetIsosurfaceMode(id, mode)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-    def OnVolumeIsosurfResolution(self, event):
-        """!Set isosurface draw resolution"""
-        self.SetIsosurfaceResolution(event.GetInt())
-        
-    def SetIsosurfaceResolution(self, res):
-        """!Set isosurface draw resolution"""
-        data = self.GetLayerData('volume')['volume']
-        
-        id = data['object']['id']
-        self._display.SetIsosurfaceRes(id, res)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-    def OnVolumeIsosurfMap(self, event):
-        """!Set surface attribute"""
-        self.SetMapObjAttrb(nvizType = 'volume', winId = event.GetId())
-        
-    def OnVolumeIsosurfCheck(self, event):
-        """!Isosurface checked (->load) or unchecked (->unload)"""
-        index = event.GetSelection()
-        list = self.FindWindowById(self.win['volume']['isosurfs'])
-        
-        data = self.GetLayerData('volume')['volume']
-        id = data['object']['id']
-        
-        isosurfId = event.GetSelection()
-        
-        if list.IsChecked(index):
-            self._display.SetIsosurfaceTransp(id, isosurfId, False, "0")
-        else:
-            # disable -> make transparent
-            self._display.SetIsosurfaceTransp(id, isosurfId, False, "255")
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-    def OnVolumeIsosurfSelect(self, event):
-        """!Isosurface item selected"""
-        winUp = self.FindWindowById(self.win['volume']['btnIsosurfMoveUp'])
-        winDown = self.FindWindowById(self.win['volume']['btnIsosurfMoveDown'])
-        selection = event.GetSelection()
-        if selection == 0:
-            winUp.Enable(False)
-            if not winDown.IsEnabled():
-                winDown.Enable()
-        elif selection == self.FindWindowById(event.GetId()).GetCount() - 1:
-            winDown.Enable(False)
-            if not winUp.IsEnabled():
-                winUp.Enable()
-        else:
-            if not winDown.IsEnabled():
-                winDown.Enable()
-            if not winUp.IsEnabled():
-                winUp.Enable()
-        
-        # update dialog
-        name = self.FindWindowById(self.win['volume']['map']).GetValue()
-        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
-        data = self.GetLayerData('volume')['volume']['isosurface'][selection]
-        
-        self.UpdateVolumeIsosurfPage(layer, data)
-        
-    def OnVolumeIsosurfAdd(self, event):
-        """!Add new isosurface to the list"""
-        list = self.FindWindowById(self.win['volume']['isosurfs'])
-        level = self.FindWindowById(self.win['volume']['topo']['const']).GetValue()
-        
-        sel = list.GetSelection()
-        if sel < 0 or sel >= list.GetCount() - 1:
-            item = list.Append(item = "%s %s" % (_("Level"), str(level)))
-        else:
-            list.Insert(item = "%s %s" % (_("Level"), str(level)),
-                        pos = sel+1) # append
-            item = sel + 1
-        
-        list.Check(item)
-        list.SetSelection(item)
-        
-        name = self.FindWindowById(self.win['volume']['map']).GetValue()
-        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
-        data = self.GetLayerData('volume')['volume']
-        id = data['object']['id']
-        
-        # collect properties
-        isosurfData = {}
-        for attrb in ('topo', 'color', 'mask',
-                      'transp', 'shine', 'emit'):
-            if attrb == 'topo':
-                isosurfData[attrb] = {}
-                win = self.FindWindowById(self.win['volume'][attrb]['const'])
-                isosurfData[attrb]['value'] = win.GetValue()
-            else:
-                uwin = self.FindWindowById(self.win['volume'][attrb]['use'])
-                sel = uwin.GetSelection()
-                if self.win['volume'][attrb]['required']:
-                    sel += 1
-                if sel == 0: # unset
-                    continue
-                
-                isosurfData[attrb] = {}
-                if sel == 1: # map
-                    isosurfData[attrb]['map'] = True
-                    vwin = self.FindWindowById(self.win['volume'][attrb]['map'])
-                    value = vwin.GetValue()
-                else: # const
-                    isosurfData[attrb]['map'] = False
-                    vwin = self.FindWindowById(self.win['volume'][attrb]['const'])
-                    if vwin.GetName() == "color":
-                        value = self._getColorString(vwin.GetValue())
-                    else:
-                        value = vwin.GetValue()
-                isosurfData[attrb]['value'] = value
-        
-        data['isosurface'].insert(item, isosurfData)
-        
-        # add isosurface        
-        self._display.AddIsosurface(id, level)
-        # use by default 3d raster map for color
-        self._display.SetIsosurfaceColor(id, item, True, str(layer.name))
-        
-        # update buttons
-        self.UpdateIsosurfButtons(list)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-        event.Skip()
-        
-    def OnVolumeIsosurfDelete(self, event):
-        """!Remove isosurface from list"""
-        list = self.FindWindowById(self.win['volume']['isosurfs'])
-        
-        # remove item from list
-        isosurfId = list.GetSelection()
-        list.Delete(isosurfId)
-        # select last item
-        if list.GetCount() > 0:
-            list.SetSelection(list.GetCount()-1)
-        
-        name = self.FindWindowById(self.win['volume']['map']).GetValue()
-        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
-        data = self.GetLayerData('volume')['volume']
-
-        id = data['object']['id']
-        
-        # delete isosurface
-        del data['isosurface'][isosurfId]
-        
-        self._display.DeleteIsosurface(id, isosurfId)
-        
-        # update buttons
-        self.UpdateIsosurfButtons(list)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-        event.Skip()
-        
-    def OnVolumeIsosurfMoveUp(self, event):
-        """!Move isosurface up in the list"""
-        list = self.FindWindowById(self.win['volume']['isosurfs'])
-        sel = list.GetSelection()
-        
-        if sel < 1:
-            return # this should not happen
-        
-        name = self.FindWindowById(self.win['volume']['map']).GetValue()
-        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
-        data = self.GetLayerData('volume')['volume']
-        
-        id = data['object']['id']
-        
-        # move item up
-        text = list.GetStringSelection()
-        list.Insert(item = text, pos = sel-1)
-        list.Check(sel-1)
-        list.SetSelection(sel-1)
-        list.Delete(sel+1)
-        data['isosurface'].insert(sel-1, data['isosurface'][sel])
-        del data['isosurface'][sel+1]
-        self._display.MoveIsosurface(id, sel, True)
-        
-        # update buttons
-        self.UpdateIsosurfButtons(list)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-        event.Skip()
-        
-    def OnVolumeIsosurfMoveDown(self, event):
-        """!Move isosurface dowm in the list"""
-        list = self.FindWindowById(self.win['volume']['isosurfs'])
-        sel = list.GetSelection()
-        
-        if sel >= list.GetCount() - 1:
-            return # this should not happen
-        
-        name = self.FindWindowById(self.win['volume']['map']).GetValue()
-        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
-        data = self.GetLayerData('volume')['volume']
-        
-        id = data['object']['id']
-        
-        # move item up
-        text = list.GetStringSelection()
-        list.Insert(item = text, pos = sel+2)
-        list.Check(sel+2)
-        list.SetSelection(sel+2)
-        list.Delete(sel)
-        data['isosurface'].insert(sel+2, data['isosurface'][sel])
-        del data['isosurface'][sel]
-        self._display.MoveIsosurface(id, sel, False)
-        
-        # update buttons
-        self.UpdateIsosurfButtons(list)
-        
-        if self.mapDisplay.statusbarWin['render'].IsChecked():
-            self.mapWindow.Refresh(False)
-        
-        event.Skip()
-        
-    def UpdatePage(self, pageId):
-        """!Update dialog (selected page)"""
-        self.pageChanging = True
-        Debug.msg(1, "NvizToolWindow.UpdatePage(): %s", pageId)
-        
-        if pageId == 'view':
-            self.SetPage('view')
-            hmin = self.mapWindow.iview['height']['min']
-            hmax = self.mapWindow.iview['height']['max']
-            hval = self.mapWindow.iview['height']['value']
-            zmin = self.mapWindow.view['z-exag']['min']
-            zmax = self.mapWindow.view['z-exag']['max']
-            zval = self.mapWindow.view['z-exag']['value']
-            
-            for control in ('spin', 'slider'):
-                self.FindWindowById(self.win['view']['height'][control]).SetRange(hmin,
-                                                                                  hmax)
-                self.FindWindowById(self.win['view']['height'][control]).SetValue(hval)                                      
-                self.FindWindowById(self.win['view']['z-exag'][control]).SetRange(zmin,
-                                                                                  zmax)
-                self.FindWindowById(self.win['view']['z-exag'][control]).SetValue(zval)                                      
-        
-            self.FindWindowById(self.win['view']['bgcolor']).SetColour(\
-                            self.mapWindow.view['background']['color'])
-            
-        elif pageId in ('surface', 'vector', 'volume'):
-            name = self.FindWindowById(self.win[pageId]['map']).GetValue()
-            data = self.GetLayerData(pageId)
-            if data:
-                if pageId == 'surface':
-                    layer = self.mapWindow.GetLayerByName(name, mapType = 'raster')
-                    self.UpdateSurfacePage(layer, data['surface'])
-                elif pageId == 'vector':
-                    layer = self.mapWindow.GetLayerByName(name, mapType = 'vector')
-                    self.UpdateVectorPage(layer, data['vector'])
-                elif pageId == 'volume':
-                    layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
-                    self.UpdateVectorPage(layer, data['vector'])
-        elif pageId == 'light':
-            zval = self.mapWindow.light['position']['z']
-            bval = self.mapWindow.light['bright']
-            aval = self.mapWindow.light['ambient']
-            for control in ('spin', 'slider'):
-                self.FindWindowById(self.win['light']['z'][control]).SetValue(zval)
-                self.FindWindowById(self.win['light']['bright'][control]).SetValue(bval)
-                self.FindWindowById(self.win['light']['ambient'][control]).SetValue(aval)
-            self.FindWindowById(self.win['light']['color']).SetColour(self.mapWindow.light['color'])
-        elif pageId == 'fringe':
-            win = self.FindWindowById(self.win['fringe']['map'])
-            win.SetValue(self.FindWindowById(self.win['surface']['map']).GetValue())
-        
-        self.Update()
-        self.pageChanging = False
-        
-    def UpdateSurfacePage(self, layer, data, updateName = True):
-        """!Update surface page"""
-        ret = gcmd.RunCommand('r.info',
-                              read = True,
-                              flags = 'm',
-                              map = layer.name)
-        if ret:
-            desc = ret.split('=')[1].rstrip('\n')
-        else:
-            desc = None
-        if updateName:
-            self.FindWindowById(self.win['surface']['map']).SetValue(layer.name)
-        self.FindWindowById(self.win['surface']['desc']).SetLabel(desc)
-        
-        # attributes
-        for attr in ('topo', 'color'): # required
-            if layer and layer.type == 'raster':
-                self.FindWindowById(self.win['surface'][attr]['map']).SetValue(layer.name)
-            else:
-                self.FindWindowById(self.win['surface'][attr]['map']).SetValue('')
-            self.SetMapObjUseMap(nvizType = 'surface',
-                                 attrb = attr, map = True) # -> map
-        
-        if 'color' in data['attribute']:
-            value = data['attribute']['color']['value']
-            if data['attribute']['color']['map']:
-                self.FindWindowById(self.win['surface']['color']['map']).SetValue(value)
-            else: # constant
-                color = map(int, value.split(':'))
-                self.FindWindowById(self.win['surface']['color']['const']).SetColour(color)
-            self.SetMapObjUseMap(nvizType = 'surface',
-                                 attrb = attr, map = data['attribute']['color']['map'])
-        
-        self.SetMapObjUseMap(nvizType = 'surface',
-                             attrb = 'shine', map = data['attribute']['shine']['map'])
-        value = data['attribute']['shine']['value']
-        if data['attribute']['shine']['map']:
-            self.FindWindowById(self.win['surface']['shine']['map']).SetValue(value)
-        else:
-            self.FindWindowById(self.win['surface']['shine']['const']).SetValue(value)
-        
-        #
-        # draw
-        #
-        for control, data in data['draw'].iteritems():
-            if control == 'all': # skip 'all' property
-                continue
-            if control == 'resolution':
-                self.FindWindowById(self.win['surface']['draw']['res-coarse']).SetValue(data['coarse'])
-                self.FindWindowById(self.win['surface']['draw']['res-fine']).SetValue(data['fine'])
-                continue
-            
-            if control == 'mode':
-                if data['desc']['mode'] == 'coarse':
-                    self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(0)
-                elif data['desc']['mode'] == 'fine':
-                    self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(1)
-                else: # both
-                    self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(2)
-                
-                if data['desc']['style'] == 'wire':
-                    self.FindWindowById(self.win['surface']['draw']['style']).SetSelection(0)
-                else: # surface
-                    self.FindWindowById(self.win['surface']['draw']['style']).SetSelection(1)
-                
-                if data['desc']['shading'] == 'flat':
-                    self.FindWindowById(self.win['surface']['draw']['shading']).SetSelection(0)
-                else: # gouraud
-                    self.FindWindowById(self.win['surface']['draw']['shading']).SetSelection(1)
-                
-                continue
-            
-            value = data['value']
-            win = self.FindWindowById(self.win['surface']['draw'][control])
-            
-            name = win.GetName()
-            
-            if name == "selection":
-                win.SetSelection(value)
-            elif name == "colour":
-                color = map(int, value.split(':'))
-                win.SetColour(color)
-            else:
-                win.SetValue(value)
-        # enable/disable res widget + set draw mode
-        self.OnSurfaceMode(event = None)
-
-    def VectorInfo(self, layer):
-        """!Get number of points/lines
-        
-        @param layer MapLayer instance
-        
-        @return num of points/features (expect of points)
-        @return None
-        """
-        vInfo = grass.vector_info_topo(layer.GetName())
-        
-        if not vInfo:
-            return None
-        
-        nprimitives = 0
-        for key, value in vInfo.iteritems():
-            if key in ('points',
-                       'lines',
-                       'boundaries',
-                       'centroids',
-                       'faces',
-                       'kernels'):
-                nprimitives += value
-        
-        return (vInfo['points'], vInfo['lines'], nprimitives, vInfo['map3d'])
-        
-    def UpdateVectorPage(self, layer, data, updateName = True):
-        """!Update vector page"""
-        npoints, nlines, nfeatures, mapIs3D = self.VectorInfo(layer)
-        if mapIs3D:
-            desc = _("Vector map is 3D")
-            enable = False
-        else:
-            desc = _("Vector map is 2D")
-            enable = True
-        desc += " - " + _("%(features)d features (%(points)d points)") % \
-            { 'features' : nfeatures, 'points' : npoints }
-        
-        if updateName:
-            self.FindWindowById(self.win['vector']['map']).SetValue(layer.name)
-        self.FindWindowById(self.win['vector']['desc']).SetLabel(desc)
-        
-        self.FindWindowById(self.win['vector']['lines']['flat']).Enable(enable)
-        for v in ('lines', 'points'):
-            self.FindWindowById(self.win['vector'][v]['surface']).Enable(enable)
-            self.FindWindowById(self.win['vector'][v]['height']['slider']).Enable(enable)
-            self.FindWindowById(self.win['vector'][v]['height']['spin']).Enable(enable)
-            
-        #
-        # lines
-        #
-        showLines = self.FindWindowById(self.win['vector']['lines']['show'])
-        if 'object' in data['lines']:
-            showLines.SetValue(True)
-        else:
-            showLines.SetValue(False)
-            if nlines > 0:
-                showLines.Enable(True)
-            else:
-                showLines.Enable(False)
-        
-        self.UpdateVectorShow('lines',
-                              showLines.IsChecked())
-        
-        width = self.FindWindowById(self.win['vector']['lines']['width'])
-        width.SetValue(data['lines']['width']['value'])
-        
-        color = self.FindWindowById(self.win['vector']['lines']['color'])
-        color.SetValue(map(int, data['lines']['color']['value'].split(':')))
-        
-        for vtype in ('lines', 'points'):
-            if vtype == 'lines':
-                display = self.FindWindowById(self.win['vector']['lines']['flat'])
-                if data[vtype]['mode']['type'] == 'flat':
-                    display.SetSelection(1)
-                else:
-                    display.SetSelection(0)
-            
-            if data[vtype]['mode']['type'] == 'surface':
-                rasters = self.mapWindow.GetLayerNames('raster')
-                surface = self.FindWindowById(self.win['vector'][vtype]['surface'])
-                surface.SetItems(rasters)
-                if len(rasters) > 0:
-                    try:
-                        surface.SetStringSelection(data[vtype]['mode']['surface'])
-                    except:
-                        pass
-        
-        for type in ('slider', 'spin'):
-            win = self.FindWindowById(self.win['vector']['lines']['height'][type])
-            win.SetValue(data['lines']['height']['value'])
-        
-        #
-        # points
-        #
-        showPoints = self.FindWindowById(self.win['vector']['points']['show'])
-        
-        if 'object' in data['points']:
-            showPoints.SetValue(True)
-        else:
-            showPoints.SetValue(False)
-            if npoints > 0:
-                showPoints.Enable(True)
-            else:
-                showPoints.Enable(False)
-        
-        self.UpdateVectorShow('points',
-                              showPoints.IsChecked())
-        # size, width, marker, color
-        for prop in ('size', 'marker', 'color'):
-            win = self.FindWindowById(self.win['vector']['points'][prop])
-            name = win.GetName()
-            if name == 'selection':
-                win.SetSelection(data['points'][prop]['value'])
-            elif name == 'color':
-                color = map(int, data['points'][prop]['value'].split(':'))
-                win.SetValue(color)
-            else:
-                win.SetValue(data['points'][prop]['value'])
-        # height
-        for type in ('slider', 'spin'):
-            win = self.FindWindowById(self.win['vector']['points']['height'][type])
-            win.SetValue(data['points']['height']['value'])
-        
-    def UpdateVolumePage(self, layer, data, updateName = True):
-        """!Update volume page"""
-        if updateName:
-            self.FindWindowById(self.win['volume']['map']).SetValue(layer.name)
-        list = self.FindWindowById(self.win['volume']['isosurfs'])
-        
-        # draw
-        for control, idata in data['draw'].iteritems():
-            if control == 'all': # skip 'all' property
-                continue
-            
-            win = self.FindWindowById(self.win['volume']['draw'][control])
-            
-            if control == 'shading':
-                if data['draw']['shading']['desc'] == 'flat':
-                    value = 0
-                else:
-                    value = 1
-            else:
-                value = idata['value']
-            
-            if win.GetName() == "selection":
-                win.SetSelection(value)
-            else:
-                win.SetValue(value)
-        
-        self.SetIsosurfaceMode(data['draw']['shading']['value'])
-        self.SetIsosurfaceResolution(data['draw']['resolution']['value'])
-        
-        self.UpdateVolumeIsosurfPage(layer, data['attribute'])
-        
-    def UpdateVolumeIsosurfPage(self, layer, data):
-        """!Update dialog -- isosurface attributes"""
-        #
-        # isosurface attributes
-        #
-        for attrb in ('topo', 'color', 'mask',
-                     'transp', 'shine', 'emit'):
-            # check required first
-            if attrb == 'topo':
-                self.FindWindowById(self.win['volume'][attrb]['const']).SetValue(0)
-                continue
-            if attrb == 'color':
-                if layer and layer.type == '3d-raster':
-                    self.FindWindowById(self.win['volume'][attrb]['map']).SetValue(layer.name)
-                else:
-                    self.FindWindowById(self.win['volume'][attrb]['map']).SetValue('')
-                self.SetMapObjUseMap(nvizType = 'volume',
-                                     attrb = attrb, map = True) # -> map
-                continue
-            
-            # skip empty attributes
-            if attrb not in data:
-                continue
-            
-            value = data[attrb]['value']
-            if attrb == 'color':
-                if data[attrb]['map']:
-                    self.FindWindowById(self.win['volume'][attrb]['map']).SetValue(value)
-                else: # constant
-                    color = map(int, value.split(':'))
-                    self.FindWindowById(self.win['volume'][attrb]['const']).SetColour(color)
-            else:
-                if data[attrb]['map']:
-                    win = self.FindWindowById(self.win['volume'][attrb]['map'])
-                else:
-                    win = self.FindWindowById(self.win['volume'][attrb]['const'])
-                win.SetValue(value)
-            
-            self.SetMapObjUseMap(nvizType = 'volume',
-                                 attrb = attrb, map = data[attrb]['map'])
-        
-    def SetPage(self, name):
-        """!Get named page"""
-        if name == 'view':
-            self.SetSelection(0)
-        elif name in ('surface', 'vector', 'volume'):
-            self.SetSelection(1)
-        else:
-            self.SetSelection(2)
-        win = self.FindWindowById(self.page[name]['notebook'])
-        
-        win.SetSelection(self.page[name]['id'])
-
-class PositionWindow(wx.Window):
-    """!Abstract position control window, see subclasses
-    ViewPostionWindow and LightPositionWindow"""
-    def __init__(self, parent, mapwindow, id = wx.ID_ANY,
-                 **kwargs):
-        self.mapWindow = mapwindow
-        self.quick = True
-        
-        wx.Window.__init__(self, parent, id, **kwargs)
-        
-        self.SetBackgroundColour("WHITE")
-        
-        self.pdc = wx.PseudoDC()
-        
-        self.pdc.SetBrush(wx.Brush(colour = 'dark green', style = wx.SOLID))
-        self.pdc.SetPen(wx.Pen(colour = 'dark green', width = 2, style = wx.SOLID))
-
-        self.Bind(wx.EVT_ERASE_BACKGROUND, lambda x: None)
-        self.Bind(wx.EVT_PAINT, self.OnPaint)
-        # self.Bind(wx.EVT_MOTION,       self.OnMouse)
-        self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
-        
-    def Draw(self, pos, scale = False):
-        w, h = self.GetClientSize()
-        x, y = pos
-        if scale:
-            x = x * w
-            y = y * h
-        self.pdc.Clear()
-        self.pdc.BeginDrawing()
-        self.pdc.DrawLine(w / 2, h / 2, x, y)
-        self.pdc.DrawCircle(x, y, 5)
-        self.pdc.EndDrawing()
-        
-    def OnPaint(self, event):
-        dc = wx.BufferedPaintDC(self)
-        dc.SetBackground(wx.Brush("White"))
-        dc.Clear()
-        
-        self.PrepareDC(dc)
-        self.pdc.DrawToDC(dc)
-        
-    def UpdatePos(self, xcoord, ycoord):
-        """!Update position coordinates (origin: UL)"""
-        if xcoord < 0.0:
-            xcoord = 0.0
-        elif xcoord > 1.0:
-            xcoord = 1.0
-        if ycoord < 0.0:
-            ycoord = 0.0
-        elif ycoord > 1.0:
-            ycoord = 1.0
-
-        self.data['position']['x'] = xcoord        
-        self.data['position']['y'] = ycoord
-        
-        return xcoord, ycoord
-    
-    def OnMouse(self, event):
-        if event.LeftIsDown():
-            x, y = event.GetPosition()
-            self.Draw(pos = (x, y))
-            w, h = self.GetClientSize()
-            x = float(x) / w
-            y = float(y) / h
-            self.UpdatePos(x, y)
-            self.Refresh(False)
-        
-        event.Skip()
-        
-    def PostDraw(self):
-        x, y = self.UpdatePos(self.data['position']['x'],
-                              self.data['position']['y'])
-        self.Draw(pos = (x, y), scale = True)
-
-class ViewPositionWindow(PositionWindow):
-    """!View position control widget"""
-    def __init__(self, parent, mapwindow, id = wx.ID_ANY,
-                 **kwargs):
-        PositionWindow.__init__(self, parent, mapwindow, id, **kwargs)
-
-        self.data = self.mapWindow.view
-        self.PostDraw()
-        
-    def UpdatePos(self, xcoord, ycoord):
-        x, y = PositionWindow.UpdatePos(self, xcoord, ycoord)
-        
-        event = wxUpdateView(zExag = True)
-        wx.PostEvent(self.mapWindow, event)
-
-        return x, y
-
-    def OnMouse(self, event):
-        PositionWindow.OnMouse(self, event)
-        if event.LeftIsDown():
-            self.mapWindow.render['quick'] = self.quick
-            self.mapWindow.Refresh(eraseBackground = False)
-        elif event.LeftUp():
-            self.mapWindow.render['quick'] = False
-            self.mapWindow.Refresh(eraseBackground = False)
-        
-        event.Skip()
-
-class LightPositionWindow(PositionWindow):
-    """!Light position control widget"""
-    def __init__(self, parent, mapwindow, id = wx.ID_ANY,
-                 **kwargs):
-        PositionWindow.__init__(self, parent, mapwindow, id, **kwargs)
-
-        self.data = self.mapWindow.light
-        self.quick = False
-        self.PostDraw()
-
-    def UpdatePos(self, xcoord, ycoord):
-        x, y = PositionWindow.UpdatePos(self, xcoord, ycoord)
-        
-        event = wxUpdateLight()
-        wx.PostEvent(self.mapWindow, event)
-    
-        return x, y
-
-    def OnMouse(self, event):
-        PositionWindow.OnMouse(self, event)
-        if event.LeftUp():
-            self.mapWindow.render['quick'] = False
-            self.mapWindow.Refresh(eraseBackground = False)
-
-class NvizPreferencesDialog(PreferencesBaseDialog):
-    """!Nviz preferences dialog"""
-    def __init__(self, parent, title = _("3D view settings"),
-                 settings = UserSettings):
-        PreferencesBaseDialog.__init__(self, parent = parent, title = title,
-                                       settings = settings)
-        self.toolWin = self.parent.GetLayerManager().nviz
-        self.win = dict()
-        
-        # create notebook pages
-        self._createViewPage(self.notebook)
-        self._createVectorPage(self.notebook)
-        
-        self.SetMinSize(self.GetBestSize())
-        self.SetSize(self.size)
-        
-    def _createViewPage(self, notebook):
-        """!Create notebook page for general settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
-        
-        notebook.AddPage(page = panel,
-                         text = " %s " % _("View"))
-        
-        pageSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        self.win['general'] = {}
-        self.win['view'] = {}
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("View")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        
-        # perspective
-        self.win['view']['persp'] = {}
-        pvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'persp')
-        ipvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'persp', internal = True)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Perspective:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(value)")),
-                      pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        pval = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = pvals['value'],
-                           min = ipvals['min'],
-                           max = ipvals['max'])
-        self.win['view']['persp']['value'] = pval.GetId()
-        gridSizer.Add(item = pval, pos = (0, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(step)")),
-                      pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        pstep = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = pvals['step'],
-                           min = ipvals['min'],
-                           max = ipvals['max']-1)
-        self.win['view']['persp']['step'] = pstep.GetId()
-        gridSizer.Add(item = pstep, pos = (0, 4),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # position
-        self.win['view']['position'] = {}
-        posvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'position')
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Position:")),
-                      pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(x)")),
-                      pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        px = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = posvals['x'] * 100,
-                           min = 0,
-                           max = 100)
-        self.win['view']['position']['x'] = px.GetId()
-        gridSizer.Add(item = px, pos = (1, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = "(y)"),
-                      pos = (1, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        py = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = posvals['y'] * 100,
-                           min = 0,
-                           max = 100)
-        self.win['view']['position']['y'] = py.GetId()
-        gridSizer.Add(item = py, pos = (1, 4),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # height
-        self.win['view']['height'] = {}
-        hvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'height')
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Height:")),
-                      pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(step)")),
-                      pos = (2, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        hstep = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = hvals['step'],
-                           min = 1,
-                           max = 1e6)
-        self.win['view']['height']['step'] = hstep.GetId()
-        gridSizer.Add(item = hstep, pos = (2, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # twist
-        self.win['view']['twist'] = {}
-        tvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'twist')
-        itvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'twist', internal = True)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Twist:")),
-                      pos = (3, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(value)")),
-                      pos = (3, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        tval = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = tvals['value'],
-                           min = itvals['min'],
-                           max = itvals['max'])
-        self.win['view']['twist']['value'] = tval.GetId()
-        gridSizer.Add(item = tval, pos = (3, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(step)")),
-                      pos = (3, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        tstep = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = tvals['step'],
-                           min = itvals['min'],
-                           max = itvals['max']-1)
-        self.win['view']['twist']['step'] = tstep.GetId()
-        gridSizer.Add(item = tstep, pos = (3, 4),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # z-exag
-        self.win['view']['z-exag'] = {}
-        zvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'z-exag')
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Z-exag:")),
-                      pos = (4, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(value)")),
-                      pos = (4, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        zval = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = zvals['value'],
-                           min = -1e6,
-                           max = 1e6)
-        self.win['view']['z-exag']['value'] = zval.GetId()
-        gridSizer.Add(item = zval, pos = (4, 2),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("(step)")),
-                      pos = (4, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
-        
-        zstep = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                           initial = zvals['step'],
-                           min = -1e6,
-                           max = 1e6)
-        self.win['view']['z-exag']['step'] = zstep.GetId()
-        gridSizer.Add(item = zstep, pos = (4, 4),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-
-        box = wx.StaticBox(parent = panel, id = wx.ID_ANY,
-                           label = " %s " % (_("Image Appearance")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        gridSizer.AddGrowableCol(0)
-        
-        # background color
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Background color:")),
-                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        color = csel.ColourSelect(panel, id = wx.ID_ANY,
-                                  colour = UserSettings.Get(group = 'nviz', key = 'settings',
-                                                            subkey = ['general', 'bgcolor']),
-                                  size = globalvar.DIALOG_COLOR_SIZE)
-        self.win['general']['bgcolor'] = color.GetId()
-        gridSizer.Add(item = color, pos = (0, 1))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL,
-                      border = 3)
-        
-        panel.SetSizer(pageSizer)
-        
-        return panel
-    
-    def _createVectorPage(self, notebook):
-        """!Create notebook page for general settings"""
-        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
-        
-        notebook.AddPage(page = panel,
-                         text = " %s " % _("Vector"))
-        
-        pageSizer = wx.BoxSizer(wx.VERTICAL)
-        
-        # vector lines
-        self.win['vector'] = {}
-        self.win['vector']['lines'] = {}
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Vector lines")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
-        
-        # show
-        row = 0
-        showLines = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                                label = _("Show lines"))
-        self.win['vector']['lines']['show'] = showLines.GetId()
-        showLines.SetValue(UserSettings.Get(group = 'nviz', key = 'vector',
-                                            subkey = ['lines', 'show']))
-        gridSizer.Add(item = showLines, pos = (row, 0))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        # vector points
-        self.win['vector']['points'] = {}
-        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
-                            label = " %s " % (_("Vector points")))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 5)
-        
-        # show
-        row = 0
-        showPoints = wx.CheckBox(parent = panel, id = wx.ID_ANY,
-                                 label = _("Show points"))
-        showPoints.SetValue(UserSettings.Get(group = 'nviz', key = 'vector',
-                                             subkey = ['points', 'show']))
-        self.win['vector']['points']['show'] = showPoints.GetId()
-        gridSizer.Add(item = showPoints, pos = (row, 0), span = (1, 8))
-        
-        # icon size
-        row += 1 
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Size:")),
-                      pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        isize = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                            initial = 100,
-                            min = 1,
-                            max = 1e6)
-        self.win['vector']['points']['size'] = isize.GetId()
-        isize.SetValue(UserSettings.Get(group = 'nviz', key = 'vector',
-                                        subkey = ['points', 'size']))
-        gridSizer.Add(item = isize, pos = (row, 1),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # icon width
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Width:")),
-                      pos = (row, 2), flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        iwidth = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
-                            initial = 2,
-                            min = 1,
-                            max = 1e6)
-        self.win['vector']['points']['width'] = isize.GetId()
-        iwidth.SetValue(UserSettings.Get(group = 'nviz', key = 'vector',
-                                         subkey = ['points', 'width']))
-        gridSizer.Add(item = iwidth, pos = (row, 3),
-                      flag = wx.ALIGN_CENTER_VERTICAL)
-        
-        # icon symbol
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Marker:")),
-                      pos = (row, 4), flag = wx.ALIGN_CENTER_VERTICAL)
-        isym = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
-                          choices = UserSettings.Get(group = 'nviz', key = 'vector',
-                                                   subkey = ['points', 'marker'], internal = True))
-        isym.SetName("selection")
-        self.win['vector']['points']['marker'] = isym.GetId()
-        isym.SetSelection(UserSettings.Get(group = 'nviz', key = 'vector',
-                                           subkey = ['points', 'marker']))
-        gridSizer.Add(item = isym, flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 5))
-        
-        # icon color
-        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
-                                         label = _("Color:")),
-                      pos = (row, 6), flag = wx.ALIGN_CENTER_VERTICAL)
-        icolor = csel.ColourSelect(panel, id = wx.ID_ANY)
-        icolor.SetName("color")
-        self.win['vector']['points']['color'] = icolor.GetId()
-        icolor.SetColour(UserSettings.Get(group = 'nviz', key = 'vector',
-                                          subkey = ['points', 'color']))
-        gridSizer.Add(item = icolor, flag = wx.ALIGN_CENTER_VERTICAL,
-                      pos = (row, 7))
-        
-        boxSizer.Add(item = gridSizer, proportion = 1,
-                  flag = wx.ALL | wx.EXPAND, border = 3)
-        pageSizer.Add(item = boxSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
-                      border = 3)
-        
-        panel.SetSizer(pageSizer)
-        
-        return panel
-    
-    def OnDefault(self, event):
-        """Restore default settings"""
-        settings = copy.deepcopy(UserSettings.GetDefaultSettings()['nviz'])
-        UserSettings.Set(group = 'nviz',
-                         value = settings)
-        
-        for subgroup, key in settings.iteritems(): # view, surface, vector...
-            if subgroup != 'view':
-                continue
-            for subkey, value in key.iteritems():
-                for subvalue in value.keys():
-                    win = self.FindWindowById(self.win[subgroup][subkey][subvalue])
-                    val = settings[subgroup][subkey][subvalue]
-                    if subkey == 'position':
-                        val = int(val * 100)
-                    
-                    win.SetValue(val)
-        
-        event.Skip()
-        
-    def OnApply(self, event):
-        """Apply Nviz settings for current session"""
-        settings = UserSettings.Get(group = 'nviz')
-        for subgroup, key in settings.iteritems(): # view, surface, vector...
-            for subkey, value in key.iteritems():
-                for subvalue in value.keys():
-                    try: # TODO
-                        win = self.FindWindowById(self.win[subgroup][subkey][subvalue])
-                    except:
-                        # print 'e', subgroup, subkey, subvalue
-                        continue
-                    
-                    if win.GetName() == "selection":
-                        value = win.GetSelection()
-                    elif win.GetName() == "color":
-                        value = tuple(win.GetColour())
-                    else:
-                        value = win.GetValue()
-                    if subkey == 'position':
-                        value = float(value) / 100
-                    
-                    settings[subgroup][subkey][subvalue] = value
-                    
-    def OnSave(self, event):
-        """!Apply changes, update map and save settings of selected
-        layer
-        """
-        # apply changes
-        self.OnApply(None)
-        
-        if self.GetSelection() == self.page['id']:
-            fileSettings = {}
-            UserSettings.ReadSettingsFile(settings = fileSettings)
-            fileSettings['nviz'] = UserSettings.Get(group = 'nviz')
-            file = UserSettings.SaveToFile(fileSettings)
-            self.parent.goutput.WriteLog(_('Nviz settings saved to file <%s>.') % file)
-        
-    def OnLoad(self, event):
-        """!Apply button pressed"""
-        self.LoadSettings()
-        
-        if event:
-            event.Skip()
-
-    def LoadSettings(self):
-        """!Load saved Nviz settings and apply to current session"""
-        UserSettings.ReadSettingsFile()
-        settings = copy.deepcopy(UserSettings.Get(group = 'nviz'))
-        
-        for subgroup, key in settings.iteritems(): # view, surface, vector...
-            for subkey, value in key.iteritems():
-                for subvalue in value.keys():
-                    if subvalue == 'step':
-                        continue
-                    else:
-                        insetting = value[subvalue]                                                    
-                    if subgroup == 'view':
-                        for viewkey, viewitem in self.mapWindow.view[subkey].iteritems(): 
-                            if viewkey == subvalue:
-                                self.mapWindow.view[subkey][viewkey] = insetting 
-                            else:
-                                continue
-                    else:
-                        for otherkey, otheritem in self.win[subgroup][subkey].iteritems():
-                            if type(otheritem) == data:
-                                for endkey, enditem in otheritem.iteritems():
-                                    if endkey == subvalue:
-                                        paramwin = self.FindWindowById(enditem)
-                                    else:
-                                        continue
-                            else:
-                                if otherkey == subvalue:
-                                    paramwin = self.FindWindowById(otheritem)
-                                else:
-                                    continue
-                            if type(insetting) in [tuple, list] and len(insetting) > 2:
-                                insetting = tuple(insetting)
-                                paramwin.SetColour(insetting)
-                            else:
-                                try:
-                                    paramwin.SetValue(insetting)
-                                except:
-                                    try:
-                                        paramwin.SetStringSelection(insetting)
-                                    except:
-                                        continue
-                                
-        self.toolWin.UpdateSettings()
-        self.FindWindowById(self.win['view']['position']).Draw()
-        self.FindWindowById(self.win['view']['position']).Refresh(False)
-        
-        self.mapWindow.render['quick'] = False
-        self.mapWindow.Refresh(False)
-        
-    def OnSave(self, event):
-        """!Save button pressed
-        
-        Save settings to configuration file
-        """
-        fileSettings = {}
-        UserSettings.ReadSettingsFile(settings = fileSettings)
-        
-        self.toolWin.UpdateSettings()
-        
-        nvsettings = UserSettings.Get(group = 'nviz')
-        for subgroup, key in nvsettings.iteritems(): # view, surface, vector...
-            for subkey, value in key.iteritems():
-                if subkey == 'height': continue
-                for subvalue in value.keys():
-                    if subvalue == 'step':
-                        #no way to change steps for sliders or spinctrls on non-MSW systems
-                        nvsettings[subgroup][subkey][subvalue] = 1 
-                    else:
-                        if subgroup == 'view':
-                            nvsettings[subgroup][subkey][subvalue] = self.mapWindow.view[subkey][subvalue]                            
-                        elif subvalue == 'map':
-                            if subkey == 'shine': 
-                                nvsettings[subgroup][subkey][subvalue] = False
-                            if subkey == 'color': 
-                                nvsettings[subgroup][subkey][subvalue] = True
-                        else:
-                            for otherkey, otheritem in self.win[subgroup][subkey].iteritems():
-                                if type(otheritem) == data:
-                                    for endkey, enditem in otheritem.iteritems():
-                                        if endkey == subvalue:
-                                            if self.FindWindowById(enditem).GetClassName() == 'wxChoice':
-                                                outsetting = self.FindWindowById(enditem).GetSelection()
-                                            else:
-                                                try:
-                                                    outsetting = self.FindWindowById(enditem).GetColour()
-                                                    outsetting = str(outsetting.Red())+':'+str(outsetting.Green())+':'+str(outsetting.Blue())
-                                                except:
-                                                    try:
-                                                        outsetting = self.FindWindowById(enditem).GetValue()
-                                                    except:
-                                                        try:
-                                                            outsetting = self.FindWindowById(enditem).GetString()
-                                                        except:
-                                                            outsetting = ''
-                                            if (type(outsetting) == list or type(outsetting) == tuple) and len(outsetting) > 2:
-                                                outsetting = str(outsetting[0])+':'+str(outsetting[1])+':'+str(outsetting[2])
-                                                
-                                            nvsettings[subgroup][subkey][subvalue][endkey] = outsetting
-                                else:
-                                    if otherkey == subvalue:
-                                        if self.FindWindowById(otheritem).GetClassName() == 'wxChoice':
-                                            outsetting = self.FindWindowById(otheritem).GetSelection()
-                                        else:
-                                            try:
-                                                outsetting = self.FindWindowById(otheritem).GetColour()
-                                                outsetting = str(outsetting.Red())+':'+str(outsetting.Green())+':'+str(outsetting.Blue())
-                                            except:
-                                                try:
-                                                    outsetting = self.FindWindowById(otheritem).GetValue()
-                                                except:
-                                                    try:
-                                                        outsetting = self.FindWindowById(enditem).GetString()
-                                                    except:
-                                                        outsetting = ''
-                                        if (type(outsetting) == list or type(outsetting) == tuple) and len(outsetting) > 2:
-                                            outsetting = str(outsetting[0])+':'+str(outsetting[1])+':'+str(outsetting[2])
-
-                                        nvsettings[subgroup][subkey][subvalue] = outsetting
-                               
-        UserSettings.Set(group = 'nviz', value = nvsettings)
-        file = UserSettings.SaveToFile()
-        self.parent.goutput.WriteLog(_('Nviz settings saved to file <%s>.') % file)
diff --git a/gui/wxpython/gui_modules/profile.py b/gui/wxpython/gui_modules/profile.py
deleted file mode 100644
index 84648c0..0000000
--- a/gui/wxpython/gui_modules/profile.py
+++ /dev/null
@@ -1,1456 +0,0 @@
-"""!
- at package profile
-
-Profile analysis of GRASS raster maps and images.
-
-Uses PyPlot (wx.lib.plot.py)
-
-Classes:
- - ProfileFrame
- - SetRasterDialog
- - TextDialog
- - OptDialog
-
-(C) 2007-2008 by the GRASS Development Team
-
-This program is free software under the GNU General Public License
-(>=v2). Read the file COPYING that comes with GRASS for details.
-
- at author Michael Barton
- at author Various updates by Martin Landa <landa.martin gmail.com>
-"""
-
-import os
-import sys
-import math
-
-import wx
-import wx.lib.colourselect as  csel
-
-try:
-    import numpy
-    import wx.lib.plot as plot
-except ImportError:
-    msg= _("This module requires the NumPy module, which could not be "
-           "imported. It probably is not installed (it's not part of the "
-           "standard Python distribution). See the Numeric Python site "
-           "(http://numpy.scipy.org) for information on downloading source or "
-           "binaries.")
-    print >> sys.stderr, "profile.py: " + msg
-
-import globalvar
-import render
-import menuform
-import disp_print
-import gselect
-import gcmd
-import toolbars
-from debug import Debug as Debug
-from icon import Icons as Icons
-from preferences import globalSettings as UserSettings
-from grass.script import core as grass
-
-class ProfileFrame(wx.Frame):
-    """!Mainframe for displaying profile of raster map. Uses wx.lib.plot.
-    """
-    def __init__(self, parent=None, id=wx.ID_ANY, title=_("GRASS Profile Analysis Tool"),
-                 rasterList=[],
-                 pos=wx.DefaultPosition, size=wx.DefaultSize,
-                 style=wx.DEFAULT_FRAME_STYLE):
-
-        self.parent = parent # MapFrame
-        self.mapwin = self.parent.MapWindow
-        self.Map = render.Map()  # instance of render.Map to be associated with display
-
-        self.pstyledict = { 'solid' : wx.SOLID,
-                            'dot' : wx.DOT,
-                            'long-dash' : wx.LONG_DASH,
-                            'short-dash' : wx.SHORT_DASH,
-                            'dot-dash' : wx.DOT_DASH }
-
-        self.ptfilldict = { 'transparent' : wx.TRANSPARENT,
-                            'solid' : wx.SOLID }
-
-        wx.Frame.__init__(self, parent, id, title, pos, size, style)
-
-        #
-        # Icon
-        #
-        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-        
-        #
-        # Add toolbar
-        #
-        self.toolbar = toolbars.ProfileToolbar(parent=self)
-        self.SetToolBar(self.toolbar)
-        
-        #
-        # Set the size & cursor
-        #
-        self.SetClientSize(size)
-
-        #
-        # Add statusbar
-        #
-        self.statusbar = self.CreateStatusBar(number=2, style=0)
-        self.statusbar.SetStatusWidths([-2, -1])
-
-        #
-        # Define canvas
-        #
-        # plot canvas settings
-        self.client = plot.PlotCanvas(self)
-        #define the function for drawing pointLabels
-        self.client.SetPointLabelFunc(self.DrawPointLabel)
-        # Create mouse event for showing cursor coords in status bar
-        self.client.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)
-        # Show closest point when enabled
-        self.client.canvas.Bind(wx.EVT_MOTION, self.OnMotion)
-
-        #
-        # Init variables
-        #
-        # 0    -> default raster map to profile
-        # 1, 2 -> optional raster map to profile
-        # units -> map data units (used for y axis legend)
-        self.raster = {}
-        for idx in (0, 1, 2):
-            self.raster[idx] = {}
-            self.raster[idx]['name'] = ''
-            self.raster[idx]['units'] = ''
-            self.raster[idx]['plegend'] = ''
-            # list of distance,value pairs for plotting profile
-            self.raster[idx]['datalist'] = []
-            # first (default) profile line
-            self.raster[idx]['pline'] = None
-            self.raster[idx]['prop'] = UserSettings.Get(group='profile', key='raster' + str(idx))
-            # changing color string to tuple
-            colstr = str(self.raster[idx]['prop']['pcolor'])
-            self.raster[idx]['prop']['pcolor'] = tuple(int(colval) for colval in colstr.strip('()').split(','))
-
-        # set raster map name (if given)
-        for idx in range(len(rasterList)):
-            self.raster[idx]['name'] = rasterList[idx]
-
-        # string of coordinates for r.profile
-        self.coordstr = '' 
-        # segment endpoint list
-        self.seglist = []
-        # list of things to plot
-        self.plotlist = []
-        # segment endpoints data 
-        self.ppoints = '' 
-        # plot draw object
-        self.profile = None 
-        # total transect length
-        self.transect_length = 0.0
-
-        # title of window
-        self.ptitle = _('Profile of')
-
-        # determine units (axis labels)
-        if self.parent.Map.projinfo['units'] != '':
-            self.xlabel = _('Distance (%s)') % self.parent.Map.projinfo['units']
-        else:
-            self.xlabel = _("Distance along transect")
-        self.ylabel = _("Cell values")
-
-        self.properties = {}
-        self.properties['font'] = {}
-        self.properties['font']['prop'] = UserSettings.Get(group='profile', key='font')
-        self.properties['font']['wxfont'] = wx.Font(11, wx.FONTFAMILY_SWISS,
-                                                    wx.FONTSTYLE_NORMAL,
-                                                    wx.FONTWEIGHT_NORMAL)
-        
-        self.properties['marker'] = UserSettings.Get(group='profile', key='marker')
-        # changing color string to tuple
-        colstr = str(self.properties['marker']['color'])
-        self.properties['marker']['color'] = tuple(int(colval) for colval in colstr.strip('()').split(','))
-
-        self.properties['grid'] = UserSettings.Get(group='profile', key='grid')
-        # changing color string to tuple
-        colstr = str(self.properties['grid']['color'])
-        self.properties['grid']['color'] = tuple(int(colval) for colval in colstr.strip('()').split(','))
-                
-        self.properties['x-axis'] = {}
-        
-        self.properties['x-axis']['prop'] = UserSettings.Get(group='profile', key='x-axis')
-        self.properties['x-axis']['axis'] = None
-
-        self.properties['y-axis'] = {}
-        self.properties['y-axis']['prop'] = UserSettings.Get(group='profile', key='y-axis')
-        self.properties['y-axis']['axis'] = None
-        
-        self.properties['legend'] = UserSettings.Get(group='profile', key='legend')
-        
-        # zooming disabled
-        self.zoom = False
-        # draging disabled
-        self.drag = False 
-
-        # vertical and horizontal scrollbars
-        self.client.SetShowScrollbars(True)
-
-        # x and y axis set to normal (non-log)
-        self.client.setLogScale((False, False))
-        if self.properties['x-axis']['prop']['type']:
-            self.client.SetXSpec(self.properties['x-axis']['prop']['type'])
-        else:
-            self.client.SetXSpec('auto')
-        
-        if self.properties['y-axis']['prop']['type']:
-            self.client.SetYSpec(self.properties['y-axis']['prop']['type'])
-        else:
-            self.client.SetYSpec('auto')
-
-        #
-        # Bind various events
-        #
-        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
-        
-        self.CentreOnScreen()
-
-    def OnDrawTransect(self, event):
-        """!Draws transect to profile in map display
-        """
-        self.mapwin.polycoords = []
-        self.seglist = []
-        self.mapwin.ClearLines(self.mapwin.pdc)
-        self.ppoints = ''
-
-        self.parent.SetFocus()
-        self.parent.Raise()
-        
-        self.mapwin.mouse['use'] = 'profile'
-        self.mapwin.mouse['box'] = 'line'
-        self.mapwin.pen = wx.Pen(colour='Red', width=2, style=wx.SHORT_DASH)
-        self.mapwin.polypen = wx.Pen(colour='dark green', width=2, style=wx.SHORT_DASH)
-        self.mapwin.SetCursor(self.Parent.cursors["cross"])
-
-    def OnSelectRaster(self, event):
-        """!Select raster map(s) to profile
-        """
-        dlg = SetRasterDialog(parent=self)
-
-        if dlg.ShowModal() == wx.ID_OK:
-            for r in self.raster.keys():
-                self.raster[r]['name'] = dlg.raster[r]['name']
-
-            # plot profile
-            if self.raster[0]['name'] and len(self.mapwin.polycoords) > 0:
-                self.OnCreateProfile(event=None)
-
-        dlg.Destroy()
-
-    def SetRaster(self):
-        """!Create coordinate string for profiling. Create segment list for
-        transect segment markers.
-        """
-        #
-        # create list of coordinate points for r.profile
-        #
-                
-        dist = 0
-        cumdist = 0
-        self.coordstr = ''
-        lasteast = lastnorth = None
-        
-        if len(self.mapwin.polycoords) > 0:
-            for point in self.mapwin.polycoords:
-                # build string of coordinate points for r.profile
-                if self.coordstr == '':
-                    self.coordstr = '%d,%d' % (point[0], point[1])
-                else:
-                    self.coordstr = '%s,%d,%d' % (self.coordstr, point[0], point[1])
-
-        if self.raster[0]['name'] == '':
-            return
-
-        # title of window
-        self.ptitle = _('Profile of')
-
-        #
-        # create list of coordinates for transect segment markers
-        #
-
-        if len(self.mapwin.polycoords) > 0:
-            for point in self.mapwin.polycoords:
-                # get value of raster cell at coordinate point
-                ret = gcmd.RunCommand('r.what',
-                                      parent = self,
-                                      read = True,
-                                      input = self.raster[0]['name'],
-                                      east_north = '%d,%d' % (point[0],point[1]))
-                
-                val = ret.splitlines()[0].split('|')[3]
-                
-                # calculate distance between coordinate points
-                if lasteast and lastnorth:
-                    dist = math.sqrt(math.pow((lasteast-point[0]),2) + math.pow((lastnorth-point[1]),2))
-                cumdist += dist
-                
-                #store total transect length
-                self.transect_length = cumdist
-
-                # build a list of distance,value pairs for each segment of transect
-                self.seglist.append((cumdist,val))
-                lasteast = point[0]
-                lastnorth = point[1]
-
-            # delete first and last segment point
-            try:
-                self.seglist.pop(0)
-                self.seglist.pop()
-            except:
-                pass
-
-        #
-        # create datalist for each raster map
-        #
-        
-        for r in self.raster.itervalues():
-            if r['name'] == '':
-                continue
-            r['datalist'] = self.CreateDatalist(r['name'], self.coordstr)
-            r['plegend'] = _('Profile of %s') % r['name']
-
-            ret = gcmd.RunCommand('r.info',
-                                  parent = self,
-                                  read = True,
-                                  quiet = True,
-                                  flags = 'u',
-                                  map = r['name'])
-
-            if ret:
-                r['units'] = ret.splitlines()[0].split('=')[1]
-
-            # update title
-            self.ptitle += ' %s and' % r['name']
-
-        self.ptitle = self.ptitle.rstrip('and')
-        
-        #
-        # set ylabel to match units if they exist
-        #
-        self.ylabel = ''
-        i = 0
-        
-        for r in self.raster.itervalues():
-            if r['name'] == '':
-                continue
-            if r['units'] != '':
-                self.ylabel = '%s (%d),' % (r['units'], i)
-            i += 1
-        if self.ylabel == '':
-            self.ylabel = _('Raster values')
-        else:
-            self.ylabel = self.ylabel.rstrip(',')
-
-    def SetGraphStyle(self):
-        """!Set plot and text options
-        """
-        self.client.SetFont(self.properties['font']['wxfont'])
-        self.client.SetFontSizeTitle(self.properties['font']['prop']['titleSize'])
-        self.client.SetFontSizeAxis(self.properties['font']['prop']['axisSize'])
-
-        self.client.SetEnableZoom(self.zoom)
-        self.client.SetEnableDrag(self.drag)
-        
-        #
-        # axis settings
-        #
-        if self.properties['x-axis']['prop']['type'] == 'custom':
-            self.client.SetXSpec('min')
-        else:
-            self.client.SetXSpec(self.properties['x-axis']['prop']['type'])
-
-        if self.properties['y-axis']['prop']['type'] == 'custom':
-            self.client.SetYSpec('min')
-        else:
-            self.client.SetYSpec(self.properties['y-axis']['prop']['type'])
-
-        if self.properties['x-axis']['prop']['type'] == 'custom' and \
-               self.properties['x-axis']['prop']['min'] < self.properties['x-axis']['prop']['max']:
-            self.properties['x-axis']['axis'] = (self.properties['x-axis']['prop']['min'],
-                                                 self.properties['x-axis']['prop']['max'])
-        else:
-            self.properties['x-axis']['axis'] = None
-
-        if self.properties['y-axis']['prop']['type'] == 'custom' and \
-                self.properties['y-axis']['prop']['min'] < self.properties['y-axis']['prop']['max']:
-            self.properties['y-axis']['axis'] = (self.properties['y-axis']['prop']['min'],
-                                                 self.properties['y-axis']['prop']['max'])
-        else:
-            self.properties['y-axis']['axis'] = None
-
-        self.client.SetEnableGrid(self.properties['grid']['enabled'])
-        
-        self.client.SetGridColour(wx.Color(self.properties['grid']['color'][0],
-                                           self.properties['grid']['color'][1],
-                                           self.properties['grid']['color'][2],
-                                           255))
-
-        self.client.SetFontSizeLegend(self.properties['font']['prop']['legendSize'])
-        self.client.SetEnableLegend(self.properties['legend']['enabled'])
-
-        if self.properties['x-axis']['prop']['log'] == True:
-            self.properties['x-axis']['axis'] = None
-            self.client.SetXSpec('min')
-        if self.properties['y-axis']['prop']['log'] == True:
-            self.properties['y-axis']['axis'] = None
-            self.client.SetYSpec('min')
-            
-        self.client.setLogScale((self.properties['x-axis']['prop']['log'],
-                                 self.properties['y-axis']['prop']['log']))
-
-        # self.client.SetPointLabelFunc(self.DrawPointLabel())
-
-    def CreateDatalist(self, raster, coords):
-        """!Build a list of distance, value pairs for points along transect
-        """
-        datalist = []
-        
-        # keep total number of transect points to 500 or less to avoid 
-        # freezing with large, high resolution maps
-        region = grass.region()
-        curr_res = min(float(region['nsres']),float(region['ewres']))
-        transect_rec = 0
-        if self.transect_length / curr_res > 500:
-            transect_res = self.transect_length / 500
-        else: transect_res = curr_res
-        
-        try:
-            ret = gcmd.RunCommand("r.profile",
-                             input=raster,
-                             profile=coords,
-                             res=transect_res,
-                             null="nan",
-                             quiet=True,
-                             read = True)
-            
-            if not ret:
-                return dataset
-            
-            for line in ret.splitlines():
-                dist, elev = line.split(' ')
-                if elev != 'nan':
-                    datalist.append((dist,elev))
-
-            return datalist
-        except gcmd.GException, e:
-            gcmd.GError(parent = self,
-                        message = e.value)
-            return None
-
-    def OnCreateProfile(self, event):
-        """!Main routine for creating a profile. Uses r.profile to
-        create a list of distance,cell value pairs. This is passed to
-        plot to create a line graph of the profile. If the profile
-        transect is in multiple segments, these are drawn as
-        points. Profile transect is drawn, using methods in mapdisp.py
-        """
-    
-        if len(self.mapwin.polycoords) == 0 or self.raster[0]['name'] == '':
-            dlg = wx.MessageDialog(parent=self,
-                                   message=_('You must draw a transect to profile in the map display window.'),
-                                   caption=_('Nothing to profile'),
-                                   style=wx.OK | wx.ICON_INFORMATION | wx.CENTRE)
-            dlg.ShowModal()
-            dlg.Destroy()
-            return
-
-        self.mapwin.SetCursor(self.parent.cursors["default"])
-        self.SetCursor(self.parent.cursors["default"])
-        self.SetGraphStyle()
-
-        self.SetRaster()
-            
-        self.DrawPlot()
-
-        # reset transect
-        self.mapwin.mouse['begin'] = self.mapwin.mouse['end'] = (0.0,0.0)
-        self.mapwin.mouse['use'] = 'pointer'
-        self.mapwin.mouse['box'] = 'point'
-
-    def DrawPlot(self):
-        """!Draw line and point plot from transect datalist and
-        transect segment endpoint coordinates.
-        """
-        # graph the distance, value pairs for the transect
-        self.plotlist = []
-        if len(self.seglist) > 0 :
-            self.ppoints = plot.PolyMarker(self.seglist,
-                                           legend=' ' + self.properties['marker']['legend'],
-                                           colour=wx.Color(self.properties['marker']['color'][0],
-                                                           self.properties['marker']['color'][1],
-                                                           self.properties['marker']['color'][2],
-                                                           255),
-                                           size=self.properties['marker']['size'],
-                                           fillstyle=self.ptfilldict[self.properties['marker']['fill']],
-                                           marker=self.properties['marker']['type'])
-            self.plotlist.append(self.ppoints)
-
-        for r in self.raster.itervalues():
-            if len(r['datalist']) > 0:
-                col = wx.Color(r['prop']['pcolor'][0],
-                               r['prop']['pcolor'][1],
-                               r['prop']['pcolor'][2],
-                               255)
-                r['pline'] = plot.PolyLine(r['datalist'],
-                                           colour=col,
-                                           width=r['prop']['pwidth'],
-                                           style=self.pstyledict[r['prop']['pstyle']],
-                                           legend=r['plegend'])
-
-                self.plotlist.append(r['pline'])
-
-        self.profile = plot.PlotGraphics(self.plotlist,
-                                         self.ptitle,
-                                         self.xlabel,
-                                         self.ylabel)
-
-        if self.properties['x-axis']['prop']['type'] == 'custom':
-            self.client.SetXSpec('min')
-        else:
-            self.client.SetXSpec(self.properties['x-axis']['prop']['type'])
-
-        if self.properties['y-axis']['prop']['type'] == 'custom':
-            self.client.SetYSpec('min')
-        else:
-            self.client.SetYSpec(self.properties['y-axis']['prop']['type'])
-
-        self.client.Draw(self.profile, self.properties['x-axis']['axis'],
-                         self.properties['y-axis']['axis'])
-
-    def OnZoom(self, event):
-        """!Enable zooming and disable dragging
-        """
-        self.zoom = True
-        self.drag = False
-        self.client.SetEnableZoom(self.zoom)
-        self.client.SetEnableDrag(self.drag)
-
-    def OnDrag(self, event):
-        """!Enable dragging and disable zooming
-        """
-        self.zoom = False
-        self.drag = True
-        self.client.SetEnableDrag(self.drag)
-        self.client.SetEnableZoom(self.zoom)
-
-    def OnRedraw(self, event):
-        """!Redraw the profile window. Unzoom to original size
-        """
-        self.client.Reset()
-        self.client.Redraw()
-
-    def Update(self):
-        """!Update profile after changing options
-        """
-        self.SetGraphStyle()
-        self.DrawPlot()
-
-    def OnErase(self, event):
-        """!Erase the profile window
-        """
-        self.client.Clear()
-        self.mapwin.ClearLines(self.mapwin.pdc)
-        self.mapwin.ClearLines(self.mapwin.pdcTmp)
-        self.mapwin.polycoords = []
-        self.mapwin.Refresh()
-        #        try:
-        #            self.mapwin.pdc.ClearId(self.mapwin.lineid)
-        #            self.mapwin.pdc.ClearId(self.mapwin.plineid)
-        #            self.mapwin.Refresh()
-        #        except:
-        #            pass
-
-    def SaveToFile(self, event):
-        """!Save profile to graphics file
-        """
-        self.client.SaveFile()
-
-    def SaveProfileToFile(self, event):
-        """!Save r.profile data to a csv file
-        """    
-        wildcard = _("Comma separated value (*.csv)|*.csv")
-        
-        dlg = wx.FileDialog(
-            self, message=_("Path and prefix (for raster name) to save profile values..."),
-            defaultDir=os.getcwd(), 
-            defaultFile="",  wildcard=wildcard, style=wx.SAVE
-            )
-        if dlg.ShowModal() == wx.ID_OK:
-            path = dlg.GetPath()
-            
-            for r in self.raster.itervalues():
-                if r['name'] == '':
-                    continue
-
-                print 'path = '+str(path)
-                pfile = path+'_'+str(r['name'])+'.csv'
-                print 'pfile1 = '+str(pfile)
-                try:
-                    file = open(pfile, "w")
-                except IOError:
-                    wx.MessageBox(parent=self,
-                                  message=_("Unable to open file <%s> for writing.") % pfile,
-                                  caption=_("Error"), style=wx.OK | wx.ICON_ERROR | wx.CENTRE)
-                    return False
-                for datapair in r['datalist']:
-                    file.write('%d,%d\n' % (float(datapair[0]),float(datapair[1])))
-                                        
-                file.close()
-
-        dlg.Destroy()
-    
-    def DrawPointLabel(self, dc, mDataDict):
-        """!This is the fuction that defines how the pointLabels are
-            plotted dc - DC that will be passed mDataDict - Dictionary
-            of data that you want to use for the pointLabel
-
-            As an example I have decided I want a box at the curve
-            point with some text information about the curve plotted
-            below.  Any wxDC method can be used.
-        """
-        dc.SetPen(wx.Pen(wx.BLACK))
-        dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) )
-
-        sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point
-        dc.DrawRectangle( sx-5,sy-5, 10, 10)  #10by10 square centered on point
-        px,py = mDataDict["pointXY"]
-        cNum = mDataDict["curveNum"]
-        pntIn = mDataDict["pIndex"]
-        legend = mDataDict["legend"]
-        #make a string to display
-        s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn)
-        dc.DrawText(s, sx , sy+1)
-
-    def OnMouseLeftDown(self,event):
-        s= "Left Mouse Down at Point: (%.4f, %.4f)" % self.client._getXY(event)
-        self.SetStatusText(s)
-        event.Skip()            #allows plotCanvas OnMouseLeftDown to be called
-
-    def OnMotion(self, event):
-        # indicate when mouse is outside the plot area
-        if self.client.OnLeave(event): print 'out of area'
-        #show closest point (when enbled)
-        if self.client.GetEnablePointLabel() == True:
-            #make up dict with info for the pointLabel
-            #I've decided to mark the closest point on the closest curve
-            dlst= self.client.GetClosetPoint( self.client._getXY(event), pointScaled= True)
-            if dlst != []:      #returns [] if none
-                curveNum, legend, pIndex, pointXY, scaledXY, distance = dlst
-                #make up dictionary to pass to my user function (see DrawPointLabel)
-                mDataDict= {"curveNum":curveNum, "legend":legend, "pIndex":pIndex,\
-                    "pointXY":pointXY, "scaledXY":scaledXY}
-                #pass dict to update the pointLabel
-                self.client.UpdatePointLabel(mDataDict)
-        event.Skip()           #go to next handler
-
-    def ProfileOptionsMenu(self, event):
-        """!Popup menu for profile and text options
-        """
-        point = wx.GetMousePosition()
-        popt = wx.Menu()
-        # Add items to the menu
-        settext = wx.MenuItem(popt, -1, 'Profile text settings')
-        popt.AppendItem(settext)
-        self.Bind(wx.EVT_MENU, self.PText, settext)
-
-        setgrid = wx.MenuItem(popt, -1, 'Profile plot settings')
-        popt.AppendItem(setgrid)
-        self.Bind(wx.EVT_MENU, self.POptions, setgrid)
-
-        # Popup the menu.  If an item is selected then its handler
-        # will be called before PopupMenu returns.
-        self.PopupMenu(popt)
-        popt.Destroy()
-
-    def NotFunctional(self):
-        """!Creates a 'not functional' message dialog
-        """
-        dlg = wx.MessageDialog(parent = self,
-                               message = _('This feature is not yet functional'),
-                               caption = _('Under Construction'),
-                               style = wx.OK | wx.ICON_INFORMATION)
-        dlg.ShowModal()
-        dlg.Destroy()
-
-    def OnPText(self, dlg):
-        """!Use user's provided profile text settings.
-        """
-        self.ptitle = dlg.ptitle
-        self.xlabel = dlg.xlabel
-        self.ylabel = dlg.ylabel
-        dlg.UpdateSettings()
-
-        self.client.SetFont(self.properties['font']['wxfont'])
-        self.client.SetFontSizeTitle(self.properties['font']['prop']['titleSize'])
-        self.client.SetFontSizeAxis(self.properties['font']['prop']['axisSize'])
-
-        if self.profile:
-            self.profile.setTitle(dlg.ptitle)
-            self.profile.setXLabel(dlg.xlabel)
-            self.profile.setYLabel(dlg.ylabel)
-        
-        self.OnRedraw(event=None)
-    
-    def PText(self, event):
-        """!Set custom text values for profile title and axis labels.
-        """
-        dlg = TextDialog(parent=self, id=wx.ID_ANY, title=_('Profile text settings'))
-
-        if dlg.ShowModal() == wx.ID_OK:
-            self.OnPText(dlg)
-
-        dlg.Destroy()
-
-    def POptions(self, event):
-        """!Set various profile options, including: line width, color,
-        style; marker size, color, fill, and style; grid and legend
-        options.  Calls OptDialog class.
-        """
-        dlg = OptDialog(parent=self, id=wx.ID_ANY, title=_('Profile settings'))
-        btnval = dlg.ShowModal()
-
-        if btnval == wx.ID_SAVE:
-            dlg.UpdateSettings()            
-            self.SetGraphStyle()            
-            dlg.Destroy()            
-        elif btnval == wx.ID_CANCEL:
-            dlg.Destroy()
-
-    def PrintMenu(self, event):
-        """!Print options and output menu
-        """
-        point = wx.GetMousePosition()
-        printmenu = wx.Menu()
-        # Add items to the menu
-        setup = wx.MenuItem(printmenu, -1,'Page setup')
-        printmenu.AppendItem(setup)
-        self.Bind(wx.EVT_MENU, self.OnPageSetup, setup)
-
-        preview = wx.MenuItem(printmenu, -1,'Print preview')
-        printmenu.AppendItem(preview)
-        self.Bind(wx.EVT_MENU, self.OnPrintPreview, preview)
-
-        doprint = wx.MenuItem(printmenu, -1,'Print display')
-        printmenu.AppendItem(doprint)
-        self.Bind(wx.EVT_MENU, self.OnDoPrint, doprint)
-
-        # Popup the menu.  If an item is selected then its handler
-        # will be called before PopupMenu returns.
-        self.PopupMenu(printmenu)
-        printmenu.Destroy()
-
-    def OnPageSetup(self, event):
-        self.client.PageSetup()
-
-    def OnPrintPreview(self, event):
-        self.client.PrintPreview()
-
-    def OnDoPrint(self, event):
-        self.client.Printout()
-
-    def OnQuit(self, event):
-        self.Close(True)
-
-    def OnCloseWindow(self, event):
-        """
-        Close profile window and clean up
-        """
-        self.mapwin.ClearLines()
-        self.mapwin.mouse['begin'] = self.mapwin.mouse['end'] = (0.0, 0.0)
-        self.mapwin.mouse['use'] = 'pointer'
-        self.mapwin.mouse['box'] = 'point'
-        self.mapwin.polycoords = []
-        self.mapwin.SetCursor(self.Parent.cursors["default"])
-
-        self.mapwin.UpdateMap(render=False, renderVector=False)
-
-        self.Destroy()
-
-class SetRasterDialog(wx.Dialog):
-    def __init__(self, parent, id=wx.ID_ANY, title=_("Select raster map to profile"),
-                 pos=wx.DefaultPosition, size=wx.DefaultSize,
-                 style=wx.DEFAULT_DIALOG_STYLE):
-        """!Dialog to select raster maps to profile.
-        """
-
-        wx.Dialog.__init__(self, parent, id, title, pos, size, style)
-
-        self.parent = parent
-        self.coordstr = self.parent.coordstr
-
-        #         if self.coordstr == '':
-        #             dlg = wx.MessageDialog(parent=self,
-        #                                    message=_('You must draw a transect to profile in the map display window.'),
-        #                                    caption=_('Nothing to profile'),
-        #                                    style=wx.OK | wx.ICON_INFORMATION | wx.CENTRE)
-        #             dlg.ShowModal()
-        #             dlg.Destroy()
-        #             self.Close(True)
-        #             return
-
-        self.raster = { 0 : { 'name' : self.parent.raster[0]['name'],
-                              'id' : None },
-                        1 : { 'name' : self.parent.raster[1]['name'],
-                              'id' : None },
-                        2 : { 'name' : self.parent.raster[2]['name'],
-                              'id' : None }
-                        }
-
-        sizer = wx.BoxSizer(wx.VERTICAL)
-
-        box = wx.GridBagSizer (hgap=3, vgap=3)
-        
-        i = 0
-        for txt in [_("Select raster map 1 (required):"),
-                    _("Select raster map 2 (optional):"),
-                    _("Select raster map 3 (optional):")]:
-            label = wx.StaticText(parent=self, id=wx.ID_ANY, label=txt)
-            box.Add(item=label,
-                    flag=wx.ALIGN_CENTER_VERTICAL, pos=(i, 0))
-            
-            selection = gselect.Select(self, id=wx.ID_ANY,
-                                       size=globalvar.DIALOG_GSELECT_SIZE,
-                                       type='cell')
-            selection.SetValue(str(self.raster[i]['name']))
-            self.raster[i]['id'] = selection.GetChildren()[0].GetId()
-            selection.Bind(wx.EVT_TEXT, self.OnSelection)
-            
-            box.Add(item=selection, pos=(i, 1))
-            
-            i += 1 
-            
-        sizer.Add(item=box, proportion=0,
-                  flag=wx.ALL, border=10)
-
-        line = wx.StaticLine(parent=self, id=wx.ID_ANY, size=(20, -1), style=wx.LI_HORIZONTAL)
-        sizer.Add(item=line, proportion=0,
-                  flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, border=5)
-
-        btnsizer = wx.StdDialogButtonSizer()
-
-        btn = wx.Button(self, wx.ID_OK)
-        btn.SetDefault()
-        btnsizer.AddButton(btn)
-
-        btn = wx.Button(self, wx.ID_CANCEL)
-        btnsizer.AddButton(btn)
-        btnsizer.Realize()
-
-        sizer.Add(item=btnsizer, proportion=0, flag=wx.ALIGN_RIGHT | wx.ALL, border=5)
-
-        self.SetSizer(sizer)
-        sizer.Fit(self)
-
-    def OnSelection(self, event):
-        id = event.GetId()
-        for r in self.raster.itervalues():
-            if r['id'] == id:
-                r['name'] = event.GetString()
-                break
-
-class TextDialog(wx.Dialog):
-    def __init__(self, parent, id, title, pos=wx.DefaultPosition, size=wx.DefaultSize,
-                 style=wx.DEFAULT_DIALOG_STYLE):
-        """!Dialog to set profile text options: font, title
-        and font size, axis labels and font size
-        """
-        wx.Dialog.__init__(self, parent, id, title, pos, size, style)
-        #
-        # initialize variables
-        #
-        # combo box entry lists
-        self.ffamilydict = { 'default' : wx.FONTFAMILY_DEFAULT,
-                             'decorative' : wx.FONTFAMILY_DECORATIVE,
-                             'roman' : wx.FONTFAMILY_ROMAN,
-                             'script' : wx.FONTFAMILY_SCRIPT,
-                             'swiss' : wx.FONTFAMILY_SWISS,
-                             'modern' : wx.FONTFAMILY_MODERN,
-                             'teletype' : wx.FONTFAMILY_TELETYPE }
-
-        self.fstyledict = { 'normal' : wx.FONTSTYLE_NORMAL,
-                            'slant' : wx.FONTSTYLE_SLANT,
-                            'italic' : wx.FONTSTYLE_ITALIC }
-
-        self.fwtdict = { 'normal' : wx.FONTWEIGHT_NORMAL,
-                         'light' : wx.FONTWEIGHT_LIGHT,
-                         'bold' : wx.FONTWEIGHT_BOLD }
-
-        self.parent = parent
-
-        self.ptitle = self.parent.ptitle
-        self.xlabel = self.parent.xlabel
-        self.ylabel = self.parent.ylabel
-
-        self.properties = self.parent.properties # read-only
-        
-        # font size
-        self.fontfamily = self.properties['font']['wxfont'].GetFamily()
-        self.fontstyle = self.properties['font']['wxfont'].GetStyle()
-        self.fontweight = self.properties['font']['wxfont'].GetWeight()
-
-        self._do_layout()
-        
-    def _do_layout(self):
-        """!Do layout"""
-        # dialog layout
-        sizer = wx.BoxSizer(wx.VERTICAL)
-
-        box = wx.StaticBox(parent=self, id=wx.ID_ANY,
-                           label=" %s " % _("Text settings"))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
-
-        #
-        # profile title
-        #
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Profile title:"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(0, 0))
-        self.ptitleentry = wx.TextCtrl(parent=self, id=wx.ID_ANY, value="", size=(250,-1))
-        # self.ptitleentry.SetFont(self.font)
-        self.ptitleentry.SetValue(self.ptitle)
-        gridSizer.Add(item=self.ptitleentry, pos=(0, 1))
-
-        #
-        # title font
-        #
-        tlabel = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Title font size (pts):"))
-        gridSizer.Add(item=tlabel, flag=wx.ALIGN_CENTER_VERTICAL, pos=(1, 0))
-        self.ptitlesize = wx.SpinCtrl(parent=self, id=wx.ID_ANY, value="", pos=(30, 50),
-                                      size=(50,-1), style=wx.SP_ARROW_KEYS)
-        self.ptitlesize.SetRange(5,100)
-        self.ptitlesize.SetValue(int(self.properties['font']['prop']['titleSize']))
-        gridSizer.Add(item=self.ptitlesize, pos=(1, 1))
-
-        #
-        # x-axis label
-        #
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("X-axis label:"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(2, 0))
-        self.xlabelentry = wx.TextCtrl(parent=self, id=wx.ID_ANY, value="", size=(250,-1))
-        # self.xlabelentry.SetFont(self.font)
-        self.xlabelentry.SetValue(self.xlabel)
-        gridSizer.Add(item=self.xlabelentry, pos=(2, 1))
-
-        #
-        # y-axis label
-        #
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Y-axis label:"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(3, 0))
-        self.ylabelentry = wx.TextCtrl(parent=self, id=wx.ID_ANY, value="", size=(250,-1))
-        # self.ylabelentry.SetFont(self.font)
-        self.ylabelentry.SetValue(self.ylabel)
-        gridSizer.Add(item=self.ylabelentry, pos=(3, 1))
-
-        #
-        # font size
-        #
-        llabel = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Label font size (pts):"))
-        gridSizer.Add(item=llabel, flag=wx.ALIGN_CENTER_VERTICAL, pos=(4, 0))
-        self.axislabelsize = wx.SpinCtrl(parent=self, id=wx.ID_ANY, value="", pos=(30, 50),
-                                         size=(50, -1), style=wx.SP_ARROW_KEYS)
-        self.axislabelsize.SetRange(5, 100) 
-        self.axislabelsize.SetValue(int(self.properties['font']['prop']['axisSize']))
-        gridSizer.Add(item=self.axislabelsize, pos=(4,1))
-
-        boxSizer.Add(item=gridSizer)
-        sizer.Add(item=boxSizer, flag=wx.ALL | wx.EXPAND, border=3)
-
-        #
-        # font settings
-        #
-        box = wx.StaticBox(parent=self, id=wx.ID_ANY,
-                           label=" %s " % _("Font settings"))
-        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
-        gridSizer.AddGrowableCol(1)
-
-        #
-        # font family
-        #
-        label1 = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Font family:"))
-        gridSizer.Add(item=label1, flag=wx.ALIGN_CENTER_VERTICAL, pos=(0, 0))
-        self.ffamilycb = wx.ComboBox(parent=self, id=wx.ID_ANY, size=(250, -1),
-                                choices=self.ffamilydict.keys(), style=wx.CB_DROPDOWN)
-        self.ffamilycb.SetStringSelection('swiss')
-        for item in self.ffamilydict.items():
-            if self.fontfamily == item[1]:
-                self.ffamilycb.SetStringSelection(item[0])
-                break
-        gridSizer.Add(item=self.ffamilycb, pos=(0, 1), flag=wx.ALIGN_RIGHT)
-
-        #
-        # font style
-        #
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Style:"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(1, 0))
-        self.fstylecb = wx.ComboBox(parent=self, id=wx.ID_ANY, size=(250, -1),
-                                    choices=self.fstyledict.keys(), style=wx.CB_DROPDOWN)
-        self.fstylecb.SetStringSelection('normal')
-        for item in self.fstyledict.items():
-            if self.fontstyle == item[1]:
-                self.fstylecb.SetStringSelection(item[0])
-                break
-        gridSizer.Add(item=self.fstylecb, pos=(1, 1), flag=wx.ALIGN_RIGHT)
-
-        #
-        # font weight
-        #
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Weight:"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(2, 0))
-        self.fwtcb = wx.ComboBox(parent=self, size=(250, -1),
-                                 choices=self.fwtdict.keys(), style=wx.CB_DROPDOWN)
-        self.fwtcb.SetStringSelection('normal')
-        for item in self.fwtdict.items():
-            if self.fontweight == item[1]:
-                self.fwtcb.SetStringSelection(item[0])
-                break
-
-        gridSizer.Add(item=self.fwtcb, pos=(2, 1), flag=wx.ALIGN_RIGHT)
-                      
-        boxSizer.Add(item=gridSizer, flag=wx.EXPAND)
-        sizer.Add(item=boxSizer, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3)
-
-        line = wx.StaticLine(parent=self, id=wx.ID_ANY, size=(20, -1), style=wx.LI_HORIZONTAL)
-        sizer.Add(item=line, proportion=0,
-                  flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, border=3)
-
-        #
-        # buttons
-        #
-        btnSave = wx.Button(self, wx.ID_SAVE)
-        btnApply = wx.Button(self, wx.ID_APPLY)
-        btnOk = wx.Button(self, wx.ID_OK)
-        btnCancel = wx.Button(self, wx.ID_CANCEL)
-        btnOk.SetDefault()
-
-        # bindigs
-        btnApply.Bind(wx.EVT_BUTTON, self.OnApply)
-        btnApply.SetToolTipString(_("Apply changes for the current session"))
-        btnOk.Bind(wx.EVT_BUTTON, self.OnOk)
-        btnOk.SetToolTipString(_("Apply changes for the current session and close dialog"))
-        btnOk.SetDefault()
-        btnSave.Bind(wx.EVT_BUTTON, self.OnSave)
-        btnSave.SetToolTipString(_("Apply and save changes to user settings file (default for next sessions)"))
-        btnCancel.Bind(wx.EVT_BUTTON, self.OnCancel)
-        btnCancel.SetToolTipString(_("Close dialog and ignore changes"))
-
-        # sizers
-        btnStdSizer = wx.StdDialogButtonSizer()
-        btnStdSizer.AddButton(btnOk)
-        btnStdSizer.AddButton(btnApply)
-        btnStdSizer.AddButton(btnCancel)
-        btnStdSizer.Realize()
-        
-        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
-        btnSizer.Add(item=btnSave, proportion=0, flag=wx.ALIGN_LEFT | wx.ALL, border=5)
-        btnSizer.Add(item=btnStdSizer, proportion=0, flag=wx.ALIGN_RIGHT | wx.ALL, border=5)
-        sizer.Add(item=btnSizer, proportion=0, flag=wx.ALIGN_RIGHT | wx.ALL, border=5)
-
-        #
-        # bindings
-        #
-        self.ptitleentry.Bind(wx.EVT_TEXT, self.OnTitle)
-        self.xlabelentry.Bind(wx.EVT_TEXT, self.OnXLabel)
-        self.ylabelentry.Bind(wx.EVT_TEXT, self.OnYLabel)
-
-        self.SetSizer(sizer)
-        sizer.Fit(self)
-
-    def OnTitle(self, event):
-        self.ptitle = event.GetString()
-
-    def OnXLabel(self, event):
-        self.xlabel = event.GetString()
-
-    def OnYLabel(self, event):
-        self.ylabel = event.GetString()
-
-    def UpdateSettings(self):
-        self.properties['font']['prop']['titleSize'] = self.ptitlesize.GetValue()
-        self.properties['font']['prop']['axisSize'] = self.axislabelsize.GetValue()
-
-        family = self.ffamilydict[self.ffamilycb.GetStringSelection()]
-        self.properties['font']['wxfont'].SetFamily(family)
-        style = self.fstyledict[self.fstylecb.GetStringSelection()]
-        self.properties['font']['wxfont'].SetStyle(style)
-        weight = self.fwtdict[self.fwtcb.GetStringSelection()]
-        self.properties['font']['wxfont'].SetWeight(weight)
-
-    def OnSave(self, event):
-        """!Button 'Save' pressed"""
-        self.UpdateSettings()
-        fileSettings = {}
-        UserSettings.ReadSettingsFile(settings=fileSettings)
-        fileSettings['profile'] = UserSettings.Get(group='profile')
-        file = UserSettings.SaveToFile(fileSettings)
-        self.parent.parent.GetLayerManager().goutput.WriteLog(_('Profile settings saved to file \'%s\'.') % file)
-        self.EndModal(wx.ID_OK)
-
-    def OnApply(self, event):
-        """!Button 'Apply' pressed"""
-        self.UpdateSettings()
-        self.parent.OnPText(self)
-        
-    def OnOk(self, event):
-        """!Button 'OK' pressed"""
-        self.UpdateSettings()
-        self.EndModal(wx.ID_OK)
-
-    def OnCancel(self, event):
-        """!Button 'Cancel' pressed"""
-        self.EndModal(wx.ID_CANCEL)
-        
-class OptDialog(wx.Dialog):
-    def __init__(self, parent, id, title, pos=wx.DefaultPosition, size=wx.DefaultSize,
-                 style=wx.DEFAULT_DIALOG_STYLE): 
-        """!Dialog to set various profile options, including: line
-        width, color, style; marker size, color, fill, and style; grid
-        and legend options.
-        """
-        wx.Dialog.__init__(self, parent, id, title, pos, size, style)
-        # init variables
-        self.pstyledict = parent.pstyledict
-        self.ptfilldict = parent.ptfilldict
-
-        self.pttypelist = ['circle',
-                           'dot',
-                           'square',
-                           'triangle',
-                           'triangle_down',
-                           'cross',
-                           'plus']
-        
-        self.axislist = ['min',
-                         'auto',
-                         'custom']
-
-        # widgets ids
-        self.wxId = {}
-        
-        self.parent = parent
-
-        # read-only
-        self.raster = self.parent.raster
-        self.properties = self.parent.properties
-        
-        self._do_layout()
-
-    def _do_layout(self):
-        """!Do layout"""
-        # dialog layout
-        sizer = wx.BoxSizer(wx.VERTICAL)
-
-        #
-        # profile line settings
-        #
-        box = wx.StaticBox(parent=self, id=wx.ID_ANY,
-                           label=" %s " % _("Profile line settings"))
-        boxMainSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
-
-        idx = 1
-        self.wxId['pcolor'] = []
-        self.wxId['pwidth'] = []
-        self.wxId['pstyle'] = []
-        self.wxId['plegend'] = []
-        for r in self.raster.itervalues():
-            box = wx.StaticBox(parent=self, id=wx.ID_ANY,
-                               label=" %s %d " % (_("Profile"), idx))
-            boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-            
-            gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
-            row = 0            
-            label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Line color"))
-            gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(row, 0))
-            pcolor = csel.ColourSelect(parent=self, id=wx.ID_ANY, colour=r['prop']['pcolor'])
-            self.wxId['pcolor'].append(pcolor.GetId())
-            gridSizer.Add(item=pcolor, pos=(row, 1))
-
-            row += 1
-            label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Line width"))
-            gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(row, 0))
-            pwidth = wx.SpinCtrl(parent=self, id=wx.ID_ANY, value="",
-                                 size=(50,-1), style=wx.SP_ARROW_KEYS)
-            pwidth.SetRange(1, 10)
-            pwidth.SetValue(r['prop']['pwidth'])
-            self.wxId['pwidth'].append(pwidth.GetId())
-            gridSizer.Add(item=pwidth, pos=(row, 1))
-
-            row +=1
-            label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Line style"))
-            gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(row, 0))
-            pstyle = wx.ComboBox(parent=self, id=wx.ID_ANY, 
-                                 size=(120, -1), choices=self.pstyledict.keys(), style=wx.CB_DROPDOWN)
-            pstyle.SetStringSelection(r['prop']['pstyle'])
-            self.wxId['pstyle'].append(pstyle.GetId())
-            gridSizer.Add(item=pstyle, pos=(row, 1))
-
-            row += 1
-            label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Legend"))
-            gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(row, 0))
-            plegend = wx.TextCtrl(parent=self, id=wx.ID_ANY, value="", size=(200,-1))
-            plegend.SetValue(r['plegend'])
-            gridSizer.Add(item=plegend, pos=(row, 1))
-            self.wxId['plegend'].append(plegend.GetId())
-            boxSizer.Add(item=gridSizer)
-
-            if idx == 0:
-                flag = wx.ALL
-            else:
-                flag = wx.TOP | wx.BOTTOM | wx.RIGHT
-            boxMainSizer.Add(item=boxSizer, flag=flag, border=3)
-
-            idx += 1
-            
-        sizer.Add(item=boxMainSizer, flag=wx.ALL | wx.EXPAND, border=3)
-
-        middleSizer = wx.BoxSizer(wx.HORIZONTAL)
-        
-        #
-        # segment marker settings
-        #
-        box = wx.StaticBox(parent=self, id=wx.ID_ANY,
-                           label=" %s " % _("Transect segment marker settings"))
-        boxMainSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
-
-        self.wxId['marker'] = {}
-        gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Color"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(0, 0))
-        ptcolor = csel.ColourSelect(parent=self, id=wx.ID_ANY, colour=self.properties['marker']['color'])
-        self.wxId['marker']['color'] = ptcolor.GetId()
-        gridSizer.Add(item=ptcolor, pos=(0, 1))
-
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Size"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(1, 0))
-        ptsize = wx.SpinCtrl(parent=self, id=wx.ID_ANY, value="",
-                             size=(50, -1), style=wx.SP_ARROW_KEYS)
-        ptsize.SetRange(1, 10)
-        ptsize.SetValue(self.properties['marker']['size'])
-        self.wxId['marker']['size'] = ptsize.GetId()
-        gridSizer.Add(item=ptsize, pos=(1, 1))
-        
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Style"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(2, 0))
-        ptfill = wx.ComboBox(parent=self, id=wx.ID_ANY,
-                             size=(120, -1), choices=self.ptfilldict.keys(), style=wx.CB_DROPDOWN)
-        ptfill.SetStringSelection(self.properties['marker']['fill'])
-        self.wxId['marker']['fill'] = ptfill.GetId()
-        gridSizer.Add(item=ptfill, pos=(2, 1))
-        
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Legend"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(3, 0))
-        ptlegend = wx.TextCtrl(parent=self, id=wx.ID_ANY, value="", size=(200,-1))
-        ptlegend.SetValue(self.properties['marker']['legend'])
-        self.wxId['marker']['legend'] = ptlegend.GetId()
-        gridSizer.Add(item=ptlegend, pos=(3, 1))
-                
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Type"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(4, 0))
-        pttype = wx.ComboBox(parent=self, 
-                             size=(200, -1), choices=self.pttypelist, style=wx.CB_DROPDOWN)
-        pttype.SetStringSelection(self.properties['marker']['type'])
-        self.wxId['marker']['type'] = pttype.GetId()
-        gridSizer.Add(item=pttype, pos=(4, 1))
-
-        boxMainSizer.Add(item=gridSizer, flag=wx.ALL, border=3)
-        middleSizer.Add(item=boxMainSizer, flag=wx.ALL | wx.EXPAND, border=3)
-
-        #
-        # axis options
-        #
-        box = wx.StaticBox(parent=self, id=wx.ID_ANY,
-                           label=" %s " % _("Axis settings"))
-        boxMainSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
-
-        self.wxId['x-axis'] = {}
-        self.wxId['y-axis'] = {}
-        idx = 0
-        for axis, atype in [(_("X-Axis"), 'x-axis'),
-                     (_("Y-Axis"), 'y-axis')]:
-            box = wx.StaticBox(parent=self, id=wx.ID_ANY,
-                               label=" %s " % axis)
-            boxSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
-            gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
-
-            prop = self.properties[atype]['prop']
-            
-            row = 0
-            label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Style"))
-            gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(row, 0))
-            type = wx.ComboBox(parent=self, id=wx.ID_ANY,
-                               size=(100, -1), choices=self.axislist, style=wx.CB_DROPDOWN)
-            type.SetStringSelection(prop['type']) 
-            self.wxId[atype]['type'] = type.GetId()
-            gridSizer.Add(item=type, pos=(row, 1))
-            
-            row += 1
-            label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Custom min"))
-            gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(row, 0))
-            min = wx.TextCtrl(parent=self, id=wx.ID_ANY, value="", size=(70, -1))
-            min.SetValue(str(prop['min']))
-            self.wxId[atype]['min'] = min.GetId()
-            gridSizer.Add(item=min, pos=(row, 1))
-
-            row += 1
-            label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Custom max"))
-            gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(row, 0))
-            max = wx.TextCtrl(parent=self, id=wx.ID_ANY, value="", size=(70, -1))
-            max.SetValue(str(prop['max']))
-            self.wxId[atype]['max'] = max.GetId()
-            gridSizer.Add(item=max, pos=(row, 1))
-            
-            row += 1
-            log = wx.CheckBox(parent=self, id=wx.ID_ANY, label=_("Log scale"))
-            log.SetValue(prop['log'])
-            self.wxId[atype]['log'] = log.GetId()
-            gridSizer.Add(item=log, pos=(row, 0), span=(1, 2))
-
-            if idx == 0:
-                flag = wx.ALL | wx.EXPAND
-            else:
-                flag = wx.TOP | wx.BOTTOM | wx.RIGHT | wx.EXPAND
-
-            boxSizer.Add(item=gridSizer, flag=wx.ALL, border=3)
-            boxMainSizer.Add(item=boxSizer, flag=flag, border=3)
-
-            idx += 1
-            
-        middleSizer.Add(item=boxMainSizer, flag=wx.ALL | wx.EXPAND, border=3)
-
-        #
-        # grid & legend options
-        #
-        self.wxId['grid'] = {}
-        self.wxId['legend'] = {}
-        self.wxId['font'] = {}
-        box = wx.StaticBox(parent=self, id=wx.ID_ANY,
-                           label=" %s " % _("Grid and Legend settings"))
-        boxMainSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
-        gridSizer = wx.GridBagSizer(vgap=5, hgap=5)
-
-        row = 0
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Grid color"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(row, 0))
-        gridcolor = csel.ColourSelect(parent=self, id=wx.ID_ANY, colour=self.properties['grid']['color'])
-        self.wxId['grid']['color'] = gridcolor.GetId()
-        gridSizer.Add(item=gridcolor, pos=(row, 1))
-
-        row +=1
-        gridshow = wx.CheckBox(parent=self, id=wx.ID_ANY, label=_("Show grid"))
-        gridshow.SetValue(self.properties['grid']['enabled'])
-        self.wxId['grid']['enabled'] = gridshow.GetId()
-        gridSizer.Add(item=gridshow, pos=(row, 0), span=(1, 2))
-
-        row +=1
-        label = wx.StaticText(parent=self, id=wx.ID_ANY, label=_("Legend font size"))
-        gridSizer.Add(item=label, flag=wx.ALIGN_CENTER_VERTICAL, pos=(row, 0))
-        legendfontsize = wx.SpinCtrl(parent=self, id=wx.ID_ANY, value="", 
-                                     size=(50, -1), style=wx.SP_ARROW_KEYS)
-        legendfontsize.SetRange(5,100)
-        legendfontsize.SetValue(int(self.properties['font']['prop']['legendSize']))
-        self.wxId['font']['legendSize'] = legendfontsize.GetId()
-        gridSizer.Add(item=legendfontsize, pos=(row, 1))
-
-        row += 1
-        legendshow = wx.CheckBox(parent=self, id=wx.ID_ANY, label=_("Show legend"))
-        legendshow.SetValue(self.properties['legend']['enabled'])
-        self.wxId['legend']['enabled'] = legendshow.GetId()
-        gridSizer.Add(item=legendshow, pos=(row, 0), span=(1, 2))
-
-        boxMainSizer.Add(item=gridSizer, flag=flag, border=3)
-
-        middleSizer.Add(item=boxMainSizer, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border=3)
-
-        sizer.Add(item=middleSizer, flag=wx.ALL, border=0)
-        
-        #
-        # line & buttons
-        #
-        line = wx.StaticLine(parent=self, id=wx.ID_ANY, size=(20, -1), style=wx.LI_HORIZONTAL)
-        sizer.Add(item=line, proportion=0,
-                  flag=wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, border=3)
-
-        #
-        # buttons
-        #
-        btnSave = wx.Button(self, wx.ID_SAVE)
-        btnApply = wx.Button(self, wx.ID_APPLY)
-        btnCancel = wx.Button(self, wx.ID_CANCEL)
-        btnSave.SetDefault()
-
-        # bindigs
-        btnApply.Bind(wx.EVT_BUTTON, self.OnApply)
-        btnApply.SetToolTipString(_("Apply changes for the current session"))
-        btnSave.Bind(wx.EVT_BUTTON, self.OnSave)
-        btnSave.SetToolTipString(_("Apply and save changes to user settings file (default for next sessions)"))
-        btnSave.SetDefault()
-        btnCancel.Bind(wx.EVT_BUTTON, self.OnCancel)
-        btnCancel.SetToolTipString(_("Close dialog and ignore changes"))
-
-        # sizers
-        btnStdSizer = wx.StdDialogButtonSizer()
-        btnStdSizer.AddButton(btnCancel)
-        btnStdSizer.AddButton(btnSave)
-        btnStdSizer.AddButton(btnApply)
-        btnStdSizer.Realize()
-        
-        sizer.Add(item=btnStdSizer, proportion=0, flag=wx.ALIGN_RIGHT | wx.ALL, border=5)
-
-        self.SetSizer(sizer)
-        sizer.Fit(self)
-
-    def UpdateSettings(self):
-        idx = 0
-        for r in self.raster.itervalues():
-            r['prop']['pcolor'] = self.FindWindowById(self.wxId['pcolor'][idx]).GetColour()
-            r['prop']['pwidth'] = int(self.FindWindowById(self.wxId['pwidth'][idx]).GetValue())
-            r['prop']['pstyle'] = self.FindWindowById(self.wxId['pstyle'][idx]).GetStringSelection()
-            r['plegend'] = self.FindWindowById(self.wxId['plegend'][idx]).GetValue()
-            idx +=1
-
-        self.properties['marker']['color'] = self.FindWindowById(self.wxId['marker']['color']).GetColour()
-        self.properties['marker']['fill'] = self.FindWindowById(self.wxId['marker']['fill']).GetStringSelection()
-        self.properties['marker']['size'] = self.FindWindowById(self.wxId['marker']['size']).GetValue()
-        self.properties['marker']['type'] = self.FindWindowById(self.wxId['marker']['type']).GetValue()
-        self.properties['marker']['legend'] = self.FindWindowById(self.wxId['marker']['legend']).GetValue()
-
-        for axis in ('x-axis', 'y-axis'):
-            self.properties[axis]['prop']['type'] = self.FindWindowById(self.wxId[axis]['type']).GetValue()
-            self.properties[axis]['prop']['min'] = float(self.FindWindowById(self.wxId[axis]['min']).GetValue())
-            self.properties[axis]['prop']['max'] = float(self.FindWindowById(self.wxId[axis]['max']).GetValue())
-            self.properties[axis]['prop']['log'] = self.FindWindowById(self.wxId[axis]['log']).IsChecked()
-
-        self.properties['grid']['color'] = self.FindWindowById(self.wxId['grid']['color']).GetColour()
-        self.properties['grid']['enabled'] = self.FindWindowById(self.wxId['grid']['enabled']).IsChecked()
-
-        self.properties['font']['prop']['legendSize'] = self.FindWindowById(self.wxId['font']['legendSize']).GetValue()
-        self.properties['legend']['enabled'] = self.FindWindowById(self.wxId['legend']['enabled']).IsChecked()
-
-    def OnSave(self, event):
-        """!Button 'Save' pressed"""
-        self.UpdateSettings()
-        fileSettings = {}
-        UserSettings.ReadSettingsFile(settings=fileSettings)
-        fileSettings['profile'] = UserSettings.Get(group='profile')
-        file = UserSettings.SaveToFile(fileSettings)
-        self.parent.parent.GetLayerManager().goutput.WriteLog(_('Profile settings saved to file \'%s\'.') % file)
-        self.parent.SetGraphStyle()
-        if self.parent.profile:
-            self.parent.DrawPlot()
-        self.Close()
-
-    def OnApply(self, event):
-        """!Button 'Apply' pressed. Does not close dialog"""
-        self.UpdateSettings()
-        self.parent.SetGraphStyle()
-        if self.parent.profile:
-            self.parent.DrawPlot()
-        
-    def OnCancel(self, event):
-        """!Button 'Cancel' pressed"""
-        self.Close()
diff --git a/gui/wxpython/gui_modules/toolbars.py b/gui/wxpython/gui_modules/toolbars.py
deleted file mode 100644
index fa79e3c..0000000
--- a/gui/wxpython/gui_modules/toolbars.py
+++ /dev/null
@@ -1,1608 +0,0 @@
-"""!
- at package toolbar
-
- at brief wxGUI toolbar widgets
-
-Classes:
- - AbstractToolbar
- - MapToolbar
- - GCPMapToolbar
- - GCPDisplayToolbar
- - VDigitToolbar
- - ProfileToolbar
- - NvizToolbar
- - ModelToolbar
- - HistogramToolbar
- - LMWorkspaceToolbar
- - LMDataToolbar
- - LMToolsToolbar
- - LMMiscToolbar
- - LMVectorToolbar
- - PsMapToolbar
-
-(C) 2007-2011 by the GRASS Development Team
-This program is free software under the GNU General Public License
-(>=v2). Read the file COPYING that comes with GRASS for details.
-
- at author Michael Barton
- at author Jachym Cepicky
- at author Martin Landa <landa.martin gmail.com>
- at author Anna Kratochvilova <anna.kratochvilova fsv.cvut.cz>
-"""
-
-import os
-import sys
-import platform
-
-from grass.script import core as grass
-
-import wx
-
-import globalvar
-import gcmd
-import gdialogs
-from vdigit import VDigitSettingsDialog, haveVDigit, VDigit
-from debug import Debug
-from preferences import globalSettings as UserSettings
-from nviz import haveNviz
-from nviz_preferences import NvizPreferencesDialog
-
-sys.path.append(os.path.join(globalvar.ETCWXDIR, "icons"))
-from icon import Icons
-
-class AbstractToolbar(wx.ToolBar):
-    """!Abstract toolbar class"""
-    def __init__(self, parent):
-        self.parent = parent
-        wx.ToolBar.__init__(self, parent = self.parent, id = wx.ID_ANY)
-        
-        self.action = dict()
-        
-        self.Bind(wx.EVT_TOOL, self.OnTool)
-        
-        self.SetToolBitmapSize(globalvar.toolbarSize)
-        
-    def InitToolbar(self, toolData):
-        """!Initialize toolbar, add tools to the toolbar
-        """
-        for tool in toolData:
-            self.CreateTool(*tool)
-        
-        self._data = toolData
-        
-    def _toolbarData(self):
-        """!Toolbar data (virtual)"""
-        return None
-    
-    def CreateTool(self, label, bitmap, kind,
-                   shortHelp, longHelp, handler):
-        """!Add tool to the toolbar
-        
-        @return id of tool
-        """
-        bmpDisabled = wx.NullBitmap
-        tool = -1
-        if label: 
-            tool = vars(self)[label] = wx.NewId()
-            Debug.msg(3, "CreateTool(): tool=%d, label=%s bitmap=%s" % \
-                          (tool, label, bitmap))
-            
-            toolWin = self.AddLabelTool(tool, label, bitmap,
-                                        bmpDisabled, kind,
-                                        shortHelp, longHelp)
-            self.Bind(wx.EVT_TOOL, handler, toolWin)
-        else: # separator
-            self.AddSeparator()
-        
-        return tool
-    
-    def EnableLongHelp(self, enable = True):
-        """!Enable/disable long help
-        
-        @param enable True for enable otherwise disable
-        """
-        for tool in self._data:
-            if tool[0] == '': # separator
-                continue
-            
-            if enable:
-                self.SetToolLongHelp(vars(self)[tool[0]], tool[4])
-            else:
-                self.SetToolLongHelp(vars(self)[tool[0]], "")
-        
-    def OnTool(self, event):
-        """!Tool selected
-        """
-        if self.parent.GetName() == "GCPFrame":
-            return
-        
-        if hasattr(self.parent, 'toolbars'):
-            if self.parent.toolbars['vdigit']:
-                # update vdigit toolbar (unselect currently selected tool)
-                id = self.parent.toolbars['vdigit'].GetAction(type = 'id')
-                self.parent.toolbars['vdigit'].ToggleTool(id, False)
-        
-        if event:
-            # deselect previously selected tool
-            id = self.action.get('id', -1)
-            if id != event.GetId():
-                self.ToggleTool(self.action['id'], False)
-            else:
-                self.ToggleTool(self.action['id'], True)
-            
-            self.action['id'] = event.GetId()
-            
-            event.Skip()
-        else:
-            # initialize toolbar
-            self.ToggleTool(self.action['id'], True)
-        
-    def GetAction(self, type = 'desc'):
-        """!Get current action info"""
-        return self.action.get(type, '')
-    
-    def SelectDefault(self, event):
-        """!Select default tool"""
-        self.ToggleTool(self.defaultAction['id'], True)
-        self.defaultAction['bind'](event)
-        self.action = { 'id' : self.defaultAction['id'],
-                        'desc' : self.defaultAction.get('desc', '') }
-        
-    def FixSize(self, width):
-	"""!Fix toolbar width on Windows
-        
-	@todo Determine why combobox causes problems here
-	"""
-        if platform.system() == 'Windows':
-            size = self.GetBestSize()
-            self.SetSize((size[0] + width, size[1]))
-
-    def Enable(self, tool, enable = True):
-        """!Enable defined tool
-        
-        @param tool name
-        @param enable True to enable otherwise disable tool
-        """
-        try:
-            id = getattr(self, tool)
-        except AttributeError:
-            return
-        
-        self.EnableTool(id, enable)
-        
-    def _getToolbarData(self, data):
-        """!Define tool
-        """
-        retData = list()
-        for args in data:
-            retData.append(self._defineTool(*args))
-        
-        return retData
-
-    def _defineTool(self, name = None, icon = None, handler = None, item = wx.ITEM_NORMAL):
-        """!Define tool
-        """
-        if name:
-            return (name, icon.GetBitmap(),
-                    item, icon.GetLabel(), icon.GetDesc(),
-                    handler)
-        return ("", "", "", "", "", "") # separator
-    
-class MapToolbar(AbstractToolbar):
-    """!Map Display toolbar
-    """
-    def __init__(self, parent, mapcontent):
-        """!Map Display constructor
-
-        @param parent reference to MapFrame
-        @param mapcontent reference to render.Map (registred by MapFrame)
-        """
-        self.mapcontent = mapcontent # render.Map
-        AbstractToolbar.__init__(self, parent = parent) # MapFrame
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # optional tools
-        choices = [ _('2D view'), ]
-        self.toolId = { '2d' : 0 }
-        if self.parent.GetLayerManager():
-            log = self.parent.GetLayerManager().GetLogWindow()
-        
-        if haveNviz:
-            choices.append(_('3D view'))
-            self.toolId['3d'] = 1
-        else:
-            from nviz import errorMsg
-            ### log.WriteCmdLog(_('3D view mode not available'))
-            ### log.WriteWarning(_('Reason: %s') % str(errorMsg))
-            ### log.WriteLog(_('Note that the wxGUI\'s 3D view mode is currently disabled '
-            ### 'on MS Windows (hopefully this will be fixed soon). '
-            ### 'Please keep an eye out for updated versions of GRASS. '
-            ### 'In the meantime you can use "NVIZ" from the File menu.'), wrap = 60)
-            
-            self.toolId['3d'] = -1
-
-        if haveVDigit:
-            choices.append(_('Digitize'))
-            if self.toolId['3d'] > -1:
-                self.toolId['vdigit'] = 2
-            else:
-                self.toolId['vdigit'] = 1
-        else:
-            from vdigit import errorMsg
-            log.WriteCmdLog(_('Vector digitizer not available'))
-            log.WriteWarning(_('Reason: %s') % errorMsg)
-            log.WriteLog(_('Note that the wxGUI\'s vector digitizer is currently disabled '
-                           '(hopefully this will be fixed soon). '
-                           'Please keep an eye out for updated versions of GRASS. '
-                           'In the meantime you can use "v.digit" from the Develop Vector menu.'), wrap = 60)
-            
-            self.toolId['vdigit'] = -1
-        
-        self.combo = wx.ComboBox(parent = self, id = wx.ID_ANY,
-                                 choices = choices,
-                                 style = wx.CB_READONLY, size = (110, -1))
-        self.combo.SetSelection(0)
-        
-        self.comboid = self.AddControl(self.combo)
-        self.parent.Bind(wx.EVT_COMBOBOX, self.OnSelectTool, self.comboid)
-        
-        # realize the toolbar
-        self.Realize()
-        
-        # workaround for Mac bug. May be fixed by 2.8.8, but not before then.
-        self.combo.Hide()
-        self.combo.Show()
-        
-        self.action = { 'id' : self.pointer }
-        self.defaultAction = { 'id' : self.pointer,
-                               'bind' : self.parent.OnPointer }
-        
-        self.OnTool(None)
-        
-        self.EnableTool(self.zoomback, False)
-        
-        self.FixSize(width = 90)
-        
-    def _toolbarData(self):
-        """!Toolbar data"""
-        icons = Icons['displayWindow']
-        return self._getToolbarData((('displaymap', icons['display'],
-                                      self.parent.OnDraw),
-                                     ('rendermap', icons['render'],
-                                      self.parent.OnRender),
-                                     ('erase', icons['erase'],
-                                      self.parent.OnErase),
-                                     (None, ),
-                                     ('pointer', icons['pointer'],
-                                      self.parent.OnPointer,
-                                      wx.ITEM_CHECK),
-                                     ('query', icons['query'],
-                                      self.parent.OnQuery,
-                                      wx.ITEM_CHECK),
-                                     ('pan', icons['pan'],
-                                      self.parent.OnPan,
-                                      wx.ITEM_CHECK),
-                                     ('zoomin', icons['zoomIn'],
-                                      self.parent.OnZoomIn,
-                                      wx.ITEM_CHECK),
-                                     ('zoomout', icons['zoomOut'],
-                                      self.parent.OnZoomOut,
-                                      wx.ITEM_CHECK),
-                                     ('zoomextent', icons['zoomExtent'],
-                                      self.parent.OnZoomToMap),
-                                     ('zoomback', icons['zoomBack'],
-                                      self.parent.OnZoomBack),
-                                     ('zoommenu', icons['zoomMenu'],
-                                      self.parent.OnZoomMenu),
-                                     (None, ),
-                                     ('analyze', icons['analyze'],
-                                      self.parent.OnAnalyze),
-                                     (None, ),
-                                     ('dec', icons['overlay'],
-                                      self.parent.OnDecoration),
-                                     (None, ),
-                                     ('savefile', icons['saveFile'],
-                                      self.parent.SaveToFile),
-                                     ('printmap', icons['print'],
-                                      self.parent.PrintMenu),
-                                     (None, ))
-                                    )
-    
-    def OnSelectTool(self, event):
-        """!Select / enable tool available in tools list
-        """
-        tool =  event.GetSelection()
-        
-        if tool == self.toolId['2d']:
-            self.ExitToolbars()
-            self.Enable2D(True)
-        
-        elif tool == self.toolId['3d'] and \
-                not self.parent.toolbars['nviz']:
-            self.ExitToolbars()
-            self.parent.AddToolbar("nviz")
-            
-        elif tool == self.toolId['vdigit'] and \
-                not self.parent.toolbars['vdigit']:
-            self.ExitToolbars()
-            self.parent.AddToolbar("vdigit")
-            self.parent.MapWindow.SetFocus()
-        
-    def ExitToolbars(self):
-        if self.parent.toolbars['vdigit']:
-            self.parent.toolbars['vdigit'].OnExit()
-        if self.parent.toolbars['nviz']:       
-            self.parent.toolbars['nviz'].OnExit()
-        
-    def Enable2D(self, enabled):
-        """!Enable/Disable 2D display mode specific tools"""
-        for tool in (self.pointer,
-                     self.pan,
-                     self.zoomin,
-                     self.zoomout,
-                     self.zoomback,
-                     self.zoommenu,
-                     self.analyze,
-                     self.dec,
-                     self.printmap):
-            self.EnableTool(tool, enabled)
-        
-class GCPManToolbar(AbstractToolbar):
-    """!Toolbar for managing ground control points
-
-    @param parent reference to GCP widget
-    """
-    def __init__(self, parent):
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # realize the toolbar
-        self.Realize()
-
-    def _toolbarData(self):
-        icons = Icons['georectify']
-        return self._getToolbarData((('gcpSave', icons["gcpSave"],
-                                      self.parent.SaveGCPs),
-                                     ('gcpReload', icons["gcpReload"],
-                                      self.parent.ReloadGCPs),
-                                     (None, ),
-                                     ('gcpAdd', icons["gcpAdd"],
-                                      self.parent.AddGCP),
-                                     ('gcpDelete', icons["gcpDelete"],
-                                      self.parent.DeleteGCP),
-                                     ('gcpClear', icons["gcpClear"],
-                                      self.parent.ClearGCP),
-                                     (None, ),
-                                     ('rms', icons["gcpRms"],
-                                      self.parent.OnRMS),
-                                     ('georect', icons["georectify"],
-                                      self.parent.OnGeorect))
-                                    )
-    
-class GCPDisplayToolbar(AbstractToolbar):
-    """
-    GCP Display toolbar
-    """
-    def __init__(self, parent):
-        """!
-        GCP Display toolbar constructor
-        """
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # add tool to toggle active map window
-        self.togglemapid = wx.NewId()
-        self.togglemap = wx.Choice(parent = self, id = self.togglemapid,
-						    choices = [_('source'), _('target')],
-						    style = wx.CB_READONLY)
-
-        self.InsertControl(10, self.togglemap)
-
-        self.SetToolShortHelp(self.togglemapid, '%s %s %s' % (_('Set map canvas for '),
-                                                              Icons['displayWindow']["zoomBack"].GetLabel(),
-                                                              _(' / Zoom to map')))
-
-        # realize the toolbar
-        self.Realize()
-        
-        self.action = { 'id' : self.gcpset }
-        self.defaultAction = { 'id' : self.gcpset,
-                               'bind' : self.parent.OnPointer }
-        
-        self.OnTool(None)
-        
-        self.EnableTool(self.zoomback, False)
-        
-    def _toolbarData(self):
-        """!Toolbar data"""
-        icons = Icons['displayWindow']
-        return self._getToolbarData((("displaymap", icons["display"],
-                                      self.parent.OnDraw),
-                                     ("rendermap", icons["render"],
-                                      self.parent.OnRender),
-                                     ("erase", icons["erase"],
-                                      self.parent.OnErase),
-                                     (None, ),
-                                     ("gcpset", Icons["georectify"]["gcpSet"],
-                                      self.parent.OnPointer),
-                                     ("pan", icons["pan"],
-                                      self.parent.OnPan),
-                                     ("zoomin", icons["zoomIn"],
-                                      self.parent.OnZoomIn),
-                                     ("zoomout", icons["zoomOut"],
-                                      self.parent.OnZoomOut),
-                                     ("zoommenu", icons["zoomMenu"],
-                                      self.parent.OnZoomMenuGCP),
-                                     (None, ),
-                                     ("zoomback", icons["zoomBack"],
-                                      self.parent.OnZoomBack),
-                                     ("zoomtomap", icons["zoomExtent"],
-                                      self.parent.OnZoomToMap),
-                                     (None, ),
-                                     ('settings', Icons["georectify"]["settings"],
-                                      self.parent.OnSettings),
-                                     ('help', Icons["misc"]["help"],
-                                      self.parent.OnHelp),
-                                     (None, ),
-                                     ('quit', Icons["georectify"]["quit"],
-                                      self.parent.OnQuit))
-                                    )
-    
-    def OnZoomMap(self, event):
-        """!Zoom to selected map"""
-        self.parent.MapWindow.ZoomToMap(layers = self.mapcontent.GetListOfLayers())
-        if event:
-            event.Skip()
-        
-class VDigitToolbar(AbstractToolbar):
-    """!Toolbar for digitization
-    """
-    def __init__(self, parent, mapcontent, layerTree = None, log = None):
-        self.mapcontent    = mapcontent # Map class instance
-        self.layerTree     = layerTree  # reference to layer tree associated to map display
-        self.log           = log        # log area
-        AbstractToolbar.__init__(self, parent)
-        self.digit         = None
-        
-        # currently selected map layer for editing (reference to MapLayer instance)
-        self.mapLayer = None
-        # list of vector layers from Layer Manager (only in the current mapset)
-        self.layers   = [] 
-        
-        self.comboid    = None
-        
-        # only one dialog can be open
-        self.settingsDialog   = None
-        
-        # create toolbars (two rows optionally)
-        self.InitToolbar(self._toolbarData())
-        self.Bind(wx.EVT_TOOL, self.OnTool)
-        
-        # default action (digitize new point, line, etc.)
-        self.action = { 'desc' : '',
-                        'type' : '',
-                        'id'   : -1 }
-        
-        # list of available vector maps
-        self.UpdateListOfLayers(updateTool = True)
-        
-        # realize toolbar
-        self.Realize()
-        # workaround for Mac bug. May be fixed by 2.8.8, but not before then.
-        self.combo.Hide()
-        self.combo.Show()
-        
-        # disable undo/redo
-        self.EnableTool(self.undo, False)
-        
-        ### hide undo before releasing 6.4.2 - this tool is quite buggy in GRASS 6
-        self.RemoveTool(self.undo)
-        
-        # toogle to pointer by default
-        self.OnTool(None)
-        
-        self.FixSize(width = 105)
-        
-    def _toolbarData(self):
-        """!Toolbar data
-        """
-        data = []
-        icons = Icons['vdigit']
-        return self._getToolbarData(((None, ),
-                                     ("addPoint", icons["addPoint"],
-                                      self.OnAddPoint,
-                                      wx.ITEM_CHECK),
-                                     ("addLine", icons["addLine"],
-                                      self.OnAddLine,
-                                      wx.ITEM_CHECK),
-                                     ("addBoundary", icons["addBoundary"],
-                                      self.OnAddBoundary,
-                                      wx.ITEM_CHECK),
-                                     ("addCentroid", icons["addCentroid"],
-                                      self.OnAddCentroid,
-                                      wx.ITEM_CHECK),
-                                     ("addArea", icons["addArea"],
-                                      self.OnAddArea,
-                                      wx.ITEM_CHECK),
-                                     ("moveVertex", icons["moveVertex"],
-                                      self.OnMoveVertex,
-                                      wx.ITEM_CHECK),
-                                     ("addVertex", icons["addVertex"],
-                                      self.OnAddVertex,
-                                      wx.ITEM_CHECK),
-                                     ("removeVertex", icons["removeVertex"],
-                                      self.OnRemoveVertex,
-                                      wx.ITEM_CHECK),
-                                     ("editLine", icons["editLine"],
-                                      self.OnEditLine,
-                                      wx.ITEM_CHECK),
-                                     ("moveLine", icons["moveLine"],
-                                      self.OnMoveLine,
-                                      wx.ITEM_CHECK),
-                                     ("deleteLine", icons["deleteLine"],
-                                      self.OnDeleteLine,
-                                      wx.ITEM_CHECK),
-                                     ("displayCats", icons["displayCats"],
-                                      self.OnDisplayCats,
-                                      wx.ITEM_CHECK),
-                                     ("displayAttr", icons["displayAttr"],
-                                      self.OnDisplayAttr,
-                                      wx.ITEM_CHECK),
-                                     ("additionalTools", icons["additionalTools"],
-                                      self.OnAdditionalToolMenu,
-                                      wx.ITEM_CHECK),                                      
-                                     (None, ),
-                                     ("undo", icons["undo"],
-                                      self.OnUndo),
-                                     ("settings", icons["settings"],
-                                      self.OnSettings),
-                                     ("quit", icons["quit"],
-                                      self.OnExit))
-                                    )
-    
-    def OnTool(self, event):
-        """!Tool selected -> disable selected tool in map toolbar"""
-        aId = self.parent.toolbars['map'].GetAction(type = 'id')
-        self.parent.toolbars['map'].ToggleTool(aId, False)
-        
-        # set cursor
-        cursor = self.parent.cursors["cross"]
-        self.parent.MapWindow.SetCursor(cursor)
-        
-        # pointer
-        self.parent.OnPointer(None)
-        
-        if event:
-            # deselect previously selected tool
-            aId = self.action.get('id', -1)
-            if aId != event.GetId() and \
-                    self.action['id'] != -1:
-                self.ToggleTool(self.action['id'], False)
-            else:
-                self.ToggleTool(self.action['id'], True)
-            
-            self.action['id'] = event.GetId()
-            
-            event.Skip()
-        
-        if self.action['id'] != -1:
-            self.ToggleTool(self.action['id'], True)
-        
-        # clear tmp canvas
-        if self.action['id'] != aId:
-            self.parent.MapWindow.ClearLines(pdc = self.parent.MapWindow.pdcTmp)
-            if self.digit and \
-                    len(self.parent.MapWindow.digit.GetDisplay().GetSelected()) > 0:
-                # cancel action
-                self.parent.MapWindow.OnMiddleDown(None)
-        
-        # set focus
-        self.parent.MapWindow.SetFocus()
-        
-    def OnAddPoint(self, event):
-        """!Add point to the vector map Laier"""
-        Debug.msg (2, "VDigitToolbar.OnAddPoint()")
-        self.action = { 'desc' : "addLine",
-                        'type' : "point",
-                        'id'   : self.addPoint }
-        self.parent.MapWindow.mouse['box'] = 'point'
-        
-    def OnAddLine(self, event):
-        """!Add line to the vector map layer"""
-        Debug.msg (2, "VDigitToolbar.OnAddLine()")
-        self.action = { 'desc' : "addLine",
-                        'type' : "line",
-                        'id'   : self.addLine }
-        self.parent.MapWindow.mouse['box'] = 'line'
-        ### self.parent.MapWindow.polycoords = [] # reset temp line
-                
-    def OnAddBoundary(self, event):
-        """!Add boundary to the vector map layer"""
-        Debug.msg (2, "VDigitToolbar.OnAddBoundary()")
-        if self.action['desc'] != 'addLine' or \
-                self.action['type'] != 'boundary':
-            self.parent.MapWindow.polycoords = [] # reset temp line
-        self.action = { 'desc' : "addLine",
-                        'type' : "boundary",
-                        'id'   : self.addBoundary }
-        self.parent.MapWindow.mouse['box'] = 'line'
-        
-    def OnAddCentroid(self, event):
-        """!Add centroid to the vector map layer"""
-        Debug.msg (2, "VDigitToolbar.OnAddCentroid()")
-        self.action = { 'desc' : "addLine",
-                        'type' : "centroid",
-                        'id'   : self.addCentroid }
-        self.parent.MapWindow.mouse['box'] = 'point'
-
-    def OnAddArea(self, event):
-        """!Add area to the vector map layer"""
-        Debug.msg (2, "VDigitToolbar.OnAddCentroid()")
-        self.action = { 'desc' : "addLine",
-                        'type' : "area",
-                        'id'   : self.addArea }
-        self.parent.MapWindow.mouse['box'] = 'line'
-
-    def OnExit (self, event=None):
-        """!Quit digitization tool"""
-        # stop editing of the currently selected map layer
-        if self.mapLayer:
-            self.StopEditing()
-        
-        # close dialogs if still open
-        if self.settingsDialog:
-            self.settingsDialog.OnCancel(None)
-            
-        # set default mouse settings
-        self.parent.MapWindow.mouse['use'] = "pointer"
-        self.parent.MapWindow.mouse['box'] = "point"
-        self.parent.MapWindow.polycoords = []
-        
-        # disable the toolbar
-        self.parent.RemoveToolbar("vdigit")
-        
-    def OnMoveVertex(self, event):
-        """!Move line vertex"""
-        Debug.msg(2, "Digittoolbar.OnMoveVertex():")
-        self.action = { 'desc' : "moveVertex",
-                        'id'   : self.moveVertex }
-        self.parent.MapWindow.mouse['box'] = 'point'
-
-    def OnAddVertex(self, event):
-        """!Add line vertex"""
-        Debug.msg(2, "Digittoolbar.OnAddVertex():")
-        self.action = { 'desc' : "addVertex",
-                        'id'   : self.addVertex }
-        self.parent.MapWindow.mouse['box'] = 'point'
-        
-    def OnRemoveVertex(self, event):
-        """!Remove line vertex"""
-        Debug.msg(2, "Digittoolbar.OnRemoveVertex():")
-        self.action = { 'desc' : "removeVertex",
-                        'id'   : self.removeVertex }
-        self.parent.MapWindow.mouse['box'] = 'point'
-
-    def OnEditLine(self, event):
-        """!Edit line"""
-        Debug.msg(2, "Digittoolbar.OnEditLine():")
-        self.action = { 'desc' : "editLine",
-                        'id'   : self.editLine }
-        self.parent.MapWindow.mouse['box'] = 'line'
-
-    def OnMoveLine(self, event):
-        """!Move line"""
-        Debug.msg(2, "Digittoolbar.OnMoveLine():")
-        self.action = { 'desc' : "moveLine",
-                        'id'   : self.moveLine }
-        self.parent.MapWindow.mouse['box'] = 'box'
-
-    def OnDeleteLine(self, event):
-        """!Delete line"""
-        Debug.msg(2, "Digittoolbar.OnDeleteLine():")
-        self.action = { 'desc' : "deleteLine",
-                        'id'   : self.deleteLine }
-        self.parent.MapWindow.mouse['box'] = 'box'
-
-    def OnDisplayCats(self, event):
-        """!Display/update categories"""
-        Debug.msg(2, "Digittoolbar.OnDisplayCats():")
-        self.action = { 'desc' : "displayCats",
-                        'id'   : self.displayCats }
-        self.parent.MapWindow.mouse['box'] = 'point'
-
-    def OnDisplayAttr(self, event):
-        """!Display/update attributes"""
-        Debug.msg(2, "Digittoolbar.OnDisplayAttr():")
-        self.action = { 'desc' : "displayAttrs",
-                        'id'   : self.displayAttr }
-        self.parent.MapWindow.mouse['box'] = 'point'
-        
-    def OnUndo(self, event):
-        """!Undo previous changes"""
-        self.digit.Undo()
-        
-        event.Skip()
-
-    def EnableUndo(self, enable=True):
-        """!Enable 'Undo' in toolbar
-        
-        @param enable False for disable
-        """
-        if enable:
-            if self.GetToolEnabled(self.undo) is False:
-                self.EnableTool(self.undo, True)
-        else:
-            if self.GetToolEnabled(self.undo) is True:
-                self.EnableTool(self.undo, False)
-        
-    def OnSettings(self, event):
-        """!Show settings dialog"""
-        if self.digit is None:
-            try:
-                self.digit = self.parent.MapWindow.digit = VDigit(mapwindow = self.parent.MapWindow)
-            except SystemExit:
-                self.digit = self.parent.MapWindow.digit = None
-        
-        if not self.settingsDialog:
-            self.settingsDialog = VDigitSettingsDialog(parent = self.parent, title = _("Digitization settings"),
-                                                       style = wx.DEFAULT_DIALOG_STYLE)
-            self.settingsDialog.Show()
-
-    def OnAdditionalToolMenu(self, event):
-        """!Menu for additional tools"""
-        point = wx.GetMousePosition()
-        toolMenu = wx.Menu()
-        
-        for label, itype, handler, desc in (
-            (_('Break selected lines/boundaries at intersection'),
-             wx.ITEM_CHECK, self.OnBreak, "breakLine"),
-            (_('Connect selected lines/boundaries'),
-             wx.ITEM_CHECK, self.OnConnect, "connectLine"),
-            (_('Copy categories'),
-             wx.ITEM_CHECK, self.OnCopyCats, "copyCats"),
-            (_('Copy features from (background) vector map'),
-             wx.ITEM_CHECK, self.OnCopy, "copyLine"),
-            (_('Copy attributes'),
-             wx.ITEM_CHECK, self.OnCopyAttrb, "copyAttrs"),
-            (_('Feature type conversion'),
-             wx.ITEM_CHECK, self.OnTypeConversion, "typeConv"),
-            (_('Flip selected lines/boundaries'),
-             wx.ITEM_CHECK, self.OnFlip, "flipLine"),
-            (_('Merge selected lines/boundaries'),
-             wx.ITEM_CHECK, self.OnMerge, "mergeLine"),
-            (_('Snap selected lines/boundaries (only to nodes)'),
-             wx.ITEM_CHECK, self.OnSnap, "snapLine"),
-            (_('Split line/boundary'),
-             wx.ITEM_CHECK, self.OnSplitLine, "splitLine"),
-            (_('Query features'),
-             wx.ITEM_CHECK, self.OnQuery, "queryLine"),
-            (_('Z bulk-labeling of 3D lines'),
-             wx.ITEM_CHECK, self.OnZBulk, "zbulkLine")):
-            # Add items to the menu
-            item = wx.MenuItem(parentMenu = toolMenu, id = wx.ID_ANY,
-                               text = label,
-                               kind = itype)
-            toolMenu.AppendItem(item)
-            self.parent.MapWindow.Bind(wx.EVT_MENU, handler, item)
-            if self.action['desc'] == desc:
-                item.Check(True)
-        
-        # Popup the menu.  If an item is selected then its handler
-        # will be called before PopupMenu returns.
-        self.parent.MapWindow.PopupMenu(toolMenu)
-        toolMenu.Destroy()
-        
-        if self.action['desc'] == 'addPoint':
-            self.ToggleTool(self.additionalTools, False)
-        
-    def OnCopy(self, event):
-        """!Copy selected features from (background) vector map"""
-        if self.action['desc'] == 'copyLine': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.additionalTools, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnCopy():")
-        self.action = { 'desc' : "copyLine",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'box'
-
-    def OnSplitLine(self, event):
-        """!Split line"""
-        if self.action['desc'] == 'splitLine': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.additionalTools, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnSplitLine():")
-        self.action = { 'desc' : "splitLine",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'point'
-
-
-    def OnCopyCats(self, event):
-        """!Copy categories"""
-        if self.action['desc'] == 'copyCats': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.copyCats, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnCopyCats():")
-        self.action = { 'desc' : "copyCats",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'point'
-
-    def OnCopyAttrb(self, event):
-        """!Copy attributes"""
-        if self.action['desc'] == 'copyAttrs': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.copyCats, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnCopyAttrb():")
-        self.action = { 'desc' : "copyAttrs",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'point'
-        
-
-    def OnFlip(self, event):
-        """!Flip selected lines/boundaries"""
-        if self.action['desc'] == 'flipLine': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.additionalTools, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnFlip():")
-        self.action = { 'desc' : "flipLine",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'box'
-
-    def OnMerge(self, event):
-        """!Merge selected lines/boundaries"""
-        if self.action['desc'] == 'mergeLine': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.additionalTools, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnMerge():")
-        self.action = { 'desc' : "mergeLine",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'box'
-
-    def OnBreak(self, event):
-        """!Break selected lines/boundaries"""
-        if self.action['desc'] == 'breakLine': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.additionalTools, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnBreak():")
-        self.action = { 'desc' : "breakLine",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'box'
-
-    def OnSnap(self, event):
-        """!Snap selected features"""
-        if self.action['desc'] == 'snapLine': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.additionalTools, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnSnap():")
-        self.action = { 'desc' : "snapLine",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'box'
-
-    def OnConnect(self, event):
-        """!Connect selected lines/boundaries"""
-        if self.action['desc'] == 'connectLine': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.additionalTools, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnConnect():")
-        self.action = { 'desc' : "connectLine",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'box'
-
-    def OnQuery(self, event):
-        """!Query selected lines/boundaries"""
-        if self.action['desc'] == 'queryLine': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.additionalTools, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnQuery(): %s" % \
-                      UserSettings.Get(group = 'vdigit', key = 'query', subkey = 'selection'))
-        self.action = { 'desc' : "queryLine",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'box'
-
-    def OnZBulk(self, event):
-        """!Z bulk-labeling selected lines/boundaries"""
-        if not self.digit.IsVector3D():
-            gcmd.GError(parent = self.parent,
-                        message = _("Vector map is not 3D. Operation canceled."))
-            return
-        
-        if self.action['desc'] == 'zbulkLine': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.additionalTools, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnZBulk():")
-        self.action = { 'desc' : "zbulkLine",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'line'
-
-    def OnTypeConversion(self, event):
-        """!Feature type conversion
-
-        Supported conversions:
-         - point <-> centroid
-         - line <-> boundary
-        """
-        if self.action['desc'] == 'typeConv': # select previous action
-            self.ToggleTool(self.addPoint, True)
-            self.ToggleTool(self.additionalTools, False)
-            self.OnAddPoint(event)
-            return
-        
-        Debug.msg(2, "Digittoolbar.OnTypeConversion():")
-        self.action = { 'desc' : "typeConv",
-                        'id'   : self.additionalTools }
-        self.parent.MapWindow.mouse['box'] = 'box'
-
-    def OnSelectMap (self, event):
-        """!Select vector map layer for editing
-
-        If there is a vector map layer already edited, this action is
-        firstly terminated. The map layer is closed. After this the
-        selected map layer activated for editing.
-        """
-        if event.GetSelection() == 0: # create new vector map layer
-            if self.mapLayer:
-                openVectorMap = self.mapLayer.GetName(fullyQualified = False)['name']
-            else:
-                openVectorMap = None
-            dlg = gdialogs.CreateNewVector(self.parent,
-                                           exceptMap = openVectorMap, log = self.log,
-                                           cmd = (('v.edit',
-                                                   { 'tool' : 'create' },
-                                                   'map')),
-                                           disableAdd = True)
-            
-            if dlg and dlg.GetName():
-                # add layer to map layer tree
-                if self.layerTree:
-                    mapName = dlg.GetName() + '@' + grass.gisenv()['MAPSET']
-                    self.layerTree.AddLayer(ltype = 'vector',
-                                            lname = mapName,
-                                            lcmd = ['d.vect', 'map=%s' % mapName])
-                    
-                    vectLayers = self.UpdateListOfLayers(updateTool = True)
-                    selection = vectLayers.index(mapName)
-                
-                # create table ?
-                if dlg.IsChecked('table'):
-                    lmgr = self.parent.GetLayerManager()
-                    if lmgr:
-                        lmgr.OnShowAttributeTable(None, selection = 1)
-                dlg.Destroy()
-            else:
-                self.combo.SetValue(_('Select vector map'))
-                if dlg:
-                    dlg.Destroy()
-                return
-        else:
-            selection = event.GetSelection() - 1 # first option is 'New vector map'
-        
-        # skip currently selected map
-        if self.layers[selection] == self.mapLayer:
-            return
-        
-        if self.mapLayer:
-            # deactive map layer for editing
-            self.StopEditing()
-        
-        # select the given map layer for editing
-        self.StartEditing(self.layers[selection])
-        
-        event.Skip()
-    
-    def StartEditing (self, mapLayer):
-        """!Start editing selected vector map layer.
-        
-        @param mapLayer MapLayer to be edited
-        """
-        # deactive layer
-        self.mapcontent.ChangeLayerActive(mapLayer, False)
-        
-        # clean map canvas
-        self.parent.MapWindow.EraseMap()
-        
-        # unset background map if needed
-        if mapLayer:
-            if UserSettings.Get(group = 'vdigit', key = 'bgmap',
-                                subkey = 'value', internal = True) == mapLayer.GetName():
-                UserSettings.Set(group = 'vdigit', key = 'bgmap',
-                                 subkey = 'value', value = '', internal = True)
-            
-            self.parent.statusbar.SetStatusText(_("Please wait, "
-                                                  "opening vector map <%s> for editing...") % mapLayer.GetName(),
-                                                0)
-        
-        self.parent.MapWindow.pdcVector = wx.PseudoDC()
-        self.digit = self.parent.MapWindow.digit = VDigit(mapwindow = self.parent.MapWindow)
-        
-        self.mapLayer = mapLayer
-        
-        # open vector map
-        if self.digit.OpenMap(mapLayer.GetName()) is None:
-            self.mapLayer = None
-            self.StopEditing()
-            return False
-        
-        # update toolbar
-        self.combo.SetValue(mapLayer.GetName())
-        self.parent.toolbars['map'].combo.SetValue (_('Digitize'))
-        lmgr = self.parent.GetLayerManager()
-        if lmgr:
-            lmgr.toolbars['tools'].Enable('vdigit', enable = False)
-        
-        Debug.msg (4, "VDigitToolbar.StartEditing(): layer=%s" % mapLayer.GetName())
-        
-        # change cursor
-        if self.parent.MapWindow.mouse['use'] == 'pointer':
-            self.parent.MapWindow.SetCursor(self.parent.cursors["cross"])
-        
-        if not self.parent.MapWindow.resize:
-            self.parent.MapWindow.UpdateMap(render = True)
-        
-        # respect opacity
-        opacity = mapLayer.GetOpacity(float = True)
-        if opacity < 1.0:
-            alpha = int(opacity * 255)
-            self.digit.GetDisplay().UpdateSettings(alpha = alpha)
-        
-        return True
-
-    def StopEditing(self):
-        """!Stop editing of selected vector map layer.
-
-        @return True on success
-        @return False on failure
-        """
-        self.combo.SetValue (_('Select vector map'))
-        
-        # save changes
-        if self.mapLayer:
-            Debug.msg (4, "VDigitToolbar.StopEditing(): layer=%s" % self.mapLayer.GetName())
-            if UserSettings.Get(group = 'vdigit', key = 'saveOnExit', subkey = 'enabled') is False:
-                if self.digit.GetUndoLevel() > -1:
-                    dlg = wx.MessageDialog(parent = self.parent,
-                                           message = _("Do you want to save changes "
-                                                     "in vector map <%s>?") % self.mapLayer.GetName(),
-                                           caption = _("Save changes?"),
-                                           style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
-                    if dlg.ShowModal() == wx.ID_NO:
-                        # revert changes
-                        self.digit.Undo(0)
-                    dlg.Destroy()
-            
-            self.parent.statusbar.SetStatusText(_("Please wait, "
-                                                  "closing and rebuilding topology of "
-                                                  "vector map <%s>...") % self.mapLayer.GetName(),
-                                                0)
-            lmgr = self.parent.GetLayerManager()
-            if lmgr:
-                lmgr.toolbars['tools'].Enable('vdigit', enable = True)
-                lmgr.notebook.SetSelectionByName('output')
-            self.digit.CloseMap()
-            if lmgr:
-                lmgr.GetLogWindow().GetProgressBar().SetValue(0)
-                lmgr.GetLogWindow().WriteCmdLog(_("Editing of vector map <%s> successfully finished") % \
-                                                    self.mapLayer.GetName())
-            # re-active layer 
-            item = self.parent.tree.FindItemByData('maplayer', self.mapLayer)
-            if item and self.parent.tree.IsItemChecked(item):
-                self.mapcontent.ChangeLayerActive(self.mapLayer, True)
-        
-        # change cursor
-        self.parent.MapWindow.SetCursor(self.parent.cursors["default"])
-        self.parent.MapWindow.pdcVector = None
-        
-        # close dialogs
-        for dialog in ('attributes', 'category'):
-            if self.parent.dialogs[dialog]:
-                self.parent.dialogs[dialog].Close()
-                self.parent.dialogs[dialog] = None
-        
-        del self.digit
-        del self.parent.MapWindow.digit
-        
-        self.mapLayer = None
-        
-        self.parent.MapWindow.redrawAll = True
-        
-        return True
-    
-    def UpdateListOfLayers (self, updateTool = False):
-        """!
-        Update list of available vector map layers.
-        This list consists only editable layers (in the current mapset)
-
-        Optionally also update toolbar
-        """
-        Debug.msg (4, "VDigitToolbar.UpdateListOfLayers(): updateTool=%d" % \
-                   updateTool)
-        
-        layerNameSelected = None
-         # name of currently selected layer
-        if self.mapLayer:
-            layerNameSelected = self.mapLayer.GetName()
-        
-        # select vector map layer in the current mapset
-        layerNameList = []
-        self.layers = self.mapcontent.GetListOfLayers(l_type = "vector",
-                                                      l_mapset = grass.gisenv()['MAPSET'])
-        for layer in self.layers:
-            if not layer.name in layerNameList: # do not duplicate layer
-                layerNameList.append (layer.GetName())
-        
-        if updateTool: # update toolbar
-            if not self.mapLayer:
-                value = _('Select vector map')
-            else:
-                value = layerNameSelected
-
-            if not self.comboid:
-                self.combo = wx.ComboBox(self, id = wx.ID_ANY, value = value,
-                                         choices = [_('New vector map'), ] + layerNameList, size = (80, -1),
-                                         style = wx.CB_READONLY)
-                self.comboid = self.InsertControl(0, self.combo)
-                self.parent.Bind(wx.EVT_COMBOBOX, self.OnSelectMap, self.comboid)
-            else:
-                self.combo.SetItems([_('New vector map'), ] + layerNameList)
-            
-            self.Realize()
-        
-        return layerNameList
-
-    def GetLayer(self):
-        """!Get selected layer for editing -- MapLayer instance"""
-        return self.mapLayer
-    
-class ProfileToolbar(AbstractToolbar):
-    """!Toolbar for profiling raster map
-    """ 
-    def __init__(self, parent):
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # realize the toolbar
-        self.Realize()
-        
-    def _toolbarData(self):
-        """!Toolbar data"""
-        icons = Icons['profile']
-        return self._getToolbarData((('addraster', Icons['layerManager']["addRast"],
-                                      self.parent.OnSelectRaster),
-                                     ('transect', icons["transect"],
-                                      self.parent.OnDrawTransect),
-                                     (None, ),
-                                     ('draw', icons["draw"],
-                                      self.parent.OnCreateProfile),
-                                     ('erase', Icons['displayWindow']["erase"],
-                                      self.parent.OnErase),
-                                     ('drag', Icons['displayWindow']['pan'],
-                                      self.parent.OnDrag),
-                                     ('zoom', Icons['displayWindow']['zoomIn'],
-                                      self.parent.OnZoom),
-                                     ('unzoom', Icons['displayWindow']['zoomBack'],
-                                      self.parent.OnRedraw),
-                                     (None, ),
-                                     ('datasave', icons["save"],
-                                      self.parent.SaveProfileToFile),
-                                     ('image', Icons['displayWindow']["saveFile"],
-                                      self.parent.SaveToFile),
-                                     ('print', Icons['displayWindow']["print"],
-                                      self.parent.PrintMenu),
-                                     (None, ),
-                                     ('settings', icons["options"],
-                                      self.parent.ProfileOptionsMenu),
-                                     ('quit', icons["quit"],
-                                      self.parent.OnQuit),
-                                     ))
-    
-class NvizToolbar(AbstractToolbar):
-    """!Nviz toolbar
-    """
-    def __init__(self, parent, mapcontent):
-        self.mapcontent = mapcontent
-        self.lmgr = parent.GetLayerManager()
-        
-        AbstractToolbar.__init__(self, parent)
-        
-        # only one dialog can be open
-        self.settingsDialog   = None
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # realize the toolbar
-        self.Realize()
-        
-    def _toolbarData(self):
-        """!Toolbar data"""
-        icons = Icons['nviz']
-        return self._getToolbarData((("view", icons["view"],
-                                      self.OnShowPage),
-                                     (None, ),
-                                     ("surface", icons["surface"],
-                                      self.OnShowPage),
-                                     ("vector", icons["vector"],
-                                      self.OnShowPage),
-                                     ("volume", icons["volume"],
-                                      self.OnShowPage),
-                                     (None, ),
-                                     ("light", icons["light"],
-                                      self.OnShowPage),
-                                     ("fringe", icons["fringe"],
-                                      self.OnShowPage),
-                                     (None, ),
-                                     ("settings", icons["settings"],
-                                      self.OnSettings),
-                                     ("help", Icons['misc']["help"],
-                                      self.OnHelp),
-                                     (None, ),
-                                     ('quit', icons["quit"],
-                                      self.OnExit))
-                                    )
-    
-    def OnShowPage(self, event):
-        """!Go to the selected page"""
-        if not self.lmgr or not hasattr(self.lmgr, "nviz"):
-            event.Skip()
-            return
-        
-        self.lmgr.notebook.SetSelectionByName('nviz')
-        eId = event.GetId()
-        if eId == self.view:
-            self.lmgr.nviz.SetPage('view')
-        elif eId == self.surface:
-            self.lmgr.nviz.SetPage('surface')
-        elif eId == self.surface:
-            self.lmgr.nviz.SetPage('surface')
-        elif eId == self.vector:
-            self.lmgr.nviz.SetPage('vector')
-        elif eId == self.volume:
-            self.lmgr.nviz.SetPage('volume')
-        elif eId == self.light:
-            self.lmgr.nviz.SetPage('light')
-        elif eId == self.fringe:
-            self.lmgr.nviz.SetPage('fringe')
-        
-        self.lmgr.Raise()
-
-    def OnHelp(self, event):
-        """!Show 3D view mode help"""
-        if not self.lmgr:
-            gcmd.RunCommand('g.manual',
-                            entry = 'wxGUI.Nviz')
-        else:
-            log = self.lmgr.GetLogWindow()
-            log.RunCmd(['g.manual',
-                        'entry=wxGUI.Nviz'])
-        
-    def OnSettings(self, event):
-        """!Show nviz notebook page"""
-        if not self.settingsDialog:
-            self.settingsDialog = NvizPreferencesDialog(parent = self.parent)
-        self.settingsDialog.Show()
-            
-    def OnExit (self, event = None):
-        """!Quit nviz tool (swith to 2D mode)"""
-        # set default mouse settings
-        self.parent.MapWindow.mouse['use'] = "pointer"
-        self.parent.MapWindow.mouse['box'] = "point"
-        self.parent.MapWindow.polycoords = []
-        
-        # return to map layer page (gets rid of ugly exit bug)
-        self.lmgr.notebook.SetSelectionByName('layers')
-
-        # disable the toolbar
-        self.parent.RemoveToolbar("nviz")
-        
-class ModelToolbar(AbstractToolbar):
-    """!Graphical modeler toolbar (see gmodeler.py)
-    """
-    def __init__(self, parent):
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # realize the toolbar
-        self.Realize()
-        
-    def _toolbarData(self):
-        """!Toolbar data"""
-        icons = Icons['modeler']
-        return self._getToolbarData((('new', icons['new'],
-                                      self.parent.OnModelNew),
-                                     ('open', icons['open'],
-                                      self.parent.OnModelOpen),
-                                     ('save', icons['save'],
-                                      self.parent.OnModelSave),
-                                     ('image', icons['toImage'],
-                                      self.parent.OnExportImage),
-                                     ('python', icons['toPython'],
-                                      self.parent.OnExportPython),
-                                     (None, ),
-                                     ('action', icons['actionAdd'],
-                                      self.parent.OnAddAction),
-                                     ('data', icons['dataAdd'],
-                                      self.parent.OnAddData),
-                                     ('relation', icons['relation'],
-                                      self.parent.OnDefineRelation),
-                                     (None, ),
-                                     ('redraw', icons['redraw'],
-                                      self.parent.OnCanvasRefresh),
-                                     ('validate', icons['validate'],
-                                      self.parent.OnValidateModel),
-                                     ('run', icons['run'],
-                                      self.parent.OnRunModel),
-                                     (None, ),
-                                     ("variables", icons['variables'],
-                                      self.parent.OnVariables),
-                                     ("settings", icons['settings'],
-                                      self.parent.OnPreferences),
-                                     ("help", Icons['misc']['help'],
-                                      self.parent.OnHelp),
-                                     (None, ),
-                                     ('quit', icons['quit'],
-                                      self.parent.OnCloseWindow))
-                                    )
-    
-class HistogramToolbar(AbstractToolbar):
-    """!Histogram toolbar (see histogram.py)
-    """
-    def __init__(self, parent):
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # realize the toolbar
-        self.Realize()
-        
-    def _toolbarData(self):
-        """!Toolbar data"""
-        icons = Icons['displayWindow']
-        return self._getToolbarData((('histogram', icons["histogram"],
-                                      self.parent.OnOptions),
-                                     ('rendermao', icons["display"],
-                                      self.parent.OnRender),
-                                     ('erase', icons["erase"],
-                                      self.parent.OnErase),
-                                     ('font', Icons['misc']["font"],
-                                      self.parent.SetHistFont),
-                                     (None, ),
-                                     ('save', icons["saveFile"],
-                                      self.parent.SaveToFile),
-                                     ('hprint', icons["print"],
-                                      self.parent.PrintMenu),
-                                     (None, ),
-                                     ('quit', Icons['misc']["quit"],
-                                      self.parent.OnQuit))
-                                    )
-
-class LMWorkspaceToolbar(AbstractToolbar):
-    """!Layer Manager `workspace` toolbar
-    """
-    def __init__(self, parent):
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # realize the toolbar
-        self.Realize()
-
-    def _toolbarData(self):
-        """!Toolbar data
-        """
-        icons = Icons['layerManager']
-        return self._getToolbarData((('newdisplay', icons["newdisplay"],
-                                      self.parent.OnNewDisplay),
-                                     (None, ),
-                                     ('workspaceNew', icons["workspaceNew"],
-                                      self.parent.OnWorkspaceNew),
-                                     ('workspaceOpen', icons["workspaceOpen"],
-                                      self.parent.OnWorkspaceOpen),
-                                     ('workspaceSave', icons["workspaceSave"],
-                                      self.parent.OnWorkspaceSave),
-                                     ))
-
-class LMDataToolbar(AbstractToolbar):
-    """!Layer Manager `data` toolbar
-    """
-    def __init__(self, parent):
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # realize the toolbar
-        self.Realize()
-
-    def _toolbarData(self):
-        """!Toolbar data
-        """
-        icons = Icons['layerManager']
-        return self._getToolbarData((('addMulti', icons["addMulti"],
-                                      self.parent.OnAddMaps),
-                                     ('addrast', icons["addRast"],
-                                      self.parent.OnAddRaster),
-                                     ('rastmisc', icons["rastMisc"],
-                                      self.parent.OnAddRasterMisc),
-                                     ('addvect', icons["addVect"],
-                                      self.parent.OnAddVector),
-                                     ('vectmisc', icons["vectMisc"],
-                                      self.parent.OnAddVectorMisc),
-                                     ('addgrp',  icons["addGroup"],
-                                      self.parent.OnAddGroup),
-                                     ('addovl',  icons["addOverlay"],
-                                      self.parent.OnAddOverlay),
-                                     ('delcmd',  icons["delCmd"],
-                                      self.parent.OnDeleteLayer),
-                                     ))
-
-class LMToolsToolbar(AbstractToolbar):
-    """!Layer Manager `tools` toolbar
-    """
-    def __init__(self, parent):
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # realize the toolbar
-        self.Realize()
-
-    def _toolbarData(self):
-        """!Toolbar data
-        """
-        icons = Icons['layerManager']
-        return self._getToolbarData((('importMap', icons["import"],
-                                      self.parent.OnImportMenu),
-                                     (None, ),
-                                     ('mapCalc', icons["mapcalc"],
-                                      self.parent.OnMapCalculator),
-                                     ('georect', Icons["georectify"]["georectify"],
-                                      self.parent.OnGCPManager),
-                                     ('modeler', icons["modeler"],
-                                      self.parent.OnGModeler),
-                                     ('mapOutput', icons['mapOutput'],
-                                      self.parent.OnPsMap)
-                                     ))
-
-class LMMiscToolbar(AbstractToolbar):
-    """!Layer Manager `misc` toolbar
-    """
-    def __init__(self, parent):
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # realize the toolbar
-        self.Realize()
-
-    def _toolbarData(self):
-        """!Toolbar data
-        """
-        icons = Icons['layerManager']
-        return self._getToolbarData((('settings', icons["settings"],
-                                      self.parent.OnPreferences),
-                                     ('help', Icons["misc"]["help"],
-                                      self.parent.OnHelp),
-                                     ))
-
-class LMVectorToolbar(AbstractToolbar):
-    """!Layer Manager `vector` toolbar
-    """
-    def __init__(self, parent):
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        # realize the toolbar
-        self.Realize()
-
-    def _toolbarData(self):
-        """!Toolbar data
-        """
-        icons = Icons['layerManager']
-        return self._getToolbarData((('vdigit', icons["vdigit"],
-                                      self.parent.OnVDigit),
-                                     ('attribute', icons["attrTable"],
-                                      self.parent.OnShowAttributeTable),
-                                     ))
-    
-class PsMapToolbar(AbstractToolbar):
-    def __init__(self, parent):
-        """!Toolbar Cartographic Composer (psmap.py)
-        
-        @param parent parent window
-        """
-        AbstractToolbar.__init__(self, parent)
-        
-        self.InitToolbar(self._toolbarData())
-        
-        self.Realize()
-        
-        self.action = { 'id' : self.pointer }
-        self.defaultAction = { 'id' : self.pointer,
-                               'bind' : self.parent.OnPointer }
-        self.OnTool(None)
-        
-        from psmap import haveImage
-        if not haveImage:
-            self.EnableTool(self.preview, False)
-        
-    def _toolbarData(self):
-        """!Toolbar data
-        """
-        icons = Icons['psMap']
-        return self._getToolbarData((('loadFile', icons['scriptLoad'],
-                                      self.parent.OnLoadFile),                                    
-                                     ('instructionFile', icons['scriptSave'],
-                                      self.parent.OnInstructionFile),
-                                     (None, ),
-                                     ('pagesetup', icons['pageSetup'],
-                                      self.parent.OnPageSetup),
-                                     (None, ),
-                                     ("pointer", Icons["displayWindow"]["pointer"],
-                                      self.parent.OnPointer, wx.ITEM_CHECK),
-                                     ('pan', Icons["displayWindow"]['pan'],
-                                      self.parent.OnPan, wx.ITEM_CHECK),
-                                     ("zoomin", Icons["displayWindow"]["zoomIn"],
-                                      self.parent.OnZoomIn, wx.ITEM_CHECK),
-                                     ("zoomout", Icons["displayWindow"]["zoomOut"],
-                                      self.parent.OnZoomOut, wx.ITEM_CHECK),
-                                     ('zoomAll', icons['fullExtent'],
-                                      self.parent.OnZoomAll),
-                                     (None, ),
-                                     ('addMap', icons['addMap'],
-                                      self.parent.OnAddMap, wx.ITEM_CHECK),
-                                     ('addRaster', icons['addRast'],
-                                      self.parent.OnAddRaster),
-                                     ('addVector', icons['addVect'],
-                                      self.parent.OnAddVect),
-                                     ("dec", Icons["displayWindow"]["overlay"],
-                                      self.parent.OnDecoration),
-                                     ("delete", icons["deleteObj"],
-                                      self.parent.OnDelete),
-                                     (None, ),
-                                     ("preview", icons["preview"],
-                                      self.parent.OnPreview),
-                                     ('generatePS', icons['psExport'],
-                                      self.parent.OnPSFile),
-                                     ('generatePDF', icons['pdfExport'],
-                                      self.parent.OnPDFFile),
-                                     (None, ),
-                                     ("help", Icons['misc']['help'],
-                                      self.parent.OnHelp),
-                                     ('quit', icons['quit'],
-                                      self.parent.OnCloseWindow))
-                                    )
diff --git a/gui/wxpython/lmgr/frame.py b/gui/wxpython/lmgr/frame.py
new file mode 100644
index 0000000..85b603a
--- /dev/null
+++ b/gui/wxpython/lmgr/frame.py
@@ -0,0 +1,1848 @@
+"""!
+ at package lmgr::frame
+
+ at brief Layer Manager - main menu, layer management toolbar, notebook
+control for display management and access to command console.
+
+Classes:
+ - frame::GMFrame
+
+(C) 2006-2012 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton (Arizona State University)
+ at author Jachym Cepicky (Mendel University of Agriculture)
+ at author Martin Landa <landa.martin gmail.com>
+ at author Vaclav Petras <wenzeslaus gmail.com> (menu customization)
+"""
+
+import sys
+import os
+import tempfile
+import stat
+import platform
+try:
+    import xml.etree.ElementTree as etree
+except ImportError:
+    import elementtree.ElementTree as etree # Python <= 2.4
+
+from core import globalvar
+import wx
+import wx.aui
+try:
+    import wx.lib.agw.flatnotebook   as FN
+except ImportError:
+    import wx.lib.flatnotebook   as FN
+
+sys.path.append(os.path.join(globalvar.ETCDIR, "python"))
+from grass.script          import core as grass
+
+from core.gcmd             import Command, RunCommand, GError, GMessage
+from core.settings         import UserSettings
+from core.utils            import SetAddOnPath
+from gui_core.preferences  import MapsetAccess, PreferencesDialog, EVT_SETTINGS_CHANGED
+from lmgr.layertree        import LayerTree, LMIcons
+from lmgr.menudata         import ManagerData
+from gui_core.widgets      import GNotebook
+from modules.mcalc_builder import MapCalcFrame
+from dbmgr.manager         import AttributeManager
+from core.workspace        import ProcessWorkspaceFile, ProcessGrcFile, WriteWorkspaceFile
+from gui_core.goutput      import GMConsole
+from gui_core.dialogs      import DxfImportDialog, GdalImportDialog, MapLayersDialog
+from gui_core.dialogs      import LocationDialog, MapsetDialog, CreateNewVector, GroupDialog
+from modules.ogc_services  import WMSDialog
+from modules.colorrules    import RasterColorTable, VectorColorTable
+from gui_core.menu         import Menu
+from gmodeler.model        import Model
+from gmodeler.frame        import ModelFrame
+from psmap.frame           import PsMapFrame
+from core.debug            import Debug
+from gui_core.ghelp        import MenuTreeWindow, AboutWindow
+from modules.extensions    import InstallExtensionWindow, UninstallExtensionWindow
+from lmgr.toolbars         import LMWorkspaceToolbar, LMDataToolbar, LMToolsToolbar
+from lmgr.toolbars         import LMMiscToolbar, LMVectorToolbar, LMNvizToolbar
+from lmgr.pyshell          import PyShellWindow
+from gui_core.forms        import GUI
+from gcp.manager           import GCPWizard
+from nviz.main             import haveNviz
+
+class GMFrame(wx.Frame):
+    """!Layer Manager frame with notebook widget for controlling GRASS
+    GIS. Includes command console page for typing GRASS (and other)
+    commands, tree widget page for managing map layers.
+    """
+    def __init__(self, parent, id = wx.ID_ANY, title = _("GRASS GIS Layer Manager"),
+                 workspace = None,
+                 size = globalvar.GM_WINDOW_SIZE, style = wx.DEFAULT_FRAME_STYLE, **kwargs):
+        self.parent    = parent
+        self.baseTitle = title
+        self.iconsize  = (16, 16)
+        
+        wx.Frame.__init__(self, parent = parent, id = id, size = size,
+                          style = style, **kwargs)
+                          
+        self.SetTitle(self.baseTitle)
+        self.SetName("LayerManager")
+
+        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
+
+        self._auimgr = wx.aui.AuiManager(self)
+
+        # initialize variables
+        self.disp_idx      = 0            # index value for map displays and layer trees
+        self.curr_page     = None         # currently selected page for layer tree notebook
+        self.curr_pagenum  = None         # currently selected page number for layer tree notebook
+        self.workspaceFile = workspace    # workspace file
+        self.workspaceChanged = False     # track changes in workspace
+        self.georectifying = None         # reference to GCP class or None
+        self.gcpmanagement = None         # reference to GCP class or None
+        
+        # list of open dialogs
+        self.dialogs        = dict()
+        self.dialogs['preferences'] = None
+        self.dialogs['atm'] = list()
+        
+        # creating widgets
+        self._createMenuBar()
+        self.statusbar = self.CreateStatusBar(number = 1)
+        self.notebook  = self._createNoteBook()
+        self.toolbars  = { 'workspace' : LMWorkspaceToolbar(parent = self),
+                           'data'      : LMDataToolbar(parent = self),
+                           'tools'     : LMToolsToolbar(parent = self),
+                           'misc'      : LMMiscToolbar(parent = self),
+                           'vector'    : LMVectorToolbar(parent = self),
+                           'nviz'      : LMNvizToolbar(parent = self)}
+        
+        self._toolbarsData = { 'workspace' : ("toolbarWorkspace",     # name
+                                              _("Workspace Toolbar"), # caption
+                                              1),                     # row
+                               'data'      : ("toolbarData",
+                                              _("Data Toolbar"),
+                                              1),
+                               'misc'      : ("toolbarMisc",
+                                              _("Misc Toolbar"),
+                                              2),
+                               'tools'     : ("toolbarTools",
+                                              _("Tools Toolbar"),
+                                              2),
+                               'vector'    : ("toolbarVector",
+                                              _("Vector Toolbar"),
+                                              2),
+                               'nviz'      : ("toolbarNviz",
+                                              _("3D view Toolbar"),
+                                              2),                                            
+                               }
+        if sys.platform == 'win32':
+            self._toolbarsList = ('workspace', 'data',
+                                  'vector', 'tools', 'misc', 'nviz')
+        else:
+            self._toolbarsList = ('data', 'workspace',
+                                  'nviz', 'misc', 'tools', 'vector')
+        for toolbar in self._toolbarsList:
+            name, caption, row = self._toolbarsData[toolbar]
+            self._auimgr.AddPane(self.toolbars[toolbar],
+                                 wx.aui.AuiPaneInfo().
+                                 Name(name).Caption(caption).
+                                 ToolbarPane().Top().Row(row).
+                                 LeftDockable(False).RightDockable(False).
+                                 BottomDockable(False).TopDockable(True).
+                                 CloseButton(False).Layer(2).
+                                 BestSize((self.toolbars[toolbar].GetBestSize())))
+        
+        self._auimgr.GetPane('toolbarNviz').Hide()
+        # bindings
+        self.Bind(wx.EVT_CLOSE,    self.OnCloseWindow)
+        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
+
+        # minimal frame size
+        self.SetMinSize((500, 400))
+
+        # AUI stuff
+        self._auimgr.AddPane(self.notebook, wx.aui.AuiPaneInfo().
+                             Left().CentrePane().BestSize((-1,-1)).Dockable(False).
+                             CloseButton(False).DestroyOnClose(True).Row(1).Layer(0))
+
+        self._auimgr.Update()
+
+        wx.CallAfter(self.notebook.SetSelectionByName, 'layers')
+        
+        # use default window layout ?
+        if UserSettings.Get(group = 'general', key = 'defWindowPos', subkey = 'enabled'):
+            dim = UserSettings.Get(group = 'general', key = 'defWindowPos', subkey = 'dim')
+            try:
+               x, y = map(int, dim.split(',')[0:2])
+               w, h = map(int, dim.split(',')[2:4])
+               self.SetPosition((x, y))
+               self.SetSize((w, h))
+            except:
+                pass
+        else:
+            self.Centre()
+        
+        self.Layout()
+        self.Show()
+        
+        # load workspace file if requested
+        if self.workspaceFile:
+            # load given workspace file
+            if self.LoadWorkspaceFile(self.workspaceFile):
+                self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.workspaceFile))
+            else:
+                self.workspaceFile = None
+        else:
+            # start default initial display
+            self.NewDisplay(show = False)
+
+        # show map display widnow
+        # -> OnSize() -> UpdateMap()
+        if self.curr_page and not self.curr_page.maptree.mapdisplay.IsShown():
+            self.curr_page.maptree.mapdisplay.Show()
+        
+        # redirect stderr to log area    
+        self.goutput.Redirect()
+        
+        # fix goutput's pane size (required for Mac OSX)`
+        self.goutput.SetSashPosition(int(self.GetSize()[1] * .8))
+        
+        self.workspaceChanged = False
+        
+        # start with layer manager on top
+        if self.curr_page:
+            self.curr_page.maptree.mapdisplay.Raise()
+        wx.CallAfter(self.Raise)
+        
+    def _createMenuBar(self):
+        """!Creates menu bar"""
+        self.menubar = Menu(parent = self, data = ManagerData())
+        self.SetMenuBar(self.menubar)
+        self.menucmd = self.menubar.GetCmd()
+        
+    def _createTabMenu(self):
+        """!Creates context menu for display tabs.
+        
+        Used to rename display.
+        """
+        menu = wx.Menu()
+        item = wx.MenuItem(menu, id = wx.ID_ANY, text = _("Rename Map Display"))
+        menu.AppendItem(item)
+        self.Bind(wx.EVT_MENU, self.OnRenameDisplay, item)
+        
+        return menu
+        
+    def _setCopyingOfSelectedText(self):
+        copy = UserSettings.Get(group = 'manager', key = 'copySelectedTextToClipboard', subkey = 'enabled')
+        self.goutput.SetCopyingOfSelectedText(copy)
+    
+    def IsPaneShown(self, name):
+        """!Check if pane (toolbar, ...) of given name is currently shown"""
+        if self._auimgr.GetPane(name).IsOk():
+            return self._auimgr.GetPane(name).IsShown()
+        return False
+    
+    def _createNoteBook(self):
+        """!Creates notebook widgets"""
+        self.notebook = GNotebook(parent = self, style = globalvar.FNPageDStyle)
+        # create displays notebook widget and add it to main notebook page
+        cbStyle = globalvar.FNPageStyle
+        if globalvar.hasAgw:
+            self.gm_cb = FN.FlatNotebook(self, id = wx.ID_ANY, agwStyle = cbStyle)
+        else:
+            self.gm_cb = FN.FlatNotebook(self, id = wx.ID_ANY, style = cbStyle)
+        self.gm_cb.SetTabAreaColour(globalvar.FNPageColor)
+        menu = self._createTabMenu()
+        self.gm_cb.SetRightClickMenu(menu)
+        self.notebook.AddPage(page = self.gm_cb, text = _("Map layers"), name = 'layers')
+        
+        # create 'command output' text area
+        self.goutput = GMConsole(self)
+        self.notebook.AddPage(page = self.goutput, text = _("Command console"), name = 'output')
+        self._setCopyingOfSelectedText()
+        
+        # create 'search module' notebook page
+        if not UserSettings.Get(group = 'manager', key = 'hideTabs', subkey = 'search'):
+            self.search = MenuTreeWindow(parent = self)
+            self.notebook.AddPage(page = self.search, text = _("Search module"), name = 'search')
+        else:
+            self.search = None
+        
+        # create 'python shell' notebook page
+        if not UserSettings.Get(group = 'manager', key = 'hideTabs', subkey = 'pyshell'):
+            self.pyshell = PyShellWindow(parent = self)
+            self.notebook.AddPage(page = self.pyshell, text = _("Python shell"), name = 'pyshell')
+        else:
+            self.pyshell = None
+        
+        # bindings
+        self.gm_cb.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED,    self.OnCBPageChanged)
+        self.notebook.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
+        self.gm_cb.Bind(FN.EVT_FLATNOTEBOOK_PAGE_CLOSING,    self.OnCBPageClosed)
+        
+        return self.notebook
+            
+    def AddNvizTools(self):
+        """!Add nviz notebook page"""
+        Debug.msg(5, "GMFrame.AddNvizTools()")
+        if not haveNviz:
+            return
+        
+        from nviz.main import NvizToolWindow
+        
+        # show toolbar
+        self._auimgr.GetPane('toolbarNviz').Show()
+        # reorder other toolbars
+        for pos, toolbar in enumerate(('toolbarVector', 'toolbarTools', 'toolbarMisc','toolbarNviz')):
+            self._auimgr.GetPane(toolbar).Row(2).Position(pos)
+        self._auimgr.Update()
+        
+        # create nviz tools tab
+        self.nviz = NvizToolWindow(parent = self,
+                                   display = self.curr_page.maptree.GetMapDisplay())
+        idx = self.notebook.GetPageIndexByName('layers')
+        self.notebook.InsertPage(indx = idx + 1, page = self.nviz, text = _("3D view"), name = 'nviz')
+        self.notebook.SetSelectionByName('nviz')
+        
+        
+    def RemoveNvizTools(self):
+        """!Remove nviz notebook page"""
+        # if more mapwindow3D were possible, check here if nb page should be removed
+        self.notebook.SetSelectionByName('layers')
+        self.notebook.DeletePage(self.notebook.GetPageIndexByName('nviz'))
+
+        # hide toolbar
+        self._auimgr.GetPane('toolbarNviz').Hide()
+        for pos, toolbar in enumerate(('toolbarVector', 'toolbarTools', 'toolbarMisc')):
+            self._auimgr.GetPane(toolbar).Row(2).Position(pos)
+        self._auimgr.Update()
+    
+    def WorkspaceChanged(self):
+        """!Update window title"""
+        if not self.workspaceChanged:
+            self.workspaceChanged = True
+        
+        if self.workspaceFile:
+            self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.workspaceFile) + '*')
+        
+    def OnLocationWizard(self, event):
+        """!Launch location wizard"""
+        from location_wizard.wizard import LocationWizard
+        from location_wizard.dialogs import RegionDef
+        
+        gWizard = LocationWizard(parent = self,
+                                 grassdatabase = grass.gisenv()['GISDBASE'])
+        location = gWizard.location
+        
+        if location !=  None:
+            dlg = wx.MessageDialog(parent = self,
+                                   message = _('Location <%s> created.\n\n'
+                                               'Do you want to switch to the '
+                                               'new location?') % location,
+                                   caption=_("Switch to new location?"),
+                                   style = wx.YES_NO | wx.NO_DEFAULT |
+                                   wx.ICON_QUESTION | wx.CENTRE)
+            
+            ret = dlg.ShowModal()
+            dlg.Destroy()
+            if ret == wx.ID_YES:
+                if RunCommand('g.mapset', parent = self,
+                              location = location,
+                              mapset = 'PERMANENT') != 0:
+                    return
+                
+                GMessage(parent = self,
+                         message = _("Current location is <%(loc)s>.\n"
+                                     "Current mapset is <%(mapset)s>.") % \
+                             { 'loc' : location, 'mapset' : 'PERMANENT' })
+
+                # code duplication with gis_set.py
+                dlg = wx.MessageDialog(parent = self,
+                               message = _("Do you want to set the default "
+                                           "region extents and resolution now?"),
+                               caption = _("Location <%s> created") % location,
+                               style = wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
+                dlg.CenterOnScreen()
+                if dlg.ShowModal() == wx.ID_YES:
+                    dlg.Destroy()
+                    defineRegion = RegionDef(self, location = location)
+                    defineRegion.CenterOnScreen()
+                    defineRegion.ShowModal()
+                    defineRegion.Destroy()
+                else:
+                    dlg.Destroy()
+        
+    def OnSettingsChanged(self, event):
+        """!Here can be functions which have to be called after EVT_SETTINGS_CHANGED. 
+        Now only set copying of selected text to clipboard (in goutput).
+        """
+        ### self._createMenuBar() # bug when menu is re-created on the fly
+        self._setCopyingOfSelectedText()
+        
+    def OnGCPManager(self, event):
+        """!Launch georectifier module
+        """
+        GCPWizard(self)
+
+    def OnGModeler(self, event):
+        """!Launch Graphical Modeler"""
+        win = ModelFrame(parent = self)
+        win.CentreOnScreen()
+        
+        win.Show()
+        
+    def OnPsMap(self, event):
+        """!Launch Cartographic Composer
+        """
+        win = PsMapFrame(parent = self)
+        win.CentreOnScreen()
+        
+        win.Show()
+        
+    def OnDone(self, cmd, returncode):
+        """Command execution finised"""
+        if hasattr(self, "model"):
+            self.model.DeleteIntermediateData(log = self.goutput)
+            del self.model
+        self.SetStatusText('')
+        
+    def OnRunModel(self, event):
+        """!Run model"""
+        filename = ''
+        dlg = wx.FileDialog(parent = self, message =_("Choose model to run"),
+                            defaultDir = os.getcwd(),
+                            wildcard = _("GRASS Model File (*.gxm)|*.gxm"))
+        if dlg.ShowModal() == wx.ID_OK:
+            filename = dlg.GetPath()
+        
+        if not filename:
+            dlg.Destroy()
+            return
+        
+        self.model = Model()
+        self.model.LoadModel(filename)
+        self.model.Run(log = self.goutput, onDone = self.OnDone, parent = self)
+        
+        dlg.Destroy()
+        
+    def OnMapsets(self, event):
+        """!Launch mapset access dialog
+        """
+        dlg = MapsetAccess(parent = self, id = wx.ID_ANY)
+        dlg.CenterOnScreen()
+        
+        if dlg.ShowModal() == wx.ID_OK:
+            ms = dlg.GetMapsets()
+            RunCommand('g.mapsets',
+                       parent = self,
+                       mapset = '%s' % ','.join(ms))
+            
+    def OnCBPageChanged(self, event):
+        """!Page in notebook (display) changed"""
+        self.curr_page   = self.gm_cb.GetCurrentPage()
+        self.curr_pagenum = self.gm_cb.GetSelection()
+        try:
+            self.curr_page.maptree.mapdisplay.SetFocus()
+            self.curr_page.maptree.mapdisplay.Raise()
+        except:
+            pass
+        
+        event.Skip()
+
+    def OnPageChanged(self, event):
+        """!Page in notebook changed"""
+        page = event.GetSelection()
+        if page == self.notebook.GetPageIndexByName('output'):
+            # remove '(...)'
+            self.notebook.SetPageText(page, _("Command console"))
+            wx.CallAfter(self.goutput.ResetFocus)
+        self.SetStatusText('', 0)
+        
+        event.Skip()
+
+    def OnCBPageClosed(self, event):
+        """!Page of notebook closed
+        Also close associated map display
+        """
+        if UserSettings.Get(group = 'manager', key = 'askOnQuit', subkey = 'enabled'):
+            maptree = self.curr_page.maptree
+            
+            if self.workspaceFile:
+                message = _("Do you want to save changes in the workspace?")
+            else:
+                message = _("Do you want to store current settings "
+                            "to workspace file?")
+            
+            # ask user to save current settings
+            if maptree.GetCount() > 0:
+                name = self.gm_cb.GetPageText(self.curr_pagenum)
+                dlg = wx.MessageDialog(self,
+                                       message = message,
+                                       caption = _("Close Map Display %s") % name,
+                                       style = wx.YES_NO | wx.YES_DEFAULT |
+                                       wx.CANCEL | wx.ICON_QUESTION | wx.CENTRE)
+                ret = dlg.ShowModal()
+                if ret == wx.ID_YES:
+                    if not self.workspaceFile:
+                        self.OnWorkspaceSaveAs()
+                    else:
+                        self.SaveToWorkspaceFile(self.workspaceFile)
+                elif ret == wx.ID_CANCEL:
+                    event.Veto()
+                    dlg.Destroy()
+                    return
+                dlg.Destroy()
+
+        self.gm_cb.GetPage(event.GetSelection()).maptree.Map.Clean()
+        self.gm_cb.GetPage(event.GetSelection()).maptree.Close(True)
+
+        self.curr_page = None
+
+        event.Skip()
+
+    def GetLayerTree(self):
+        """!Get current layer tree"""
+        if self.curr_page:
+            return self.curr_page.maptree
+        return None
+    
+    def GetLogWindow(self):
+        """!Get widget for command output"""
+        return self.goutput
+    
+    def GetMenuCmd(self, event):
+        """!Get GRASS command from menu item
+
+        Return command as a list"""
+        layer = None
+        
+        if event:
+            cmd = self.menucmd[event.GetId()]
+        
+        try:
+            cmdlist = cmd.split(' ')
+        except: # already list?
+            cmdlist = cmd
+        
+        # check list of dummy commands for GUI modules that do not have GRASS
+        # bin modules or scripts. 
+        if cmd in ['vcolors', 'r.mapcalc', 'r3.mapcalc']:
+            return cmdlist
+
+        try:
+            layer = self.curr_page.maptree.layer_selected
+            name = self.curr_page.maptree.GetPyData(layer)[0]['maplayer'].name
+            type = self.curr_page.maptree.GetPyData(layer)[0]['type']
+        except:
+            layer = None
+
+        if layer and len(cmdlist) == 1: # only if no paramaters given
+            if (type == 'raster' and cmdlist[0][0] == 'r' and cmdlist[0][1] != '3') or \
+                    (type == 'vector' and cmdlist[0][0] == 'v'):
+                input = GUI().GetCommandInputMapParamKey(cmdlist[0])
+                if input:
+                    cmdlist.append("%s=%s" % (input, name))
+        
+        return cmdlist
+
+    def RunMenuCmd(self, event = None, cmd = []):
+        """!Run command selected from menu"""
+        if event:
+            cmd = self.GetMenuCmd(event)
+        self.goutput.RunCmd(cmd, switchPage = False)
+
+    def OnMenuCmd(self, event = None, cmd = []):
+        """!Parse command selected from menu"""
+        if event:
+            cmd = self.GetMenuCmd(event)
+        GUI(parent = self).ParseCommand(cmd)
+        
+    def OnVDigit(self, event):
+        """!Start vector digitizer
+        """
+        if not self.curr_page:
+            self.MsgNoLayerSelected()
+            return
+        
+        tree = self.GetLayerTree()
+        layer = tree.layer_selected
+        # no map layer selected
+        if not layer:
+            self.MsgNoLayerSelected()
+            return
+        
+        # available only for vector map layers
+        try:
+            mapLayer = tree.GetPyData(layer)[0]['maplayer']
+        except:
+            mapLayer = None
+        
+        if not mapLayer or mapLayer.GetType() != 'vector':
+            GMessage(parent = self,
+                     message = _("Selected map layer is not vector."))
+            return
+        
+        if mapLayer.GetMapset() != grass.gisenv()['MAPSET']:
+            GMessage(parent = self,
+                     message = _("Editing is allowed only for vector maps from the "
+                                 "current mapset."))
+            return
+        
+        if not tree.GetPyData(layer)[0]:
+            return
+        dcmd = tree.GetPyData(layer)[0]['cmd']
+        if not dcmd:
+            return
+        
+        tree.OnStartEditing(None)
+        
+    def OnRunScript(self, event):
+        """!Run script"""
+        # open dialog and choose script file
+        dlg = wx.FileDialog(parent = self, message = _("Choose script file to run"),
+                            defaultDir = os.getcwd(),
+                            wildcard = _("Python script (*.py)|*.py|Bash script (*.sh)|*.sh"))
+        
+        filename = None
+        if dlg.ShowModal() == wx.ID_OK:
+            filename = dlg.GetPath()
+        
+        if not filename:
+            return False
+        
+        if not os.path.exists(filename):
+            GError(parent = self,
+                   message = _("Script file '%s' doesn't exist. "
+                               "Operation canceled.") % filename)
+            return
+
+        # check permission
+        if not os.access(filename, os.X_OK):
+            dlg = wx.MessageDialog(self,
+                                   message = _("Script <%s> is not executable. "
+                                               "Do you want to set the permissions "
+                                               "that allows you to run this script "
+                                               "(note that you must be the owner of the file)?" % \
+                                                   os.path.basename(filename)),
+                                   caption = _("Set permission?"),
+                                   style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+            if dlg.ShowModal() != wx.ID_YES:
+                return
+            dlg.Destroy()
+            try:
+                mode = stat.S_IMODE(os.lstat(filename)[stat.ST_MODE])
+                os.chmod(filename, mode | stat.S_IXUSR)
+            except OSError:
+                GError(_("Unable to set permission. Operation canceled."), parent = self)
+                return
+        
+        # check GRASS_ADDON_PATH
+        addonPath = os.getenv('GRASS_ADDON_PATH', [])
+        if addonPath:
+            addonPath = addonPath.split(os.pathsep)
+        dirName = os.path.dirname(filename)
+        if dirName not in addonPath:
+            addonPath.append(dirName)
+            dlg = wx.MessageDialog(self,
+                                   message = _("Directory '%s' is not defined in GRASS_ADDON_PATH. "
+                                               "Do you want add this directory to GRASS_ADDON_PATH?") % \
+                                       dirName,
+                                   caption = _("Update Addons path?"),
+                                   style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+            if dlg.ShowModal() == wx.ID_YES:
+                SetAddOnPath(os.pathsep.join(addonPath))
+        
+        self.goutput.WriteCmdLog(_("Launching script '%s'...") % filename)
+        self.goutput.RunCmd([filename], switchPage = True)
+        
+    def OnChangeLocation(self, event):
+        """Change current location"""
+        dlg = LocationDialog(parent = self)
+        if dlg.ShowModal() == wx.ID_OK:
+            location, mapset = dlg.GetValues()
+            dlg.Destroy()
+            
+            if not location or not mapset:
+                GError(parent = self,
+                       message = _("No location/mapset provided. Operation canceled."))
+                return # this should not happen
+            
+            if RunCommand('g.mapset', parent = self,
+                          location = location,
+                          mapset = mapset) != 0:
+                return # error reported
+            
+            # close workspace
+            self.OnWorkspaceClose()
+            self.OnWorkspaceNew()
+            GMessage(parent = self,
+                     message = _("Current location is <%(loc)s>.\n"
+                                 "Current mapset is <%(mapset)s>.") % \
+                         { 'loc' : location, 'mapset' : mapset })
+        
+    def OnCreateMapset(self, event):
+        """!Create new mapset"""
+        dlg = wx.TextEntryDialog(parent = self,
+                                 message = _('Enter name for new mapset:'),
+                                 caption = _('Create new mapset'))
+        
+        if dlg.ShowModal() ==  wx.ID_OK:
+            mapset = dlg.GetValue()
+            if not mapset:
+                GError(parent = self,
+                       message = _("No mapset provided. Operation canceled."))
+                return
+            
+            ret = RunCommand('g.mapset',
+                             parent = self,
+                             flags = 'c',
+                             mapset = mapset)
+            if ret == 0:
+                GMessage(parent = self,
+                         message = _("Current mapset is <%s>.") % mapset)
+            
+    def OnChangeMapset(self, event):
+        """Change current mapset"""
+        dlg = MapsetDialog(parent = self)
+        
+        if dlg.ShowModal() == wx.ID_OK:
+            mapset = dlg.GetMapset()
+            dlg.Destroy()
+            
+            if not mapset:
+                GError(parent = self,
+                       message = _("No mapset provided. Operation canceled."))
+                return
+            
+            if RunCommand('g.mapset',
+                          parent = self,
+                          mapset = mapset) == 0:
+                GMessage(parent = self,
+                         message = _("Current mapset is <%s>.") % mapset)
+        
+    def OnNewVector(self, event):
+        """!Create new vector map layer"""
+        dlg = CreateNewVector(self, log = self.goutput,
+                              cmd = (('v.edit',
+                                      { 'tool' : 'create' },
+                                      'map')))
+        
+        if not dlg:
+            return
+        
+        name = dlg.GetName(full = True)
+        if name and dlg.IsChecked('add'):
+            # add layer to map layer tree
+            self.curr_page.maptree.AddLayer(ltype = 'vector',
+                                            lname = name,
+                                            lcmd = ['d.vect', 'map=%s' % name])
+        dlg.Destroy()
+        
+    def OnSystemInfo(self, event):
+        """!Print system information"""
+        vInfo = grass.version()
+        
+        # GDAL/OGR
+        try:
+            from osgeo import gdal
+            gdalVersion = gdal.__version__
+        except:
+            try:
+                gdalVersion = grass.Popen(['gdalinfo', '--version'], stdout = grass.PIPE).communicate()[0].rstrip('\n')
+            except:
+                gdalVersion = _("unknown")
+        # PROJ4
+        try:
+            projVersion = RunCommand('proj', getErrorMsg = True)[1].splitlines()[0]
+        except:
+            projVersion = _("unknown")
+        # check also OSGeo4W on MS Windows
+        if sys.platform == 'win32' and \
+                not os.path.exists(os.path.join(os.getenv("GISBASE"), "WinGRASS-README.url")):
+            osgeo4w = ' (OSGeo4W)'
+        else:
+            osgeo4w = ''
+        
+        self.goutput.WriteCmdLog(_("System Info"))
+        self.goutput.WriteLog("%s: %s\n"
+                              "%s: %s\n"
+                              "%s: %s (%s)\n"
+                              "GDAL/OGR: %s\n"
+                              "PROJ4: %s\n"
+                              "Python: %s\n"
+                              "wxPython: %s\n"
+                              "%s: %s%s\n"% (_("GRASS version"), vInfo['version'],
+                                           _("GRASS SVN Revision"), vInfo['revision'],
+                                           _("GIS Library Revision"), vInfo['libgis_revision'], vInfo['libgis_date'].split(' ', 1)[0],
+                                           gdalVersion, projVersion,
+                                           platform.python_version(),
+                                           wx.__version__,
+                                           _("Platform"), platform.platform(), osgeo4w),
+                              switchPage = True)
+        self.goutput.WriteCmdLog(' ')
+    
+    def OnAboutGRASS(self, event):
+        """!Display 'About GRASS' dialog"""
+        win = AboutWindow(self)
+        win.CentreOnScreen()
+        win.Show(True)  
+
+    def _popupMenu(self, data):
+        """!Create popup menu
+        """
+        point = wx.GetMousePosition()
+        menu = wx.Menu()
+        
+        for key, handler in data:
+            if key is None:
+                menu.AppendSeparator()
+                continue
+            item = wx.MenuItem(menu, wx.ID_ANY, LMIcons[key].GetLabel())
+            item.SetBitmap(LMIcons[key].GetBitmap(self.iconsize))
+            menu.AppendItem(item)
+            self.Bind(wx.EVT_MENU, handler, item)
+        
+        # create menu
+        self.PopupMenu(menu)
+        menu.Destroy()
+
+    def OnImportMenu(self, event):
+        """!Import maps menu (import, link)
+        """
+        self._popupMenu((('rastImport',    self.OnImportGdalLayers),
+                         ('vectImport',    self.OnImportOgrLayers)))
+        
+    def OnWorkspaceNew(self, event = None):
+        """!Create new workspace file
+
+        Erase current workspace settings first
+        """
+        Debug.msg(4, "GMFrame.OnWorkspaceNew():")
+        
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay()
+        
+        maptree = self.curr_page.maptree
+        
+        # ask user to save current settings
+        if self.workspaceFile and self.workspaceChanged:
+            self.OnWorkspaceSave()
+        elif self.workspaceFile is None and maptree.GetCount() > 0:
+             dlg = wx.MessageDialog(self, message = _("Current workspace is not empty. "
+                                                    "Do you want to store current settings "
+                                                    "to workspace file?"),
+                                    caption = _("Create new workspace?"),
+                                    style = wx.YES_NO | wx.YES_DEFAULT | \
+                                        wx.CANCEL | wx.ICON_QUESTION)
+             ret = dlg.ShowModal()
+             if ret == wx.ID_YES:
+                 self.OnWorkspaceSaveAs()
+             elif ret == wx.ID_CANCEL:
+                 dlg.Destroy()
+                 return
+             
+             dlg.Destroy()
+        
+        # delete all items
+        maptree.DeleteAllItems()
+        
+        # add new root element
+        maptree.root = maptree.AddRoot("Map Layers")
+        self.curr_page.maptree.SetPyData(maptree.root, (None,None))
+        
+        # no workspace file loaded
+        self.workspaceFile = None
+        self.workspaceChanged = False
+        self.SetTitle(self.baseTitle)
+        
+    def OnWorkspaceOpen(self, event = None):
+        """!Open file with workspace definition"""
+        dlg = wx.FileDialog(parent = self, message = _("Choose workspace file"),
+                            defaultDir = os.getcwd(), wildcard = _("GRASS Workspace File (*.gxw)|*.gxw"))
+
+        filename = ''
+        if dlg.ShowModal() == wx.ID_OK:
+            filename = dlg.GetPath()
+
+        if filename == '':
+            return
+
+        Debug.msg(4, "GMFrame.OnWorkspaceOpen(): filename=%s" % filename)
+        
+        # delete current layer tree content
+        self.OnWorkspaceClose()
+        
+        self.LoadWorkspaceFile(filename)
+
+        self.workspaceFile = filename
+        self.SetTitle(self.baseTitle + " - " +  os.path.basename(self.workspaceFile))
+
+    def LoadWorkspaceFile(self, filename):
+        """!Load layer tree definition stored in GRASS Workspace XML file (gxw)
+
+        @todo Validate against DTD
+        
+        @return True on success
+        @return False on error
+        """
+        # dtd
+        dtdFilename = os.path.join(globalvar.ETCWXDIR, "xml", "grass-gxw.dtd")
+        
+        # parse workspace file
+        try:
+            gxwXml = ProcessWorkspaceFile(etree.parse(filename))
+        except Exception, e:
+            GError(parent = self,
+                   message = _("Reading workspace file <%s> failed.\n"
+                                    "Invalid file, unable to parse XML document.") % filename)
+            return
+        
+        busy = wx.BusyInfo(message = _("Please wait, loading workspace..."),
+                           parent = self)
+        wx.Yield()
+
+        #
+        # load layer manager window properties
+        #
+        if not UserSettings.Get(group = 'general', key = 'workspace',
+                                subkey = ['posManager', 'enabled']):
+            if gxwXml.layerManager['pos']:
+                self.SetPosition(gxwXml.layerManager['pos'])
+            if gxwXml.layerManager['size']:
+                self.SetSize(gxwXml.layerManager['size'])
+        
+        #
+        # start map displays first (list of layers can be empty)
+        #
+        displayId = 0
+        mapdisplay = list()
+        for display in gxwXml.displays:
+            mapdisp = self.NewDisplay(name = display['name'], show = False)
+            mapdisplay.append(mapdisp)
+            maptree = self.gm_cb.GetPage(displayId).maptree
+            
+            # set windows properties
+            mapdisp.SetProperties(render = display['render'],
+                                  mode = display['mode'],
+                                  showCompExtent = display['showCompExtent'],
+                                  alignExtent = display['alignExtent'],
+                                  constrainRes = display['constrainRes'],
+                                  projection = display['projection']['enabled'])
+
+            if display['projection']['enabled']:
+                if display['projection']['epsg']:
+                    UserSettings.Set(group = 'display', key = 'projection', subkey = 'epsg',
+                                     value = display['projection']['epsg'])
+                    if display['projection']['proj']:
+                        UserSettings.Set(group = 'display', key = 'projection', subkey = 'proj4',
+                                         value = display['projection']['proj'])
+            
+            # set position and size of map display
+            if not UserSettings.Get(group = 'general', key = 'workspace', subkey = ['posDisplay', 'enabled']):
+                if display['pos']:
+                    mapdisp.SetPosition(display['pos'])
+                if display['size']:
+                    mapdisp.SetSize(display['size'])
+                    
+            # set extent if defined
+            if display['extent']:
+                w, s, e, n = display['extent']
+                region = maptree.Map.region = maptree.Map.GetRegion(w = w, s = s, e = e, n = n)
+                mapdisp.GetWindow().ResetZoomHistory()
+                mapdisp.GetWindow().ZoomHistory(region['n'],
+                                                region['s'],
+                                                region['e'],
+                                                region['w'])
+                
+            mapdisp.Show()
+            
+            displayId += 1
+    
+        maptree = None 
+        selected = [] # list of selected layers
+        # 
+        # load list of map layers
+        #
+        for layer in gxwXml.layers:
+            display = layer['display']
+            maptree = self.gm_cb.GetPage(display).maptree
+            
+            newItem = maptree.AddLayer(ltype = layer['type'],
+                                       lname = layer['name'],
+                                       lchecked = layer['checked'],
+                                       lopacity = layer['opacity'],
+                                       lcmd = layer['cmd'],
+                                       lgroup = layer['group'],
+                                       lnviz = layer['nviz'],
+                                       lvdigit = layer['vdigit'])
+            
+            if layer.has_key('selected'):
+                if layer['selected']:
+                    selected.append((maptree, newItem))
+                else:
+                    maptree.SelectItem(newItem, select = False)
+            
+        for maptree, layer in selected:
+            if not maptree.IsSelected(layer):
+                maptree.SelectItem(layer, select = True)
+                maptree.layer_selected = layer
+                
+        busy.Destroy()
+            
+        for idx, mdisp in enumerate(mapdisplay):
+            mdisp.MapWindow2D.UpdateMap()
+            # nviz
+            if gxwXml.displays[idx]['viewMode'] == '3d':
+                mdisp.AddNviz()
+                self.nviz.UpdateState(view = gxwXml.nviz_state['view'],
+                                              iview = gxwXml.nviz_state['iview'],
+                                              light = gxwXml.nviz_state['light'])
+                mdisp.MapWindow3D.constants = gxwXml.nviz_state['constants']
+                for idx, constant in enumerate(mdisp.MapWindow3D.constants):
+                    mdisp.MapWindow3D.AddConstant(constant, idx + 1)
+                for page in ('view', 'light', 'fringe', 'constant', 'cplane'):
+                    self.nviz.UpdatePage(page)
+                self.nviz.UpdateSettings()
+                mdisp.toolbars['map'].combo.SetSelection(1)
+            
+            mdisp.Show() # show mapdisplay
+        
+        return True
+    
+    def OnWorkspaceLoadGrcFile(self, event):
+        """!Load map layers from GRC file (Tcl/Tk GUI) into map layer tree"""
+        dlg = wx.FileDialog(parent = self, message = _("Choose GRC file to load"),
+                            defaultDir = os.getcwd(), wildcard = _("Old GRASS Workspace File (*.grc)|*.grc"))
+
+        filename = ''
+        if dlg.ShowModal() == wx.ID_OK:
+            filename = dlg.GetPath()
+
+        if filename == '':
+            return
+
+        Debug.msg(4, "GMFrame.OnWorkspaceLoadGrcFile(): filename=%s" % filename)
+
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay()
+
+        busy = wx.BusyInfo(message = _("Please wait, loading workspace..."),
+                           parent = self)
+        wx.Yield()
+
+        maptree = None
+        for layer in ProcessGrcFile(filename).read(self):
+            maptree = self.gm_cb.GetPage(layer['display']).maptree
+            newItem = maptree.AddLayer(ltype = layer['type'],
+                                       lname = layer['name'],
+                                       lchecked = layer['checked'],
+                                       lopacity = layer['opacity'],
+                                       lcmd = layer['cmd'],
+                                       lgroup = layer['group'])
+
+            busy.Destroy()
+            
+        if maptree:
+            # reverse list of map layers
+            maptree.Map.ReverseListOfLayers()
+
+    def OnWorkspaceSaveAs(self, event = None):
+        """!Save workspace definition to selected file"""
+        dlg = wx.FileDialog(parent = self, message = _("Choose file to save current workspace"),
+                            defaultDir = os.getcwd(), wildcard = _("GRASS Workspace File (*.gxw)|*.gxw"), style = wx.FD_SAVE)
+
+        filename = ''
+        if dlg.ShowModal() == wx.ID_OK:
+            filename = dlg.GetPath()
+
+        if filename == '':
+            return False
+
+        # check for extension
+        if filename[-4:] != ".gxw":
+            filename += ".gxw"
+
+        if os.path.exists(filename):
+            dlg = wx.MessageDialog(self, message = _("Workspace file <%s> already exists. "
+                                                     "Do you want to overwrite this file?") % filename,
+                                   caption = _("Save workspace"), style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+            if dlg.ShowModal() != wx.ID_YES:
+                dlg.Destroy()
+                return False
+
+        Debug.msg(4, "GMFrame.OnWorkspaceSaveAs(): filename=%s" % filename)
+
+        self.SaveToWorkspaceFile(filename)
+        self.workspaceFile = filename
+        self.SetTitle(self.baseTitle + " - " + os.path.basename(self.workspaceFile))
+
+    def OnWorkspaceSave(self, event = None):
+        """!Save file with workspace definition"""
+        if self.workspaceFile:
+            dlg = wx.MessageDialog(self, message = _("Workspace file <%s> already exists. "
+                                                   "Do you want to overwrite this file?") % \
+                                       self.workspaceFile,
+                                   caption = _("Save workspace"), style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+            if dlg.ShowModal() == wx.ID_NO:
+                dlg.Destroy()
+            else:
+                Debug.msg(4, "GMFrame.OnWorkspaceSave(): filename=%s" % self.workspaceFile)
+                self.SaveToWorkspaceFile(self.workspaceFile)
+                self.SetTitle(self.baseTitle + " - " + os.path.basename(self.workspaceFile))
+                self.workspaceChanged = False
+        else:
+            self.OnWorkspaceSaveAs()
+
+    def SaveToWorkspaceFile(self, filename):
+        """!Save layer tree layout to workspace file
+        
+        Return True on success, False on error
+        """
+        tmpfile = tempfile.TemporaryFile(mode = 'w+b')
+        try:
+            WriteWorkspaceFile(lmgr = self, file = tmpfile)
+        except StandardError, e:
+            GError(parent = self,
+                   message = _("Writing current settings to workspace file "
+                               "failed."))
+            return False
+        
+        try:
+            mfile = open(filename, "w")
+            tmpfile.seek(0)
+            for line in tmpfile.readlines():
+                mfile.write(line)
+        except IOError:
+            GError(parent = self,
+                   message = _("Unable to open file <%s> for writing.") % filename)
+            return False
+        
+        mfile.close()
+        
+        return True
+    
+    def OnWorkspaceClose(self, event = None):
+        """!Close file with workspace definition
+        
+        If workspace has been modified ask user to save the changes.
+        """
+        Debug.msg(4, "GMFrame.OnWorkspaceClose(): file=%s" % self.workspaceFile)
+        
+        self.OnDisplayCloseAll()
+        self.workspaceFile = None
+        self.workspaceChanged = False
+        self.SetTitle(self.baseTitle)
+        self.disp_idx = 0
+        self.curr_page = None
+        
+    def OnDisplayClose(self, event = None):
+        """!Close current map display window
+        """
+        if self.curr_page and self.curr_page.maptree.mapdisplay:
+            self.curr_page.maptree.mapdisplay.OnCloseWindow(event)
+        
+    def OnDisplayCloseAll(self, event = None):
+        """!Close all open map display windows
+        """
+        displays = list()
+        for page in range(0, self.gm_cb.GetPageCount()):
+            displays.append(self.gm_cb.GetPage(page).maptree.mapdisplay)
+        
+        for display in displays:
+            display.OnCloseWindow(event)
+        
+    def OnRenameDisplay(self, event):
+        """!Change Map Display name"""
+        name = self.gm_cb.GetPageText(self.curr_pagenum)
+        dlg = wx.TextEntryDialog(self, message = _("Enter new name:"),
+                                 caption = _("Rename Map Display"), defaultValue = name)
+        if dlg.ShowModal() == wx.ID_OK:
+            name = dlg.GetValue()
+            self.gm_cb.SetPageText(page = self.curr_pagenum, text = name)
+            mapdisplay = self.curr_page.maptree.mapdisplay
+            mapdisplay.SetTitle(_("GRASS GIS Map Display: %(name)s  - Location: %(loc)s") % \
+                                     { 'name' : name,
+                                       'loc' : grass.gisenv()["LOCATION_NAME"] })
+        dlg.Destroy()
+        
+    def RulesCmd(self, event):
+        """!Launches dialog for commands that need rules input and
+        processes rules
+        """
+        cmd = self.GetMenuCmd(event)
+        
+        if cmd[0] == 'r.colors':
+            ctable = RasterColorTable(self)
+        else:
+            ctable = VectorColorTable(self, attributeType = 'color')
+        ctable.CentreOnScreen()
+        ctable.Show()
+        
+    def OnXTermNoXMon(self, event):
+        """!
+        Run commands that need xterm
+        """
+        self.OnXTerm(event, need_xmon = False)
+        
+    def OnXTerm(self, event, need_xmon = True):
+        """!
+        Run commands that need interactive xmon
+
+        @param need_xmon True to start X monitor
+        """
+        # unset display mode
+        if os.getenv('GRASS_RENDER_IMMEDIATE'):
+            del os.environ['GRASS_RENDER_IMMEDIATE']
+        
+        if need_xmon:
+            # open next available xmon
+            xmonlist = []
+            
+            # make list of xmons that are not running
+            ret = RunCommand('d.mon',
+                             flags = 'L',
+                             read = True)
+            
+            for line in ret.split('\n'):               
+                line = line.strip()
+                if line.startswith('x') and 'not running' in line:
+                    xmonlist.append(line[0:2])
+            
+            # find available xmon
+            xmon = xmonlist[0]
+            
+            # bring up the xmon
+            cmdlist = ['d.mon', xmon]
+            p = Command(cmdlist, wait=False)
+        
+        # run the command        
+        command = self.GetMenuCmd(event)
+        command = ' '.join(command)
+        
+        gisbase = os.environ['GISBASE']
+        
+        if sys.platform == "win32":
+            runbat = os.path.join(gisbase,'etc','grass-run.bat')
+            cmdlist = ["start", runbat, runbat, command]
+        else:
+            if sys.platform == "darwin":
+                xtermwrapper = os.path.join(gisbase,'etc','grass-xterm-mac')
+            else:
+                xtermwrapper = os.path.join(gisbase,'etc','grass-xterm-wrapper')
+            
+            grassrun = os.path.join(gisbase,'etc','grass-run.sh')
+            cmdlist = [xtermwrapper, '-e', grassrun, command]
+        
+        p = Command(cmdlist, wait=False)
+        
+        # reset display mode
+        os.environ['GRASS_RENDER_IMMEDIATE'] = 'TRUE'
+        
+    def OnEditImageryGroups(self, event, cmd = None):
+        """!Show dialog for creating and editing groups.
+        """
+        dlg = GroupDialog(self)
+        dlg.CentreOnScreen()
+        dlg.Show()
+        
+    def OnInstallExtension(self, event):
+        """!Install extension from GRASS Addons SVN repository"""
+        win = InstallExtensionWindow(self, size = (650, 550))
+        win.CentreOnScreen()
+        win.Show()
+
+    def OnUninstallExtension(self, event):
+        """!Uninstall extension"""
+        win = UninstallExtensionWindow(self, size = (650, 300))
+        win.CentreOnScreen()
+        win.Show()
+
+    def OnPreferences(self, event):
+        """!General GUI preferences/settings
+        """
+        if not self.dialogs['preferences']:
+            dlg = PreferencesDialog(parent = self)
+            self.dialogs['preferences'] = dlg
+            self.dialogs['preferences'].CenterOnScreen()
+            
+            dlg.Bind(EVT_SETTINGS_CHANGED, self.OnSettingsChanged)
+        
+        self.dialogs['preferences'].ShowModal()
+        
+    def OnHelp(self, event):
+        """!Show help
+        """
+        self.goutput.RunCmd(['g.manual','-i'])
+        
+    def OnHistogram(self, event):
+        """!Init histogram display canvas and tools
+        """
+        from modules.histogram import HistogramFrame
+        win = HistogramFrame(self)
+        
+        win.CentreOnScreen()
+        win.Show()
+        win.Refresh()
+        win.Update()
+        
+    def OnProfile(self, event):
+        """!Launch profile tool
+        """
+        win = profile.ProfileFrame(parent = self)
+        
+        win.CentreOnParent()
+        win.Show()
+        win.Refresh()
+        win.Update()
+        
+    def OnMapCalculator(self, event, cmd = ''):
+        """!Init map calculator for interactive creation of mapcalc statements
+        """
+        if event:
+            try:
+                cmd = self.GetMenuCmd(event)
+            except KeyError:
+                cmd = ['r.mapcalc']
+        
+        win = MapCalcFrame(parent = self,
+                           cmd = cmd[0])
+        win.CentreOnScreen()
+        win.Show()
+        
+    def OnVectorCleaning(self, event, cmd = ''):
+        """!Init interactive vector cleaning
+        """
+        from modules.vclean import VectorCleaningFrame
+        win = VectorCleaningFrame(parent = self)
+        win.CentreOnScreen()
+        win.Show()
+        
+    def OnImportDxfFile(self, event, cmd = None):
+        """!Convert multiple DXF layers to GRASS vector map layers"""
+        dlg = DxfImportDialog(parent = self)
+        dlg.CentreOnScreen()
+        dlg.Show()
+
+    def OnImportGdalLayers(self, event, cmd = None):
+        """!Convert multiple GDAL layers to GRASS raster map layers"""
+        dlg = GdalImportDialog(parent = self)
+        dlg.CentreOnScreen()
+        dlg.Show()
+
+    def OnLinkGdalLayers(self, event, cmd = None):
+        """!Link multiple GDAL layers to GRASS raster map layers"""
+        dlg = GdalImportDialog(parent = self, link = True)
+        dlg.CentreOnScreen()
+        dlg.Show()
+        
+    def OnImportOgrLayers(self, event, cmd = None):
+        """!Convert multiple OGR layers to GRASS vector map layers"""
+        dlg = GdalImportDialog(parent = self, ogr = True)
+        dlg.CentreOnScreen()
+        dlg.Show()
+        
+    def OnLinkOgrLayers(self, event, cmd = None):
+        """!Links multiple OGR layers to GRASS vector map layers"""
+        dlg = GdalImportDialog(parent = self, ogr = True, link = True)
+        dlg.CentreOnScreen()
+        dlg.Show()
+        
+    def OnImportWMS(self, event, cmd = None):
+        """!Import data from OGC WMS server"""
+        dlg = WMSDialog(parent = self, service = 'wms')
+        dlg.CenterOnScreen()
+        
+        if dlg.ShowModal() == wx.ID_OK: # -> import layers
+            layers = dlg.GetLayers()
+            
+            if len(layers.keys()) > 0:
+                for layer in layers.keys():
+                    cmd = ['r.in.wms',
+                           'mapserver=%s' % dlg.GetSettings()['server'],
+                           'layers=%s' % layer,
+                           'output=%s' % layer,
+                           'format=png',
+                           '--overwrite']
+                    styles = ','.join(layers[layer])
+                    if styles:
+                        cmd.append('styles=%s' % styles)
+                    self.goutput.RunCmd(cmd, switchPage = True)
+
+                    self.curr_page.maptree.AddLayer(ltype = 'raster',
+                                                    lname = layer,
+                                                    lcmd = ['d.rast', 'map=%s' % layer],
+                                                    multiple = False)
+            else:
+                self.goutput.WriteWarning(_("Nothing to import. No WMS layer selected."))
+                
+                
+        dlg.Destroy()
+        
+    def OnShowAttributeTable(self, event, selection = None):
+        """!Show attribute table of the given vector map layer
+        """
+        if not self.curr_page:
+            self.MsgNoLayerSelected()
+            return
+        
+        tree = self.GetLayerTree()
+        layer = tree.layer_selected
+        # no map layer selected
+        if not layer:
+            self.MsgNoLayerSelected()
+            return
+        
+        # available only for vector map layers
+        try:
+            maptype = tree.GetPyData(layer)[0]['maplayer'].type
+        except:
+            maptype = None
+        
+        if not maptype or maptype != 'vector':
+            GMessage(parent = self,
+                          message = _("Selected map layer is not vector."))
+            return
+        
+        if not tree.GetPyData(layer)[0]:
+            return
+        dcmd = tree.GetPyData(layer)[0]['cmd']
+        if not dcmd:
+            return
+        
+        busy = wx.BusyInfo(message = _("Please wait, loading attribute data..."),
+                           parent = self)
+        wx.Yield()
+        
+        dbmanager = AttributeManager(parent = self, id = wx.ID_ANY,
+                                     size = wx.Size(500, 300),
+                                     item = layer, log = self.goutput,
+                                     selection = selection)
+        
+        busy.Destroy()
+        
+        # register ATM dialog
+        self.dialogs['atm'].append(dbmanager)
+        
+        # show ATM window
+        dbmanager.Show()
+        
+    def OnNewDisplayWMS(self, event = None):
+        """!Create new layer tree and map display instance"""
+        self.NewDisplayWMS()
+
+    def OnNewDisplay(self, event = None):
+        """!Create new layer tree and map display instance"""
+        self.NewDisplay()
+
+    def NewDisplay(self, name = None, show = True):
+        """!Create new layer tree, which will
+        create an associated map display frame
+
+        @param name name of new map display
+        @param show show map display window if True
+
+        @return reference to mapdisplay intance
+        """
+        Debug.msg(1, "GMFrame.NewDisplay(): idx=%d" % self.disp_idx)
+        
+        # make a new page in the bookcontrol for the layer tree (on page 0 of the notebook)
+        self.pg_panel = wx.Panel(self.gm_cb, id = wx.ID_ANY, style = wx.EXPAND)
+        if name:
+            dispName = name
+        else:
+            dispName = "Display " + str(self.disp_idx + 1)
+        self.gm_cb.AddPage(self.pg_panel, text = dispName, select = True)
+        self.curr_page = self.gm_cb.GetCurrentPage()
+        
+        # create layer tree (tree control for managing GIS layers)  and put on new notebook page
+        self.curr_page.maptree = LayerTree(self.curr_page, id = wx.ID_ANY, pos = wx.DefaultPosition,
+                                           size = wx.DefaultSize, style = wx.TR_HAS_BUTTONS |
+                                           wx.TR_LINES_AT_ROOT| wx.TR_HIDE_ROOT |
+                                           wx.TR_DEFAULT_STYLE| wx.NO_BORDER | wx.FULL_REPAINT_ON_RESIZE,
+                                           idx = self.disp_idx, lmgr = self, notebook = self.gm_cb,
+                                           auimgr = self._auimgr, showMapDisplay = show)
+        
+        # layout for controls
+        cb_boxsizer = wx.BoxSizer(wx.VERTICAL)
+        cb_boxsizer.Add(self.curr_page.maptree, proportion = 1, flag = wx.EXPAND, border = 1)
+        self.curr_page.SetSizer(cb_boxsizer)
+        cb_boxsizer.Fit(self.curr_page.maptree)
+        self.curr_page.Layout()
+        self.curr_page.maptree.Layout()
+        
+        # use default window layout
+        if UserSettings.Get(group = 'general', key = 'defWindowPos', subkey = 'enabled'):
+            dim = UserSettings.Get(group = 'general', key = 'defWindowPos', subkey = 'dim')
+            idx = 4 + self.disp_idx * 4
+            try:
+                x, y = map(int, dim.split(',')[idx:idx + 2])
+                w, h = map(int, dim.split(',')[idx + 2:idx + 4])
+                self.curr_page.maptree.mapdisplay.SetPosition((x, y))
+                self.curr_page.maptree.mapdisplay.SetSize((w, h))
+            except:
+                pass
+        
+        self.disp_idx += 1
+        
+        return self.curr_page.maptree.mapdisplay
+    
+    def OnAddMaps(self, event = None):
+        """!Add selected map layers into layer tree"""
+        dialog = MapLayersDialog(parent = self, title = _("Add selected map layers into layer tree"))
+        
+        if dialog.ShowModal() != wx.ID_OK:
+            dialog.Destroy()
+            return
+        
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay()
+            
+        maptree = self.curr_page.maptree
+        
+        for layerName in dialog.GetMapLayers():
+            ltype = dialog.GetLayerType(cmd = True)
+            if ltype == 'rast':
+                cmd = ['d.rast', 'map=%s' % layerName]
+                wxType = 'raster'
+            elif ltype == 'rast3d':
+                cmd = ['d.rast3d', 'map=%s' % layerName]
+                wxType = '3d-raster'
+            elif ltype == 'vect':
+                cmd = ['d.vect', 'map=%s' % layerName]
+                wxType = 'vector'
+            else:
+                GError(parent = self,
+                       message = _("Unsupported map layer type <%s>.") % ltype)
+                return
+            
+            newItem = maptree.AddLayer(ltype = wxType,
+                                       lname = layerName,
+                                       lchecked = False,
+                                       lopacity = 1.0,
+                                       lcmd = cmd,
+                                       lgroup = None)
+        dialog.Destroy()
+        
+    def OnAddRaster(self, event):
+        """!Add raster map layer"""
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay(show = True)
+        
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('raster')
+        
+    def OnAddRasterMisc(self, event):
+        """!Create misc raster popup-menu"""
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay(show = True)
+        
+        self._popupMenu((('addRast3d', self.OnAddRaster3D),
+                         (None, None),
+                         ('addRgb',    self.OnAddRasterRGB),
+                         ('addHis',    self.OnAddRasterHIS),
+                         (None, None),
+                         ('addShaded', self.OnAddRasterShaded),
+                         (None, None),
+                         ('addRArrow', self.OnAddRasterArrow),
+                         ('addRNum',   self.OnAddRasterNum)))
+        
+        # show map display
+        self.curr_page.maptree.mapdisplay.Show()
+        
+    def OnAddVector(self, event):
+        """!Add vector map to the current layer tree"""
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay(show = True)
+        
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('vector')
+
+    def OnAddVectorMisc(self, event):
+        """!Create misc vector popup-menu"""
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay(show = True)
+
+        self._popupMenu((('addThematic', self.OnAddVectorTheme),
+                         ('addChart',    self.OnAddVectorChart)))
+        
+        # show map display
+        self.curr_page.maptree.mapdisplay.Show()
+
+    def OnAddVectorTheme(self, event):
+        """!Add thematic vector map to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('thememap')
+
+    def OnAddVectorChart(self, event):
+        """!Add chart vector map to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('themechart')
+
+    def OnAddOverlay(self, event):
+        """!Create decoration overlay menu""" 
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay(show = True)
+
+        self._popupMenu((('addGrid',     self.OnAddGrid),
+                         ('addLabels',   self.OnAddLabels),
+                         ('addGeodesic', self.OnAddGeodesic),
+                         ('addRhumb',    self.OnAddRhumb),
+                         (None, None),
+                         ('addCmd',      self.OnAddCommand)))
+        
+        # show map display
+        self.curr_page.maptree.mapdisplay.Show()
+        
+    def OnAddRaster3D(self, event):
+        """!Add 3D raster map to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('3d-raster')
+
+    def OnAddRasterRGB(self, event):
+        """!Add RGB raster map to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('rgb')
+
+    def OnAddRasterHIS(self, event):
+        """!Add HIS raster map to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('his')
+
+    def OnAddRasterShaded(self, event):
+        """!Add shaded relief raster map to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('shaded')
+
+    def OnAddRasterArrow(self, event):
+        """!Add flow arrows raster map to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        tree = self.curr_page.maptree
+        resolution = tree.GetMapDisplay().GetProperty('resolution')
+        if not resolution:
+            dlg = self.MsgDisplayResolution()
+            if dlg.ShowModal() == wx.ID_YES:
+                tree.GetMapDisplay().SetProperty('resolution', True)
+            dlg.Destroy()
+
+        self.curr_page.maptree.AddLayer('rastarrow')
+
+    def OnAddRasterNum(self, event):
+        """!Add cell number raster map to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        tree = self.curr_page.maptree
+        resolution = tree.GetMapDisplay().GetProperty('resolution')
+        if not resolution:
+            limitText = _("Note that cell values can only be displayed for "
+                          "regions of less than 10,000 cells.")
+            dlg = self.MsgDisplayResolution(limitText)
+            if dlg.ShowModal() == wx.ID_YES:
+                tree.GetMapDisplay().SetProperty('resolution', True)
+            dlg.Destroy()
+
+        # region = tree.GetMap().GetCurrentRegion()
+        # if region['cells'] > 10000:
+        #   GMessage(message = "Cell values can only be displayed for regions of < 10,000 cells.", parent = self)
+        self.curr_page.maptree.AddLayer('rastnum')
+
+    def OnAddCommand(self, event):
+        """!Add command line map layer to the current layer tree"""
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay(show = True)
+
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('command')
+
+        # show map display
+        self.curr_page.maptree.mapdisplay.Show()
+
+    def OnAddGroup(self, event):
+        """!Add layer group"""
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay(show = True)
+
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('group')
+
+        # show map display
+        self.curr_page.maptree.mapdisplay.Show()
+
+    def OnAddGrid(self, event):
+        """!Add grid map layer to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('grid')
+
+    def OnAddGeodesic(self, event):
+        """!Add geodesic line map layer to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('geodesic')
+
+    def OnAddRhumb(self, event):
+        """!Add rhumb map layer to the current layer tree"""
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('rhumb')
+
+    def OnAddLabels(self, event):
+        """!Add vector labels map layer to the current layer tree"""
+        # start new map display if no display is available
+        if not self.curr_page:
+            self.NewDisplay(show = True)
+
+        self.notebook.SetSelectionByName('layers')
+        self.curr_page.maptree.AddLayer('labels')
+
+        # show map display
+        self.curr_page.maptree.mapdisplay.Show()
+
+    def OnDeleteLayer(self, event):
+        """!Remove selected map layer from the current layer Tree
+        """
+        if not self.curr_page or not self.curr_page.maptree.layer_selected:
+            self.MsgNoLayerSelected()
+            return
+
+        if UserSettings.Get(group = 'manager', key = 'askOnRemoveLayer', subkey = 'enabled'):
+            layerName = ''
+            for item in self.curr_page.maptree.GetSelections():
+                name = str(self.curr_page.maptree.GetItemText(item))
+                idx = name.find('(opacity')
+                if idx > -1:
+                    layerName += '<' + name[:idx].strip(' ') + '>,\n'
+                else:
+                    layerName += '<' + name + '>,\n'
+            layerName = layerName.rstrip(',\n')
+            
+            if len(layerName) > 2: # <>
+                message = _("Do you want to remove map layer(s)\n%s\n"
+                            "from layer tree?") % layerName
+            else:
+                message = _("Do you want to remove selected map layer(s) "
+                            "from layer tree?")
+
+            dlg = wx.MessageDialog (parent = self, message = message,
+                                    caption = _("Remove map layer"),
+                                    style  =  wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+
+            if dlg.ShowModal() != wx.ID_YES:
+                dlg.Destroy()
+                return
+            
+            dlg.Destroy()
+
+        for layer in self.curr_page.maptree.GetSelections():
+            if self.curr_page.maptree.GetPyData(layer)[0]['type'] == 'group':
+                self.curr_page.maptree.DeleteChildren(layer)
+            self.curr_page.maptree.Delete(layer)
+        
+    def OnKeyDown(self, event):
+        """!Key pressed"""
+        kc = event.GetKeyCode()
+        
+        if event.ControlDown():
+            if kc == wx.WXK_TAB:
+                # switch layer list / command output
+                if self.notebook.GetSelection() == self.notebook.GetPageIndexByName('layers'):
+                    self.notebook.SetSelectionByName('output')
+                else:
+                    self.notebook.SetSelectionByName('layers')
+        
+        try:
+            ckc = chr(kc)
+        except ValueError:
+            event.Skip()
+            return
+        
+        if event.CtrlDown():
+            if kc == 'R':
+                self.OnAddRaster(None)
+            elif kc == 'V':
+                self.OnAddVector(None)
+        
+        event.Skip()
+
+    def OnCloseWindow(self, event):
+        """!Cleanup when wxGUI is quitted"""
+        # save command protocol if actived
+        if self.goutput.btnCmdProtocol.GetValue():
+            self.goutput.CmdProtocolSave()
+        
+        if not self.curr_page:
+            self._auimgr.UnInit()
+            self.Destroy()
+            return
+        
+        # save changes in the workspace
+        maptree = self.curr_page.maptree
+        if self.workspaceChanged and \
+                UserSettings.Get(group = 'manager', key = 'askOnQuit', subkey = 'enabled'):
+            if self.workspaceFile:
+                message = _("Do you want to save changes in the workspace?")
+            else:
+                message = _("Do you want to store current settings "
+                            "to workspace file?")
+            
+            # ask user to save current settings
+            if maptree.GetCount() > 0:
+                dlg = wx.MessageDialog(self,
+                                       message = message,
+                                       caption = _("Quit GRASS GUI"),
+                                       style = wx.YES_NO | wx.YES_DEFAULT |
+                                       wx.CANCEL | wx.ICON_QUESTION | wx.CENTRE)
+                ret = dlg.ShowModal()
+                if ret == wx.ID_YES:
+                    if not self.workspaceFile:
+                        self.OnWorkspaceSaveAs()
+                    else:
+                        self.SaveToWorkspaceFile(self.workspaceFile)
+                elif ret == wx.ID_CANCEL:
+                    # when called from menu, it gets CommandEvent and not CloseEvent
+                    if hasattr(event, 'Veto'):
+                        event.Veto()
+                    dlg.Destroy()
+                    return
+                dlg.Destroy()
+        
+        # don't ask any more...
+        UserSettings.Set(group = 'manager', key = 'askOnQuit', subkey = 'enabled',
+                         value = False)
+        
+        self.OnDisplayCloseAll()
+        
+        self.gm_cb.DeleteAllPages()
+        
+        self._auimgr.UnInit()
+        self.Destroy()
+        
+    def MsgNoLayerSelected(self):
+        """!Show dialog message 'No layer selected'"""
+        wx.MessageBox(parent = self,
+                      message = _("No map layer selected. Operation canceled."),
+                      caption = _("Message"),
+                      style = wx.OK | wx.ICON_INFORMATION | wx.CENTRE)
+                      
+    def MsgDisplayResolution(self, limitText = None):
+        """!Returns dialog for d.rast.num, d.rast.arrow
+            when display resolution is not constrained
+            
+        @param limitText adds a note about cell limit
+        """
+        message = _("Display resolution is currently not constrained to "
+                    "computational settings. "
+                    "It's suggested to constrain map to region geometry. "
+                    "Do you want to constrain "
+                    "the resolution?")
+        if limitText:
+            message += "\n\n%s" % _(limitText)
+        dlg = wx.MessageDialog(parent = self,
+                               message = message,
+                               caption = _("Constrain map to region geometry?"),
+                               style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION | wx.CENTRE)
+        return dlg
diff --git a/gui/wxpython/gui_modules/layertree.py b/gui/wxpython/lmgr/layertree.py
similarity index 79%
rename from gui/wxpython/gui_modules/layertree.py
rename to gui/wxpython/lmgr/layertree.py
index e266cc4..29f9f87 100644
--- a/gui/wxpython/gui_modules/layertree.py
+++ b/gui/wxpython/lmgr/layertree.py
@@ -1,60 +1,98 @@
 """!
- at package layertree.py
+ at package lmgr.layertree
 
 @brief Utility classes for map layer management.
 
 Classes:
- - AbstractLayer
- - Layer
- - LayerTree
+ - layertree::LayerTree
 
 (C) 2007-2011 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
  
 @author Michael Barton (Arizona State University)
 @author Jachym Cepicky (Mendel University of Agriculture)
 @author Martin Landa <landa.martin gmail.com>
 """
 
-import os
 import sys
-import string
-
 import wx
 try:
     import wx.lib.agw.customtreectrl as CT
 except ImportError:
     import wx.lib.customtreectrl as CT
-import wx.combo
-import wx.lib.newevent
-import wx.lib.buttons  as  buttons
+import wx.lib.buttons  as buttons
 try:
     import treemixin 
 except ImportError:
     from wx.lib.mixins import treemixin
 
-import globalvar
-
 from grass.script import core as grass
-
-import gdialogs
-import menuform
-import toolbars
-import mapdisp
-import render
-import histogram
-import utils
-import profile
-from debug import Debug as Debug
-from icon import Icons as Icons
-from preferences import globalSettings as UserSettings
-from vdigit import haveVDigit
-from gcmd import GWarning
+from grass.script import vector as gvector
+
+from core                import globalvar
+from gui_core.dialogs    import SetOpacityDialog, EVT_APPLY_OPACITY
+from gui_core.forms      import GUI
+from mapdisp.frame       import MapFrame
+from core.render         import Map
+from modules.histogram   import HistogramFrame
+from core.utils          import GetLayerNameFromCmd
+from wxplot.profile      import ProfileFrame
+from core.debug          import Debug
+from core.settings       import UserSettings
+from core.gcmd           import GWarning
+from gui_core.toolbars   import BaseIcons
+from icons.icon          import MetaIcon
 
 TREE_ITEM_HEIGHT = 25
 
+LMIcons = {
+    'rastImport' : MetaIcon(img = 'layer-import',
+                            label = _('Import raster data')),
+    'rastLink'   : MetaIcon(img = 'layer-import',
+                            label = _('Link external raster data')),
+    'rastOut'    : MetaIcon(img = 'layer-export',
+                            label = _('Set raster output format')),
+    'vectImport' : MetaIcon(img = 'layer-import',
+                            label = _('Import vector data')),
+    'vectLink'   : MetaIcon(img = 'layer-import',
+                                    label = _('Link external vector data')),
+    'vectOut'    : MetaIcon(img = 'layer-export',
+                            label = _('Set vector output format')),
+    'addCmd'     : MetaIcon(img = 'layer-command-add',
+                            label = _('Add command layer')),
+    'quit'       : MetaIcon(img = 'quit',
+                            label = _('Quit')),
+    'addRgb'     : MetaIcon(img = 'layer-rgb-add',
+                            label = _('Add RGB map layer')),
+    'addHis'     : MetaIcon(img = 'layer-his-add',
+                                    label = _('Add HIS map layer')),
+    'addShaded'  : MetaIcon(img = 'layer-shaded-relief-add',
+                            label = _('Add shaded relief map layer')),
+    'addRArrow'  : MetaIcon(img = 'layer-aspect-arrow-add',
+                            label = _('Add raster flow arrows')),
+    'addRNum'    : MetaIcon(img = 'layer-cell-cats-add',
+                            label = _('Add raster cell numbers')),
+    'addThematic': MetaIcon(img = 'layer-vector-thematic-add',
+                            label = _('Add thematic area (choropleth) map layer')),
+    'addChart'   : MetaIcon(img = 'layer-vector-chart-add',
+                            label = _('Add thematic chart layer')),
+    'addGrid'    : MetaIcon(img = 'layer-grid-add',
+                            label = _('Add grid layer')),
+    'addGeodesic': MetaIcon(img = 'shortest-distance',
+                            label = _('Add geodesic line layer')),
+    'addRhumb'   : MetaIcon(img = 'shortest-distance',
+                            label = _('Add rhumbline layer')),
+    'addLabels'  : MetaIcon(img = 'layer-label-add',
+                            label = _('Add labels')),
+    'addRast3d'  : MetaIcon(img = 'layer-raster3d-add',
+                            label = _('Add 3D raster map layer'),
+                            desc  =  _('Note that 3D raster data are rendered only in 3D view mode')),
+    'layerOptions'  : MetaIcon(img = 'options',
+                               label = _('Set options')),
+    }
+
 class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
     """!Creates layer tree structure
     """
@@ -78,7 +116,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         showMapDisplay = kwargs['showMapDisplay']
         del kwargs['showMapDisplay']
         self.treepg = parent                 # notebook page holding layer tree
-        self.Map = render.Map()              # instance of render.Map to be associated with display
+        self.Map = Map()                     # instance of render.Map to be associated with display
         self.root = None                     # ID of layer tree root node
         self.groupnode = 0                   # index value for layers
         self.optpage = {}                    # dictionary of notebook option pages for each map layer
@@ -88,6 +126,8 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         self.flag = ''                       # flag for drag and drop hittest
         self.rerender = False                # layer change requires a rerendering if auto render
         self.reorder = False                 # layer change requires a reordering
+        self.hitCheckbox = False             # if cursor points at layer checkbox (to cancel selection changes)
+        self.forceCheck = False              # force check layer if CheckItem is called
         
         try:
             ctstyle |= CT.TR_ALIGN_WINDOWS
@@ -109,13 +149,13 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         
         # init associated map display
         pos = wx.Point((self.disp_idx + 1) * 25, (self.disp_idx + 1) * 25)
-        self.mapdisplay = mapdisp.MapFrame(self,
-                                           id = wx.ID_ANY, pos = pos,
-                                           size = globalvar.MAP_WINDOW_SIZE,
-                                           style = wx.DEFAULT_FRAME_STYLE,
-                                           tree = self, notebook = self.notebook,
-                                           lmgr = self.lmgr, page = self.treepg,
-                                           Map = self.Map, auimgr = self.auimgr)
+        self.mapdisplay = MapFrame(self,
+                                   id = wx.ID_ANY, pos = pos,
+                                   size = globalvar.MAP_WINDOW_SIZE,
+                                   style = wx.DEFAULT_FRAME_STYLE,
+                                   tree = self, notebook = self.notebook,
+                                   lmgr = self.lmgr, page = self.treepg,
+                                   Map = self.Map, auimgr = self.auimgr)
         
         # title
         self.mapdisplay.SetTitle(_("GRASS GIS Map Display: %(id)d  - Location: %(loc)s") % \
@@ -140,50 +180,49 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         self.folder = il.Add(trart)
         
         bmpsize = (16, 16)
-        icons = Icons['layerManager']
-        trgif = icons["addRast"].GetBitmap(bmpsize)
+        trgif = BaseIcons["addRast"].GetBitmap(bmpsize)
         self.rast_icon = il.Add(trgif)
         
-        trgif = icons["addRast3d"].GetBitmap(bmpsize)
+        trgif = LMIcons["addRast3d"].GetBitmap(bmpsize)
         self.rast3d_icon = il.Add(trgif)
         
-        trgif = icons["addRgb"].GetBitmap(bmpsize)
+        trgif = LMIcons["addRgb"].GetBitmap(bmpsize)
         self.rgb_icon = il.Add(trgif)
         
-        trgif = icons["addHis"].GetBitmap(bmpsize)
+        trgif = LMIcons["addHis"].GetBitmap(bmpsize)
         self.his_icon = il.Add(trgif)
         
-        trgif = icons["addShaded"].GetBitmap(bmpsize)
+        trgif = LMIcons["addShaded"].GetBitmap(bmpsize)
         self.shaded_icon = il.Add(trgif)
         
-        trgif = icons["addRArrow"].GetBitmap(bmpsize)
+        trgif = LMIcons["addRArrow"].GetBitmap(bmpsize)
         self.rarrow_icon = il.Add(trgif)
         
-        trgif = icons["addRNum"].GetBitmap(bmpsize)
+        trgif = LMIcons["addRNum"].GetBitmap(bmpsize)
         self.rnum_icon = il.Add(trgif)
         
-        trgif = icons["addVect"].GetBitmap(bmpsize)
+        trgif = BaseIcons["addVect"].GetBitmap(bmpsize)
         self.vect_icon = il.Add(trgif)
         
-        trgif = icons["addThematic"].GetBitmap(bmpsize)
+        trgif = LMIcons["addThematic"].GetBitmap(bmpsize)
         self.theme_icon = il.Add(trgif)
         
-        trgif = icons["addChart"].GetBitmap(bmpsize)
+        trgif = LMIcons["addChart"].GetBitmap(bmpsize)
         self.chart_icon = il.Add(trgif)
         
-        trgif = icons["addGrid"].GetBitmap(bmpsize)
+        trgif = LMIcons["addGrid"].GetBitmap(bmpsize)
         self.grid_icon = il.Add(trgif)
         
-        trgif = icons["addGeodesic"].GetBitmap(bmpsize)
+        trgif = LMIcons["addGeodesic"].GetBitmap(bmpsize)
         self.geodesic_icon = il.Add(trgif)
         
-        trgif = icons["addRhumb"].GetBitmap(bmpsize)
+        trgif = LMIcons["addRhumb"].GetBitmap(bmpsize)
         self.rhumb_icon = il.Add(trgif)
         
-        trgif = icons["addLabels"].GetBitmap(bmpsize)
+        trgif = LMIcons["addLabels"].GetBitmap(bmpsize)
         self.labels_icon = il.Add(trgif)
         
-        trgif = icons["addCmd"].GetBitmap(bmpsize)
+        trgif = LMIcons["addCmd"].GetBitmap(bmpsize)
         self.cmd_icon = il.Add(trgif)
         
         self.AssignImageList(il)
@@ -192,13 +231,16 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         self.Bind(wx.EVT_TREE_ITEM_COLLAPSED,   self.OnCollapseNode)
         self.Bind(wx.EVT_TREE_ITEM_ACTIVATED,   self.OnActivateLayer)
         self.Bind(wx.EVT_TREE_SEL_CHANGED,      self.OnChangeSel)
+        self.Bind(wx.EVT_TREE_SEL_CHANGING,     self.OnChangingSel)
         self.Bind(CT.EVT_TREE_ITEM_CHECKED,     self.OnLayerChecked)
+        self.Bind(CT.EVT_TREE_ITEM_CHECKING,    self.OnLayerChecking)
         self.Bind(wx.EVT_TREE_DELETE_ITEM,      self.OnDeleteLayer)
         self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnLayerContextMenu)
         self.Bind(wx.EVT_TREE_END_DRAG,         self.OnEndDrag)
         self.Bind(wx.EVT_TREE_END_LABEL_EDIT,   self.OnRenamed)
         self.Bind(wx.EVT_KEY_UP,                self.OnKeyUp)
         self.Bind(wx.EVT_IDLE,                  self.OnIdle)
+        self.Bind(wx.EVT_MOTION,                self.OnMotion)
 
     def _setGradient(self, iType = None):
         """!Set gradient for items
@@ -215,6 +257,22 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
             self.SetFirstGradientColour(wx.Colour(100, 100, 100))
             self.SetSecondGradientColour(wx.Colour(150, 150, 150))
         
+    def GetSelections(self):
+        """Returns a list of selected items.
+
+        This method is copied from customtreecontrol and overriden because
+        with some version wx (?) multiple selection doesn't work. 
+        Probably it is caused by another GetSelections method in treemixin.DragAndDrop?
+        """
+        array = []
+        idRoot = self.GetRootItem()
+        if idRoot:
+            array = self.FillArray(idRoot, array)
+        
+        #else: the tree is empty, so no selections
+
+        return array
+
     def GetMap(self):
         """!Get map instace"""
         return self.Map
@@ -228,12 +286,14 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         idle time instead of multiple times during layer changing.
         """
         if self.rerender:
-            if self.mapdisplay.toolbars['vdigit']:
+            if self.mapdisplay.GetToolbar('vdigit'):
                 vector = True
             else:
                 vector = False
-            if self.mapdisplay.statusbarWin['render'].GetValue():
-                self.mapdisplay.MapWindow.UpdateMap(render = True, renderVector = vector)
+            if self.mapdisplay.IsAutoRendered():
+                self.mapdisplay.MapWindow2D.UpdateMap(render = True, renderVector = vector)
+                if self.lmgr.IsPaneShown('toolbarNviz'): # nviz
+                    self.mapdisplay.MapWindow3D.UpdateMap(render = True)
             
             self.rerender = False
         
@@ -294,7 +354,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                 self.popupMenu.Enable(self.popupID['opacity'], False)
                 self.popupMenu.Enable(self.popupID['properties'], False)
             
-            if ltype in ('raster', 'vector', '3d-raster') and self.mapdisplay.toolbars['nviz']:
+            if ltype in ('raster', 'vector', '3d-raster') and self.lmgr.IsPaneShown('toolbarNviz'):
                 self.popupMenu.Append(self.popupID['nviz'], _("3D view properties"))
                 self.Bind (wx.EVT_MENU, self.OnNvizProperties, id = self.popupID['nviz'])
             
@@ -319,6 +379,10 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                       id = self.popupID['export'])
             
             self.popupMenu.AppendSeparator()
+
+            self.popupMenu.Append(self.popupID['color'], _("Set color table"))
+            self.Bind (wx.EVT_MENU, self.OnVectorColorTable, id = self.popupID['color'])
+
             self.popupMenu.Append(self.popupID['attr'], text = _("Show attribute data"))
             self.Bind(wx.EVT_MENU, self.lmgr.OnShowAttributeTable, id = self.popupID['attr'])
 
@@ -330,7 +394,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
             
             layer = self.GetPyData(self.layer_selected)[0]['maplayer']
             # enable editing only for vector map layers available in the current mapset
-            digitToolbar = self.mapdisplay.toolbars['vdigit']
+            digitToolbar = self.mapdisplay.GetToolbar('vdigit')
             if digitToolbar:
                 # background vector map
                 self.popupMenu.Append(self.popupID['bgmap'],
@@ -389,7 +453,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
             
             self.popupMenu.AppendSeparator()
             self.popupMenu.Append(self.popupID['color'], _("Set color table"))
-            self.Bind (wx.EVT_MENU, self.OnColorTable, id = self.popupID['color'])
+            self.Bind (wx.EVT_MENU, self.OnRasterColorTable, id = self.popupID['color'])
             self.popupMenu.Append(self.popupID['hist'], _("Histogram"))
             self.Bind (wx.EVT_MENU, self.OnHistogram, id = self.popupID['hist'])
             self.popupMenu.Append(self.popupID['univar'], _("Univariate raster statistics"))
@@ -407,8 +471,9 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                 self.popupMenu.Enable(self.popupID['univar'],  False)
                 self.popupMenu.Enable(self.popupID['prof'],    False)
                 self.popupMenu.Enable(self.popupID['meta'],    False)
-                self.popupMenu.Enable(self.popupID['nviz'],    False)
                 self.popupMenu.Enable(self.popupID['export'],  False)
+                if self.lmgr.IsPaneShown('toolbarNviz'):
+                    self.popupMenu.Enable(self.popupID['nviz'], False)
 
         self.PopupMenu(self.popupMenu)
         self.popupMenu.Destroy()
@@ -478,7 +543,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         # print output to command log area
         if len(cmd) > 1:
             cmd.append('-p')
-            self.lmgr.goutput.RunCmd(cmd)
+            self.lmgr.goutput.RunCmd(cmd, compReg = False)
         
     def OnProfile(self, event):
         """!Plot profile of given raster map layer"""
@@ -497,56 +562,47 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
             self.profileFrame = self.mapdisplay.profile
 
         if not self.profileFrame:
-            self.profileFrame = profile.ProfileFrame(self.mapdisplay,
-                                                     id = wx.ID_ANY, pos = wx.DefaultPosition, size = (700,300),
-                                                     style = wx.DEFAULT_FRAME_STYLE, rasterList = [mapLayer.GetName()])
+            self.profileFrame = ProfileFrame(self.mapdisplay,
+                                             id = wx.ID_ANY, pos = wx.DefaultPosition, size = (700,300),
+                                             style = wx.DEFAULT_FRAME_STYLE, rasterList = [mapLayer.GetName()])
             # show new display
             self.profileFrame.Show()
         
-    def OnColorTable(self, event):
+    def OnRasterColorTable(self, event):
         """!Set color table for raster map"""
         name = self.GetPyData(self.layer_selected)[0]['maplayer'].GetName()
-        menuform.GUI(parent = self).ParseCommand(['r.colors',
-                                                  'map=%s' % name])
+        GUI(parent = self).ParseCommand(['r.colors',
+                                         'map=%s' % name])
+
+    def OnVectorColorTable(self, event):
+        """!Set color table for vector map"""
+        name = self.GetPyData(self.layer_selected)[0]['maplayer'].GetName()
+        GUI(parent = self, centreOnParent = False).ParseCommand(['v.colors',
+                                                                 'map=%s' % name])
         
     def OnHistogram(self, event):
-        """
-        Plot histogram for given raster map layer
+        """!Plot histogram for given raster map layer
         """
         mapLayer = self.GetPyData(self.layer_selected)[0]['maplayer']
         if not mapLayer.GetName():
-            wx.MessageBox(parent = self,
-                          message = _("Unable to display histogram of "
-                                    "raster map."),
-                          caption = _("Error"), style = wx.OK | wx.ICON_ERROR | wx.CENTRE)
-            return False
-
-        if not hasattr (self, "histogramFrame"):
-            self.histogramFrame = None
-
-        if hasattr (self.mapdisplay, "histogram") and self.mapdisplay.histogram:
-            self.histogramFrame = self.mapdisplay.histogram
-
-        if not self.histogramFrame:
-            self.histogramFrame = histogram.HistFrame(self,
-                                                      id = wx.ID_ANY,
-                                                      pos = wx.DefaultPosition, size = globalvar.HIST_WINDOW_SIZE,
-                                                      style = wx.DEFAULT_FRAME_STYLE)
-            # show new display
-            self.histogramFrame.Show()
-
-        self.histogramFrame.SetHistLayer(mapLayer.GetName())
-        self.histogramFrame.HistWindow.UpdateHist()
-        self.histogramFrame.Refresh()
-        self.histogramFrame.Update()
-
-        return True
-
+            GError(parent = self,
+                   message = _("Unable to display histogram of "
+                               "raster map. No map name defined."))
+            return
+        
+        win = HistogramFrame(parent = self)
+        
+        win.CentreOnScreen()
+        win.Show()
+        win.SetHistLayer(mapLayer.GetName())
+        win.HistWindow.UpdateHist()
+        win.Refresh()
+        win.Update()
+        
     def OnUnivariateStats(self, event):
         """!Univariate raster statistics"""
         name = self.GetPyData(self.layer_selected)[0]['maplayer'].GetName()
-        menuform.GUI(parent = self).ParseCommand(['r.univar',
-                                                  'map=%s' % name])
+        self.lmgr.goutput.RunCmd(['r.univar', 'map=%s' % name], switchPage = True)
 
     def OnStartEditing(self, event):
         """!Start editing vector map layer requested by the user
@@ -557,7 +613,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
             event.Skip()
             return
         
-        if not self.mapdisplay.toolbars['vdigit']: # enable tool
+        if not self.mapdisplay.GetToolbar('vdigit'): # enable tool
             self.mapdisplay.AddToolbar('vdigit')
         
         if not self.mapdisplay.toolbars['vdigit']:
@@ -609,26 +665,41 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         maplayer = self.GetPyData(self.layer_selected)[0]['maplayer']
         current_opacity = maplayer.GetOpacity()
         
-        dlg = gdialogs.SetOpacityDialog(self, opacity = current_opacity,
-                                        title = _("Set opacity <%s>") % maplayer.GetName())
+        dlg = SetOpacityDialog(self, opacity = current_opacity,
+                               title = _("Set opacity of <%s>") % maplayer.GetName())
         dlg.CentreOnParent()
+        dlg.Bind(EVT_APPLY_OPACITY, self.OnApplyLayerOpacity)
 
         if dlg.ShowModal() == wx.ID_OK:
-            new_opacity = dlg.GetOpacity() # string
-            self.Map.ChangeOpacity(maplayer, new_opacity)
-            maplayer.SetOpacity(new_opacity)
-            self.SetItemText(self.layer_selected,
-                             self._getLayerName(self.layer_selected))
+            self.ChangeLayerOpacity(layer = self.layer_selected, value = dlg.GetOpacity())
+        dlg.Destroy()
+
+    def OnApplyLayerOpacity(self, event):
+        """!Handles EVT_APPLY_OPACITY event."""
+        self.ChangeLayerOpacity(layer = self.layer_selected, value = event.value)
+
+    def ChangeLayerOpacity(self, layer, value):
+        """!Change opacity value of layer
+        @param layer layer for which to change (item in layertree)
+        @param value opacity value (float between 0 and 1)
+        """
+        maplayer = self.GetPyData(layer)[0]['maplayer']
+        self.Map.ChangeOpacity(maplayer, value)
+        maplayer.SetOpacity(value)
+        self.SetItemText(layer,
+                         self._getLayerName(layer))
+        
+        # vector layer currently edited
+        if self.GetMapDisplay().GetToolbar('vdigit') and \
+                self.GetMapDisplay().GetToolbar('vdigit').GetLayer() == maplayer:
+            alpha = int(value * 255)
+            self.GetMapDisplay().GetWindow().digit.GetDisplay().UpdateSettings(alpha = alpha)
             
-            # vector layer currently edited
-            if self.mapdisplay.toolbars['vdigit'] and \
-                    self.mapdisplay.toolbars['vdigit'].GetLayer() == maplayer:   
-                alpha = int(new_opacity * 255)
-                self.mapdisplay.GetWindow().digit.GetDisplay().UpdateSettings(alpha = alpha)
-                
-            # redraw map if auto-rendering is enabled
-            self.rerender = True
-            self.reorder = True
+        # redraw map if auto-rendering is enabled
+        renderVector = False
+        if self.GetMapDisplay().GetToolbar('vdigit'):
+            renderVector = True
+        self.GetMapDisplay().GetWindow().UpdateMap(render = False, renderVector = renderVector)
 
     def OnNvizProperties(self, event):
         """!Nviz-related properties (raster/vector/volume)
@@ -693,19 +764,16 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         
         if ltype == 'command':
             # generic command item
-            ctrl = wx.TextCtrl(self, id = wx.ID_ANY, value = '',
-                               pos = wx.DefaultPosition, size = (self.GetSize()[0]-100,25),
-                               # style = wx.TE_MULTILINE|wx.TE_WORDWRAP)
-                               style = wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
+            ctrl = self._createCommandCtrl()
             ctrl.Bind(wx.EVT_TEXT_ENTER, self.OnCmdChanged)
-            # ctrl.Bind(wx.EVT_TEXT,       self.OnCmdChanged)
+
         elif ltype == 'group':
             # group item
             ctrl = None
             grouptext = _('Layer group:') + str(self.groupnode)
             self.groupnode += 1
         else:
-            btnbmp = Icons['layerManager']["layerOptions"].GetBitmap((16,16))
+            btnbmp = LMIcons["layerOptions"].GetBitmap((16,16))
             ctrl = buttons.GenBitmapButton(self, id = wx.ID_ANY, bitmap = btnbmp, size = (24,24))
             ctrl.SetToolTipString(_("Click to edit layer settings"))
             self.Bind(wx.EVT_BUTTON, self.OnLayerContextMenu, ctrl)
@@ -745,6 +813,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         else:
             checked = True
         
+        self.forceCheck = True
         self.CheckItem(layer, checked = checked)
         
         # add text and icons for each layer ltype
@@ -754,7 +823,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
             self.SetItemText(layer, '%s %s' % (_('raster'), label))
         elif ltype == '3d-raster':
             self.SetItemImage(layer, self.rast3d_icon)
-            self.SetItemText(layer, '%s %s' % (_('3d raster'), label))
+            self.SetItemText(layer, '%s %s' % (_('3D raster'), label))
         elif ltype == 'rgb':
             self.SetItemImage(layer, self.rgb_icon)
             self.SetItemText(layer, '%s %s' % (_('RGB'), label))
@@ -763,7 +832,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
             self.SetItemText(layer, '%s %s' % (_('HIS'), label))
         elif ltype == 'shaded':
             self.SetItemImage(layer, self.shaded_icon)
-            self.SetItemText(layer, '%s %s' % (_('Shaded relief'), label))
+            self.SetItemText(layer, '%s %s' % (_('shaded relief'), label))
         elif ltype == 'rastnum':
             self.SetItemImage(layer, self.rnum_icon)
             self.SetItemText(layer, '%s %s' % (_('raster cell numbers'), label))
@@ -803,7 +872,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
             if lcmd and len(lcmd) > 1:
                 cmd = lcmd
                 render = False
-                name, found = utils.GetLayerNameFromCmd(lcmd)
+                name, found = GetLayerNameFromCmd(lcmd)
             else:
                 cmd = []
                 if ltype == 'command' and lname:
@@ -817,7 +886,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                 ctrlId = ctrl.GetId()
             else:
                 ctrlId = None
-                
+            
             # add a data object to hold the layer's command (does not apply to generic command layers)
             self.SetPyData(layer, ({'cmd'      : cmd,
                                     'type'     : ltype,
@@ -878,18 +947,16 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         
         # updated progress bar range (mapwindow statusbar)
         if checked is True:
-            self.mapdisplay.statusbarWin['progress'].SetRange(len(self.Map.GetListOfLayers(l_active = True)))
+            self.mapdisplay.GetProgressBar().SetRange(len(self.Map.GetListOfLayers(l_active = True)))
             
         return layer
 
-    def PropertiesDialog (self, layer, show = True):
+    def PropertiesDialog(self, layer, show = True):
         """!Launch the properties dialog"""
         if 'propwin' in self.GetPyData(layer)[0] and \
                 self.GetPyData(layer)[0]['propwin'] is not None:
             # recycle GUI dialogs
             win = self.GetPyData(layer)[0]['propwin']
-            # update properties (columns, layers)
-            win.notebookpanel.OnUpdateSelection(None)
             if win.IsShown():
                 win.SetFocus()
             else:
@@ -903,46 +970,38 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                 
         Debug.msg (3, "LayerTree.PropertiesDialog(): ltype=%s" % \
                    ltype)
-
+        
+        cmd = None
         if self.GetPyData(layer)[0]['cmd']:
-            module = menuform.GUI(parent = self, show = show, centreOnParent = False)
+            module = GUI(parent = self, show = show, centreOnParent = False)
             module.ParseCommand(self.GetPyData(layer)[0]['cmd'],
                                 completed = (self.GetOptData,layer,params))
             
             self.GetPyData(layer)[0]['cmd'] = module.GetCmd()
         elif ltype == 'raster':
             cmd = ['d.rast']
-            
             if UserSettings.Get(group='cmd', key='rasterOverlay', subkey='enabled'):
                 cmd.append('-o')
-            
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(cmd,
-                                                                             completed = (self.GetOptData,layer,params))
                          
         elif ltype == '3d-raster':
-            cmd = ['d.rast3d']
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(cmd,
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.rast3d.py']
                                         
         elif ltype == 'rgb':
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.rgb'],
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.rgb']
+            if UserSettings.Get(group='cmd', key='rasterOverlay', subkey='enabled'):
+                cmd.append('-o')
             
         elif ltype == 'his':
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.his'],
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.his']
             
         elif ltype == 'shaded':
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.shadedmap'],
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.shadedmap']
             
         elif ltype == 'rastarrow':
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.rast.arrow'],
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.rast.arrow']
             
         elif ltype == 'rastnum':
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.rast.num'],
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.rast.num']
             
         elif ltype == 'vector':
             types = list()
@@ -950,39 +1009,31 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                 if UserSettings.Get(group = 'cmd', key = 'showType', subkey = [ftype, 'enabled']):
                     types.append(ftype)
             
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.vect', 'type=%s' % ','.join(types)],
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.vect', 'type=%s' % ','.join(types)]
             
         elif ltype == 'thememap':
             # -s flag requested, otherwise only first thematic category is displayed
             # should be fixed by C-based d.thematic.* modules
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.vect.thematic', '-s'], 
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.vect.thematic', '-s']
             
         elif ltype == 'themechart':
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.vect.chart'],
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.vect.chart']
             
         elif ltype == 'grid':
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.grid'],
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.grid']
             
         elif ltype == 'geodesic':
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.geodesic'],
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.geodesic']
             
         elif ltype == 'rhumb':
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.rhumbline'],
-                                                                             completed = (self.GetOptData,layer,params))
+            cmd = ['d.rhumbline']
             
         elif ltype == 'labels':
-            menuform.GUI(parent = self, centreOnParent = False).ParseCommand(['d.labels'],
-                                                                             completed = (self.GetOptData,layer,params))
-            
-        elif ltype == 'cmdlayer':
-            pass
-        elif ltype == 'group':
-            pass
+            cmd = ['d.labels']
+        
+        if cmd:
+            GUI(parent = self, centreOnParent = False).ParseCommand(cmd,
+                                                                    completed = (self.GetOptData,layer,params))
         
     def OnActivateLayer(self, event):
         """!Double click on the layer item.
@@ -1030,27 +1081,55 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         self.rerender = True
         self.reorder = True
         
-        if self.mapdisplay.toolbars['vdigit']:
+        if self.mapdisplay.GetToolbar('vdigit'):
             self.mapdisplay.toolbars['vdigit'].UpdateListOfLayers (updateTool = True)
 
         # update progress bar range (mapwindow statusbar)
-        self.mapdisplay.statusbarWin['progress'].SetRange(len(self.Map.GetListOfLayers(l_active = True)))
+        self.mapdisplay.GetProgressBar().SetRange(len(self.Map.GetListOfLayers(l_active = True)))
 
+        #
+        # nviz
+        #
+        if self.lmgr.IsPaneShown('toolbarNviz') and \
+                self.GetPyData(item) is not None:
+            # nviz - load/unload data layer
+            mapLayer = self.GetPyData(item)[0]['maplayer']
+            self.mapdisplay.SetStatusText(_("Please wait, updating data..."), 0)
+            if mapLayer.type == 'raster':
+                self.mapdisplay.MapWindow.UnloadRaster(item)
+            elif mapLayer.type == '3d-raster':
+                self.mapdisplay.MapWindow.UnloadRaster3d(item)
+            elif mapLayer.type == 'vector':
+                self.mapdisplay.MapWindow.UnloadVector(item)
+            self.mapdisplay.SetStatusText("", 0)
+            
         event.Skip()
 
+    def OnLayerChecking(self, event):
+        """!Layer checkbox is being checked.
+
+        Continue only if mouse is above checkbox or layer was checked programatically.
+        """
+        if self.hitCheckbox or self.forceCheck:
+            self.forceCheck = False
+            event.Skip()
+        else:
+            event.Veto()
+
     def OnLayerChecked(self, event):
         """!Enable/disable data layer"""
         self.lmgr.WorkspaceChanged()
         
         item    = event.GetItem()
         checked = item.IsChecked()
-
-        digitToolbar = self.mapdisplay.toolbars['vdigit']
-        if self.first == False:
+        
+        digitToolbar = self.mapdisplay.GetToolbar('vdigit')
+        if not self.first:
             # change active parameter for item in layers list in render.Map
             if self.GetPyData(item)[0]['type'] == 'group':
                 child, cookie = self.GetFirstChild(item)
                 while child:
+                    self.forceCheck = True
                     self.CheckItem(child, checked)
                     mapLayer = self.GetPyData(child)[0]['maplayer']
                     if not digitToolbar or \
@@ -1064,16 +1143,12 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                        (digitToolbar and digitToolbar.GetLayer() != mapLayer):
                     # ignore when map layer is edited
                     self.Map.ChangeLayerActive(mapLayer, checked)
-
-        #
+        
         # update progress bar range (mapwindow statusbar)
-        #
-        self.mapdisplay.statusbarWin['progress'].SetRange(len(self.Map.GetListOfLayers(l_active = True)))
-
-        #
+        self.mapdisplay.GetProgressBar().SetRange(len(self.Map.GetListOfLayers(l_active = True)))
+        
         # nviz
-        #
-        if self.mapdisplay.toolbars['nviz'] and \
+        if self.lmgr.IsPaneShown('toolbarNviz') and \
                 self.GetPyData(item) is not None:
             # nviz - load/unload data layer
             mapLayer = self.GetPyData(item)[0]['maplayer']
@@ -1086,10 +1161,10 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                 elif mapLayer.type == '3d-raster':
                     self.mapdisplay.MapWindow.LoadRaster3d(item)
                 elif mapLayer.type == 'vector':
-                    npoints, nlines, nfeatures, mapIs3D = self.lmgr.nviz.VectorInfo(mapLayer)
-                    if npoints > 0:
+                    vInfo = gvector.vector_info_topo(mapLayer.GetName())
+                    if (vInfo['points'] + vInfo['centroids']) > 0:
                         self.mapdisplay.MapWindow.LoadVector(item, points = True)
-                    if nlines > 0:
+                    if (vInfo['lines'] + vInfo['boundaries']) > 0:
                         self.mapdisplay.MapWindow.LoadVector(item, points = False)
 
             else: # disable
@@ -1101,7 +1176,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                     self.mapdisplay.MapWindow.UnloadVector(item)
             
             self.mapdisplay.SetStatusText("", 0)
-
+        
         # redraw map if auto-rendering is enabled
         self.rerender = True
         self.reorder = True
@@ -1111,28 +1186,45 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         ctrl = event.GetEventObject().GetId()
         cmd = event.GetString()
         
+        # find layer tree item by ctrl
         layer = self.GetFirstVisibleItem()
-
         while layer and layer.IsOk():
             if self.GetPyData(layer)[0]['ctrl'] == ctrl:
                 break
-            
             layer = self.GetNextVisible(layer)
-
+        
         # change parameters for item in layers list in render.Map
         self.ChangeLayer(layer)
         
         event.Skip()
 
+    def OnMotion(self, event):
+        """!Mouse is moving.
+
+        Detects if mouse points at checkbox.
+        """
+        thisItem, flags = self.HitTest(event.GetPosition())
+        # workaround: in order not to check checkox when clicking outside
+        # we need flag TREE_HITTEST_ONITEMCHECKICON but not TREE_HITTEST_ONITEMLABEL
+        # this applies only for TR_FULL_ROW_HIGHLIGHT style
+        if (flags & CT.TREE_HITTEST_ONITEMCHECKICON) and not (flags & CT.TREE_HITTEST_ONITEMLABEL):
+            self.hitCheckbox = True
+        else:
+            self.hitCheckbox = False
+        event.Skip()
+        
+    def OnChangingSel(self, event):
+        """!Selection is changing.
+
+        If the user is clicking on checkbox, selection change is vetoed.
+        """
+        if self.hitCheckbox:
+            event.Veto()
+
     def OnChangeSel(self, event):
         """!Selection changed"""
-        oldlayer = event.GetOldItem()
         layer = event.GetItem()
-        if layer == oldlayer:
-            event.Veto()
-            return
-        
-        digitToolbar = self.mapdisplay.toolbars['vdigit']
+        digitToolbar = self.mapdisplay.GetToolbar('vdigit')
         if digitToolbar:
             mapLayer = self.GetPyData(layer)[0]['maplayer']
             bgmap = UserSettings.Get(group = 'vdigit', key = 'bgmap', subkey = 'value',
@@ -1179,12 +1271,12 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                UserSettings.Get(group = 'display', key = 'autoZooming', subkey = 'enabled'):
             mapLayer = self.GetPyData(layer)[0]['maplayer']
             if mapLayer.GetType() in ('raster', 'vector'):
-                render = self.mapdisplay.statusbarWin['render'].IsChecked()
+                render = self.mapdisplay.IsAutoRendered()
                 self.mapdisplay.MapWindow.ZoomToMap(layers = [mapLayer,],
                                                     render = render)
         
         # update nviz tools
-        if self.mapdisplay.toolbars['nviz'] and \
+        if self.lmgr.IsPaneShown('toolbarNviz') and \
                 self.GetPyData(self.layer_selected) is not None:
             if self.layer_selected.IsChecked():
                 # update Nviz tool window
@@ -1270,26 +1362,23 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         checked = self.IsItemChecked(dragItem)
         image   = self.GetItemImage(dragItem, 0)
         text    = self.GetItemText(dragItem)
-        if self.GetPyData(dragItem)[0]['ctrl']:
-            # recreate data layer
-            btnbmp = Icons['layerManager']["layerOptions"].GetBitmap((16,16))
-            newctrl = buttons.GenBitmapButton(self, id = wx.ID_ANY, bitmap = btnbmp, size = (24, 24))
-            newctrl.SetToolTipString(_("Click to edit layer settings"))
-            self.Bind(wx.EVT_BUTTON, self.OnLayerContextMenu, newctrl)
-            data    = self.GetPyData(dragItem)
-        
-        elif self.GetPyData(dragItem)[0]['type'] == 'command':
+
+        if self.GetPyData(dragItem)[0]['type'] == 'command':
             # recreate command layer
-            oldctrl = None
-            newctrl = wx.TextCtrl(self, id = wx.ID_ANY, value = '',
-                                  pos = wx.DefaultPosition, size = (250,25),
-                                  style = wx.TE_MULTILINE|wx.TE_WORDWRAP)
+            newctrl = self._createCommandCtrl()
             try:
                 newctrl.SetValue(self.GetPyData(dragItem)[0]['maplayer'].GetCmd(string = True))
             except:
                 pass
             newctrl.Bind(wx.EVT_TEXT_ENTER, self.OnCmdChanged)
-            newctrl.Bind(wx.EVT_TEXT,       self.OnCmdChanged)
+            data = self.GetPyData(dragItem)
+
+        elif self.GetPyData(dragItem)[0]['ctrl']:
+            # recreate data layer
+            btnbmp = LMIcons["layerOptions"].GetBitmap((16,16))
+            newctrl = buttons.GenBitmapButton(self, id = wx.ID_ANY, bitmap = btnbmp, size = (24, 24))
+            newctrl.SetToolTipString(_("Click to edit layer settings"))
+            self.Bind(wx.EVT_BUTTON, self.OnLayerContextMenu, newctrl)
             data    = self.GetPyData(dragItem)
 
         elif self.GetPyData(dragItem)[0]['type'] == 'group':
@@ -1337,6 +1426,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         else:
             self.GetPyData(newItem)[0]['ctrl'] = None
             
+        self.forceCheck = True
         self.CheckItem(newItem, checked = checked) # causes a new render
         
         return newItem
@@ -1352,8 +1442,8 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         opacity  = int(mapLayer.GetOpacity(float = True) * 100)
         if not lname:
             dcmd    = self.GetPyData(item)[0]['cmd']
-            lname, found = utils.GetLayerNameFromCmd(dcmd, layerType = mapLayer.GetType(),
-                                                     fullyQualified = True)
+            lname, found = GetLayerNameFromCmd(dcmd, layerType = mapLayer.GetType(),
+                                               fullyQualified = True)
             if not found:
                 return None
         
@@ -1368,7 +1458,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         if dcmd:
             self.GetPyData(layer)[0]['cmd'] = dcmd
             mapText  = self._getLayerName(layer)
-            mapName, found = utils.GetLayerNameFromCmd(dcmd)
+            mapName, found = GetLayerNameFromCmd(dcmd)
             mapLayer = self.GetPyData(layer)[0]['maplayer']
             self.SetItemText(layer, mapName)
             
@@ -1395,7 +1485,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                                                     render = render)
 
         # update nviz session        
-        if self.mapdisplay.toolbars['nviz'] and dcmd:
+        if self.lmgr.IsPaneShown('toolbarNviz') and dcmd:
             mapLayer = self.GetPyData(layer)[0]['maplayer']
             mapWin = self.mapdisplay.MapWindow
             if len(mapLayer.GetCmd()) > 0:
@@ -1419,7 +1509,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                     mapWin.LoadVector(layer)
 
                 # reset view when first layer loaded
-                nlayers = len(mapWin.Map.GetListOfLayers(l_type = ('raster', 'vector'),
+                nlayers = len(mapWin.Map.GetListOfLayers(l_type = ('raster', '3d-raster', 'vector'),
                                                          l_active = True))
                 if nlayers < 2:
                     mapWin.ResetView()
@@ -1479,7 +1569,7 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
                 chk = self.IsItemChecked(item)
                 hidden = not self.IsVisible(item)
                 # determine layer name
-                layerName, found = utils.GetLayerNameFromCmd(cmdlist, fullyQualified = True)
+                layerName, found = GetLayerNameFromCmd(cmdlist, fullyQualified = True)
                 if not found:
                     layerName = self.GetItemText(item)
         
@@ -1490,12 +1580,11 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
         self.GetPyData(item)[0]['maplayer'] = maplayer
         
         # if digitization tool enabled -> update list of available vector map layers
-        if self.mapdisplay.toolbars['vdigit']:
-            self.mapdisplay.toolbars['vdigit'].UpdateListOfLayers(updateTool = True)
+        if self.mapdisplay.GetToolbar('vdigit'):
+            self.mapdisplay.GetToolbar('vdigit').UpdateListOfLayers(updateTool = True)
         
         # redraw map if auto-rendering is enabled
-        self.rerender = True
-        self.reorder = True
+        self.rerender = self.reorder = True
         
     def OnCloseWindow(self, event):
         pass
@@ -1556,3 +1645,12 @@ class LayerTree(treemixin.DragAndDrop, CT.CustomTreeCtrl):
 
         return None
 
+    def _createCommandCtrl(self):
+        """!Creates text control for command layer"""
+        height = 25
+        if sys.platform in ('win32', 'darwin'):
+            height = 40
+        ctrl = wx.TextCtrl(self, id = wx.ID_ANY, value = '',
+                           size = (self.GetSize()[0]-100, height),
+                           style = wx.TE_PROCESS_ENTER | wx.TE_DONTWRAP)
+        return ctrl
diff --git a/gui/wxpython/lmgr/menudata.py b/gui/wxpython/lmgr/menudata.py
new file mode 100644
index 0000000..aa544eb
--- /dev/null
+++ b/gui/wxpython/lmgr/menudata.py
@@ -0,0 +1,70 @@
+"""!
+ at package lmrg.menudata
+
+ at brief Complex list for menu entries for wxGUI
+
+Classes:
+ - menudata::MenuData
+
+Usage:
+ at code
+python menudata.py [action] [manager|modeler]
+ at endcode
+
+where <i>action</i>:
+ - strings (default)
+ - tree
+ - commands
+ - dump
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton (Arizona State University)
+ at author Yann Chemin <yann.chemin gmail.com>
+ at author Martin Landa <landa.martin gmail.com>
+ at author Glynn Clements
+ at author Anna Kratochvilova <kratochanna gmail.com>
+"""
+
+import os
+import sys
+
+from core.globalvar import ETCWXDIR
+from core.menudata  import MenuData
+
+class ManagerData(MenuData):
+    def __init__(self, filename = None):
+        if not filename:
+            gisbase = os.getenv('GISBASE')
+	    filename = os.path.join(ETCWXDIR, 'xml', 'menudata.xml')
+        
+        MenuData.__init__(self, filename)
+        
+    def GetModules(self):
+        """!Create dictionary of modules used to search module by
+        keywords, description, etc."""
+        modules = dict()
+        
+        for node in self.tree.getiterator():
+            if node.tag == 'menuitem':
+                module = description = ''
+                keywords = []
+                for child in node.getchildren():
+                    if child.tag == 'help':
+                        description = child.text
+                    if child.tag == 'command':
+                        module = child.text
+                    if child.tag == 'keywords':
+                        if child.text:
+                            keywords = child.text.split(',')
+                    
+                if module:
+                    modules[module] = { 'desc': description,
+                                        'keywords' : keywords }
+                    if len(keywords) < 1:
+                        print >> sys.stderr, "WARNING: Module <%s> has no keywords" % module
+                
+        return modules
diff --git a/gui/wxpython/gui_modules/gpyshell.py b/gui/wxpython/lmgr/pyshell.py
similarity index 89%
rename from gui/wxpython/gui_modules/gpyshell.py
rename to gui/wxpython/lmgr/pyshell.py
index a2a806f..43c9880 100644
--- a/gui/wxpython/gui_modules/gpyshell.py
+++ b/gui/wxpython/lmgr/pyshell.py
@@ -1,27 +1,26 @@
 """!
- at package gpyshell.py
+ at package lmgr.pyshell
 
- at brief wxGUI Interactive Python Shell
+ at brief wxGUI Interactive Python Shell for Layer Manager
 
 Classes:
- - PyShellWindow
+ - pyshell::PyShellWindow
 
- at todo run pyshell and evaluate code in a separate instance of python
-& design the widget communicate back and forth with it
+ at todo Run pyshell and evaluate code in a separate instance of python &
+design the widget communicate back and forth with it
 
 (C) 2011 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Martin Landa <landa.martin gmail.com>
 """
 
-import os
 import sys
 
 import wx
-from wx.py.shell import Shell as PyShell
+from wx.py.shell   import Shell as PyShell
 from wx.py.version import VERSION
 
 import grass.script as grass
diff --git a/gui/wxpython/lmgr/toolbars.py b/gui/wxpython/lmgr/toolbars.py
new file mode 100644
index 0000000..e4e6693
--- /dev/null
+++ b/gui/wxpython/lmgr/toolbars.py
@@ -0,0 +1,266 @@
+"""!
+ at package lmgr.toolbars
+
+ at brief wxGUI Layer Manager - toolbars
+
+Classes:
+ - toolbars::LMWorkspaceToolbar
+ - toolbars::LMDataToolbar
+ - toolbars::LMToolsToolbar
+ - toolbars::LMMiscToolbar
+ - toolbars::LMVectorToolbar
+ - toolbars::LMNvizToolbar
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton
+ at author Jachym Cepicky
+ at author Martin Landa <landa.martin gmail.com>
+ at author Anna Kratochvilova <kratochanna gmail.com>
+"""
+
+import os
+import sys
+
+from core               import globalvar
+from core.gcmd          import RunCommand
+from nviz.preferences   import NvizPreferencesDialog
+from gui_core.toolbars  import BaseToolbar, BaseIcons
+from icons.icon         import MetaIcon
+
+class LMWorkspaceToolbar(BaseToolbar):
+    """!Layer Manager `workspace` toolbar
+    """
+    def __init__(self, parent):
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # realize the toolbar
+        self.Realize()
+
+    def _toolbarData(self):
+        """!Toolbar data
+        """
+        icons = {
+            'newdisplay'    : MetaIcon(img = 'monitor-create',
+                                       label = _('Start new map display')),
+            'workspaceNew'  : MetaIcon(img = 'create',
+                                       label = _('Create new workspace (Ctrl+N)')),
+            'workspaceOpen' : MetaIcon(img = 'open',
+                                       label = _('Open existing workspace file (Ctrl+O)')),
+            'workspaceSave' : MetaIcon(img = 'save',
+                                       label = _('Save current workspace to file (Ctrl+S)')),
+            }
+        return self._getToolbarData((('newdisplay', icons["newdisplay"],
+                                      self.parent.OnNewDisplay),
+                                     (None, ),
+                                     ('workspaceNew', icons["workspaceNew"],
+                                      self.parent.OnWorkspaceNew),
+                                     ('workspaceOpen', icons["workspaceOpen"],
+                                      self.parent.OnWorkspaceOpen),
+                                     ('workspaceSave', icons["workspaceSave"],
+                                      self.parent.OnWorkspaceSave),
+                                     ))
+
+class LMDataToolbar(BaseToolbar):
+    """!Layer Manager `data` toolbar
+    """
+    def __init__(self, parent):
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # realize the toolbar
+        self.Realize()
+
+    def _toolbarData(self):
+        """!Toolbar data
+        """
+        icons = {
+            'addMulti'   : MetaIcon(img = 'layer-open',
+                                    label = _('Add multiple raster or vector map layers (Ctrl+Shift+L)')),
+            'addRast'    : BaseIcons['addRast'].SetLabel(_("Add raster map layer (Ctrl+Shift+R)")),
+            'rastMisc'   : MetaIcon(img = 'layer-raster-more',
+                                    label = _('Add various raster map layers (RGB, HIS, shaded relief...)')),
+            'addVect'    : BaseIcons['addVect'].SetLabel(_("Add vector map layer (Ctrl+Shift+V)")),
+            'vectMisc'   : MetaIcon(img = 'layer-vector-more',
+                                    label = _('Add various vector map layers (thematic, chart...)')),
+            'addGroup'   : MetaIcon(img = 'layer-group-add',
+                                    label = _('Add group')),
+            'addOverlay' : MetaIcon(img = 'layer-more',
+                                    label = _('Add grid or vector labels overlay')),
+            'delCmd'     : MetaIcon(img = 'layer-remove',
+                                    label = _('Remove selected map layer(s) from layer tree')),
+            }
+        
+        return self._getToolbarData((('addMulti', icons["addMulti"],
+                                      self.parent.OnAddMaps),
+                                     ('addrast', icons["addRast"],
+                                      self.parent.OnAddRaster),
+                                     ('rastmisc', icons["rastMisc"],
+                                      self.parent.OnAddRasterMisc),
+                                     ('addvect', icons["addVect"],
+                                      self.parent.OnAddVector),
+                                     ('vectmisc', icons["vectMisc"],
+                                      self.parent.OnAddVectorMisc),
+                                     ('addgrp',  icons["addGroup"],
+                                      self.parent.OnAddGroup),
+                                     ('addovl',  icons["addOverlay"],
+                                      self.parent.OnAddOverlay),
+                                     ('delcmd',  icons["delCmd"],
+                                      self.parent.OnDeleteLayer),
+                                     ))
+
+class LMToolsToolbar(BaseToolbar):
+    """!Layer Manager `tools` toolbar
+    """
+    def __init__(self, parent):
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # realize the toolbar
+        self.Realize()
+
+    def _toolbarData(self):
+        """!Toolbar data
+        """
+        icons = {
+            'import'  : MetaIcon(img = 'layer-import',
+                                 label = _('Import/link raster or vector data')),
+            'mapcalc' : MetaIcon(img = 'calculator',
+                                 label = _('Raster Map Calculator')),
+            'modeler' : MetaIcon(img = 'modeler-main',
+                                 label = _('Graphical Modeler')),
+            'georectify' : MetaIcon(img = 'georectify',
+                                 label = _('Georectifier')),
+            'composer': MetaIcon(img = 'print-compose',
+                                 label = _('Cartographic Composer')),
+            }
+        
+        return self._getToolbarData((('importMap', icons["import"],
+                                      self.parent.OnImportMenu),
+                                     (None, ),
+                                     ('mapCalc', icons["mapcalc"],
+                                      self.parent.OnMapCalculator),
+                                     ('georect', icons["georectify"],
+                                      self.parent.OnGCPManager),
+                                     ('modeler', icons["modeler"],
+                                      self.parent.OnGModeler),
+                                     ('mapOutput', icons['composer'],
+                                      self.parent.OnPsMap)
+                                     ))
+
+class LMMiscToolbar(BaseToolbar):
+    """!Layer Manager `misc` toolbar
+    """
+    def __init__(self, parent):
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # realize the toolbar
+        self.Realize()
+
+    def _toolbarData(self):
+        """!Toolbar data
+        """
+        icons = {
+            'settings'   : BaseIcons['settings'].SetLabel(_('GUI settings')),
+            'help'       : BaseIcons['help'].SetLabel(_('GRASS manual')),
+            }
+        
+        return self._getToolbarData((('settings', icons["settings"],
+                                      self.parent.OnPreferences),
+                                     ('help', icons["help"],
+                                      self.parent.OnHelp),
+                                     ))
+
+class LMVectorToolbar(BaseToolbar):
+    """!Layer Manager `vector` toolbar
+    """
+    def __init__(self, parent):
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # realize the toolbar
+        self.Realize()
+
+    def _toolbarData(self):
+        """!Toolbar data
+        """
+        icons = {
+            'vdigit'     : MetaIcon(img = 'edit',
+                                    label = _('Edit vector maps')),
+            'attrTable'  : MetaIcon(img = 'table',
+                                    label = _('Show attribute table')),
+            }
+        
+        return self._getToolbarData((('vdigit', icons["vdigit"],
+                                      self.parent.OnVDigit),
+                                     ('attribute', icons["attrTable"],
+                                      self.parent.OnShowAttributeTable),
+                                     ))
+
+class LMNvizToolbar(BaseToolbar):
+    """!Nviz toolbar
+    """
+    def __init__(self, parent):
+        self.lmgr = parent
+        
+        BaseToolbar.__init__(self, parent)
+        
+        # only one dialog can be open
+        self.settingsDialog   = None
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # realize the toolbar
+        self.Realize()
+        
+    def _toolbarData(self):
+        """!Toolbar data"""
+        icons = {
+            'cmd'    : MetaIcon(img = 'script-save',
+                                label = _('Generate command for m.nviz.image'),
+                                desc = _('Generate command for m.nviz.image based on current state')),
+            'settings' : MetaIcon(img = '3d-settings',
+                                  label = _('3D view mode settings'),
+                                  desc = _('Show 3D view mode settings dialog')),
+            'help'   : MetaIcon(img = '3d-help',
+                                label = _('Show 3D view mode manual')),
+            }
+        
+        return self._getToolbarData((("nvizCmd", icons['cmd'],
+                                      self.OnNvizCmd),
+                                     (None, ),
+                                     ("settings", icons["settings"],
+                                      self.OnSettings),
+                                     ("help", icons["help"],
+                                      self.OnHelp))
+                                    )
+        
+    def OnNvizCmd(self, event):
+        """!Show m.nviz.image command"""
+        self.lmgr.GetLayerTree().GetMapDisplay().GetWindow().OnNvizCmd()
+        
+    def OnHelp(self, event):
+        """!Show 3D view mode help"""
+        if not self.lmgr:
+            RunCommand('g.manual',
+                       entry = 'wxGUI.Nviz')
+        else:
+            log = self.lmgr.GetLogWindow()
+            log.RunCmd(['g.manual',
+                        'entry=wxGUI.Nviz'])
+        
+    def OnSettings(self, event):
+        """!Show nviz notebook page"""
+        if not self.settingsDialog:
+            self.settingsDialog = NvizPreferencesDialog(parent = self.parent)
+        self.settingsDialog.Show()
diff --git a/gui/wxpython/location_wizard/base.py b/gui/wxpython/location_wizard/base.py
new file mode 100644
index 0000000..4dcd52c
--- /dev/null
+++ b/gui/wxpython/location_wizard/base.py
@@ -0,0 +1,54 @@
+"""!
+ at package location_wizard.base
+
+ at brief Location wizard - base classes
+
+Classes:
+ - base::BaseClass
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton
+ at author Jachym Cepicky
+ at author Martin Landa <landa.martin gmail.com>   
+"""
+
+import wx
+
+class BaseClass(wx.Object):
+    """!Base class providing basic methods"""
+    def __init__(self):
+        pass
+
+    def MakeLabel(self, text = "", style = wx.ALIGN_LEFT, parent = None, tooltip = None):
+        """!Make aligned label"""
+        if not parent:
+            parent = self
+        label =  wx.StaticText(parent = parent, id = wx.ID_ANY, label = text,
+                              style = style)
+        if tooltip:
+            label.SetToolTipString(tooltip)
+        return label
+
+    def MakeTextCtrl(self, text = '', size = (100,-1), style = 0, parent = None, tooltip = None):
+        """!Generic text control"""
+        if not parent:
+            parent = self
+        textCtrl = wx.TextCtrl(parent = parent, id = wx.ID_ANY, value = text,
+                               size = size, style = style)
+        if tooltip:
+            textCtrl.SetToolTipString(tooltip)
+        return textCtrl
+
+    def MakeButton(self, text, id = wx.ID_ANY, size = (-1,-1), parent = None, tooltip = None):
+        """!Generic button"""
+        if not parent:
+            parent = self
+        button = wx.Button(parent = parent, id = id, label = text,
+                           size = size)
+        if tooltip:
+            button.SetToolTipString(tooltip)
+        return button
diff --git a/gui/wxpython/location_wizard/dialogs.py b/gui/wxpython/location_wizard/dialogs.py
new file mode 100644
index 0000000..be3f49c
--- /dev/null
+++ b/gui/wxpython/location_wizard/dialogs.py
@@ -0,0 +1,613 @@
+"""!
+ at package location_wizard.dialogs
+
+ at brief Location wizard - dialogs
+
+Classes:
+ - dialogs::RegionDef
+ - dialogs::TransList
+ - dialogs::SelectTransformDialog
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton
+ at author Jachym Cepicky
+ at author Martin Landa <landa.martin gmail.com>   
+"""
+import os
+import sys
+
+import wx
+import wx.lib.scrolledpanel as scrolled
+
+from core                 import globalvar
+from core.gcmd            import RunCommand
+from location_wizard.base import BaseClass
+
+from grass.script import core as grass
+
+class RegionDef(BaseClass, wx.Dialog):
+    """!Page for setting default region extents and resolution
+    """
+    def __init__(self, parent, id = wx.ID_ANY, size = (800, 600),
+                 title = _("Set default region extent and resolution"), location = None):
+        wx.Dialog.__init__(self, parent, id, title, size = size)
+        panel = wx.Panel(self, id = wx.ID_ANY)
+        
+        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
+        
+        self.parent = parent
+        self.location = location
+        
+        #
+        # default values
+        #
+        # 2D
+        self.north = 1.0
+        self.south = 0.0
+        self.east = 1.0
+        self.west = 0.0
+        self.nsres = 1.0
+        self.ewres = 1.0
+        # 3D
+        self.top = 1.0
+        self.bottom = 0.0
+        #         self.nsres3 = 1.0
+        #         self.ewres3 = 1.0
+        self.tbres  = 1.0
+        
+        #
+        # inputs
+        #
+        # 2D
+        self.tnorth = self.MakeTextCtrl(text = str(self.north), size = (150, -1), parent = panel)
+        self.tsouth = self.MakeTextCtrl(str(self.south), size = (150, -1), parent = panel)
+        self.twest = self.MakeTextCtrl(str(self.west), size = (150, -1), parent = panel)
+        self.teast = self.MakeTextCtrl(str(self.east), size = (150, -1), parent = panel)
+        self.tnsres = self.MakeTextCtrl(str(self.nsres), size = (150, -1), parent = panel)
+        self.tewres = self.MakeTextCtrl(str(self.ewres), size = (150, -1), parent = panel)
+        
+        #
+        # labels
+        #
+        self.lrows  = self.MakeLabel(parent = panel)
+        self.lcols  = self.MakeLabel(parent = panel)
+        self.lcells = self.MakeLabel(parent = panel)
+        
+        #
+        # buttons
+        #
+        self.bset = self.MakeButton(text = _("&Set region"), id = wx.ID_OK, parent = panel)
+        self.bcancel = wx.Button(panel, id = wx.ID_CANCEL)
+        self.bset.SetDefault()
+        
+        #
+        # image
+        #
+        self.img = wx.Image(os.path.join(globalvar.ETCIMGDIR, "qgis_world.png"),
+                            wx.BITMAP_TYPE_PNG).ConvertToBitmap()
+        
+        #
+        # set current working environment to PERMANENT mapset
+        # in selected location in order to set default region (WIND)
+        #
+        envval = {}
+        ret = RunCommand('g.gisenv',
+                         read = True)
+        if ret:
+            for line in ret.splitlines():
+                key, val = line.split('=')
+                envval[key] = val
+            self.currlocation = envval['LOCATION_NAME'].strip("';")
+            self.currmapset = envval['MAPSET'].strip("';")
+            if self.currlocation != self.location or self.currmapset != 'PERMANENT':
+                RunCommand('g.gisenv',
+                           set = 'LOCATION_NAME=%s' % self.location)
+                RunCommand('g.gisenv',
+                           set = 'MAPSET=PERMANENT')
+        else:
+            dlg = wx.MessageBox(parent = self,
+                                message = _('Invalid location selected.'),
+                                caption = _("Error"), style = wx.ID_OK | wx.ICON_ERROR)
+            return
+        
+        #
+        # get current region settings
+        #
+        region = {}
+        ret = RunCommand('g.region',
+                         read = True,
+                         flags = 'gp3')
+        if ret:
+            for line in ret.splitlines():
+                key, val = line.split('=')
+                region[key] = float(val)
+        else:
+            dlg = wx.MessageBox(parent = self,
+                                message = _("Invalid region"),
+                                caption = _("Error"), style = wx.ID_OK | wx.ICON_ERROR)
+            dlg.ShowModal()
+            dlg.Destroy()
+            return
+        
+        #
+        # update values
+        # 2D
+        self.north = float(region['n'])
+        self.south = float(region['s'])
+        self.east = float(region['e'])
+        self.west = float(region['w'])
+        self.nsres = float(region['nsres'])
+        self.ewres = float(region['ewres'])
+        self.rows = int(region['rows'])
+        self.cols = int(region['cols'])
+        self.cells = int(region['cells'])
+        # 3D
+        self.top = float(region['t'])
+        self.bottom = float(region['b'])
+        #         self.nsres3 = float(region['nsres3'])
+        #         self.ewres3 = float(region['ewres3'])
+        self.tbres = float(region['tbres'])
+        self.depth = int(region['depths'])
+        self.cells3 = int(region['cells3'])
+        
+        #
+        # 3D box collapsable
+        #
+        self.infoCollapseLabelExp = _("Click here to show 3D settings")
+        self.infoCollapseLabelCol = _("Click here to hide 3D settings")
+        self.settings3D = wx.CollapsiblePane(parent = panel,
+                                             label = self.infoCollapseLabelExp,
+                                             style = wx.CP_DEFAULT_STYLE |
+                                             wx.CP_NO_TLW_RESIZE | wx.EXPAND)
+        self.MakeSettings3DPaneContent(self.settings3D.GetPane())
+        self.settings3D.Collapse(False) # FIXME
+        self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnSettings3DPaneChanged, self.settings3D)
+        
+        #
+        # set current region settings
+        #
+        self.tnorth.SetValue(str(self.north))
+        self.tsouth.SetValue(str(self.south))
+        self.twest.SetValue(str(self.west))
+        self.teast.SetValue(str(self.east))
+        self.tnsres.SetValue(str(self.nsres))
+        self.tewres.SetValue(str(self.ewres))
+        self.ttop.SetValue(str(self.top))
+        self.tbottom.SetValue(str(self.bottom))
+        #         self.tnsres3.SetValue(str(self.nsres3))
+        #         self.tewres3.SetValue(str(self.ewres3))
+        self.ttbres.SetValue(str(self.tbres))
+        self.lrows.SetLabel(_("Rows: %d") % self.rows)
+        self.lcols.SetLabel(_("Cols: %d") % self.cols)
+        self.lcells.SetLabel(_("Cells: %d") % self.cells)
+        
+        #
+        # bindings
+        #
+        self.Bind(wx.EVT_BUTTON, self.OnSetButton, self.bset)
+        self.Bind(wx.EVT_BUTTON, self.OnCancel, self.bcancel)
+        self.tnorth.Bind(wx.EVT_TEXT,   self.OnValue)
+        self.tsouth.Bind(wx.EVT_TEXT,   self.OnValue)
+        self.teast.Bind(wx.EVT_TEXT,    self.OnValue)
+        self.twest.Bind(wx.EVT_TEXT,    self.OnValue)
+        self.tnsres.Bind(wx.EVT_TEXT,   self.OnValue)
+        self.tewres.Bind(wx.EVT_TEXT,   self.OnValue)
+        self.ttop.Bind(wx.EVT_TEXT,     self.OnValue)
+        self.tbottom.Bind(wx.EVT_TEXT,  self.OnValue)
+        #         self.tnsres3.Bind(wx.EVT_TEXT,  self.OnValue)
+        #         self.tewres3.Bind(wx.EVT_TEXT,  self.OnValue)
+        self.ttbres.Bind(wx.EVT_TEXT,   self.OnValue)
+        
+        self.__DoLayout(panel)
+        self.SetMinSize(self.GetBestSize())
+        self.minWindowSize = self.GetMinSize()
+    
+    def MakeSettings3DPaneContent(self, pane):
+        """!Create 3D region settings pane"""
+        border = wx.BoxSizer(wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 0, hgap = 0)
+
+        # inputs
+        self.ttop = wx.TextCtrl(parent = pane, id = wx.ID_ANY, value = str(self.top),
+                                size = (150, -1))
+        self.tbottom = wx.TextCtrl(parent = pane, id = wx.ID_ANY, value = str(self.bottom),
+                                size = (150, -1))
+        self.ttbres = wx.TextCtrl(parent = pane, id = wx.ID_ANY, value = str(self.tbres),
+                                size = (150, -1))
+        #         self.tnsres3 = wx.TextCtrl(parent = pane, id = wx.ID_ANY, value = str(self.nsres3),
+        #                                    size = (150, -1))
+        #         self.tewres3  =  wx.TextCtrl(parent = pane, id = wx.ID_ANY, value = str(self.ewres3),
+        #                                    size = (150, -1))
+
+        #labels
+        self.ldepth = wx.StaticText(parent = pane, label = _("Depth: %d") % self.depth)
+        self.lcells3  =  wx.StaticText(parent = pane, label = _("3D Cells: %d") % self.cells3)
+
+        # top
+        gridSizer.Add(item = wx.StaticText(parent = pane, label = _("Top")),
+                      flag = wx.ALIGN_CENTER |
+                      wx.LEFT | wx.RIGHT | wx.TOP, border = 5,
+                      pos = (0, 1))
+        gridSizer.Add(item = self.ttop,
+                      flag = wx.ALIGN_CENTER_HORIZONTAL |
+                      wx.ALL, border = 5, pos = (1, 1))
+        # bottom
+        gridSizer.Add(item = wx.StaticText(parent = pane, label = _("Bottom")),
+                      flag = wx.ALIGN_CENTER |
+                      wx.LEFT | wx.RIGHT | wx.TOP, border = 5,
+                      pos = (0, 2))
+        gridSizer.Add(item = self.tbottom,
+                      flag = wx.ALIGN_CENTER_HORIZONTAL |
+                      wx.ALL, border = 5, pos = (1, 2))
+        # tbres
+        gridSizer.Add(item = wx.StaticText(parent = pane, label = _("T-B resolution")),
+                      flag = wx.ALIGN_CENTER | 
+                      wx.LEFT | wx.RIGHT | wx.TOP, border = 5,
+                      pos = (0, 3))
+        gridSizer.Add(item = self.ttbres,
+                      flag = wx.ALIGN_CENTER_HORIZONTAL |
+                      wx.ALL, border = 5, pos = (1, 3))
+
+        # res
+        #         gridSizer.Add(item = wx.StaticText(parent = pane, label = _("3D N-S resolution")),
+        #                       flag = wx.ALIGN_CENTER |
+        #                       wx.LEFT | wx.RIGHT | wx.TOP, border = 5,
+        #                       pos = (2, 1))
+        #         gridSizer.Add(item = self.tnsres3,
+        #                       flag = wx.ALIGN_CENTER_HORIZONTAL |
+        #                       wx.ALL, border = 5, pos = (3, 1))
+        #         gridSizer.Add(item = wx.StaticText(parent = pane, label = _("3D E-W resolution")),
+        #                       flag = wx.ALIGN_CENTER |
+        #                       wx.LEFT | wx.RIGHT | wx.TOP, border = 5,
+        #                       pos = (2, 3))
+        #         gridSizer.Add(item = self.tewres3,
+        #                       flag = wx.ALIGN_CENTER_HORIZONTAL |
+        #                       wx.ALL, border = 5, pos = (3, 3))
+
+        # rows/cols/cells
+        gridSizer.Add(item = self.ldepth,
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
+                      wx.ALL, border = 5, pos = (2, 1))
+
+        gridSizer.Add(item = self.lcells3,
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
+                      wx.ALL, border = 5, pos = (2, 2))
+
+        border.Add(item = gridSizer, proportion = 1,
+                   flag = wx.ALL | wx.ALIGN_CENTER | wx.EXPAND, border = 5)
+
+        pane.SetSizer(border)
+        border.Fit(pane)
+
+    def OnSettings3DPaneChanged(self, event):
+        """!Collapse 3D settings box"""
+
+        if self.settings3D.IsExpanded():
+            self.settings3D.SetLabel(self.infoCollapseLabelCol)
+            self.Layout()
+            self.SetSize(self.GetBestSize())
+            self.SetMinSize(self.GetSize())
+        else:
+            self.settings3D.SetLabel(self.infoCollapseLabelExp)
+            self.Layout()
+            self.SetSize(self.minWindowSize)
+            self.SetMinSize(self.minWindowSize)
+
+        self.SendSizeEvent()
+
+    def __DoLayout(self, panel):
+        """!Window layout"""
+        frameSizer = wx.BoxSizer(wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 0, hgap = 0)
+        settings3DSizer = wx.BoxSizer(wx.VERTICAL)
+        buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
+
+        # north
+        gridSizer.Add(item = self.MakeLabel(text = _("North"), parent = panel),
+                      flag = wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL |
+                      wx.TOP | wx.LEFT | wx.RIGHT, border = 5, pos = (0, 2))
+        gridSizer.Add(item = self.tnorth,
+                      flag = wx.ALIGN_CENTER_HORIZONTAL |
+                      wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALL, border = 5, pos = (1, 2))
+        # west
+        gridSizer.Add(item = self.MakeLabel(text = _("West"), parent = panel),
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL |
+                      wx.LEFT | wx.TOP | wx.BOTTOM, border = 5, pos = (2, 0))
+        gridSizer.Add(item = self.twest,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALL, border = 5,  pos = (2, 1))
+
+        gridSizer.Add(item = wx.StaticBitmap(panel, wx.ID_ANY, self.img, (-1, -1),
+                                           (self.img.GetWidth(), self.img.GetHeight())),
+                      flag = wx.ALIGN_CENTER |
+                      wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALL, border = 5, pos = (2, 2))
+
+        # east
+        gridSizer.Add(item = self.teast,
+                      flag = wx.ALIGN_CENTER_HORIZONTAL |
+                      wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALL, border = 5,  pos = (2, 3))
+        gridSizer.Add(item = self.MakeLabel(text = _("East"), parent = panel),
+                      flag = wx.ALIGN_LEFT |
+                      wx.ALIGN_CENTER_VERTICAL |
+                      wx.RIGHT | wx.TOP | wx.BOTTOM, border = 5, pos = (2, 4))
+        # south
+        gridSizer.Add(item = self.tsouth,
+                      flag = wx.ALIGN_CENTER_HORIZONTAL |
+                      wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALL, border = 5, pos = (3, 2))
+        gridSizer.Add(item = self.MakeLabel(text = _("South"), parent = panel),
+                      flag = wx.ALIGN_TOP | wx.ALIGN_CENTER_HORIZONTAL |
+                      wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5, pos = (4, 2))
+        # ns-res
+        gridSizer.Add(item = self.MakeLabel(text = _("N-S resolution"), parent = panel),
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
+                      wx.TOP | wx.LEFT | wx.RIGHT, border = 5, pos = (5, 1))
+        gridSizer.Add(item = self.tnsres,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALL, border = 5,  pos = (6, 1))
+        # ew-res
+        gridSizer.Add(item = self.MakeLabel(text = _("E-W resolution"), parent = panel),
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
+                      wx.TOP | wx.LEFT | wx.RIGHT, border = 5, pos = (5, 3))
+        gridSizer.Add(item = self.tewres,
+                      flag = wx.ALIGN_RIGHT |
+                      wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALL, border = 5,  pos = (6, 3))
+        # rows/cols/cells
+        gridSizer.Add(item = self.lrows,
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
+                      wx.ALL, border = 5, pos = (7, 1))
+
+        gridSizer.Add(item = self.lcells,
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
+                      wx.ALL, border = 5, pos = (7, 2))
+
+        gridSizer.Add(item = self.lcols,
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
+                      wx.ALL, border = 5, pos = (7, 3))
+
+        # 3D
+        settings3DSizer.Add(item = self.settings3D,
+                            flag = wx.ALL,
+                            border = 5)
+
+        # buttons
+        buttonSizer.Add(item = self.bcancel, proportion = 1,
+                        flag = wx.ALIGN_RIGHT |
+                        wx.ALIGN_CENTER_VERTICAL |
+                        wx.ALL, border = 10)
+        buttonSizer.Add(item = self.bset, proportion = 1,
+                        flag = wx.ALIGN_CENTER |
+                        wx.ALIGN_CENTER_VERTICAL |
+                        wx.ALL, border = 10)
+
+        frameSizer.Add(item = gridSizer, proportion = 1,
+                       flag = wx.ALL | wx.ALIGN_CENTER, border = 5)
+        frameSizer.Add(item = settings3DSizer, proportion = 0,
+                       flag = wx.ALL | wx.ALIGN_CENTER, border = 5)
+        frameSizer.Add(item = buttonSizer, proportion = 0,
+                       flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
+
+        self.SetAutoLayout(True)
+        panel.SetSizer(frameSizer)
+        frameSizer.Fit(panel)
+        self.Layout()
+
+    def OnValue(self, event):
+        """!Set given value"""
+        try:
+            if event.GetId() == self.tnorth.GetId():
+                self.north = float(event.GetString())
+            elif event.GetId() == self.tsouth.GetId():
+                self.south = float(event.GetString())
+            elif event.GetId() == self.teast.GetId():
+                self.east = float(event.GetString())
+            elif event.GetId() == self.twest.GetId():
+                self.west = float(event.GetString())
+            elif event.GetId() == self.tnsres.GetId():
+                self.nsres = float(event.GetString())
+            elif event.GetId() == self.tewres.GetId():
+                self.ewres = float(event.GetString())
+            elif event.GetId() == self.ttop.GetId():
+                self.top = float(event.GetString())
+            elif event.GetId() == self.tbottom.GetId():
+                self.bottom = float(event.GetString())
+            #             elif event.GetId() == self.tnsres3.GetId():
+            #                 self.nsres3 = float(event.GetString())
+            #             elif event.GetId() == self.tewres3.GetId():
+            #                 self.ewres3 = float(event.GetString())
+            elif event.GetId() == self.ttbres.GetId():
+                self.tbres = float(event.GetString())
+
+            self.__UpdateInfo()
+
+        except ValueError, e:
+            if len(event.GetString()) > 0 and event.GetString() != '-':
+                dlg = wx.MessageBox(parent = self,
+                                    message = _("Invalid value: %s") % e,
+                                    caption = _("Error"),
+                                    style = wx.OK | wx.ICON_ERROR)
+                # reset values
+                self.tnorth.SetValue(str(self.north))
+                self.tsouth.SetValue(str(self.south))
+                self.teast.SetValue(str(self.east))
+                self.twest.SetValue(str(self.west))
+                self.tnsres.SetValue(str(self.nsres))
+                self.tewres.SetValue(str(self.ewres))
+                self.ttop.SetValue(str(self.top))
+                self.tbottom.SetValue(str(self.bottom))
+                self.ttbres.SetValue(str(self.tbres))
+                # self.tnsres3.SetValue(str(self.nsres3))
+                # self.tewres3.SetValue(str(self.ewres3))
+
+        event.Skip()
+
+    def __UpdateInfo(self):
+        """!Update number of rows/cols/cells"""
+        self.rows = int((self.north - self.south) / self.nsres)
+        self.cols = int((self.east - self.west) / self.ewres)
+        self.cells = self.rows * self.cols
+
+        self.depth = int((self.top - self.bottom) / self.tbres)
+        self.cells3 = self.rows * self.cols * self.depth
+
+        # 2D
+        self.lrows.SetLabel(_("Rows: %d") % self.rows)
+        self.lcols.SetLabel(_("Cols: %d") % self.cols)
+        self.lcells.SetLabel(_("Cells: %d") % self.cells)
+        # 3D
+        self.ldepth.SetLabel(_("Depth: %d" % self.depth))
+        self.lcells3.SetLabel(_("3D Cells: %d" % self.cells3))
+
+    def OnSetButton(self, event = None):
+        """!Set default region"""
+        ret = RunCommand('g.region',
+                         flags = 'sgpa',
+                         n = self.north,
+                         s = self.south,
+                         e = self.east,
+                         w = self.west,
+                         nsres = self.nsres,
+                         ewres = self.ewres,
+                         t = self.top,
+                         b = self.bottom,
+                         tbres = self.tbres)
+        if ret == 0:
+            self.Destroy()
+
+    def OnCancel(self, event):
+        self.Destroy()
+        
+class TransList(wx.VListBox):
+    """!Creates a multiline listbox for selecting datum transforms"""
+        
+    def OnDrawItem(self, dc, rect, n):
+        if self.GetSelection() == n:
+            c = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT)
+        else:
+            c = self.GetForegroundColour()
+        dc.SetFont(self.GetFont())
+        dc.SetTextForeground(c)
+        dc.DrawLabel(self._getItemText(n), rect,
+                     wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
+
+    def OnMeasureItem(self, n):
+        height = 0
+        if self._getItemText(n) == None:
+            return
+        for line in self._getItemText(n).splitlines():
+            w, h = self.GetTextExtent(line)
+            height += h
+        return height + 5
+
+    def _getItemText(self, item):
+        global transformlist
+        transitem = transformlist[item]
+        if transitem.strip() !='':
+            return transitem
+
+class SelectTransformDialog(wx.Dialog):
+    """!Dialog for selecting datum transformations"""
+    def __init__(self, parent, transforms, title = _("Select datum transformation"),
+                 pos = wx.DefaultPosition, size = wx.DefaultSize, 
+                 style = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER):
+
+        wx.Dialog.__init__(self, parent, wx.ID_ANY, title, pos, size, style)
+
+        global transformlist
+        self.CentreOnParent()
+        
+        # default transform number
+        self.transnum = 0
+        
+        panel = scrolled.ScrolledPanel(self, wx.ID_ANY)
+        sizer = wx.BoxSizer(wx.VERTICAL)
+
+        #
+        # set panel sizer
+        #
+        panel.SetSizer(sizer)
+        panel.SetupScrolling()
+
+        #
+        # dialog body
+        #
+        bodyBox = wx.StaticBox(parent = panel, id = wx.ID_ANY,
+                               label = " %s " % _("Select from list of datum transformations"))
+        bodySizer = wx.StaticBoxSizer(bodyBox)       
+        
+        # add no transform option
+        transforms = '---\n\n0\nDo not apply any datum transformations\n\n' + transforms
+        
+        transformlist = transforms.split('---')
+        tlistlen = len(transformlist)
+        
+        # calculate size for transform list
+        height = 0
+        width = 0
+        for line in transforms.splitlines():
+            w, h = self.GetTextExtent(line)
+            height += h
+            width = max(width, w)
+            
+        height = height + 5
+        if height > 400: height = 400
+        width = width + 5
+        if width > 400: width = 400
+
+        #
+        # VListBox for displaying and selecting transformations
+        #
+        self.translist = TransList(panel, id = -1, size = (width, height), style = wx.SUNKEN_BORDER)
+        self.translist.SetItemCount(tlistlen)
+        self.translist.SetSelection(2)
+        self.translist.SetFocus()
+        
+        self.Bind(wx.EVT_LISTBOX, self.ClickTrans, self.translist)
+
+        bodySizer.Add(item = self.translist, proportion = 1, flag = wx.ALIGN_CENTER|wx.ALL|wx.EXPAND)
+
+        #
+        # buttons
+        #
+        btnsizer = wx.StdDialogButtonSizer()
+
+        btn = wx.Button(parent = panel, id = wx.ID_OK)
+        btn.SetDefault()
+        btnsizer.AddButton(btn)
+
+        btn = wx.Button(parent = panel, id = wx.ID_CANCEL)
+        btnsizer.AddButton(btn)
+        btnsizer.Realize()
+
+        sizer.Add(item = bodySizer, proportion = 1,
+                  flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+
+        sizer.Add(item = btnsizer, proportion = 0,
+                  flag =  wx.ALL | wx.ALIGN_RIGHT, border = 5)
+
+        sizer.Fit(panel)
+
+        self.SetSize(self.GetBestSize())
+        self.Layout()
+        
+    def ClickTrans(self, event):
+        """!Get the number of the datum transform to use in g.proj"""
+        self.transnum = event.GetSelection()
+        self.transnum = self.transnum - 1
+    
+    def GetTransform(self):
+        """!Get the number of the datum transform to use in g.proj"""
+        self.transnum = self.translist.GetSelection()
+        self.transnum = self.transnum - 1
+        return self.transnum
diff --git a/gui/wxpython/gui_modules/location_wizard.py b/gui/wxpython/location_wizard/wizard.py
similarity index 69%
rename from gui/wxpython/gui_modules/location_wizard.py
rename to gui/wxpython/location_wizard/wizard.py
index a939be5..2e8139f 100644
--- a/gui/wxpython/gui_modules/location_wizard.py
+++ b/gui/wxpython/location_wizard/wizard.py
@@ -1,59 +1,52 @@
 """!
- at package location_wizard.py
+ at package location_wizard.wizard
 
 @brief Location wizard - creates a new GRASS Location. User can choose
 from multiple methods.
 
 Classes:
- - BaseClass
- - TitledPage
- - DatabasePage
- - CoordinateSystemPage
- - ProjectionsPage
- - ItemList
- - ProjParamsPage
- - DatumPage
- - EllipsePage
- - GeoreferencedFilePage
- - EPSGPage
- - CustomPage
- - SummaryPage
- - RegionDef
- - LocationWizard
- - SelectTransformDialog
-
-(C) 2007-2011 by the GRASS Development Team
+ - wizard::TitledPage
+ - wizard::DatabasePage
+ - wizard::CoordinateSystemPage
+ - wizard::ProjectionsPage
+ - wizard::ItemList
+ - wizard::ProjParamsPage
+ - wizard::DatumPage
+ - wizard::EllipsePage
+ - wizard::GeoreferencedFilePage
+ - wizard::WKTPage
+ - wizard::EPSGPage
+ - wizard::CustomPage
+ - wizard::SummaryPage
+ - wizard::LocationWizard
+ - wizard::WizardWithHelpButton
+
+(C) 2007-2013 by the GRASS Development Team
 
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Michael Barton
 @author Jachym Cepicky
- at author Martin Landa <landa.martin gmail.com>   
+ at author Martin Landa <landa.martin gmail.com>
 """
 import os
-import shutil
-import string
-import sys
 import locale
-import platform
 
 import wx
 import wx.lib.mixins.listctrl as listmix
 import wx.wizard as wiz
 import wx.lib.scrolledpanel as scrolled
-import time
 
-import gcmd
-import globalvar
-import utils
+from core                    import globalvar
+from core                    import utils
+from core.gcmd               import RunCommand, GError, GMessage, GWarning
+from gui_core.ghelp          import HelpFrame
+from gui_core.widgets        import GenericValidator
+from location_wizard.base    import BaseClass
+from location_wizard.dialogs import SelectTransformDialog
+
 from grass.script import core as grass
-try:
-    import subprocess
-except:
-    CompatPath = os.path.join(globalvar.ETCWXDIR)
-    sys.path.append(CompatPath)
-    from compat import subprocess
 
 global coordsys
 global north
@@ -64,32 +57,6 @@ global resolution
 global wizerror
 global translist
 
-class BaseClass(wx.Object):
-    """!Base class providing basic methods"""
-    def __init__(self):
-        pass
-
-    def MakeLabel(self, text = "", style = wx.ALIGN_LEFT, parent = None):
-        """!Make aligned label"""
-        if not parent:
-            parent = self
-        return wx.StaticText(parent = parent, id = wx.ID_ANY, label = text,
-                             style = style)
-
-    def MakeTextCtrl(self, text = '', size = (100,-1), style = 0, parent = None):
-        """!Generic text control"""
-        if not parent:
-            parent = self
-        return wx.TextCtrl(parent = parent, id = wx.ID_ANY, value = text,
-                           size = size, style = style)
-
-    def MakeButton(self, text, id = wx.ID_ANY, size = (-1,-1), parent = None):
-        """!Generic button"""
-        if not parent:
-            parent = self
-        return wx.Button(parent = parent, id = id, label = text,
-                         size = size)
-
 class TitledPage(BaseClass, wiz.WizardPageSimple):
     """!Class to make wizard pages. Generic methods to make labels,
     text entries, and buttons.
@@ -136,6 +103,7 @@ class DatabasePage(TitledPage):
         # text controls
         self.tgisdbase = self.MakeTextCtrl(grassdatabase, size = (300, -1))
         self.tlocation = self.MakeTextCtrl("newLocation", size = (300, -1))
+        self.tlocation.SetValidator(GenericValidator(grass.legal_name, self._nameValidationFailed))
         self.tlocTitle = self.MakeTextCtrl(size = (400, -1))
         
         # layout
@@ -156,7 +124,8 @@ class DatabasePage(TitledPage):
                        wx.ALL, border = 5,
                        pos = (1, 3))
         
-        self.sizer.Add(item = self.MakeLabel("%s:" % _("Project Location")),
+        self.sizer.Add(item = self.MakeLabel("%s:" % _("Project Location"),
+                                             tooltip = _("Name of location directory in GIS Data Directory")),
                        flag = wx.ALIGN_RIGHT |
                        wx.ALIGN_CENTER_VERTICAL |
                        wx.ALL, border = 5,
@@ -167,7 +136,9 @@ class DatabasePage(TitledPage):
                        wx.ALL, border = 5,
                        pos = (2, 2))
 
-        self.sizer.Add(item = self.MakeLabel("%s:" % _("Location Title")),
+        self.sizer.Add(item = self.MakeLabel("%s:" % _("Location Title"),
+                                             tooltip = _("Optional location title, "
+                                                         "you can leave this field blank.")),
                        flag = wx.ALIGN_RIGHT |
                        wx.ALIGN_TOP | wx.ALIGN_CENTER_VERTICAL |
                        wx.ALL, border = 5,
@@ -184,6 +155,12 @@ class DatabasePage(TitledPage):
         self.tgisdbase.Bind(wx.EVT_TEXT,        self.OnChangeName)
         self.tlocation.Bind(wx.EVT_TEXT,        self.OnChangeName)
         
+    def _nameValidationFailed(self, ctrl):
+        message = _("Name <%(name)s> is not a valid name for location. "
+                    "Please use only ASCII characters excluding %(chars)s "
+                    "and space.") % {'name': ctrl.GetValue(), 'chars': '/"\'@,=*~'}
+        GError(parent=self, message=message, caption=_("Invalid location name"))
+
     def OnChangeName(self, event):
         """!Name for new location was changed"""
         nextButton = wx.FindWindowById(wx.ID_FORWARD)
@@ -211,11 +188,11 @@ class DatabasePage(TitledPage):
             error = _("Location already exists in GRASS Database.")
 
         if error:
-            gcmd.GError(parent = self,
-                        message="%s <%s>.%s%s" % (_("Unable to create location"),
-                                                  str(self.tlocation.GetValue()),
-                                                  os.linesep,
-                                                  error))
+            GError(parent = self,
+                   message="%s <%s>.%s%s" % (_("Unable to create location"),
+                                             str(self.tlocation.GetValue()),
+                                             os.linesep,
+                                             error))
             event.Veto()
             return
 
@@ -224,9 +201,9 @@ class DatabasePage(TitledPage):
         self.locTitle      = self.tlocTitle.GetValue()
         if os.linesep in self.locTitle or \
                 len(self.locTitle) > 255:
-            gcmd.GWarning(parent = self,
-                          message = _("Title of the location is limited only to one line and "
-                                      "256 characters. The rest of the text will be ignored."))
+            GWarning(parent = self,
+                     message = _("Title of the location is limited only to one line and "
+                                 "256 characters. The rest of the text will be ignored."))
             self.locTitle = self.locTitle.split(os.linesep)[0][:255]
             
 class CoordinateSystemPage(TitledPage):
@@ -248,12 +225,12 @@ class CoordinateSystemPage(TitledPage):
                                              "georeferenced data file"))
         self.radio4 = wx.RadioButton(parent = self, id = wx.ID_ANY,
                                      label = _("Read projection and datum terms from a "
-                                             "WKT or PRJ file"))
+                                             "Well Known Text (WKT) .prj file"))
         self.radio5 = wx.RadioButton(parent = self, id = wx.ID_ANY,
                                      label = _("Specify projection and datum terms using custom "
                                              "PROJ.4 parameters"))
         self.radio6 = wx.RadioButton(parent = self, id = wx.ID_ANY,
-                                     label = _("Create an arbitrary non-earth coordinate system (XY)"))
+                                     label = _("Create a generic Cartesian coordinate system (XY)"))
         
         # layout
         self.sizer.AddGrowableCol(1)
@@ -486,6 +463,13 @@ class ItemList(wx.ListCtrl,
         for column in columns:
             self.InsertColumn(i, column)
             i += 1
+        #
+        # add some attributes
+        #
+        self.attr1 = wx.ListItemAttr()
+        self.attr1.SetBackgroundColour(wx.Colour(238,238,238))
+        self.attr2 = wx.ListItemAttr()
+        self.attr2.SetBackgroundColour("white")
 
         if self.sourceData:
             self.Populate()
@@ -501,13 +485,6 @@ class ItemList(wx.ListCtrl,
         listmix.ListCtrlAutoWidthMixin.__init__(self)
         listmix.ColumnSorterMixin.__init__(self, self.GetColumnCount())
             
-        #
-        # add some attributes
-        #
-        self.attr1 = wx.ListItemAttr()
-        self.attr1.SetBackgroundColour(wx.Colour(238,238,238))
-        self.attr2 = wx.ListItemAttr()
-        self.attr2.SetBackgroundColour("white")
         self.il = wx.ImageList(16, 16)
         self.sm_up = self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_GO_UP,   wx.ART_TOOLBAR,
                                                           (16,16)))
@@ -770,7 +747,7 @@ class ProjParamsPage(TitledPage):
             paramSBSizer.Fit(self.panel)
             self.panel.SetSizer(self.prjParamSizer)
                     
-        if event.GetDirection(): 
+        if event.GetDirection():
             self.prjParamSizer.Clear(True)
             self.paramSBox.SetLabel(_(" Enter parameters for %s projection ") % self.projdesc)
             self.pparam = dict()
@@ -785,7 +762,7 @@ class ProjParamsPage(TitledPage):
                 # default values
                 if param['type'] == 'bool':
                     param['value'] = 0
-                elif param['type'] == 'zone': 
+                elif param['type'] == 'zone':
                     param['value'] = 30 
                     param['desc'] += ' (1-60)'
                 else:
@@ -914,17 +891,20 @@ class DatumPage(TitledPage):
     def OnPageChanging(self, event):
         self.proj4params = ''
         proj = self.parent.projpage.p4proj
-                
+        
         if event.GetDirection():
             if self.datum not in self.parent.datums:
                 event.Veto()
             else:
                 # check for datum tranforms            
 #                proj4string = self.parent.CreateProj4String() + ' +datum=%s' % self.datum
-                ret = gcmd.RunCommand('g.proj',
-                                      read = True,
-                                      proj4 = '%s +datum=%s' % (proj, self.datum), 
-                                      datumtrans = '-1')
+                ret = RunCommand('g.proj',
+                                 read = True,
+                                 proj4 = '%s' % proj,
+                                 datum = '%s' % self.datum, 
+                                 datumtrans = '-1',
+                                 flags = 't')
+#                wx.Messagebox('here')
                 if ret != '':
                     dtrans = ''
                     # open a dialog to select datum transform number
@@ -1014,7 +994,7 @@ class EllipsePage(TitledPage):
         TitledPage.__init__(self, wizard, _("Specify ellipsoid"))
 
         self.parent = parent
-        
+
         self.ellipse = ''
         self.ellipsedesc = ''
         self.ellipseparams = ''
@@ -1063,10 +1043,10 @@ class EllipsePage(TitledPage):
                        wx.ALL, border = 5, pos = (3, 1), span = (1, 4))
 
         # events
-        self.ellipselist.Bind(wx.EVT_LIST_ITEM_SELECTED,    self.OnItemSelected)
+        self.ellipselist.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
         self.tellipse.Bind(wx.EVT_TEXT, self.OnText)
         self.tellipse.Bind(wx.EVT_TEXT_ENTER, self.OnText)
-        self.searchb.Bind(wx.EVT_TEXT_ENTER,    self.OnSearch)
+        self.searchb.Bind(wx.EVT_TEXT_ENTER, self.OnSearch)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGED, self.OnEnterPage)
         self.Bind(wiz.EVT_WIZARD_PAGE_CHANGING, self.OnPageChanging)
 
@@ -1202,12 +1182,12 @@ class WKTPage(TitledPage):
     for setting coordinate system parameters"""
 
     def __init__(self, wizard, parent):
-        TitledPage.__init__(self, wizard, _("Select WKT file"))
+        TitledPage.__init__(self, wizard, _("Select Well Known Text (WKT) .prj file"))
 
         self.wktfile = ''
 
         # create controls
-        self.lfile= self.MakeLabel(_("WKT file:"))
+        self.lfile= self.MakeLabel(_("WKT .prj file:"))
         self.tfile = self.MakeTextCtrl(size = (300,-1))
         self.bbrowse = self.MakeButton(_("Browse"))
 
@@ -1259,8 +1239,11 @@ class WKTPage(TitledPage):
     def OnBrowse(self, event):
         """!Choose file"""
         dlg = wx.FileDialog(self,
-                            _("Select WKT file"),
-                            os.getcwd(), "", "*.*", wx.OPEN)
+                            message = _("Select Well Known Text (WKT) .prj file"),
+                            defaultDir = os.getcwd(),
+                            wildcard = "PRJ files (*.prj)|*.prj|Files (*.*)|*.*",
+                            style = wx.OPEN)
+
         if dlg.ShowModal() == wx.ID_OK:
             path = dlg.GetPath()
             self.tfile.SetValue(path)
@@ -1362,12 +1345,13 @@ class EPSGPage(TitledPage):
             if not self.epsgcode:
                 event.Veto()
                 return
-            else:              
+            else:
                 # check for datum transforms
-                ret = gcmd.RunCommand('g.proj',
-                                      read = True,
-                                      epsg = self.epsgcode,
-                                      datumtrans = '-1')
+                ret = RunCommand('g.proj',
+                                 read = True,
+                                 epsg = self.epsgcode,
+                                 datumtrans = '-1',
+                                 flags = 't')
                 
                 if ret != '':
                     dtrans = ''
@@ -1417,7 +1401,7 @@ class EPSGPage(TitledPage):
             self.tcode.SetValue('')
             self.searchb.SetValue('')
             self.OnBrowseCodes(None)
-        else:    
+        else:
             try:
                 self.epsgcode, self.epsgdesc, self.epsgparams = \
                         self.epsglist.Search(index=[0,1,2], pattern=value)
@@ -1515,11 +1499,19 @@ class CustomPage(TitledPage):
 
     def OnPageChanging(self, event):
         if event.GetDirection():
-        # check for datum tranforms            
-            ret, out, err = gcmd.RunCommand('g.proj',
-                                            read = True, getErrorMsg = True,
-                                            proj4 = self.customstring, 
-                                            datumtrans = '-1')
+            self.custom_dtrans_string = ''
+
+            if self.customstring.find('+datum=') < 0:
+                self.GetNext().SetPrev(self)
+                return
+
+            # check for datum tranforms
+            # FIXME: -t flag is a hack-around for trac bug #1849
+            ret, out, err = RunCommand('g.proj',
+                                       read = True, getErrorMsg = True,
+                                       proj4 = self.customstring, 
+                                       datumtrans = '-1',
+                                       flags = 't')
             if ret != 0:
                 wx.MessageBox(parent = self,
                               message = err,
@@ -1527,15 +1519,14 @@ class CustomPage(TitledPage):
                               style = wx.OK | wx.ICON_ERROR | wx.CENTRE)
                 event.Veto()
                 return
-            
+        
             if out:
                 dtrans = ''
                 # open a dialog to select datum transform number
                 dlg = SelectTransformDialog(self.parent.parent, transforms = out)
-                
                 if dlg.ShowModal() == wx.ID_OK:
                     dtrans = dlg.GetTransform()
-                    if len(dtrans) == 0:
+                    if dtrans == '':
                         dlg.Destroy()
                         event.Veto()
                         return _('Datum transform is required.')
@@ -1543,9 +1534,22 @@ class CustomPage(TitledPage):
                     dlg.Destroy()
                     event.Veto()
                     return _('Datum transform is required.')
-                
+            
                 self.parent.datumtrans = dtrans
-        
+
+                # prepare +nadgrids or +towgs84 terms for Summary page. first convert them:
+                ret, projlabel, err = RunCommand('g.proj',
+                                                 flags = 'jft',
+                                                 proj4 = self.customstring,
+                                                 datumtrans = dtrans,
+                                                 getErrorMsg = True,
+                                                 read = True)
+                # splitting on space alone would break for grid files with space in pathname
+                for projterm in projlabel.split(' +'):
+                    if projterm.find("towgs84=") != -1 or projterm.find("nadgrids=") != -1:
+                        self.custom_dtrans_string = ' +%s' % projterm
+                        break
+
         self.GetNext().SetPrev(self)
             
     def GetProjstring(self, event):
@@ -1633,7 +1637,7 @@ class SummaryPage(TitledPage):
         self.sizer.Add(item = self.panelProj,
                        flag = wx.ALIGN_LEFT | wx.ALL | wx.EXPAND,
                        border = 0, pos = (4, 1))
-        self.sizer.Add(item = self.MakeLabel(_("PROJ.4 definition:")),
+        self.sizer.Add(item = self.MakeLabel(_("PROJ.4 definition:\n (non-definitive)")),
                        flag = wx.ALIGN_LEFT | wx.ALL,
                        border = 5, pos = (5, 0))
         self.sizer.Add(item = self.panelProj4string,
@@ -1648,33 +1652,52 @@ class SummaryPage(TitledPage):
         location = self.parent.startpage.location
         proj4string = self.parent.CreateProj4String()
         epsgcode = self.parent.epsgpage.epsgcode
+        datum = self.parent.datumpage.datum
         dtrans = self.parent.datumtrans
         
         global coordsys
-        if coordsys in ('proj', 'epsg'):
+
+        if coordsys in ('proj', 'epsg', 'wkt', 'file'):
+            extra_opts = {}
+            extra_opts['location'] = 'location'
+            extra_opts['getErrorMsg'] = True
+            extra_opts['read'] = True
+
             if coordsys == 'proj':
-                ret, projlabel, err = gcmd.RunCommand('g.proj',
-                                                      flags = 'jf',
-                                                      proj4 = proj4string,
-                                                      datumtrans = dtrans,
-                                                      location = location,
-                                                      getErrorMsg = True,
-                                                      read = True)
+                addl_opts = {}
+                if len(datum) > 0:
+                    extra_opts['datum'] = '%s' % datum
+                    extra_opts['datumtrans'] = dtrans
+
+                ret, projlabel, err = RunCommand('g.proj',
+                                                 flags = 'jf',
+                                                 proj4 = proj4string,
+                                                 **extra_opts)
             elif coordsys == 'epsg':
-                ret, projlabel, err = gcmd.RunCommand('g.proj',
-                                                      flags = 'jf',
-                                                      epsg = epsgcode,
-                                                      datumtrans = dtrans,
-                                                      location = location,
-                                                      getErrorMsg = True,
-                                                      read = True)
+                ret, projlabel, err = RunCommand('g.proj',
+                                                 flags = 'jft',
+                                                 epsg = epsgcode,
+                                                 datumtrans = dtrans,
+                                                 **extra_opts)
+            elif coordsys == 'file':
+                ret, projlabel, err = RunCommand('g.proj',
+                                                 flags = 'jft',
+                                                 georef = self.parent.filepage.georeffile,
+                                                 **extra_opts)
+            elif coordsys == 'wkt':
+                ret, projlabel, err = RunCommand('g.proj',
+                                                 flags = 'jft',
+                                                 wkt = self.parent.wktpage.wktfile,
+                                                 **extra_opts)
 
             finishButton = wx.FindWindowById(wx.ID_FORWARD)
             if ret == 0:
-                self.lproj4string.SetLabel(projlabel.replace(' ', os.linesep))
+                if datum != '':
+                    projlabel = projlabel + '+datum=%s' % datum
+                self.lproj4string.SetLabel(projlabel.replace(' +', os.linesep + '+'))
                 finishButton.Enable(True)
             else:
-                gcmd.GError(err, parent = self)
+                GError(err, parent = self)
                 self.lproj4string.SetLabel('')
                 finishButton.Enable(False)
         
@@ -1687,22 +1710,30 @@ class SummaryPage(TitledPage):
         
         label = ''
         if coordsys == 'epsg':
-            label = 'EPSG code %s (%s)' % (self.parent.epsgpage.epsgcode, self.parent.epsgpage.epsgdesc)
+            label = 'EPSG code %s (%s)' % (self.parent.epsgpage.epsgcode,
+                                           self.parent.epsgpage.epsgdesc)
+
         elif coordsys == 'file':
             label = 'matches file %s' % self.parent.filepage.georeffile
-            self.lproj4string.SetLabel("")
+
         elif coordsys == 'wkt':
             label = 'matches file %s' % self.parent.wktpage.wktfile
-            self.lproj4string.SetLabel("")
+
         elif coordsys == 'proj':
             label = ('%s, %s %s' % (projdesc, datumdesc, ellipsedesc))
+
         elif coordsys == 'xy':
             label = ('XY coordinate system (not projected).')
             self.lproj4string.SetLabel("")
+
         elif coordsys == 'custom':
             label = _("custom")
-            self.lproj4string.SetLabel(('%s' % self.parent.custompage.customstring.replace(' ', os.linesep)))
+            combo_str = self.parent.custompage.customstring + \
+                        self.parent.custompage.custom_dtrans_string
+            self.lproj4string.SetLabel(('%s' % combo_str.replace(' +', os.linesep + '+')))
+
         self.lprojection.SetLabel(label)
+
         
     def OnFinish(self, event):
         dlg = wx.MessageDialog(parent = self.wizard,
@@ -1743,12 +1774,18 @@ class LocationWizard(wx.Object):
         #
         self.datumtrans = None
         self.proj4string = ''
-        
+
+        # file from which new location is created
+        self.georeffile = None
+
         #
         # define wizard pages
         #
-        self.wizard = wiz.Wizard(parent, id = wx.ID_ANY, title = _("Define new GRASS Location"),
-                                 bitmap = wizbmp, style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER)
+        self.wizard = WizardWithHelpButton(parent, id = wx.ID_ANY,
+                                           title = _("Define new GRASS Location"),
+                                           bitmap = wizbmp)
+        self.wizard.Bind(wiz.EVT_WIZARD_HELP, self.OnHelp)
+
         self.startpage = DatabasePage(self.wizard, self, grassdatabase)
         self.csystemspage = CoordinateSystemPage(self.wizard, self)
         self.projpage = ProjectionsPage(self.wizard, self)
@@ -1829,34 +1866,24 @@ class LocationWizard(wx.Object):
             if not msg:
                 self.wizard.Destroy()
                 self.location = self.startpage.location
-                
-                if self.altdb == False: 
-                    dlg = wx.MessageDialog(parent = self.parent,
-                                           message = _("Do you want to set the default "
-                                                     "region extents and resolution now?"),
-                                           caption = _("Location <%s> created") % self.location,
-                                           style = wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
-                    dlg.CenterOnScreen()
-                    if dlg.ShowModal() == wx.ID_YES:
-                        dlg.Destroy()
-                        defineRegion = RegionDef(self.parent, location = self.location)
-                        defineRegion.CenterOnScreen()
-                        defineRegion.Show()
-                    else:
-                        dlg.Destroy()
+                self.grassdatabase = self.startpage.grassdatabase
+                self.georeffile = self.filepage.georeffile
+                # FIXME here was code for setting default region, what for is this if:
+                # if self.altdb == False:
+                    
             else: # -> error
                 self.wizard.Destroy()
-                gcmd.GError(parent = self.parent,
-                            message = "%s" % _("Unable to create new location. "
-                                               "Location <%(loc)s> not created.\n\n"
-                                               "Details: %(err)s") % \
-                                  { 'loc' : self.startpage.location,
-                                    'err' : msg })
-        else: # -> cancelled
+                GError(parent = self.parent,
+                       message = "%s" % _("Unable to create new location. "
+                                          "Location <%(loc)s> not created.\n\n"
+                                          "Details: %(err)s") % \
+                           { 'loc' : self.startpage.location,
+                             'err' : msg })
+        else: # -> canceled
             self.wizard.Destroy()
-            gcmd.GMessage(parent = self.parent,
-                          message = _("Location wizard canceled. "
-                                    "Location not created."))
+            GMessage(parent = self.parent,
+                     message = _("Location wizard canceled. "
+                                 "Location not created."))
             
         self.__cleanUp()
         
@@ -1960,11 +1987,11 @@ class LocationWizard(wx.Object):
         
         # location already exists?
         if os.path.isdir(os.path.join(database,location)):
-            gcmd.GError(parent = self.wizard,
-                        message = "%s <%s>: %s" % \
-                            (_("Unable to create new location"),
-                             os.path.join(database, location),
-                             _("Location already exists in GRASS Database.")))
+            GError(parent = self.wizard,
+                   message = "%s <%s>: %s" % \
+                       (_("Unable to create new location"),
+                        os.path.join(database, location),
+                        _("Location already exists in GRASS Database.")))
             return None
         
         # current GISDbase or a new one?
@@ -1976,9 +2003,9 @@ class LocationWizard(wx.Object):
                 os.mkdir(database)
             
             # change to new GISDbase directory
-            gcmd.RunCommand('g.gisenv',
-                            parent = self.wizard,
-                            set = 'GISDBASE=%s' % database)
+            RunCommand('g.gisenv',
+                       parent = self.wizard,
+                       set = 'GISDBASE=%s' % database)
             
             wx.MessageBox(parent = self.wizard,
                           message = _("Location <%(loc)s> will be created "
@@ -2002,13 +2029,19 @@ class LocationWizard(wx.Object):
                 grass.create_location(dbase = self.startpage.grassdatabase,
                                       location = self.startpage.location,
                                       proj4 = self.CreateProj4String(),
-                                      datum = self.datumtrans,
+                                      datum = self.datumpage.datum,
+                                      datumtrans = self.datumtrans,
                                       desc = self.startpage.locTitle)
             elif coordsys == 'custom':
+                addl_opts = {}
+                if self.datumtrans is not None:
+                    addl_opts['datumtrans'] = self.datumtrans
+
                 grass.create_location(dbase = self.startpage.grassdatabase,
                                       location = self.startpage.location,
                                       proj4 = self.custompage.customstring,
-                                      desc = self.startpage.locTitle)
+                                      desc = self.startpage.locTitle,
+                                      **addl_opts)
             elif coordsys == "epsg":
                 if not self.epsgpage.epsgcode:
                     return _('EPSG code missing.')
@@ -2016,7 +2049,8 @@ class LocationWizard(wx.Object):
                 grass.create_location(dbase = self.startpage.grassdatabase,
                                       location = self.startpage.location,
                                       epsg = self.epsgpage.epsgcode,
-                                      datum = self.datumtrans,
+                                      datum = self.datumpage.datum,
+                                      datumtrans = self.datumtrans,
                                       desc = self.startpage.locTitle)
             elif coordsys == "file":
                 if not self.filepage.georeffile or \
@@ -2049,7 +2083,7 @@ class LocationWizard(wx.Object):
         projdesc = self.projpage.projdesc
         proj4params = self.paramspage.p4projparams
                 
-        datum = self.datumpage.datum
+#        datum = self.datumpage.datum
         if self.datumpage.datumdesc:
             datumdesc = self.datumpage.datumdesc +' - ' + self.datumpage.ellipse
         else:
@@ -2058,12 +2092,12 @@ class LocationWizard(wx.Object):
         ellipse = self.ellipsepage.ellipse
         ellipsedesc = self.ellipsepage.ellipsedesc
         ellipseparams = self.ellipsepage.ellipseparams
-                
+        
         #
         # creating PROJ.4 string
         #
         proj4string = '%s %s' % (proj, proj4params)
-                            
+
         # set ellipsoid parameters
         if ellipse != '':
             proj4string = '%s +ellps=%s' % (proj4string, ellipse)
@@ -2073,606 +2107,27 @@ class LocationWizard(wx.Object):
             else:
                 item = ' +' + item
             proj4string = '%s %s' % (proj4string, item)
-            
-        # set datum and transform parameters if relevant
-        if datum != '':
-            proj4string = '%s +datum=%s' % (proj4string, datum)
+        
+        # set datum transform parameters if relevant
         if datumparams:
             for item in datumparams:
                 proj4string = '%s +%s' % (proj4string,item)
 
         proj4string = '%s +no_defs' % proj4string
-        
-        return proj4string
 
-class RegionDef(BaseClass, wx.Frame):
-    """!Page for setting default region extents and resolution
-    """
-    def __init__(self, parent, id = wx.ID_ANY,
-                 title = _("Set default region extent and resolution"), location = None):
-        wx.Frame.__init__(self, parent, id, title, size = (650,300))
-        panel = wx.Panel(self, id = wx.ID_ANY)
-        
-        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-        
-        self.parent = parent
-        self.location = location
-        
-        #
-        # default values
-        #
-        # 2D
-        self.north = 1.0
-        self.south = 0.0
-        self.east = 1.0
-        self.west = 0.0
-        self.nsres = 1.0
-        self.ewres = 1.0
-        # 3D
-        self.top = 1.0
-        self.bottom = 0.0
-        #         self.nsres3 = 1.0
-        #         self.ewres3 = 1.0
-        self.tbres  = 1.0
-        
-        #
-        # inputs
-        #
-        # 2D
-        self.tnorth = self.MakeTextCtrl(text = str(self.north), size = (150, -1), parent = panel)
-        self.tsouth = self.MakeTextCtrl(str(self.south), size = (150, -1), parent = panel)
-        self.twest = self.MakeTextCtrl(str(self.west), size = (150, -1), parent = panel)
-        self.teast = self.MakeTextCtrl(str(self.east), size = (150, -1), parent = panel)
-        self.tnsres = self.MakeTextCtrl(str(self.nsres), size = (150, -1), parent = panel)
-        self.tewres = self.MakeTextCtrl(str(self.ewres), size = (150, -1), parent = panel)
-        
-        #
-        # labels
-        #
-        self.lrows  = self.MakeLabel(parent = panel)
-        self.lcols  = self.MakeLabel(parent = panel)
-        self.lcells = self.MakeLabel(parent = panel)
-        
-        #
-        # buttons
-        #
-        self.bset = self.MakeButton(text = _("&Set region"), id = wx.ID_OK, parent = panel)
-        self.bcancel = wx.Button(panel, id = wx.ID_CANCEL)
-        self.bset.SetDefault()
-        
-        #
-        # image
-        #
-        self.img = wx.Image(os.path.join(globalvar.ETCIMGDIR, "qgis_world.png"),
-                            wx.BITMAP_TYPE_PNG).ConvertToBitmap()
-        
-        #
-        # set current working environment to PERMANENT mapset
-        # in selected location in order to set default region (WIND)
-        #
-        envval = {}
-        ret = gcmd.RunCommand('g.gisenv',
-                              read = True)
-        if ret:
-            for line in ret.splitlines():
-                key, val = line.split('=')
-                envval[key] = val
-            self.currlocation = envval['LOCATION_NAME'].strip("';")
-            self.currmapset = envval['MAPSET'].strip("';")
-            if self.currlocation != self.location or self.currmapset != 'PERMANENT':
-                gcmd.RunCommand('g.gisenv',
-                                set = 'LOCATION_NAME=%s' % self.location)
-                gcmd.RunCommand('g.gisenv',
-                                set = 'MAPSET=PERMANENT')
-        else:
-            dlg = wx.MessageBox(parent = self,
-                                message = _('Invalid location selected.'),
-                                caption = _("Error"), style = wx.ID_OK | wx.ICON_ERROR)
-            return
-        
-        #
-        # get current region settings
-        #
-        region = {}
-        ret = gcmd.RunCommand('g.region',
-                              read = True,
-                              flags = 'gp3')
-        if ret:
-            for line in ret.splitlines():
-                key, val = line.split('=')
-                region[key] = float(val)
-        else:
-            dlg = wx.MessageBox(parent = self,
-                                message = _("Invalid region"),
-                                caption = _("Error"), style = wx.ID_OK | wx.ICON_ERROR)
-            dlg.ShowModal()
-            dlg.Destroy()
-            return
-        
-        #
-        # update values
-        # 2D
-        self.north = float(region['n'])
-        self.south = float(region['s'])
-        self.east = float(region['e'])
-        self.west = float(region['w'])
-        self.nsres = float(region['nsres'])
-        self.ewres = float(region['ewres'])
-        self.rows = int(region['rows'])
-        self.cols = int(region['cols'])
-        self.cells = int(region['cells'])
-        # 3D
-        self.top = float(region['t'])
-        self.bottom = float(region['b'])
-        #         self.nsres3 = float(region['nsres3'])
-        #         self.ewres3 = float(region['ewres3'])
-        self.tbres = float(region['tbres'])
-        self.depth = int(region['depths'])
-        self.cells3 = int(region['cells3'])
-        
-        #
-        # 3D box collapsable
-        #
-        self.infoCollapseLabelExp = _("Click here to show 3D settings")
-        self.infoCollapseLabelCol = _("Click here to hide 3D settings")
-        self.settings3D = wx.CollapsiblePane(parent = panel,
-                                             label = self.infoCollapseLabelExp,
-                                             style = wx.CP_DEFAULT_STYLE |
-                                             wx.CP_NO_TLW_RESIZE | wx.EXPAND)
-        self.MakeSettings3DPaneContent(self.settings3D.GetPane())
-        self.settings3D.Collapse(False) # FIXME
-        self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnSettings3DPaneChanged, self.settings3D)
-        
-        #
-        # set current region settings
-        #
-        self.tnorth.SetValue(str(self.north))
-        self.tsouth.SetValue(str(self.south))
-        self.twest.SetValue(str(self.west))
-        self.teast.SetValue(str(self.east))
-        self.tnsres.SetValue(str(self.nsres))
-        self.tewres.SetValue(str(self.ewres))
-        self.ttop.SetValue(str(self.top))
-        self.tbottom.SetValue(str(self.bottom))
-        #         self.tnsres3.SetValue(str(self.nsres3))
-        #         self.tewres3.SetValue(str(self.ewres3))
-        self.ttbres.SetValue(str(self.tbres))
-        self.lrows.SetLabel(_("Rows: %d") % self.rows)
-        self.lcols.SetLabel(_("Cols: %d") % self.cols)
-        self.lcells.SetLabel(_("Cells: %d") % self.cells)
-        
-        #
-        # bindings
-        #
-        self.Bind(wx.EVT_BUTTON, self.OnSetButton, self.bset)
-        self.Bind(wx.EVT_BUTTON, self.OnCancel, self.bcancel)
-        self.tnorth.Bind(wx.EVT_TEXT,   self.OnValue)
-        self.tsouth.Bind(wx.EVT_TEXT,   self.OnValue)
-        self.teast.Bind(wx.EVT_TEXT,    self.OnValue)
-        self.twest.Bind(wx.EVT_TEXT,    self.OnValue)
-        self.tnsres.Bind(wx.EVT_TEXT,   self.OnValue)
-        self.tewres.Bind(wx.EVT_TEXT,   self.OnValue)
-        self.ttop.Bind(wx.EVT_TEXT,     self.OnValue)
-        self.tbottom.Bind(wx.EVT_TEXT,  self.OnValue)
-        #         self.tnsres3.Bind(wx.EVT_TEXT,  self.OnValue)
-        #         self.tewres3.Bind(wx.EVT_TEXT,  self.OnValue)
-        self.ttbres.Bind(wx.EVT_TEXT,   self.OnValue)
-        
-        self.__DoLayout(panel)
-        self.SetMinSize(self.GetBestSize())
-        self.minWindowSize = self.GetMinSize()
-    
-    def MakeSettings3DPaneContent(self, pane):
-        """!Create 3D region settings pane"""
-        border = wx.BoxSizer(wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 0, hgap = 0)
-
-        # inputs
-        self.ttop = wx.TextCtrl(parent = pane, id = wx.ID_ANY, value = str(self.top),
-                                size = (150, -1))
-        self.tbottom = wx.TextCtrl(parent = pane, id = wx.ID_ANY, value = str(self.bottom),
-                                size = (150, -1))
-        self.ttbres = wx.TextCtrl(parent = pane, id = wx.ID_ANY, value = str(self.tbres),
-                                size = (150, -1))
-        #         self.tnsres3 = wx.TextCtrl(parent = pane, id = wx.ID_ANY, value = str(self.nsres3),
-        #                                    size = (150, -1))
-        #         self.tewres3  =  wx.TextCtrl(parent = pane, id = wx.ID_ANY, value = str(self.ewres3),
-        #                                    size = (150, -1))
-
-        #labels
-        self.ldepth = wx.StaticText(parent = pane, label = _("Depth: %d") % self.depth)
-        self.lcells3  =  wx.StaticText(parent = pane, label = _("3D Cells: %d") % self.cells3)
-
-        # top
-        gridSizer.Add(item = wx.StaticText(parent = pane, label = _("Top")),
-                      flag = wx.ALIGN_CENTER |
-                      wx.LEFT | wx.RIGHT | wx.TOP, border = 5,
-                      pos = (0, 1))
-        gridSizer.Add(item = self.ttop,
-                      flag = wx.ALIGN_CENTER_HORIZONTAL |
-                      wx.ALL, border = 5, pos = (1, 1))
-        # bottom
-        gridSizer.Add(item = wx.StaticText(parent = pane, label = _("Bottom")),
-                      flag = wx.ALIGN_CENTER |
-                      wx.LEFT | wx.RIGHT | wx.TOP, border = 5,
-                      pos = (0, 2))
-        gridSizer.Add(item = self.tbottom,
-                      flag = wx.ALIGN_CENTER_HORIZONTAL |
-                      wx.ALL, border = 5, pos = (1, 2))
-        # tbres
-        gridSizer.Add(item = wx.StaticText(parent = pane, label = _("T-B resolution")),
-                      flag = wx.ALIGN_CENTER | 
-                      wx.LEFT | wx.RIGHT | wx.TOP, border = 5,
-                      pos = (0, 3))
-        gridSizer.Add(item = self.ttbres,
-                      flag = wx.ALIGN_CENTER_HORIZONTAL |
-                      wx.ALL, border = 5, pos = (1, 3))
-
-        # res
-        #         gridSizer.Add(item = wx.StaticText(parent = pane, label = _("3D N-S resolution")),
-        #                       flag = wx.ALIGN_CENTER |
-        #                       wx.LEFT | wx.RIGHT | wx.TOP, border = 5,
-        #                       pos = (2, 1))
-        #         gridSizer.Add(item = self.tnsres3,
-        #                       flag = wx.ALIGN_CENTER_HORIZONTAL |
-        #                       wx.ALL, border = 5, pos = (3, 1))
-        #         gridSizer.Add(item = wx.StaticText(parent = pane, label = _("3D E-W resolution")),
-        #                       flag = wx.ALIGN_CENTER |
-        #                       wx.LEFT | wx.RIGHT | wx.TOP, border = 5,
-        #                       pos = (2, 3))
-        #         gridSizer.Add(item = self.tewres3,
-        #                       flag = wx.ALIGN_CENTER_HORIZONTAL |
-        #                       wx.ALL, border = 5, pos = (3, 3))
-
-        # rows/cols/cells
-        gridSizer.Add(item = self.ldepth,
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
-                      wx.ALL, border = 5, pos = (2, 1))
-
-        gridSizer.Add(item = self.lcells3,
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
-                      wx.ALL, border = 5, pos = (2, 2))
-
-        border.Add(item = gridSizer, proportion = 1,
-                   flag = wx.ALL | wx.ALIGN_CENTER | wx.EXPAND, border = 5)
-
-        pane.SetSizer(border)
-        border.Fit(pane)
-
-    def OnSettings3DPaneChanged(self, event):
-        """!Collapse 3D settings box"""
-
-        if self.settings3D.IsExpanded():
-            self.settings3D.SetLabel(self.infoCollapseLabelCol)
-            self.Layout()
-            self.SetSize(self.GetBestSize())
-            self.SetMinSize(self.GetSize())
-        else:
-            self.settings3D.SetLabel(self.infoCollapseLabelExp)
-            self.Layout()
-            self.SetSize(self.minWindowSize)
-            self.SetMinSize(self.minWindowSize)
-
-        self.SendSizeEvent()
-
-    def __DoLayout(self, panel):
-        """!Window layout"""
-        frameSizer = wx.BoxSizer(wx.VERTICAL)
-        gridSizer = wx.GridBagSizer(vgap = 0, hgap = 0)
-        settings3DSizer = wx.BoxSizer(wx.VERTICAL)
-        buttonSizer = wx.BoxSizer(wx.HORIZONTAL)
-
-        # north
-        gridSizer.Add(item = self.MakeLabel(text = _("North"), parent = panel),
-                      flag = wx.ALIGN_BOTTOM | wx.ALIGN_CENTER_HORIZONTAL |
-                      wx.TOP | wx.LEFT | wx.RIGHT, border = 5, pos = (0, 2))
-        gridSizer.Add(item = self.tnorth,
-                      flag = wx.ALIGN_CENTER_HORIZONTAL |
-                      wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALL, border = 5, pos = (1, 2))
-        # west
-        gridSizer.Add(item = self.MakeLabel(text = _("West"), parent = panel),
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL |
-                      wx.LEFT | wx.TOP | wx.BOTTOM, border = 5, pos = (2, 0))
-        gridSizer.Add(item = self.twest,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALL, border = 5,  pos = (2, 1))
-
-        gridSizer.Add(item = wx.StaticBitmap(panel, wx.ID_ANY, self.img, (-1, -1),
-                                           (self.img.GetWidth(), self.img.GetHeight())),
-                      flag = wx.ALIGN_CENTER |
-                      wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALL, border = 5, pos = (2, 2))
-
-        # east
-        gridSizer.Add(item = self.teast,
-                      flag = wx.ALIGN_CENTER_HORIZONTAL |
-                      wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALL, border = 5,  pos = (2, 3))
-        gridSizer.Add(item = self.MakeLabel(text = _("East"), parent = panel),
-                      flag = wx.ALIGN_LEFT |
-                      wx.ALIGN_CENTER_VERTICAL |
-                      wx.RIGHT | wx.TOP | wx.BOTTOM, border = 5, pos = (2, 4))
-        # south
-        gridSizer.Add(item = self.tsouth,
-                      flag = wx.ALIGN_CENTER_HORIZONTAL |
-                      wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALL, border = 5, pos = (3, 2))
-        gridSizer.Add(item = self.MakeLabel(text = _("South"), parent = panel),
-                      flag = wx.ALIGN_TOP | wx.ALIGN_CENTER_HORIZONTAL |
-                      wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5, pos = (4, 2))
-        # ns-res
-        gridSizer.Add(item = self.MakeLabel(text = _("N-S resolution"), parent = panel),
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
-                      wx.TOP | wx.LEFT | wx.RIGHT, border = 5, pos = (5, 1))
-        gridSizer.Add(item = self.tnsres,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALL, border = 5,  pos = (6, 1))
-        # ew-res
-        gridSizer.Add(item = self.MakeLabel(text = _("E-W resolution"), parent = panel),
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
-                      wx.TOP | wx.LEFT | wx.RIGHT, border = 5, pos = (5, 3))
-        gridSizer.Add(item = self.tewres,
-                      flag = wx.ALIGN_RIGHT |
-                      wx.ALIGN_CENTER_VERTICAL |
-                      wx.ALL, border = 5,  pos = (6, 3))
-        # rows/cols/cells
-        gridSizer.Add(item = self.lrows,
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
-                      wx.ALL, border = 5, pos = (7, 1))
-
-        gridSizer.Add(item = self.lcells,
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
-                      wx.ALL, border = 5, pos = (7, 2))
-
-        gridSizer.Add(item = self.lcols,
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER |
-                      wx.ALL, border = 5, pos = (7, 3))
-
-        # 3D
-        settings3DSizer.Add(item = self.settings3D,
-                            flag = wx.ALL,
-                            border = 5)
-
-        # buttons
-        buttonSizer.Add(item = self.bcancel, proportion = 1,
-                        flag = wx.ALIGN_RIGHT |
-                        wx.ALIGN_CENTER_VERTICAL |
-                        wx.ALL, border = 10)
-        buttonSizer.Add(item = self.bset, proportion = 1,
-                        flag = wx.ALIGN_CENTER |
-                        wx.ALIGN_CENTER_VERTICAL |
-                        wx.ALL, border = 10)
-
-        frameSizer.Add(item = gridSizer, proportion = 1,
-                       flag = wx.ALL | wx.ALIGN_CENTER, border = 5)
-        frameSizer.Add(item = settings3DSizer, proportion = 0,
-                       flag = wx.ALL | wx.ALIGN_CENTER, border = 5)
-        frameSizer.Add(item = buttonSizer, proportion = 0,
-                       flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
-
-        self.SetAutoLayout(True)
-        panel.SetSizer(frameSizer)
-        frameSizer.Fit(panel)
-        self.Layout()
-
-    def OnValue(self, event):
-        """!Set given value"""
-        try:
-            if event.GetId() == self.tnorth.GetId():
-                self.north = float(event.GetString())
-            elif event.GetId() == self.tsouth.GetId():
-                self.south = float(event.GetString())
-            elif event.GetId() == self.teast.GetId():
-                self.east = float(event.GetString())
-            elif event.GetId() == self.twest.GetId():
-                self.west = float(event.GetString())
-            elif event.GetId() == self.tnsres.GetId():
-                self.nsres = float(event.GetString())
-            elif event.GetId() == self.tewres.GetId():
-                self.ewres = float(event.GetString())
-            elif event.GetId() == self.ttop.GetId():
-                self.top = float(event.GetString())
-            elif event.GetId() == self.tbottom.GetId():
-                self.bottom = float(event.GetString())
-            #             elif event.GetId() == self.tnsres3.GetId():
-            #                 self.nsres3 = float(event.GetString())
-            #             elif event.GetId() == self.tewres3.GetId():
-            #                 self.ewres3 = float(event.GetString())
-            elif event.GetId() == self.ttbres.GetId():
-                self.tbres = float(event.GetString())
-
-            self.__UpdateInfo()
-
-        except ValueError, e:
-            if len(event.GetString()) > 0 and event.GetString() != '-':
-                dlg = wx.MessageBox(parent = self,
-                                    message = _("Invalid value: %s") % e,
-                                    caption = _("Error"),
-                                    style = wx.OK | wx.ICON_ERROR)
-                # reset values
-                self.tnorth.SetValue(str(self.north))
-                self.tsouth.SetValue(str(self.south))
-                self.teast.SetValue(str(self.east))
-                self.twest.SetValue(str(self.west))
-                self.tnsres.SetValue(str(self.nsres))
-                self.tewres.SetValue(str(self.ewres))
-                self.ttop.SetValue(str(self.top))
-                self.tbottom.SetValue(str(self.bottom))
-                self.ttbres.SetValue(str(self.tbres))
-                # self.tnsres3.SetValue(str(self.nsres3))
-                # self.tewres3.SetValue(str(self.ewres3))
-
-        event.Skip()
-
-    def __UpdateInfo(self):
-        """!Update number of rows/cols/cells"""
-        self.rows = int((self.north - self.south) / self.nsres)
-        self.cols = int((self.east - self.west) / self.ewres)
-        self.cells = self.rows * self.cols
-
-        self.depth = int((self.top - self.bottom) / self.tbres)
-        self.cells3 = self.rows * self.cols * self.depth
-
-        # 2D
-        self.lrows.SetLabel(_("Rows: %d") % self.rows)
-        self.lcols.SetLabel(_("Cols: %d") % self.cols)
-        self.lcells.SetLabel(_("Cells: %d") % self.cells)
-        # 3D
-        self.ldepth.SetLabel(_("Depth: %d" % self.depth))
-        self.lcells3.SetLabel(_("3D Cells: %d" % self.cells3))
-
-    def OnSetButton(self, event = None):
-        """!Set default region"""
-        ret = gcmd.RunCommand('g.region',
-                              flags = 'sgpa',
-                              n = self.north,
-                              s = self.south,
-                              e = self.east,
-                              w = self.west,
-                              nsres = self.nsres,
-                              ewres = self.ewres,
-                              t = self.top,
-                              b = self.bottom,
-                              tbres = self.tbres)
-        if ret == 0:
-            self.Destroy()
-
-    def OnCancel(self, event):
-        self.Destroy()
-        
-class TransList(wx.VListBox):
-    """!Creates a multiline listbox for selecting datum transforms"""
-        
-    def OnDrawItem(self, dc, rect, n):
-        if self.GetSelection() == n:
-            c = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT)
-        else:
-            c = self.GetForegroundColour()
-        dc.SetFont(self.GetFont())
-        dc.SetTextForeground(c)
-        dc.DrawLabel(self._getItemText(n), rect,
-                     wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
-
-    def OnMeasureItem(self, n):
-        height = 0
-        if self._getItemText(n) == None:
-            return
-        for line in self._getItemText(n).splitlines():
-            w, h = self.GetTextExtent(line)
-            height += h
-        return height + 5
-
-    def _getItemText(self, item):
-        global transformlist
-        transitem = transformlist[item]
-        if transitem.strip() !='':
-            return transitem
-
-
-class SelectTransformDialog(wx.Dialog):
-    """!Dialog for selecting datum transformations"""
-    def __init__(self, parent, transforms, title = _("Select datum transformation"),
-                 pos = wx.DefaultPosition, size = wx.DefaultSize, 
-                 style = wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER):
-
-        wx.Dialog.__init__(self, parent, wx.ID_ANY, title, pos, size, style)
-
-        global transformlist
-        self.CentreOnParent()
-        
-        # default transform number
-        self.transnum = 0
-        
-        panel = scrolled.ScrolledPanel(self, wx.ID_ANY)
-        sizer = wx.BoxSizer(wx.VERTICAL)
-
-        #
-        # set panel sizer
-        #
-        panel.SetSizer(sizer)
-        panel.SetupScrolling()
-
-        #
-        # dialog body
-        #
-        bodyBox = wx.StaticBox(parent = panel, id = wx.ID_ANY,
-                               label = " %s " % _("Select from list of datum transformations"))
-        bodySizer = wx.StaticBoxSizer(bodyBox)       
-        
-        # add no transform option
-        transforms = '---\n\n0\nDo not apply any datum transformations\n\n' + transforms
-        
-        transformlist = transforms.split('---')
-        tlistlen = len(transformlist)
-        
-        # calculate size for transform list
-        height = 0
-        width = 0
-        for line in transforms.splitlines():
-            w, h = self.GetTextExtent(line)
-            height += h
-            width = max(width, w)
-            
-        height = height + 5
-        if height > 400: height = 400
-        width = width + 5
-        if width > 400: width = 400
-
-        #
-        # VListBox for displaying and selecting transformations
-        #
-        self.translist = TransList(panel, id = -1, size = (width, height), style = wx.SUNKEN_BORDER)
-        self.translist.SetItemCount(tlistlen)
-        self.translist.SetSelection(2)
-        self.translist.SetFocus()
-        
-        self.Bind(wx.EVT_LISTBOX, self.ClickTrans, self.translist)
-
-        bodySizer.Add(item = self.translist, proportion = 1, flag = wx.ALIGN_CENTER|wx.ALL|wx.EXPAND)
-
-        #
-        # buttons
-        #
-        btnsizer = wx.StdDialogButtonSizer()
-
-        btn = wx.Button(parent = panel, id = wx.ID_OK)
-        btn.SetDefault()
-        btnsizer.AddButton(btn)
-
-        btn = wx.Button(parent = panel, id = wx.ID_CANCEL)
-        btnsizer.AddButton(btn)
-        btnsizer.Realize()
-
-        sizer.Add(item = bodySizer, proportion = 1,
-                  flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+        return proj4string
 
-        sizer.Add(item = btnsizer, proportion = 0,
-                  flag =  wx.ALL | wx.ALIGN_RIGHT, border = 5)
+    def OnHelp(self, event):
+        """'Help' button clicked"""
+        # help text in lib/init/helptext.html
+        import webbrowser
+        filePath = os.path.join(os.getenv('GISBASE'), "docs", "html", "helptext.html")
+        webbrowser.open(filePath)
 
-        sizer.Fit(panel)
 
-        self.SetSize(self.GetBestSize())
-        self.Layout()
-        
-    def ClickTrans(self, event):
-        """!Get the number of the datum transform to use in g.proj"""
-        self.transnum = event.GetSelection()
-        self.transnum = self.transnum - 1
-    
-    def GetTransform(self):
-        """!Get the number of the datum transform to use in g.proj"""
-        self.transnum = self.translist.GetSelection()
-        self.transnum = self.transnum - 1
-        return self.transnum
-
-if __name__ == "__main__":
-    import gettext
-    gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
-    app = wx.PySimpleApp()
-    gWizard = RegionDef(None)
-    gWizzard.Show()
-    app.MainLoop()
+class WizardWithHelpButton(wiz.Wizard):
+    def __init__(self, parent, id, title, bitmap):
+        pre = wiz.PreWizard()
+        pre.SetExtraStyle(wx.wizard.WIZARD_EX_HELPBUTTON)
+        pre.Create(parent = parent, id = id, title = title, bitmap = bitmap)
+        self.PostCreate(pre)
diff --git a/gui/wxpython/mapdisp/frame.py b/gui/wxpython/mapdisp/frame.py
new file mode 100644
index 0000000..25761f9
--- /dev/null
+++ b/gui/wxpython/mapdisp/frame.py
@@ -0,0 +1,1327 @@
+"""!
+ at package mapdisp.frame
+
+ at brief Map display with toolbar for various display management
+functions, and additional toolbars (vector digitizer, 3d view).
+
+Can be used either from Layer Manager or as d.mon backend.
+
+Classes:
+ - mapdisp::MapFrame
+
+(C) 2006-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton
+ at author Jachym Cepicky
+ at author Martin Landa <landa.martin gmail.com>
+ at author Vaclav Petras <wenzeslaus gmail.com> (MapFrameBase)
+ at author Anna Kratochvilova <kratochanna gmail.com> (MapFrameBase)
+"""
+
+import os
+import sys
+import math
+import copy
+
+from core import globalvar
+import wx
+import wx.aui
+
+sys.path.append(os.path.join(globalvar.ETCWXDIR, "icons"))
+sys.path.append(os.path.join(globalvar.ETCDIR,   "python"))
+
+from core               import globalvar
+from core.render        import EVT_UPDATE_PRGBAR
+from vdigit.toolbars    import VDigitToolbar
+from mapdisp.toolbars   import MapToolbar, NvizIcons
+from mapdisp.gprint     import PrintOptions
+from core.gcmd          import GError, GMessage, RunCommand
+from dbmgr.dialogs      import DisplayAttributesDialog
+from core.utils         import ListOfCatsToRange, GetLayerNameFromCmd, GetAllVectorLayers
+from gui_core.dialogs   import GetImageHandlers, ImageSizeDialog, DecorationDialog, TextLayerDialog, \
+                               DECOR_DIALOG_LEGEND, DECOR_DIALOG_BARSCALE
+from core.debug         import Debug
+from core.settings      import UserSettings
+from gui_core.mapdisp   import MapFrameBase
+from mapdisp.mapwindow  import BufferedWindow
+from mapdisp.overlays   import LegendController, BarscaleController
+from modules.histogram  import HistogramFrame
+from wxplot.profile     import ProfileFrame
+
+from mapdisp import statusbar as sb
+
+import grass.script as grass
+
+haveCtypes = False
+
+class MapFrame(MapFrameBase):
+    """!Main frame for map display window. Drawing takes place in
+    child double buffered drawing window.
+    """
+    def __init__(self, parent = None, title = _("GRASS GIS - Map display"),
+                 toolbars = ["map"], tree = None, notebook = None, lmgr = None,
+                 page = None, Map = None, auimgr = None, name = 'MapWindow', **kwargs):
+        """!Main map display window with toolbars, statusbar and
+        BufferedWindow (map canvas)
+        
+        @param toolbars array of activated toolbars, e.g. ['map', 'digit']
+        @param tree reference to layer tree
+        @param notebook control book ID in Layer Manager
+        @param lmgr Layer Manager
+        @param page notebook page with layer tree
+        @param Map instance of render.Map
+        @param auimgs AUI manager
+        @param name frame name
+        @param kwargs wx.Frame attributes
+        """
+        MapFrameBase.__init__(self, parent = parent, title = title, toolbars = toolbars,
+                              Map = Map, auimgr = auimgr, name = name, **kwargs)
+        
+        self._layerManager = lmgr   # Layer Manager object
+        self.tree       = tree      # Layer Manager layer tree object
+        self.page       = page      # Notebook page holding the layer tree
+        self.layerbook  = notebook  # Layer Manager layer tree notebook
+        #
+        # Add toolbars
+        #
+        for toolb in toolbars:
+            self.AddToolbar(toolb)
+        
+        #
+        # Add statusbar
+        #
+        
+        # items for choice
+        self.statusbarItems = [sb.SbCoordinates,
+                               sb.SbRegionExtent,
+                               sb.SbCompRegionExtent,
+                               sb.SbShowRegion,
+                               sb.SbAlignExtent,
+                               sb.SbResolution,
+                               sb.SbDisplayGeometry,
+                               sb.SbMapScale,
+                               sb.SbGoTo,
+                               sb.SbProjection]
+                            
+        self.statusbarItemsHiddenInNviz = (sb.SbAlignExtent,
+                                           sb.SbDisplayGeometry,
+                                           sb.SbShowRegion,
+                                           sb.SbResolution,
+                                           sb.SbMapScale)
+        
+        # create statusbar and its manager
+        statusbar = self.CreateStatusBar(number = 4, style = 0)
+        statusbar.SetStatusWidths([-5, -2, -1, -1])
+        self.statusbarManager = sb.SbManager(mapframe = self, statusbar = statusbar)
+        
+        # fill statusbar manager
+        self.statusbarManager.AddStatusbarItemsByClass(self.statusbarItems, mapframe = self, statusbar = statusbar)
+        self.statusbarManager.AddStatusbarItem(sb.SbMask(self, statusbar = statusbar, position = 2))
+        self.statusbarManager.AddStatusbarItem(sb.SbRender(self, statusbar = statusbar, position = 3))
+        
+        self.statusbarManager.Update()
+
+        # init decoration objects
+        self.decorations = {}
+        self.legend = LegendController(self.Map)
+        self.barscale = BarscaleController(self.Map)
+        self.decorations[self.legend.id] = self.legend
+        self.decorations[self.barscale.id] = self.barscale
+
+        #
+        # Init map display (buffered DC & set default cursor)
+        #
+        self.MapWindow2D = BufferedWindow(self, id = wx.ID_ANY, overlays = self.decorations,
+                                          Map = self.Map, tree = self.tree, lmgr = self._layerManager)
+        # default is 2D display mode
+        self.MapWindow = self.MapWindow2D
+        self.MapWindow.SetCursor(self.cursors["default"])
+        # used by vector digitizer
+        self.MapWindowVDigit = None
+        # used by Nviz (3D display mode)
+        self.MapWindow3D = None 
+
+        #
+        # initialize region values
+        #
+        self._initMap(map = self.Map) 
+
+        #
+        # Bind various events
+        #
+        self.Bind(wx.EVT_ACTIVATE, self.OnFocus)
+        self.Bind(wx.EVT_CLOSE,    self.OnCloseWindow)
+        self.Bind(EVT_UPDATE_PRGBAR, self.OnUpdateProgress)
+        
+        #
+        # Update fancy gui style
+        #
+        self._mgr.AddPane(self.MapWindow, wx.aui.AuiPaneInfo().CentrePane().
+                          Dockable(False).BestSize((-1,-1)).Name('2d').
+                          CloseButton(False).DestroyOnClose(True).
+                          Layer(0))
+        self._mgr.Update()
+
+        #
+        # Init print module and classes
+        #
+        self.printopt = PrintOptions(self, self.MapWindow)
+        
+        #
+        # Init zoom history
+        #
+        self.MapWindow.ZoomHistory(self.Map.region['n'],
+                                   self.Map.region['s'],
+                                   self.Map.region['e'],
+                                   self.Map.region['w'])
+
+        #
+        # Re-use dialogs
+        #
+        self.dialogs = {}
+        self.dialogs['attributes'] = None
+        self.dialogs['category'] = None
+        self.dialogs['barscale'] = None
+        self.dialogs['legend'] = None
+
+        self.decorationDialog = None # decoration/overlays
+        
+    def GetMapWindow(self):
+        return self.MapWindow
+    
+    def _addToolbarVDigit(self):
+        """!Add vector digitizer toolbar
+        """
+        from vdigit.main import haveVDigit
+        
+        if not haveVDigit:
+            from vdigit import errorMsg
+            msg = _("Unable to start wxGUI vector digitizer.\nDo you want to start "
+                    "TCL/TK digitizer (v.digit) instead?\n\n"
+                    "Details: %s" % errorMsg)
+            
+            self.toolbars['map'].combo.SetValue(_("2D view"))
+            dlg = wx.MessageDialog(parent = self,
+                                   message = msg,
+                                   caption=_("Vector digitizer failed"),
+                                   style = wx.YES_NO | wx.CENTRE)
+            if dlg.ShowModal() == wx.ID_YES:
+                mapName = self.tree.GetPyData(self.tree.layer_selected)[0]['maplayer'].GetName()
+                self._layerManager.goutput.RunCmd(['v.digit', 'map=%s' % mapName],
+                                                  switchPage = False)
+            dlg.Destroy()
+            
+            self.toolbars['map'].combo.SetValue(_("2D view"))
+            return
+        
+        if self._layerManager:
+            log = self._layerManager.goutput
+        else:
+            log = None
+        
+        if not self.MapWindowVDigit:
+            from vdigit.mapwindow import VDigitWindow
+            self.MapWindowVDigit = VDigitWindow(self, id = wx.ID_ANY,
+                                                Map = self.Map, tree = self.tree,
+                                                lmgr = self._layerManager)
+            self.MapWindowVDigit.Show()
+            self._mgr.AddPane(self.MapWindowVDigit, wx.aui.AuiPaneInfo().CentrePane().
+                          Dockable(False).BestSize((-1,-1)).Name('vdigit').
+                          CloseButton(False).DestroyOnClose(True).
+                          Layer(0))
+        
+        self.MapWindow = self.MapWindowVDigit
+        
+        if self._mgr.GetPane('2d').IsShown():
+            self._mgr.GetPane('2d').Hide()
+        elif self._mgr.GetPane('3d').IsShown():
+            self._mgr.GetPane('3d').Hide()
+        self._mgr.GetPane('vdigit').Show()
+        self.toolbars['vdigit'] = VDigitToolbar(parent = self, mapcontent = self.Map,
+                                                layerTree = self.tree,
+                                                log = log)
+        self.MapWindowVDigit.SetToolbar(self.toolbars['vdigit'])
+        
+        self._mgr.AddPane(self.toolbars['vdigit'],
+                          wx.aui.AuiPaneInfo().
+                          Name("vdigittoolbar").Caption(_("Vector Digitizer Toolbar")).
+                          ToolbarPane().Top().Row(1).
+                          LeftDockable(False).RightDockable(False).
+                          BottomDockable(False).TopDockable(True).
+                          CloseButton(False).Layer(2).
+                          BestSize((self.toolbars['vdigit'].GetBestSize())))
+        # change mouse to draw digitized line
+        self.MapWindow.mouse['box'] = "point"
+        self.MapWindow.zoomtype     = 0
+        self.MapWindow.pen          = wx.Pen(colour = 'red',   width = 2, style = wx.SOLID)
+        self.MapWindow.polypen      = wx.Pen(colour = 'green', width = 2, style = wx.SOLID)
+
+    def AddNviz(self):
+        """!Add 3D view mode window
+        """
+        from nviz.main import haveNviz, GLWindow
+        
+        # check for GLCanvas and OpenGL
+        if not haveNviz:
+            self.toolbars['map'].combo.SetValue(_("2D view"))
+            GError(parent = self,
+                   message = _("Unable to switch to 3D display mode.\nThe Nviz python extension "
+                               "was not found or loaded properly.\n"
+                               "Switching back to 2D display mode.\n\nDetails: %s" % nviz.errorMsg))
+            return
+        
+        # disable 3D mode for other displays
+        for page in range(0, self._layerManager.gm_cb.GetPageCount()):
+            if self._layerManager.gm_cb.GetPage(page) != self._layerManager.curr_page:
+                if '3D' in self._layerManager.gm_cb.GetPage(page).maptree.mapdisplay.toolbars['map'].combo.GetString(1):
+                    self._layerManager.gm_cb.GetPage(page).maptree.mapdisplay.toolbars['map'].combo.Delete(1)
+        self.toolbars['map'].Enable2D(False)
+        # add rotate tool to map toolbar
+        self.toolbars['map'].InsertTool((('rotate', NvizIcons['rotate'],
+                                          self.OnRotate, wx.ITEM_CHECK, 7),)) # 7 is position
+        self.toolbars['map'].InsertTool((('flyThrough', NvizIcons['flyThrough'],
+                                          self.OnFlyThrough, wx.ITEM_CHECK, 8),)) 
+        self.toolbars['map'].ChangeToolsDesc(mode2d = False)
+        # update status bar
+        
+        self.statusbarManager.HideStatusbarChoiceItemsByClass(self.statusbarItemsHiddenInNviz)
+        self.statusbarManager.SetMode(0)
+        
+        # erase map window
+        self.MapWindow.EraseMap()
+        
+        self._layerManager.goutput.WriteCmdLog(_("Starting 3D view mode..."),
+                                               switchPage = False)
+        self.SetStatusText(_("Please wait, loading data..."), 0)
+        
+        # create GL window
+        if not self.MapWindow3D:
+            self.MapWindow3D = GLWindow(self, id = wx.ID_ANY,
+                                        Map = self.Map, tree = self.tree, lmgr = self._layerManager)
+            self.MapWindow = self.MapWindow3D
+            self.MapWindow.SetCursor(self.cursors["default"])
+            
+            # add Nviz notebookpage
+            self._layerManager.AddNvizTools()
+            
+            # switch from MapWindow to MapWindowGL
+            self._mgr.GetPane('2d').Hide()
+            self._mgr.AddPane(self.MapWindow3D, wx.aui.AuiPaneInfo().CentrePane().
+                              Dockable(False).BestSize((-1,-1)).Name('3d').
+                              CloseButton(False).DestroyOnClose(True).
+                              Layer(0))
+            
+            self.MapWindow3D.Show()
+            self.MapWindow3D.ResetViewHistory()            
+            self.MapWindow3D.UpdateView(None)
+        else:
+            self.MapWindow = self.MapWindow3D
+            os.environ['GRASS_REGION'] = self.Map.SetRegion(windres = True)
+            self.MapWindow3D.GetDisplay().Init()
+            del os.environ['GRASS_REGION']
+            
+            # switch from MapWindow to MapWindowGL
+            self._mgr.GetPane('2d').Hide()
+            self._mgr.GetPane('3d').Show()
+            
+            # add Nviz notebookpage
+            self._layerManager.AddNvizTools()
+            self.MapWindow3D.ResetViewHistory()
+            for page in ('view', 'light', 'fringe', 'constant', 'cplane', 'animation'):
+                self._layerManager.nviz.UpdatePage(page)
+                
+        self.MapWindow3D.overlays = self.MapWindow2D.overlays
+        self.MapWindow3D.textdict = self.MapWindow2D.textdict
+        # update overlays needs to be called after because getClientSize
+        # is called during update and it must give reasonable values
+        wx.CallAfter(self.MapWindow3D.UpdateOverlays)
+        
+        self.SetStatusText("", 0)
+        self._mgr.Update()
+    
+    def RemoveNviz(self):
+        """!Restore 2D view"""
+        self.toolbars['map'].RemoveTool(self.toolbars['map'].rotate)
+        self.toolbars['map'].RemoveTool(self.toolbars['map'].flyThrough)
+        # update status bar
+        self.statusbarManager.ShowStatusbarChoiceItemsByClass(self.statusbarItemsHiddenInNviz)
+        self.statusbarManager.SetMode(UserSettings.Get(group = 'display',
+                                                       key = 'statusbarMode',
+                                                       subkey = 'selection'))
+        self.SetStatusText(_("Please wait, unloading data..."), 0)
+        self._layerManager.goutput.WriteCmdLog(_("Switching back to 2D view mode..."),
+                                               switchPage = False)
+        self.MapWindow3D.OnClose(event = None)
+        # switch from MapWindowGL to MapWindow
+        self._mgr.GetPane('2d').Show()
+        self._mgr.GetPane('3d').Hide()
+        
+        self.MapWindow = self.MapWindow2D
+        # remove nviz notebook page
+        self._layerManager.RemoveNvizTools()
+        
+        self.MapWindow2D.overlays = self.MapWindow3D.overlays
+        self.MapWindow2D.textdict = self.MapWindow3D.textdict
+        self.MapWindow.UpdateMap()
+        self._mgr.Update()
+        
+    def AddToolbar(self, name):
+        """!Add defined toolbar to the window
+        
+        Currently known toolbars are:
+         - 'map'     - basic map toolbar
+         - 'vdigit'  - vector digitizer
+         - 'gcpdisp' - GCP Manager Display
+        """
+        # default toolbar
+        if name == "map":
+            self.toolbars['map'] = MapToolbar(self, self.Map)
+            
+            self._mgr.AddPane(self.toolbars['map'],
+                              wx.aui.AuiPaneInfo().
+                              Name("maptoolbar").Caption(_("Map Toolbar")).
+                              ToolbarPane().Top().Name('mapToolbar').
+                              LeftDockable(False).RightDockable(False).
+                              BottomDockable(False).TopDockable(True).
+                              CloseButton(False).Layer(2).
+                              BestSize((self.toolbars['map'].GetBestSize())))
+            
+        # vector digitizer
+        elif name == "vdigit":
+            self._addToolbarVDigit()
+        
+        self._mgr.Update()
+        
+    def RemoveToolbar (self, name):
+        """!Removes defined toolbar from the window
+
+        @todo Only hide, activate by calling AddToolbar()
+        """
+        # cannot hide main toolbar
+        if name == "map":
+            return
+        
+        self._mgr.DetachPane(self.toolbars[name])
+        self.toolbars[name].Destroy()
+        self.toolbars.pop(name)
+        
+        if name == 'vdigit':
+            self._mgr.GetPane('vdigit').Hide()
+            self._mgr.GetPane('2d').Show()
+            self.MapWindow = self.MapWindow2D
+            
+        self.toolbars['map'].combo.SetValue(_("2D view"))
+        self.toolbars['map'].Enable2D(True)
+        
+        self._mgr.Update()
+    
+    def IsPaneShown(self, name):
+        """!Check if pane (toolbar, mapWindow ...) of given name is currently shown"""
+        if self._mgr.GetPane(name).IsOk():
+            return self._mgr.GetPane(name).IsShown()
+        return False
+    
+    def OnUpdateProgress(self, event):
+        """!Update progress bar info
+        """
+        self.GetProgressBar().SetValue(event.value)
+        
+        event.Skip()
+        
+    def OnFocus(self, event):
+        """!Change choicebook page to match display.
+        """
+        # change bookcontrol page to page associated with display
+        if self.page:
+            pgnum = self.layerbook.GetPageIndex(self.page)
+            if pgnum > -1:
+                self.layerbook.SetSelection(pgnum)
+                self._layerManager.curr_page = self.layerbook.GetCurrentPage()
+        
+        event.Skip()
+        
+    def RemoveQueryLayer(self):
+        """!Removes temporary map layers (queries)"""
+        qlayer = self.GetMap().GetListOfLayers(l_name = globalvar.QUERYLAYER)
+        for layer in qlayer:
+            self.GetMap().DeleteLayer(layer)
+
+    def OnRender(self, event):
+        """!Re-render map composition (each map layer)
+        """
+        self.RemoveQueryLayer()
+        
+        # delete tmp lines
+        if self.MapWindow.mouse["use"] in ("measure",
+                                           "profile"):
+            self.MapWindow.polycoords = []
+            self.MapWindow.ClearLines()
+        
+        # deselect features in vdigit
+        if self.GetToolbar('vdigit'):
+            if self.MapWindow.digit:
+                self.MapWindow.digit.GetDisplay().SetSelected([])
+            self.MapWindow.UpdateMap(render = True, renderVector = True)
+        else:
+            self.MapWindow.UpdateMap(render = True)
+        
+        # update statusbar
+        self.StatusbarUpdate()
+
+    def OnPointer(self, event):
+        """!Pointer button clicked
+        """
+        if self.GetMapToolbar():
+            if event:
+                self.toolbars['map'].OnTool(event)
+            self.toolbars['map'].action['desc'] = ''
+        
+        self.MapWindow.mouse['use'] = "pointer"
+        self.MapWindow.mouse['box'] = "point"
+
+        # change the cursor
+        if self.GetToolbar('vdigit'):
+            # digitization tool activated
+            self.MapWindow.SetCursor(self.cursors["cross"])
+
+            # reset mouse['box'] if needed
+            if self.toolbars['vdigit'].GetAction() in ['addLine']:
+                if self.toolbars['vdigit'].GetAction('type') in ['point', 'centroid']:
+                    self.MapWindow.mouse['box'] = 'point'
+                else: # line, boundary
+                    self.MapWindow.mouse['box'] = 'line'
+            elif self.toolbars['vdigit'].GetAction() in ['addVertex', 'removeVertex', 'splitLine',
+                                                         'editLine', 'displayCats', 'queryMap',
+                                                         'copyCats']:
+                self.MapWindow.mouse['box'] = 'point'
+            else: # moveLine, deleteLine
+                self.MapWindow.mouse['box'] = 'box'
+        
+        else:
+            self.MapWindow.SetCursor(self.cursors["default"])
+            
+    def OnRotate(self, event):
+        """!Rotate 3D view
+        """
+        if self.GetMapToolbar():
+            self.toolbars['map'].OnTool(event)
+            self.toolbars['map'].action['desc'] = ''
+        
+        self.MapWindow.mouse['use'] = "rotate"
+        
+        # change the cursor
+        self.MapWindow.SetCursor(self.cursors["hand"])
+        
+    def OnFlyThrough(self, event):
+        """!Fly-through mode
+        """
+        if self.toolbars['map']:
+            self.toolbars['map'].OnTool(event)
+            self.toolbars['map'].action['desc'] = ''
+        
+        self.MapWindow.mouse['use'] = "fly"
+        
+        # change the cursor
+        self.MapWindow.SetCursor(self.cursors["hand"])
+        self.MapWindow.SetFocus()
+        
+    def OnZoomRegion(self, event):
+        """
+        Zoom to region
+        """
+        self.Map.getRegion()
+        self.Map.getResolution()
+        self.UpdateMap()
+        # event.Skip()
+
+    def OnAlignRegion(self, event):
+        """
+        Align region
+        """
+        if not self.Map.alignRegion:
+            self.Map.alignRegion = True
+        else:
+            self.Map.alignRegion = False
+        # event.Skip()        
+        
+    def SaveToFile(self, event):
+        """!Save map to image
+        """
+        if self.IsPaneShown('3d'):
+            filetype = "TIF file (*.tif)|*.tif|PPM file (*.ppm)|*.ppm"
+            ltype = [{ 'ext' : 'tif', 'type' : 'tif' },
+                     { 'ext' : 'ppm', 'type' : 'ppm' }]
+        else:
+            img = self.MapWindow.img
+            if not img:
+                GMessage(parent = self,
+                         message = _("Nothing to render (empty map). Operation canceled."))
+                return
+            filetype, ltype = GetImageHandlers(img)
+        
+        # get size
+        dlg = ImageSizeDialog(self)
+        dlg.CentreOnParent()
+        if dlg.ShowModal() != wx.ID_OK:
+            dlg.Destroy()
+            return
+        width, height = dlg.GetValues()
+        dlg.Destroy()
+        
+        # get filename
+        dlg = wx.FileDialog(parent = self,
+                            message = _("Choose a file name to save the image "
+                                        "(no need to add extension)"),
+                            wildcard = filetype,
+                            style = wx.SAVE | wx.FD_OVERWRITE_PROMPT)
+        
+        if dlg.ShowModal() == wx.ID_OK:
+            path = dlg.GetPath()
+            if not path:
+                dlg.Destroy()
+                return
+            
+            base, ext = os.path.splitext(path)
+            fileType = ltype[dlg.GetFilterIndex()]['type']
+            extType  = ltype[dlg.GetFilterIndex()]['ext']
+            if ext != extType:
+                path = base + '.' + extType
+            
+            self.MapWindow.SaveToFile(path, fileType,
+                                      width, height)
+            
+        dlg.Destroy()
+
+    def PrintMenu(self, event):
+        """
+        Print options and output menu for map display
+        """
+        point = wx.GetMousePosition()
+        printmenu = wx.Menu()
+        # Add items to the menu
+        setup = wx.MenuItem(printmenu, wx.ID_ANY, _('Page setup'))
+        printmenu.AppendItem(setup)
+        self.Bind(wx.EVT_MENU, self.printopt.OnPageSetup, setup)
+
+        preview = wx.MenuItem(printmenu, wx.ID_ANY, _('Print preview'))
+        printmenu.AppendItem(preview)
+        self.Bind(wx.EVT_MENU, self.printopt.OnPrintPreview, preview)
+
+        doprint = wx.MenuItem(printmenu, wx.ID_ANY, _('Print display'))
+        printmenu.AppendItem(doprint)
+        self.Bind(wx.EVT_MENU, self.printopt.OnDoPrint, doprint)
+
+        # Popup the menu.  If an item is selected then its handler
+        # will be called before PopupMenu returns.
+        self.PopupMenu(printmenu)
+        printmenu.Destroy()
+
+    def OnCloseWindow(self, event):
+        """!Window closed.
+        Also close associated layer tree page
+        """
+        pgnum = None
+        self.Map.Clean()
+        
+        # close edited map and 3D tools properly
+        if self.GetToolbar('vdigit'):
+            maplayer = self.toolbars['vdigit'].GetLayer()
+            if maplayer:
+                self.toolbars['vdigit'].OnExit()
+        if self.IsPaneShown('3d'):
+            self.RemoveNviz()
+        
+        if not self._layerManager:
+            self.Destroy()
+        elif self.page:
+            pgnum = self.layerbook.GetPageIndex(self.page)
+            if pgnum > -1:
+                self.layerbook.DeletePage(pgnum)
+
+    def Query(self, x, y, layers):
+        """!Query selected layers. 
+
+        Calls QueryMap in case of raster or more vectors,
+        or QueryVector in case of one vector with db connection.
+
+        @param x,y coordinates
+        @param layers selected tree item layers
+        """
+        num = 0
+        filteredLayers = []
+        for layer in layers:
+            ltype = self.tree.GetPyData(layer)[0]['maplayer'].GetType()
+            if ltype in ('raster', 'rgb', 'his',
+                         'vector', 'thememap', 'themechart'):
+                filteredLayers.append(layer)
+
+        if not filteredLayers:
+            GMessage(parent = self,
+                     message = _('No raster or vector map layer selected for querying.'))
+            return
+            
+        layers = filteredLayers
+        # set query snap distance for v.what at map unit equivalent of 10 pixels
+        qdist = 10.0 * ((self.Map.region['e'] - self.Map.region['w']) / self.Map.width)
+        east, north = self.MapWindow.Pixel2Cell((x, y))
+
+        posWindow = self.ClientToScreen((x + self.MapWindow.dialogOffset,
+                                         y + self.MapWindow.dialogOffset))
+
+        isRaster = False
+        nVectors = 0
+        isDbConnection = False
+        allLayersConnected = None
+        for l in layers:
+            maplayer = self.tree.GetPyData(l)[0]['maplayer']
+            if maplayer.GetType() == 'raster':
+                isRaster = True
+                break
+            if maplayer.GetType() == 'vector':
+                nVectors += 1
+                isDbConnection = grass.vector_db(maplayer.GetName())
+                if isDbConnection:
+                    # check if all layers are connected to db
+                    # otherwise show output in command console instead of poping up attribute dialog
+                    # which is missing features from layers not connected to db
+                    allLayersConnected = True
+                    vLayersDb = sorted(isDbConnection.keys())
+                    vLayersAll = sorted(map(int, GetAllVectorLayers(maplayer.GetName())))
+                    if vLayersAll != vLayersDb:
+                        allLayersConnected = False
+
+        if not self.IsPaneShown('3d'):
+            if isRaster or nVectors > 1 or not allLayersConnected:
+                self.QueryMap(east, north, qdist, layers)
+            else:
+                self.QueryVector(east, north, qdist, posWindow, layers[0])
+        else:
+            if isRaster:
+                self.MapWindow.QuerySurface(x, y)
+            if nVectors > 1 or not isDbConnection:
+                self.QueryMap(east, north, qdist, layers)
+            elif nVectors == 1:
+                self.QueryVector(east, north, qdist, posWindow, layers[0])
+
+    def QueryMap(self, east, north, qdist, layers):
+        """!Query raster or vector map layers by r/v.what
+        
+        @param east,north coordinates
+        @param qdist query distance
+        @param layers selected tree items
+        """
+        rast = list()
+        vect = list()
+        rcmd = ['r.what', '--v']
+        vcmd = ['v.what', '--v']
+        
+        for layer in layers:
+            ltype = self.tree.GetPyData(layer)[0]['maplayer'].GetType()
+            dcmd = self.tree.GetPyData(layer)[0]['cmd']
+            name, found = GetLayerNameFromCmd(dcmd)
+            
+            if not found:
+                continue
+            if ltype == 'raster':
+                rast.append(name)
+            elif ltype in ('rgb', 'his'):
+                for iname in name.split('\n'):
+                    rast.append(iname)
+            elif ltype in ('vector', 'thememap', 'themechart'):
+                vect.append(name)
+
+        # use display region settings instead of computation region settings
+        self.tmpreg = os.getenv("GRASS_REGION")
+        os.environ["GRASS_REGION"] = self.Map.SetRegion(windres = False)
+        
+        # build query commands for any selected rasters and vectors
+        if rast:
+            rcmd.append('-f')
+            rcmd.append('-n')
+            rcmd.append('input=%s' % ','.join(rast))
+            rcmd.append('east_north=%f,%f' % (float(east), float(north)))
+        
+        if vect:
+            # check for vector maps open to be edited
+            digitToolbar = self.GetToolbar('vdigit')
+            if digitToolbar:
+                lmap = digitToolbar.GetLayer().GetName()
+                for name in vect:
+                    if lmap == name:
+                        self._layerManager.goutput.WriteWarning(_("Vector map <%s> "
+                                                                  "opened for editing - skipped.") % map)
+                        vect.remove(name)
+            
+            if len(vect) < 1:
+                self._layerManager.goutput.WriteCmdLog(_("Nothing to query."))
+                return
+            
+            vcmd.append('-a')
+            vcmd.append('map=%s' % ','.join(vect))
+            vcmd.append('east_north=%f,%f' % (float(east), float(north)))
+            vcmd.append('distance=%f' % float(qdist))
+        
+        Debug.msg(1, "QueryMap(): raster=%s vector=%s" % (','.join(rast),
+                                                          ','.join(vect)))
+        # parse query command(s)
+
+        if rast and not self.IsPaneShown('3d'):
+            self._layerManager.goutput.RunCmd(rcmd,
+                                              compReg = False,
+                                              onDone  =  self._QueryMapDone)
+        if vect:
+            self._layerManager.goutput.RunCmd(vcmd,
+                                              onDone = self._QueryMapDone)
+        
+    def _QueryMapDone(self, cmd, returncode):
+        """!Restore settings after querying (restore GRASS_REGION)
+        
+        @param returncode command return code
+        """
+        if hasattr(self, "tmpreg"):
+            if self.tmpreg:
+                os.environ["GRASS_REGION"] = self.tmpreg
+            elif 'GRASS_REGION' in os.environ:
+                del os.environ["GRASS_REGION"]
+        elif 'GRASS_REGION' in os.environ:
+            del os.environ["GRASS_REGION"]
+        
+        if hasattr(self, "tmpreg"):
+            del self.tmpreg
+        
+    def QueryVector(self, east, north, qdist, posWindow, layer):
+        """!Query vector map layer features
+
+        Attribute data of selected vector object are displayed in GUI dialog.
+        Data can be modified (On Submit)
+        """
+        mapName = self.tree.GetPyData(layer)[0]['maplayer'].name
+        
+        if self.tree.GetPyData(layer)[0]['maplayer'].GetMapset() != \
+                grass.gisenv()['MAPSET']:
+            mode = 'display'
+        else:
+            mode = 'update'
+        
+        if self.dialogs['attributes'] is None:
+            dlg = DisplayAttributesDialog(parent = self.MapWindow,
+                                          map = mapName,
+                                          query = ((east, north), qdist),
+                                          pos = posWindow,
+                                          action = mode)
+            self.dialogs['attributes'] = dlg
+        
+        else:
+            # selection changed?
+            if not self.dialogs['attributes'].mapDBInfo or \
+                    self.dialogs['attributes'].mapDBInfo.map != mapName:
+                self.dialogs['attributes'].UpdateDialog(map = mapName, query = ((east, north), qdist),
+                                                        action = mode)
+            else:
+                self.dialogs['attributes'].UpdateDialog(query = ((east, north), qdist),
+                                                        action = mode)
+        if not self.dialogs['attributes'].IsFound():
+            self._layerManager.goutput.WriteLog(_('Nothing found.'))
+        
+        cats = self.dialogs['attributes'].GetCats()
+        
+        qlayer = None
+        if not self.IsPaneShown('3d') and self.IsAutoRendered():
+            try:
+                qlayer = self.Map.GetListOfLayers(l_name = globalvar.QUERYLAYER)[0]
+            except IndexError:
+                pass
+        
+        if self.dialogs['attributes'].mapDBInfo and cats:
+            if not self.IsPaneShown('3d') and self.IsAutoRendered():
+                # highlight feature & re-draw map
+                if qlayer:
+                    qlayer.SetCmd(self.AddTmpVectorMapLayer(mapName, cats,
+                                                            useId = False,
+                                                            addLayer = False))
+                else:
+                    qlayer = self.AddTmpVectorMapLayer(mapName, cats, useId = False)
+                
+                # set opacity based on queried layer
+                opacity = self.tree.GetPyData(layer)[0]['maplayer'].GetOpacity(float = True)
+                qlayer.SetOpacity(opacity)
+                
+                self.MapWindow.UpdateMap(render = False, renderVector = False)
+            if not self.dialogs['attributes'].IsShown():
+                self.dialogs['attributes'].Show()
+        else:
+            if qlayer:
+                self.Map.DeleteLayer(qlayer)
+                self.MapWindow.UpdateMap(render = False, renderVector = False)
+            if self.dialogs['attributes'].IsShown():
+                self.dialogs['attributes'].Hide()
+        
+    def OnQuery(self, event):
+        """!Query tools menu"""
+        if self.GetMapToolbar():
+            self.toolbars['map'].OnTool(event)
+            action = self.toolbars['map'].GetAction()
+            
+        self.toolbars['map'].action['desc'] = 'queryMap'
+        self.MapWindow.mouse['use'] = "query"
+        
+        if not self.IsStandalone():
+            # switch to output console to show query results
+            self._layerManager.notebook.SetSelectionByName('output')
+        
+        self.MapWindow.mouse['box'] = "point"
+        self.MapWindow.zoomtype = 0
+        
+        # change the cursor
+        self.MapWindow.SetCursor(self.cursors["cross"])
+        
+    def AddTmpVectorMapLayer(self, name, cats, useId = False, addLayer = True):
+        """!Add temporal vector map layer to map composition
+
+        @param name name of map layer
+        @param useId use feature id instead of category 
+        """
+        # color settings from ATM
+        color = UserSettings.Get(group = 'atm', key = 'highlight', subkey = 'color')
+        colorStr = str(color[0]) + ":" + \
+            str(color[1]) + ":" + \
+            str(color[2])
+
+        # icon used in vector display and its size
+        icon = ''
+        size = 0
+        vparam = self.tree.GetPyData(self.tree.layer_selected)[0]['cmd']
+        for p in vparam:
+            if '=' in p:
+                parg,pval = p.split('=', 1)
+                if parg == 'icon': icon = pval
+                elif parg == 'size': size = float(pval)
+
+        pattern = ["d.vect",
+                   "map=%s" % name,
+                   "color=%s" % colorStr,
+                   "fcolor=%s" % colorStr,
+                   "width=%d"  % UserSettings.Get(group = 'atm', key = 'highlight', subkey = 'width')]
+        if icon != '':
+            pattern.append('icon=%s' % icon)
+        if size > 0:
+            pattern.append('size=%i' % size)
+        
+        if useId:
+            cmd = pattern
+            cmd.append('-i')
+            cmd.append('cats=%s' % str(cats))
+        else:
+            cmd = []
+            for layer in cats.keys():
+                cmd.append(copy.copy(pattern))
+                lcats = cats[layer]
+                cmd[-1].append("layer=%d" % layer)
+                cmd[-1].append("cats=%s" % ListOfCatsToRange(lcats))
+        
+        if addLayer:
+            if useId:
+                return self.Map.AddLayer(type = 'vector', name = globalvar.QUERYLAYER, command = cmd,
+                                         l_active = True, l_hidden = True, l_opacity = 1.0)
+            else:
+                return self.Map.AddLayer(type = 'command', name = globalvar.QUERYLAYER, command = cmd,
+                                         l_active = True, l_hidden = True, l_opacity = 1.0)
+        else:
+            return cmd
+
+    def OnMeasure(self, event):
+        """!Init measurement routine that calculates map distance
+        along transect drawn on map display
+        """
+        self.totaldist = 0.0 # total measured distance
+        
+        # switch Layer Manager to output console to show measure results
+        self._layerManager.notebook.SetSelectionByName('output')
+        
+        # change mouse to draw line for measurement
+        self.MapWindow.mouse['use'] = "measure"
+        self.MapWindow.mouse['box'] = "line"
+        self.MapWindow.zoomtype = 0
+        self.MapWindow.pen     = wx.Pen(colour = 'red', width = 2, style = wx.SHORT_DASH)
+        self.MapWindow.polypen = wx.Pen(colour = 'green', width = 2, style = wx.SHORT_DASH)
+        
+        # change the cursor
+        self.MapWindow.SetCursor(self.cursors["pencil"])
+        
+        # initiating output
+        self._layerManager.goutput.WriteWarning(_('Click and drag with left mouse button '
+                                                  'to measure.\n'
+                                                  'Double click with left button to clear.'))
+        
+        if self.Map.projinfo['proj'] != 'xy':
+            units = self.Map.projinfo['units']
+            self._layerManager.goutput.WriteCmdLog(_('Measuring distance') + ' ('
+                                                   + units + '):')
+        else:
+            self._layerManager.goutput.WriteCmdLog(_('Measuring distance:'))
+        
+        if self.Map.projinfo['proj'] == 'll':
+            try:
+                import grass.lib.gis as gislib
+                global haveCtypes
+                haveCtypes = True
+
+                gislib.G_begin_distance_calculations()
+            except ImportError, e:
+                self._layerManager.goutput.WriteWarning(_('Geodesic distance is not yet '
+                                                          'supported by this tool.\n'
+                                                          'Reason: %s' % e))
+        
+    def MeasureDist(self, beginpt, endpt):
+        """!Calculate map distance from screen distance
+        and print to output window
+        """
+        self._layerManager.notebook.SetSelectionByName('output')
+        
+        dist, (north, east) = self.MapWindow.Distance(beginpt, endpt)
+        
+        dist = round(dist, 3)
+        d, dunits = self.FormatDist(dist)
+        
+        self.totaldist += dist
+        td, tdunits = self.FormatDist(self.totaldist)
+        
+        strdist = str(d)
+        strtotdist = str(td)
+        
+        if self.Map.projinfo['proj'] == 'xy' or 'degree' not in self.Map.projinfo['unit']:
+            angle = int(math.degrees(math.atan2(north,east)) + 0.5)
+            # uncomment below (or flip order of atan2(y,x) above) to use
+            #   the mathematical theta convention (CCW from +x axis)
+            #angle = 90 - angle
+            if angle < 0:
+                angle = 360 + angle
+            
+            mstring = '%s = %s %s\n%s = %s %s\n%s = %d %s\n%s' \
+                % (_('segment'), strdist, dunits,
+                   _('total distance'), strtotdist, tdunits,
+                   _('bearing'), angle, _('degrees (clockwise from grid-north)'),
+                   '-' * 60)
+        else:
+            mstring = '%s = %s %s\n%s = %s %s\n%s' \
+                % (_('segment'), strdist, dunits,
+                   _('total distance'), strtotdist, tdunits,
+                   '-' * 60)
+        
+        self._layerManager.goutput.WriteLog(mstring)
+        
+        return dist
+
+    def OnProfile(self, event):
+        """!Launch profile tool
+        """
+        raster = []
+        if self.tree.layer_selected and \
+                self.tree.GetPyData(self.tree.layer_selected)[0]['type'] == 'raster':
+            raster.append(self.tree.GetPyData(self.tree.layer_selected)[0]['maplayer'].name)
+
+        win = ProfileFrame(parent = self, rasterList = raster)
+        
+        win.CentreOnParent()
+        win.Show()
+        # Open raster select dialog to make sure that a raster (and
+        # the desired raster) is selected to be profiled
+        win.OnSelectRaster(None)
+
+    def FormatDist(self, dist):
+        """!Format length numbers and units in a nice way,
+        as a function of length. From code by Hamish Bowman
+        Grass Development Team 2006"""
+        
+        mapunits = self.Map.projinfo['units']
+        if mapunits == 'metres':
+            mapunits = 'meters'
+        outunits = mapunits
+        dist = float(dist)
+        divisor = 1.0
+        
+        # figure out which units to use
+        if mapunits == 'meters':
+            if dist > 2500.0:
+                outunits = 'km'
+                divisor = 1000.0
+            else: outunits = 'm'
+        elif mapunits == 'feet':
+            # nano-bug: we match any "feet", but US Survey feet is really
+            #  5279.9894 per statute mile, or 10.6' per 1000 miles. As >1000
+            #  miles the tick markers are rounded to the nearest 10th of a
+            #  mile (528'), the difference in foot flavours is ignored.
+            if dist > 5280.0:
+                outunits = 'miles'
+                divisor = 5280.0
+            else:
+                outunits = 'ft'
+        elif 'degree' in mapunits and \
+                not haveCtypes:
+            if dist < 1:
+                outunits = 'min'
+                divisor = (1/60.0)
+            else:
+                outunits = 'deg'
+        else:
+            outunits = 'meters'
+        
+        # format numbers in a nice way
+        if (dist/divisor) >= 2500.0:
+            outdist = round(dist/divisor)
+        elif (dist/divisor) >= 1000.0:
+            outdist = round(dist/divisor,1)
+        elif (dist/divisor) > 0.0:
+            outdist = round(dist/divisor,int(math.ceil(3-math.log10(dist/divisor))))
+        else:
+            outdist = float(dist/divisor)
+        
+        return (outdist, outunits)
+    
+    def OnHistogram(self, event):
+        """!Init histogram display canvas and tools
+        """
+        win = HistogramFrame(self)
+        
+        win.CentreOnParent()
+        win.Show()
+        win.Refresh()
+        win.Update()
+        
+    def AddBarscale(self, cmd = None, showDialog = True):
+        """!Handler for scale/arrow map decoration menu selection.
+        """
+        if cmd:
+            self.barscale.cmd = cmd
+
+        if not showDialog:
+            self.barscale.Show()
+            self.MapWindow.UpdateMap()
+            return
+
+        # Decoration overlay control dialog
+        if self.dialogs['barscale']:
+            if self.dialogs['barscale'].IsShown():
+                self.dialogs['barscale'].SetFocus()
+            else:
+                self.dialogs['barscale'].Show()
+        else:
+            # If location is latlon, only display north arrow (scale won't work)
+            #        proj = self.Map.projinfo['proj']
+            #        if proj == 'll':
+            #            barcmd = 'd.barscale -n'
+            #        else:
+            #            barcmd = 'd.barscale'
+
+            # decoration overlay control dialog
+            self.dialogs['barscale'] = \
+                DecorationDialog(parent = self, title = _('Scale and North arrow'),
+                                     overlayController = self.barscale,
+                                     ddstyle = DECOR_DIALOG_BARSCALE,
+                                     size = (350, 200),
+                                     style = wx.DEFAULT_DIALOG_STYLE | wx.CENTRE)
+
+            self.dialogs['barscale'].CentreOnParent()
+            ### dialog cannot be show as modal - in the result d.barscale is not selectable
+            ### self.dialogs['barscale'].ShowModal()
+            self.dialogs['barscale'].Show()
+        self.MapWindow.mouse['use'] = 'pointer'
+
+    def AddLegend(self, cmd = None, showDialog = True):
+        """!Handler for legend map decoration menu selection.
+        """
+        if cmd:
+            self.legend.cmd = cmd
+        else:
+            if self.tree.layer_selected and \
+                    self.tree.GetPyData(self.tree.layer_selected)[0]['type'] == 'raster':
+                self.legend.cmd.append('map=%s' % self.tree.GetPyData(self.tree.layer_selected)[0]['maplayer'].name)
+
+        if not showDialog:
+            self.legend.Show()
+            self.MapWindow.UpdateMap()
+            return
+
+        # Decoration overlay control dialog
+        if self.dialogs['legend']:
+            if self.dialogs['legend'].IsShown():
+                self.dialogs['legend'].SetFocus()
+            else:
+                self.dialogs['legend'].Show()
+        else:
+            # Decoration overlay control dialog
+            self.dialogs['legend'] = \
+                DecorationDialog(parent = self, title = ('Legend'),
+                                 overlayController = self.legend,
+                                 ddstyle = DECOR_DIALOG_LEGEND,
+                                 size = (350, 200),
+                                 style = wx.DEFAULT_DIALOG_STYLE | wx.CENTRE) 
+
+            self.dialogs['legend'].CentreOnParent() 
+            ### dialog cannot be show as modal - in the result d.legend is not selectable
+            ### self.dialogs['legend'].ShowModal()
+            self.dialogs['legend'].Show()
+        self.MapWindow.mouse['use'] = 'pointer'
+
+    def OnAddText(self, event):
+        """!Handler for text decoration menu selection.
+        """
+        if self.MapWindow.dragid > -1:
+            id = self.MapWindow.dragid
+            self.MapWindow.dragid = -1
+        else:
+            # index for overlay layer in render
+            if len(self.MapWindow.textdict.keys()) > 0:
+                id = max(self.MapWindow.textdict.keys()) + 1
+            else:
+                id = 101
+        
+        self.dialogs['text'] = TextLayerDialog(parent = self, ovlId = id, 
+                                               title = _('Add text layer'),
+                                               size = (400, 200))
+        self.dialogs['text'].CenterOnParent()
+
+        # If OK button pressed in decoration control dialog
+        if self.dialogs['text'].ShowModal() == wx.ID_OK:
+            text = self.dialogs['text'].GetValues()['text']
+            active = self.dialogs['text'].GetValues()['active']
+        
+            # delete object if it has no text or is not active
+            if text == '' or active == False:
+                try:
+                    self.MapWindow2D.pdc.ClearId(id)
+                    self.MapWindow2D.pdc.RemoveId(id)
+                    del self.MapWindow.textdict[id]
+                    if self.IsPaneShown('3d'):
+                        self.MapWindow3D.UpdateOverlays()
+                        self.MapWindow.UpdateMap()
+                    else:
+                        self.MapWindow2D.UpdateMap(render = False, renderVector = False)
+                except:
+                    pass
+                return
+
+            
+            self.MapWindow.textdict[id] = self.dialogs['text'].GetValues()
+            
+            if self.IsPaneShown('3d'):
+                self.MapWindow3D.UpdateOverlays()
+                self.MapWindow3D.UpdateMap()
+            else:
+                self.MapWindow2D.pdc.ClearId(id)
+                self.MapWindow2D.pdc.SetId(id)
+                self.MapWindow2D.UpdateMap(render = False, renderVector = False)
+            
+        self.MapWindow.mouse['use'] = 'pointer'
+    
+    def OnAddArrow(self, event):
+        """!Handler for north arrow menu selection.
+            Opens Appearance page of nviz notebook.
+        """
+        
+        self._layerManager.nviz.SetPage('decoration')
+        self.MapWindow3D.SetDrawArrow((70, 70))
+        
+    def GetOptData(self, dcmd, type, params, propwin):
+        """!Callback method for decoration overlay command generated by
+        dialog created in menuform.py
+        """
+        # Reset comand and rendering options in render.Map. Always render decoration.
+        # Showing/hiding handled by PseudoDC
+        self.Map.ChangeOverlay(ovltype = type, type = 'overlay', name = '', command = dcmd,
+                               l_active = True, l_render = False)
+        self.params[type] = params
+        self.propwin[type] = propwin
+
+    def OnZoomToMap(self, event):
+        """!Set display extents to match selected raster (including
+        NULLs) or vector map.
+        """
+        self.MapWindow.ZoomToMap()
+
+    def OnZoomToRaster(self, event):
+        """!Set display extents to match selected raster map (ignore NULLs)
+        """
+        self.MapWindow.ZoomToMap(ignoreNulls = True)
+        
+    def OnZoomToSaved(self, event):
+        """!Set display geometry to match extents in
+        saved region file
+        """
+        self.MapWindow.ZoomToSaved()
+        
+    def OnDisplayToWind(self, event):
+        """!Set computational region (WIND file) to match display
+        extents
+        """
+        self.MapWindow.DisplayToWind()
+ 
+    def SaveDisplayRegion(self, event):
+        """!Save display extents to named region file.
+        """
+        self.MapWindow.SaveDisplayRegion()
+        
+    def OnZoomMenu(self, event):
+        """!Popup Zoom menu
+        """
+        point = wx.GetMousePosition()
+        zoommenu = wx.Menu()
+        # Add items to the menu
+
+        zoomwind = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to computational region (set with g.region)'))
+        zoommenu.AppendItem(zoomwind)
+        self.Bind(wx.EVT_MENU, self.OnZoomToWind, zoomwind)
+
+        zoomdefault = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to default region'))
+        zoommenu.AppendItem(zoomdefault)
+        self.Bind(wx.EVT_MENU, self.OnZoomToDefault, zoomdefault)
+
+        zoomsaved = wx.MenuItem(zoommenu, wx.ID_ANY, _('Zoom to saved region'))
+        zoommenu.AppendItem(zoomsaved)
+        self.Bind(wx.EVT_MENU, self.OnZoomToSaved, zoomsaved)
+
+        savewind = wx.MenuItem(zoommenu, wx.ID_ANY, _('Set computational region from display extent'))
+        zoommenu.AppendItem(savewind)
+        self.Bind(wx.EVT_MENU, self.OnDisplayToWind, savewind)
+
+        savezoom = wx.MenuItem(zoommenu, wx.ID_ANY, _('Save display geometry to named region'))
+        zoommenu.AppendItem(savezoom)
+        self.Bind(wx.EVT_MENU, self.SaveDisplayRegion, savezoom)
+
+        # Popup the menu. If an item is selected then its handler
+        # will be called before PopupMenu returns.
+        self.PopupMenu(zoommenu)
+        zoommenu.Destroy()
+
+    def SetProperties(self, render = False, mode = 0, showCompExtent = False,
+                      constrainRes = False, projection = False, alignExtent = True):
+        """!Set properies of map display window"""
+        self.SetProperty('render', render)
+        self.statusbarManager.SetMode(mode)
+        self.StatusbarUpdate()
+        self.SetProperty('region', showCompExtent)
+        self.SetProperty('alignExtent', alignExtent)
+        self.SetProperty('resolution', constrainRes)
+        self.SetProperty('projection', projection)
+        
+    def IsStandalone(self):
+        """!Check if Map display is standalone"""
+        if self._layerManager:
+            return False
+        
+        return True
+    
+    def GetLayerManager(self):
+        """!Get reference to Layer Manager
+
+        @return window reference
+        @return None (if standalone)
+        """
+        return self._layerManager
+    
+    def GetMapToolbar(self):
+        """!Returns toolbar with zooming tools"""
+        return self.toolbars['map']
diff --git a/gui/wxpython/mapdisp/gprint.py b/gui/wxpython/mapdisp/gprint.py
new file mode 100644
index 0000000..2457e32
--- /dev/null
+++ b/gui/wxpython/mapdisp/gprint.py
@@ -0,0 +1,289 @@
+"""!
+ at package mapdisp.gprint
+
+ at brief Print context and utility functions for printing
+contents of map display window.
+
+Classes:
+ - gprint::MapPrint
+ - gprint::PrintOptions
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton (Arizona State University)
+"""
+
+import  wx
+
+from core.gcmd import GMessage
+
+class MapPrint(wx.Printout):
+    def __init__(self, canvas):
+        wx.Printout.__init__(self)
+        self.canvas = canvas
+
+    def OnBeginDocument(self, start, end):
+        return super(MapPrint, self).OnBeginDocument(start, end)
+
+    def OnEndDocument(self):
+        super(MapPrint, self).OnEndDocument()
+
+    def OnBeginPrinting(self):
+        super(MapPrint, self).OnBeginPrinting()
+
+    def OnEndPrinting(self):
+        super(MapPrint, self).OnEndPrinting()
+
+    def OnPreparePrinting(self):
+        super(MapPrint, self).OnPreparePrinting()
+
+    def HasPage(self, page):
+        if page <= 2:
+            return True
+        else:
+            return False
+
+    def GetPageInfo(self):
+        return (1, 2, 1, 2)
+
+    def OnPrintPage(self, page):
+        dc = self.GetDC()
+
+        #-------------------------------------------
+        # One possible method of setting scaling factors...
+        maxX, maxY = self.canvas.GetSize()
+
+        # Let's have at least 50 device units margin
+        marginX = 10
+        marginY = 10
+
+        # Add the margin to the graphic size
+        maxX = maxX + (2 * marginX)
+        maxY = maxY + (2 * marginY)
+
+        # Get the size of the DC in pixels
+        (w, h) = dc.GetSizeTuple()
+
+        # Calculate a suitable scaling factor
+        scaleX = float(w) / maxX
+        scaleY = float(h) / maxY
+
+        # Use x or y scaling factor, whichever fits on the DC
+        actualScale = min(scaleX, scaleY)
+
+        # Calculate the position on the DC for centering the graphic
+        posX = (w - (self.canvas.GetSize()[0] * actualScale)) / 2.0
+        posY = (h - (self.canvas.GetSize()[1] * actualScale)) / 2.0
+
+        # Set the scale and origin
+        dc.SetUserScale(actualScale, actualScale)
+        dc.SetDeviceOrigin(int(posX), int(posY))
+
+        #-------------------------------------------
+
+        self.canvas.pdc.DrawToDC(dc)
+
+        # prints a page number on the page
+#        dc.DrawText("Page: %d" % page, marginX/2, maxY-marginY)
+
+        return True
+
+class PrintOptions:
+    def __init__(self, parent, mapwin):
+        self.mapframe = parent
+        self.mapwin = mapwin
+	#self.frame = frame
+
+	self.printData = None
+
+	#self.canvas = ScrolledWindow.MyCanvas(self)
+
+    def setup(self):
+	if self.printData:
+	    return
+        self.printData = wx.PrintData()
+        self.printData.SetPaperId(wx.PAPER_LETTER)
+        self.printData.SetPrintMode(wx.PRINT_MODE_PRINTER)
+
+    def OnPageSetup(self, event):
+	self.setup()
+        psdd = wx.PageSetupDialogData(self.printData)
+        psdd.CalculatePaperSizeFromId()
+        dlg = wx.PageSetupDialog(self.mapwin, psdd)
+        dlg.ShowModal()
+
+        # this makes a copy of the wx.PrintData instead of just saving
+        # a reference to the one inside the PrintDialogData that will
+        # be destroyed when the dialog is destroyed
+        self.printData = wx.PrintData( dlg.GetPageSetupData().GetPrintData() )
+
+        dlg.Destroy()
+
+    def OnPrintPreview(self, event):
+	self.setup()
+        data = wx.PrintDialogData(self.printData)
+        printout = MapPrint(self.mapwin)
+        printout2 = MapPrint(self.mapwin)
+        self.preview = wx.PrintPreview(printout, printout2, data)
+
+        if not self.preview.Ok():
+            wx.MessageBox("There was a problem printing this display\n", wx.OK)
+            return
+
+        pfrm = wx.PreviewFrame(self.preview, self.mapframe, "Print preview")
+
+        pfrm.Initialize()
+        pfrm.SetPosition(self.mapframe.GetPosition())
+        pfrm.SetSize(self.mapframe.GetClientSize())
+        pfrm.Show(True)
+
+    def OnDoPrint(self, event):
+	self.setup()
+        pdd = wx.PrintDialogData(self.printData)
+        # set number of pages/copies
+        pdd.SetToPage(1)
+        printer = wx.Printer(pdd)
+        printout = MapPrint(self.mapwin)
+
+        if not printer.Print(self.mapframe, printout, True):
+            wx.MessageBox("There was a problem printing.\nPerhaps your current printer is not set correctly?", "Printing", wx.OK)
+        else:
+            self.printData = wx.PrintData( printer.GetPrintDialogData().GetPrintData() )
+        printout.Destroy()
+class MapPrint(wx.Printout):
+    def __init__(self, canvas):
+        wx.Printout.__init__(self)
+        self.canvas = canvas
+
+    def OnBeginDocument(self, start, end):
+        return super(MapPrint, self).OnBeginDocument(start, end)
+
+    def OnEndDocument(self):
+        super(MapPrint, self).OnEndDocument()
+
+    def OnBeginPrinting(self):
+        super(MapPrint, self).OnBeginPrinting()
+
+    def OnEndPrinting(self):
+        super(MapPrint, self).OnEndPrinting()
+
+    def OnPreparePrinting(self):
+        super(MapPrint, self).OnPreparePrinting()
+
+    def HasPage(self, page):
+        if page <= 2:
+            return True
+        else:
+            return False
+
+    def GetPageInfo(self):
+        return (1, 2, 1, 2)
+
+    def OnPrintPage(self, page):
+        dc = self.GetDC()
+
+        #-------------------------------------------
+        # One possible method of setting scaling factors...
+        maxX, maxY = self.canvas.GetSize()
+
+        # Let's have at least 50 device units margin
+        marginX = 10
+        marginY = 10
+
+        # Add the margin to the graphic size
+        maxX = maxX + (2 * marginX)
+        maxY = maxY + (2 * marginY)
+
+        # Get the size of the DC in pixels
+        (w, h) = dc.GetSizeTuple()
+
+        # Calculate a suitable scaling factor
+        scaleX = float(w) / maxX
+        scaleY = float(h) / maxY
+
+        # Use x or y scaling factor, whichever fits on the DC
+        actualScale = min(scaleX, scaleY)
+
+        # Calculate the position on the DC for centering the graphic
+        posX = (w - (self.canvas.GetSize()[0] * actualScale)) / 2.0
+        posY = (h - (self.canvas.GetSize()[1] * actualScale)) / 2.0
+
+        # Set the scale and origin
+        dc.SetUserScale(actualScale, actualScale)
+        dc.SetDeviceOrigin(int(posX), int(posY))
+
+        #-------------------------------------------
+
+        self.canvas.pdc.DrawToDC(dc)
+
+        # prints a page number on the page
+        # dc.DrawText("Page: %d" % page, marginX/2, maxY-marginY)
+
+        return True
+
+class PrintOptions(wx.Object):
+    def __init__(self, parent, mapwin):
+        self.mapframe = parent
+        self.mapwin = mapwin
+	#self.frame = frame
+
+	self.printData = None
+
+	#self.canvas = ScrolledWindow.MyCanvas(self)
+
+    def setup(self):
+	if self.printData:
+	    return
+        self.printData = wx.PrintData()
+        self.printData.SetPaperId(wx.PAPER_LETTER)
+        self.printData.SetPrintMode(wx.PRINT_MODE_PRINTER)
+
+    def OnPageSetup(self, event):
+	self.setup()
+        psdd = wx.PageSetupDialogData(self.printData)
+        psdd.CalculatePaperSizeFromId()
+        dlg = wx.PageSetupDialog(self.mapwin, psdd)
+        dlg.ShowModal()
+
+        # this makes a copy of the wx.PrintData instead of just saving
+        # a reference to the one inside the PrintDialogData that will
+        # be destroyed when the dialog is destroyed
+        self.printData = wx.PrintData( dlg.GetPageSetupData().GetPrintData() )
+
+        dlg.Destroy()
+
+    def OnPrintPreview(self, event):
+	self.setup()
+        data = wx.PrintDialogData(self.printData)
+        printout = MapPrint(self.mapwin)
+        printout2 = MapPrint(self.mapwin)
+        self.preview = wx.PrintPreview(printout, printout2, data)
+
+        if not self.preview.Ok():
+            wx.MessageBox("There was a problem printing this display\n", wx.OK)
+            return
+
+        pfrm = wx.PreviewFrame(self.preview, self.mapframe, "Print preview")
+
+        pfrm.Initialize()
+        pfrm.SetPosition(self.mapframe.GetPosition())
+        pfrm.SetSize(self.mapframe.GetClientSize())
+        pfrm.Show(True)
+
+    def OnDoPrint(self, event):
+	self.setup()
+        pdd = wx.PrintDialogData(self.printData)
+        # set number of pages/copies
+        pdd.SetToPage(1)
+        printer = wx.Printer(pdd)
+        printout = MapPrint(self.mapwin)
+
+        if not printer.Print(self.mapframe, printout, True):
+            GMessage(_("There was a problem printing.\n"
+                       "Perhaps your current printer is not set correctly?"))
+        else:
+            self.printData = wx.PrintData( printer.GetPrintDialogData().GetPrintData() )
+        printout.Destroy()
diff --git a/gui/wxpython/mapdisp/main.py b/gui/wxpython/mapdisp/main.py
new file mode 100644
index 0000000..1e44dad
--- /dev/null
+++ b/gui/wxpython/mapdisp/main.py
@@ -0,0 +1,142 @@
+"""!
+ at package mapdisp.main
+
+ at brief Start Map Display as standalone application
+
+Classes:
+ - mapdisp::MapApp
+
+Usage:
+python mapdisp/main.py monitor-identifier /path/to/map/file /path/to/command/file /path/to/env/file
+
+(C) 2006-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton
+ at author Jachym Cepicky
+ at author Martin Landa <landa.martin gmail.com>
+ at author Vaclav Petras <wenzeslaus gmail.com> (MapFrameBase)
+ at author Anna Kratochvilova <kratochanna gmail.com> (MapFrameBase)
+"""
+
+import os
+import sys
+
+if __name__ == "__main__":
+    sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'gui', 'wxpython'))
+from core          import globalvar
+import wx
+
+from core.gcmd     import RunCommand
+from core.render   import Map
+from mapdisp.frame import MapFrame
+from grass.script  import core as grass
+
+# for standalone app
+monFile = { 'cmd' : None,
+            'map' : None,
+            'env' : None,
+            }
+monName = None
+monSize = list(globalvar.MAP_WINDOW_SIZE)
+
+
+class MapApp(wx.App):
+    def OnInit(self):
+        wx.InitAllImageHandlers()
+        if __name__ == "__main__":
+            self.cmdTimeStamp = os.path.getmtime(monFile['cmd'])
+            self.Map = Map(cmdfile = monFile['cmd'], mapfile = monFile['map'],
+                           envfile = monFile['env'], monitor = monName)
+        else:
+            self.Map = None
+
+        self.mapFrm = MapFrame(parent = None, id = wx.ID_ANY, Map = self.Map,
+                               size = monSize)
+        # self.SetTopWindow(Map)
+        self.mapFrm.Show()
+        
+        if __name__ == "__main__":
+            self.timer = wx.PyTimer(self.watcher)
+            #check each 0.5s
+            global mtime
+            mtime = 500
+            self.timer.Start(mtime)
+            
+        return True
+    
+    def OnExit(self):
+        if __name__ == "__main__":
+            # stop the timer
+            # self.timer.Stop()
+            # terminate thread
+            for f in monFile.itervalues():
+                grass.try_remove(f)
+            
+    def watcher(self):
+        """!Redraw, if new layer appears (check's timestamp of
+        cmdfile)
+        """
+        # todo: events
+        if os.path.getmtime(monFile['cmd']) > self.cmdTimeStamp:
+            self.timer.Stop()
+            self.cmdTimeStamp = os.path.getmtime(monFile['cmd'])
+            self.mapFrm.OnDraw(None)
+            self.mapFrm.GetMap().GetLayersFromCmdFile()
+            self.timer.Start(mtime)
+
+if __name__ == "__main__":
+    # set command variable
+    if len(sys.argv) < 5:
+        print __doc__
+        sys.exit(1)
+    
+    monName = sys.argv[1]
+    monFile = { 'map' : sys.argv[2],
+                'cmd' : sys.argv[3],
+                'env' : sys.argv[4],
+                }
+    if len(sys.argv) >= 6:
+        try:
+            monSize[0] = int(sys.argv[5])
+        except ValueError:
+            pass
+    
+    if len(sys.argv) == 7:
+        try:
+            monSize[1] = int(sys.argv[6])
+        except ValueError:
+            pass
+
+    import gettext
+    gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
+    
+    grass.verbose(_("Starting map display <%s>...") % (monName))
+
+    RunCommand('g.gisenv',
+               set = 'MONITOR_%s_PID=%d' % (monName, os.getpid()))
+    
+    gmMap = MapApp(0)
+    # set title
+    gmMap.mapFrm.SetTitle(_("GRASS GIS Map Display: " +
+                            monName + 
+                            " - Location: " + grass.gisenv()["LOCATION_NAME"]))
+    
+    gmMap.MainLoop()
+    
+    grass.verbose(_("Stopping map display <%s>...") % (monName))
+
+    # clean up GRASS env variables
+    env = grass.gisenv()
+    env_name = 'MONITOR_%s' % monName
+    for key in env.keys():
+        if key.find(env_name) == 0:
+            RunCommand('g.gisenv',
+                       set = '%s=' % key)
+        if key == 'MONITOR' and env[key] == monName:
+            RunCommand('g.gisenv',
+                       set = '%s=' % key)
+    
+    sys.exit(0)
diff --git a/gui/wxpython/gui_modules/mapdisp_window.py b/gui/wxpython/mapdisp/mapwindow.py
similarity index 80%
rename from gui/wxpython/gui_modules/mapdisp_window.py
rename to gui/wxpython/mapdisp/mapwindow.py
index 632d958..28ed2aa 100644
--- a/gui/wxpython/gui_modules/mapdisp_window.py
+++ b/gui/wxpython/mapdisp/mapwindow.py
@@ -1,16 +1,15 @@
 """!
- at package mapdisp_window.py
+ at package mapdisp.mapwindow
 
 @brief Map display canvas - buffered window.
 
 Classes:
- - MapWindow
- - BufferedWindow
+ - mapwindow::BufferedWindow
 
 (C) 2006-2011 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Martin Landa <landa.martin gmail.com>
 @author Michael Barton
@@ -21,173 +20,22 @@ import os
 import time
 import math
 import sys
-import tempfile
-import traceback
 
 import wx
 
 import grass.script as grass
 
-import dbm
-import gdialogs
-import gcmd
-import utils
-import globalvar
-import gselect
-from debug import Debug
-from preferences import globalSettings as UserSettings
-from units import ConvertValue as UnitsConvertValue
-
+from gui_core.dialogs   import SavedRegion
+from core.gcmd          import RunCommand, GException, GError, GMessage
+from core.debug         import Debug
+from core.settings      import UserSettings
+from gui_core.mapwindow import MapWindow
 try:
     import grass.lib.gis as gislib
     haveCtypes = True
 except ImportError:
     haveCtypes = False
 
-class MapWindow(object):
-    """!Abstract map display window class
-    
-    Superclass for BufferedWindow class (2D display mode), and GLWindow
-    (3D display mode).
-    """
-    def __init__(self, parent, id = wx.ID_ANY,
-                 Map = None, tree = None, lmgr = None, **kwargs):
-        self.parent = parent # MapFrame
-        self.Map    = Map
-        self.tree   = tree
-        self.lmgr   = lmgr
-        
-        # mouse attributes -- position on the screen, begin and end of
-        # dragging, and type of drawing
-        self.mouse = {
-            'begin': [0, 0], # screen coordinates
-            'end'  : [0, 0],
-            'use'  : "pointer",
-            'box'  : "point"
-            }
-
-    def OnMotion(self, event):
-        """!Track mouse motion and update statusbar
-        """
-        if self.parent.statusbarWin['toggle'].GetSelection() == 0: # Coordinates
-            precision = int(UserSettings.Get(group = 'projection', key = 'format',
-                                             subkey = 'precision'))
-            format = UserSettings.Get(group = 'projection', key = 'format',
-                                      subkey = 'll')
-            try:
-                e, n = self.Pixel2Cell(event.GetPositionTuple())
-            except (TypeError, ValueError):
-                self.parent.statusbar.SetStatusText("", 0)
-                return
-            
-            updated = False
-            if hasattr(self, "digit"):
-                updated = self._onMotion((e, n), precision)
-
-            if not updated:
-                if self.parent.statusbarWin['projection'].IsChecked():
-                    if not UserSettings.Get(group = 'projection', key = 'statusbar', subkey = 'proj4'):
-                        self.parent.statusbar.SetStatusText(_("Projection not defined (check the settings)"), 0)
-                    else:
-                        proj, coord  = utils.ReprojectCoordinates(coord = (e, n),
-                                                                  projOut = UserSettings.Get(group = 'projection',
-                                                                                             key = 'statusbar',
-                                                                                             subkey = 'proj4'),
-                                                                  flags = 'd')
-                    
-                        if coord:
-                            e, n = coord
-                            if proj in ('ll', 'latlong', 'longlat') and format == 'DMS':
-                                self.parent.statusbar.SetStatusText(utils.Deg2DMS(e, n, precision = precision),
-                                                                    0)
-                            else:
-                                self.parent.statusbar.SetStatusText("%.*f; %.*f" % \
-                                                                        (precision, e, precision, n), 0)
-                        else:
-                            self.parent.statusbar.SetStatusText(_("Error in projection (check the settings)"), 0)
-                else:
-                    if self.parent.Map.projinfo['proj'] == 'll' and format == 'DMS':
-                        self.parent.statusbar.SetStatusText(utils.Deg2DMS(e, n, precision = precision),
-                                                            0)
-                    else:
-                        self.parent.statusbar.SetStatusText("%.*f; %.*f" % \
-                                                                (precision, e, precision, n), 0)
-        
-        event.Skip()
-
-    def GetLayerByName(self, name, mapType, dataType = 'layer'):
-        """!Get layer from layer tree by nam
-        
-        @param name layer name
-        @param type 'item' / 'layer' / 'nviz'
-
-        @return layer / map layer properties / nviz properties
-        @return None
-        """
-        if not self.tree:
-            return None
-        
-        try:
-            mapLayer = self.Map.GetListOfLayers(l_type = mapType, l_name = name)[0]
-        except IndexError:
-            return None
-        
-        if dataType == 'layer':
-            return mapLayer
-        item = self.tree.FindItemByData('maplayer', mapLayer)
-        if not item:
-            return None
-        if dataType == 'nviz':
-            return self.tree.GetPyData(item)[0]['nviz']
-        
-        return item
-    
-    def GetSelectedLayer(self, type = 'layer', multi = False):
-        """!Get selected layer from layer tree
-        
-        @param type 'item' / 'layer' / 'nviz'
-        @param multi return first selected layer or all
-        
-        @return layer / map layer properties / nviz properties
-        @return None / [] on failure
-        """
-        ret = []
-        if not self.tree or \
-                not self.tree.GetSelection():
-            if multi:
-                return []
-            else:
-                return None
-        
-        if multi and \
-                type == 'item':
-            return self.tree.GetSelections()
-        
-        for item in self.tree.GetSelections():
-            if not item.IsChecked():
-                if multi:
-                    continue
-                else:
-                    return None
-
-            if type == 'item': # -> multi = False
-                return item
-        
-            try:
-                if type == 'nviz':
-                    layer = self.tree.GetPyData(item)[0]['nviz']
-                else:
-                    layer = self.tree.GetPyData(item)[0]['maplayer']
-            except:
-                layer = None
-
-            if multi:
-                ret.append(layer)
-            else:
-                return layer
-            
-        return ret
-    
 class BufferedWindow(MapWindow, wx.Window):
     """!A Buffered window class (2D view mode)
 
@@ -199,7 +47,7 @@ class BufferedWindow(MapWindow, wx.Window):
     SaveToFile() method.
     """
     def __init__(self, parent, id = wx.ID_ANY,
-                 Map = None, tree = None, lmgr = None,
+                 Map = None, tree = None, lmgr = None, overlays = None,
                  style = wx.NO_FULL_REPAINT_ON_RESIZE, **kwargs):
         MapWindow.__init__(self, parent, id, Map, tree, lmgr, **kwargs)
         wx.Window.__init__(self, parent, id, style = style, **kwargs)
@@ -222,8 +70,7 @@ class BufferedWindow(MapWindow, wx.Window):
         self.Bind(wx.EVT_PAINT,        self.OnPaint)
         self.Bind(wx.EVT_SIZE,         self.OnSize)
         self.Bind(wx.EVT_IDLE,         self.OnIdle)
-        self.Bind(wx.EVT_MOUSE_EVENTS, self.MouseActions)
-        self.Bind(wx.EVT_MOTION,       self.OnMotion)
+        self._bindMouseEvents()
         
         self.processMouse = True
         
@@ -231,7 +78,7 @@ class BufferedWindow(MapWindow, wx.Window):
         self.mapfile = None   # image file to be rendered
         self.img     = None   # wx.Image object (self.mapfile)
         # decoration overlays
-        self.overlays = {}
+        self.overlays = overlays
         # images and their PseudoDC ID's for painting and dragging
         self.imagedict = {}   
         self.select = {}      # selecting/unselecting decorations for dragging
@@ -275,6 +122,10 @@ class BufferedWindow(MapWindow, wx.Window):
         # pseudoDC for temporal objects (select box, measurement tool, etc.)
         self.pdcTmp = wx.PseudoDC()
         
+    def _bindMouseEvents(self):
+        self.Bind(wx.EVT_MOUSE_EVENTS, self.MouseActions)
+        self.Bind(wx.EVT_MOTION,       self.OnMotion)
+        
     def Draw(self, pdc, img = None, drawid = None, pdctype = 'image', coords = [0, 0, 0, 0]):
         """!Draws map and overlay decorations
         """
@@ -391,12 +242,12 @@ class BufferedWindow(MapWindow, wx.Window):
             w, h = self.GetFullTextExtent(img['text'])[0:2]
             pdc.SetFont(img['font'])
             pdc.SetTextForeground(img['color'])
-            coords, w, h = self.TextBounds(img)
+            coords, bbox = self.TextBounds(img)
             if rotation == 0:
                 pdc.DrawText(img['text'], coords[0], coords[1])
             else:
                 pdc.DrawRotatedText(img['text'], coords[0], coords[1], rotation)
-            pdc.SetIdBounds(drawid, wx.Rect(coords[0], coords[1], w, h))
+            pdc.SetIdBounds(drawid, bbox)
         
         pdc.EndDrawing()
         
@@ -404,11 +255,15 @@ class BufferedWindow(MapWindow, wx.Window):
         
         return drawid
     
-    def TextBounds(self, textinfo):
+    def TextBounds(self, textinfo, relcoords = False):
         """!Return text boundary data
         
         @param textinfo text metadata (text, font, color, rotation)
         @param coords reference point
+        
+        @return coords of nonrotated text bbox (TL corner)
+        @return bbox of rotated text bbox (wx.Rect)
+        @return relCoords are text coord inside bbox
         """
         if 'rotation' in textinfo:
             rotation = float(textinfo['rotation'])
@@ -416,7 +271,8 @@ class BufferedWindow(MapWindow, wx.Window):
             rotation = 0.0
         
         coords = textinfo['coords']
-        
+        bbox = wx.Rect(coords[0], coords[1], 0, 0)
+        relCoords = (0, 0)
         Debug.msg (4, "BufferedWindow.TextBounds(): text=%s, rotation=%f" % \
                    (textinfo['text'], rotation))
         
@@ -427,15 +283,31 @@ class BufferedWindow(MapWindow, wx.Window):
         w, h = self.GetTextExtent(textinfo['text'])
         
         if rotation == 0:
-            coords[2], coords[3] = coords[0] + w, coords[1] + h
-            return coords, w, h
+            bbox[2], bbox[3] = w, h
+            if relcoords:
+                return coords, bbox, relCoords
+            else:
+                return coords, bbox
         
         boxh = math.fabs(math.sin(math.radians(rotation)) * w) + h
         boxw = math.fabs(math.cos(math.radians(rotation)) * w) + h
-        coords[2] = coords[0] + boxw
-        coords[3] = coords[1] + boxh
-        
-        return coords, boxw, boxh
+        if rotation > 0 and rotation < 90:
+            bbox[1] -= boxh
+            relCoords = (0, boxh)
+        elif rotation >= 90 and rotation < 180:
+            bbox[0] -= boxw
+            bbox[1] -= boxh
+            relCoords = (boxw, boxh)
+        elif rotation >= 180 and rotation < 270:
+            bbox[0] -= boxw
+            relCoords = (boxw, 0)
+        bbox[2] = boxw
+        bbox[3] = boxh
+        bbox.Inflate(h,h)
+        if relcoords:
+            return coords, bbox, relCoords
+        else:
+            return coords, bbox
 
     def OnPaint(self, event):
         """!Draw PseudoDC's to buffered paint DC
@@ -571,8 +443,35 @@ class BufferedWindow(MapWindow, wx.Window):
         ibuffer = wx.EmptyBitmap(max(1, width), max(1, height))
         self.Map.Render(force = True, windres = True)
         img = self.GetImage()
+        self.pdc.RemoveAll()
         self.Draw(self.pdc, img, drawid = 99)
-        dc = wx.BufferedPaintDC(self, ibuffer)
+        
+        # compute size ratio to move overlay accordingly
+        cSize = self.GetClientSizeTuple()
+        ratio = float(width) / cSize[0], float(height) / cSize[1]
+        
+        # redraw lagend, scalebar
+        for img in self.GetOverlay():
+            # draw any active and defined overlays
+            if self.imagedict[img]['layer'].IsActive():
+                id = self.imagedict[img]['id']
+                coords = int(ratio[0] * self.overlays[id].coords[0]),\
+                         int(ratio[1] * self.overlays[id].coords[1])
+                self.Draw(self.pdc, img = img, drawid = id,
+                          pdctype = self.overlays[id].pdcType, coords = coords)
+                          
+        # redraw text labels
+        for id in self.textdict.keys():
+            textinfo = self.textdict[id]
+            oldCoords = textinfo['coords']
+            textinfo['coords'] = ratio[0] * textinfo['coords'][0],\
+                                 ratio[1] * textinfo['coords'][1]
+            self.Draw(self.pdc, img = self.textdict[id], drawid = id,
+                      pdctype = 'text')
+            # set back old coordinates
+            textinfo['coords'] = oldCoords
+            
+        dc = wx.BufferedDC(None, ibuffer)
         dc.Clear()
         self.PrepareDC(dc)
         self.pdc.DrawToDC(dc)
@@ -594,8 +493,14 @@ class BufferedWindow(MapWindow, wx.Window):
         """
         imgs = []
         for overlay in self.Map.GetListOfLayers(l_type = "overlay", l_active = True):
-            if os.path.isfile(overlay.mapfile) and os.path.getsize(overlay.mapfile):
+            if overlay.mapfile is not None \
+               and os.path.isfile(overlay.mapfile) and os.path.getsize(overlay.mapfile):
                 img = wx.Image(overlay.mapfile, wx.BITMAP_TYPE_ANY)
+
+                for key in self.imagedict.keys():
+                    if self.imagedict[key]['id'] == overlay.id:
+                        del self.imagedict[key]
+
                 self.imagedict[img] = { 'id' : overlay.id,
                                         'layer' : overlay }
                 imgs.append(img)
@@ -616,6 +521,10 @@ class BufferedWindow(MapWindow, wx.Window):
         else:
             img = None
         
+        for key in self.imagedict.keys():
+            if self.imagedict[key]['id'] == imgId:
+                del self.imagedict[key]
+
         self.imagedict[img] = { 'id': imgId }
         
         return img
@@ -638,9 +547,9 @@ class BufferedWindow(MapWindow, wx.Window):
         # initialize process bar (only on 'render')
         #
         if render or renderVector:
-            self.parent.statusbarWin['progress'].Show()
-            if self.parent.statusbarWin['progress'].GetRange() > 0:
-                self.parent.statusbarWin['progress'].SetValue(1)
+            self.parent.GetProgressBar().Show()
+            if self.parent.GetProgressBar().GetRange() > 0:
+                self.parent.GetProgressBar().SetValue(1)
         
         #
         # render background image if needed
@@ -657,7 +566,7 @@ class BufferedWindow(MapWindow, wx.Window):
             if render:
                 # update display size
                 self.Map.ChangeMapSize(self.GetClientSize())
-                if self.parent.statusbarWin['resolution'].IsChecked():
+                if self.parent.GetProperty('resolution'):
                     # use computation region resolution for rendering
                     windres = True
                 else:
@@ -666,8 +575,8 @@ class BufferedWindow(MapWindow, wx.Window):
                                                windres = windres)
             else:
                 self.mapfile = self.Map.Render(force = False, mapWindow = self.parent)
-        except gcmd.GException, e:
-            gcmd.GError(message = e.value)
+        except GException, e:
+            GError(message = e.value)
             self.mapfile = None
         
         self.img = self.GetImage() # id=99
@@ -707,7 +616,7 @@ class BufferedWindow(MapWindow, wx.Window):
             if self.imagedict[img]['layer'].IsActive():
                 id = self.imagedict[img]['id']
                 self.Draw(self.pdc, img = img, drawid = id,
-                          pdctype = self.overlays[id]['pdcType'], coords = self.overlays[id]['coords'])
+                          pdctype = self.overlays[id].pdcType, coords = self.overlays[id].coords)
         
         for id in self.textdict.keys():
             self.Draw(self.pdc, img = self.textdict[id], drawid = id,
@@ -721,20 +630,11 @@ class BufferedWindow(MapWindow, wx.Window):
         #
         if len(self.polycoords) > 0:
             self.DrawLines(self.pdcTmp)
-        
-        if not self.parent.IsStandalone() and \
-                self.parent.GetLayerManager().georectifying:
-            # -> georectifier (redraw GCPs)
-            if self.parent.toolbars['georect']:
-                coordtype = 'gcpcoord'
-            else:
-                coordtype = 'mapcoord'
-            self.parent.GetLayerManager().georectifying.DrawGCP(coordtype)
             
         if not self.parent.IsStandalone() and \
                 self.parent.GetLayerManager().gcpmanagement:
             # -> georectifier (redraw GCPs)
-            if self.parent.toolbars['gcpdisp']:
+            if self.parent.GetMapToolbar():
                 if self == self.parent.TgtMapWindow:
                     coordtype = 'target'
                 else:
@@ -758,18 +658,13 @@ class BufferedWindow(MapWindow, wx.Window):
         #
         # hide process bar
         #
-        self.parent.statusbarWin['progress'].Hide()
+        self.parent.GetProgressBar().Hide()
 
         #
         # update statusbar 
         #
         ### self.Map.SetRegion()
         self.parent.StatusbarUpdate()
-        if grass.find_file(name = 'MASK', element = 'cell')['name']:
-            # mask found
-            self.parent.statusbarWin['mask'].SetLabel(_('MASK'))
-        else:
-            self.parent.statusbarWin['mask'].SetLabel('')
         
         Debug.msg (1, "BufferedWindow.UpdateMap(): render=%s, renderVector=%s -> time=%g" % \
                    (render, renderVector, (stop-start)))
@@ -872,7 +767,9 @@ class BufferedWindow(MapWindow, wx.Window):
         if type(r2) is list:
             r2 = wx.Rect(r[0], r[1], r[2], r[3])
         if id > 100: # text
-            self.textdict[id]['coords'] = r2
+            self.textdict[id]['bbox'] = r2
+            self.textdict[id]['coords'][0] += dx
+            self.textdict[id]['coords'][1] += dy
         r = r.Union(r2)
         r.Inflate(4,4)
         self.RefreshRect(r, False)
@@ -998,6 +895,25 @@ class BufferedWindow(MapWindow, wx.Window):
         
         return self.lineid
 
+    def _computeZoomToPointAndRecenter(self, position, zoomtype):
+        """!Computes zoom parameters for recenter mode.
+
+        Computes begin and end parameters for Zoom() method.
+        Used for zooming by single click (not box)
+        and mouse wheel zooming (zoom and recenter mode).
+        """
+        if zoomtype > 0:
+            begin = (position[0] - self.Map.width / 4,
+                     position[1] - self.Map.height / 4)
+            end   = (position[0] + self.Map.width / 4,
+                     position[1] + self.Map.height / 4)
+        else:
+            begin = ((self.Map.width - position[0]) / 2,
+                     (self.Map.height - position[1]) / 2)
+            end = (begin[0] + self.Map.width / 2,
+                   begin[1] + self.Map.height / 2)
+        return begin, end
+
     def MouseActions(self, event):
         """!Mouse motion and button click notifier
         """
@@ -1049,21 +965,35 @@ class BufferedWindow(MapWindow, wx.Window):
     def OnMouseWheel(self, event):
         """!Mouse wheel moved
         """
+        zoomBehaviour = UserSettings.Get(group = 'display',
+                                         key = 'mouseWheelZoom',
+                                         subkey = 'selection')
+        if zoomBehaviour == 2:
+            event.Skip()
+            return
+            
         self.processMouse = False
         current  = event.GetPositionTuple()[:]
         wheel = event.GetWheelRotation()
         Debug.msg (5, "BufferedWindow.MouseAction(): wheel=%d" % wheel)
-        # zoom 1/2 of the screen, centered to current mouse position (TODO: settings)
-        begin = (current[0] - self.Map.width / 4,
-                 current[1] - self.Map.height / 4)
-        end   = (current[0] + self.Map.width / 4,
-                 current[1] + self.Map.height / 4)
-        
+
         if wheel > 0:
             zoomtype = 1
         else:
             zoomtype = -1
-        
+        if UserSettings.Get(group = 'display',
+                            key = 'scrollDirection',
+                            subkey = 'selection'):
+            zoomtype *= -1
+        # zoom 1/2 of the screen (TODO: settings)
+        if zoomBehaviour == 0:  # zoom and recenter
+            begin, end = self._computeZoomToPointAndRecenter(position = current, zoomtype = zoomtype)
+
+        elif zoomBehaviour == 1:  # zoom to current cursor position
+            begin = (current[0]/2, current[1]/2)
+            end = ((self.Map.width - current[0])/2 + current[0],
+                   (self.Map.height - current[1])/2 + current[1])
+
         # zoom
         self.Zoom(begin, end, zoomtype)
         
@@ -1131,7 +1061,7 @@ class BufferedWindow(MapWindow, wx.Window):
             else:
                 self.mouse['begin'] = self.mouse['end']
         
-        elif self.mouse['use'] == 'zoom':
+        elif self.mouse['use'] in ('zoom', 'legend'):
             pass
         
         # vector digizer
@@ -1175,12 +1105,7 @@ class BufferedWindow(MapWindow, wx.Window):
                 # set region for click (zero-width box)
                 if begin[0] - end[0] == 0 or \
                         begin[1] - end[1] == 0:
-                    # zoom 1/2 of the screen (TODO: settings)
-                    begin = (end[0] - self.Map.width / 4,
-                             end[1] - self.Map.height / 4)
-                    end   = (end[0] + self.Map.width / 4,
-                             end[1] + self.Map.height / 4)
-            
+                    begin, end = self._computeZoomToPointAndRecenter(position = end, zoomtype = self.zoomtype)
             self.Zoom(begin, end, self.zoomtype)
 
             # redraw map
@@ -1191,30 +1116,15 @@ class BufferedWindow(MapWindow, wx.Window):
             
         elif self.mouse["use"] == "query":
             # querying
-            layers = self.GetSelectedLayer(multi = True)
-            isRaster = False
-            nVectors = 0
-            for l in layers:
-                if l.GetType() == 'raster':
-                    isRaster = True
-                    break
-                if l.GetType() == 'vector':
-                    nVectors += 1
-            
-            if isRaster or nVectors > 1:
-                self.parent.QueryMap(self.mouse['begin'][0],self.mouse['begin'][1])
-            else:
-                self.parent.QueryVector(self.mouse['begin'][0], self.mouse['begin'][1])
-                # clear temp canvas
-                self.UpdateMap(render = False, renderVector = False)
-            
-        elif self.mouse["use"] == "queryVector":
-            # editable mode for vector map layers
-            self.parent.QueryVector(self.mouse['begin'][0], self.mouse['begin'][1])
-            
-            # clear temp canvas
-            self.UpdateMap(render = False, renderVector = False)
-        
+            if self.parent.IsStandalone():
+                GMessage(parent = self.parent,
+                         message = _("Querying is not implemented in standalone mode of Map Display"))
+                return
+
+            layers = self.GetSelectedLayer(type = 'item', multi = True)
+
+            self.parent.Query(self.mouse['begin'][0],self.mouse['begin'][1], layers)
+
         elif self.mouse["use"] in ["measure", "profile"]:
             # measure or profile
             if self.mouse["use"] == "measure":
@@ -1227,7 +1137,7 @@ class BufferedWindow(MapWindow, wx.Window):
         elif self.mouse["use"] == "pointer" and \
                 self.parent.GetLayerManager().gcpmanagement:
             # -> GCP manager
-            if self.parent.toolbars['gcpdisp']:
+            if self.parent.GetToolbar('gcpdisp'):
                 coord = self.Pixel2Cell(self.mouse['end'])
                 if self.parent.MapWindow == self.parent.SrcMapWindow:
                     coordtype = 'source'
@@ -1236,18 +1146,6 @@ class BufferedWindow(MapWindow, wx.Window):
                 
                 self.parent.GetLayerManager().gcpmanagement.SetGCPData(coordtype, coord, self, confirm = True)
                 self.UpdateMap(render = False, renderVector = False)
-        
-        elif self.mouse["use"] == "pointer" and \
-                self.parent.GetLayerManager().georectifying:
-            # -> georectifying
-            coord = self.Pixel2Cell(self.mouse['end'])
-            if self.parent.toolbars['georect']:
-                coordtype = 'gcpcoord'
-            else:
-                coordtype = 'mapcoord'
-            
-            self.parent.GetLayerManager().georectifying.SetGCPData(coordtype, coord, self)
-            self.UpdateMap(render = False, renderVector = False)
             
         elif self.mouse["use"] == "pointer" and \
                 hasattr(self, "digit"):
@@ -1258,14 +1156,24 @@ class BufferedWindow(MapWindow, wx.Window):
             # end drag of overlay decoration
             
             if self.dragid < 99 and self.dragid in self.overlays:
-                self.overlays[self.dragid]['coords'] = self.pdc.GetIdBounds(self.dragid)
+                self.overlays[self.dragid].coords = self.pdc.GetIdBounds(self.dragid)
             elif self.dragid > 100 and self.dragid in self.textdict:
-                self.textdict[self.dragid]['coords'] = self.pdc.GetIdBounds(self.dragid)
+                self.textdict[self.dragid]['bbox'] = self.pdc.GetIdBounds(self.dragid)
             else:
                 pass
             self.dragid = None
             self.currtxtid = None
-        
+            
+        elif self.mouse['use'] == 'legend':
+            self.parent.dialogs['legend'].resizeBtn.SetValue(False)
+            screenSize = self.GetClientSizeTuple()
+            self.overlays[1].ResizeLegend(self.mouse["begin"], self.mouse["end"], screenSize)
+
+            self.parent.MapWindow.SetCursor(self.parent.cursors["default"])
+            self.parent.MapWindow.mouse['use'] = 'pointer'
+            
+            self.UpdateMap()
+
     def OnButtonDClick(self, event):
         """!Mouse button double click
         """
@@ -1297,9 +1205,9 @@ class BufferedWindow(MapWindow, wx.Window):
                 self.currtxtid = self.dragid
                 self.parent.OnAddText(None)
             elif self.dragid == 0:
-                self.parent.OnAddBarscale(None)
+                self.parent.AddBarscale()
             elif self.dragid == 1:
-                self.parent.OnAddLegend(None)
+                self.parent.AddLegend()
         
     def OnRightDown(self, event):
         """!Right mouse button pressed
@@ -1355,7 +1263,7 @@ class BufferedWindow(MapWindow, wx.Window):
         """!Mouse entered window and no mouse buttons were pressed
         """
         if self.parent.GetLayerManager().gcpmanagement:
-            if self.parent.toolbars['gcpdisp']:
+            if self.parent.GetToolbar('gcpdisp'):
                 if not self.parent.MapWindow == self:
                     self.parent.MapWindow = self
                     self.parent.Map = self.Map
@@ -1444,7 +1352,7 @@ class BufferedWindow(MapWindow, wx.Window):
         y = (n - north) / res
         
         return (x, y)
-    
+        
     def Zoom(self, begin, end, zoomtype):
         """!
         Calculates new region while (un)zoom/pan-ing
@@ -1487,11 +1395,9 @@ class BufferedWindow(MapWindow, wx.Window):
         # if new region has been calculated, set the values
         if newreg != {}:
             # LL locations
-            if self.parent.Map.projinfo['proj'] == 'll':
-                if newreg['n'] > 90.0:
-                    newreg['n'] = 90.0
-                if newreg['s'] < -90.0:
-                    newreg['s'] = -90.0
+            if self.Map.projinfo['proj'] == 'll':
+                self.Map.region['n'] = min(self.Map.region['n'], 90.0)
+                self.Map.region['s'] = max(self.Map.region['s'], -90.0)
             
             ce = newreg['w'] + (newreg['e'] - newreg['w']) / 2
             cn = newreg['s'] + (newreg['n'] - newreg['s']) / 2
@@ -1499,9 +1405,14 @@ class BufferedWindow(MapWindow, wx.Window):
             # calculate new center point and display resolution
             self.Map.region['center_easting'] = ce
             self.Map.region['center_northing'] = cn
-            self.Map.region["ewres"] = (newreg['e'] - newreg['w']) / self.Map.width
-            self.Map.region["nsres"] = (newreg['n'] - newreg['s']) / self.Map.height
-            self.Map.AlignExtentFromDisplay()
+            self.Map.region['ewres'] = (newreg['e'] - newreg['w']) / self.Map.width
+            self.Map.region['nsres'] = (newreg['n'] - newreg['s']) / self.Map.height
+            if not self.parent.HasProperty('alignExtent') or \
+                    self.parent.GetProperty('alignExtent'):
+                self.Map.AlignExtentFromDisplay()
+            else:
+                for k in ('n', 's', 'e', 'w'):
+                    self.Map.region[k] = newreg[k]
             
             if hasattr(self, "digit") and \
                     hasattr(self, "moveInfo"):
@@ -1524,14 +1435,8 @@ class BufferedWindow(MapWindow, wx.Window):
         
         # disable tool if stack is empty
         if len(self.zoomhistory) < 2: # disable tool
-            if self.parent.GetName() == 'MapWindow':
-                toolbar = self.parent.toolbars['map']
-            elif self.parent.GetName() == 'GRMapWindow':
-                toolbar = self.parent.toolbars['georect']
-            elif self.parent.GetName() == 'GCPMapWindow':
-                toolbar = self.parent.toolbars['gcpdisp']
-            
-            toolbar.Enable('zoomback', enable = False)
+            toolbar = self.parent.GetMapToolbar()
+            toolbar.Enable('zoomBack', enable = False)
         
         # zoom to selected region
         self.Map.GetRegion(n = zoom[0], s = zoom[1],
@@ -1569,14 +1474,9 @@ class BufferedWindow(MapWindow, wx.Window):
         else:
             enable = False
         
-        if self.parent.GetName() == 'MapWindow':
-            toolbar = self.parent.toolbars['map']
-        elif self.parent.GetName() == 'GRMapWindow':
-            toolbar = self.parent.toolbars['georect']
-        elif self.parent.GetName() == 'GCPMapWindow':
-            toolbar = self.parent.toolbars['gcpdisp']
+        toolbar = self.parent.GetMapToolbar()
         
-        toolbar.Enable('zoomback', enable)
+        toolbar.Enable('zoomBack', enable)
         
         return removed
 
@@ -1658,7 +1558,27 @@ class BufferedWindow(MapWindow, wx.Window):
         self.UpdateMap()
         
         self.parent.StatusbarUpdate()
-        
+    
+    
+    def GoTo(self, e, n):
+        region = self.Map.GetCurrentRegion()
+
+        region['center_easting'], region['center_northing'] = e, n
+        
+        dn = (region['nsres'] * region['rows']) / 2.
+        region['n'] = region['center_northing'] + dn
+        region['s'] = region['center_northing'] - dn
+        de = (region['ewres'] * region['cols']) / 2.
+        region['e'] = region['center_easting'] + de
+        region['w'] = region['center_easting'] - de
+
+        self.Map.AdjustRegion()
+
+        # add to zoom history
+        self.ZoomHistory(region['n'], region['s'],
+                                   region['e'], region['w'])        
+        self.UpdateMap()
+    
     def DisplayToWind(self):
         """!Set computational region (WIND file) to match display
         extents
@@ -1670,15 +1590,15 @@ class BufferedWindow(MapWindow, wx.Window):
         # We ONLY want to set extents here. Don't mess with resolution. Leave that
         # for user to set explicitly with g.region
         new = self.Map.AlignResolution()
-        gcmd.RunCommand('g.region',
-                        parent = self,
-                        overwrite = True,
-                        n = new['n'],
-                        s = new['s'],
-                        e = new['e'],
-                        w = new['w'],
-                        rows = int(new['rows']),
-                        cols = int(new['cols']))
+        RunCommand('g.region',
+                   parent = self,
+                   overwrite = True,
+                   n = new['n'],
+                   s = new['s'],
+                   e = new['e'],
+                   w = new['w'],
+                   rows = int(new['rows']),
+                   cols = int(new['cols']))
         
         if tmpreg:
             os.environ["GRASS_REGION"] = tmpreg
@@ -1687,9 +1607,9 @@ class BufferedWindow(MapWindow, wx.Window):
         """!Set display geometry to match extents in
         saved region file
         """
-        dlg = gdialogs.SavedRegion(parent = self,
-                                   title = _("Zoom to saved region extents"),
-                                   loadsave='load')
+        dlg = SavedRegion(parent = self,
+                          title = _("Zoom to saved region extents"),
+                          loadsave='load')
         
         if dlg.ShowModal() == wx.ID_CANCEL or not dlg.wind:
             dlg.Destroy()
@@ -1717,9 +1637,9 @@ class BufferedWindow(MapWindow, wx.Window):
     def SaveDisplayRegion(self):
         """!Save display extents to named region file.
         """
-        dlg = gdialogs.SavedRegion(parent = self,
-                                   title = _("Save display extents to region file"),
-                                   loadsave='save')
+        dlg = SavedRegion(parent = self,
+                          title = _("Save display extents to region file"),
+                          loadsave='save')
         
         if dlg.ShowModal() == wx.ID_CANCEL or not dlg.wind:
             dlg.Destroy()
@@ -1749,17 +1669,17 @@ class BufferedWindow(MapWindow, wx.Window):
         if tmpreg:
             del os.environ["GRASS_REGION"]
         
-        gcmd.RunCommand('g.region',
-                        overwrite = True,
-                        parent = self,
-                        flags = 'u',
-                        n = new['n'],
-                        s = new['s'],
-                        e = new['e'],
-                        w = new['w'],
-                        rows = int(new['rows']),
-                        cols = int(new['cols']),
-                        save = wind)
+        RunCommand('g.region',
+                   overwrite = True,
+                   parent = self,
+                   flags = 'u',
+                   n = new['n'],
+                   s = new['s'],
+                   e = new['e'],
+                   w = new['w'],
+                   rows = int(new['rows']),
+                   cols = int(new['cols']),
+                   save = wind)
         
         if tmpreg:
             os.environ["GRASS_REGION"] = tmpreg
diff --git a/gui/wxpython/mapdisp/overlays.py b/gui/wxpython/mapdisp/overlays.py
new file mode 100644
index 0000000..3dbf9b5
--- /dev/null
+++ b/gui/wxpython/mapdisp/overlays.py
@@ -0,0 +1,154 @@
+"""!
+ at package mapdisp.overlays
+
+ at brief Map display overlays - barscale and legend
+
+Classes:
+ - overlays::OverlayController
+ - overlays::BarscaleController
+ - overlays::LegendController
+
+(C) 2006-2013 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Anna Kratochvilova <kratochanna gmail.com>
+"""
+
+class OverlayController(object):
+    """!Base class for decorations (barscale, legend) controller."""
+    def __init__(self, renderer):
+        self._renderer = renderer
+        self._overlay = None
+        self._coords = [0, 0]
+        self._pdcType = 'image'
+        self._propwin = None
+        self._defaultAt = ''
+
+    def SetCmd(self, cmd):
+        hasAt = False
+        for i in cmd:
+            if i.startswith("at="):
+                hasAt = True
+                break
+        if not hasAt:
+            cmd.append(self._defaultAt)
+        self._cmd = cmd
+
+    def GetCmd(self):
+        return self._cmd
+
+    cmd = property(fset = SetCmd, fget = GetCmd)
+
+    def SetCoords(self, coords):
+        self._coords = list(coords)
+
+    def GetCoords(self):
+        return self._coords
+
+    coords = property(fset = SetCoords, fget = GetCoords)
+
+    def GetPdcType(self):
+        return self._pdcType
+
+    pdcType = property(fget = GetPdcType)
+
+    def GetName(self):
+        return self._name
+
+    name = property(fget = GetName)
+
+    def GetId(self):
+        return self._id
+
+    id = property(fget = GetId)
+
+    def GetPropwin(self):
+        return self._propwin
+
+    def SetPropwin(self, win):
+        self._propwin = win
+
+    propwin = property(fget = GetPropwin, fset = SetPropwin)
+
+    def GetLayer(self):
+        return self._overlay
+
+    layer = property(fget = GetLayer)
+
+    def IsShown(self):
+        if self._overlay and self._overlay.IsActive():
+            return True
+        return False
+
+    def Show(self, show = True):
+        """!Activate or deactivate overlay."""
+        if show:
+            if not self._overlay:
+                self._add()
+            self._overlay.SetActive(True)
+            self._update()
+        else:
+            self.Hide()
+
+
+    def Hide(self):
+        if self._overlay:
+            self._overlay.SetActive(False)
+
+    def _add(self):
+        self._overlay = self._renderer.AddOverlay(id = self._id, type = self._name,
+                                                  command = self.cmd, l_active = False,
+                                                  l_render = False, l_hidden = True)
+        # check if successfull
+
+    def _update(self):
+        self._renderer.ChangeOverlay(id = self._id, command = self._cmd,
+                                     render = False)
+
+
+class BarscaleController(OverlayController):
+    def __init__(self, renderer):
+        OverlayController.__init__(self, renderer)
+        self._id = 0
+        self._name = 'barscale'
+        self._defaultAt = 'at=0,95'
+        self._cmd = ['d.barscale', self._defaultAt]
+
+
+class LegendController(OverlayController):
+    def __init__(self, renderer):
+        OverlayController.__init__(self, renderer)
+        self._id = 1
+        self._name = 'legend'
+        # TODO: synchronize with d.legend?
+        self._defaultAt = 'at=5,50,2,5'
+        self._cmd = ['d.legend', self._defaultAt]
+
+    def ResizeLegend(self, begin, end, screenSize):
+        """!Resize legend according to given bbox coordinates."""
+        w = abs(begin[0] - end[0])
+        h = abs(begin[1] - end[1])
+        if begin[0] < end[0]:
+            x = begin[0]
+        else:
+            x = end[0]
+        if begin[1] < end[1]:
+            y = begin[1]
+        else:
+            y = end[1]
+        
+        at = [(screenSize[1] - (y + h)) / float(screenSize[1]) * 100,
+              (screenSize[1] - y) / float(screenSize[1]) * 100,
+              x / float(screenSize[0]) * 100,
+              (x + w) / float(screenSize[0]) * 100]
+        atStr = "at=%d,%d,%d,%d" % (at[0], at[1], at[2], at[3])
+
+        for i, subcmd in enumerate(self._cmd):
+            if subcmd.startswith('at='):
+                self._cmd[i] = atStr
+                break
+
+        self._coords = [0, 0]
+        self.Show()
diff --git a/gui/wxpython/mapdisp/statusbar.py b/gui/wxpython/mapdisp/statusbar.py
new file mode 100644
index 0000000..aad9c3a
--- /dev/null
+++ b/gui/wxpython/mapdisp/statusbar.py
@@ -0,0 +1,1062 @@
+"""!
+ at package mapdisp.statusbar
+
+ at brief Classes for statusbar management
+
+Classes:
+ - statusbar::SbException
+ - statusbar::SbManager
+ - statusbar::SbItem
+ - statusbar::SbRender
+ - statusbar::SbShowRegion
+ - statusbar::SbAlignExtent
+ - statusbar::SbResolution
+ - statusbar::SbMapScale
+ - statusbar::SbGoTo
+ - statusbar::SbProjection
+ - statusbar::SbMask
+ - statusbar::SbTextItem
+ - statusbar::SbDisplayGeometry
+ - statusbar::SbCoordinates
+ - statusbar::SbRegionExtent
+ - statusbar::SbCompRegionExtent
+ - statusbar::SbProgress
+
+(C) 2006-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Vaclav Petras <wenzeslaus gmail.com>
+ at author Anna Kratochvilova <kratochanna gmail.com>
+"""
+
+import wx
+
+from core          import utils
+from core.gcmd     import GMessage, RunCommand
+from core.settings import UserSettings
+
+from grass.script  import core as grass
+
+class SbException:
+    """! Exception class used in SbManager and SbItems"""
+    def __init__(self, message):
+        self.message = message
+    def __str__(self):
+        return self.message
+
+
+class SbManager:
+    """!Statusbar manager for wx.Statusbar and SbItems.
+    
+    Statusbar manager manages items added by AddStatusbarItem method.
+    Provides progress bar (SbProgress) and choice (wx.Choice).
+    Items with position 0 are shown according to choice selection.
+    Only one item of the same class is supposed to be in statusbar.
+    Manager user have to create statusbar on his own, add items to manager
+    and call Update method to show particular widgets.
+    User settings (group = 'display', key = 'statusbarMode', subkey = 'selection')
+    are taken into account.
+    
+    @todo generalize access to UserSettings (specify group, etc.) 
+    @todo add GetMode method using name instead of index
+    """
+    def __init__(self, mapframe, statusbar):
+        """!Connects manager to statusbar
+        
+        Creates choice and progress bar.
+        """
+        self.mapFrame = mapframe
+        self.statusbar = statusbar
+        
+        self.choice = wx.Choice(self.statusbar, wx.ID_ANY)
+        
+        self.choice.Bind(wx.EVT_CHOICE, self.OnToggleStatus)
+        
+        self.statusbarItems = dict()
+        
+        self._postInitialized = False
+        
+        self.progressbar = SbProgress(self.mapFrame, self.statusbar)
+        
+        self._hiddenItems = {}
+    
+    def SetProperty(self, name, value):
+        """!Sets property represented by one of contained SbItems
+            
+        @param name name of SbItem (from name attribute)
+        @param value value to be set
+        """
+        self.statusbarItems[name].SetValue(value)
+        
+    def GetProperty(self, name):
+        """!Returns property represented by one of contained SbItems
+        
+        @param name name of SbItem (from name attribute)
+        """
+        return self.statusbarItems[name].GetValue()
+        
+    def HasProperty(self, name):
+        """!Checks whether property is represented by one of contained SbItems
+        
+        @param name name of SbItem (from name attribute)
+        
+        @returns True if particular SbItem is contained, False otherwise
+        """
+        if name in self.statusbarItems:
+            return True
+        return False
+    
+    def AddStatusbarItem(self, item):
+        """!Adds item to statusbar
+        
+        If item position is 0, item is managed by choice.
+        
+        @see AddStatusbarItemsByClass
+        """
+        self.statusbarItems[item.name] = item
+        if item.GetPosition() == 0:
+            self.choice.Append(item.label, clientData = item) #attrError?
+            
+    def AddStatusbarItemsByClass(self, itemClasses, **kwargs):
+        """!Adds items to statusbar
+
+        @param itemClasses list of classes of items to be add
+        @param kwargs SbItem constructor parameters
+        
+        @see AddStatusbarItem
+        """
+        for Item in itemClasses:
+            item = Item(**kwargs)
+            self.AddStatusbarItem(item)
+                      
+    def HideStatusbarChoiceItemsByClass(self, itemClasses):
+        """!Hides items showed in choice
+        
+        Hides items with position 0 (items showed in choice) by removing
+        them from choice.
+        
+        @param itemClasses list of classes of items to be hided
+        
+        @see ShowStatusbarChoiceItemsByClass
+        @todo consider adding similar function which would take item names
+        """
+        index = []
+        for itemClass in itemClasses:
+            for i in range(0, self.choice.GetCount() - 1):
+                item = self.choice.GetClientData(i)
+                if item.__class__ == itemClass:
+                    index.append(i)
+                    self._hiddenItems[i] = item
+        # must be sorted in reverse order to be removed correctly
+        for i in sorted(index, reverse = True):
+            self.choice.Delete(i)
+        
+    def ShowStatusbarChoiceItemsByClass(self, itemClasses):
+        """!Shows items showed in choice
+        
+        Shows items with position 0 (items showed in choice) by adding
+        them to choice.
+        Items are restored in their old positions.
+        
+        @param itemClasses list of classes of items to be showed
+        
+        @see HideStatusbarChoiceItemsByClass
+        """
+        # must be sorted to be inserted correctly
+        for pos in sorted(self._hiddenItems.keys()):
+            item = self._hiddenItems[pos]
+            if item.__class__ in itemClasses:
+                self.choice.Insert(item.label, pos, item)
+        
+    def ShowItem(self, itemName):
+        """!Invokes showing of particular item
+        
+        @see Update
+        """
+        self.statusbarItems[itemName].Show()
+        
+    def _postInit(self):
+        """!Post-initialization method
+        
+        It sets internal user settings,
+        set choice's selection (from user settings) and does reposition.
+        It needs choice filled by items.
+        it is called automatically.
+        """
+        UserSettings.Set(group = 'display',
+                         key = 'statusbarMode',
+                         subkey = 'choices',
+                         value = self.choice.GetItems(),
+                         internal = True)
+        
+        self.choice.SetSelection(UserSettings.Get(group = 'display',
+                                                  key = 'statusbarMode',
+                                                  subkey = 'selection')) 
+        self.Reposition()
+        
+        self._postInitialized = True
+        
+    def Update(self):
+        """!Updates statusbar
+
+        It always updates mask.
+        """
+        if not self._postInitialized:
+            self._postInit()
+        
+        for item in self.statusbarItems.values():
+            if item.GetPosition() == 0:
+                item.Hide()
+            else:
+                item.Update() # mask, render
+        
+        if self.choice.GetCount() > 0:
+            item = self.choice.GetClientData(self.choice.GetSelection())
+            item.Update()
+        
+    def Reposition(self):
+        """!Reposition items in statusbar
+        
+        Set positions to all items managed by statusbar manager.
+        It should not be necessary to call it manually.
+        """
+        
+        widgets = []
+        for item in self.statusbarItems.values():
+            widgets.append((item.GetPosition(), item.GetWidget()))
+            
+        widgets.append((1, self.choice))
+        widgets.append((0, self.progressbar.GetWidget()))
+                
+        for idx, win in widgets:
+            if not win:
+                continue
+            rect = self.statusbar.GetFieldRect(idx)
+            if idx == 0: # show region / mapscale / process bar
+                # -> size
+                wWin, hWin = win.GetBestSize()
+                if win == self.progressbar.GetWidget():
+                    wWin = rect.width - 6
+                # -> position
+                # if win == self.statusbarWin['region']:
+                # x, y = rect.x + rect.width - wWin, rect.y - 1
+                # align left
+                # else:
+                x, y = rect.x + 3, rect.y - 1
+                w, h = wWin, rect.height + 2
+            else: # choice || auto-rendering
+                x, y = rect.x, rect.y - 1
+                w, h = rect.width, rect.height + 2
+                if idx == 2: # mask
+                    x += 5
+                    y += 4
+                elif idx == 3: # render
+                    x += 5
+            win.SetPosition((x, y))
+            win.SetSize((w, h))
+        
+    def GetProgressBar(self):
+        """!Returns progress bar"""
+        return self.progressbar
+    
+    def OnToggleStatus(self, event):
+        """!Toggle status text
+        """
+        self.Update()
+        
+    def SetMode(self, modeIndex):
+        """!Sets current mode
+        
+        Mode is usually driven by user through choice.
+        """
+        self.choice.SetSelection(modeIndex)
+    
+    def GetMode(self):
+        """!Returns current mode"""
+        return self.choice.GetSelection()
+
+class SbItem:
+    """!Base class for statusbar items.
+    
+    Each item represents functionality (or action) controlled by statusbar
+    and related to MapFrame.
+    One item is usually connected with one widget but it is not necessary.
+    Item can represent property (depends on manager).
+    Items are not widgets but can provide interface to them.
+    Items usually has requirements to MapFrame instance
+    (specified as MapFrame.methodname or MapWindow.methodname).
+    
+    @todo consider externalizing position (see SbProgress use in SbManager)
+    """
+    def __init__(self, mapframe, statusbar, position = 0):
+        """!
+        
+        @param mapframe instance of class with MapFrame interface
+        @param statusbar statusbar instance (wx.Statusbar)
+        @param position item position in statusbar
+        
+        @todo rewrite Update also in derived classes to take in account item position
+        """
+        self.mapFrame = mapframe
+        self.statusbar = statusbar
+        self.position = position
+    
+    def Show(self):
+        """!Invokes showing of underlying widget.
+        
+        In derived classes it can do what is appropriate for it,
+        e.g. showing text on statusbar (only).
+        """
+        self.widget.Show()
+        
+    def Hide(self):
+        self.widget.Hide()
+        
+    def SetValue(self, value):
+        self.widget.SetValue(value)
+    
+    def GetValue(self):
+        return self.widget.GetValue()
+        
+    def GetPosition(self):
+        return self.position
+    
+    def GetWidget(self):
+        """!Returns underlaying winget.
+        
+        @return widget or None if doesn't exist
+        """
+        return self.widget
+    
+    def _update(self, longHelp):
+        """!Default implementation for Update method.
+        
+        @param longHelp True to enable long help (help from toolbars)
+        """
+        self.statusbar.SetStatusText("", 0)
+        self.Show()
+        self.mapFrame.StatusbarEnableLongHelp(longHelp)
+        
+    def Update(self):
+        """!Called when statusbar action is activated (e.g. through wx.Choice).
+        """
+        self._update(longHelp = False)
+
+class SbRender(SbItem):
+    """!Checkbox to enable and disable auto-rendering.
+    
+    Requires MapFrame.OnRender method.
+    """
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'render'
+        
+        self.widget = wx.CheckBox(parent = self.statusbar, id = wx.ID_ANY,
+                                  label = _("Render"))
+        
+        self.widget.SetValue(UserSettings.Get(group = 'display',
+                                              key = 'autoRendering',
+                                              subkey = 'enabled'))
+        self.widget.Hide()
+        self.widget.SetToolTip(wx.ToolTip (_("Enable/disable auto-rendering")))
+                                            
+        self.widget.Bind(wx.EVT_CHECKBOX, self.OnToggleRender)
+        
+    def OnToggleRender(self, event):
+        # (other items should call self.mapFrame.IsAutoRendered())
+        if self.GetValue():
+            self.mapFrame.OnRender(None)
+
+    def Update(self):
+        self.Show()
+        
+class SbShowRegion(SbItem):
+    """!Checkbox to enable and disable showing of computational region.
+    
+    Requires MapFrame.OnRender, MapFrame.IsAutoRendered, MapFrame.GetWindow.
+    Expects that instance returned by MapFrame.GetWindow will handle
+    regionCoords attribute. 
+    """
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'region'
+        self.label = _("Show comp. extent")
+        
+        self.widget = wx.CheckBox(parent = self.statusbar, id = wx.ID_ANY,
+                                  label = _("Show computational extent"))
+        
+        self.widget.SetValue(False)
+        self.widget.Hide()
+        self.widget.SetToolTip(wx.ToolTip (_("Show/hide computational "
+                                             "region extent (set with g.region). "
+                                             "Display region drawn as a blue box inside the "
+                                             "computational region, "
+                                             "computational region inside a display region "
+                                             "as a red box).")))
+                                            
+        self.widget.Bind(wx.EVT_CHECKBOX, self.OnToggleShowRegion)
+    
+    def OnToggleShowRegion(self, event):
+        """!Shows/Hides extent (comp. region) in map canvas.
+        
+        Shows or hides according to checkbox value.
+        """
+        if self.widget.GetValue():
+            # show extent
+            self.mapFrame.GetWindow().regionCoords = []
+        elif hasattr(self.mapFrame.GetWindow(), 'regionCoords'):
+            del self.mapFrame.GetWindow().regionCoords
+
+        # redraw map if auto-rendering is enabled
+        if self.mapFrame.IsAutoRendered():
+            self.mapFrame.OnRender(None)
+
+    def SetValue(self, value):
+        SbItem.SetValue(self, value)
+        if value:
+            self.mapFrame.GetWindow().regionCoords = []
+        elif hasattr(self.mapFrame.GetWindow(), 'regionCoords'):
+            del self.mapFrame.GetWindow().regionCoords
+            
+class SbAlignExtent(SbItem):
+    """!Checkbox to select zoom behavior.
+    
+    Used by BufferedWindow (through MapFrame property).
+    See tooltip for explanation.
+    """
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'alignExtent'
+        self.label = _("Display mode")
+        
+        self.widget = wx.CheckBox(parent = self.statusbar, id = wx.ID_ANY,
+                                  label = _("Align region extent based on display size"))
+        
+        self.widget.SetValue(UserSettings.Get(group = 'display', key = 'alignExtent', subkey = 'enabled'))
+        self.widget.Hide()
+        self.widget.SetToolTip(wx.ToolTip (_("Align region extent based on display "
+                                             "size from center point. "
+                                             "Default value for new map displays can "
+                                             "be set up in 'User GUI settings' dialog.")))      
+        
+class SbResolution(SbItem):
+    """!Checkbox to select used display resolution.
+    
+    Requires MapFrame.OnRender method. 
+    """
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'resolution'
+        self.label = _("Display resolution")
+        
+        self.widget = wx.CheckBox(parent = self.statusbar, id = wx.ID_ANY,
+                                  label = _("Constrain display resolution to computational settings"))
+        
+        self.widget.SetValue(UserSettings.Get(group = 'display', key = 'compResolution', subkey = 'enabled'))
+        self.widget.Hide()
+        self.widget.SetToolTip(wx.ToolTip (_("Constrain display resolution "
+                                             "to computational region settings. "
+                                             "Default value for new map displays can "
+                                             "be set up in 'User GUI settings' dialog.")))
+                                            
+        self.widget.Bind(wx.EVT_CHECKBOX, self.OnToggleUpdateMap)
+        
+    def OnToggleUpdateMap(self, event):
+        """!Update display when toggle display mode
+        """
+        # redraw map if auto-rendering is enabled
+        if self.mapFrame.IsAutoRendered():
+            self.mapFrame.OnRender(None)
+
+
+class SbMapScale(SbItem):
+    """!Editable combobox to get/set current map scale.
+    
+    Requires MapFrame.GetMapScale, MapFrame.SetMapScale
+    and MapFrame.GetWindow (and GetWindow().UpdateMap()).
+    """
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'mapscale'
+        self.label = _("Map scale")
+        
+        self.widget = wx.ComboBox(parent = self.statusbar, id = wx.ID_ANY,
+                                                    style = wx.TE_PROCESS_ENTER,
+                                                    size = (150, -1))
+        
+        self.widget.SetItems(['1:1000',
+                              '1:5000',
+                              '1:10000',
+                              '1:25000',
+                              '1:50000',
+                              '1:100000',
+                              '1:1000000'])
+        self.widget.Hide()
+        self.widget.SetToolTip(wx.ToolTip (_("As everyone's monitors and resolutions "
+                                            "are set differently these values are not "
+                                            "true map scales, but should get you into "
+                                            "the right neighborhood.")))
+                                            
+        self.widget.Bind(wx.EVT_TEXT_ENTER, self.OnChangeMapScale)
+        self.widget.Bind(wx.EVT_COMBOBOX, self.OnChangeMapScale)
+        
+        self.lastMapScale = None
+
+    def Update(self):
+        scale = self.mapFrame.GetMapScale()
+        self.statusbar.SetStatusText("")
+        try:
+            self.SetValue("1:%ld" % (scale + 0.5))
+        except TypeError:
+            pass # FIXME, why this should happen?
+        
+        self.lastMapScale = scale
+        self.Show()
+
+        # disable long help
+        self.mapFrame.StatusbarEnableLongHelp(False)
+
+    def OnChangeMapScale(self, event):
+        """!Map scale changed by user
+        """
+        scale = event.GetString()
+
+        try:
+            if scale[:2] != '1:':
+                raise ValueError
+            value = int(scale[2:])
+        except ValueError:
+            self.SetValue('1:%ld' % int(self.lastMapScale))
+            return
+        
+        self.mapFrame.SetMapScale(value)
+        
+        # redraw a map
+        self.mapFrame.GetWindow().UpdateMap()
+        self.GetWidget().SetFocus()
+        
+        
+class SbGoTo(SbItem):
+    """!Textctrl to set coordinates which to focus on.
+    
+    Requires MapFrame.GetWindow, MapWindow.GoTo method.
+    """
+    
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'goto'
+        self.label = _("Go to")
+        
+        self.widget = wx.TextCtrl(parent = self.statusbar, id = wx.ID_ANY,
+                                                value = "", style = wx.TE_PROCESS_ENTER,
+                                                size = (300, -1))
+        
+        self.widget.Hide()
+        
+        self.widget.Bind(wx.EVT_TEXT_ENTER, self.OnGoTo)
+    
+    def ReprojectENToMap(self, e, n, useDefinedProjection):
+        """!Reproject east, north from user defined projection
+        
+        @param e,n coordinate (for DMS string, else float or string)
+        @param useDefinedProjection projection defined by user in settings dialog
+        
+        @throws SbException if useDefinedProjection is True and projection is not defined in UserSettings
+        """
+        if useDefinedProjection:
+            settings = UserSettings.Get(group = 'projection', key = 'statusbar', subkey = 'proj4')
+            if not settings:
+                raise SbException(_("Projection not defined (check the settings)"))
+            else:
+                # reproject values
+                projIn = settings
+                projOut = RunCommand('g.proj',
+                                     flags = 'jf',
+                                     read = True)
+                proj = projIn.split(' ')[0].split('=')[1]
+                if proj in ('ll', 'latlong', 'longlat'):
+                    e, n = utils.DMS2Deg(e, n)
+                    proj, coord1 = utils.ReprojectCoordinates(coord = (e, n),
+                                                              projIn = projIn,
+                                                              projOut = projOut, flags = 'd')
+                    e, n = coord1
+                else:
+                    e, n = float(e), float(n)
+                    proj, coord1 = utils.ReprojectCoordinates(coord = (e, n),
+                                                              projIn = projIn,
+                                                              projOut = projOut, flags = 'd')
+                    e, n = coord1
+        elif self.mapFrame.GetMap().projinfo['proj'] == 'll':
+            e, n = utils.DMS2Deg(e, n)
+        else: 
+            e, n = float(e), float(n)
+        return e, n
+
+    def OnGoTo(self, event):
+        """!Go to position
+        """
+        try:
+            e, n = self.GetValue().split(';')
+            e, n = self.ReprojectENToMap(e, n, self.mapFrame.GetProperty('projection'))
+            self.mapFrame.GetWindow().GoTo(e, n)
+            self.widget.SetFocus()
+        except ValueError:
+            # FIXME: move this code to MapWindow/BufferedWindow/MapFrame
+            region = self.mapFrame.GetMap().GetCurrentRegion()
+            precision = int(UserSettings.Get(group = 'projection', key = 'format',
+                                             subkey = 'precision'))
+            format = UserSettings.Get(group = 'projection', key = 'format',
+                                      subkey = 'll')
+            if self.mapFrame.GetMap().projinfo['proj'] == 'll' and format == 'DMS':
+                    self.SetValue("%s" % utils.Deg2DMS(region['center_easting'], 
+                                                                            region['center_northing'],
+                                                                            precision = precision))
+            else:
+                self.SetValue("%.*f; %.*f" % \
+                               (precision, region['center_easting'],
+                                precision, region['center_northing']))
+        except SbException, e:
+            # FIXME: this may be useless since statusbar update checks user defined projection and this exception raises when user def proj does not exists
+            self.statusbar.SetStatusText(str(e), 0)
+
+    def GetCenterString(self, map):
+        """!Get current map center in appropriate format"""
+        region = map.GetCurrentRegion()
+        precision = int(UserSettings.Get(group = 'projection', key = 'format',
+                                         subkey = 'precision'))
+        format = UserSettings.Get(group = 'projection', key = 'format',
+                                  subkey = 'll')
+        projection = UserSettings.Get(group='projection', key='statusbar', subkey='proj4')
+        
+        if self.mapFrame.GetProperty('projection'):
+            if not projection:
+                raise SbException(_("Projection not defined (check the settings)"))
+            else:
+                proj, coord  = utils.ReprojectCoordinates(coord = (region['center_easting'],
+                                                                   region['center_northing']),
+                                                          projOut = projection,
+                                                          flags = 'd')
+                if coord:
+                    if proj in ('ll', 'latlong', 'longlat') and format == 'DMS':
+                        return "%s" % utils.Deg2DMS(coord[0],
+                                                                                coord[1],
+                                                                                precision = precision)
+                    else:
+                        return "%.*f; %.*f" % (precision, coord[0], precision, coord[1])
+                else:
+                    raise SbException(_("Error in projection (check the settings)"))
+        else:
+            if self.mapFrame.GetMap().projinfo['proj'] == 'll' and format == 'DMS':
+                return "%s" % utils.Deg2DMS(region['center_easting'], region['center_northing'],
+                                                                      precision = precision)
+            else:
+                return "%.*f; %.*f" % (precision, region['center_easting'], precision, region['center_northing'])
+
+
+    def SetCenter(self):
+        """!Set current map center as item value"""
+        center = self.GetCenterString(self.mapFrame.GetMap())
+        self.SetValue(center)
+        
+    def Update(self):
+        self.statusbar.SetStatusText("")
+        
+        try:
+            self.SetCenter()
+            self.Show()
+        except SbException, e:
+            self.statusbar.SetStatusText(str(e), 0)
+                        
+        # disable long help
+        self.mapFrame.StatusbarEnableLongHelp(False)
+        
+
+class SbProjection(SbItem):
+    """!Checkbox to enable user defined projection (can be set in settings)"""
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'projection'
+        self.label = _("Projection")
+        
+        self.defaultLabel = _("Use defined projection")
+        
+        self.widget = wx.CheckBox(parent = self.statusbar, id = wx.ID_ANY,
+                                  label = self.defaultLabel)
+        
+        self.widget.SetValue(False)
+        
+        # necessary?
+        size = self.widget.GetSize()
+        self.widget.SetMinSize((size[0] + 150, size[1]))
+        
+        self.widget.Hide()
+        self.widget.SetToolTip(wx.ToolTip (_("Reproject coordinates displayed "
+                                             "in the statusbar. Projection can be "
+                                             "defined in GUI preferences dialog "
+                                             "(tab 'Projection')")))
+                                            
+    def Update(self):
+        self.statusbar.SetStatusText("")
+        epsg = UserSettings.Get(group = 'projection', key = 'statusbar', subkey = 'epsg')
+        if epsg:
+            label = '%s (EPSG: %s)' % (self.defaultLabel, epsg)
+            self.widget.SetLabel(label)
+        else:
+            self.widget.SetLabel(self.defaultLabel)
+        self.Show()
+        
+        # disable long help
+        self.mapFrame.StatusbarEnableLongHelp(False)
+        
+
+class SbMask(SbItem):
+    """!StaticText to show whether mask is activated."""
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'mask'
+        
+        self.widget = wx.StaticText(parent = self.statusbar, id = wx.ID_ANY, label = _('MASK'))
+        self.widget.SetForegroundColour(wx.Colour(255, 0, 0))
+        self.widget.Hide()
+        
+    def Update(self):
+        if grass.find_file(name = 'MASK', element = 'cell',
+                           mapset = grass.gisenv()['MAPSET'])['name']:
+            self.Show()
+        else:
+            self.Hide()
+        
+class SbTextItem(SbItem):
+    """!Base class for items without widgets.
+    
+    Only sets statusbar text.
+    """
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        
+        self.text = None
+        
+    def Show(self):
+        self.statusbar.SetStatusText(self.GetValue(), self.position)
+        
+    def Hide(self):
+        self.statusbar.SetStatusText("", self.position)
+        
+    def SetValue(self, value):
+        self.text = value
+    
+    def GetValue(self):
+        return self.text
+            
+    def GetWidget(self):
+        return None
+    
+    def Update(self):
+        self._update(longHelp = True)
+
+class SbDisplayGeometry(SbTextItem):
+    """!Show current display resolution."""
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbTextItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'displayGeometry'
+        self.label = _("Display geometry")
+        
+    def Show(self):
+        region = self.mapFrame.GetMap().GetCurrentRegion()
+        self.SetValue("rows=%d; cols=%d; nsres=%.2f; ewres=%.2f" %
+                     (region["rows"], region["cols"],
+                      region["nsres"], region["ewres"]))
+        SbTextItem.Show(self)
+
+class SbCoordinates(SbTextItem):
+    """!Show map coordinates when mouse moves.
+    
+    Requires MapWindow.GetLastEN method."""
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbTextItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'coordinates'
+        self.label = _("Coordinates")
+        
+    def Show(self):
+        precision = int(UserSettings.Get(group = 'projection', key = 'format',
+                             subkey = 'precision'))
+        format = UserSettings.Get(group = 'projection', key = 'format',
+                                       subkey = 'll')
+        projection = self.mapFrame.GetProperty('projection')
+        try:
+            e, n = self.mapFrame.GetWindow().GetLastEN()
+            self.SetValue(self.ReprojectENFromMap(e, n, projection, precision, format))
+        except SbException, e:
+            self.SetValue(e)
+        except TypeError, e:
+            self.SetValue("")
+        except AttributeError:
+            self.SetValue("") # during initialization MapFrame has no MapWindow
+        SbTextItem.Show(self)
+        
+    def ReprojectENFromMap(self, e, n, useDefinedProjection, precision, format):
+        """!Reproject east, north to user defined projection.
+        
+        @param e,n coordinate
+        
+        @throws SbException if useDefinedProjection is True and projection is not defined in UserSettings
+        """
+        if useDefinedProjection:
+            settings = UserSettings.Get(group = 'projection', key = 'statusbar', subkey = 'proj4')
+            if not settings:
+                raise SbException(_("Projection not defined (check the settings)"))
+            else:
+                # reproject values
+                proj, coord  = utils.ReprojectCoordinates(coord = (e, n),
+                                                          projOut = settings,
+                                                          flags = 'd')
+                if coord:
+                    e, n = coord
+                    if proj in ('ll', 'latlong', 'longlat') and format == 'DMS':
+                        return utils.Deg2DMS(e, n, precision = precision)
+                    else:
+                        return "%.*f; %.*f" % (precision, e, precision, n)
+                else:
+                    raise SbException(_("Error in projection (check the settings)"))
+        else:
+            if self.mapFrame.GetMap().projinfo['proj'] == 'll' and format == 'DMS':
+                return utils.Deg2DMS(e, n, precision = precision)
+            else:
+                return "%.*f; %.*f" % (precision, e, precision, n)
+        
+class SbRegionExtent(SbTextItem):
+    """!Shows current display region"""
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbTextItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'displayRegion'
+        self.label = _("Extent")
+        
+    def Show(self):
+        precision = int(UserSettings.Get(group = 'projection', key = 'format',
+                             subkey = 'precision'))
+        format = UserSettings.Get(group = 'projection', key = 'format',
+                                       subkey = 'll')
+        projection = self.mapFrame.GetProperty('projection')        
+        region = self._getRegion()
+        try:
+            regionReprojected = self.ReprojectRegionFromMap(region, projection, precision, format)
+            self.SetValue(regionReprojected)
+        except SbException, e:
+            self.SetValue(e)
+        SbTextItem.Show(self)
+    
+    def _getRegion(self):
+        """!Get current display region"""
+        return self.mapFrame.GetMap().GetCurrentRegion() # display region
+        
+    def _formatRegion(self, w, e, s, n, nsres, ewres, precision = None):
+        """!Format display region string for statusbar
+
+        @param nsres,ewres unused
+        """
+        if precision is not None:
+            return "%.*f - %.*f, %.*f - %.*f" % (precision, w, precision, e,
+                                                 precision, s, precision, n)
+        else:
+            return "%s - %s, %s - %s" % (w, e, s, n)
+         
+           
+    def ReprojectRegionFromMap(self, region, useDefinedProjection, precision, format):
+        """!Reproject region values
+        
+        @todo reorganize this method to remove code useful only for derived class SbCompRegionExtent
+        """
+        if useDefinedProjection:
+            settings = UserSettings.Get(group = 'projection', key = 'statusbar', subkey = 'proj4')
+            
+            if not settings:
+                raise SbException(_("Projection not defined (check the settings)"))
+            else:
+                projOut = settings
+                proj, coord1 = utils.ReprojectCoordinates(coord = (region["w"], region["s"]),
+                                                          projOut = projOut, flags = 'd')
+                proj, coord2 = utils.ReprojectCoordinates(coord = (region["e"], region["n"]),
+                                                          projOut = projOut, flags = 'd')
+                # useless, used in derived class
+                proj, coord3 = utils.ReprojectCoordinates(coord = (0.0, 0.0),
+                                                          projOut = projOut, flags = 'd')
+                proj, coord4 = utils.ReprojectCoordinates(coord = (region["ewres"], region["nsres"]),
+                                                          projOut = projOut, flags = 'd')
+                if coord1 and coord2:
+                    if proj in ('ll', 'latlong', 'longlat') and format == 'DMS':
+                        w, s = utils.Deg2DMS(coord1[0], coord1[1], string = False,
+                                             precision = precision)
+                        e, n = utils.Deg2DMS(coord2[0], coord2[1], string = False,
+                                             precision = precision)
+                        ewres, nsres = utils.Deg2DMS(abs(coord3[0]) - abs(coord4[0]),
+                                                         abs(coord3[1]) - abs(coord4[1]),
+                                                         string = False, hemisphere = False,
+                                                         precision = precision)
+                        return self._formatRegion(w = w, s = s, e = e, n = n, ewres = ewres, nsres = nsres)
+                    else:
+                        w, s = coord1
+                        e, n = coord2
+                        ewres, nsres = coord3
+                        return self._formatRegion(w = w, s = s, e = e, n = n, ewres = ewres,
+                                                  nsres = nsres, precision = precision)
+                else:
+                    raise SbException(_("Error in projection (check the settings)"))
+                
+        else:
+            if self.mapFrame.GetMap().projinfo['proj'] == 'll' and format == 'DMS':
+                w, s = utils.Deg2DMS(region["w"], region["s"],
+                                     string = False, precision = precision)
+                e, n = utils.Deg2DMS(region["e"], region["n"],
+                                     string = False, precision = precision)
+                ewres, nsres = utils.Deg2DMS(region['ewres'], region['nsres'],
+                                             string = False, precision = precision)
+                return self._formatRegion(w = w, s = s, e = e, n = n, ewres = ewres, nsres = nsres)
+            else:
+                w, s = region["w"], region["s"]
+                e, n = region["e"], region["n"]
+                ewres, nsres = region['ewres'], region['nsres']
+                return self._formatRegion(w = w, s = s, e = e, n = n, ewres = ewres,
+                                          nsres = nsres, precision = precision)
+                                
+                                
+class SbCompRegionExtent(SbRegionExtent):
+    """!Shows computational region."""
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbRegionExtent.__init__(self, mapframe, statusbar, position)
+        self.name = 'computationalRegion'
+        self.label = _("Comp. region")
+        
+    def _formatRegion(self, w, e, s, n, ewres, nsres, precision = None):
+        """!Format computational region string for statusbar"""
+        if precision is not None:
+            return "%.*f - %.*f, %.*f - %.*f (%.*f, %.*f)" % (precision, w, precision, e,
+                                                              precision, s, precision, n,
+                                                              precision, ewres, precision, nsres)
+        else:
+            return "%s - %s, %s - %s (%s, %s)" % (w, e, s, n, ewres, nsres)
+        
+    def _getRegion(self):
+        """!Returns computational region."""
+        return self.mapFrame.GetMap().GetRegion() # computational region
+        
+        
+class SbProgress(SbItem):
+    """!General progress bar to show progress.
+    
+    Underlaying widget is wx.Gauge.
+    """
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'progress'
+
+        # on-render gauge
+        self.widget = wx.Gauge(parent = self.statusbar, id = wx.ID_ANY,
+                                      range = 0, style = wx.GA_HORIZONTAL)
+        self.widget.Hide()
+        
+    def GetRange(self):
+        """!Returns progress range."""
+        return self.widget.GetRange()
+    
+    def SetRange(self, range):
+        """!Sets progress range."""
+        self.widget.SetRange(range)
+    
+
+class SbGoToGCP(SbItem):
+    """!SpinCtrl to select GCP to focus on
+    
+    Requires MapFrame.GetSrcWindow, MapFrame.GetTgtWindow, MapFrame.GetListCtrl,
+    MapFrame.GetMapCoordList.
+    """
+    
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'gotoGCP'
+        self.label = _("Go to GCP No.")
+
+        self.widget = wx.SpinCtrl(parent = self.statusbar, id = wx.ID_ANY,
+                                                value = "", min = 0)
+        self.widget.Hide()
+        
+        self.widget.Bind(wx.EVT_TEXT_ENTER, self.OnGoToGCP)
+        self.widget.Bind(wx.EVT_SPINCTRL, self.OnGoToGCP)
+    
+    def OnGoToGCP(self, event):
+        """!Zooms to given GCP."""
+        GCPNo = self.GetValue()
+        mapCoords = self.mapFrame.GetMapCoordList()
+        
+        if GCPNo < 0 or GCPNo > len(mapCoords): # always false, spin checks it
+            GMessage(parent = self,
+                     message = "%s 1 - %s." % (_("Valid Range:"),
+                                               len(mapCoords)))
+            return
+
+        if GCPNo == 0:
+            return
+            
+        listCtrl = self.mapFrame.GetListCtrl()
+        
+        listCtrl.selectedkey = GCPNo
+        listCtrl.selected = listCtrl.FindItemData(-1, GCPNo)
+        listCtrl.render = False
+        listCtrl.SetItemState(listCtrl.selected,
+                          wx.LIST_STATE_SELECTED,
+                          wx.LIST_STATE_SELECTED)
+        listCtrl.render = True
+        
+        listCtrl.EnsureVisible(listCtrl.selected)
+
+        srcWin = self.mapFrame.GetSrcWindow()
+        tgtWin = self.mapFrame.GetTgtWindow()
+        
+        # Source MapWindow:
+        begin = (mapCoords[GCPNo][1], mapCoords[GCPNo][2])
+        begin = srcWin.Cell2Pixel(begin)
+        end = begin
+        srcWin.Zoom(begin, end, 0)
+
+        # redraw map
+        srcWin.UpdateMap()
+
+        if self.mapFrame.GetShowTarget():
+            # Target MapWindow:
+            begin = (mapCoords[GCPNo][3], mapCoords[GCPNo][4])
+            begin = tgtWin.Cell2Pixel(begin)
+            end = begin
+            tgtWin.Zoom(begin, end, 0)
+
+            # redraw map
+            tgtWin.UpdateMap()
+
+        self.GetWidget().SetFocus()
+    
+    def Update(self):
+        self.statusbar.SetStatusText("")
+        max = self.mapFrame.GetListCtrl().GetItemCount()
+        if max < 1:
+            max = 1
+        self.widget.SetRange(0, max)
+        self.Show()
+                        
+        # disable long help
+        self.mapFrame.StatusbarEnableLongHelp(False)
+        
+class SbRMSError(SbTextItem):
+    """!Shows RMS error.
+    
+    Requires MapFrame.GetFwdError, MapFrame.GetBkwError.
+    """
+    def __init__(self, mapframe, statusbar, position = 0):
+        SbTextItem.__init__(self, mapframe, statusbar, position)
+        self.name = 'RMSError'
+        self.label = _("RMS error")
+        
+    def Show(self):
+        self.SetValue(_("Forward: %(forw)s, Backward: %(back)s") %
+                                   { 'forw' : self.mapFrame.GetFwdError(),
+                                     'back' : self.mapFrame.GetBkwError() })
+        SbTextItem.Show(self)
diff --git a/gui/wxpython/mapdisp/toolbars.py b/gui/wxpython/mapdisp/toolbars.py
new file mode 100644
index 0000000..84b6bc5
--- /dev/null
+++ b/gui/wxpython/mapdisp/toolbars.py
@@ -0,0 +1,267 @@
+"""!
+ at package mapdisp.toolbars
+
+ at brief Map display frame - toolbars
+
+Classes:
+ - toolbars::MapToolbar
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton
+ at author Jachym Cepicky
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import wx
+
+from gui_core.toolbars import BaseToolbar, BaseIcons
+from nviz.main         import haveNviz
+from vdigit.main       import haveVDigit
+from icons.icon        import MetaIcon
+
+MapIcons =  {
+    'query'      : MetaIcon(img = 'info',
+                            label = _('Query raster/vector map(s)'),
+                            desc = _('Query selected raster/vector map(s)')),
+    'addBarscale': MetaIcon(img = 'scalebar-add',
+                            label = _('Add scalebar and north arrow')),
+    'addLegend'  : MetaIcon(img = 'legend-add',
+                            label = _('Add legend')),
+    'addNorthArrow': MetaIcon(img = 'north-arrow-add',
+                              label = _('North Arrow')),
+    'analyze'    : MetaIcon(img = 'layer-raster-analyze',
+                            label = _('Analyze map'),
+                            desc = _('Measuring, profiling, histogramming, ...')),
+    'measure'    : MetaIcon(img = 'measure-length',
+                            label = _('Measure distance')),
+    'profile'    : MetaIcon(img = 'layer-raster-profile',
+                            label = _('Profile surface map')),
+    'scatter'    : MetaIcon(img = 'layer-raster-profile',
+                            label = _("Create bivariate scatterplot of raster maps")),
+    'addText'    : MetaIcon(img = 'text-add',
+                            label = _('Add text layer')),
+    'histogram'  : MetaIcon(img = 'layer-raster-histogram',
+                            label = _('Create histogram of raster map')),
+    }
+
+NvizIcons = {
+    'rotate'    : MetaIcon(img = '3d-rotate',
+                           label = _('Rotate 3D scene'),
+                           desc = _('Drag with mouse to rotate 3D scene')), 
+    'flyThrough': MetaIcon(img = 'flythrough',
+                           label = _('Fly-through mode'),
+                           desc = _('Drag with mouse, hold Ctrl down for different mode'
+                                    ' or Shift to accelerate')),
+    'zoomIn'    : BaseIcons['zoomIn'].SetLabel(desc = _('Click mouse to zoom')),
+    'zoomOut'   : BaseIcons['zoomOut'].SetLabel(desc = _('Click mouse to unzoom'))
+    }
+
+class MapToolbar(BaseToolbar):
+    """!Map Display toolbar
+    """
+    def __init__(self, parent, mapcontent):
+        """!Map Display constructor
+
+        @param parent reference to MapFrame
+        @param mapcontent reference to render.Map (registred by MapFrame)
+        """
+        self.mapcontent = mapcontent # render.Map
+        BaseToolbar.__init__(self, parent = parent) # MapFrame
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # optional tools
+        choices = [ _('2D view'), ]
+        self.toolId = { '2d' : 0 }
+        if self.parent.GetLayerManager():
+            log = self.parent.GetLayerManager().GetLogWindow()
+        
+        if haveNviz:
+            choices.append(_('3D view'))
+            self.toolId['3d'] = 1
+        else:
+            from nviz.main import errorMsg
+            log.WriteCmdLog(_('3D view mode not available'))
+            log.WriteWarning(_('Reason: %s') % str(errorMsg))
+            log.WriteLog(_('Note that the wxGUI\'s 3D view mode is currently disabled '
+                           'on MS Windows (hopefully this will be fixed soon). '
+                           'Please keep an eye out for updated versions of GRASS. '
+                           'In the meantime you can use "NVIZ" from the File menu.'), wrap = 60)
+            
+            self.toolId['3d'] = -1
+
+        if haveVDigit:
+            choices.append(_('Digitize'))
+            if self.toolId['3d'] > -1:
+                self.toolId['vdigit'] = 2
+            else:
+                self.toolId['vdigit'] = 1
+        else:
+            from vdigit.main import errorMsg
+            log.WriteCmdLog(_('Vector digitizer not available'))
+            log.WriteWarning(_('Reason: %s') % errorMsg)
+            log.WriteLog(_('Note that the wxGUI\'s vector digitizer is currently disabled '
+                           '(hopefully this will be fixed soon). '
+                           'Please keep an eye out for updated versions of GRASS. '
+                           'In the meantime you can use "v.digit" from the Develop Vector menu.'), wrap = 60)
+            
+            self.toolId['vdigit'] = -1
+        
+        self.combo = wx.ComboBox(parent = self, id = wx.ID_ANY,
+                                 choices = choices,
+                                 style = wx.CB_READONLY, size = (110, -1))
+        self.combo.SetSelection(0)
+        
+        self.comboid = self.AddControl(self.combo)
+        self.parent.Bind(wx.EVT_COMBOBOX, self.OnSelectTool, self.comboid)
+        
+        # realize the toolbar
+        self.Realize()
+        
+        # workaround for Mac bug. May be fixed by 2.8.8, but not before then.
+        self.combo.Hide()
+        self.combo.Show()
+        
+        self.action = { 'id' : self.pointer }
+        self.defaultAction = { 'id' : self.pointer,
+                               'bind' : self.parent.OnPointer }
+        
+        self.OnTool(None)
+        
+        self.EnableTool(self.zoomBack, False)
+        
+        self.FixSize(width = 90)
+        
+    def _toolbarData(self):
+        """!Toolbar data"""
+        return self._getToolbarData((('displayMap', BaseIcons['display'],
+                                      self.parent.OnDraw),
+                                     ('renderMap', BaseIcons['render'],
+                                      self.parent.OnRender),
+                                     ('erase', BaseIcons['erase'],
+                                      self.parent.OnErase),
+                                     (None, ),
+                                     ('pointer', BaseIcons['pointer'],
+                                      self.parent.OnPointer,
+                                      wx.ITEM_CHECK),
+                                     ('query', MapIcons['query'],
+                                      self.parent.OnQuery,
+                                      wx.ITEM_CHECK),
+                                     ('pan', BaseIcons['pan'],
+                                      self.parent.OnPan,
+                                      wx.ITEM_CHECK),
+                                     ('zoomIn', BaseIcons['zoomIn'],
+                                      self.parent.OnZoomIn,
+                                      wx.ITEM_CHECK),
+                                     ('zoomOut', BaseIcons['zoomOut'],
+                                      self.parent.OnZoomOut,
+                                      wx.ITEM_CHECK),
+                                     ('zoomExtent', BaseIcons['zoomExtent'],
+                                      self.parent.OnZoomToMap),
+                                     ('zoomBack', BaseIcons['zoomBack'],
+                                      self.parent.OnZoomBack),
+                                     ('zoomMenu', BaseIcons['zoomMenu'],
+                                      self.parent.OnZoomMenu),
+                                     (None, ),
+                                     ('analyze', MapIcons['analyze'],
+                                      self.OnAnalyze),
+                                     (None, ),
+                                     ('overlay', BaseIcons['overlay'],
+                                      self.OnDecoration),
+                                     (None, ),
+                                     ('saveFile', BaseIcons['saveFile'],
+                                      self.parent.SaveToFile),
+                                     ('printMap', BaseIcons['print'],
+                                      self.parent.PrintMenu),
+                                     (None, ))
+                                    )
+    def InsertTool(self, data):
+        """!Insert tool to toolbar
+        
+        @param data toolbar data"""
+        data = self._getToolbarData(data)
+        for tool in data:
+            self.CreateTool(*tool)
+        self.Realize()
+        
+        self.parent._mgr.GetPane('mapToolbar').BestSize(self.GetBestSize())
+        self.parent._mgr.Update()
+        
+    def RemoveTool(self, tool):
+        """!Remove tool from toolbar
+        
+        @param tool tool id"""
+        self.DeleteTool(tool)
+        
+        self.parent._mgr.GetPane('mapToolbar').BestSize(self.GetBestSize())
+        self.parent._mgr.Update()
+        
+    def ChangeToolsDesc(self, mode2d):
+        """!Change description of zoom tools for 2D/3D view"""
+        if mode2d:
+            icons = BaseIcons
+        else:
+            icons = NvizIcons
+        for i, data in enumerate(self._data):
+            for tool in (('zoomIn', 'zoomOut')):
+                if data[0] == tool:
+                    tmp = list(data)
+                    tmp[4] = icons[tool].GetDesc()
+                    self._data[i] = tuple(tmp)
+        
+    def OnSelectTool(self, event):
+        """!Select / enable tool available in tools list
+        """
+        tool =  event.GetSelection()
+        
+        if tool == self.toolId['2d']:
+            self.ExitToolbars()
+            self.Enable2D(True)
+            self.ChangeToolsDesc(mode2d = True)            
+        
+        elif tool == self.toolId['3d'] and \
+                not (self.parent.MapWindow3D and self.parent.IsPaneShown('3d')):
+            self.ExitToolbars()
+            self.parent.AddNviz()
+            
+        elif tool == self.toolId['vdigit'] and \
+                not self.parent.GetToolbar('vdigit'):
+            self.ExitToolbars()
+            self.parent.AddToolbar("vdigit")
+            self.parent.MapWindow.SetFocus()
+
+    def OnAnalyze(self, event):
+        """!Analysis tools menu
+        """
+        self._onMenu(((MapIcons["measure"],    self.parent.OnMeasure),
+                      (MapIcons["profile"],    self.parent.OnProfile),
+                      (MapIcons["histogram"], self.parent.OnHistogram)))
+        
+    def OnDecoration(self, event):
+        """!Decorations overlay menu
+        """
+        if self.parent.IsPaneShown('3d'):
+            self._onMenu(((MapIcons["addNorthArrow"], self.parent.OnAddArrow),
+                          (MapIcons["addLegend"],     lambda evt: self.parent.AddLegend()),
+                          (MapIcons["addText"],       self.parent.OnAddText)))
+        else:
+            self._onMenu(((MapIcons["addBarscale"], lambda evt: self.parent.AddBarscale()),
+                          (MapIcons["addLegend"],   lambda evt: self.parent.AddLegend()),
+                          (MapIcons["addText"],     self.parent.OnAddText)))
+        
+    def ExitToolbars(self):
+        if self.parent.GetToolbar('vdigit'):
+            self.parent.toolbars['vdigit'].OnExit()
+        if self.parent.GetLayerManager().IsPaneShown('toolbarNviz'):
+            self.parent.RemoveNviz()
+        
+    def Enable2D(self, enabled):
+        """!Enable/Disable 2D display mode specific tools"""
+        for tool in (self.zoomMenu,
+                     self.analyze,
+                     self.printMap):
+            self.EnableTool(tool, enabled)
diff --git a/gui/wxpython/modules/colorrules.py b/gui/wxpython/modules/colorrules.py
new file mode 100644
index 0000000..c85cf6a
--- /dev/null
+++ b/gui/wxpython/modules/colorrules.py
@@ -0,0 +1,1796 @@
+"""
+ at package module.colorrules
+
+ at brief Dialog for interactive management of raster/vector color tables
+and color rules.
+
+Classes:
+ - colorrules::RulesPanel
+ - colorrules::ColorTable
+ - colorrules::RasterColorTable
+ - colorrules::VectorColorTable
+ - colorrules::BufferedWindow
+
+(C) 2008, 2010-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton (Arizona State University)
+ at author Martin Landa <landa.martin gmail.com> (various updates)
+ at author Anna Kratochvilova <kratochanna gmail.com> (split to base and derived classes)
+"""
+
+import os
+import shutil
+import copy
+import tempfile
+
+import wx
+import wx.lib.colourselect     as csel
+import wx.lib.scrolledpanel    as scrolled
+import wx.lib.filebrowsebutton as filebrowse
+
+import grass.script as grass
+
+from core             import globalvar
+from core             import utils
+from core.gcmd        import GMessage, RunCommand, GError
+from gui_core.gselect import Select, LayerSelect, ColumnSelect, VectorDBInfo
+from core.render      import Map
+from gui_core.forms   import GUI
+from core.debug       import Debug as Debug
+from core.settings    import UserSettings
+
+class RulesPanel:
+    def __init__(self, parent, mapType, attributeType, properties, panelWidth = 180):
+        """!Create rules panel
+        
+        @param mapType raster/vector
+        @param attributeType color/size for choosing widget type
+        @param properties properties of classes derived from ColorTable
+        @param panelWidth width of scroll panel"""
+        
+        self.ruleslines = {}
+        self.mapType = mapType
+        self.attributeType = attributeType
+        self.properties = properties
+        self.parent = parent
+        self.panelWidth = panelWidth
+        
+        self.mainSizer = wx.FlexGridSizer(cols = 3, vgap = 6, hgap = 4)
+        # put small border at the top of panel
+        for i in range(3):
+            self.mainSizer.Add(item = wx.Size(3, 3))
+        
+        self.mainPanel = scrolled.ScrolledPanel(parent, id = wx.ID_ANY,
+                                          size = (self.panelWidth, 300),
+                                          style = wx.TAB_TRAVERSAL | wx.SUNKEN_BORDER)
+                
+        # (un)check all
+        self.checkAll = wx.CheckBox(parent, id = wx.ID_ANY, label = _("Check all"))
+        self.checkAll.SetValue(True)
+        # clear button
+        self.clearAll = wx.Button(parent, id = wx.ID_ANY, label = _("Clear all"))
+        #  determines how many rules should be added
+        self.numRules = wx.SpinCtrl(parent, id = wx.ID_ANY,
+                                    min = 1, max = 1e6, initial = 1)
+        # add rules
+        self.btnAdd = wx.Button(parent, id = wx.ID_ADD)
+        
+        self.btnAdd.Bind(wx.EVT_BUTTON, self.OnAddRules)
+        self.checkAll.Bind(wx.EVT_CHECKBOX, self.OnCheckAll)
+        self.clearAll.Bind(wx.EVT_BUTTON, self.OnClearAll)
+
+        self.mainPanel.SetSizer(self.mainSizer)
+        self.mainPanel.SetAutoLayout(True)
+        self.mainPanel.SetupScrolling()    
+    
+    def Clear(self):
+        """!Clear and widgets and delete information"""
+        self.ruleslines.clear()
+        self.mainSizer.Clear(deleteWindows=True)
+    
+    def OnCheckAll(self, event):
+        """!(Un)check all rules"""
+        check = event.GetInt()
+        for child in self.mainPanel.GetChildren():
+            if child.GetName() == 'enable':
+                child.SetValue(check)
+            else:
+                child.Enable(check)
+                
+    def OnClearAll(self, event):
+        """!Delete all widgets in panel"""
+        self.Clear()
+        
+    def OnAddRules(self, event):
+        """!Add rules button pressed"""
+        nrules = self.numRules.GetValue()
+        self.AddRules(nrules)
+        
+    def AddRules(self, nrules, start = False):
+        """!Add rules 
+        @param start set widgets (not append)"""
+       
+        snum = len(self.ruleslines.keys())
+        if start:
+            snum = 0
+        for num in range(snum, snum + nrules):
+            # enable
+            enable = wx.CheckBox(parent = self.mainPanel, id = num)
+            enable.SetValue(True)
+            enable.SetName('enable')
+            enable.Bind(wx.EVT_CHECKBOX, self.OnRuleEnable)
+            # value
+            txt_ctrl = wx.TextCtrl(parent = self.mainPanel, id = 1000 + num,
+                                   size = (80, -1),
+                                   style = wx.TE_NOHIDESEL)
+            if self.mapType == 'vector':
+                txt_ctrl.SetToolTipString(_("Enter vector attribute values"))
+            txt_ctrl.Bind(wx.EVT_TEXT, self.OnRuleValue)
+            txt_ctrl.SetName('source')
+            if self.attributeType == 'color':
+                # color
+                columnCtrl = csel.ColourSelect(self.mainPanel, id = 2000 + num,
+                                               size  =  globalvar.DIALOG_COLOR_SIZE)
+                columnCtrl.Bind(csel.EVT_COLOURSELECT, self.OnRuleColor)
+                columnCtrl.SetName('target')
+                if not start:
+                    self.ruleslines[enable.GetId()] = { 'value' : '',
+                                                        'color': "0:0:0" }
+            else:
+                # size or width
+                init = 2
+                if self.attributeType == 'size':
+                    init = 100
+                columnCtrl = wx.SpinCtrl(self.mainPanel, id = 2000 + num,
+                                         size = (50, -1), min = 1, max = 1e4,
+                                         initial = init)
+                columnCtrl.Bind(wx.EVT_SPINCTRL, self.OnRuleSize)
+                columnCtrl.Bind(wx.EVT_TEXT, self.OnRuleSize)
+                columnCtrl.SetName('target')
+                if not start:
+                    self.ruleslines[enable.GetId()] = { 'value' : '',
+                                                        self.attributeType: init }
+        
+            self.mainSizer.Add(item = enable, proportion = 0,
+                              flag = wx.ALIGN_CENTER_VERTICAL)
+            self.mainSizer.Add(item = txt_ctrl, proportion = 0,
+                              flag = wx.ALIGN_CENTER | wx.RIGHT, border = 5)
+            self.mainSizer.Add(item = columnCtrl, proportion = 0,
+                              flag = wx.ALIGN_CENTER | wx.RIGHT, border = 10)
+        
+        self.mainPanel.Layout()
+        self.mainPanel.SetupScrolling(scroll_x = False)
+    
+    def OnRuleEnable(self, event):
+        """!Rule enabled/disabled"""
+        id = event.GetId()
+        
+        if event.IsChecked():
+            self.mainPanel.FindWindowById(id + 1000).Enable()
+            self.mainPanel.FindWindowById(id + 2000).Enable()
+            if self.mapType == 'vector' and not self.parent.GetParent().colorTable:
+                vals = []
+                vals.append(self.mainPanel.FindWindowById(id + 1000).GetValue())
+                try:
+                    vals.append(self.mainPanel.FindWindowById(id + 1 + 1000).GetValue())
+                except AttributeError:
+                    vals.append(None)
+                value = self.SQLConvert(vals)
+            else:
+                value = self.mainPanel.FindWindowById(id + 1000).GetValue()
+            color = self.mainPanel.FindWindowById(id + 2000).GetValue()
+            
+            if self.attributeType == 'color':
+            # color
+                color_str = str(color[0]) + ':' \
+                          + str(color[1]) + ':' \
+                          + str(color[2])
+                self.ruleslines[id] = {'value' : value,
+                                       'color' : color_str }
+                
+            else:
+            # size or width
+                self.ruleslines[id] = {'value' : value,
+                                       self.attributeType  : float(color) }
+        
+        else:
+            self.mainPanel.FindWindowById(id + 1000).Disable()
+            self.mainPanel.FindWindowById(id + 2000).Disable()
+            del self.ruleslines[id]
+        
+    def OnRuleColor(self, event):
+        """!Rule color changed"""
+        num = event.GetId()
+        
+        rgba_color = event.GetValue()
+        
+        rgb_string = str(rgba_color[0]) + ':' \
+                   + str(rgba_color[1]) + ':' \
+                   + str(rgba_color[2])
+        
+        self.ruleslines[num-2000]['color'] = rgb_string
+     
+    def OnRuleSize(self, event):
+        """!Rule size changed"""
+        num = event.GetId()
+        size = event.GetInt()
+        
+        self.ruleslines[num - 2000][self.attributeType] = size
+        
+    def OnRuleValue(self, event):
+        """!Rule value changed"""
+        num = event.GetId()
+        val = event.GetString().strip()
+        
+        if val == '':
+            return
+        try:
+            table = self.parent.colorTable
+        except AttributeError:
+            # due to panel/scrollpanel in vector dialog
+            if isinstance(self.parent.GetParent(), RasterColorTable):
+                table = self.parent.GetParent().colorTable
+            else:
+                table = self.parent.GetParent().GetParent().colorTable
+        if table:
+            self.SetRasterRule(num, val)
+        else:
+            self.SetVectorRule(num, val)
+
+    def SetRasterRule(self, num, val): 
+        """!Set raster rule"""       
+        self.ruleslines[num - 1000]['value'] = val
+
+    def SetVectorRule(self, num, val):
+        """!Set vector rule"""
+        vals = []
+        vals.append(val)
+        try:
+            vals.append(self.mainPanel.FindWindowById(num + 1).GetValue())
+        except AttributeError:
+            vals.append(None)
+        self.ruleslines[num - 1000]['value'] = self.SQLConvert(vals)
+            
+    def Enable(self, enable = True):
+        """!Enable/Disable all widgets"""
+        for child in self.mainPanel.GetChildren():
+            child.Enable(enable)
+        sql = True
+        self.LoadRulesline(sql)# todo
+        self.btnAdd.Enable(enable)
+        self.numRules.Enable(enable)
+        self.checkAll.Enable(enable)
+        self.clearAll.Enable(enable)
+        
+        
+    def LoadRules(self):
+        message = ""        
+        for item in range(len(self.ruleslines)):
+            try:
+                self.mainPanel.FindWindowById(item + 1000).SetValue(self.ruleslines[item]['value'])
+                r, g, b = (0, 0, 0) # default
+                if not self.ruleslines[item][self.attributeType]:
+                    if self.attributeType == 'color':
+                        self.ruleslines[item][self.attributeType] = '%d:%d:%d' % (r, g, b)
+                    elif self.attributeType == 'size':
+                        self.ruleslines[item][self.attributeType] = 100                
+                    elif self.attributeType == 'width':
+                        self.ruleslines[item][self.attributeType] = 2
+                    
+                if self.attributeType == 'color':
+                    try:
+                        r, g, b = map(int, self.ruleslines[item][self.attributeType].split(':'))
+                    except ValueError, e:
+                        message =  _("Bad color format. Use color format '0:0:0'")
+                    self.mainPanel.FindWindowById(item + 2000).SetValue((r, g, b))
+                else:
+                    value = float(self.ruleslines[item][self.attributeType])
+                    self.mainPanel.FindWindowById(item + 2000).SetValue(value)
+            except:
+                continue
+                
+        if message:
+            GMessage(parent = self.parent, message = message)
+            return False
+        
+        return True
+                
+    def SQLConvert(self, vals):
+        """!Prepare value for SQL query"""
+        if vals[0].isdigit():
+            sqlrule = '%s=%s' % (self.properties['sourceColumn'], vals[0])
+            if vals[1]:
+                sqlrule += ' AND %s<%s' % (self.properties['sourceColumn'], vals[1])
+        else:
+            sqlrule = '%s=%s' % (self.properties['sourceColumn'], vals[0])
+        
+        return sqlrule  
+
+class ColorTable(wx.Frame):
+    def __init__(self, parent, title, id = wx.ID_ANY,
+                 style = wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER,
+                 **kwargs):
+        """!Dialog for interactively entering rules for map management
+        commands
+        """
+        self.parent = parent # GMFrame
+        wx.Frame.__init__(self, parent, id, title, style = style, **kwargs)
+        
+        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
+        
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
+        
+        # instance of render.Map to be associated with display
+        self.Map = Map() 
+        
+        # input map to change
+        self.inmap = ''
+        # reference to layer with preview
+        self.layer = None     
+        # layout
+        self._doLayout()
+        
+        # bindings
+        self.Bind(wx.EVT_BUTTON, self.OnHelp, self.btnHelp)
+        self.selectionInput.Bind(wx.EVT_TEXT, self.OnSelectionInput)
+        self.Bind(wx.EVT_BUTTON, self.OnCancel, self.btnCancel)
+        self.Bind(wx.EVT_BUTTON, self.OnApply, self.btnApply)
+        self.Bind(wx.EVT_BUTTON, self.OnOK, self.btnOK)
+        self.Bind(wx.EVT_CLOSE,  self.OnCloseWindow)
+       
+        self.Bind(wx.EVT_BUTTON, self.OnPreview, self.btnPreview)
+        
+    def _initLayer(self):
+        """!Set initial layer when opening dialog"""
+        # set map layer from layer tree, first selected,
+        # if not the right type, than select another
+        try:
+            sel = self.parent.curr_page.maptree.layer_selected
+            if sel and self.parent.curr_page.maptree.GetPyData(sel)[0]['type'] == self.mapType:
+                layer = sel
+            else:
+                layer = self.parent.curr_page.maptree.FindItemByData(key = 'type', value = self.mapType)
+        except:
+            layer = None
+        if layer:
+            mapLayer = self.parent.curr_page.maptree.GetPyData(layer)[0]['maplayer']
+            name = mapLayer.GetName()
+            type = mapLayer.GetType()
+            self.selectionInput.SetValue(name)
+            self.inmap = name
+    
+    def _createMapSelection(self, parent):
+        """!Create map selection part of dialog"""
+        # top controls
+        if self.mapType == 'raster':
+            maplabel = _('Select raster map:')
+        else:
+            maplabel = _('Select vector map:')
+        inputBox = wx.StaticBox(parent, id = wx.ID_ANY,
+                                label = " %s " % maplabel)
+        inputSizer = wx.StaticBoxSizer(inputBox, wx.VERTICAL)
+
+        self.selectionInput = Select(parent = parent, id = wx.ID_ANY,
+                                     size = globalvar.DIALOG_GSELECT_SIZE,
+                                     type = self.mapType)
+        # layout
+        inputSizer.Add(item = self.selectionInput,
+                       flag = wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border = 5)
+        
+        return inputSizer
+    
+    def _createFileSelection(self, parent):
+        """!Create file (open/save rules) selection part of dialog"""
+        inputBox = wx.StaticBox(parent, id = wx.ID_ANY,
+                                label = " %s " % _("Import or export color table:"))
+        inputSizer = wx.StaticBoxSizer(inputBox, wx.VERTICAL)
+        
+        self.loadRules = filebrowse.FileBrowseButton(parent = parent, id = wx.ID_ANY, fileMask = '*',
+                                                     size = globalvar.DIALOG_GSELECT_SIZE,
+                                                     labelText = _('Load color table from file:'),
+                                                     dialogTitle = _('Choose file to load color table'),
+                                                     buttonText = _('Load'),
+                                                     toolTip = _("Type filename or click to choose "
+                                                                 "file and load color table"),
+                                                     startDirectory = os.getcwd(), fileMode = wx.OPEN,
+                                                     changeCallback = self.OnLoadRulesFile)
+        self.saveRules = filebrowse.FileBrowseButton(parent = parent, id = wx.ID_ANY, fileMask = '*',
+                                                     size = globalvar.DIALOG_GSELECT_SIZE,
+                                                     labelText = _('Save color table to file:'),
+                                                     dialogTitle = _('Choose file to save color table'),
+                                                     toolTip = _("Type filename or click to choose "
+                                                                 "file and save color table"),
+                                                     buttonText = _('Save'),
+                                                     startDirectory = os.getcwd(), fileMode = wx.SAVE,
+                                                     changeCallback = self.OnSaveRulesFile)
+        
+        default = wx.Button(parent = parent, id = wx.ID_ANY, label = _("Reload default table"))   
+        # layout
+        sizer = wx.BoxSizer(wx.HORIZONTAL)
+        sizer.Add(item = self.loadRules, proportion = 1,
+                  flag = wx.RIGHT | wx.EXPAND, border = 10)
+        sizer.Add(item = default, flag = wx.ALIGN_CENTER_VERTICAL)
+        inputSizer.Add(item = sizer,
+                       flag = wx.TOP | wx.LEFT | wx.RIGHT | wx.EXPAND, border = 5)
+        sizer = wx.BoxSizer(wx.HORIZONTAL)
+        sizer.Add(item = self.saveRules, proportion = 1,
+                  flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
+        inputSizer.Add(item = sizer, proportion = 1,
+                       flag = wx.ALL | wx.EXPAND, border = 5)
+        
+        default.Bind(wx.EVT_BUTTON, self.OnLoadDefaultTable)
+        
+        if self.mapType == 'vector':
+            # parent is collapsible pane
+            parent.SetSizer(inputSizer)
+        
+        return inputSizer   
+         
+    def _createPreview(self, parent):
+        """!Create preview"""
+        # initialize preview display
+        self.InitDisplay()
+        self.preview = BufferedWindow(parent, id = wx.ID_ANY, size = (400, 300),
+                                      Map = self.Map)
+        self.preview.EraseMap()
+        
+    def _createButtons(self, parent):
+        """!Create buttons for leaving dialog"""
+        self.btnHelp   = wx.Button(parent, id = wx.ID_HELP)
+        self.btnCancel = wx.Button(parent, id = wx.ID_CANCEL)
+        self.btnApply  = wx.Button(parent, id = wx.ID_APPLY) 
+        self.btnOK     = wx.Button(parent, id = wx.ID_OK)
+        
+        self.btnOK.SetDefault()
+        self.btnOK.Enable(False)
+        self.btnApply.Enable(False)
+        
+        # layout
+        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+        btnSizer.Add(wx.Size(-1, -1), proportion = 1)
+        btnSizer.Add(self.btnHelp,
+                     flag = wx.LEFT | wx.RIGHT, border = 5)
+        btnSizer.Add(self.btnCancel,
+                     flag = wx.LEFT | wx.RIGHT, border = 5)
+        btnSizer.Add(self.btnApply,
+                     flag = wx.LEFT | wx.RIGHT, border = 5)
+        btnSizer.Add(self.btnOK,
+                     flag = wx.LEFT | wx.RIGHT, border = 5)
+        
+        return btnSizer
+    
+    def _createBody(self, parent):
+        """!Create dialog body consisting of rules and preview"""
+        bodySizer =  wx.GridBagSizer(hgap = 5, vgap = 5)
+        bodySizer.AddGrowableRow(1)
+        bodySizer.AddGrowableCol(2)
+
+        row = 0
+        # label with range
+        self.cr_label = wx.StaticText(parent, id = wx.ID_ANY)
+        bodySizer.Add(item = self.cr_label, pos = (row, 0), span = (1, 3),
+                      flag = wx.ALL, border = 5)
+
+        row += 1
+        # color table
+        self.rulesPanel = RulesPanel(parent = parent, mapType = self.mapType,
+                                     attributeType = self.attributeType, properties = self.properties)
+        
+        bodySizer.Add(item = self.rulesPanel.mainPanel, pos = (row, 0),
+                      span = (1, 2), flag = wx.EXPAND)
+        # add two rules as default
+        self.rulesPanel.AddRules(2)
+        
+        # preview window
+        self._createPreview(parent = parent)
+        bodySizer.Add(item = self.preview, pos = (row, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER)
+        
+        row += 1
+        # add ckeck all and clear all
+        bodySizer.Add(item = self.rulesPanel.checkAll, flag = wx.ALIGN_CENTER_VERTICAL, 
+                      pos = (row, 0))
+        bodySizer.Add(item = self.rulesPanel.clearAll, pos = (row, 1))
+        
+        # preview button
+        self.btnPreview = wx.Button(parent, id = wx.ID_ANY,
+                                    label = _("Preview"))
+        bodySizer.Add(item = self.btnPreview, pos = (row, 2),
+                      flag = wx.ALIGN_RIGHT)
+        self.btnPreview.Enable(False)
+        self.btnPreview.SetToolTipString(_("Show preview of map "
+                                           "(current Map Display extent is used)."))
+        
+        row +=1
+        # add rules button and spin to sizer
+        bodySizer.Add(item = self.rulesPanel.numRules, pos = (row, 0),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        bodySizer.Add(item = self.rulesPanel.btnAdd, pos = (row, 1))
+        
+        return bodySizer    
+        
+    def InitDisplay(self):
+        """!Initialize preview display, set dimensions and region
+        """
+        self.width = self.Map.width = 400
+        self.height = self.Map.height = 300
+        self.Map.geom = self.width, self.height
+
+    def OnCloseWindow(self, event):
+        """!Window closed
+        """
+        self.OnCancel(event)
+          
+    def OnApply(self, event):
+        """!Apply selected color table
+        
+        @return True on success otherwise False
+        """
+        ret = self.CreateColorTable()
+        if not ret:
+            GMessage(parent = self, message = _("No valid color rules given."))
+        else:
+            # re-render preview and current map window
+            self.OnPreview(None)
+            display = self.parent.GetLayerTree().GetMapDisplay()
+            if display and display.IsAutoRendered():
+                display.GetWindow().UpdateMap(render = True)
+        
+        return ret
+
+    def OnOK(self, event):
+        """!Apply selected color table and close the dialog"""
+        if self.OnApply(event):
+            self.OnCancel(event)
+    
+    def OnCancel(self, event):
+        """!Do not apply any changes, remove associated
+            rendered images and close the dialog"""
+        self.Map.Clean()
+        self.Destroy()
+        
+    def OnSaveRulesFile(self, event):
+        """!Save color table to file"""
+        path = event.GetString()
+        if not os.path.exists(path):
+            return
+        
+        rulestxt = ''   
+        for rule in self.rulesPanel.ruleslines.itervalues():
+            if 'value' not in rule:
+                continue
+            rulestxt += rule['value'] + ' ' + rule['color'] + '\n'
+        if not rulestxt:
+            GMessage(message = _("Nothing to save."),
+                     parent = self)
+            return
+        
+        fd = open(path, 'w')
+        fd.write(rulestxt)
+        fd.close()            
+         
+    def OnLoadRulesFile(self, event):
+        """!Load color table from file"""
+        path = event.GetString()
+        if not os.path.exists(path):
+            return
+        
+        self.rulesPanel.Clear()
+        
+        file = open(path, 'r')
+        ctable = file.read()
+        self.ReadColorTable(ctable = ctable)
+        
+    def ReadColorTable(self, ctable):
+        """!Read color table
+        
+        @param table color table in format coming from r.colors.out"""
+        
+        rulesNumber = len(ctable.splitlines())
+        self.rulesPanel.AddRules(rulesNumber)
+        
+        minim = maxim = count = 0
+        for line in ctable.splitlines():
+            try:
+                value, color = map(lambda x: x.strip(), line.split(' '))
+            except ValueError:
+                GMessage(parent = self, message = _("Invalid color table format"))
+                self.rulesPanel.Clear()
+                return
+            
+            self.rulesPanel.ruleslines[count]['value'] = value
+            self.rulesPanel.ruleslines[count]['color'] = color
+            self.rulesPanel.mainPanel.FindWindowById(count + 1000).SetValue(value)
+            rgb = list()
+            for c in color.split(':'):
+                rgb.append(int(c))
+            self.rulesPanel.mainPanel.FindWindowById(count + 2000).SetColour(rgb)
+            # range
+            try:
+                if float(value) < minim:
+                    minim = float(value)
+                if float(value) > maxim:
+                    maxim = float(value)
+            except ValueError: # nv, default
+                pass
+            count += 1
+        
+        if self.mapType == 'vector':
+            # raster min, max is known from r.info
+            self.properties['min'], self.properties['max'] = minim, maxim
+            self.SetRangeLabel()
+            
+        self.OnPreview(tmp = True)  
+         
+    def OnLoadDefaultTable(self, event):
+        """!Load internal color table"""
+        self.LoadTable()
+        
+    def LoadTable(self, mapType = 'raster'):
+        """!Load current color table (using `r(v).colors.out`)
+        
+        @param mapType map type (raster or vector)"""
+        self.rulesPanel.Clear()
+
+        if mapType == 'raster':
+            cmd = ['r.colors.out',
+                   'read=True',
+                   'map=%s' % self.inmap,
+                   'rules=-']
+        else:
+            cmd = ['v.colors.out',
+                   'read=True',
+                   'map=%s' % self.inmap,
+                   'rules=-']
+            
+            if self.properties['sourceColumn'] and self.properties['sourceColumn'] != 'cat':
+                cmd.append('column=%s' % self.properties['sourceColumn'])
+            
+        cmd = utils.CmdToTuple(cmd)
+        
+        if self.inmap:
+            ctable = RunCommand(cmd[0], **cmd[1])
+        else:
+            self.OnPreview()
+            return
+        
+        self.ReadColorTable(ctable = ctable)     
+    
+    def CreateColorTable(self, tmp = False):
+        """!Creates color table
+
+        @return True on success
+        @return False on failure
+        """
+        rulestxt = ''
+        
+        for rule in self.rulesPanel.ruleslines.itervalues():
+            if 'value' not in rule: # skip empty rules
+                continue
+            
+            if rule['value'] not in ('nv', 'default') and \
+                    rule['value'][-1] != '%' and \
+                    not self._IsNumber(rule['value']):
+                GError(_("Invalid rule value '%s'. Unable to apply color table.") % rule['value'],
+                       parent = self)
+                return False
+            
+            rulestxt += rule['value'] + ' ' + rule['color'] + '\n'
+           
+        if not rulestxt:
+            return False
+        
+        gtemp = utils.GetTempfile()
+        output = open(gtemp, "w")
+        try:
+            output.write(rulestxt)
+        finally:
+            output.close()
+        
+        cmd = ['%s.colors' % self.mapType[0], #r.colors/v.colors
+                'map=%s' % self.inmap,
+                'rules=%s' % gtemp]
+        if self.mapType == 'vector' and self.properties['sourceColumn'] \
+                and self.properties['sourceColumn'] != 'cat':
+            cmd.append('column=%s' % self.properties['sourceColumn'])
+        cmd = utils.CmdToTuple(cmd)
+        ret = RunCommand(cmd[0], **cmd[1])               
+        if ret != 0:
+            return False
+        
+        return True
+    
+    def DoPreview(self, ltype, cmdlist):
+        """!Update preview (based on computational region)"""
+        
+        if not self.layer:
+            self.layer = self.Map.AddLayer(type = ltype, name = 'preview', command = cmdlist,
+                                           l_active = True, l_hidden = False, l_opacity = 1.0,
+                                           l_render = False) 
+        else:
+            self.layer.SetCmd(cmdlist)
+        
+        # apply new color table and display preview
+        self.CreateColorTable(tmp = True)
+        self.preview.UpdatePreview()
+        
+    def RunHelp(self, cmd):
+        """!Show GRASS manual page"""
+        RunCommand('g.manual',
+                   quiet = True,
+                   parent = self,
+                   entry = cmd)
+        
+    def _IsNumber(self, s):
+        """!Check if 's' is a number"""
+        try:
+            float(s)
+            return True
+        except ValueError:
+            return False
+        
+
+class RasterColorTable(ColorTable):
+    def __init__(self, parent, **kwargs):
+        """!Dialog for interactively entering color rules for raster maps"""
+
+        self.mapType = 'raster'
+        self.attributeType = 'color' 
+        self.colorTable = True 
+        # raster properties
+        self.properties = {
+            # min cat in raster map
+            'min' : None,
+            # max cat in raster map
+            'max' : None,
+            }        
+        
+        ColorTable.__init__(self, parent,
+                            title = _('Create new color table for raster map'), **kwargs)
+        
+        self._initLayer()
+        
+        # self.SetMinSize(self.GetSize()) 
+        self.SetMinSize((650, 700))
+        
+        self.CentreOnScreen()
+        self.Show()
+    
+    def _doLayout(self):
+        """!Do main layout"""
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        #
+        # map selection
+        #
+        mapSelection = self._createMapSelection(parent = self.panel)
+        sizer.Add(item = mapSelection, proportion = 0,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        #
+        # manage extern tables
+        #
+        fileSelection = self._createFileSelection(parent = self.panel)
+        sizer.Add(item = fileSelection, proportion = 0,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        #
+        # body & preview
+        #
+        bodySizer = self._createBody(parent = self.panel)
+        sizer.Add(item = bodySizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        #
+        # buttons
+        #
+        btnSizer = self._createButtons(parent = self.panel)
+        sizer.Add(item = wx.StaticLine(parent = self.panel, id = wx.ID_ANY,
+                                       style = wx.LI_HORIZONTAL), proportion = 0,
+                                       flag = wx.EXPAND | wx.ALL, border = 5) 
+        
+        sizer.Add(item = btnSizer, proportion = 0,
+                  flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
+        
+        self.panel.SetSizer(sizer)
+        sizer.Layout()
+        sizer.Fit(self.panel)
+        self.Layout()
+    
+    def OnSelectionInput(self, event):
+        """!Raster map selected"""
+        if event:
+            self.inmap = event.GetString()
+    
+        self.loadRules.SetValue('')
+        self.saveRules.SetValue('')
+        if self.inmap:
+            if not grass.find_file(name = self.inmap, element = 'cell')['file']:
+                self.inmap = None
+        
+        if not self.inmap:
+            self.btnPreview.Enable(False)
+            self.btnOK.Enable(False)
+            self.btnApply.Enable(False)
+            self.LoadTable()
+            return
+        
+        info = grass.raster_info(map = self.inmap)
+        
+        if info:
+            self.properties['min'] = info['min']
+            self.properties['max'] = info['max']
+            self.LoadTable()
+        else:
+            self.inmap = ''
+            self.properties['min'] = self.properties['max'] = None
+            self.btnPreview.Enable(False)
+            self.btnOK.Enable(False)
+            self.btnApply.Enable(False)
+            self.preview.EraseMap()
+            self.cr_label.SetLabel(_('Enter raster category values or percents'))
+            return
+        
+        if info['datatype'] == 'CELL':
+            mapRange = _('range')
+        else:
+            mapRange = _('fp range')
+        self.cr_label.SetLabel(_('Enter raster category values or percents (%(range)s = %(min)d-%(max)d)') %
+                                 { 'range' : mapRange,
+                                   'min' : self.properties['min'],
+                                   'max' : self.properties['max'] })                       
+            
+        self.btnPreview.Enable()
+        self.btnOK.Enable()
+        self.btnApply.Enable()
+            
+          
+    def OnPreview(self, tmp = True):
+        """!Update preview (based on computational region)"""
+        if not self.inmap:
+            self.preview.EraseMap()
+            return
+        
+        cmdlist = ['d.rast',
+                   'map=%s' % self.inmap]
+        ltype = 'raster'
+        
+        # find existing color table and copy to temp file
+        try:
+            name, mapset = self.inmap.split('@')
+        except ValueError:
+            name = self.inmap
+            mapset = grass.find_file(self.inmap, element = 'cell')['mapset']
+            if not mapset:
+                return
+        old_colrtable = None
+        if mapset == grass.gisenv()['MAPSET']:
+            old_colrtable = grass.find_file(name = name, element = 'colr')['file']
+        else:
+            old_colrtable = grass.find_file(name = name, element = 'colr2/' + mapset)['file']
+        
+        if old_colrtable:
+            colrtemp = utils.GetTempfile()
+            shutil.copyfile(old_colrtable, colrtemp)
+            
+        ColorTable.DoPreview(self, ltype, cmdlist)  
+        
+        # restore previous color table
+        if tmp:
+            if old_colrtable:
+                shutil.copyfile(colrtemp, old_colrtable)
+                os.remove(colrtemp)
+            else:
+                RunCommand('r.colors',
+                           parent = self,
+                           flags = 'r',
+                           map = self.inmap)
+        
+    def OnHelp(self, event):
+        """!Show GRASS manual page"""
+        cmd = 'r.colors'
+        ColorTable.RunHelp(self, cmd = cmd)
+                     
+class VectorColorTable(ColorTable):
+    def __init__(self, parent, attributeType, **kwargs):
+        """!Dialog for interactively entering color rules for vector maps"""
+        # dialog attributes
+        self.mapType = 'vector'
+        self.attributeType = attributeType # color, size, width
+        # in version 7 v.colors used, otherwise color column only
+        self.version7 = int(grass.version()['version'].split('.')[0]) >= 7
+        self.colorTable = False
+        self.updateColumn = True
+        # vector properties
+        self.properties = {
+            # vector layer for attribute table to use for setting color
+            'layer' : 1, 
+            # vector attribute table used for setting color         
+            'table' : '',
+            # vector attribute column for assigning colors
+            'sourceColumn' : '', 
+            # vector attribute column to use for loading colors
+            'loadColumn' : '',
+            # vector attribute column to use for storing colors
+            'storeColumn' : '',    
+            # vector attribute column for temporary storing colors   
+            'tmpColumn' : 'tmp_0',
+            # min value of attribute column/vector color table
+            'min': None,
+            # max value of attribute column/vector color table            
+            'max': None
+            }     
+        self.columnsProp = {'color': {'name': 'GRASSRGB', 'type1': 'varchar(11)', 'type2': ['character']},
+                            'size' : {'name': 'GRASSSIZE', 'type1': 'integer', 'type2': ['integer']},
+                            'width': {'name': 'GRASSWIDTH', 'type1': 'integer', 'type2': ['integer']}}
+        ColorTable.__init__(self, parent = parent,
+                            title = _('Create new color rules for vector map'), **kwargs)
+        
+        # additional bindings for vector color management
+        self.Bind(wx.EVT_COMBOBOX, self.OnLayerSelection, self.layerSelect)
+        self.Bind(wx.EVT_COMBOBOX, self.OnSourceColumnSelection, self.sourceColumn)
+        self.Bind(wx.EVT_COMBOBOX, self.OnFromColSelection, self.fromColumn)
+        self.Bind(wx.EVT_COMBOBOX, self.OnToColSelection, self.toColumn)
+        self.Bind(wx.EVT_BUTTON, self.OnAddColumn, self.addColumn)
+        
+        self._initLayer()
+        if self.colorTable:
+            self.cr_label.SetLabel(_("Enter vector attribute values or percents:"))
+        else:
+            self.cr_label.SetLabel(_("Enter vector attribute values:"))
+        
+        #self.SetMinSize(self.GetSize()) 
+        self.SetMinSize((650, 700))
+        
+        self.CentreOnScreen()
+        self.Show()
+    
+    def _createVectorAttrb(self, parent):
+        """!Create part of dialog with layer/column selection"""
+        inputBox = wx.StaticBox(parent = parent, id = wx.ID_ANY,
+                                label = " %s " % _("Select vector columns"))
+        cb_vl_label = wx.StaticText(parent, id = wx.ID_ANY,
+                                             label = _('Layer:'))
+        cb_vc_label = wx.StaticText(parent, id = wx.ID_ANY,
+                                         label = _('Attribute column:'))
+                                        
+        if self.attributeType == 'color':
+            labels =  [_("Load color from column:"), _("Save color to column:")]
+        elif self.attributeType == 'size':
+            labels =  [_("Load size from column:"), _("Save size to column:")]
+        elif self.attributeType == 'width':
+            labels =  [_("Load width from column:"), _("Save width to column:")]
+            
+        if self.version7 and self.attributeType == 'color':
+            self.useColumn = wx.CheckBox(parent, id = wx.ID_ANY,
+                                  label = _("Use color column instead of color table:"))
+            self.useColumn.Bind(wx.EVT_CHECKBOX, self.OnCheckColumn)
+        
+        fromColumnLabel = wx.StaticText(parent, id = wx.ID_ANY,
+                                            label = labels[0])
+        toColumnLabel = wx.StaticText(parent, id = wx.ID_ANY,
+                                            label = labels[1])
+                                                
+        self.rgb_range_label = wx.StaticText(parent, id = wx.ID_ANY)
+        self.layerSelect = LayerSelect(parent)
+        self.sourceColumn = ColumnSelect(parent)
+        self.fromColumn = ColumnSelect(parent)
+        self.toColumn = ColumnSelect(parent)
+        self.addColumn = wx.Button(parent, id = wx.ID_ANY,
+                                             label = _('Add column'))
+        self.addColumn.SetToolTipString(_("Add GRASSRGB column to current attribute table."))
+        
+        # layout
+        inputSizer = wx.StaticBoxSizer(inputBox, wx.VERTICAL)
+        vSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        row = 0
+        vSizer.Add(cb_vl_label, pos = (row, 0),
+                   flag = wx.ALIGN_CENTER_VERTICAL)
+        vSizer.Add(self.layerSelect,  pos = (row, 1),
+                   flag = wx.ALIGN_CENTER_VERTICAL)
+        row += 1
+        vSizer.Add(cb_vc_label, pos = (row, 0),
+                   flag = wx.ALIGN_CENTER_VERTICAL)
+        vSizer.Add(self.sourceColumn, pos = (row, 1),
+                   flag = wx.ALIGN_CENTER_VERTICAL)
+        vSizer.Add(self.rgb_range_label, pos = (row, 2),
+                   flag = wx.ALIGN_CENTER_VERTICAL)
+        row += 1   
+        if self.version7 and self.attributeType == 'color':
+            vSizer.Add(self.useColumn, pos = (row, 0), span = (1, 2),
+                       flag = wx.ALIGN_CENTER_VERTICAL)
+            row += 1
+            
+        vSizer.Add(fromColumnLabel, pos = (row, 0),
+                  flag = wx.ALIGN_CENTER_VERTICAL)
+        vSizer.Add(self.fromColumn, pos = (row, 1),
+                   flag = wx.ALIGN_CENTER_VERTICAL)
+        row += 1
+        vSizer.Add(toColumnLabel, pos = (row, 0),
+                  flag = wx.ALIGN_CENTER_VERTICAL)
+        vSizer.Add(self.toColumn, pos = (row, 1),
+                   flag = wx.ALIGN_CENTER_VERTICAL)
+        vSizer.Add(self.addColumn, pos = (row, 2),
+                   flag = wx.ALIGN_CENTER_VERTICAL)
+        inputSizer.Add(item = vSizer,
+                       flag = wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border = 5)
+        self.colorColumnSizer = vSizer        
+        return inputSizer 
+       
+    def _doLayout(self):
+        """!Do main layout"""
+        scrollPanel = scrolled.ScrolledPanel(parent = self.panel, id = wx.ID_ANY,
+                                             style = wx.TAB_TRAVERSAL)
+        scrollPanel.SetupScrolling()
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        #
+        # map selection
+        #
+        mapSelection = self._createMapSelection(parent = scrollPanel)
+        sizer.Add(item = mapSelection, proportion = 0,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        #
+        # manage extern tables
+        #
+        if self.version7 and self.attributeType == 'color':
+            self.cp = wx.CollapsiblePane(scrollPanel, label = _("Import or export color table"),
+                                         winid = wx.ID_ANY,
+                                        style = wx.CP_DEFAULT_STYLE|wx.CP_NO_TLW_RESIZE)
+            self.Bind(wx.EVT_COLLAPSIBLEPANE_CHANGED, self.OnPaneChanged, self.cp)
+        
+            self._createFileSelection(parent = self.cp.GetPane())
+            sizer.Add(item = self.cp, proportion = 0,
+                      flag = wx.ALL | wx.EXPAND, border = 5)
+        #
+        # set vector attributes
+        #
+        vectorAttrb = self._createVectorAttrb(parent = scrollPanel)
+        sizer.Add(item = vectorAttrb, proportion = 0,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        #
+        # body & preview
+        #
+        bodySizer = self._createBody(parent = scrollPanel)
+        sizer.Add(item = bodySizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        
+        scrollPanel.SetSizer(sizer)
+        scrollPanel.Fit()        
+        
+        #
+        # buttons
+        #
+        btnSizer = self._createButtons(self.panel)
+        
+        mainsizer = wx.BoxSizer(wx.VERTICAL)
+        mainsizer.Add(scrollPanel, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
+        mainsizer.Add(item = wx.StaticLine(parent = self.panel, id = wx.ID_ANY,
+                                       style = wx.LI_HORIZONTAL), proportion = 0,
+                                       flag = wx.EXPAND | wx.ALL, border = 5) 
+        mainsizer.Add(item = btnSizer, proportion = 0,
+                  flag = wx.ALL | wx.ALIGN_RIGHT | wx.EXPAND, border = 5)
+        
+        self.panel.SetSizer(mainsizer)
+        mainsizer.Layout()
+        mainsizer.Fit(self.panel)     
+        self.Layout()
+        
+    def OnPaneChanged(self, event = None):
+        # redo the layout
+        self.Layout()
+        # and also change the labels
+        if self.cp.IsExpanded():
+            self.cp.SetLabel('')
+        else:
+            self.cp.SetLabel(_("Import or export color table"))
+        
+    def CheckMapset(self):
+        """!Check if current vector is in current mapset"""
+        if grass.find_file(name = self.inmap,
+                           element = 'vector')['mapset'] == grass.gisenv()['MAPSET']:
+            return True
+        else:
+            return False 
+         
+    def NoConnection(self, vectorName):
+        dlg = wx.MessageDialog(parent = self,
+                                message = _("Database connection for vector map <%s> "
+                                            "is not defined in DB file.  Do you want to create and "
+                                            "connect new attribute table?") % vectorName,
+                                caption = _("No database connection defined"),
+                                style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION | wx.CENTRE)
+        if dlg.ShowModal() == wx.ID_YES:
+            dlg.Destroy()
+            GUI(parent = self).ParseCommand(['v.db.addtable', 'map=' + self.inmap], 
+                                            completed = (self.CreateAttrTable, self.inmap, ''))
+        else:
+            dlg.Destroy()
+  
+    def OnCheckColumn(self, event):
+        """!Use color column instead of color table"""
+        if self.useColumn.GetValue():
+            self.properties['loadColumn'] = self.fromColumn.GetStringSelection()
+            self.properties['storeColumn'] = self.toColumn.GetStringSelection()
+            self.fromColumn.Enable(True)
+            self.toColumn.Enable(True)
+            self.colorTable = False
+            
+            if self.properties['loadColumn']:
+                self.LoadTable()
+            else:
+                self.rulesPanel.Clear()
+        else:
+            self.properties['loadColumn'] = ''
+            self.properties['storeColumn'] = ''
+            self.fromColumn.Enable(False)
+            self.toColumn.Enable(False)
+            self.colorTable = True
+            self.LoadTable()
+            
+    def EnableVectorAttributes(self, enable):
+        """!Enable/disable part of dialog connected with db"""
+        for child in self.colorColumnSizer.GetChildren():
+            child.GetWindow().Enable(enable)
+    
+    def DisableClearAll(self):
+        """!Enable, disable the whole dialog"""
+        self.rulesPanel.Clear()
+        self.EnableVectorAttributes(False)
+        self.btnPreview.Enable(False)
+        self.btnOK.Enable(False)
+        self.btnApply.Enable(False)
+        self.preview.EraseMap()
+        
+    def OnSelectionInput(self, event):
+        """!Vector map selected"""
+        if event:
+            if self.inmap:
+                # switch to another map -> delete temporary column
+                self.DeleteTemporaryColumn()
+            self.inmap = event.GetString()
+            
+        if self.version7 and self.attributeType == 'color': 
+            self.loadRules.SetValue('')
+            self.saveRules.SetValue('')
+        
+        if self.inmap:
+            if not grass.find_file(name = self.inmap, element = 'vector')['file']:
+                self.inmap = None
+        
+        self.UpdateDialog()
+       
+    def UpdateDialog(self):
+        """!Update dialog after map selection"""  
+        
+        if not self.inmap:
+            self.DisableClearAll()
+            return
+        
+        if self.inmap and not self.CheckMapset():
+            # currently v.colors need the map to be in current mapset
+            if self.version7 and self.attributeType == 'color':
+                message = _("Selected map <%(map)s> is not in current mapset <%(mapset)s>. "
+                            "Color rules cannot be edited.") % \
+                            { 'map' : self.inmap,
+                              'mapset' : grass.gisenv()['MAPSET'] }
+            else:
+                message = _("Selected map <%(map)s> is not in current mapset <%(mapset)s>. "
+                            "Attribute table cannot be edited.") % \
+                            { 'map' : self.inmap,
+                              'mapset' : grass.gisenv()['MAPSET'] }
+            wx.CallAfter(GMessage, parent = self, message = message)
+            self.DisableClearAll()
+            return
+              
+        # check for db connection
+        self.dbInfo = VectorDBInfo(self.inmap)
+        enable = True
+        if not len(self.dbInfo.layers): # no connection
+            if not (self.version7 and self.attributeType == 'color'): # otherwise it doesn't matter
+                wx.CallAfter(self.NoConnection, self.inmap)
+                enable = False
+            for combo in (self.layerSelect, self.sourceColumn, self.fromColumn, self.toColumn):
+                combo.SetValue("")
+                combo.Clear()
+            for prop in ('sourceColumn', 'loadColumn', 'storeColumn'):
+                self.properties[prop] = ''
+            self.EnableVectorAttributes(False)
+        else: # db connection exist
+        # initialize layer selection combobox
+            self.EnableVectorAttributes(True)
+            self.layerSelect.InsertLayers(self.inmap)
+            # initialize attribute table for layer=1
+            self.properties['layer'] = self.layerSelect.GetString(0)
+            self.layerSelect.SetStringSelection(self.properties['layer'])
+            layer = int(self.properties['layer'])
+            self.properties['table'] = self.dbInfo.layers[layer]['table']
+            
+            if self.attributeType == 'color':
+                self.AddTemporaryColumn(type = 'varchar(11)')
+            else:
+                self.AddTemporaryColumn(type = 'integer')
+            
+            # initialize column selection comboboxes 
+            
+            self.OnLayerSelection(event = None)
+
+        if self.version7 and self.attributeType == 'color':
+            self.useColumn.SetValue(False)
+            self.OnCheckColumn(event = None) 
+                    
+        self.LoadTable()
+            
+        self.btnPreview.Enable(enable)
+        self.btnOK.Enable(enable)
+        self.btnApply.Enable(enable)   
+    
+    def AddTemporaryColumn(self, type):
+        """!Add temporary column to not overwrite the original values,
+        need to be deleted when closing dialog and unloading map
+        
+        @param type type of column (e.g. vachar(11))"""
+        # because more than one dialog with the same map can be opened we must test column name and
+        # create another one
+        while self.properties['tmpColumn'] in self.dbInfo.GetTableDesc(self.properties['table']).keys():
+            name, idx = self.properties['tmpColumn'].split('_')
+            idx = int(idx)
+            idx += 1
+            self.properties['tmpColumn'] = name + '_' + str(idx)
+        
+        if self.version7:
+            modul = 'v.db.addcolumn'
+        else:
+            modul = 'v.db.addcol'
+        ret = RunCommand(modul,
+                         parent = self,
+                         map = self.inmap,
+                         layer = self.properties['layer'],
+                         column = '%s %s' % (self.properties['tmpColumn'], type))
+        
+    def DeleteTemporaryColumn(self):
+        """!Delete temporary column"""
+        if self.inmap:
+            if self.version7:
+                modul = 'v.db.dropcolumn'
+            else:
+                modul = 'v.db.dropcol'
+            ret = RunCommand(modul,
+                             map = self.inmap,
+                             layer = self.properties['layer'],
+                             column = self.properties['tmpColumn'])
+        
+    def OnLayerSelection(self, event):
+        # reset choices in column selection comboboxes if layer changes
+        vlayer = int(self.layerSelect.GetStringSelection())
+        self.sourceColumn.InsertColumns(vector = self.inmap, layer = vlayer,
+                                        type = ['integer', 'double precision'], dbInfo = self.dbInfo,
+                                        excludeCols = ['tmpColumn'])
+        self.sourceColumn.SetStringSelection('cat')
+        self.properties['sourceColumn'] = self.sourceColumn.GetString(0)
+        
+        if self.attributeType == 'color':
+            type = ['character']
+        else:
+            type = ['integer']
+        self.fromColumn.InsertColumns(vector = self.inmap, layer = vlayer, type = type,
+                                      dbInfo = self.dbInfo, excludeCols = ['tmpColumn'])
+        self.toColumn.InsertColumns(vector = self.inmap, layer = vlayer, type = type,
+                                    dbInfo = self.dbInfo, excludeCols = ['tmpColumn'])
+        
+        found = self.fromColumn.FindString(self.columnsProp[self.attributeType]['name'])
+        if found != wx.NOT_FOUND:
+            self.fromColumn.SetSelection(found)
+            self.toColumn.SetSelection(found)
+            self.properties['loadColumn'] = self.fromColumn.GetString(found)
+            self.properties['storeColumn'] = self.toColumn.GetString(found)
+        else:
+            self.properties['loadColumn'] = ''
+            self.properties['storeColumn'] = ''
+        
+        if event:
+            self.LoadTable()
+        self.Update()
+        
+    def OnSourceColumnSelection(self, event):
+        self.properties['sourceColumn'] = event.GetString()
+        
+        self.LoadTable()
+    
+    def OnAddColumn(self, event):
+        """!Add GRASS(RGB,SIZE,WIDTH) column if it doesn't exist"""
+        if self.columnsProp[self.attributeType]['name'] not in self.fromColumn.GetItems():
+            if self.version7:
+                modul = 'v.db.addcolumn'
+            else:
+                modul = 'v.db.addcol'
+            ret = RunCommand(modul,
+                             map = self.inmap,
+                             layer = self.properties['layer'],
+                             columns = '%s %s' % (self.columnsProp[self.attributeType]['name'],
+                                                  self.columnsProp[self.attributeType]['type1']))
+            self.toColumn.InsertColumns(self.inmap, self.properties['layer'],
+                                        type = self.columnsProp[self.attributeType]['type2'])
+            self.toColumn.SetStringSelection(self.columnsProp[self.attributeType]['name'])
+            self.properties['storeColumn'] = self.toColumn.GetStringSelection()
+            
+            self.LoadTable()
+        else:
+            GMessage(parent = self,
+                     message = _("%s column already exists.") % \
+                         self.columnsProp[self.attributeType]['name'])
+                        
+    def CreateAttrTable(self, dcmd, layer, params, propwin):
+        """!Create attribute table"""
+        if dcmd:
+            cmd = utils.CmdToTuple(dcmd)
+            ret = RunCommand(cmd[0], **cmd[1])
+            if ret == 0:
+                self.OnSelectionInput(None)
+                return True
+            
+        for combo in (self.layerSelect, self.sourceColumn, self.fromColumn, self.toColumn):
+            combo.SetValue("")
+            combo.Disable()
+        return False    
+    
+    def LoadTable(self):
+        """!Load table"""
+        if self.colorTable:
+            ColorTable.LoadTable(self, mapType = 'vector')
+        else:
+            self.LoadRulesFromColumn()
+            
+    def LoadRulesFromColumn(self):
+        """!Load current column (GRASSRGB, size column)"""
+        
+        self.rulesPanel.Clear()
+        if not self.properties['sourceColumn']:
+            self.preview.EraseMap()
+            return
+        
+        busy = wx.BusyInfo(message = _("Please wait, loading data from attribute table..."),
+                           parent = self)
+        wx.Yield()
+        
+        columns = self.properties['sourceColumn']
+        if self.properties['loadColumn']:
+            columns += ',' + self.properties['loadColumn']
+        
+        sep = ';'            
+        if self.inmap:
+            outFile = tempfile.NamedTemporaryFile(mode = 'w+b')
+            ret = RunCommand('v.db.select',
+                             quiet = True,
+                             flags = 'c',
+                             map = self.inmap,
+                             layer = self.properties['layer'],
+                             columns = columns,
+                             fs = sep,
+                             stdout = outFile)
+        else:
+            self.preview.EraseMap()
+            busy.Destroy()
+            return
+        
+        outFile.seek(0)
+        i = 0
+        minim = maxim = 0.0
+        limit = 1000
+        
+        colvallist = []
+        readvals = False
+        
+        while True:
+            # os.linesep doesn't work here (MSYS)
+            record = outFile.readline().replace('\n', '')
+            if not record:
+                break
+            self.rulesPanel.ruleslines[i] = {}
+            
+            if not self.properties['loadColumn']:
+                col1 = record
+                col2 = None
+            else:
+                col1, col2 = record.split(sep)
+            
+            if float(col1) < minim:
+                minim = float(col1)
+            if float(col1) > maxim:
+                maxim = float(col1)
+
+                
+            # color rules list should only have unique values of col1, not all records
+            if col1 not in colvallist:                
+                self.rulesPanel.ruleslines[i]['value'] = col1
+                self.rulesPanel.ruleslines[i][self.attributeType] = col2
+
+                colvallist.append(col1)            
+                i += 1
+            
+            if i > limit and readvals == False:
+                dlg = wx.MessageDialog (parent = self, message = _(
+                                        "Number of loaded records reached %d, "
+                                        "displaying all the records will be time-consuming "
+                                        "and may lead to computer freezing, "
+                                        "do you still want to continue?") % i,
+                                        caption = _("Too many records"),
+                                        style  =  wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
+                if dlg.ShowModal() == wx.ID_YES:
+                    readvals = True
+                    dlg.Destroy()
+                else:
+                    busy.Destroy()
+                    dlg.Destroy()
+                    self.updateColumn = False
+                    return
+            
+        self.rulesPanel.AddRules(i, start = True)
+        ret = self.rulesPanel.LoadRules()
+        
+        self.properties['min'], self.properties['max'] = minim, maxim
+        self.SetRangeLabel()
+        
+        if ret:
+            self.OnPreview()   
+        else:
+            self.rulesPanel.Clear()
+    
+        busy.Destroy()
+        
+    def SetRangeLabel(self):
+        """!Set labels with info about attribute column range"""
+        
+        if self.properties['sourceColumn']:
+            ctype = self.dbInfo.GetTableDesc(self.properties['table'])[self.properties['sourceColumn']]['ctype']
+        else:
+            ctype = int
+        
+        range = ''
+        if self.properties['min'] or self.properties['max']:
+            if ctype == float:
+                range = "%s: %.1f - %.1f)" % (_("range"),
+                                              self.properties['min'], self.properties['max'])
+            elif ctype == int:
+                range = "%s: %d - %d)" % (_("range"),
+                                          self.properties['min'], self.properties['max'])
+        if range:
+            if self.colorTable:
+                self.cr_label.SetLabel(_("Enter vector attribute values or percents %s:") % range)
+            else:
+                self.cr_label.SetLabel(_("Enter vector attribute values %s:") % range)
+        else:
+            if self.colorTable:
+                self.cr_label.SetLabel(_("Enter vector attribute values or percents:"))
+            else:
+                self.cr_label.SetLabel(_("Enter vector attribute values:"))
+                
+    def OnFromColSelection(self, event):
+        """!Selection in combobox (for loading values) changed"""
+        self.properties['loadColumn'] = event.GetString()
+        
+        self.LoadTable()
+    
+    def OnToColSelection(self, event):
+        """!Selection in combobox (for storing values) changed"""
+        self.properties['storeColumn'] = event.GetString()
+    
+    def OnPreview(self, event = None, tmp = True):
+        """!Update preview (based on computational region)"""
+        if self.colorTable:
+            self.OnTablePreview(tmp)
+        else:
+            self.OnColumnPreview() 
+                                 
+    def OnTablePreview(self, tmp):
+        """!Update preview (based on computational region)"""
+        if not self.inmap:
+            self.preview.EraseMap()
+            return
+        
+        ltype = 'vector'
+        cmdlist = ['d.vect',
+                   'map=%s' % self.inmap]
+        
+        # find existing color table and copy to temp file
+        old_colrtable = None
+        path = grass.find_file(name = self.inmap, element = 'vector')['file']
+        
+        if os.path.exists(os.path.join(path, 'colr')):
+            old_colrtable = os.path.join(path, 'colr')
+            colrtemp = utils.GetTempfile()
+            shutil.copyfile(old_colrtable, colrtemp)
+            
+        ColorTable.DoPreview(self, ltype, cmdlist)  
+        
+        # restore previous color table
+        if tmp:
+            if old_colrtable:
+                shutil.copyfile(colrtemp, old_colrtable)
+                os.remove(colrtemp)
+            else:
+                RunCommand('v.colors',
+                           parent = self,
+                           flags = 'r',
+                           map = self.inmap)
+        
+    def OnColumnPreview(self):
+        """!Update preview (based on computational region)"""
+        if not self.inmap or not self.properties['tmpColumn']:
+            self.preview.EraseMap()
+            return
+        
+        cmdlist = ['d.vect',
+                   'map=%s' % self.inmap,
+                   'type=point,line,boundary,area']
+                
+        if self.attributeType == 'color':
+            cmdlist.append('flags=a')
+            cmdlist.append('rgb_column=%s' % self.properties['tmpColumn'])
+        elif self.attributeType == 'size':
+            cmdlist.append('size_column=%s' % self.properties['tmpColumn'])
+        elif self.attributeType == 'width':
+            cmdlist.append('width_column=%s' % self.properties['tmpColumn'])
+            
+        ltype = 'vector'
+        
+        ColorTable.DoPreview(self, ltype, cmdlist)
+        
+    def OnHelp(self, event):
+        """!Show GRASS manual page"""
+        cmd = 'v.colors'
+        ColorTable.RunHelp(self, cmd = cmd)
+        
+    def UseAttrColumn(self, useAttrColumn):
+        """!Find layers and apply the changes in d.vect command"""
+        layers = self.parent.curr_page.maptree.FindItemByData(key = 'name', value = self.inmap)
+        if not layers:
+            return
+        for layer in layers:
+            if self.parent.curr_page.maptree.GetPyData(layer)[0]['type'] != 'vector':
+                continue
+            cmdlist = self.parent.curr_page.maptree.GetPyData(layer)[0]['maplayer'].GetCmd()
+            
+            if self.attributeType == 'color':
+                if useAttrColumn:
+                    cmdlist[1].update({'flags': 'a'})
+                    cmdlist[1].update({'rgb_column': self.properties['storeColumn']})
+                else:
+                    if 'flags' in cmdlist[1]:
+                        cmdlist[1]['flags'] = cmdlist[1]['flags'].replace('a', '')
+                    cmdlist[1].pop('rgb_column', None)
+            elif self.attributeType == 'size':
+                cmdlist[1].update({'size_column': self.properties['storeColumn']})
+            elif self.attributeType == 'width':
+                cmdlist[1].update({'width_column' :self.properties['storeColumn']})
+            self.parent.curr_page.maptree.GetPyData(layer)[0]['cmd'] = cmdlist
+        
+    def CreateColorTable(self, tmp = False):
+        """!Create color rules (color table or color column)"""
+        if self.colorTable:
+            ret = ColorTable.CreateColorTable(self)
+        else:
+            if self.updateColumn:
+                ret = self.UpdateColorColumn(tmp)
+            else:
+                ret = True
+        
+        return ret
+        
+    def UpdateColorColumn(self, tmp):
+        """!Creates color table
+
+        @return True on success
+        @return False on failure
+        """
+        rulestxt = ''
+        
+        for rule in self.rulesPanel.ruleslines.itervalues():
+            if 'value' not in rule: # skip empty rules
+                break
+            
+            if tmp:
+                rgb_col = self.properties['tmpColumn']
+            else:
+                rgb_col = self.properties['storeColumn']
+                if not self.properties['storeColumn']:
+                    GMessage(parent = self.parent,
+                             message = _("Please select column to save values to."))
+            
+            rulestxt += "UPDATE %s SET %s='%s' WHERE %s ;\n" % (self.properties['table'],
+                                                                rgb_col,
+                                                                rule[self.attributeType],
+                                                                rule['value'])
+        if not rulestxt:
+            return False
+        
+        gtemp = utils.GetTempfile()
+        output = open(gtemp, "w")
+        try:
+            output.write(rulestxt)
+        finally:
+            output.close()
+        
+        RunCommand('db.execute',
+                   parent = self,
+                   input = gtemp)
+        
+        return True
+    
+    def OnCancel(self, event):
+        """!Do not apply any changes and close the dialog"""
+        self.DeleteTemporaryColumn()
+        self.Map.Clean()
+        self.Destroy()
+
+    def OnApply(self, event):
+        """!Apply selected color table
+        
+        @return True on success otherwise False
+        """
+        if self.colorTable:
+            self.UseAttrColumn(False)
+        else:
+            if not self.properties['storeColumn']:
+                GError(_("No color column defined. Operation canceled."),
+                       parent = self)
+                return
+            
+            self.UseAttrColumn(True)
+        
+        return ColorTable.OnApply(self, event)
+           
+class BufferedWindow(wx.Window):
+    """!A Buffered window class"""
+    def __init__(self, parent, id,
+                 style = wx.NO_FULL_REPAINT_ON_RESIZE,
+                 Map = None, **kwargs):
+        
+        wx.Window.__init__(self, parent, id, style = style, **kwargs)
+
+        self.parent = parent
+        self.Map = Map
+        
+        # re-render the map from GRASS or just redraw image
+        self.render = True
+        # indicates whether or not a resize event has taken place
+        self.resize = False 
+
+        #
+        # event bindings
+        #
+        self.Bind(wx.EVT_PAINT,        self.OnPaint)
+        self.Bind(wx.EVT_IDLE,         self.OnIdle)
+        self.Bind(wx.EVT_ERASE_BACKGROUND, lambda x: None)
+
+        #
+        # render output objects
+        #
+        # image file to be rendered
+        self.mapfile = None 
+        # wx.Image object (self.mapfile)
+        self.img = None
+
+        self.pdc = wx.PseudoDC()
+        # will store an off screen empty bitmap for saving to file
+        self._Buffer = None 
+
+        # make sure that extents are updated at init
+        self.Map.region = self.Map.GetRegion()
+        self.Map.SetRegion()
+
+    def Draw(self, pdc, img = None, pdctype = 'image'):
+        """!Draws preview or clears window"""
+        pdc.BeginDrawing()
+
+        Debug.msg (3, "BufferedWindow.Draw(): pdctype=%s" % (pdctype))
+
+        if pdctype == 'clear': # erase the display
+            bg = wx.WHITE_BRUSH
+            pdc.SetBackground(bg)
+            pdc.Clear()
+            self.Refresh()
+            pdc.EndDrawing()
+            return
+
+        if pdctype == 'image' and img:
+            bg = wx.TRANSPARENT_BRUSH
+            pdc.SetBackground(bg)
+            bitmap = wx.BitmapFromImage(img)
+            w, h = bitmap.GetSize()
+            pdc.DrawBitmap(bitmap, 0, 0, True) # draw the composite map
+            
+        pdc.EndDrawing()
+        self.Refresh()
+
+    def OnPaint(self, event):
+        """!Draw pseudo DC to buffer"""
+        self._Buffer = wx.EmptyBitmap(self.Map.width, self.Map.height)
+        dc = wx.BufferedPaintDC(self, self._Buffer)
+        
+        # use PrepareDC to set position correctly
+        self.PrepareDC(dc)
+        
+        # we need to clear the dc BEFORE calling PrepareDC
+        bg = wx.Brush(self.GetBackgroundColour())
+        dc.SetBackground(bg)
+        dc.Clear()
+        
+        # create a clipping rect from our position and size
+        # and the Update Region
+        rgn = self.GetUpdateRegion()
+        r = rgn.GetBox()
+        
+        # draw to the dc using the calculated clipping rect
+        self.pdc.DrawToDCClipped(dc, r)
+        
+    def OnSize(self, event):
+        """!Init image size to match window size"""
+        # set size of the input image
+        self.Map.width, self.Map.height = self.GetClientSize()
+
+        # Make new off screen bitmap: this bitmap will always have the
+        # current drawing in it, so it can be used to save the image to
+        # a file, or whatever.
+        self._Buffer = wx.EmptyBitmap(self.Map.width, self.Map.height)
+
+        # get the image to be rendered
+        self.img = self.GetImage()
+
+        # update map display
+        if self.img and self.Map.width + self.Map.height > 0: # scale image during resize
+            self.img = self.img.Scale(self.Map.width, self.Map.height)
+            self.render = False
+            self.UpdatePreview()
+
+        # re-render image on idle
+        self.resize = True
+
+    def OnIdle(self, event):
+        """!Only re-render a preview image from GRASS during
+        idle time instead of multiple times during resizing.
+        """
+        if self.resize:
+            self.render = True
+            self.UpdatePreview()
+        event.Skip()
+
+    def GetImage(self):
+        """!Converts files to wx.Image"""
+        if self.Map.mapfile and os.path.isfile(self.Map.mapfile) and \
+                os.path.getsize(self.Map.mapfile):
+            img = wx.Image(self.Map.mapfile, wx.BITMAP_TYPE_ANY)
+        else:
+            img = None
+        
+        return img
+    
+    def UpdatePreview(self, img = None):
+        """!Update canvas if window changes geometry"""
+        Debug.msg (2, "BufferedWindow.UpdatePreview(%s): render=%s" % (img, self.render))
+        oldfont = ""
+        oldencoding = ""
+        
+        if self.render:
+            # extent is taken from current map display
+            try:
+                self.Map.region = copy.deepcopy(self.parent.parent.curr_page.maptree.Map.region)
+            except AttributeError:
+                self.Map.region = self.Map.GetRegion()
+            # render new map images
+            self.mapfile = self.Map.Render(force = self.render)
+            self.img = self.GetImage()
+            self.resize = False
+        
+        if not self.img:
+            return
+        
+        # paint images to PseudoDC
+        self.pdc.Clear()
+        self.pdc.RemoveAll()
+        # draw map image background
+        self.Draw(self.pdc, self.img, pdctype = 'image')
+        
+        self.resize = False
+        
+    def EraseMap(self):
+        """!Erase preview"""
+        self.Draw(self.pdc, pdctype = 'clear')
diff --git a/gui/wxpython/modules/extensions.py b/gui/wxpython/modules/extensions.py
new file mode 100644
index 0000000..7e75378
--- /dev/null
+++ b/gui/wxpython/modules/extensions.py
@@ -0,0 +1,513 @@
+"""!
+ at package modules.extensions
+
+ at brief GRASS Addons extensions management classes
+
+Classes:
+ - extensions::InstallExtensionWindow
+ - extensions::ExtensionTree
+ - extensions::UninstallExtensionWindow
+ - extensions::CheckListExtension
+
+(C) 2008-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import os
+import sys
+
+import wx
+import wx.lib.mixins.listctrl as listmix
+try:
+    import wx.lib.agw.customtreectrl as CT
+except ImportError:
+    import wx.lib.customtreectrl as CT
+import wx.lib.flatnotebook as FN
+
+import grass.script as grass
+from grass.script import task as gtask
+
+from core             import globalvar
+from core.gcmd        import GError, RunCommand
+from core.utils       import SetAddOnPath
+from gui_core.forms   import GUI
+from gui_core.widgets import ItemTree
+from gui_core.ghelp   import SearchModuleWindow
+
+class InstallExtensionWindow(wx.Frame):
+    def __init__(self, parent, id = wx.ID_ANY,
+                 title = _("Fetch & install extension from GRASS Addons"), **kwargs):
+        self.parent = parent
+        self.options = dict() # list of options
+        
+        wx.Frame.__init__(self, parent = parent, id = id, title = title, **kwargs)
+        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
+        
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
+
+        self.repoBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                    label = " %s " % _("Repository"))
+        self.treeBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                    label = " %s " % _("List of extensions"))
+        
+        self.repo = wx.TextCtrl(parent = self.panel, id = wx.ID_ANY)
+        self.fullDesc = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
+                                    label = _("Fetch full info including description and keywords"))
+        self.fullDesc.SetValue(True)
+        
+        self.search = SearchModuleWindow(parent = self.panel)
+        self.search.SetSelection(0) 
+        
+        self.tree   = ExtensionTree(parent = self.panel, log = parent.GetLogWindow())
+        
+        self.optionBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                      label = " %s " % _("Options"))
+        
+        task = gtask.parse_interface('g.extension.py')
+        
+        ignoreFlags = ['l', 'c', 'g', 'a', 'f', 'quiet', 'verbose']
+        if sys.platform == 'win32':
+            ignoreFlags.append('d')
+            ignoreFlags.append('i')
+        
+        for f in task.get_options()['flags']:
+            name = f.get('name', '')
+            desc = f.get('label', '')
+            if not desc:
+                desc = f.get('description', '')
+            if not name and not desc:
+                continue
+            if name in ignoreFlags:
+                continue
+            self.options[name] = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
+                                             label = desc)
+        self.repo.SetValue(task.get_param(value = 'svnurl').get('default',
+                                                                'http://svn.osgeo.org/grass/grass-addons'))
+        
+        self.statusbar = self.CreateStatusBar(number = 1)
+        
+        self.btnFetch = wx.Button(parent = self.panel, id = wx.ID_ANY,
+                                  label = _("&Fetch"))
+        self.btnFetch.SetToolTipString(_("Fetch list of available modules from GRASS Addons SVN repository"))
+        self.btnClose = wx.Button(parent = self.panel, id = wx.ID_CLOSE)
+        self.btnInstall = wx.Button(parent = self.panel, id = wx.ID_ANY,
+                                    label = _("&Install"))
+        self.btnInstall.SetToolTipString(_("Install selected add-ons GRASS module"))
+        self.btnInstall.Enable(False)
+        self.btnCmd = wx.Button(parent = self.panel, id = wx.ID_ANY,
+                                label = _("Command dialog"))
+        self.btnCmd.SetToolTipString(_('Open %s dialog') % 'g.extension.py')
+
+        self.btnClose.Bind(wx.EVT_BUTTON, self.OnCloseWindow)
+        self.btnFetch.Bind(wx.EVT_BUTTON, self.OnFetch)
+        self.btnInstall.Bind(wx.EVT_BUTTON, self.OnInstall)
+        self.btnCmd.Bind(wx.EVT_BUTTON, self.OnCmdDialog)
+        self.tree.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnItemActivated)
+        self.tree.Bind(wx.EVT_TREE_SEL_CHANGED,    self.OnItemSelected)
+        self.search.Bind(wx.EVT_TEXT_ENTER,        self.OnShowItem)
+        self.search.Bind(wx.EVT_TEXT,              self.OnUpdateStatusBar)
+
+        self._layout()
+
+    def _layout(self):
+        """!Do layout"""
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        repoSizer = wx.StaticBoxSizer(self.repoBox, wx.VERTICAL)
+        repo1Sizer = wx.BoxSizer(wx.HORIZONTAL)
+        repo1Sizer.Add(item = self.repo, proportion = 1,
+                      flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = 1)
+        repo1Sizer.Add(item = self.btnFetch, proportion = 0,
+                      flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL, border = 1)
+        repoSizer.Add(item = repo1Sizer,
+                      flag = wx.EXPAND)
+        repoSizer.Add(item = self.fullDesc)
+        
+        findSizer = wx.BoxSizer(wx.HORIZONTAL)
+        findSizer.Add(item = self.search, proportion = 1)
+        
+        treeSizer = wx.StaticBoxSizer(self.treeBox, wx.HORIZONTAL)
+        treeSizer.Add(item = self.tree, proportion = 1,
+                      flag = wx.ALL | wx.EXPAND, border = 1)
+
+        # options
+        optionSizer = wx.StaticBoxSizer(self.optionBox, wx.VERTICAL)
+        for key in self.options.keys():
+            optionSizer.Add(item = self.options[key], proportion = 0)
+        
+        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+        btnSizer.Add(item = self.btnCmd, proportion = 0,
+                     flag = wx.RIGHT, border = 5)
+        btnSizer.AddSpacer(10)
+        btnSizer.Add(item = self.btnClose, proportion = 0,
+                     flag = wx.RIGHT, border = 5)
+        btnSizer.Add(item = self.btnInstall, proportion = 0)
+        
+        sizer.Add(item = repoSizer, proportion = 0,
+                  flag = wx.ALL | wx.EXPAND, border = 3)
+        sizer.Add(item = findSizer, proportion = 0,
+                  flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
+        sizer.Add(item = treeSizer, proportion = 1,
+                  flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
+        sizer.Add(item = optionSizer, proportion = 0,
+                        flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
+        sizer.Add(item = btnSizer, proportion = 0,
+                  flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
+        
+        self.panel.SetSizer(sizer)
+        sizer.Fit(self.panel)
+        
+        self.Layout()
+
+    def _getCmd(self):
+        item = self.tree.GetSelected()
+        if not item or not item.IsOk():
+            return ['g.extension.py']
+        
+        name = self.tree.GetItemText(item)
+        if not name:
+            GError(_("Extension not defined"), parent = self)
+            return
+        flags = list()
+        for key in self.options.keys():
+            if self.options[key].IsChecked():
+                flags.append('-%s' % key)
+        
+        return ['g.extension.py'] + flags + ['extension=' + name,
+                                             'svnurl=' + self.repo.GetValue().strip()]
+    
+    def OnUpdateStatusBar(self, event):
+        """!Update statusbar text"""
+        element = self.search.GetSelection()
+        if not self.tree.IsLoaded():
+            self.SetStatusText(_("Fetch list of available extensions by clicking on 'Fetch' button"), 0)
+            return
+        
+        self.tree.SearchItems(element = element,
+                              value = event.GetString())
+        
+        nItems = len(self.tree.itemsMarked)
+        if event.GetString():
+            self.SetStatusText(_("%d items match") % nItems, 0)
+        else:
+            self.SetStatusText("", 0)
+        
+        event.Skip()
+    
+    def OnCloseWindow(self, event):
+        """!Close window"""
+        self.Destroy()
+
+    def OnFetch(self, event):
+        """!Fetch list of available extensions"""
+        wx.BeginBusyCursor()
+        self.SetStatusText(_("Fetching list of modules from GRASS-Addons SVN (be patient)..."), 0)
+        self.tree.Load(url = self.repo.GetValue().strip(), full = self.fullDesc.IsChecked())
+        self.SetStatusText("", 0)
+        wx.EndBusyCursor()
+
+    def OnItemActivated(self, event):
+        item = event.GetItem()
+        data = self.tree.GetPyData(item)
+        if data and 'command' in data:
+            self.OnInstall(event = None)
+        
+    def OnInstall(self, event):
+        """!Install selected extension"""
+        log = self.parent.GetLogWindow()
+        log.RunCmd(self._getCmd(), onDone = self.OnDone)
+        
+    def OnDone(self, cmd, returncode):
+        if returncode == 0:
+            if not os.getenv('GRASS_ADDON_PATH'):
+                SetAddOnPath()
+            
+            globalvar.UpdateGRASSAddOnCommands()
+            log = self.parent.GetLogWindow()
+            log.GetPrompt().SetFilter(None)
+    
+    def OnItemSelected(self, event):
+        """!Item selected"""
+        item = event.GetItem()
+        self.tree.itemSelected = item
+        data = self.tree.GetPyData(item)
+        if data is None:
+            self.SetStatusText('', 0)
+            self.btnInstall.Enable(False)
+        else:
+            self.SetStatusText(data.get('description', ''), 0)
+            self.btnInstall.Enable(True)
+
+    def OnShowItem(self, event):
+        """!Show selected item"""
+        self.tree.OnShowItem(event)
+        if self.tree.GetSelected():
+            self.btnInstall.Enable()
+        else:
+            self.btnInstall.Enable(False)
+
+    def OnCmdDialog(self, event):
+        """!Shows command dialog"""
+        GUI(parent = self).ParseCommand(cmd = self._getCmd())
+        
+class ExtensionTree(ItemTree):
+    """!List of available extensions"""
+    def __init__(self, parent, log, id = wx.ID_ANY,
+                 ctstyle = CT.TR_HIDE_ROOT | CT.TR_FULL_ROW_HIGHLIGHT | CT.TR_HAS_BUTTONS |
+                 CT.TR_LINES_AT_ROOT | CT.TR_SINGLE,
+                 **kwargs):
+        self.parent = parent # GMFrame
+        self.log    = log
+        
+        super(ExtensionTree, self).__init__(parent, id, ctstyle = ctstyle, **kwargs)
+        
+        self._initTree()
+        
+    def _initTree(self):
+        for prefix in ('display', 'database',
+                       'general', 'imagery',
+                       'misc', 'postscript', 'paint',
+                       'raster', 'raster3d', 'sites', 'vector', 'wxGUI', 'other'):
+            self.AppendItem(parentId = self.root,
+                            text = prefix)
+        self._loaded = False
+        
+    def _expandPrefix(self, c):
+        name = { 'd'  : 'display',
+                 'db' : 'database',
+                 'g'  : 'general',
+                 'i'  : 'imagery',
+                 'm'  : 'misc',
+                 'ps' : 'postscript',
+                 'p'  : 'paint',
+                 'r'  : 'raster',
+                 'r3' : 'raster3d',
+                 's'  : 'sites',
+                 'v'  : 'vector',
+                 'wx' : 'wxGUI',
+                 ''   : 'other' }
+        
+        if c in name:
+            return name[c]
+        
+        return c
+    
+    def _findItem(self, text):
+        """!Find item"""
+        item = self.GetFirstChild(self.root)[0]
+        while item and item.IsOk():
+            if text == self.GetItemText(item):
+                return item
+            
+            item = self.GetNextSibling(item)
+        
+        return None
+    
+    def Load(self, url, full = False):
+        """!Load list of extensions"""
+        self.DeleteAllItems()
+        self.root = self.AddRoot(_("Menu tree"))
+        self._initTree()
+        
+        if full:
+            flags = 'g'
+        else:
+            flags = 'l'
+        ret = RunCommand('g.extension.py', read = True, parent = self,
+                         svnurl = url,
+                         flags = flags, quiet = True)
+        if not ret:
+            return
+        
+        mdict = dict()
+        for line in ret.splitlines():
+            if full:
+                try:
+                    key, value = line.split('=', 1)
+                except ValueError:
+                    key = 'name'
+                    value = line
+                
+                if key == 'name':
+                    try:
+                        prefix, name = value.split('.', 1)
+                    except ValueError:
+                        prefix = ''
+                        name = value
+                    if prefix not in mdict:
+                        mdict[prefix] = dict()
+                    mdict[prefix][name] = dict()
+                else:
+                    mdict[prefix][name][key] = value
+            else:
+                try:
+                    prefix, name = line.strip().split('.', 1)
+                except:
+                    prefix = ''
+                    name = line.strip()
+                
+                if self._expandPrefix(prefix) == prefix:
+                    prefix = ''
+                    
+                if prefix not in mdict:
+                    mdict[prefix] = dict()
+                    
+                mdict[prefix][name] = { 'command' : prefix + '.' + name }
+        
+        for prefix in mdict.keys():
+            prefixName = self._expandPrefix(prefix)
+            item = self._findItem(prefixName)
+            names = mdict[prefix].keys()
+            names.sort()
+            for name in names:
+                if prefix:
+                    text = prefix + '.' + name
+                else:
+                    text = name
+                new = self.AppendItem(parentId = item,
+                                      text = text)
+                data = dict()
+                for key in mdict[prefix][name].keys():
+                    data[key] = mdict[prefix][name][key]
+                
+                self.SetPyData(new, data)
+        
+        self._loaded = True
+
+    def IsLoaded(self):
+        """Check if items are loaded"""
+        return self._loaded
+
+class UninstallExtensionWindow(wx.Frame):
+    def __init__(self, parent, id = wx.ID_ANY,
+                 title = _("Uninstall GRASS Addons extensions"), **kwargs):
+        self.parent = parent
+        
+        wx.Frame.__init__(self, parent = parent, id = id, title = title, **kwargs)
+        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
+        
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
+
+        self.extBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                   label = " %s " % _("List of installed extensions"))
+        
+        self.extList = CheckListExtension(parent = self.panel)
+
+        # buttons
+        self.btnUninstall = wx.Button(parent = self.panel, id = wx.ID_ANY,
+                                    label = _("&Uninstall"))
+        self.btnUninstall.SetToolTipString(_("Uninstall selected AddOns extensions"))
+        self.btnCmd = wx.Button(parent = self.panel, id = wx.ID_ANY,
+                                label = _("Command dialog"))
+        self.btnCmd.SetToolTipString(_('Open %s dialog') % 'g.extension')
+        self.btnClose = wx.Button(parent = self.panel, id = wx.ID_CLOSE)
+        
+        self.btnUninstall.Bind(wx.EVT_BUTTON, self.OnUninstall)
+        self.btnCmd.Bind(wx.EVT_BUTTON, self.OnCmdDialog)
+        self.btnClose.Bind(wx.EVT_BUTTON, self.OnCloseWindow)
+        
+        self._layout()
+        
+    def _layout(self):
+        """!Do layout"""
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        
+        extSizer = wx.StaticBoxSizer(self.extBox, wx.HORIZONTAL)
+        extSizer.Add(item = self.extList, proportion = 1,
+                     flag = wx.ALL | wx.EXPAND, border = 1)
+        
+        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+        btnSizer.Add(item = self.btnCmd, proportion = 0,
+                     flag = wx.RIGHT, border = 5)
+        btnSizer.AddSpacer(10)
+        btnSizer.Add(item = self.btnClose, proportion = 0,
+                     flag = wx.RIGHT, border = 5)
+        btnSizer.Add(item = self.btnUninstall, proportion = 0)
+        
+        sizer.Add(item = extSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 3)
+        sizer.Add(item = btnSizer, proportion = 0,
+                  flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
+        
+        self.panel.SetSizer(sizer)
+        sizer.Fit(self.panel)
+        
+        self.Layout()
+
+    def OnCloseWindow(self, event):
+        """!Close window"""
+        self.Destroy()
+
+    def OnUninstall(self, event):
+        """!Uninstall selected extensions"""
+        log = self.parent.GetLogWindow()
+        eList = self.extList.GetExtensions()
+        if not eList:
+            GError(_("No extension selected for removal. "
+                     "Operation canceled."),
+                   parent = self)
+            return
+        
+        for ext in eList:
+            files = RunCommand('g.extension.py', parent = self, read = True, quiet = True,
+                               extension = ext, operation = 'remove').splitlines()
+            dlg = wx.MessageDialog(parent = self,
+                                   message = _("List of files to be removed:\n%(files)s\n\n"
+                                               "Do you want really to remove <%(ext)s> extension?") % \
+                                       { 'files' : os.linesep.join(files), 'ext' : ext },
+                                   caption = _("Remove extension"),
+                                   style = wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
+            
+            if dlg.ShowModal() ==  wx.ID_YES:
+                RunCommand('g.extension.py', flags = 'f', parent = self, quiet = True,
+                           extension = ext, operation = 'remove')
+        
+        self.extList.LoadData()
+        
+        # update prompt
+        globalvar.UpdateGRASSAddOnCommands(eList)
+        log = self.parent.GetLogWindow()
+        log.GetPrompt().SetFilter(None)
+        
+    def OnCmdDialog(self, event):
+        """!Shows command dialog"""
+        GUI(parent = self).ParseCommand(cmd = ['g.extension.py'])
+
+class CheckListExtension(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.CheckListCtrlMixin):
+    """!List of mapset/owner/group"""
+    def __init__(self, parent):
+        self.parent = parent
+        
+        wx.ListCtrl.__init__(self, parent, id = wx.ID_ANY,
+                             style = wx.LC_REPORT)
+        listmix.CheckListCtrlMixin.__init__(self)
+        
+        # setup mixins
+        listmix.ListCtrlAutoWidthMixin.__init__(self)
+
+        self.InsertColumn(0, _('Extension'))
+        self.LoadData()
+        
+    def LoadData(self):
+        """!Load data into list"""
+        self.DeleteAllItems()
+        for ext in RunCommand('g.extension.py',
+                              quiet = True, parent = self, read = True,
+                              flags = 'a').splitlines():
+            if ext:
+                self.InsertStringItem(sys.maxint, ext)
+
+    def GetExtensions(self):
+        """!Get extensions to be un-installed
+        """
+        extList = list()
+        for i in range(self.GetItemCount()):
+            if self.IsChecked(i):
+                name = self.GetItemText(i)
+                if name:
+                    extList.append(name)
+        
+        return extList
diff --git a/gui/wxpython/gui_modules/histogram.py b/gui/wxpython/modules/histogram.py
similarity index 80%
rename from gui/wxpython/gui_modules/histogram.py
rename to gui/wxpython/modules/histogram.py
index ddfa26b..028ca6a 100644
--- a/gui/wxpython/gui_modules/histogram.py
+++ b/gui/wxpython/modules/histogram.py
@@ -1,13 +1,15 @@
 """!
- at package histogram.py
+ at package modules.histogram
 
-Plotting histogram
+Plotting histogram based on d.histogram
 
 Classes:
- - BufferedWindow
- - HistFrame
+ - histogram::BufferedWindow
+ - histogram::HistogramFrame
+ - histogram::HistogramToolbar
+
+(C) 2007, 2010-2011 by the GRASS Development Team
 
-COPYRIGHT: (C) 2007, 2010-2011 by the GRASS Development Team
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
@@ -16,21 +18,19 @@ This program is free software under the GNU General Public License
 """
 
 import os
-import sys
 
 import wx
 
-import render
-import menuform
-import disp_print
-import utils
-import gdialogs
-import globalvar
-from toolbars import HistogramToolbar
-from preferences import DefaultFontDialog
-from debug import Debug
-from icon import Icons
-from gcmd import GError
+from core                 import globalvar
+from core.render          import Map
+from gui_core.forms       import GUI
+from mapdisp.gprint       import PrintOptions
+from core.utils           import GetLayerNameFromCmd
+from gui_core.dialogs     import GetImageHandlers, ImageSizeDialog
+from gui_core.preferences import DefaultFontDialog
+from core.debug           import Debug
+from core.gcmd            import GError
+from gui_core.toolbars    import BaseToolbar, BaseIcons
 
 class BufferedWindow(wx.Window):
     """!A Buffered window class.
@@ -258,17 +258,18 @@ class BufferedWindow(wx.Window):
         """
         self.Draw(self.pdc, pdctype = 'clear')
         
-class HistFrame(wx.Frame):
+class HistogramFrame(wx.Frame):
     """!Main frame for hisgram display window. Uses d.histogram
     rendered onto canvas
     """
     def __init__(self, parent = None, id = wx.ID_ANY,
-                 title = _("GRASS GIS Histogram of raster map"),
+                 title = _("GRASS GIS Histogramming Tool (d.histogram)"),
+                 size = wx.Size(500, 350),
                  style = wx.DEFAULT_FRAME_STYLE, **kwargs):
-        wx.Frame.__init__(self, parent, id, title, style = style, **kwargs)
+        wx.Frame.__init__(self, parent, id, title, size = size, style = style, **kwargs)
         self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
         
-        self.Map   = render.Map()  # instance of render.Map to be associated with display
+        self.Map   = Map()         # instance of render.Map to be associated with display
         self.layer = None          # reference to layer with histogram
         
         # Init variables
@@ -281,8 +282,15 @@ class HistFrame(wx.Frame):
         self.toolbar = HistogramToolbar(parent = self)
         self.SetToolBar(self.toolbar)
 
+        # find selected map
+        self.mapname = None
+        if parent.GetName() == "MapWindow" and not parent.IsStandalone():
+            tree = parent.GetLayerManager().GetLayerTree()
+
+            if tree.layer_selected and tree.GetPyData(tree.layer_selected)[0]['type'] == 'raster':
+                self.mapname = tree.GetPyData(tree.layer_selected)[0]['maplayer'].name
+
         # Add statusbar
-        self.mapname = ''
         self.statusbar = self.CreateStatusBar(number = 1, style = 0)
         # self.statusbar.SetStatusWidths([-2, -1])
         hist_frame_statusbar_fields = ["Histogramming %s" % self.mapname]
@@ -299,12 +307,16 @@ class HistFrame(wx.Frame):
         self.Bind(wx.EVT_CLOSE,    self.OnCloseWindow)
         
         # Init print module and classes
-        self.printopt = disp_print.PrintOptions(self, self.HistWindow)
+        self.printopt = PrintOptions(self, self.HistWindow)
         
         # Add layer to the map
-        self.layer = self.Map.AddLayer(type = "command", name = 'histogram', command = ['d.histogram'],
+        self.layer = self.Map.AddLayer(type = "command", name = 'histogram', command = [['d.histogram']],
                                        l_active = False, l_hidden = False, l_opacity = 1, l_render = False)
-        
+        if self.mapname:
+            self.SetHistLayer(self.mapname, None)
+        else:
+            self.OnErase(None)
+
     def InitDisplay(self):
         """!Initialize histogram display, set dimensions and region
         """
@@ -316,35 +328,34 @@ class HistFrame(wx.Frame):
         cmd = ['d.histogram']
         if self.mapname != '':
             cmd.append('map=%s' % self.mapname)
-        
-        menuform.GUI(parent = self).ParseCommand(cmd,
-                                                 completed = (self.GetOptData, None, self.params))
-        
+        module = GUI(parent = self)
+        module.ParseCommand(cmd, completed = (self.GetOptData, None, self.params))
+
     def GetOptData(self, dcmd, layer, params, propwin):
         """!Callback method for histogram command generated by dialog
         created in menuform.py
         """
         if dcmd:
-            name, found = utils.GetLayerNameFromCmd(dcmd, fullyQualified = True,
-                                                    layerType = 'raster')
+            name, found = GetLayerNameFromCmd(dcmd, fullyQualified = True,
+                                              layerType = 'raster')
             if not found:
                 GError(parent = propwin,
                        message = _("Raster map <%s> not found") % name)
                 return
             
-            self.SetHistLayer(name)
+            self.SetHistLayer(name, dcmd)
         self.params = params
         self.propwin = propwin
-        
         self.HistWindow.UpdateHist()
         
-    def SetHistLayer(self, name):
+    def SetHistLayer(self, name, cmd = None):
         """!Set histogram layer
         """
         self.mapname = name
-        
+        if not cmd:
+            cmd = ['d.histogram',('map=%s' % self.mapname)]
         self.layer = self.Map.ChangeLayer(layer = self.layer,
-                                          command = [['d.histogram', 'map=%s' % self.mapname],],
+                                          command = [cmd],
                                           active = True)
         
         return self.layer
@@ -387,10 +398,10 @@ class HistFrame(wx.Frame):
     def SaveToFile(self, event):
         """!Save to file
         """
-        filetype, ltype = gdialogs.GetImageHandlers(self.HistWindow.img)
+        filetype, ltype = GetImageHandlers(self.HistWindow.img)
         
         # get size
-        dlg = gdialogs.ImageSizeDialog(self)
+        dlg = ImageSizeDialog(self)
         dlg.CentreOnParent()
         if dlg.ShowModal() != wx.ID_OK:
             dlg.Destroy()
@@ -459,4 +470,34 @@ class HistFrame(wx.Frame):
             pass
         self.Map.Clean()
         self.Destroy()
-        
+
+class HistogramToolbar(BaseToolbar):
+    """!Histogram toolbar (see histogram.py)
+    """
+    def __init__(self, parent):
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # realize the toolbar
+        self.Realize()
+        
+    def _toolbarData(self):
+        """!Toolbar data"""
+        return self._getToolbarData((('histogram', BaseIcons["histogramD"],
+                                      self.parent.OnOptions),
+                                     ('render', BaseIcons["display"],
+                                      self.parent.OnRender),
+                                     ('erase', BaseIcons["erase"],
+                                      self.parent.OnErase),
+                                     ('font', BaseIcons["font"],
+                                      self.parent.SetHistFont),
+                                     (None, ),
+                                     ('save', BaseIcons["saveFile"],
+                                      self.parent.SaveToFile),
+                                     ('hprint', BaseIcons["print"],
+                                      self.parent.PrintMenu),
+                                     (None, ),
+                                     ('quit', BaseIcons["quit"],
+                                      self.parent.OnQuit))
+                                    )
diff --git a/gui/wxpython/gui_modules/mcalc_builder.py b/gui/wxpython/modules/mcalc_builder.py
similarity index 86%
rename from gui/wxpython/gui_modules/mcalc_builder.py
rename to gui/wxpython/modules/mcalc_builder.py
index 3f0e11c..1f4e5de 100644
--- a/gui/wxpython/gui_modules/mcalc_builder.py
+++ b/gui/wxpython/modules/mcalc_builder.py
@@ -1,10 +1,10 @@
 """!
- at package mcalc_builder.py
+ at package modules::mcalc_builder
 
- at brief Map calculator, wrapper for r.mapcalc
+ at brief Map calculator, GUI wrapper for r.mapcalc
 
 Classes:
- - MapCalcFrame
+ - mcalc_builder::MapCalcFrame
 
 (C) 2008, 2011 by the GRASS Development Team
 
@@ -18,21 +18,19 @@ This program is free software under the GNU General Public License
 
 import os
 import sys
-import time
+import re
 
-import globalvar
+if __name__ == "__main__":
+    sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'wxpython'))
+from core import globalvar
 import wx
 
 import grass.script as grass
 
-import gcmd
-import gselect
-try:
-    import subprocess
-except:
-    sys.path.append(os.path.join(globalvar.ETCWXDIR, "compat"))
-    import subprocess
-from preferences import globalSettings as UserSettings
+from core.gcmd        import GError, RunCommand
+from gui_core.gselect import Select
+from core.settings    import UserSettings
+
 
 class MapCalcFrame(wx.Frame):
     """!Mapcalc Frame class. Calculator-style window to create and run
@@ -83,7 +81,7 @@ class MapCalcFrame(wx.Frame):
             'if(x,a)':'if( , )',
             'if(x,a,b)':'if( , , )',
             'if(x,a,b,c)':'if( , , , )',
-            'int(x)':'if()',
+            'int(x)':'int()',
             'isnull(x)':'isnull()',
             'log(x)':'log(',
             'log(x,b)':'log( , )',
@@ -114,6 +112,11 @@ class MapCalcFrame(wx.Frame):
             element = 'rast3d'
         else:
             element = 'cell'
+
+        # characters which can be in raster map name but the map name must be then quoted
+        self.charactersToQuote = '+-&!<>%~?^|'
+        # stores last typed map name in Select widget to distinguish typing from selection
+        self.lastMapName = ''
         
         self.operatorBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
                                         label=" %s " % _('Operators'))
@@ -125,9 +128,10 @@ class MapCalcFrame(wx.Frame):
         #
         # Buttons
         #
-        self.btn_clear = wx.Button(parent = self.panel, id = wx.ID_CLEAR, label = _("Cl&ear"))
+        self.btn_clear = wx.Button(parent = self.panel, id = wx.ID_CLEAR)
         self.btn_help = wx.Button(parent = self.panel, id = wx.ID_HELP)
         self.btn_run = wx.Button(parent = self.panel, id = wx.ID_ANY, label = _("&Run"))
+        self.btn_run.SetForegroundColour(wx.Colour(35, 142, 35))
         self.btn_run.SetDefault()
         self.btn_close = wx.Button(parent = self.panel, id = wx.ID_CLOSE)
         self.btn_save = wx.Button(parent = self.panel, id = wx.ID_SAVE)
@@ -210,8 +214,8 @@ class MapCalcFrame(wx.Frame):
             self.mapsellabel.SetLabel(_('Insert existing 3D raster map'))
         else:
             self.mapsellabel.SetLabel(_('Insert existing raster map'))
-        self.mapselect = gselect.Select(parent = self.panel, id = wx.ID_ANY, size = (250, -1),
-                                        type = element, multiple = False)
+        self.mapselect = Select(parent = self.panel, id = wx.ID_ANY, size = (250, -1),
+                                type = element, multiple = False)
         self.functlabel = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
                                         label = _('Insert mapcalc function'))
         self.function = wx.ComboBox(parent = self.panel, id = wx.ID_ANY, 
@@ -238,7 +242,7 @@ class MapCalcFrame(wx.Frame):
         self.btn_save.Bind(wx.EVT_BUTTON, self.OnSaveExpression)
         self.btn_load.Bind(wx.EVT_BUTTON, self.OnLoadExpression)
         
-        self.mapselect.Bind(wx.EVT_TEXT, self.OnSelect)
+        self.mapselect.Bind(wx.EVT_TEXT, self.OnSelectTextEvt)
         self.function.Bind(wx.EVT_COMBOBOX, self._return_funct)
         self.function.Bind(wx.EVT_TEXT_ENTER, self.OnSelect)
         self.newmaptxt.Bind(wx.EVT_TEXT, self.OnUpdateStatusBar)
@@ -391,17 +395,36 @@ class MapCalcFrame(wx.Frame):
         elif event.GetId() == self.btn['parenr'].GetId(): mark = ")"
         self._addSomething(mark)
         
+    def OnSelectTextEvt(self, event):
+        """!Checks if user is typing or the event was emited by map selection.
+        Prevents from changing focus.
+        """
+        item = event.GetString()
+        if not (abs(len(item) - len(self.lastMapName)) == 1  and \
+            self.lastMapName in item or item in self.lastMapName):
+            self.OnSelect(event)
+        self.lastMapName = item
+
     def OnSelect(self, event):
         """!Gets raster map or function selection and send it to
-        insertion method
+        insertion method. 
+
+        Checks for characters which can be in raster map name but 
+        the raster map name must be then quoted.
         """
-        item = event.GetString()
+        item = event.GetString().strip()
+        if any((char in item) for char in self.charactersToQuote):
+            item = '"' + item + '"'
         self._addSomething(item)
 
     def OnUpdateStatusBar(self, event):
         """!Update statusbar text"""
-        self.SetStatusText("r.mapcalc '%s = %s'" % (self.newmaptxt.GetValue(),
-                                                    self.text_mcalc.GetValue()))
+        expr = self.text_mcalc.GetValue().strip().replace("\n", " ")
+        cmd = 'r.mapcalc'
+        if self.rast3d:
+            cmd = 'r3.mapcalc'
+        self.SetStatusText("%s '%s = %s'" % (cmd, self.newmaptxt.GetValue(),
+                                             expr))
         event.Skip()
         
     def _addSomething(self, what):
@@ -421,13 +444,16 @@ class MapCalcFrame(wx.Frame):
         except:
             pass
         
-        newmcalcstr += what
-        position_offset += len(what)
-        newmcalcstr += ' ' + mcalcstr[position:]
+        newmcalcstr += what + ' ' + mcalcstr[position:]
         
         self.text_mcalc.SetValue(newmcalcstr)
-        if what == '()':
-            position_offset -= 1
+        if len(what) > 1:
+            match = re.search(pattern="\(.*\)", string=what)
+            if match:
+                position_offset += match.start() + 1
+            else:
+                position_offset += len(what)
+
         self.text_mcalc.SetInsertionPoint(position + position_offset)
         self.text_mcalc.Update()
         
@@ -436,36 +462,44 @@ class MapCalcFrame(wx.Frame):
         """
         name = self.newmaptxt.GetValue().strip()
         if not name:
-            gcmd.GError(parent = self,
-                        message = _("You must enter the name of a new map to create"))
+            GError(parent = self,
+                   message = _("You must enter the name of "
+                               "a new raster map to create."))
             return
         
-        if not self.text_mcalc.GetValue().strip():
-            gcmd.GError(parent = self,
-                        message = _("You must enter a mapcalc statement to create a new map"))
+        if not (name[0] == '"' and name[-1] == '"') and any((char in name) for char in self.charactersToQuote):
+            name = '"' + name + '"'
+
+        expr = self.text_mcalc.GetValue().strip().replace("\n", " ")
+        if not expr:
+            GError(parent = self,
+                   message = _("You must enter an expression "
+                               "to create a new raster map."))
             return
         
-        mctxt = self.text_mcalc.GetValue().strip().replace("\n"," ")
-        mctxt = mctxt.replace(" " , "")
-        
         if self.log:
-            cmd = [self.cmd, str('%s = %s' % (name, mctxt))]
+            cmd = [self.cmd, str('%s = %s' % (name, expr))]
             self.log.RunCmd(cmd, onDone = self.OnDone)
             self.parent.Raise()
         else:
-            gcmd.RunCommand(self.cmd,
-                            "%s=%s" % (name, mctxt))
-        
+            RunCommand(self.cmd,
+                       **{name: expr})
+
     def OnDone(self, cmd, returncode):
         """!Add create map to the layer tree"""
         if not self.addbox.IsChecked():
             return
-        name = self.newmaptxt.GetValue().strip() + '@' + grass.gisenv()['MAPSET']
+        name = self.newmaptxt.GetValue().strip(' "') + '@' + grass.gisenv()['MAPSET']
+        ltype = 'raster'
+        lcmd = 'd.rast'
+        if self.rast3d:
+            ltype = '3d-raster'
+            lcmd = 'd.rast3d.py'
         mapTree = self.parent.GetLayerTree()
         if not mapTree.GetMap().GetListOfLayers(l_name = name):
-            mapTree.AddLayer(ltype = 'raster',
+            mapTree.AddLayer(ltype = ltype,
                              lname = name,
-                             lcmd = ['d.rast', 'map=%s' % name],
+                             lcmd = [lcmd, 'map=%s' % name],
                              multiple = False)
         
         display = self.parent.GetLayerTree().GetMapDisplay()
@@ -536,15 +570,17 @@ class MapCalcFrame(wx.Frame):
     def OnHelp(self, event):
         """!Launches r.mapcalc help
         """
-        gcmd.RunCommand('g.manual', parent = self, entry = self.cmd)
+        RunCommand('g.manual', parent = self, entry = self.cmd)
         
     def OnClose(self,event):
         """!Close window"""
         self.Destroy()
-
+        
 if __name__ == "__main__":
+    import gettext
+    gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
+    
     app = wx.App(0)
     frame = MapCalcFrame(parent = None, cmd = 'r.mapcalc')
     frame.Show()
     app.MainLoop()
-
diff --git a/gui/wxpython/gui_modules/ogc_services.py b/gui/wxpython/modules/ogc_services.py
similarity index 87%
rename from gui/wxpython/gui_modules/ogc_services.py
rename to gui/wxpython/modules/ogc_services.py
index ae46f07..ded5072 100644
--- a/gui/wxpython/gui_modules/ogc_services.py
+++ b/gui/wxpython/modules/ogc_services.py
@@ -1,15 +1,15 @@
 """!
- at package ogc_services.py
+ at package module.ogc_services
 
 @brief Dialogs for OGC services
 
 Currently only implemeted WMS.
 
 List of classes:
- - WMSDialog
- - LayersList
+ - ogc_services::WMSDialog
+ - ogc_services::LayersList
 
-(C) 2009 by the GRASS Development Team
+(C) 2009-2011 by the GRASS Development Team
 
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
@@ -21,9 +21,9 @@ import wx
 from wx.gizmos import TreeListCtrl
 import wx.lib.mixins.listctrl as listmix
 
-import gcmd
-
-from preferences import globalSettings as UserSettings
+from core.gcmd     import GError, RunCommand
+from core.settings import UserSettings
+from grass.script.core import find_program
 
 class WMSDialog(wx.Dialog):
     def __init__(self, parent, service = 'wms',
@@ -161,18 +161,26 @@ class WMSDialog(wx.Dialog):
 
     def OnConnect(self, event):
         """!Button 'Connect' pressed"""
+        # 'r.in.wms -l' output changes depending on the parser used.
+        # the parsing below depends on the cleaner `xml2` version.
+        if not find_program('xml2'):
+            GError(_("The 'xml2' parser is required, please install it "
+                     "first. You may also try running r.in.wms directly "
+                     "from the command line."))
+            return
+
         server = self.server.GetValue()
         if not server:
             self.btn_import.Enable(False)
             return # not reachable
 
         layers = {}
-        ret = gcmd.RunCommand('r.in.wms',
-                              quiet = True,
-                              parent = self,
-                              read = True,
-                              flags = 'l',
-                              mapserver = server)
+        ret = RunCommand('r.in.wms',
+                         quiet = True,
+                         parent = self,
+                         read = True,
+                         flags = 'l',
+                         mapserver = server)
         
         if not ret:
             self.list.LoadData()
@@ -192,15 +200,18 @@ class WMSDialog(wx.Dialog):
                 layers[value] = {}
                 lastLayer = value
             elif key == 'title':
-                layers[lastLayer][key] = value
+                if lastLayer and 'title' not in layers[lastLayer]:
+                    layers[lastLayer][key] = value.decode('utf8')
             elif key == 'style':
-                if 'style' not in layers[lastLayer]:
-                    layers[lastLayer]['style'] = {}
-                layers[lastLayer]['style'][value] = ''
-                lastStyle = value
+                if lastLayer:
+                    if 'style' not in layers[lastLayer]:
+                        layers[lastLayer]['style'] = {}
+                    layers[lastLayer]['style'][value] = ''
+                    lastStyle = value
             elif key == 'style title':
-                layers[lastLayer]['style'][lastStyle] = value
-        
+                if lastLayer:
+                    layers[lastLayer]['style'][lastStyle] = value
+
         # update list of layers
         self.list.LoadData(layers)
         
diff --git a/gui/wxpython/gui_modules/vclean.py b/gui/wxpython/modules/vclean.py
similarity index 57%
rename from gui/wxpython/gui_modules/vclean.py
rename to gui/wxpython/modules/vclean.py
index a435ebc..62b1085 100644
--- a/gui/wxpython/gui_modules/vclean.py
+++ b/gui/wxpython/modules/vclean.py
@@ -1,14 +1,13 @@
 """
- at package vclean.py
+ at package modules.vclean
 
 @brief Dialog for interactive construction of vector cleaning
 operations
 
 Classes:
- - VectorCleaningFrame
+ - vclean::VectorCleaningFrame
 
 (C) 2010-2011 by the GRASS Development Team
-
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
@@ -16,62 +15,55 @@ This program is free software under the GNU General Public License
 """
 
 import os
-import sys
-import shutil
 
 import wx
 import wx.lib.scrolledpanel as scrolled
 
 from grass.script import core as grass
 
-import dbm
-import gcmd
-import globalvar
-import gselect
-import render
-import utils
-from debug import Debug as Debug
-from preferences import globalSettings as UserSettings
+from core.gcmd        import RunCommand, GError
+from core             import globalvar
+from gui_core.gselect import Select
+from core.debug       import Debug
+from core.settings    import UserSettings
 
 class VectorCleaningFrame(wx.Frame):
-    def __init__(self, parent, id=wx.ID_ANY, title=_('set up vector cleaning tools'),
-                 pos=wx.DefaultPosition, size=(-1, -1),
-                 style=wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER,
+    def __init__(self, parent, id = wx.ID_ANY, title = _('Set up vector cleaning tools'),
+                 style = wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER,
                  **kwargs):
         """!
         Dialog for interactively defining vector cleaning tools
         """
-        wx.Frame.__init__(self, parent, id, title, pos, size, style)
-
+        wx.Frame.__init__(self, parent, id, title, style = style, **kwargs)
+        
         self.parent = parent # GMFrame
         if self.parent:
             self.log = self.parent.GetLogWindow()
         else:
             self.log = None
-  
+        
         # grass command
         self.cmd = 'v.clean'
         
         # statusbar
         self.CreateStatusBar()
-
+        
 	# icon
         self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
-
-	# self.panel not set as in colorrules
-        # self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
+        
+        self.panel = wx.Panel(parent = self, id = wx.ID_ANY)
         
         # input map to clean
         self.inmap = ''
         
         # cleaned output map
         self.outmap = ''
-
+        
 	self.ftype = ''
-
+        
         # cleaning tools
         self.toolslines = {}
-
+        
         self.tool_desc_list = [
             _('break lines/boundaries'),
             _('remove duplicates'),
@@ -87,7 +79,7 @@ class VectorCleaningFrame(wx.Frame):
 	    _('remove lines/boundaries of zero length'),
 	    _('remove small angles at nodes')
 	    ]
-
+        
         self.tool_list = [
             'break',
             'rmdupl',
@@ -103,7 +95,7 @@ class VectorCleaningFrame(wx.Frame):
 	    'rmline',
 	    'rmsa'
 	    ]
-
+        
 	self.ftype = [
 	    'point',
 	    'line',
@@ -111,62 +103,61 @@ class VectorCleaningFrame(wx.Frame):
 	    'centroid',
 	    'area',
 	    'face']
-
-	self.n_ftypes = 6
+        
+	self.n_ftypes = len(self.ftype)
         
 	self.tools_string = ''
 	self.thresh_string = ''
 	self.ftype_string = ''
-
-	self.SetTitle(_('Set up vector cleaning tools'))
+        
 	self.SetStatusText(_("Set up vector cleaning tools"))
 	self.elem = 'vector'
 	self.ctlabel = _('Choose cleaning tools and set thresholds')
-
+        
         # top controls
-        self.inmaplabel = wx.StaticText(parent = self, id = wx.ID_ANY,
+        self.inmaplabel = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
                                          label= _('Select input vector map:'))
-        self.selectionInput = gselect.Select(parent=self, id=wx.ID_ANY,
-                                             size=globalvar.DIALOG_GSELECT_SIZE,
-                                             type='vector')
+        self.selectionInput = Select(parent = self.panel, id = wx.ID_ANY,
+                                     size = globalvar.DIALOG_GSELECT_SIZE,
+                                     type = 'vector')
 	self.ftype_check = {}
-        ftypeBox = wx.StaticBox(parent=self, id=wx.ID_ANY,
-                                label=_(' Feature type: '))
+        ftypeBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
+                                label = _(' Feature type: '))
         self.ftypeSizer = wx.StaticBoxSizer(ftypeBox, wx.HORIZONTAL)
 
-        self.outmaplabel = wx.StaticText(parent = self, id = wx.ID_ANY,
-                                         label= _('Select output vector map:'))
-        self.selectionOutput = gselect.Select(parent=self, id=wx.ID_ANY,
-                                             size=globalvar.DIALOG_GSELECT_SIZE,
-                                             type='vector')
+        self.outmaplabel = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                         label =  _('Select output vector map:'))
+        self.selectionOutput = Select(parent = self.panel, id = wx.ID_ANY,
+                                      size = globalvar.DIALOG_GSELECT_SIZE,
+                                      type = 'vector')
         
-        self.overwrite = wx.CheckBox(parent=self, id=wx.ID_ANY,
-                                       label=_('Allow output files to overwrite existing files'))
-        self.overwrite.SetValue(UserSettings.Get(group='cmd', key='overwrite', subkey='enabled'))
+        self.overwrite = wx.CheckBox(parent = self.panel, id = wx.ID_ANY,
+                                       label = _('Allow output files to overwrite existing files'))
+        self.overwrite.SetValue(UserSettings.Get(group = 'cmd', key = 'overwrite', subkey = 'enabled'))
 
         # cleaning tools
-        self.ct_label = wx.StaticText(parent=self, id=wx.ID_ANY,
-                                      label=self.ctlabel)
+        self.ct_label = wx.StaticText(parent = self.panel, id = wx.ID_ANY,
+                                      label = self.ctlabel)
 
-        self.ct_panel = self.__toolsPanel()
+        self.ct_panel = self._toolsPanel()
 
 	# buttons to manage cleaning tools
-        self.btn_add = wx.Button(parent=self, id=wx.ID_ADD)
-        self.btn_remove = wx.Button(parent=self, id=wx.ID_REMOVE)
-        self.btn_moveup = wx.Button(parent=self, id=wx.ID_UP)
-        self.btn_movedown = wx.Button(parent=self, id=wx.ID_DOWN)
+        self.btn_add = wx.Button(parent = self.panel, id = wx.ID_ADD)
+        self.btn_remove = wx.Button(parent = self.panel, id = wx.ID_REMOVE)
+        self.btn_moveup = wx.Button(parent = self.panel, id = wx.ID_UP)
+        self.btn_movedown = wx.Button(parent = self.panel, id = wx.ID_DOWN)
 
         # add one tool as default
         self.AddTool()
 	self.selected = -1
         
         # Buttons
-        self.btn_close = wx.Button(parent = self, id = wx.ID_CLOSE)
-        self.btn_run = wx.Button(parent = self, id = wx.ID_ANY, label = _("&Run"))
+        self.btn_close = wx.Button(parent = self.panel, id = wx.ID_CLOSE)
+        self.btn_run = wx.Button(parent = self.panel, id = wx.ID_ANY, label = _("&Run"))
         self.btn_run.SetDefault()
-	self.btn_clipboard = wx.Button(parent=self, id=wx.ID_COPY)
+	self.btn_clipboard = wx.Button(parent = self.panel, id = wx.ID_COPY)
 	self.btn_clipboard.SetToolTipString(_("Copy the current command string to the clipboard (Ctrl+C)"))
-        self.btn_help = wx.Button(parent = self, id = wx.ID_HELP)
+        self.btn_help = wx.Button(parent = self.panel, id = wx.ID_HELP)
         
         # bindings
         self.btn_close.Bind(wx.EVT_BUTTON, self.OnClose)
@@ -178,77 +169,76 @@ class VectorCleaningFrame(wx.Frame):
         self.btn_remove.Bind(wx.EVT_BUTTON, self.OnClearTool)
         self.btn_moveup.Bind(wx.EVT_BUTTON, self.OnMoveToolUp)
         self.btn_movedown.Bind(wx.EVT_BUTTON, self.OnMoveToolDown)
-
-        self.SetMinSize(self.GetBestSize())
-
+        
         # layout
         self._layout()
-
-        self.CentreOnScreen()
-        self.Show()
         
+        self.SetMinSize(self.GetBestSize())
+        
+        self.CentreOnScreen()
+                
     def _layout(self):
         sizer = wx.BoxSizer(wx.VERTICAL)
         
         #
         # input output
         #
-	inSizer = wx.GridBagSizer(hgap=5, vgap=5)
+	inSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
 
-        inSizer.Add(item=self.inmaplabel, pos=(0, 0),
-                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border=1)
-        inSizer.Add(item=self.selectionInput, pos=(1, 0),
-                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border=1)
+        inSizer.Add(item = self.inmaplabel, pos = (0, 0),
+                       flag = wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border = 1)
+        inSizer.Add(item = self.selectionInput, pos = (1, 0),
+                       flag = wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border = 1)
 
 	self.ftype_check = [
-	    wx.CheckBox(parent=self, id=wx.ID_ANY, label=_('point')),
-	    wx.CheckBox(parent=self, id=wx.ID_ANY, label=_('line')),
-	    wx.CheckBox(parent=self, id=wx.ID_ANY, label=_('boundary')),
-	    wx.CheckBox(parent=self, id=wx.ID_ANY, label=_('centroid')),
-	    wx.CheckBox(parent=self, id=wx.ID_ANY, label=_('area')),
-	    wx.CheckBox(parent=self, id=wx.ID_ANY, label=_('face'))
+	    wx.CheckBox(parent = self.panel, id = wx.ID_ANY, label = _('point')),
+	    wx.CheckBox(parent = self.panel, id = wx.ID_ANY, label = _('line')),
+	    wx.CheckBox(parent = self.panel, id = wx.ID_ANY, label = _('boundary')),
+	    wx.CheckBox(parent = self.panel, id = wx.ID_ANY, label = _('centroid')),
+	    wx.CheckBox(parent = self.panel, id = wx.ID_ANY, label = _('area')),
+	    wx.CheckBox(parent = self.panel, id = wx.ID_ANY, label = _('face'))
 	    ]
 
 	typeoptSizer = wx.BoxSizer(wx.HORIZONTAL)
 	for num in range(0, self.n_ftypes):
 	    type_box = self.ftype_check[num]
-	    typeoptSizer.Add(item=type_box, flag=wx.ALIGN_LEFT, border=1)
+	    typeoptSizer.Add(item = type_box, flag = wx.ALIGN_LEFT, border = 1)
 
 	self.ftypeSizer.Add(item = typeoptSizer,
-	           flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL, border=2)
+	           flag = wx.ALIGN_CENTER_VERTICAL | wx.ALL, border = 2)
 
-	outSizer = wx.GridBagSizer(hgap=5, vgap=5)
+	outSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
 
-        outSizer.Add(item=self.outmaplabel, pos=(0, 0),
-                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border=1)
-        outSizer.Add(item=self.selectionOutput, pos=(1, 0),
-                       flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border=1)
+        outSizer.Add(item = self.outmaplabel, pos = (0, 0),
+                       flag = wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border = 1)
+        outSizer.Add(item = self.selectionOutput, pos = (1, 0),
+                       flag = wx.ALIGN_CENTER_VERTICAL | wx.ALL | wx.EXPAND, border = 1)
         replaceSizer = wx.BoxSizer(wx.HORIZONTAL)
-        replaceSizer.Add(item=self.overwrite, proportion=1,
-                         flag=wx.ALL | wx.EXPAND, border=1)
+        replaceSizer.Add(item = self.overwrite, proportion = 1,
+                         flag = wx.ALL | wx.EXPAND, border = 1)
 
-        outSizer.Add(item=replaceSizer, pos=(2, 0),
-                       flag=wx.ALL | wx.EXPAND, border=1)
+        outSizer.Add(item = replaceSizer, pos = (2, 0),
+                     flag = wx.ALL | wx.EXPAND, border = 1)
 
         #
         # tools selection
         #
-        bodySizer = wx.GridBagSizer(hgap=5, vgap=5)
+        bodySizer = wx.GridBagSizer(hgap = 5, vgap = 5)
 
-        bodySizer.Add(item=self.ct_label, pos=(0, 0), span=(1, 2),
-                      flag=wx.ALL, border=5)
+        bodySizer.Add(item = self.ct_label, pos = (0, 0), span = (1, 2),
+                      flag = wx.ALL, border = 5)
 
-        bodySizer.Add(item=self.ct_panel, pos=(1, 0), span=(1, 2))
+        bodySizer.Add(item = self.ct_panel, pos = (1, 0), span = (1, 2))
 
-	manageBoxSizer = wx.GridBagSizer(hgap=10, vgap=1)
+	manageBoxSizer = wx.GridBagSizer(hgap = 10, vgap = 1)
 	# start with row 1 for nicer layout
-        manageBoxSizer.Add(item=self.btn_add, pos=(1, 0), border=2, flag=wx.ALL | wx.EXPAND)
-        manageBoxSizer.Add(item=self.btn_remove, pos=(2, 0), border=2, flag=wx.ALL | wx.EXPAND)
-        manageBoxSizer.Add(item=self.btn_moveup, pos=(3, 0), border=2, flag=wx.ALL | wx.EXPAND)
-        manageBoxSizer.Add(item=self.btn_movedown, pos=(4, 0), border=2, flag=wx.ALL | wx.EXPAND)
+        manageBoxSizer.Add(item = self.btn_add, pos = (1, 0), border = 2, flag = wx.ALL | wx.EXPAND)
+        manageBoxSizer.Add(item = self.btn_remove, pos = (2, 0), border = 2, flag = wx.ALL | wx.EXPAND)
+        manageBoxSizer.Add(item = self.btn_moveup, pos = (3, 0), border = 2, flag = wx.ALL | wx.EXPAND)
+        manageBoxSizer.Add(item = self.btn_movedown, pos = (4, 0), border = 2, flag = wx.ALL | wx.EXPAND)
 
-        bodySizer.Add(item=manageBoxSizer, pos=(1, 2),
-                      flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5)
+        bodySizer.Add(item = manageBoxSizer, pos = (1, 2),
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT, border = 5)
 
         bodySizer.AddGrowableCol(2)
         
@@ -257,50 +247,52 @@ class VectorCleaningFrame(wx.Frame):
         #
         btnSizer = wx.BoxSizer(wx.HORIZONTAL)
         btnSizer.Add(self.btn_close,
-                     flag=wx.LEFT | wx.RIGHT, border=5)
+                     flag = wx.LEFT | wx.RIGHT, border = 5)
         btnSizer.Add(self.btn_run,
-                     flag=wx.LEFT | wx.RIGHT, border=5)
+                     flag = wx.LEFT | wx.RIGHT, border = 5)
         btnSizer.Add(self.btn_clipboard,
-                     flag=wx.LEFT | wx.RIGHT, border=5)
+                     flag = wx.LEFT | wx.RIGHT, border = 5)
         btnSizer.Add(self.btn_help,
-                     flag=wx.LEFT | wx.RIGHT, border=5)
+                     flag = wx.LEFT | wx.RIGHT, border = 5)
         
         #
         # put it all together
         #
-        sizer.Add(item=inSizer, proportion=0,
-                  flag=wx.ALL | wx.EXPAND, border=5)
+        sizer.Add(item = inSizer, proportion = 0,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
         
-        sizer.Add(item=self.ftypeSizer, proportion=0,
-                  flag=wx.ALL | wx.EXPAND, border=5)
+        sizer.Add(item = self.ftypeSizer, proportion = 0,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
 
-        sizer.Add(item=outSizer, proportion=0,
-                  flag=wx.ALL | wx.EXPAND, border=5)
+        sizer.Add(item = outSizer, proportion = 0,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
 
-        sizer.Add(item=wx.StaticLine(parent=self, id=wx.ID_ANY,
-                  style=wx.LI_HORIZONTAL), proportion=0,
-                  flag=wx.EXPAND | wx.ALL, border=5) 
+        sizer.Add(item = wx.StaticLine(parent = self, id = wx.ID_ANY,
+                  style = wx.LI_HORIZONTAL), proportion = 0,
+                  flag = wx.EXPAND | wx.ALL, border = 5) 
         
-        sizer.Add(item=bodySizer, proportion=1,
-                  flag=wx.ALL | wx.EXPAND, border=5)
+        sizer.Add(item = bodySizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
 
-        sizer.Add(item=wx.StaticLine(parent=self, id=wx.ID_ANY,
-                  style=wx.LI_HORIZONTAL), proportion=0,
-                  flag=wx.EXPAND | wx.ALL, border=5) 
+        sizer.Add(item = wx.StaticLine(parent = self, id = wx.ID_ANY,
+                  style = wx.LI_HORIZONTAL), proportion = 0,
+                  flag = wx.EXPAND | wx.ALL, border = 5) 
         
-        sizer.Add(item=btnSizer, proportion=0,
-                  flag=wx.ALL | wx.ALIGN_RIGHT, border=5)
+        sizer.Add(item = btnSizer, proportion = 0,
+                  flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
+        
+        self.panel.SetAutoLayout(True)
+        self.panel.SetSizer(sizer)
+        sizer.Fit(self.panel)
         
-        self.SetSizer(sizer)
-        sizer.Fit(self)
         self.Layout()
         
-    def __toolsPanel(self):
-        ct_panel = scrolled.ScrolledPanel(parent=self, id=wx.ID_ANY,
-	                                  size=(500, 240),
-                                          style=wx.SUNKEN_BORDER)
+    def _toolsPanel(self):
+        ct_panel = scrolled.ScrolledPanel(parent = self.panel, id = wx.ID_ANY,
+	                                  size = (500, 240),
+                                          style = wx.SUNKEN_BORDER)
 
-        self.ct_sizer = wx.GridBagSizer(vgap=2, hgap=4)
+        self.ct_sizer = wx.GridBagSizer(vgap = 2, hgap = 4)
         
         ct_panel.SetSizer(self.ct_sizer)
         ct_panel.SetAutoLayout(True)
@@ -316,33 +308,33 @@ class VectorCleaningFrame(wx.Frame):
 	num = snum + 1
 	# tool number
 	tool_no = wx.StaticText(parent = self.ct_panel, id = 3000+num,
-                                         label= str(num)+'.')
+                                         label =  str(num)+'.')
 	# tool
-	tool_cbox = wx.ComboBox(parent = self.ct_panel, id=1000+num, 
+	tool_cbox = wx.ComboBox(parent = self.ct_panel, id = 1000+num, 
 				size = (300, -1), choices = self.tool_desc_list,
 				style = wx.CB_DROPDOWN |
 				wx.CB_READONLY | wx.TE_PROCESS_ENTER)
 	self.Bind(wx.EVT_COMBOBOX, self.OnSetTool, tool_cbox)
 	# threshold
-	txt_ctrl = wx.TextCtrl(parent=self.ct_panel, id=2000+num, value='0.00',
-			       size=(100,-1),
-			       style=wx.TE_NOHIDESEL)
+	txt_ctrl = wx.TextCtrl(parent = self.ct_panel, id = 2000+num, value = '0.00',
+			       size = (100,-1),
+			       style = wx.TE_NOHIDESEL)
 	self.Bind(wx.EVT_TEXT, self.OnThreshValue, txt_ctrl)
 
 	# select
-	select = wx.CheckBox(parent=self.ct_panel, id=num)
+	select = wx.CheckBox(parent = self.ct_panel, id = num)
 	select.SetValue(False)
 	self.Bind(wx.EVT_CHECKBOX, self.OnSelect, select)
 
 	# start with row 1 and col 1 for nicer layout
-	self.ct_sizer.Add(item=tool_no, pos=(num, 1),
-			  flag=wx.ALIGN_CENTER_VERTICAL, border=5)
-	self.ct_sizer.Add(item=tool_cbox, pos=(num, 2),
-			  flag=wx.ALIGN_CENTER | wx.RIGHT, border=5)
-	self.ct_sizer.Add(item=txt_ctrl, pos=(num, 3),
-			  flag=wx.ALIGN_CENTER | wx.RIGHT, border=5)
-	self.ct_sizer.Add(item=select, pos=(num, 4),
-			  flag=wx.ALIGN_CENTER | wx.RIGHT)
+	self.ct_sizer.Add(item = tool_no, pos = (num, 1),
+			  flag = wx.ALIGN_CENTER_VERTICAL, border = 5)
+	self.ct_sizer.Add(item = tool_cbox, pos = (num, 2),
+			  flag = wx.ALIGN_CENTER | wx.RIGHT, border = 5)
+	self.ct_sizer.Add(item = txt_ctrl, pos = (num, 3),
+			  flag = wx.ALIGN_CENTER | wx.RIGHT, border = 5)
+	self.ct_sizer.Add(item = select, pos = (num, 4),
+			  flag = wx.ALIGN_CENTER | wx.RIGHT)
 
 	self.toolslines[num] = {
 	    'tool_desc' : '' ,
@@ -451,13 +443,31 @@ class VectorCleaningFrame(wx.Frame):
 	else:
 	    self.selected = -1
 
+    def OnDone(self, cmd, returncode):
+        """!Command done"""
+        self.SetStatusText('')
+
     def OnCleaningRun(self, event):
         """!Builds options and runs v.clean
         """
+        self.GetCmdStrings()
+
+        err = list()
+        for p, name in ((self.inmap, _('Name of input vector map')),
+                        (self.outmap, _('Name for output vector map')),
+                        (self.tools_string, _('Tools')),
+                        (self.thresh_string, _('Threshold'))):
+            if not p:
+                err.append(_("'%s' not defined") % name)
+        if err:
+            GError(_("Some parameters not defined. Operation "
+                     "canceled.\n\n%s") % '\n'.join(err),
+                   parent = self)
+            return
+
 	self.SetStatusText(_("Executing selected cleaning operations..."))
         snum = len(self.toolslines.keys())
-	self.GetCmdStrings()
-
+        
         if self.log:
 	    cmd = [ self.cmd,
                     'input=%s' % self.inmap,
@@ -469,7 +479,7 @@ class VectorCleaningFrame(wx.Frame):
 	    if self.overwrite.IsChecked():
 		cmd.append('--overwrite')
             
-            self.log.RunCmd(cmd)
+            self.log.RunCmd(cmd, onDone = self.OnDone)
             self.parent.Raise()
         else:
 	    if self.overwrite.IsChecked():
@@ -477,23 +487,23 @@ class VectorCleaningFrame(wx.Frame):
 	    else:
 		overwrite = False
             
-	    gcmd.RunCommand(self.cmd,
-			    input = self.inmap,
-			    output = self.outmap,
-			    type = self.ftype_string,
-			    tool = self.tools_string,
-			    thresh = self.thresh_string,
-			    overwrite = overwrite)
+	    RunCommand(self.cmd,
+                       input = self.inmap,
+                       output = self.outmap,
+                       type = self.ftype_string,
+                       tool = self.tools_string,
+                       thresh = self.thresh_string,
+                       overwrite = overwrite)
 
     def OnClose(self, event):
         self.Destroy()
         
     def OnHelp(self, event):
         """!Show GRASS manual page"""
-        gcmd.RunCommand('g.manual',
-                        quiet = True,
-                        parent = self,
-                        entry = self.cmd)
+        RunCommand('g.manual',
+                   quiet = True,
+                   parent = self,
+                   entry = self.cmd)
         
     def OnCopy(self, event):
         """!Copy the command"""
diff --git a/gui/wxpython/nviz/animation.py b/gui/wxpython/nviz/animation.py
new file mode 100644
index 0000000..100c16b
--- /dev/null
+++ b/gui/wxpython/nviz/animation.py
@@ -0,0 +1,207 @@
+"""!
+ at package nviz.animation
+
+ at brief Nviz (3D view) animation
+
+Classes:
+ - animation::Animation
+
+(C) 2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Anna Kratochvilova <kratochanna gmail.com> 
+"""
+
+import os
+import copy
+
+import wx
+from wx.lib.newevent import NewEvent
+
+wxAnimationFinished, EVT_ANIM_FIN = NewEvent()
+wxAnimationUpdateIndex, EVT_ANIM_UPDATE_IDX = NewEvent()
+
+class Animation:
+    """!Class represents animation as a sequence of states (views).
+    It enables to record, replay the sequence and finally generate
+    all image files. Recording and replaying is based on timer events.
+    There is no frame interpolation like in the Tcl/Tk based Nviz.
+    """
+    def __init__(self, mapWindow, timer):
+        """!Animation constructor
+        
+        @param mapWindow glWindow where rendering takes place
+        @param timer timer for recording and replaying
+        """
+        
+        self.animationList = []         # view states
+        self.timer = timer
+        self.mapWindow = mapWindow
+        self.actions = {'record': self.Record,
+                        'play': self.Play}
+        self.formats = ['ppm', 'tif']   # currently supported formats
+        self.mode = 'record'            # current mode (record, play, save)
+        self.paused = False             # recording/replaying paused
+        self.currentFrame = 0           # index of current frame
+        self.fps = 24 # user settings   # Frames per second
+        
+        self.stopSaving = False         # stop during saving images
+        self.animationSaved = False     # current animation saved or not
+        
+    def Start(self):
+        """!Start recording/playing"""
+        self.timer.Start(self.GetInterval())
+        
+    def Pause(self):
+        """!Pause recording/playing"""
+        self.timer.Stop()
+        
+    def Stop(self):
+        """!Stop recording/playing"""
+        self.timer.Stop()
+        self.PostFinishedEvent()
+        
+    def Update(self):
+        """!Record/play next view state (on timer event)"""
+        self.actions[self.mode]()
+    
+    def Record(self):
+        """!Record new view state"""
+        self.animationList.append({'view' : copy.deepcopy(self.mapWindow.view),
+                                   'iview': copy.deepcopy(self.mapWindow.iview)})
+        self.currentFrame += 1
+        self.PostUpdateIndexEvent(index = self.currentFrame)
+        self.animationSaved = False
+        
+    def Play(self):
+        """!Render next frame"""
+        if not self.animationList:
+            self.Stop()
+            return
+        try:
+            self.IterAnimation()
+        except IndexError:
+            # no more frames
+            self.Stop()
+            
+    def IterAnimation(self):
+        params = self.animationList[self.currentFrame]
+        self.UpdateView(params)
+        self.currentFrame += 1
+        
+        self.PostUpdateIndexEvent(index = self.currentFrame)
+        
+    def UpdateView(self, params):
+        """!Update view data in map window and render"""
+        toolWin = self.mapWindow.GetToolWin()
+        toolWin.UpdateState(view = params['view'], iview = params['iview'])
+        
+        self.mapWindow.UpdateView()
+        
+        self.mapWindow.render['quick'] = True
+        self.mapWindow.Refresh(False)
+        
+    def IsRunning(self):
+        """!Test if timer is running"""
+        return self.timer.IsRunning()
+        
+    def SetMode(self, mode):
+        """!Start animation mode
+        
+        @param mode animation mode (record, play, save)
+        """
+        self.mode = mode
+        
+    def GetMode(self):
+        """!Get animation mode (record, play, save)"""
+        return self.mode
+        
+    def IsPaused(self):
+        """!Test if animation is paused"""
+        return self.paused
+        
+    def SetPause(self, pause):
+        self.paused = pause
+        
+    def Exists(self):
+        """!Returns if an animation has been recorded"""
+        return bool(self.animationList)
+        
+    def GetFrameCount(self):
+        """!Return number of recorded frames"""
+        return len(self.animationList)
+        
+    def Clear(self):
+        """!Clear all records"""
+        self.animationList = []
+        self.currentFrame = 0
+        
+    def GoToFrame(self, index):
+        """!Render frame of given index"""
+        if index >= len(self.animationList):
+            return
+            
+        self.currentFrame = index
+        params = self.animationList[self.currentFrame]
+        self.UpdateView(params)
+        
+    def PostFinishedEvent(self):
+        """!Animation ends"""
+        toolWin = self.mapWindow.GetToolWin()
+        event = wxAnimationFinished(mode = self.mode)
+        wx.PostEvent(toolWin, event)
+        
+    def PostUpdateIndexEvent(self, index):
+        """!Frame index changed, update tool window"""
+        toolWin = self.mapWindow.GetToolWin()
+        event = wxAnimationUpdateIndex(index = index, mode = self.mode)
+        wx.PostEvent(toolWin, event)
+        
+    def StopSaving(self):
+        """!Abort image files generation"""
+        self.stopSaving = True
+        
+    def IsSaved(self):
+        """"!Test if animation has been saved (to images)"""
+        return self.animationSaved
+        
+    def SaveAnimationFile(self, path, prefix, format):
+        """!Generate image files
+        
+        @param path path to direcory
+        @param prefix file prefix
+        @param format index of image file format
+        """
+        w, h = self.mapWindow.GetClientSizeTuple()
+        toolWin = self.mapWindow.GetToolWin()
+        
+        self.currentFrame = 0
+        self.mode = 'save'
+        for params in self.animationList:
+            if not self.stopSaving:
+                self.UpdateView(params)
+                filename = prefix + "_" + str(self.currentFrame) + '.' + self.formats[format]
+                filepath = os.path.join(path, filename)
+                self.mapWindow.SaveToFile(FileName = filepath, FileType = self.formats[format],
+                                                  width = w, height = h)
+                self.currentFrame += 1
+                
+                wx.Yield()
+                toolWin.UpdateFrameIndex(index = self.currentFrame, goToFrame = False)
+            else:
+                self.stopSaving = False
+                break
+        self.animationSaved = True
+        self.PostFinishedEvent()
+
+    def SetFPS(self, fps):
+        """!Set Frames Per Second value
+        @param fps frames per second
+        """
+        self.fps = fps
+    
+    def GetInterval(self):
+        """!Return timer interval in ms"""
+        return 1000. / self.fps
diff --git a/gui/wxpython/nviz/main.py b/gui/wxpython/nviz/main.py
new file mode 100644
index 0000000..822eaf8
--- /dev/null
+++ b/gui/wxpython/nviz/main.py
@@ -0,0 +1,40 @@
+"""!
+ at package nviz.main
+
+ at brief Nviz (3D view) module
+
+This module implements 3D visualization mode for map display.
+
+Map Display supports standard 2D view mode ('mapdisp' module) and
+2.5/3D mode ('nviz_mapdisp' module).
+
+(C) 2008, 2010-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
+ at author Anna Kratochvilova <KratochAnna seznam.cz> (Google SoC 2011)
+"""
+
+errorMsg = ''
+
+try:
+    from wx   import glcanvas
+    from nviz import mapwindow
+    from nviz import tools
+    from nviz import workspace
+    import wxnviz
+    haveNviz = True
+except (ImportError, NameError), err:
+    haveNviz = False
+    errorMsg = err
+
+if haveNviz:
+    GLWindow       = mapwindow.GLWindow
+    NvizToolWindow = tools.NvizToolWindow
+    NvizSettings   = workspace.NvizSettings
+else:
+    GLWindow       = None
+    NvizToolWindow = None
+    NvizSettings   = None
diff --git a/gui/wxpython/nviz/mapwindow.py b/gui/wxpython/nviz/mapwindow.py
new file mode 100644
index 0000000..77bab5c
--- /dev/null
+++ b/gui/wxpython/nviz/mapwindow.py
@@ -0,0 +1,2506 @@
+"""!
+ at package nviz.mapwindow
+
+ at brief wxGUI 3D view mode (map canvas)
+
+This module implements 3D visualization mode for map display.
+
+List of classes:
+ - mapwindow::NvizThread
+ - mapwindow::GLWindow
+
+(C) 2008-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
+ at author Anna Kratochvilova <kratochanna gmail.com> (Google SoC 2011)
+"""
+
+import os
+import sys
+import time
+import copy
+import math
+import types
+import tempfile
+
+from threading import Thread
+
+import wx
+from   wx.lib.newevent import NewEvent
+from   wx              import glcanvas
+from wx.glcanvas       import WX_GL_DEPTH_SIZE
+
+import grass.script as grass
+
+from core.gcmd          import GMessage, GException, GError
+from core.debug         import Debug
+from gui_core.mapwindow import MapWindow
+from gui_core.goutput   import wxCmdOutput
+from nviz.workspace     import NvizSettings
+from core.settings      import UserSettings
+from nviz.animation     import Animation
+from nviz               import wxnviz
+from core.globalvar     import CheckWxVersion
+
+wxUpdateProperties, EVT_UPDATE_PROP  = NewEvent()
+wxUpdateView,       EVT_UPDATE_VIEW  = NewEvent()
+wxUpdateLight,      EVT_UPDATE_LIGHT = NewEvent()
+wxUpdateCPlane,     EVT_UPDATE_CPLANE = NewEvent()
+
+class NvizThread(Thread):
+    def __init__(self, log, progressbar, window):
+        Thread.__init__(self)
+        Debug.msg(5, "NvizThread.__init__():")
+        self.log = log
+        self.progressbar = progressbar
+        self.window = window
+        
+        self._display = None
+        
+        self.setDaemon(True)
+
+    def run(self):
+        self._display = wxnviz.Nviz(self.log, self.progressbar)
+        
+    def GetDisplay(self):
+        """!Get display instance"""
+        return self._display
+
+class GLWindow(MapWindow, glcanvas.GLCanvas):
+    """!OpenGL canvas for Map Display Window"""
+    def __init__(self, parent, id = wx.ID_ANY,
+                 Map = None, tree = None, lmgr = None):
+        self.parent = parent # MapFrame
+        
+        # for wxGTK we need to set WX_GL_DEPTH_SIZE to draw vectors correctly
+        # but we don't know the right value
+        # in wxpython 2.9, there is IsDisplaySupported
+        if CheckWxVersion(version=[2, 8, 11]) and \
+           sys.platform not in ('win32', 'darwin'):
+            depthBuffer = int(UserSettings.Get(group='display', key='nvizDepthBuffer', subkey='value'))
+            attribs=[WX_GL_DEPTH_SIZE, depthBuffer, 0]
+            glcanvas.GLCanvas.__init__(self, parent, id, attribList=attribs)
+        else:
+            glcanvas.GLCanvas.__init__(self, parent, id)
+        
+            
+        MapWindow.__init__(self, parent, id, 
+                           Map, tree, lmgr)
+        self.Hide()
+        
+        self.init = False
+        self.initView = False
+        
+        # render mode 
+        self.render = { 'quick' : False,
+                        # do not render vector lines in quick mode
+                        'vlines' : False,
+                        'vpoints' : False,
+                        'overlays': False }
+        self.mouse = {
+            'use': 'pointer'
+            }
+        self.cursors = {
+            'default' : wx.StockCursor(wx.CURSOR_ARROW),
+            'cross'   : wx.StockCursor(wx.CURSOR_CROSS),
+            }
+        # list of loaded map layers (layer tree items)
+        self.layers  = list()
+        # list of constant surfaces
+        self.constants = list()
+        # id of base surface (when vector is loaded and no surface exist)
+        self.baseId = -1
+        # list of cutting planes
+        self.cplanes = list()
+        # list of query points
+        self.qpoints = list()
+        # list of past views
+        self.viewhistory  = []
+        self.saveHistory = False
+        # offset for dialog (e.g. DisplayAttributesDialog)
+        self.dialogOffset = 5
+        # overlays
+        self.overlays = {}
+        self.imagelist = []
+        self.overlay = wx.Overlay()
+        #self.pdc = wx.PseudoDC()
+        self.textdict = {}
+        self.dragid = -1
+        self.hitradius = 5
+        # layer manager toolwindow
+        self.toolWin = None
+        
+        if self.lmgr:
+            self.log = self.lmgr.goutput
+            logerr = self.lmgr.goutput.GetLog(err = True)
+            logmsg = self.lmgr.goutput.GetLog()
+        else:
+            self.log = logmsg = sys.stdout
+            logerr = sys.stderr
+        
+        # create nviz instance - use display region instead of computational
+        os.environ['GRASS_REGION'] = self.Map.SetRegion(windres = True)
+        
+        self.nvizThread = NvizThread(logerr,
+                                     self.parent.GetProgressBar(),
+                                     logmsg)
+        self.nvizThread.start()
+        time.sleep(.1)
+        self._display = self.nvizThread.GetDisplay()
+        
+        # GRASS_REGION needed only for initialization
+        del os.environ['GRASS_REGION']
+        
+        self.img = wx.Image(self.Map.mapfile, wx.BITMAP_TYPE_ANY)
+        
+        # size of MapWindow, to avoid resizing if size is the same
+        self.size = (0, 0)
+        
+        # default values
+        self.nvizDefault = NvizSettings()
+        self.view = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'view')) # copy
+        self.iview = UserSettings.Get(group = 'nviz', key = 'view', internal = True)
+        self.light = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'light')) # copy
+        self.decoration = self.nvizDefault.SetDecorDefaultProp(type = 'arrow')
+        self.decoration['scalebar'] = []
+        self.decoration['arrow']['size'] = self._getDecorationSize()
+        self.fly = self.InitFly()
+        
+        # timer for flythrough
+        self.timerFly = wx.Timer(self, id = wx.NewId())
+        # timer for animations
+        self.timerAnim = wx.Timer(self, id = wx.NewId())
+        self.animation = Animation(mapWindow = self, timer = self.timerAnim)        
+        
+        self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)
+        self.Bind(wx.EVT_SIZE,             self.OnSize)
+        self.Bind(wx.EVT_PAINT,            self.OnPaint)
+        self._bindMouseEvents()
+        
+        self.Bind(EVT_UPDATE_PROP,   self.UpdateMapObjProperties)
+        self.Bind(EVT_UPDATE_VIEW,   self.OnUpdateView)
+        self.Bind(EVT_UPDATE_LIGHT,  self.UpdateLight)
+        self.Bind(EVT_UPDATE_CPLANE, self.OnUpdateCPlane)
+        
+        self.Bind(wx.EVT_TIMER, self.OnTimerAnim, self.timerAnim)
+        self.Bind(wx.EVT_TIMER, self.OnTimerFly, self.timerFly)
+        self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
+        self.Bind(wx.EVT_KEY_UP, self.OnKeyUp)
+        
+        self.Bind(wx.EVT_CLOSE, self.OnClose)
+        
+        if CheckWxVersion(version=[2, 8, 11]) and \
+           sys.platform not in ('win32', 'darwin'):
+               wx.CallLater(3000, self._warningDepthBuffer)
+        
+        # cplanes cannot be initialized now
+        wx.CallAfter(self.InitCPlanes)
+
+    def _warningDepthBuffer(self):
+        if not self.initView:
+            message=_("Opening 3D view was not successful. "
+                      "Please try to change the value of depth buffer "
+                      "in GUI Settings dialog > tab Map Display > Advanced "
+                      "and restart GUI.")
+            GMessage(message)
+
+    def InitFly(self):
+        """!Initialize fly through dictionary"""
+        fly = {'interval' : 10,             # interval for timerFly
+               'value': [0, 0, 0],          # calculated values for navigation
+               'mode' : 0,                  # fly through mode (0, 1)
+               'exag' : {                   # sensitivity
+                    'move' : UserSettings.Get(group = 'nviz', key = 'fly', subkey = ['exag', 'move']),
+                    'turn' : UserSettings.Get(group = 'nviz', key = 'fly', subkey = ['exag', 'turn'])},
+               'exagMultiplier' : 3,        # speed up by Shift
+               'flySpeed' : 4,              # speed of flying
+               'mouseControl' : None,       # if mouse or keys are used
+               'pos' : {'x' : 0, 'y' : 0},  # virtual mouse position when using arrows
+               'arrowStep' : 50,            # step in pixels (when using arrows)
+               'flySpeedStep' : 2,
+            }
+            
+        return fly
+        
+    def OnTimerFly(self, event):
+        """!Fly event was emitted, move the scene"""
+        if self.mouse['use'] != 'fly':
+            return
+        
+        if self.fly['mouseControl']:
+            mx, my = self.ComputeMxMy(*self.mouse['tmp'])
+        else:
+            mx, my = self.ComputeMxMy(self.fly['pos']['x'], self.fly['pos']['y'])
+            
+        self.ComputeFlyValues(mx = mx, my = my)
+        self._display.FlyThrough(flyInfo = self.fly['value'], mode = self.fly['mode'],
+                                 exagInfo = self.fly['exag'])
+        self.ChangeInnerView()                                 
+        self.render['quick'] = True
+        self.Refresh(False)
+        
+    def ComputeMxMy(self, x, y):
+        """!Compute values for flythrough navigation 
+        (ComputeFlyValues should follow). 
+        
+        Based on visualization/nviz/src/togl_flythrough.c.
+        @param x,y screen coordinates
+        """
+        sx, sy = self.GetClientSizeTuple()
+        dx = dy = 0.01
+        
+        mx = 2 * (float(x) / sx) - 1
+        my = 2 * (float(y) / sy) - 1
+    
+        if mx < - dx:
+            mx += dx
+        elif mx > dx:
+            mx -= dx
+        else:
+            mx = 0.0 # ?
+        if my < - dy:
+            my += dy
+        elif my > dy:
+            my -= dy
+        else:
+            my = 0.0
+    
+        mx = mx / (1.0 - dx)
+        my = my / (1.0 - dy)
+    
+        # Quadratic seems smoother 
+        mx *= abs(mx)
+        my *= abs(my)
+        
+        return mx, my
+        
+    def ComputeFlyValues(self, mx, my):
+        """!Compute parameters for fly-through navigation
+        
+        @params mx,my results from ComputeMxMy method
+        """
+        self.fly['value'] = [0, 0, 0]
+        
+        if self.fly['mode'] == 0:
+            self.fly['value'][0] = self.fly['flySpeed'] * self.fly['interval'] / 1000. # forward */
+            self.fly['value'][1] = mx * 0.1 * self.fly['interval'] / 1000. # heading 
+            self.fly['value'][2] = my * 0.1 * self.fly['interval'] / 1000. # pitch 
+        else:
+            self.fly['value'][0] = mx * 100.0 * self.fly['interval'] /1000.
+            self.fly['value'][2] = - my * 100.0 * self.fly['interval'] /1000.
+    
+    def ChangeFlySpeed(self, increase):
+        """!Increase/decrease flight spped"""
+        if increase:
+            self.fly['flySpeed'] += self.fly['flySpeedStep']
+        else:
+            self.fly['flySpeed'] -= self.fly['flySpeedStep']
+        
+    def __del__(self):
+        """!Stop timers if running, unload data"""
+        self.StopTimer(self.timerAnim)
+        self.StopTimer(self.timerFly)
+        self.UnloadDataLayers(force = True)
+    
+    def StopTimer(self, timer):
+        """!Stop timer if running"""
+        if timer.IsRunning():
+            timer.Stop()
+            
+    def _bindMouseEvents(self):
+        self.Bind(wx.EVT_MOUSE_EVENTS,     self.OnMouseAction)
+        self.Bind(wx.EVT_MOTION,           self.OnMotion)
+        
+    def InitCPlanes(self):
+        """!Initialize cutting planes list"""
+        for i in range(self._display.GetCPlanesCount()):
+            cplane = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'cplane'))
+            cplane['on'] = False
+            self.cplanes.append(cplane)
+        
+    def SetToolWin(self, toolWin):
+        """!Sets reference to nviz toolwindow in layer manager"""
+        self.toolWin = toolWin
+        
+    def GetToolWin(self):
+        """!Returns reference to nviz toolwindow in layer manager"""
+        return self.toolWin
+            
+    def OnClose(self, event):
+        self.StopTimer(self.timerAnim)
+        self.StopTimer(self.timerFly)
+        # cleanup when window actually closes (on quit) and not just is hidden
+        self.UnloadDataLayers(force = True)
+        
+    def OnEraseBackground(self, event):
+        pass # do nothing, to avoid flashing on MSW
+    
+    def OnSize(self, event):
+        size = self.GetClientSize()
+        if self.size != size \
+            and self.GetContext():
+            Debug.msg(3, "GLCanvas.OnSize(): w = %d, h = %d" % \
+                      (size.width, size.height))
+            self.SetCurrent()
+            self._display.ResizeWindow(size.width,
+                                       size.height)
+        
+            # reposition checkbox in statusbar
+            self.parent.StatusbarReposition()
+            
+            # update statusbar
+            self.parent.StatusbarUpdate()
+            
+        self.size = size
+        
+        event.Skip()
+       
+    def OnPaint(self, event):
+        Debug.msg(1, "GLCanvas.OnPaint()")
+        
+        self.render['overlays'] = True
+        dc = wx.PaintDC(self)
+        self.DoPaint()
+        
+
+    def DoPaint(self):
+        self.SetCurrent()
+        
+        if not self.initView:
+            self._display.InitView()
+            self.initView = True
+        
+        self.LoadDataLayers()
+        self.UnloadDataLayers()
+        
+        if not self.init:
+            self.ResetView()
+            
+            if hasattr(self.lmgr, "nviz"):
+                self.lmgr.nviz.UpdatePage('view')
+                self.lmgr.nviz.UpdatePage('light')
+                self.lmgr.nviz.UpdatePage('cplane')
+                self.lmgr.nviz.UpdatePage('decoration')
+                self.lmgr.nviz.UpdatePage('animation')
+                layer = self.GetSelectedLayer()
+                if layer:
+                    if layer.type ==  'raster':
+                        self.lmgr.nviz.UpdatePage('surface')
+                        self.lmgr.nviz.UpdatePage('fringe')
+                    elif layer.type ==  'vector':
+                        self.lmgr.nviz.UpdatePage('vector')
+                
+                self.lmgr.nviz.UpdateSettings()
+                
+                # update widgets
+                win = self.lmgr.nviz.FindWindowById( \
+                    self.lmgr.nviz.win['vector']['lines']['surface'])
+                win.SetItems(self.GetLayerNames('raster'))
+            
+            self.init = True
+        
+        self.UpdateMap()
+        
+    def DrawImages(self):
+        """!Draw overlay image"""
+        for texture in self.imagelist:
+            if texture.IsActive():
+                texture.Draw()
+            
+    def GetLegendRect(self):
+        """!Estimates legend size for dragging"""
+        size = None
+        if 1 in self.overlays:
+            for param in self.overlays[1].cmd[1:]:
+                if param.startswith("at="):
+                    size = map(int, param.split("=")[-1].split(','))
+                    break
+        if size:
+            wSize = self.GetClientSizeTuple()
+            x, y = size[2]/100. * wSize[0], wSize[1] - (size[1]/100. * wSize[1])
+            x += self.overlays[1].coords[0]
+            y += self.overlays[1].coords[1]
+            w = (size[3] - size[2])/100. * wSize[0]
+            h = (size[1] - size[0])/100. * wSize[1]
+            
+            rect = wx.Rect(x, y, w, h)
+            return rect
+        
+        return wx.Rect()        
+        
+    def DrawTextImage(self, textDict, relCoords):
+        """!Draw overlay text"""
+        bmp = wx.EmptyBitmap(textDict['bbox'][2], textDict['bbox'][3])
+        memDC = wx.MemoryDC()
+        memDC.SelectObject(bmp)
+        
+        mask = self.view['background']['color']
+        if mask == textDict['color']:
+            mask = wx.WHITE
+        memDC.SetBackground(wx.Brush(mask))
+        memDC.Clear()
+        memDC.SetFont(textDict['font'])
+        memDC.SetTextForeground(textDict['color'])
+        if textDict['rotation'] == 0:
+            memDC.DrawText(textDict['text'], 0, 0)
+        else:
+            memDC.DrawRotatedText(textDict['text'], relCoords[0], relCoords[1],
+                                  textDict['rotation'])
+        bmp.SetMaskColour(mask)
+        memDC.DrawBitmap(bmp, 0, 0, 1)
+        
+        filename = tempfile.mktemp() + '.png'
+        bmp.SaveFile(filename, wx.BITMAP_TYPE_PNG)
+        memDC.SelectObject(wx.NullBitmap)
+        
+        return filename
+        
+    def UpdateOverlays(self):
+        """!Converts rendered overlay files and text labels to wx.Image
+            and then to textures so that they can be rendered by OpenGL.
+            Updates self.imagelist"""
+        self.Map.ChangeMapSize(self.GetClientSize())
+        self.Map.RenderOverlays(force = True)
+        
+        # delete textures
+        for texture in self.imagelist:
+            # inactive overlays, remove text labels
+            if texture.GetId() < 100:
+                if not self.overlays[texture.GetId()].IsShown():
+                    texture.SetActive(False)
+                else:
+                    texture.SetActive(True)
+            else: # text label
+                if texture.GetId() not in self.textdict:
+                    self.imagelist.remove(texture)
+                    
+        # update images (only legend so far)
+        for oid, overlay in self.overlays.iteritems():
+            if not overlay.IsShown() or oid == 0: # 0 for barscale
+                continue
+            if oid not in [t.GetId() for t in self.imagelist]: # new
+                self.CreateTexture(overlay = overlay.layer)
+            else:
+                for t in self.imagelist:
+                    if t.GetId() == oid: # check if it is the same
+                        if not t.Corresponds(overlay):
+                            self.imagelist.remove(t)
+                            t = self.CreateTexture(overlay = overlay.layer)
+                        # always set coordinates, needed for synchr. 2D and 3D modes
+                        t.SetCoords(overlay.coords)
+
+                    
+        # update text labels
+        for textId in self.textdict.keys():
+            if textId not in [t.GetId() for t in self.imagelist]:# new
+                self.CreateTexture(textId = textId)
+            else:
+                for t in self.imagelist:
+                    if t.GetId() == textId: # check if it is the same
+                        self.textdict[textId]['bbox'] = t.textDict['bbox']
+                        if not t.Corresponds(self.textdict[textId]):
+                            self.imagelist.remove(t)
+                            t = self.CreateTexture(textId = textId)
+                        # always set coordinates, needed for synchr. 2D and 3D modes
+                        t.SetCoords(self.textdict[textId]['coords'])
+            
+    def CreateTexture(self, overlay = None, textId = None):
+        """!Create texture from overlay image or from textdict"""
+        if overlay: # legend  
+            texture = wxnviz.ImageTexture(filepath = overlay.mapfile, overlayId = overlay.id,
+                                          coords = list(self.overlays[overlay.id].coords),
+                                          cmd = overlay.GetCmd())
+            if overlay.id == 1: # legend
+                texture.SetBounds(self.GetLegendRect())
+        else: # text
+            coords, bbox, relCoords = self.TextBounds(self.textdict[textId])
+            self.textdict[textId]['coords'] = coords
+            self.textdict[textId]['bbox'] = bbox
+            file = self.DrawTextImage(self.textdict[textId], relCoords)
+            texture = wxnviz.TextTexture(filepath = file, overlayId = textId,
+                                         coords = coords, textDict = self.textdict[textId])
+            bbox.OffsetXY(*relCoords)
+            texture.SetBounds(bbox)
+            
+        if not texture.textureId: # texture too big
+            GMessage(parent = self, message = 
+                     _("Image is too large, your OpenGL implementation "
+                       "supports maximum texture size %d px.") % texture.maxSize)
+            return texture
+            
+        self.imagelist.append(texture)
+        
+        return texture
+        
+    def FindObjects(self, mouseX, mouseY, radius):
+        """Find object which was clicked on"""
+        for texture in self.imagelist:
+            if texture.HitTest(mouseX, mouseY, radius):
+                return texture.id
+        return -1
+        
+    def OnTimerAnim(self, event):
+         self.animation.Update()
+         
+    def GetAnimation(self):
+         return self.animation
+         
+    def OnKeyDown(self, event):
+        """!Key was pressed.
+        
+        Used for fly-through mode.
+        """
+        if not self.mouse['use'] == 'fly':
+            return
+            
+        key = event.GetKeyCode()
+        if key == wx.WXK_CONTROL: # Mac ?
+            self.fly['mode'] = 1
+            
+        elif key == wx.WXK_SHIFT: 
+            self.fly['exag']['move'] *= self.fly['exagMultiplier']
+            self.fly['exag']['turn'] *= self.fly['exagMultiplier']
+            
+        elif key == wx.WXK_ESCAPE and self.timerFly.IsRunning() and not self.fly['mouseControl']:
+            self.StopTimer(self.timerFly)
+            self.fly['mouseControl'] = None
+            self.render['quick'] = False
+            self.Refresh(False)
+            
+        elif key in (wx.WXK_UP, wx.WXK_DOWN, wx.WXK_LEFT, wx.WXK_RIGHT):
+            if not self.fly['mouseControl']:
+                if not self.timerFly.IsRunning():
+                    sx, sy = self.GetClientSizeTuple()
+                    self.fly['pos']['x'] = sx / 2
+                    self.fly['pos']['y'] = sy / 2
+                    self.fly['mouseControl'] = False # controlled by keyboard
+                    self.timerFly.Start(self.fly['interval'])
+    
+                self.ProcessFlyByArrows(keyCode = key)
+                
+            # change speed of flight when using mouse
+            else:
+                if key == wx.WXK_UP:
+                    self.ChangeFlySpeed(increase = True)
+                elif key == wx.WXK_DOWN:
+                    self.ChangeFlySpeed(increase = False)
+        
+        elif key in (wx.WXK_HOME, wx.WXK_PAGEUP) and self.timerFly.IsRunning():
+            self.ChangeFlySpeed(increase = True)
+        elif key in (wx.WXK_END, wx.WXK_PAGEDOWN) and self.timerFly.IsRunning():
+            self.ChangeFlySpeed(increase = False)
+            
+        event.Skip()
+        
+    def ProcessFlyByArrows(self, keyCode):
+        """!Process arrow key during fly-through"""
+        step = self.fly['arrowStep']
+        if keyCode == wx.WXK_UP:
+            self.fly['pos']['y'] -= step
+        elif keyCode == wx.WXK_DOWN:
+            self.fly['pos']['y'] += step
+        elif keyCode == wx.WXK_LEFT:
+            self.fly['pos']['x'] -= step
+        elif keyCode == wx.WXK_RIGHT:
+            self.fly['pos']['x'] += step
+            
+    def OnKeyUp(self, event):
+        """!Key was released.
+        
+        Used for fly-through mode.
+        """
+        if not self.mouse['use'] == 'fly':
+            return
+            
+        key = event.GetKeyCode()
+        if key == wx.WXK_CONTROL: # Mac ?
+            self.fly['mode'] = 0
+        elif key == wx.WXK_SHIFT: 
+            self.fly['exag']['move'] = math.floor(self.fly['exag']['move'] / self.fly['exagMultiplier'])
+            self.fly['exag']['turn'] = math.floor(self.fly['exag']['turn'] / self.fly['exagMultiplier'])
+        
+        event.Skip()
+        
+    def OnMouseAction(self, event):
+        """!Handle mouse events"""
+        # zoom with mouse wheel
+        if event.GetWheelRotation() != 0:
+            self.OnMouseWheel(event)
+            
+        # left mouse button pressed
+        elif event.LeftDown():
+            self.OnLeftDown(event)
+        
+        # left mouse button released
+        elif event.LeftUp():
+            self.OnLeftUp(event)
+        
+        # dragging
+        elif event.Dragging():
+            self.OnDragging(event)
+            
+        # double click    
+        elif event.ButtonDClick():
+            self.OnDClick(event)
+        
+        event.Skip()
+
+    def OnMouseWheel(self, event):
+        """!Change perspective"""
+        if UserSettings.Get(group = 'display',
+                            key = 'mouseWheelZoom',
+                            subkey = 'selection') == 2:
+            event.Skip()
+            return
+            
+        wheel = event.GetWheelRotation()
+        Debug.msg (5, "GLWindow.OnMouseMotion(): wheel = %d" % wheel)
+        if self.timerFly.IsRunning() and self.fly['mouseControl']:
+            if wheel > 0:
+                self.ChangeFlySpeed(increase = True)
+            else:
+                self.ChangeFlySpeed(increase = False)
+        else:
+            if UserSettings.Get(group = 'display',
+                                key = 'scrollDirection',
+                                subkey = 'selection'):
+                wheel *= -1
+            self.DoZoom(zoomtype = wheel, pos = event.GetPositionTuple())
+            
+        # update statusbar
+        ### self.parent.StatusbarUpdate()
+            
+    def OnLeftDown(self, event):
+        """!On left mouse down"""
+        self.mouse['begin'] = event.GetPositionTuple()
+        self.mouse['tmp'] = event.GetPositionTuple()
+        if self.mouse['use'] == "lookHere":
+            size = self.GetClientSize()
+            self._display.LookHere(self.mouse['begin'][0], size[1] - self.mouse['begin'][1])
+            focus = self._display.GetFocus()
+            for i, coord in enumerate(('x', 'y', 'z')):
+                self.iview['focus'][coord] = focus[i]
+            self.saveHistory = True
+            self.Refresh(False)
+            toggle = self.lmgr.nviz.FindWindowByName('here')
+            toggle.SetValue(False)
+            self.mouse['use'] = 'pointer'
+            self.SetCursor(self.cursors['default'])
+                
+        if self.mouse['use'] == 'arrow':
+            pos = event.GetPosition()
+            size = self.GetClientSize()
+            self.SetDrawArrow((pos[0], size[1] - pos[1]))
+                
+        if self.mouse['use'] == 'scalebar':
+            pos = event.GetPosition()
+            size = self.GetClientSize()
+            self.SetDrawScalebar((pos[0], size[1] - pos[1]))
+        
+        if self.mouse['use'] == 'pointer':
+            # get decoration or text id
+            self.dragid = self.FindObjects(self.mouse['tmp'][0], self.mouse['tmp'][1],
+                                          self.hitradius)
+                
+        if self.mouse['use'] == 'fly':
+            if not self.timerFly.IsRunning():
+                self.timerFly.Start(self.fly['interval'])
+                self.fly['mouseControl'] = True
+            
+        event.Skip()    
+        
+    def OnDragging(self, event):
+        if self.mouse['use'] == 'pointer':
+            if self.dragid > 0:
+                
+                self.DragItem(self.dragid, event)
+            
+        if self.mouse['use'] == 'rotate':    
+            dx, dy = event.GetX() - self.mouse['tmp'][0], event.GetY() - self.mouse['tmp'][1]
+            
+            angle, x, y, z = self._display.GetRotationParameters(dx, dy)
+            self._display.Rotate(angle, x, y, z)
+            
+            self.render['quick'] = True
+            self.Refresh(False)
+            
+        if self.mouse['use'] == 'pan':
+            self.FocusPanning(event)
+            
+        self.mouse['tmp'] = event.GetPositionTuple()
+                
+        event.Skip()
+            
+    def Pixel2Cell(self, (x, y)):
+        """!Convert image coordinates to real word coordinates
+
+        @param x, y image coordinates
+        
+        @return easting, northing
+        @return None on error
+        """
+        size = self.GetClientSize()
+        # UL -> LL
+        sid, x, y, z = self._display.GetPointOnSurface(x, size[1] - y)
+        
+        if not sid:
+            return None
+        
+        return (x, y)
+    
+    def DoZoom(self, zoomtype, pos):
+        """!Change perspective and focus"""
+        
+        prev_value = self.view['persp']['value']
+        if zoomtype > 0:
+            value = -1 * self.view['persp']['step']
+        else:
+            value = self.view['persp']['step']
+        self.view['persp']['value'] +=  value
+        if self.view['persp']['value'] < 1:
+            self.view['persp']['value'] = 1
+        elif self.view['persp']['value'] > 180:
+            self.view['persp']['value'] = 180
+        
+        if prev_value !=  self.view['persp']['value']:
+            if hasattr(self.lmgr, "nviz"):
+                self.lmgr.nviz.UpdateSettings()
+                x, y = pos[0], self.GetClientSize()[1] - pos[1]
+                result = self._display.GetPointOnSurface(x, y)
+                if result[0]:
+                    self._display.LookHere(x, y)
+                    focus = self._display.GetFocus()
+                    for i, coord in enumerate(('x', 'y', 'z')):
+                        self.iview['focus'][coord] = focus[i]
+                self._display.SetView(self.view['position']['x'], self.view['position']['y'],
+                                      self.iview['height']['value'],
+                                      self.view['persp']['value'],
+                                      self.view['twist']['value'])
+                self.saveHistory = True
+            # redraw map
+            self.DoPaint()
+            
+    def OnLeftUp(self, event):
+        self.mouse['end'] = event.GetPositionTuple()
+        if self.mouse["use"] == "query":
+            # querying
+            if self.parent.IsStandalone():
+                GMessage(parent = self.parent,
+                         message = _("Querying is not implemented in standalone mode of Map Display"))
+                return
+
+            layers = self.GetSelectedLayer(type = 'item', multi = True)
+
+            self.parent.Query(self.mouse['begin'][0],self.mouse['begin'][1], layers)
+
+        elif self.mouse["use"] in ('arrow', 'scalebar'):
+            self.lmgr.nviz.FindWindowById(
+                    self.lmgr.nviz.win['decoration'][self.mouse["use"]]['place']).SetValue(False)
+            self.mouse['use'] = 'pointer'
+            self.SetCursor(self.cursors['default'])
+        elif self.mouse['use'] == 'pointer':
+            if self.dragid > 0:
+                dx = self.mouse['end'][0] - self.mouse['begin'][0]
+                dy = self.mouse['end'][1] - self.mouse['begin'][1]
+                if self.dragid < 99:
+                    coords = self.overlays[self.dragid].coords
+                    self.overlays[self.dragid].coords = [coords[0] + dx, coords[1] + dy]
+                else: # text
+                    coords = self.textdict[self.dragid]['coords']
+                    self.textdict[self.dragid]['coords'] = [coords[0] + dx, coords[1] + dy]
+                self.dragid = -1
+                self.render['quick'] = False
+                self.Refresh(False)
+            
+        elif self.mouse['use'] == 'rotate':
+            self._display.UnsetRotation()
+            self.iview['rotation'] = self._display.GetRotationMatrix()
+            self.saveHistory = True
+            self.render['quick'] = False
+            self.Refresh(False)
+            
+        elif self.mouse['use'] == 'pan':
+            self.saveHistory = True
+            self.render['quick'] = False
+            self.Refresh(False)
+            
+        elif self.mouse['use'] == 'fly':
+            if self.fly['mouseControl']:
+                self.StopTimer(self.timerFly)
+                self.fly['mouseControl'] = None
+                #for key in self.iview['dir'].keys():
+                    #self.iview[''][key] = -1
+                # this causes sudden change, but it should be there
+                #if hasattr(self.lmgr, "nviz"):
+                    #self.lmgr.nviz.UpdateSettings()
+                    
+                self.render['quick'] = False
+                self.Refresh(False)
+            
+        elif self.mouse['use'] == 'zoom':
+            self.DoZoom(zoomtype = self.zoomtype, pos = self.mouse['end'])
+        event.Skip()
+            
+    def OnDClick(self, event):
+        """!On mouse double click"""
+        if self.mouse['use'] != 'pointer': return
+        pos = event.GetPositionTuple()
+        self.dragid = self.FindObjects(pos[0], pos[1], self.hitradius)
+        
+        if self.dragid == 1:
+            self.parent.AddLegend()
+        elif self.dragid > 100:
+            self.parent.OnAddText(None)
+        else:
+            return
+    
+    def FocusPanning(self, event):
+        """!Simulation of panning using focus"""
+        size = self.GetClientSizeTuple()
+        id1, x1, y1, z1 = self._display.GetPointOnSurface(
+                      self.mouse['tmp'][0], size[1] - self.mouse['tmp'][1])
+        id2, x2, y2, z2 = self._display.GetPointOnSurface(
+                      event.GetX(), size[1] - event.GetY())
+        if id1 and id1 == id2:
+            dx, dy, dz = x2 - x1, y2 - y1, z2 - z1
+            focus = self.iview['focus']
+            focus['x'], focus['y'], focus['z'] = self._display.GetFocus()
+            focus['x'] -= dx
+            focus['y'] -= dy
+            focus['z'] -= dz
+            
+            #update properties
+            self.PostViewEvent()
+            
+            self.mouse['tmp'] = event.GetPositionTuple()
+            self.render['quick'] = True
+            self.Refresh(False)
+            
+    def HorizontalPanning(self, event):
+        """!Move all layers in horizontal (x, y) direction.
+        Currently not used.
+        """
+        size = self.GetClientSizeTuple()
+        id1, x1, y1, z1 = self._display.GetPointOnSurface(
+                      self.mouse['tmp'][0], size[1] - self.mouse['tmp'][1])
+        id2, x2, y2, z2 = self._display.GetPointOnSurface(
+                      event.GetX(), size[1] - event.GetY())
+        
+        if id1 and id1 == id2:
+            dx, dy = x2 - x1, y2 - y1
+            # find raster and volume
+            for item in self.layers:
+                mapLayer = self.tree.GetPyData(item)[0]['maplayer']
+                  
+                data = self.tree.GetPyData(item)[0]['nviz']
+                if mapLayer.GetType() == 'raster':
+                    data['surface']['position']['x'] += dx
+                    data['surface']['position']['y'] += dy
+                    data['surface']['position']['update'] = None
+                    
+                    #update properties
+                    evt = wxUpdateProperties(data = data)
+                    wx.PostEvent(self, evt)
+                    
+                    if event.CmdDown() and id1 == data['surface']['object']['id']:
+                        break
+                    
+                elif mapLayer.GetType() == '3d-raster':
+                    if 'x' not in data['volume']['position']:
+                        data['volume']['position']['x'] = 0
+                        data['volume']['position']['y'] = 0
+                        data['volume']['position']['z'] = 0
+                    data['volume']['position']['x'] += dx
+                    data['volume']['position']['y'] += dy
+                    data['volume']['position']['update'] = None
+                    
+                    #update properties
+                    evt = wxUpdateProperties(data = data)
+                    wx.PostEvent(self, evt)
+                
+            self.mouse['tmp'] = event.GetPositionTuple()
+            self.render['quick'] = True
+            self.Refresh(False)
+            
+    def DragItem(self, id, event):
+        """!Drag an overlay decoration item
+        """
+        if not id: return
+        Debug.msg (5, "GLWindow.DragItem(): id=%d" % id)
+        x, y = self.mouse['tmp']
+        dx = event.GetX() - x
+        dy = event.GetY() - y
+        for texture in self.imagelist:
+            if texture.id == id:
+                texture.MoveTexture(dx, dy)
+
+
+        self.render['quick'] = True
+        self.Refresh(False)
+        
+        self.mouse['tmp'] = (event.GetX(), event.GetY()) 
+        
+    def ZoomBack(self):
+        """!Set previous view in history list
+        """
+        view = {}
+        if len(self.viewhistory) > 1:
+            self.viewhistory.pop()
+            view = copy.deepcopy(self.viewhistory[-1])
+        
+        # disable tool if stack is empty
+        if len(self.viewhistory) < 2: # disable tool
+            toolbar = self.parent.GetMapToolbar()
+            toolbar.Enable('zoomback', enable = False)
+            
+        # set view and update nviz view page
+        self.lmgr.nviz.UpdateState(view = view[0], iview = view[1])
+        self.lmgr.nviz.UpdatePage('view')
+        # update map
+        self.Refresh(False)
+
+    def ViewHistory(self, view, iview):
+        """!Manages a list of last 10 views
+        
+        @param view view dictionary
+        @param iview view dictionary (internal)
+        
+        @return removed history item if exists (or None)
+        """
+        removed = None
+        hview = copy.deepcopy(view)
+        hiview = copy.deepcopy(iview)
+        
+        if not (self.viewhistory and self.viewhistory[-1] == (hview, hiview)):  
+            self.viewhistory.append((hview, hiview))
+            
+        if len(self.viewhistory) > 10:
+            removed = self.viewhistory.pop(0)
+        
+        if removed:
+            Debug.msg(4, "GLWindow.ViewHistory(): hist=%s, removed=%s" %
+                      (self.viewhistory, removed))
+        else:
+            Debug.msg(4, "GLWindow.ViewHistory(): hist=%s" %
+                      (self.viewhistory))
+        
+        # update toolbar
+        if len(self.viewhistory) > 1:
+            enable = True
+        else:
+            enable = False
+        
+        toolbar = self.parent.GetMapToolbar()
+        toolbar.Enable('zoomback', enable)
+        
+        return removed     
+    
+    def ResetViewHistory(self):
+        """!Reset view history"""
+        self.viewhistory = list()
+    
+    def GoTo(self, e, n):
+        """!Focus on given point"""
+        w = self.Map.region['w']
+        s = self.Map.region['s']
+        e -= w
+        n -= s
+        focus = self.iview['focus']
+        focus['x'], focus['y'] = e, n
+        self.saveHistory = True
+        #update properties
+        self.PostViewEvent()
+        
+        self.render['quick'] = False
+        self.Refresh(False)
+        
+    def QuerySurface(self, x, y):
+        """!Query surface on given position"""
+        size = self.GetClientSizeTuple()
+        result = self._display.QueryMap(x, size[1] - y)
+        if result:
+            self.qpoints.append((result['x'], result['y'], result['z']))
+            self.log.WriteLog("%-30s: %.3f" % (_("Easting"),   result['x']))
+            self.log.WriteLog("%-30s: %.3f" % (_("Northing"),  result['y']))
+            self.log.WriteLog("%-30s: %.3f" % (_("Elevation"), result['z']))
+            name = ''
+            for item in self.layers:
+                self.tree.GetPyData(item)[0]['nviz']
+                if self.tree.GetPyData(item)[0]['maplayer'].type == 'raster' and\
+                    self.tree.GetPyData(item)[0]['nviz']['surface']['object']['id'] == result['id']:
+                    name = self.tree.GetPyData(item)[0]['maplayer'].name
+            self.log.WriteLog("%-30s: %s" % (_("Surface map name"), name))
+            self.log.WriteLog("%-30s: %s" % (_("Surface map elevation"), result['elevation']))
+            self.log.WriteLog("%-30s: %s" % (_("Surface map color"), result['color']))
+            if len(self.qpoints) > 1:
+                prev = self.qpoints[-2]
+                curr = self.qpoints[-1]
+                dxy = math.sqrt(pow(prev[0]-curr[0], 2) +
+                                pow(prev[1]-curr[1], 2))
+                dxyz = math.sqrt(pow(prev[0]-curr[0], 2) +
+                                 pow(prev[1]-curr[1], 2) +
+                                 pow(prev[2]-curr[2], 2))
+                self.log.WriteLog("%-30s: %.3f" % (_("XY distance from previous"), dxy))
+                self.log.WriteLog("%-30s: %.3f" % (_("XYZ distance from previous"), dxyz))
+                self.log.WriteLog("%-30s: %.3f" % (_("Distance along surface"),
+                                              self._display.GetDistanceAlongSurface(result['id'],
+                                                                                    (curr[0], curr[1]),
+                                                                                    (prev[0], prev[1]),
+                                                                                    useExag = False)))
+                self.log.WriteLog("%-30s: %.3f" % (_("Distance along exag. surface"),
+                                              self._display.GetDistanceAlongSurface(result['id'],
+                                                                                    (curr[0], curr[1]),
+                                                                                    (prev[0], prev[1]),
+                                                                                      useExag = True)))
+            self.log.WriteCmdLog('-' * 80)
+        else:
+            self.log.WriteLog(_("No point on surface"))
+            self.log.WriteCmdLog('-' * 80)
+    
+    def PostViewEvent(self, zExag = False):
+        """!Change view settings"""
+        event = wxUpdateView(zExag = zExag)
+        wx.PostEvent(self, event)
+        
+    def OnQueryVector(self, event):
+        """!Query vector on given position"""
+        self.parent.QueryVector(*event.GetPosition())
+
+    def ChangeInnerView(self):
+        """!Get current viewdir and viewpoint and set view"""
+        view = self.view
+        iview = self.iview
+        (view['position']['x'], view['position']['y'],
+        iview['height']['value']) = self._display.GetViewpointPosition()
+        for key, val in zip(('x', 'y', 'z'), self._display.GetViewdir()):
+            iview['dir'][key] = val
+        
+        iview['dir']['use'] = True
+        
+    def OnUpdateView(self, event):
+        """!Change view settings"""
+        if event:
+                self.UpdateView(zexag = event.zExag)
+                
+        self.saveHistory = True
+        if event:
+            event.Skip()
+            
+            
+    def UpdateView(self, zexag = False):
+        """!Change view settings"""
+        view = self.view
+        iview = self.iview
+        if zexag and 'value' in view['z-exag']:
+            self._display.SetZExag(view['z-exag']['value'] / iview['z-exag']['llRatio'])
+        
+        self._display.SetView(view['position']['x'], view['position']['y'],
+                              iview['height']['value'],
+                              view['persp']['value'],
+                              view['twist']['value'])
+        
+        if iview['dir']['use']:
+            self._display.SetViewdir(iview['dir']['x'], iview['dir']['y'], iview['dir']['z'])
+        
+        elif iview['focus']['x'] != -1:
+            self._display.SetFocus(self.iview['focus']['x'], self.iview['focus']['y'],
+                                   self.iview['focus']['z'])
+                                       
+        if 'rotation' in iview:
+            if iview['rotation']:
+                self._display.SetRotationMatrix(iview['rotation'])
+            else:
+                self._display.ResetRotation()
+        
+    def UpdateLight(self, event):
+        """!Change light settings"""
+        data = self.light
+        self._display.SetLight(x = data['position']['x'], y = data['position']['y'],
+                               z = data['position']['z'] / 100., color = data['color'],
+                               bright = data['bright'] / 100.,
+                               ambient = data['ambient'] / 100.)
+        self._display.DrawLightingModel()
+        if event.refresh:
+            self.Refresh(False)
+        
+    def UpdateMap(self, render = True):
+        """!Updates the canvas anytime there is a change to the
+        underlaying images or to the geometry of the canvas.
+        
+        @param render re-render map composition
+        """
+        start = time.clock()
+        
+        self.resize = False
+        
+        if self.render['quick'] is False:
+            self.parent.GetProgressBar().Show()
+            self.parent.GetProgressBar().SetRange(2)
+            self.parent.GetProgressBar().SetValue(0)
+        
+        if self.render['quick'] is False:
+            self.parent.GetProgressBar().SetValue(1)
+            self._display.Draw(False, -1)
+            if self.saveHistory:
+                self.ViewHistory(view = self.view, iview = self.iview)
+                self.saveHistory = False
+        elif self.render['quick'] is True:
+            # quick
+            mode = wxnviz.DRAW_QUICK_SURFACE | wxnviz.DRAW_QUICK_VOLUME
+            if self.render['vlines']:
+                mode |=  wxnviz.DRAW_QUICK_VLINES
+            if self.render['vpoints']:
+                mode |=  wxnviz.DRAW_QUICK_VPOINTS
+            self._display.Draw(True, mode)
+        else: # None -> reuse last rendered image
+            pass # TODO
+            
+        self.SwapBuffers()
+        # draw fringe after SwapBuffers, otherwise it don't have to be visible
+        # on some computers
+        if self.render['quick'] is False:
+            self._display.DrawFringe()
+            if self.decoration['arrow']['show']:
+                self._display.DrawArrow()
+            if self.decoration['scalebar']:
+                self._display.DrawScalebar()
+        if self.imagelist:
+            if ((self.render['quick'] and self.dragid > -1) or # during dragging
+                (not self.render['quick'] and self.dragid < 0)): # redraw
+                self._display.Start2D()
+                self.DrawImages()
+                
+            
+            
+        stop = time.clock()
+        
+        if self.render['quick'] is False:
+            self.parent.GetProgressBar().SetValue(2)
+            # hide process bar
+            self.parent.GetProgressBar().Hide()
+        
+        Debug.msg(3, "GLWindow.UpdateMap(): quick = %d, -> time = %g" % \
+                      (self.render['quick'], (stop-start)))
+        
+    def EraseMap(self):
+        """!Erase the canvas
+        """
+        self._display.EraseMap()
+        self.SwapBuffers()
+    
+    def _getDecorationSize(self):
+        """!Get initial size of north arrow/scalebar"""
+        size = self._display.GetLongDim() / 8.
+        coef = 0.01
+        if size < 1:
+            coef = 100.
+        return int(size * coef)/coef
+    
+    def SetDrawArrow(self, pos):
+        
+        if self._display.SetArrow(pos[0], pos[1], 
+                                 self.decoration['arrow']['size'],
+                                 self.decoration['arrow']['color']):
+            self._display.DrawArrow()
+            # update
+            self.decoration['arrow']['show'] = True
+            self.decoration['arrow']['position']['x'] = pos[0]
+            self.decoration['arrow']['position']['y'] = pos[1]
+            self.Refresh(False)
+    
+    def SetDrawScalebar(self, pos):
+        """!Add scale bar, sets properties and draw"""
+        if len(self.decoration['scalebar']) == 0:
+            self.decoration['scalebar'].append(
+                    self.nvizDefault.SetDecorDefaultProp(type = 'scalebar')['scalebar'])
+            self.decoration['scalebar'][0]['size'] = self._getDecorationSize()
+        else:
+            self.decoration['scalebar'].append(copy.deepcopy(self.decoration['scalebar'][-1]))
+            self.decoration['scalebar'][-1]['id'] += 1
+        
+        ret = self._display.SetScalebar(self.decoration['scalebar'][-1]['id'], pos[0], pos[1], 
+                                 self.decoration['scalebar'][-1]['size'],
+                                 self.decoration['scalebar'][-1]['color'])
+        if ret:
+            self._display.DrawScalebar()
+            # update
+            self.decoration['scalebar'][-1]['position']['x'] = pos[0]
+            self.decoration['scalebar'][-1]['position']['y'] = pos[1]
+            self.Refresh(False)
+        
+    def IsLoaded(self, item):
+        """!Check if layer (item) is already loaded
+        
+        @param item layer item
+        """
+        layer = self.tree.GetPyData(item)[0]['maplayer']
+        data = self.tree.GetPyData(item)[0]['nviz']
+        
+        if not data:
+            return 0
+        
+        if layer.type ==  'raster':
+            if 'object' not in data['surface']:
+                return 0
+        elif layer.type ==  'vector':
+            if 'object' not in data['vlines'] and \
+                    'object' not in data['points']:
+                return 0
+        
+        return 1
+
+    def _GetDataLayers(self, item, litems):
+        """!Return get list of enabled map layers"""
+        # load raster & vector maps
+        while item and item.IsOk():
+            type = self.tree.GetPyData(item)[0]['type']
+            if type ==  'group':
+                subItem = self.tree.GetFirstChild(item)[0]
+                self._GetDataLayers(subItem, litems)
+                item = self.tree.GetNextSibling(item)
+                
+            if not item.IsChecked() or \
+                    type not in ('raster', 'vector', '3d-raster'):
+                item = self.tree.GetNextSibling(item)
+                continue
+            
+            litems.append(item)
+            
+            item = self.tree.GetNextSibling(item)
+        
+    def LoadDataLayers(self):
+        """!Load raster/vector from current layer tree
+        
+        @todo volumes
+        """
+        if not self.tree:
+            return
+        
+        listOfItems = []
+        item = self.tree.GetFirstChild(self.tree.root)[0]
+        self._GetDataLayers(item, listOfItems)
+        
+        start = time.time()
+        
+        while(len(listOfItems) > 0):
+            item = listOfItems.pop()
+            type = self.tree.GetPyData(item)[0]['type']
+            if item in self.layers:
+                continue
+            # "raster (double click to set properties)" - tries to load this 
+            # layer - no idea how to fix it
+            if ' ' in self.tree.GetPyData(item)[0]['maplayer'].name:
+                return
+            try:
+                if type ==  'raster':
+                    self.LoadRaster(item)
+                elif type ==  '3d-raster':
+                    self.LoadRaster3d(item)
+                elif type ==  'vector':
+                    layer = self.tree.GetPyData(item)[0]['maplayer']
+                    vInfo = grass.vector_info_topo(layer.GetName())
+                    if (vInfo['points']) > 0:
+                        # include vInfo['centroids'] to initially load centroids 
+                        self.LoadVector(item, points = True)
+                    if (vInfo['lines'] + vInfo['boundaries']) > 0 or vInfo['map3d']:
+                        self.LoadVector(item, points = False)
+                    
+            except GException, e:
+                GError(parent = self,
+                       message = e.value)
+        
+        stop = time.time()
+        
+        Debug.msg(1, "GLWindow.LoadDataLayers(): time = %f" % (stop-start))
+                
+    def UnloadDataLayers(self, force = False):
+        """!Unload any layers that have been deleted from layer tree
+
+        @param force True to unload all data layers
+        """
+        if not self.tree:
+            return
+        
+        listOfItems = []
+        if not force:
+            item = self.tree.GetFirstChild(self.tree.root)[0]
+            self._GetDataLayers(item, listOfItems)
+        
+        start = time.time()
+        
+        update = False
+        layersTmp = self.layers[:]
+        for layer in layersTmp:
+            if layer in listOfItems:
+                continue
+            ltype = self.tree.GetPyData(layer)[0]['type']
+            try:
+                if ltype ==  'raster':
+                    self.UnloadRaster(layer)
+                elif ltype ==  '3d-raster':
+                    self.UnloadRaster3d(layer) 
+                elif ltype ==  'vector':
+                    maplayer = self.tree.GetPyData(layer)[0]['maplayer']
+                    vInfo = grass.vector_info_topo(maplayer.GetName())
+                    if (vInfo['points'] + vInfo['centroids']) > 0:
+                        self.UnloadVector(layer, points = True)
+                    if (vInfo['lines'] + vInfo['boundaries']) > 0 or vInfo['map3d']:
+                        self.UnloadVector(layer, points = False)
+                        
+            except GException, e:
+                GError(parent = self,
+                       message = e.value)
+        
+        if force and self.baseId > 0: # unload base surface when quitting
+            ret = self._display.UnloadSurface(self.baseId)
+            self.baseId = -1
+        if update:
+            self.lmgr.nviz.UpdateSettings()        
+            self.UpdateView(None)
+        
+        stop = time.time()
+        
+        Debug.msg(1, "GLWindow.UnloadDataLayers(): time = %f" % (stop-start))        
+        
+    def SetVectorSurface(self, data):
+        """!Set reference surfaces of vector"""
+        data['mode']['surface'] = {}
+        data['mode']['surface']['value'] = list()
+        data['mode']['surface']['show'] = list()
+        for name in self.GetLayerNames('raster'):
+            data['mode']['surface']['value'].append(name)
+            data['mode']['surface']['show'].append(True)
+        
+    def SetVectorFromCmd(self, item, data):
+        """!Set 3D view properties from cmd (d.vect)
+
+        @param item Layer Tree item
+        @param nviz data
+        """
+        cmd = self.tree.GetPyData(item)[0]['cmd']
+        if cmd[0] != 'd.vect':
+            return
+        for opt in cmd[1:]:
+            try:
+                key, value = opt.split('=')
+            except ValueError:
+                continue
+            if key == 'color':
+                data['lines']['color']['value'] = value
+                data['points']['color']['value'] = value
+
+    def SetMapObjProperties(self, item, id, nvizType):
+        """!Set map object properties
+        
+        Properties must be afterwards updated by
+        UpdateMapObjProperties().
+        
+        @param item layer item
+        @param id nviz layer id (or -1)
+        @param nvizType nviz data type (surface, points, vector)
+        """
+        if nvizType != 'constant':
+            mapType = self.tree.GetPyData(item)[0]['maplayer'].type
+            # reference to original layer properties (can be None)
+            data = self.tree.GetPyData(item)[0]['nviz']
+        else:
+            mapType = nvizType
+            data = self.constants[item]
+        
+        if not data:
+            # init data structure
+            if nvizType != 'constant':
+                self.tree.GetPyData(item)[0]['nviz'] = {}
+                data = self.tree.GetPyData(item)[0]['nviz']
+            
+            if mapType ==  'raster':
+                # reset to default properties
+                data[nvizType] = self.nvizDefault.SetSurfaceDefaultProp()
+                        
+            elif mapType ==  'vector':
+                # reset to default properties (lines/points)
+                data['vector'] = self.nvizDefault.SetVectorDefaultProp()
+                self.SetVectorFromCmd(item, data['vector'])
+                self.SetVectorSurface(data['vector']['points'])
+                self.SetVectorSurface(data['vector']['lines'])
+                
+            elif mapType ==  '3d-raster':
+                # reset to default properties 
+                data[nvizType] = self.nvizDefault.SetVolumeDefaultProp()
+                
+            elif mapType == 'constant':
+                data['constant'] = self.nvizDefault.SetConstantDefaultProp()
+        
+        else:
+            # complete data (use default values), not sure if this is necessary
+            if mapType ==  'raster':
+                if not data['surface']:
+                    data['surface'] = self.nvizDefault.SetSurfaceDefaultProp()
+            if mapType ==  'vector':
+                if not data['vector']['lines']:
+                    self.nvizDefault.SetVectorLinesDefaultProp(data['vector']['lines'])
+                if not data['vector']['points']:
+                    self.nvizDefault.SetVectorPointsDefaultProp(data['vector']['points'])     
+            # set updates
+            for sec in data.keys():
+                for sec1 in data[sec].keys():
+                    if sec1 == 'position':
+                        data[sec][sec1]['update'] = None
+                        continue
+                    if type(data[sec][sec1]) == types.DictType:
+                        for sec2 in data[sec][sec1].keys():
+                            if sec2 not in ('all', 'init', 'id'):
+                                data[sec][sec1][sec2]['update'] = None
+                    elif type(data[sec][sec1]) == types.ListType:
+                        for i in range(len(data[sec][sec1])):
+                            for sec2 in data[sec][sec1][i].keys():
+                                data[sec][sec1][i][sec2]['update'] = None
+            event = wxUpdateProperties(data = data)
+            wx.PostEvent(self, event)
+        
+        # set id
+        if id > 0:
+            if mapType in ('raster', '3d-raster'):
+                data[nvizType]['object'] = { 'id' : id,
+                                            'init' : False }
+            elif mapType ==  'vector':
+                data['vector'][nvizType]['object'] = { 'id' : id,
+                                                       'init' : False }
+            elif mapType ==  'constant':
+                data[nvizType]['object'] = { 'id' : id,
+                                             'init' : False }
+        
+        return data
+
+    def LoadRaster(self, item):
+        """!Load 2d raster map and set surface attributes
+        
+        @param layer item
+        """
+        return self._loadRaster(item)
+    
+    def LoadRaster3d(self, item):
+        """!Load 3d raster map and set surface attributes
+        
+        @param layer item
+        """
+        return self._loadRaster(item)
+    
+    def _loadRaster(self, item):
+        """!Load 2d/3d raster map and set its attributes
+        
+        @param layer item
+        """
+        layer = self.tree.GetPyData(item)[0]['maplayer']
+        
+        if layer.type not in ('raster', '3d-raster'):
+            return
+        
+        if layer.type ==  'raster':
+            id = self._display.LoadSurface(str(layer.name), None, None)
+            nvizType = 'surface'
+            errorMsg = _("Loading raster map")
+        elif layer.type ==  '3d-raster':
+            id = self._display.LoadVolume(str(layer.name), None, None)
+            nvizType = 'volume'
+            errorMsg = _("Loading 3d raster map")
+        else:
+            id = -1
+        
+        if id < 0:
+            if layer.type in ('raster', '3d-raster'):
+                self.log.WriteError("%s <%s> %s" % (errorMsg, layer.name, _("failed")))
+            else:
+                self.log.WriteError(_("Unsupported layer type '%s'") % layer.type)
+        
+        self.layers.append(item)
+        
+        # set default/workspace layer properties
+        data = self.SetMapObjProperties(item, id, nvizType)
+        
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self, event)
+        
+        # update tools window
+        if hasattr(self.lmgr, "nviz") and \
+                item ==  self.GetSelectedLayer(type = 'item'):
+            toolWin = self.lmgr.nviz
+            if layer.type ==  'raster':
+                win = toolWin.FindWindowById( \
+                    toolWin.win['vector']['lines']['surface'])
+                win.SetItems(self.GetLayerNames(layer.type))
+            
+            #toolWin.UpdatePage(nvizType)
+            #toolWin.SetPage(nvizType)
+        
+        return id
+    
+    def NewConstant(self):
+        """!Create new constant"""
+        index = len(self.constants)
+        try:
+            name = self.constants[-1]['constant']['object']['name'] + 1
+        except IndexError:
+            name = 1
+        data = dict()
+        self.constants.append(data)
+        data = self.SetMapObjProperties(item = index, id = -1, nvizType = 'constant')
+        self.AddConstant(data, name)
+        return name
+        
+    def AddConstant(self, data, name):
+        """!Add new constant"""
+        id = self._display.AddConstant(value = data['constant']['value'], color = data['constant']['color'])
+        self._display.SetSurfaceRes(id, data['constant']['resolution'], data['constant']['resolution'])
+        data['constant']['object'] = { 'id' : id,
+                                       'name': name,
+                                       'init' : False }
+    
+    def DeleteConstant(self, index):
+        """!Delete constant layer"""
+        id = self.constants[index]['constant']['object']['id']
+        self._display.UnloadSurface(id)
+        del self.constants[index]
+    
+    def SelectCPlane(self, index):
+        """!Select cutting plane"""
+        for plane in range (self._display.GetCPlanesCount()):
+            if plane == index:
+                self._display.SelectCPlane(plane)
+                self.cplanes[plane]['on'] = True
+                self._display.SetFenceColor(self.cplanes[plane]['shading'])
+            else:
+                self._display.UnselectCPlane(plane)
+                try:
+                    self.cplanes[plane]['on'] = False
+                except IndexError:
+                    pass
+                    
+    def OnUpdateCPlane(self, event):
+        """!Change cutting plane settings"""
+        self.UpdateCPlane(event.current, event.update)
+
+    def UpdateCPlane(self, index, changes):
+        """!Change cutting plane settings"""
+        for each in changes:
+            if each == 'rotation':
+                self._display.SetCPlaneRotation(0, self.cplanes[index]['rotation']['tilt'],
+                                                   self.cplanes[index]['rotation']['rot'])
+            if each == 'position':
+                self._display.SetCPlaneTranslation(self.cplanes[index]['position']['x'],
+                                                   self.cplanes[index]['position']['y'],
+                                                   self.cplanes[index]['position']['z'])
+            if each == 'shading':
+                self._display.SetFenceColor(self.cplanes[index]['shading'])
+            
+    def UnloadRaster(self, item):
+        """!Unload 2d raster map
+        
+        @param layer item
+        """
+        return self._unloadRaster(item)
+    
+    def UnloadRaster3d(self, item):
+        """!Unload 3d raster map
+        
+        @param layer item
+        """
+        return self._unloadRaster(item)
+    
+    def _unloadRaster(self, item):
+        """!Unload 2d/3d raster map
+        
+        @param item layer item
+        """
+        layer = self.tree.GetPyData(item)[0]['maplayer']
+        
+        if layer.type not in ('raster', '3d-raster'):
+            return
+        
+        data = self.tree.GetPyData(item)[0]['nviz']
+        
+        if layer.type ==  'raster':
+            nvizType = 'surface'
+            unloadFn = self._display.UnloadSurface
+            errorMsg = _("Unable to unload raster map")
+            successMsg = _("Raster map")
+        else:
+            nvizType = 'volume'
+            unloadFn = self._display.UnloadVolume
+            errorMsg = _("Unable to unload 3d raster map")
+            successMsg = _("3d raster map")
+        
+        try:
+            id = data[nvizType]['object']['id']
+        except KeyError:
+            return
+        
+        if unloadFn(id) ==  0:
+            self.log.WriteError("%s <%s>" % (errorMsg, layer.name))
+        else:
+            self.log.WriteLog("%s <%s> %s" % (successMsg, layer.name, _("unloaded successfully")))
+        
+        data[nvizType].pop('object')
+        
+        self.layers.remove(item)
+        
+        # update tools window
+        if hasattr(self.lmgr, "nviz"):
+            toolWin = self.lmgr.nviz
+            if layer.type ==  'raster':
+                win = toolWin.FindWindowById(toolWin.win['vector']['lines']['surface'])
+                win.SetItems(self.GetLayerNames(layer.type))
+                win = toolWin.FindWindowById(toolWin.win['surface']['map'])
+                win.SetValue('')
+            if layer.type ==  '3d-raster':
+                win = toolWin.FindWindowById(toolWin.win['volume']['map'])
+                win.SetValue('')
+            if layer.type ==  'vector':
+                win = toolWin.FindWindowById(toolWin.win['vector']['map'])
+                win.SetValue('')
+        
+    def LoadVector(self, item, points = None, append = True):
+        """!Load 2D or 3D vector map overlay
+        
+        @param item layer item
+        @param points True to load points, False to load lines, None
+        to load both
+        @param append append vector to layer list
+        """
+        layer = self.tree.GetPyData(item)[0]['maplayer']
+        if layer.type !=  'vector':
+            return
+        
+        # set default properties
+        if points is None:
+            self.SetMapObjProperties(item, -1, 'lines')
+            self.SetMapObjProperties(item, -1, 'points')
+            vecTypes = ('points', 'lines')
+        elif points:
+            self.SetMapObjProperties(item, -1, 'points')
+            vecTypes = ('points', )
+        else:
+            self.SetMapObjProperties(item, -1, 'lines')
+            vecTypes = ('lines', )
+        
+        id = -1
+        for vecType in vecTypes:
+            if vecType == 'lines':
+                id, baseId = self._display.LoadVector(str(layer.GetName()), False)
+            else:
+                id, baseId = self._display.LoadVector(str(layer.GetName()), True)
+            if id < 0:
+                self.log.WriteError(_("Loading vector map <%(name)s> (%(type)s) failed") % \
+                    { 'name' : layer.name, 'type' : vecType })
+            # update layer properties
+            self.SetMapObjProperties(item, id, vecType)
+        if baseId > 0:
+            self.baseId = baseId # id of base surface (when no surface is loaded)
+        if append:
+            self.layers.append(item)
+        
+        # update properties
+        data = self.tree.GetPyData(item)[0]['nviz']
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self, event)
+        
+        # update tools window
+        if hasattr(self.lmgr, "nviz") and \
+                item ==  self.GetSelectedLayer(type = 'item'):
+            toolWin = self.lmgr.nviz
+            
+            toolWin.UpdatePage('vector')
+            ### toolWin.SetPage('vector')
+        
+        return id
+
+    def UnloadVector(self, item, points = None, remove = True):
+        """!Unload vector map overlay
+        
+        @param item layer item
+        @param points,lines True to unload given feature type
+        @param remove remove layer from list
+        """
+        layer = self.tree.GetPyData(item)[0]['maplayer']
+        data = self.tree.GetPyData(item)[0]['nviz']['vector']
+        
+        # if vecType is None:
+        #     vecType = []
+        #     for v in ('lines', 'points'):
+        #         if UserSettings.Get(group = 'nviz', key = 'vector',
+        #                             subkey = [v, 'show']):
+        #             vecType.append(v)
+        
+        if points is None:
+            vecTypes = ('points', 'lines')
+        elif points:
+            vecTypes = ('points', )
+        else:
+            vecTypes = ('lines', )
+        
+        for vecType in vecTypes:
+            if 'object' not in data[vecType]:
+                continue
+
+            id = data[vecType]['object']['id']
+            
+            if vecType ==  'lines':
+                ret = self._display.UnloadVector(id, False)
+            else:
+                ret = self._display.UnloadVector(id, True)
+            if ret ==  0:
+                self.log.WriteError(_("Unable to unload vector map <%(name)s> (%(type)s)") % \
+                    { 'name': layer.name, 'type' : vecType })
+            else:
+                self.log.WriteLog(_("Vector map <%(name)s> (%(type)s) unloaded successfully") % \
+                    { 'name' : layer.name, 'type' : vecType })
+            
+            data[vecType].pop('object')
+            
+        if remove and item in self.layers:
+            self.layers.remove(item)
+
+    def ResetView(self):
+        """!Reset to default view"""
+        zexagOriginal, \
+            self.iview['height']['value'], \
+            self.iview['height']['min'], \
+            self.iview['height']['max'] = self._display.SetViewDefault()
+        
+        ## hack for latlon projection
+        ## TODO find more precise way or better rewrite it in OGSF
+        self.iview['z-exag']['llRatio'] = 1
+        if grass.locn_is_latlong():
+            self.iview['z-exag']['llRatio'] = \
+                math.pi / 180 * 6371000 * math.cos((grass.region()['n'] + grass.region()['s']) / 2)
+
+        self.view['z-exag']['value'] = round(zexagOriginal * self.iview['z-exag']['llRatio'])
+        self.view['z-exag']['min'] = UserSettings.Get(group = 'nviz', key = 'view',
+                                                      subkey = ('z-exag', 'min'))
+        zexagMax = UserSettings.Get(group = 'nviz', key = 'view',
+                                    subkey = ('z-exag', 'max'))
+        if zexagMax <= self.view['z-exag']['value']:
+            self.view['z-exag']['max'] = self.view['z-exag']['value'] * 2
+        elif self.view['z-exag']['value'] < 1:
+            if self.view['z-exag']['value'] == 0:
+                self.view['z-exag']['value'] = 1
+            self.view['z-exag']['max'] = 10 * self.view['z-exag']['value'] 
+        else: 
+            self.view['z-exag']['max'] = zexagMax
+        
+        self.view['position']['x'] = UserSettings.Get(group = 'nviz', key = 'view',
+                                                 subkey = ('position', 'x'))
+        self.view['position']['y'] = UserSettings.Get(group = 'nviz', key = 'view',
+                                                 subkey = ('position', 'y'))
+        self.view['persp']['value'] = UserSettings.Get(group = 'nviz', key = 'view',
+                                                       subkey = ('persp', 'value'))
+        
+        self.view['twist']['value'] = UserSettings.Get(group = 'nviz', key = 'view',
+                                                       subkey = ('twist', 'value'))
+        self._display.ResetRotation()
+        self.iview['rotation'] = None
+        self._display.LookAtCenter()
+        focus = self.iview['focus']
+        focus['x'], focus['y'], focus['z'] = self._display.GetFocus()
+        
+        self.PostViewEvent()
+        
+    def UpdateMapObjProperties(self, event):
+        """!Generic method to update data layer properties"""
+        data = event.data
+        
+        if 'surface' in data:
+            try:
+                id = data['surface']['object']['id']
+            except KeyError:
+                return
+            self.UpdateSurfaceProperties(id, data['surface'])
+            # -> initialized
+            data['surface']['object']['init'] = True
+            
+        elif 'constant' in data:
+            id = data['constant']['object']['id']
+            self.UpdateConstantProperties(id, data['constant'])
+            # -> initialized
+            data['constant']['object']['init'] = True  
+              
+        elif 'volume' in data:
+            id = data['volume']['object']['id']
+            self.UpdateVolumeProperties(id, data['volume'])
+            # -> initialized
+            data['volume']['object']['init'] = True
+            
+        elif 'vector' in data:
+            for type in ('lines', 'points'):
+                if 'object' in data['vector'][type]:
+                    id = data['vector'][type]['object']['id']
+                    self.UpdateVectorProperties(id, data['vector'], type)
+                    # -> initialized
+                    data['vector'][type]['object']['init'] = True
+    
+    def UpdateConstantProperties(self, id, data):
+        """!Update surface map object properties"""
+        self._display.SetSurfaceColor(id = id, map = False, value = data['color'])
+        self._display.SetSurfaceTopo(id = id, map = False, value = data['value'])
+        self._display.SetSurfaceRes(id, data['resolution'], data['resolution'])
+        if data['transp'] == 0:
+            self._display.UnsetSurfaceTransp(id)
+        else:
+            self._display.SetSurfaceTransp(id, map = False, value = data['transp'])
+            
+    def UpdateSurfaceProperties(self, id, data):
+        """!Update surface map object properties"""
+        # surface attributes
+        for attrb in ('color', 'mask',
+                     'transp', 'shine'):
+            if attrb not in data['attribute'] or \
+                    'update' not in data['attribute'][attrb]:
+                continue
+            
+            map = data['attribute'][attrb]['map']
+            value = data['attribute'][attrb]['value']
+            
+            if map is None: # unset
+                # only optional attributes
+                if attrb ==  'mask':
+                    # TODO: invert mask
+                    # TODO: broken in NVIZ
+                    self._display.UnsetSurfaceMask(id)
+                elif attrb ==  'transp':
+                    self._display.UnsetSurfaceTransp(id) 
+            else:
+                if type(value) == types.StringType and \
+                        len(value) <=  0: # ignore empty values (TODO: warning)
+                    continue
+                if attrb ==  'color':
+                    self._display.SetSurfaceColor(id, map, str(value))
+                elif attrb ==  'mask':
+                    # TODO: invert mask
+                    # TODO: broken in NVIZ
+                    self._display.SetSurfaceMask(id, False, str(value))
+                elif attrb ==  'transp':
+                    self._display.SetSurfaceTransp(id, map, str(value)) 
+                elif attrb ==  'shine':
+                    self._display.SetSurfaceShine(id, map, str(value)) 
+            data['attribute'][attrb].pop('update')
+        
+        # draw res
+        if 'update' in data['draw']['resolution']:
+            coarse = data['draw']['resolution']['coarse']
+            fine   = data['draw']['resolution']['fine']
+            
+            if data['draw']['all']:
+                self._display.SetSurfaceRes(-1, fine, coarse)
+            else:
+                self._display.SetSurfaceRes(id, fine, coarse)
+            data['draw']['resolution'].pop('update')
+        
+        # draw style
+        if 'update' in data['draw']['mode']:
+            if data['draw']['mode']['value'] < 0: # need to calculate
+                data['draw']['mode']['value'] = \
+                    self.nvizDefault.GetDrawMode(mode = data['draw']['mode']['desc']['mode'],
+                                                 style = data['draw']['mode']['desc']['style'],
+                                                 shade = data['draw']['mode']['desc']['shading'],
+                                                 string = True)
+            style = data['draw']['mode']['value']
+            if data['draw']['all']:
+                self._display.SetSurfaceStyle(-1, style)
+            else:
+                self._display.SetSurfaceStyle(id, style)
+            data['draw']['mode'].pop('update')
+        
+        # wire color
+        if 'update' in data['draw']['wire-color']:
+            color = data['draw']['wire-color']['value']
+            if data['draw']['all']:
+                self._display.SetWireColor(-1, str(color))
+            else:
+                self._display.SetWireColor(id, str(color))
+            data['draw']['wire-color'].pop('update')
+        
+        # position
+        if 'update' in data['position']:
+            x = data['position']['x']
+            y = data['position']['y']
+            z = data['position']['z']
+            self._display.SetSurfacePosition(id, x, y, z)
+            data['position'].pop('update')
+        data['draw']['all'] = False
+        
+    def UpdateVolumeProperties(self, id, data, isosurfId = None):
+        """!Update volume (isosurface/slice) map object properties"""
+        if 'update' in data['draw']['resolution']:
+            if data['draw']['mode']['value'] == 0:
+                self._display.SetIsosurfaceRes(id, data['draw']['resolution']['isosurface']['value'])
+            else:
+                self._display.SetSliceRes(id, data['draw']['resolution']['slice']['value'])                
+            data['draw']['resolution'].pop('update')
+        
+        if 'update' in data['draw']['shading']:
+            if data['draw']['mode']['value'] == 0:
+                if data['draw']['shading']['isosurface']['value'] < 0: # need to calculate
+                    mode = data['draw']['shading']['isosurface']['value'] = \
+                        self.nvizDefault.GetDrawMode(shade = data['draw']['shading']['isosurface'],
+                                                     string = False)
+                    self._display.SetIsosurfaceMode(id, mode)
+            else:
+                if data['draw']['shading']['slice']['value'] < 0: # need to calculate
+                    mode = data['draw']['shading']['slice']['value'] = \
+                        self.nvizDefault.GetDrawMode(shade = data['draw']['shading']['slice'],
+                                                     string = False)
+                    self._display.SetSliceMode(id, mode)
+            data['draw']['shading'].pop('update')
+        
+        #
+        # isosurface attributes
+        #
+        isosurfId = 0
+        for isosurf in data['isosurface']:
+            self._display.AddIsosurface(id, 0, isosurf_id = isosurfId)
+            for attrb in ('topo', 'color', 'mask',
+                          'transp', 'shine'):
+                if attrb not in isosurf or \
+                        'update' not in isosurf[attrb]:
+                    continue
+                map = isosurf[attrb]['map']
+                value = isosurf[attrb]['value']
+                
+                if map is None: # unset
+                    # only optional attributes
+                    if attrb == 'topo' :
+                        self._display.SetIsosurfaceTopo(id, isosurfId, map, str(value))
+                    elif attrb ==  'mask':
+                        # TODO: invert mask
+                        # TODO: broken in NVIZ
+                        self._display.UnsetIsosurfaceMask(id, isosurfId)
+                    elif attrb ==  'transp':
+                        self._display.UnsetIsosurfaceTransp(id, isosurfId) 
+                else:
+                    if type(value) == types.StringType and \
+                            len(value) <=  0: # ignore empty values (TODO: warning)
+                        continue
+                    elif attrb ==  'color':
+                        self._display.SetIsosurfaceColor(id, isosurfId, map, str(value))
+                    elif attrb ==  'mask':
+                        # TODO: invert mask
+                        # TODO: broken in NVIZ
+                        self._display.SetIsosurfaceMask(id, isosurfId, False, str(value))
+                    elif attrb ==  'transp':
+                        self._display.SetIsosurfaceTransp(id, isosurfId, map, str(value)) 
+                    elif attrb ==  'shine':
+                        self._display.SetIsosurfaceShine(id, isosurfId, map, str(value))  
+                isosurf[attrb].pop('update')
+            isosurfId +=  1
+        #
+        # slice attributes
+        #
+        sliceId = 0
+        for slice in data['slice']:
+            ret = self._display.AddSlice(id, slice_id = sliceId)
+            if 'update' in slice['position']:
+                pos = slice['position']
+                ret = self._display.SetSlicePosition(id, sliceId, pos['x1'], pos['x2'],
+                                               pos['y1'], pos['y2'], pos['z1'], pos['z2'], pos['axis'])
+                
+                slice['position'].pop('update')
+            if 'update' in slice['transp']:
+                tr = slice['transp']['value']
+                self._display.SetSliceTransp(id, sliceId, tr)
+            sliceId += 1
+                
+        # position
+        if 'update' in data['position'] and 'x' in data['position']:
+            x = data['position']['x']
+            y = data['position']['y']
+            z = data['position']['z']
+            self._display.SetVolumePosition(id, x, y, z)
+            data['position'].pop('update')
+            
+    def UpdateVectorProperties(self, id, data, type):
+        """!Update vector layer properties
+        
+        @param id layer id
+        @param data properties
+        @param type lines/points
+        """
+        if type ==  'points':
+            self.UpdateVectorPointsProperties(id, data[type])
+        else:
+            self.UpdateVectorLinesProperties(id, data[type])
+        
+    def UpdateVectorLinesProperties(self, id, data):
+        """!Update vector line map object properties"""
+        # mode
+        if 'update' in data['color'] or \
+                'update' in data['width'] or \
+                'update' in data['mode']:
+            width = data['width']['value']
+            color = data['color']['value']
+            if data['mode']['type'] ==  'flat':
+                flat = True
+                if 'surface' in data['mode']:
+                    data['mode'].pop('surface')
+            else:
+                flat = False
+            
+            self._display.SetVectorLineMode(id, color,
+                                            width, flat)
+            
+            if 'update' in data['color']:
+                data['color'].pop('update')
+            if 'update' in data['width']:
+                data['width'].pop('update')
+        
+        # height
+        if 'update' in data['height']:
+            self._display.SetVectorLineHeight(id,
+                                              data['height']['value'])
+            data['height'].pop('update')
+            
+        # surface
+        if 'surface' in data['mode'] and 'update' in data['mode']:
+            for item in range(len(data['mode']['surface']['value'])):
+                for type in ('raster', 'constant'):
+                    sid = self.GetLayerId(type = type,
+                                          name = data['mode']['surface']['value'][item])
+                    if sid > -1:
+                        if data['mode']['surface']['show'][item]:
+                            self._display.SetVectorLineSurface(id, sid)
+                        else:
+                            self._display.UnsetVectorLineSurface(id, sid)
+                        break
+                
+        if 'update' in data['mode']:
+                data['mode'].pop('update')
+        
+    def UpdateVectorPointsProperties(self, id, data):
+        """!Update vector point map object properties"""
+        if 'update' in data['size'] or \
+                'update' in data['width'] or \
+                'update' in data['marker'] or \
+                'update' in data['color']:
+                
+            ret = self._display.SetVectorPointMode(id, data['color']['value'],
+                                                   data['width']['value'], float(data['size']['value']),
+                                                   data['marker']['value'] + 1)
+            
+            error = None
+            if ret ==  -1:
+                error = _("Vector point layer not found (id = %d)") % id
+            elif ret ==  -2:
+                error = _("Unable to set data layer properties (id = %d)") % id
+
+            if error:
+                raise GException(_("Setting data layer properties failed.\n\n%s") % error)
+            
+            for prop in ('size', 'width', 'marker', 'color'):
+                if 'update' in data[prop]:
+                    data[prop].pop('update')
+        
+        # height
+        if 'update' in data['height']:
+            self._display.SetVectorPointHeight(id,
+                                               data['height']['value'])
+            data['height'].pop('update')
+            
+        # surface
+        if 'update' in data['mode'] and 'surface' in data['mode']:
+            for item in range(len(data['mode']['surface']['value'])):
+                for type in ('raster', 'constant'):
+                    sid = self.GetLayerId(type = type,
+                                          name = data['mode']['surface']['value'][item])
+                    if sid > -1:
+                        if data['mode']['surface']['show'][item]:
+                            self._display.SetVectorPointSurface(id, sid)
+                        else:
+                            self._display.UnsetVectorPointSurface(id, sid)   
+                        break
+            data['mode'].pop('update')
+            
+    def GetLayerNames(self, type):
+        """!Return list of map layer names of given type"""
+        layerName = []
+        
+        if type == 'constant':
+            for item in self.constants:
+                layerName.append(_("constant#") + str(item['constant']['object']['name']))
+        else:    
+            for item in self.layers:
+                mapLayer = self.tree.GetPyData(item)[0]['maplayer']
+                if type !=  mapLayer.GetType():
+                    continue
+                
+                layerName.append(mapLayer.GetName())
+        
+        return layerName
+    
+    def GetLayerId(self, type, name, vsubtyp = None):
+        """!Get layer object id or -1"""
+        if len(name) < 1:
+            return -1
+        
+        if type == 'constant':
+            for item in self.constants:
+                if _("constant#") + str(item['constant']['object']['name']) == name:
+                    return item['constant']['object']['id']
+                
+        
+        for item in self.layers:
+            mapLayer = self.tree.GetPyData(item)[0]['maplayer']
+            if type !=  mapLayer.GetType() or \
+                    name !=  mapLayer.GetName():
+                continue
+            
+            data = self.tree.GetPyData(item)[0]['nviz']
+            
+            try:
+                if type ==  'raster':
+                    return data['surface']['object']['id']
+                elif type ==  'vector':
+                    if vsubtyp == 'vpoint':
+                        return data['vector']['points']['object']['id']
+                    elif vsubtyp ==  'vline':
+                        return data['vector']['lines']['object']['id']
+                elif type ==  '3d-raster':
+                    return data['volume']['object']['id']
+            except KeyError:
+                return -1
+        return -1
+    
+    def ReloadLayersData(self):
+        """!Delete nviz data of all loaded layers and reload them from current settings"""
+        for item in self.layers:
+            type = self.tree.GetPyData(item)[0]['type']
+            layer = self.tree.GetPyData(item)[0]['maplayer']
+            data = self.tree.GetPyData(item)[0]['nviz']
+            
+            if type == 'raster':
+                self.nvizDefault.SetSurfaceDefaultProp(data['surface'])
+            if type == 'vector':
+                vInfo = grass.vector_info_topo(layer.GetName())
+                if (vInfo['points'] + vInfo['centroids']) > 0:
+                    self.nvizDefault.SetVectorPointsDefaultProp(data['vector']['points'])
+                if (vInfo['lines'] + vInfo['boundaries']) > 0:
+                    self.nvizDefault.SetVectorLinesDefaultProp(data['vector']['lines'])
+            
+    def NvizCmdCommand(self):
+        """!Generate command for m.nviz.image according to current state"""
+        cmd = 'm.nviz.image '
+        
+        rasters = []
+        vectors = []
+        volumes = []
+        for item in self.layers:
+            if self.tree.GetPyData(item)[0]['type'] == 'raster':
+                rasters.append(item)
+            elif self.tree.GetPyData(item)[0]['type'] == '3d-raster':
+                volumes.append(item)
+            elif self.tree.GetPyData(item)[0]['type'] == 'vector':
+                vectors.append(item)
+        if not rasters and not self.constants:
+            return _("At least one raster map required")
+        # elevation_map/elevation_value
+        if self.constants:
+            subcmd = "elevation_value="
+            for constant in self.constants:
+                subcmd += "%d," % constant['constant']['value']
+            subcmd = subcmd.strip(', ') + ' '
+            cmd += subcmd
+        if rasters:
+            subcmd = "elevation_map="
+            for item in rasters:
+                subcmd += "%s," % self.tree.GetPyData(item)[0]['maplayer'].GetName()
+            subcmd = subcmd.strip(', ') + ' '
+            cmd += subcmd
+            #
+            # draw mode
+            #
+            cmdMode = "mode="
+            cmdFine = "resolution_fine="
+            cmdCoarse = "resolution_coarse="
+            cmdShading = "shading="
+            cmdStyle = "style="
+            cmdWire = "wire_color="
+            # test -a flag
+            flag_a = "-a "
+            nvizDataFirst = self.tree.GetPyData(rasters[0])[0]['nviz']['surface']['draw']
+            for item in rasters:
+                nvizData = self.tree.GetPyData(item)[0]['nviz']['surface']['draw']
+                if nvizDataFirst != nvizData:
+                    flag_a = ""
+            cmd += flag_a
+            for item in rasters:
+                nvizData = self.tree.GetPyData(item)[0]['nviz']['surface']['draw']
+                
+                cmdMode += "%s," % nvizData['mode']['desc']['mode']
+                cmdFine += "%s," % nvizData['resolution']['fine']
+                cmdCoarse += "%s," % nvizData['resolution']['coarse']
+                cmdShading += "%s," % nvizData['mode']['desc']['shading']
+                cmdStyle += "%s," % nvizData['mode']['desc']['style']
+                cmdWire += "%s," % nvizData['wire-color']['value']
+            for item in self.constants:
+                cmdMode += "fine,"
+                cmdFine += "%s," % item['constant']['resolution']
+                cmdCoarse += "%s," % item['constant']['resolution']
+                cmdShading += "gouraud,"
+                cmdStyle += "surface,"
+                cmdWire += "0:0:0,"
+            mode = []
+            for subcmd in (cmdMode, cmdFine, cmdCoarse, cmdShading, cmdStyle, cmdWire):
+                if flag_a:
+                    mode.append(subcmd.split(',')[0] + ' ')
+                else:
+                    subcmd = subcmd.strip(', ') + ' '
+                    cmd += subcmd
+            if flag_a:# write only meaningful possibilities
+                cmd += mode[0]
+                if 'fine' in mode[0]:
+                    cmd += mode[1]
+                elif 'coarse' in mode[0]:
+                    cmd += mode[2]            
+                elif 'both' in mode[0]:
+                    cmd += mode[2]
+                    cmd += mode[1]
+                if 'flat' in mode[3]:
+                    cmd += mode[3]
+                if 'wire' in mode[4]:
+                    cmd += mode[4]
+                if 'coarse' in mode[0] or 'both' in mode[0] and 'wire' in mode[3]:
+                    cmd += mode[5]
+            #
+            # attributes
+            #
+            cmdColorMap = "color_map="
+            cmdColorVal = "color="
+            for item in rasters:
+                nvizData = self.tree.GetPyData(item)[0]['nviz']['surface']['attribute']
+                if 'color' not in nvizData:
+                    cmdColorMap += "%s," % self.tree.GetPyData(item)[0]['maplayer'].GetName()
+                else:
+                    if nvizData['color']['map']:
+                        cmdColorMap += "%s," % nvizData['color']['value']
+                    else:
+                        cmdColorVal += "%s," % nvizData['color']['value']
+                        #TODO
+                        # transparency, shine, mask
+            for item in self.constants:
+                cmdColorVal += "%s," % item['constant']['color']
+            if cmdColorMap.split("=")[1]:
+                cmd += cmdColorMap.strip(', ') + ' '
+            if cmdColorVal.split("=")[1]:
+                cmd += cmdColorVal.strip(', ') + ' '
+            cmd += "\\\n"
+        #
+        # vlines
+        #
+        if vectors:
+            cmdLines = cmdLWidth = cmdLHeight = cmdLColor = cmdLMode = cmdLPos = \
+            cmdPoints = cmdPWidth = cmdPSize = cmdPColor = cmdPMarker = cmdPPos = cmdPLayer = ""
+            markers = ['x', 'box', 'sphere', 'cube', 'diamond',
+                       'dec_tree', 'con_tree', 'aster', 'gyro', 'histogram']
+            for vector in vectors:
+                layerName = self.tree.GetPyData(vector)[0]['maplayer'].GetName()
+                vInfo = grass.vector_info_topo(layerName)
+                nvizData = self.tree.GetPyData(vector)[0]['nviz']['vector']
+                if (vInfo['lines'] + vInfo['boundaries']) > 0:
+                    cmdLines += "%s," % self.tree.GetPyData(vector)[0]['maplayer'].GetName()
+                    cmdLWidth += "%d," % nvizData['lines']['width']['value']
+                    cmdLHeight += "%d," % nvizData['lines']['height']['value']
+                    cmdLColor += "%s," % nvizData['lines']['color']['value']
+                    cmdLMode += "%s," % nvizData['lines']['mode']['type']
+                    cmdLPos += "0,0,%d," % nvizData['lines']['height']['value']
+                if (vInfo['points'] + vInfo['centroids']) > 0:    
+                    cmdPoints += "%s," % self.tree.GetPyData(vector)[0]['maplayer'].GetName()
+                    cmdPWidth += "%d," % nvizData['points']['width']['value']
+                    cmdPSize += "%d," % nvizData['points']['size']['value']
+                    cmdPColor += "%s," % nvizData['points']['color']['value']
+                    cmdPMarker += "%s," % markers[nvizData['points']['marker']['value']]
+                    cmdPPos += "0,0,%d," % nvizData['points']['height']['value']
+                    cmdPLayer += "1,1,"
+            if cmdLines:
+                cmd += "vline=" + cmdLines.strip(',') + ' '
+                cmd += "vline_width=" + cmdLWidth.strip(',') + ' '
+                cmd += "vline_color=" + cmdLColor.strip(',') + ' '
+                cmd += "vline_height=" + cmdLHeight.strip(',') + ' '
+                cmd += "vline_mode=" + cmdLMode.strip(',') + ' '
+                cmd += "vline_position=" + cmdLPos.strip(',') + ' '
+            if cmdPoints:
+                cmd += "vpoint=" + cmdPoints.strip(',') + ' '
+                cmd += "vpoint_width=" + cmdPWidth.strip(',') + ' '
+                cmd += "vpoint_color=" + cmdPColor.strip(',') + ' '
+                cmd += "vpoint_size=" + cmdPSize.strip(',') + ' '
+                cmd += "vpoint_marker=" + cmdPMarker.strip(',') + ' '
+                cmd += "vpoint_position=" + cmdPPos.strip(',') + ' '
+            cmd += "\\\n"
+            
+        #
+        # volumes
+        #
+        if volumes:
+            cmdName = cmdShade = cmdRes = cmdPos = cmdIso = ""
+            cmdIsoColorMap = cmdIsoColorVal = cmdIsoTrMap = cmdIsoTrVal = ""
+            cmdSlice = cmdSliceTransp = cmdSlicePos = ""
+            for i, volume in enumerate(volumes):
+                nvizData = self.tree.GetPyData(volume)[0]['nviz']['volume']
+                cmdName += "%s," % self.tree.GetPyData(volume)[0]['maplayer'].GetName()
+                cmdShade += "%s," % nvizData['draw']['shading']['isosurface']['desc']
+                cmdRes += "%d," % nvizData['draw']['resolution']['isosurface']['value']
+                if nvizData['position']:
+                    cmdPos += "%d,%d,%d," % (nvizData['position']['x'], nvizData['position']['y'],
+                                            nvizData['position']['z'])
+                for iso in nvizData['isosurface']:
+                    level = iso['topo']['value']
+                    cmdIso += "%d:%s," % (i + 1, level)
+                    if iso['color']['map']:
+                        cmdIsoColorMap += "%s," % iso['color']['value']
+                    else:
+                        cmdIsoColorVal += "%s," % iso['color']['value']
+                    if 'transp' in iso:
+                        if iso['transp']['map']:
+                            cmdIsoTrMap += "%s," % iso['transp']['value']
+                        else:
+                            cmdIsoTrVal += "%s," % iso['transp']['value']     
+                            
+                for slice in nvizData['slice']:
+                    axis = ('x','y','z')[slice['position']['axis']]
+                    cmdSlice += "%d:%s," % (i + 1, axis)
+                    for coord in ('x1', 'x2', 'y1', 'y2', 'z1', 'z2'):
+                        cmdSlicePos += "%f," % slice['position'][coord]
+                    cmdSliceTransp += "%s," % slice['transp']['value']
+                        
+            cmd += "volume=" + cmdName.strip(',') + ' '
+            cmd += "volume_shading=" + cmdShade.strip(',') + ' '
+            cmd += "volume_resolution=" + cmdRes.strip(',') + ' '
+            if nvizData['position']:
+                cmd += "volume_position=" + cmdPos.strip(',') + ' '
+            if cmdIso:
+                cmd += "isosurf_level=" + cmdIso.strip(',') + ' '
+                if cmdIsoColorMap:
+                    cmd += "isosurf_color_map=" + cmdIsoColorMap.strip(',') + ' '
+                if cmdIsoColorVal:
+                    cmd += "isosurf_color_value=" + cmdIsoColorVal.strip(',') + ' ' 
+                if cmdIsoTrMap:
+                    cmd += "isosurf_transparency_map=" + cmdIsoTrMap.strip(',') + ' '
+                if cmdIsoTrVal:
+                    cmd += "isosurf_transparency_value=" + cmdIsoTrVal.strip(',') + ' '
+            if cmdSlice:
+                cmd += "slice=" + cmdSlice.strip(',') + ' '
+                cmd += "slice_position=" + cmdSlicePos.strip(',') + ' '
+                cmd += "slice_transparency=" + cmdSliceTransp.strip(',') + ' '
+                
+        #
+        # cutting planes
+        #
+        cplane = self.lmgr.nviz.FindWindowById(self.lmgr.nviz.win['cplane']['planes']).GetStringSelection()
+        try:
+            planeIndex = int(cplane.split()[-1]) - 1
+        except (IndexError, ValueError):
+            planeIndex = None
+        if planeIndex is not None:
+            shading = ['clear', 'top', 'bottom', 'blend', 'shaded']
+            cmd += "cplane=%d " % planeIndex
+            cmd += "cplane_rotation=%d " % self.cplanes[planeIndex]['rotation']['rot']
+            cmd += "cplane_tilt=%d " % self.cplanes[planeIndex]['rotation']['tilt']
+            cmd += "cplane_position=%d,%d,%d " % (self.cplanes[planeIndex]['position']['x'],
+                                           self.cplanes[planeIndex]['position']['y'],
+                                           self.cplanes[planeIndex]['position']['z'])
+            cmd += "cplane_shading=%s " % shading[self.cplanes[planeIndex]['shading']]
+            cmd += "\\\n"                                        
+        # 
+        # viewpoint
+        #
+        subcmd  = "position=%.2f,%.2f " % (self.view['position']['x'], self.view['position']['y'])
+        subcmd += "height=%d " % (self.iview['height']['value'])
+        subcmd += "perspective=%d " % (self.view['persp']['value'])
+        subcmd += "twist=%d " % (self.view['twist']['value'])
+        subcmd += "zexag=%f " % (self.view['z-exag']['value'] / self.iview['z-exag']['llRatio'])
+        subcmd += "focus=%d,%d,%d " % (self.iview['focus']['x'],self.iview['focus']['y'],self.iview['focus']['z'])
+        cmd += subcmd
+        
+        # background
+        subcmd  = "bgcolor=%d:%d:%d " % (self.view['background']['color'][:3])
+        if self.view['background']['color'] != (255, 255, 255):
+            cmd += subcmd
+        cmd += "\\\n"
+        # light
+        subcmd  = "light_position=%.2f,%.2f,%.2f " % (self.light['position']['x'],
+                                                      self.light['position']['y'],
+                                                      self.light['position']['z']/100.)
+        subcmd += "light_brightness=%d " % (self.light['bright'])
+        subcmd += "light_ambient=%d " % (self.light['ambient'])
+        subcmd += "light_color=%d:%d:%d " % (self.light['color'][:3])
+        cmd += subcmd
+        cmd += "\\\n"
+        # fringe
+        toolWindow = self.lmgr.nviz
+        direction = ''
+        for dir in ('nw', 'ne', 'sw', 'se'):
+            if toolWindow.FindWindowById(toolWindow.win['fringe'][dir]).IsChecked():
+                direction += "%s," % dir
+        if direction:
+            subcmd = "fringe=%s " % (direction.strip(','))
+            color = toolWindow.FindWindowById(toolWindow.win['fringe']['color']).GetValue()
+            subcmd += "fringe_color=%d:%d:%d " % (color[0], color[1], color[2])
+            subcmd += "fringe_elevation=%d " % (toolWindow.FindWindowById(toolWindow.win['fringe']['elev']).GetValue())
+            cmd += subcmd
+            cmd += "\\\n"
+        # north arrow
+        if self.decoration['arrow']['show']:
+            subcmd = "arrow_position=%d,%d " % (self.decoration['arrow']['position']['x'],
+                                                self.decoration['arrow']['position']['y'])
+            subcmd += "arrow_color=%s " % self.decoration['arrow']['color']
+            subcmd += "arrow_size=%d " % self.decoration['arrow']['size']
+            cmd += subcmd
+            
+        # output
+        subcmd = 'output=nviz_output '
+        subcmd += 'format=ppm '
+        subcmd += 'size=%d,%d ' % self.GetClientSizeTuple()
+        cmd += subcmd
+        
+        return cmd
+    
+    def OnNvizCmd(self):
+        """!Generate and write command to command output"""
+        self.log.WriteLog(self.NvizCmdCommand(), switchPage = True)
+        
+    def SaveToFile(self, FileName, FileType, width, height):
+        """!This draws the DC to a buffer that can be saved to a file.
+        
+        @todo fix BufferedPaintDC
+        
+        @param FileName file name
+        @param FileType type of bitmap
+        @param width image width
+        @param height image height
+        """
+        self._display.SaveToFile(FileName, width, height, FileType)
+                
+        # pbuffer = wx.EmptyBitmap(max(1, self.Map.width), max(1, self.Map.height))
+        # dc = wx.BufferedPaintDC(self, pbuffer)
+        # dc.Clear()
+        # self.SetCurrent()
+        # self._display.Draw(False, -1)
+        # pbuffer.SaveFile(FileName, FileType)
+        # self.SwapBuffers()
+        
+    def GetDisplay(self):
+        """!Get display instance"""
+        return self._display
+        
+    def ZoomToMap(self):
+        """!Reset view
+        """
+        self.lmgr.nviz.OnResetView(None)
+        
+    def TextBounds(self, textinfo):
+        """!Return text boundary data
+        
+        @param textinfo text metadata (text, font, color, rotation)
+        """
+        return self.parent.MapWindow2D.TextBounds(textinfo, relcoords = True)
diff --git a/gui/wxpython/nviz/preferences.py b/gui/wxpython/nviz/preferences.py
new file mode 100644
index 0000000..c242a2d
--- /dev/null
+++ b/gui/wxpython/nviz/preferences.py
@@ -0,0 +1,630 @@
+"""
+ at package nviz.preferences
+
+ at brief Nviz (3D view) preferences window
+
+Classes:
+ - preferences::NvizPreferencesDialog
+
+(C) 2008-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
+ at author Enhancements by Michael Barton <michael.barton asu.edu>
+ at author Anna Kratochvilova <KratochAnna seznam.cz> (Google SoC 2011)
+"""
+
+import os
+import copy
+
+import wx
+import wx.lib.colourselect as csel
+
+from core                 import globalvar
+from core.settings        import UserSettings
+from gui_core.preferences import PreferencesBaseDialog
+
+class NvizPreferencesDialog(PreferencesBaseDialog):
+    """!Nviz preferences dialog"""
+    def __init__(self, parent, title = _("3D view settings"),
+                 settings = UserSettings):
+        PreferencesBaseDialog.__init__(self, parent = parent, title = title,
+                                       settings = settings)
+        self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass_nviz.ico'), wx.BITMAP_TYPE_ICO))
+
+        self.toolWin = self.parent.nviz
+        
+        # create notebook pages
+        self._createViewPage(self.notebook)
+        self._createFlyPage(self.notebook)
+        self._createLightPage(self.notebook)
+        self._createSurfacePage(self.notebook)
+        self._createVectorPage(self.notebook)
+        
+        self.SetMinSize(self.GetBestSize())
+        self.SetSize(self.size)
+        self.btnDefault.SetToolTipString(_("Revert settings to default, changes are not applied"))
+        
+    def _createViewPage(self, notebook):
+        """!Create notebook page for view settings"""
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        
+        notebook.AddPage(page = panel,
+                         text = " %s " % _("View"))
+        
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("View")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        row = 0
+        # perspective
+        pvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'persp')
+        ipvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'persp', internal = True)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Perspective:")),
+                      pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("value:")),
+                      pos = (row, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+        
+        pval = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = pvals['value'],
+                           min = ipvals['min'],
+                           max = ipvals['max'])
+        self.winId['nviz:view:persp:value'] = pval.GetId()
+        gridSizer.Add(item = pval, pos = (row, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("step:")),
+                      pos = (row, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+        
+        pstep = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = pvals['step'],
+                           min = ipvals['min'],
+                           max = ipvals['max']-1)
+        self.winId['nviz:view:persp:step'] = pstep.GetId()
+        gridSizer.Add(item = pstep, pos = (row, 4),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        row += 1
+        
+        # position
+        posvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'position')
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Position:")),
+                      pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("x:")),
+                      pos = (row, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+        
+        px = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = posvals['x'] * 100,
+                           min = 0,
+                           max = 100)
+        self.winId['nviz:view:position:x'] = px.GetId()
+        gridSizer.Add(item = px, pos = (row, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = "y:"),
+                      pos = (row, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+        
+        py = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = posvals['y'] * 100,
+                           min = 0,
+                           max = 100)
+        self.winId['nviz:view:position:y'] = py.GetId()
+        gridSizer.Add(item = py, pos = (row, 4),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        row += 1
+        
+        # height is computed dynamically
+        
+        # twist
+        tvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'twist')
+        itvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'twist', internal = True)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Twist:")),
+                      pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("value:")),
+                      pos = (row, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+        
+        tval = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = tvals['value'],
+                           min = itvals['min'],
+                           max = itvals['max'])
+        self.winId['nviz:view:twist:value'] = tval.GetId()
+        gridSizer.Add(item = tval, pos = (row, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        row += 1
+        
+        # z-exag
+        zvals = UserSettings.Get(group = 'nviz', key = 'view', subkey = 'z-exag')
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Z-exag:")),
+                      pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("value:")),
+                      pos = (row, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+        
+        zval = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = zvals['value'],
+                           min = -1e6,
+                           max = 1e6)
+        self.winId['nviz:view:z-exag:value'] = zval.GetId()
+        gridSizer.Add(item = zval, pos = (row, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+
+        box = wx.StaticBox(parent = panel, id = wx.ID_ANY,
+                           label = " %s " % (_("Image Appearance")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        gridSizer.AddGrowableCol(0)
+        
+        # background color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Background color:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        color = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                  colour = UserSettings.Get(group = 'nviz', key = 'view',
+                                                            subkey = ['background', 'color']),
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        color.SetName('GetColour')
+        self.winId['nviz:view:background:color'] = color.GetId()
+        gridSizer.Add(item = color, pos = (0, 1))
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL,
+                      border = 5)
+        
+        panel.SetSizer(pageSizer)
+        
+        return panel
+        
+    def _createFlyPage(self, notebook):
+        """!Create notebook page for view settings"""
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        
+        notebook.AddPage(page = panel,
+                         text = " %s " % _("Fly-through"))
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        # fly throuhg mode
+        box = wx.StaticBox(parent = panel, id = wx.ID_ANY,
+                           label = " %s " % (_("Fly-through mode")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        gridSizer.AddGrowableCol(0)
+        
+        # move exag
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Move exag:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        moveExag = wx.SpinCtrl(panel, id = wx.ID_ANY, min = 1, max = 20, 
+                                  initial = UserSettings.Get(group = 'nviz', key = 'fly',
+                                                             subkey = ['exag', 'move']),
+                                  size = (65, -1))
+        self.winId['nviz:fly:exag:move'] = moveExag.GetId()
+        gridSizer.Add(item = moveExag, pos = (0, 1))
+        
+        # turn exag
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Turn exag:")),
+                      pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        turnExag = wx.SpinCtrl(panel, id = wx.ID_ANY, min = 1, max = 20, 
+                                  initial = UserSettings.Get(group = 'nviz', key = 'fly',
+                                                             subkey = ['exag', 'turn']),
+                                  size = (65, -1))
+        self.winId['nviz:fly:exag:turn'] = turnExag.GetId()
+        gridSizer.Add(item = turnExag, pos = (1, 1))
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL,
+                      border = 5)
+        
+        panel.SetSizer(pageSizer)
+        
+        return panel
+        
+    def _createLightPage(self, notebook):
+        """!Create notebook page for light settings"""
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        
+        notebook.AddPage(page = panel,
+                         text = " %s " % _("Lighting"))
+        
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Light")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+
+        
+        # position
+        posvals = UserSettings.Get(group = 'nviz', key = 'light', subkey = 'position')
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Position:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("x:")),
+                      pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+        
+        px = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = posvals['x'] * 100,
+                           min = -100,
+                           max = 100)
+        self.winId['nviz:light:position:x'] = px.GetId()
+        gridSizer.Add(item = px, pos = (0, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = "y:"),
+                      pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+        
+        py = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = posvals['y'] * 100,
+                           min = -100,
+                           max = 100)
+        self.winId['nviz:light:position:y'] = py.GetId()
+        gridSizer.Add(item = py, pos = (0, 4),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+                    
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("z:")),
+                      pos = (0, 5), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+        
+        pz = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = posvals['z'],
+                           min = 0,
+                           max = 100)
+        self.winId['nviz:light:position:z'] = pz.GetId()
+        gridSizer.Add(item = pz, pos = (0, 6),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+                    
+        # brightness
+        brightval = UserSettings.Get(group = 'nviz', key = 'light', subkey = 'bright')
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Brightness:")),
+                      pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        bright = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = brightval,
+                           min = 0,
+                           max = 100)
+        self.winId['nviz:light:bright'] = bright.GetId()
+        gridSizer.Add(item = bright, pos = (1, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+                    
+        # ambient
+        ambval = UserSettings.Get(group = 'nviz', key = 'light', subkey = 'ambient')
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Ambient:")),
+                      pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        amb = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = ambval,
+                           min = 0,
+                           max = 100)
+        self.winId['nviz:light:ambient'] = amb.GetId()
+        gridSizer.Add(item = amb, pos = (2, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+                    
+        # light color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Color:")),
+                      pos = (3, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        color = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                  colour = UserSettings.Get(group = 'nviz', key = 'light',
+                                                            subkey = 'color'),
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        color.SetName('GetColour')
+        self.winId['nviz:light:color'] = color.GetId()
+        gridSizer.Add(item = color, pos = (3, 2))
+        
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL,
+                      border = 5)
+        
+        panel.SetSizer(pageSizer)
+        
+        return panel
+    
+    def _createSurfacePage(self, notebook):
+        """!Create notebook page for surface settings"""
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        
+        notebook.AddPage(page = panel,
+                         text = " %s " % _("Surface"))
+        
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        # draw
+        
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Draw")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        
+        # mode
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                        label = _("Mode:")), flag = wx.ALIGN_CENTER_VERTICAL,
+                        pos = (0, 0))
+        mode = wx.Choice(parent = panel, id = wx.ID_ANY, size = (-1, -1),
+                          choices = [_("coarse"),
+                                     _("fine"),
+                                     _("both")])
+        self.winId['nviz:surface:draw:mode'] = mode.GetId()
+        mode.SetName('GetSelection')
+        mode.SetSelection(UserSettings.Get(group = 'nviz', key = 'surface',
+                                            subkey = ['draw', 'mode']))
+        gridSizer.Add(item = mode, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (0, 1))
+                    
+        # fine
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                        label = _("Fine mode:")), flag = wx.ALIGN_CENTER_VERTICAL,
+                        pos = (1, 0))
+        res = UserSettings.Get(group = 'nviz', key = 'surface', subkey = ['draw','res-fine'])
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                        label = _("resolution:")), flag = wx.ALIGN_CENTER_VERTICAL,
+                        pos = (1, 1))
+        fine = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = res,
+                           min = 1,
+                           max = 100)
+        self.winId['nviz:surface:draw:res-fine'] = fine.GetId()
+        
+        gridSizer.Add(item = fine, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (1, 2))
+                    
+        # coarse
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                        label = _("Coarse mode:")), flag = wx.ALIGN_CENTER_VERTICAL,
+                        pos = (2, 0))
+        res = UserSettings.Get(group = 'nviz', key = 'surface', subkey = ['draw','res-coarse'])
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                        label = _("resolution:")), flag = wx.ALIGN_CENTER_VERTICAL,
+                        pos = (2, 1))
+        coarse = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = res,
+                           min = 1,
+                           max = 100)
+        self.winId['nviz:surface:draw:res-coarse'] = coarse.GetId()
+        
+        gridSizer.Add(item = coarse, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (2, 2))
+        #style
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+            label = _("style:")), flag = wx.ALIGN_CENTER_VERTICAL,
+            pos = (3, 1))
+        style = wx.Choice(parent = panel, id = wx.ID_ANY, size = (-1, -1),
+                          choices = [_("wire"),
+                                     _("surface")])
+        self.winId['nviz:surface:draw:style'] = style.GetId()
+        style.SetName('GetSelection')
+        style.SetSelection(UserSettings.Get(group = 'nviz', key = 'surface',
+                                            subkey = ['draw', 'style']))
+        self.winId['nviz:surface:draw:style'] = style.GetId()
+        
+        gridSizer.Add(item = style, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (3, 2))
+        #wire color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+            label = _("wire color:")), flag = wx.ALIGN_CENTER_VERTICAL,
+            pos = (4, 1))
+        color = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                  colour = UserSettings.Get(group = 'nviz', key = 'surface',
+                                                            subkey = ['draw', 'wire-color']),
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        color.SetName('GetColour')
+        self.winId['nviz:surface:draw:wire-color'] = color.GetId() 
+        gridSizer.Add(item = color, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (4, 2))
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 5)            
+        pageSizer.Add(item = boxSizer, proportion = 0,
+              flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+              border = 5)
+        
+        panel.SetSizer(pageSizer)
+        
+        return panel
+    
+    def _createVectorPage(self, notebook):
+        """!Create notebook page for vector settings"""
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY)
+        
+        notebook.AddPage(page = panel,
+                         text = " %s " % _("Vector"))
+        
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        # vector lines
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Vector lines")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        
+        row = 0
+        # icon size
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Width:")),
+                      pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        iwidth = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                            initial = 12,
+                            min = 1,
+                            max = 100)
+        self.winId['nviz:vector:lines:width'] = iwidth.GetId()
+        iwidth.SetValue(UserSettings.Get(group = 'nviz', key = 'vector',
+                                        subkey = ['lines', 'width']))
+        gridSizer.Add(item = iwidth, pos = (row, 1),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        # icon color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Color:")),
+                      pos = (row, 4), flag = wx.ALIGN_CENTER_VERTICAL)
+        icolor = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                   size = globalvar.DIALOG_COLOR_SIZE)
+        icolor.SetName('GetColour')
+        self.winId['nviz:vector:lines:color'] = icolor.GetId()
+        icolor.SetColour(UserSettings.Get(group = 'nviz', key = 'vector',
+                                          subkey = ['lines', 'color']))
+        gridSizer.Add(item = icolor, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 5))
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 5)
+        
+        # vector points
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Vector points")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 5)
+        
+        row = 0
+        # icon size
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Size:")),
+                      pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        isize = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                            initial = 100,
+                            min = 1,
+                            max = 1e6)
+        self.winId['nviz:vector:points:size'] = isize.GetId()
+        isize.SetValue(UserSettings.Get(group = 'nviz', key = 'vector',
+                                        subkey = ['points', 'size']))
+        gridSizer.Add(item = isize, pos = (row, 1),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        # icon symbol
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Marker:")),
+                      pos = (row, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+        isym = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
+                          choices = UserSettings.Get(group = 'nviz', key = 'vector',
+                                                   subkey = ['points', 'marker'], internal = True))
+        isym.SetName("GetSelection")
+        self.winId['nviz:vector:points:marker'] = isym.GetId()
+        isym.SetSelection(UserSettings.Get(group = 'nviz', key = 'vector',
+                                           subkey = ['points', 'marker']))
+        gridSizer.Add(item = isym, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 3))
+        
+        # icon color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Color:")),
+                      pos = (row, 4), flag = wx.ALIGN_CENTER_VERTICAL)
+        icolor = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                   size = globalvar.DIALOG_COLOR_SIZE)
+        icolor.SetName('GetColour')
+        self.winId['nviz:vector:points:color'] = icolor.GetId()
+        icolor.SetColour(UserSettings.Get(group = 'nviz', key = 'vector',
+                                          subkey = ['points', 'color']))
+        gridSizer.Add(item = icolor, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (row, 5))
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 5)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 5)
+        
+        panel.SetSizer(pageSizer)
+        
+        return panel
+
+    def OnDefault(self, event):
+        """!Button 'Set to default' pressed"""
+        self.settings.userSettings = copy.deepcopy(self.settings.defaultSettings)
+        
+        # update widgets
+        for gks in self.winId.keys():
+            subkey1 = None
+            try:
+                group, key, subkey = gks.split(':')
+                value = self.settings.Get(group, key, subkey)
+            except ValueError:
+                group, key, subkey, subkey1 = gks.split(':')
+                value = self.settings.Get(group, key, [subkey, subkey1])
+            if subkey == 'position':
+                if subkey1 in ('x', 'y'):
+                    value = float(value) * 100
+            win = self.FindWindowById(self.winId[gks])
+            if win.GetName() == 'GetSelection':
+                value = win.SetSelection(value)
+            else:
+                value = win.SetValue(value)        
+        
+    def OnApply(self, event):
+        """Apply Nviz settings for current session"""
+        for item in self.winId.keys():
+            try:
+                group, key, subkey = item.split(':')
+                subkey1 = None
+            except ValueError:
+                group, key, subkey, subkey1 = item.split(':')
+            
+            id = self.winId[item]
+            win = self.FindWindowById(id)
+            if win.GetName() == 'GetSelection':
+                value = win.GetSelection()
+            elif win.GetName() == 'GetColour':
+                value = tuple(win.GetValue())
+            else:
+                value = win.GetValue()
+            
+            if subkey == 'position':
+                if subkey1 in ('x', 'y'):
+                    value = float(value) / 100
+            if subkey1:
+                self.settings.Set(group, value, key, [subkey, subkey1])
+            else:
+                self.settings.Set(group, value, key, subkey)
+                
+        self.toolWin.LoadSettings()
+        
+        
+    def OnSave(self, event):
+        """!Save button pressed
+        
+        Apply changes and save settings to configuration file
+        """
+        self.OnApply(None)
+        fileSettings = {}
+        UserSettings.ReadSettingsFile(settings = fileSettings)
+        fileSettings['nviz'] = UserSettings.Get(group = 'nviz')
+        
+        UserSettings.SaveToFile(fileSettings)
+        self.parent.goutput.WriteLog(
+                _('3D view settings saved to file <%s>.') % UserSettings.filePath)
+        
+        self.Destroy()
diff --git a/gui/wxpython/nviz/tools.py b/gui/wxpython/nviz/tools.py
new file mode 100644
index 0000000..a13d991
--- /dev/null
+++ b/gui/wxpython/nviz/tools.py
@@ -0,0 +1,4896 @@
+"""!
+ at package nviz.tools
+
+ at brief Nviz (3D view) tools window
+
+Classes:
+ - tools::NvizToolWindow
+ - tools::PositionWindow
+ - tools::ViewPositionWindow
+ - tools::LightPositionWindow
+
+(C) 2008-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
+ at author Enhancements by Michael Barton <michael.barton asu.edu>
+ at author Anna Kratochvilova <kratochanna gmail.com> (Google SoC 2011)
+"""
+
+import os
+import sys
+import copy
+import types
+
+import wx
+import wx.lib.colourselect  as csel
+import wx.lib.scrolledpanel as SP
+import wx.lib.filebrowsebutton as filebrowse
+try:
+    import wx.lib.agw.flatnotebook as FN
+except ImportError:
+    import wx.lib.flatnotebook as FN
+try:
+    from agw import foldpanelbar as fpb
+except ImportError: # if it's not there locally, try the wxPython lib.
+    try:
+        import wx.lib.agw.foldpanelbar as fpb
+    except ImportError:
+        import wx.lib.foldpanelbar as fpb # versions <=2.5.5.1
+        
+import grass.script as grass
+
+from core               import globalvar
+from core.gcmd          import GMessage, RunCommand
+from core.settings      import UserSettings
+from nviz.animation     import EVT_ANIM_FIN, EVT_ANIM_UPDATE_IDX
+from gui_core.widgets   import ScrolledPanel, NumTextCtrl, FloatSlider, SymbolButton
+from gui_core.gselect   import Select
+from core.debug         import Debug
+try:
+    from nviz.mapwindow import wxUpdateProperties, wxUpdateView,\
+                               wxUpdateLight, wxUpdateCPlane
+    import wxnviz
+except ImportError:
+    pass
+
+class NvizToolWindow(FN.FlatNotebook):
+    """!Nviz (3D view) tools panel
+    """
+    def __init__(self, parent, display, id = wx.ID_ANY,
+                 style = globalvar.FNPageStyle|FN.FNB_NO_X_BUTTON,
+                 **kwargs):
+        Debug.msg(5, "NvizToolWindow.__init__()")
+        self.parent     = parent # GMFrame
+        self.mapDisplay = display
+        self.mapWindow  = display.GetWindow()
+        self._display   = self.mapWindow.GetDisplay()
+         
+        if globalvar.hasAgw:
+            kwargs['agwStyle'] = style
+        else:
+            kwargs['style'] = style
+        FN.FlatNotebook.__init__(self, parent, id, **kwargs)
+        self.SetTabAreaColour(globalvar.FNPageColor)
+        
+        self.win  = {} # window ids
+        self.page = {} # page ids
+
+        # view page
+        self.AddPage(page = self._createViewPage(),
+                     text = " %s " % _("View"))
+
+        # data page
+        self.AddPage(page = self._createDataPage(),
+                     text = " %s " % _("Data"))
+        
+        # appearance page
+        self.AddPage(page = self._createAppearancePage(),
+                     text = " %s " % _("Appearance"))
+                    
+        # analysis page
+        self.AddPage(page = self._createAnalysisPage(),
+                     text = " %s " % _("Analysis"))
+        # view page
+        self.AddPage(page = self._createAnimationPage(),
+                     text = " %s " % _("Animation"))
+        
+        self.UpdateSettings()
+        
+        self.mapWindow.SetToolWin(self)
+        
+        self.pageChanging = False
+        self.vetoGSelectEvt = False #when setting map, event is invoked
+        self.mapWindow.render['quick'] = False
+        self.mapWindow.Refresh(False)
+        
+        # bindings
+        self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.OnPageChanged)
+        self.Bind(wx.EVT_SIZE, self.OnSize)
+        
+        self.Bind(EVT_ANIM_FIN, self.OnAnimationFinished)
+        self.Bind(EVT_ANIM_UPDATE_IDX, self.OnAnimationUpdateIndex)
+        
+        Debug.msg(3, "NvizToolWindow.__init__()")
+        
+        self.Update()
+        wx.CallAfter(self.SetPage, 'view')
+        wx.CallAfter(self.UpdateScrolling, (self.foldpanelData, self.foldpanelAppear,
+                                            self.foldpanelAnalysis))       
+        wx.CallAfter(self.SetInitialMaps)
+        
+    def SetInitialMaps(self):
+        """!Set initial raster and vector map"""
+        for l_type in ('raster', 'vector', '3d-raster'):
+            selectedLayer = self.mapWindow.GetSelectedLayer()
+            layers = self.mapWindow.Map.GetListOfLayers(l_type = l_type, l_active = True)
+            if selectedLayer in layers:
+                selection = selectedLayer.GetName()
+            else:
+                try:
+                    selection = layers[0].GetName()
+                except:
+                    continue
+            if l_type == 'raster':
+                self.FindWindowById(self.win['surface']['map']).SetValue(selection)
+                self.FindWindowById(self.win['fringe']['map']).SetValue(selection)
+            elif l_type == 'vector':
+                self.FindWindowById(self.win['vector']['map']).SetValue(selection)
+            elif l_type == '3d-raster':
+                self.FindWindowById(self.win['volume']['map']).SetValue(selection)
+               
+    def UpdateState(self, **kwargs):
+        if 'view' in kwargs:
+            self.mapWindow.view = kwargs['view']
+            self.FindWindowById(self.win['view']['position']).data = kwargs['view']
+            self.FindWindowById(self.win['view']['position']).PostDraw()
+        if 'iview' in kwargs:
+            self.mapWindow.iview = kwargs['iview']
+        if 'light' in kwargs:
+            self.mapWindow.light = kwargs['light']  
+            self.FindWindowById(self.win['light']['position']).data = kwargs['light']  
+            self.FindWindowById(self.win['light']['position']).PostDraw()
+        if 'fly' in kwargs:
+            self.mapWindow.fly['exag'] = kwargs['fly']['exag']
+    
+    def LoadSettings(self):
+        """!Load Nviz settings and apply to current session"""
+        view = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'view')) # copy
+        light = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'light')) # copy
+        fly = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'fly')) # copy
+        self.UpdateState(view = view, light = light, fly = fly)
+        self.PostViewEvent(zExag = True)
+        self.PostLightEvent()
+        self.UpdatePage('view')
+        self.UpdatePage('light')
+        
+        self.mapWindow.ReloadLayersData()
+        self.UpdatePage('surface')
+        self.UpdatePage('vector')
+        self.UpdateSettings()
+               
+    def OnPageChanged(self, event):
+        new = event.GetSelection()
+        # self.ChangeSelection(new)
+        
+    def PostViewEvent(self, zExag = False):
+        """!Change view settings"""
+        event = wxUpdateView(zExag = zExag)
+        wx.PostEvent(self.mapWindow, event)
+        
+    def PostLightEvent(self, refresh = False): 
+        """!Change light settings"""   
+        event = wxUpdateLight(refresh = refresh)
+        wx.PostEvent(self.mapWindow, event)
+        
+    def OnSize(self, event):
+        """!After window is resized, update scrolling"""
+        # workaround to resize captionbars of foldpanelbar
+        wx.CallAfter(self.UpdateScrolling, (self.foldpanelData, self.foldpanelAppear,
+                                            self.foldpanelAnalysis)) 
+        event.Skip()
+           
+    def OnPressCaption(self, event):
+        """!When foldpanel item collapsed/expanded, update scrollbars"""
+        foldpanel = event.GetBar().GetGrandParent().GetParent()
+        wx.CallAfter(self.UpdateScrolling, (foldpanel,))
+        event.Skip()
+        
+    def UpdateScrolling(self, foldpanels):
+        """!Update scrollbars in foldpanel"""
+        for foldpanel in foldpanels:
+            length = foldpanel.GetPanelsLength(collapsed = 0, expanded = 0)
+            # virtual width is set to fixed value to suppress GTK warning
+            foldpanel.GetParent().SetVirtualSize((100, length[2]))
+            foldpanel.GetParent().Layout()
+        
+    def _createViewPage(self):
+        """!Create view settings page"""
+        panel = SP.ScrolledPanel(parent = self, id = wx.ID_ANY)
+        panel.SetupScrolling(scroll_x = False)
+        self.page['view'] = { 'id' : 0,
+                              'notebook' : self.GetId()}
+        
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Control View")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 10)
+        
+        self.win['view'] = {}
+        
+        # position
+        posSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        
+        self._createCompass(panel = panel, sizer = posSizer, type = 'view')
+        
+        view = ViewPositionWindow(panel, size = (175, 175),
+                                  mapwindow = self.mapWindow)
+        self.win['view']['position'] = view.GetId()
+        posSizer.Add(item = view,
+                     pos = (1, 1), flag = wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = posSizer, pos = (0, 0))
+                  
+        # perspective
+        # set initial defaults here (or perhaps in a default values file), not in user settings
+        #todo: consider setting an absolute max at 360 instead of undefined. (leave the default max value at pi)
+        tooltip = _("Adjusts the distance and angular perspective of the image viewpoint")
+        self._createControl(panel, data = self.win['view'], name = 'persp',
+                            tooltip = tooltip, range = (1, 120),
+                            bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedText))
+        
+        gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Perspective:")),
+                      pos = (1, 0), flag = wx.ALIGN_CENTER)
+        gridSizer.Add(item = self.FindWindowById(self.win['view']['persp']['slider']), pos = (2, 0),
+                      flag = wx.ALIGN_CENTER)
+        gridSizer.Add(item = self.FindWindowById(self.win['view']['persp']['text']), pos = (3, 0),
+                      flag = wx.ALIGN_CENTER)        
+        
+        # twist
+        tooltip = _("Tilts the plane of the surface from the horizontal")
+        self._createControl(panel, data = self.win['view'], name = 'twist',
+                            tooltip = tooltip, range = (-180,180),
+                            bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedText))
+        gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Tilt:")),
+                      pos = (1, 1), flag = wx.ALIGN_CENTER)
+        gridSizer.Add(item = self.FindWindowById(self.win['view']['twist']['slider']), pos = (2, 1))
+        gridSizer.Add(item = self.FindWindowById(self.win['view']['twist']['text']), pos = (3, 1),
+                      flag = wx.ALIGN_CENTER)        
+        
+        # height + z-exag
+        tooltip = _("Adjusts the viewing height above the surface"
+                    " (angle of view automatically adjusts to maintain the same center of view)")
+        self._createControl(panel, data = self.win['view'], name = 'height', sliderHor = False,
+                            tooltip = tooltip, range = (0, 1),
+                            bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedText))
+        tooltip = _("Adjusts the relative height of features above the plane of the surface")
+        self._createControl(panel, data = self.win['view'], name = 'z-exag', sliderHor = False,
+                            tooltip = tooltip, range = (0, 10), floatSlider = True,
+                            bind = (self.OnViewChange, self.OnViewChanged, self.OnViewChangedText))
+        self.FindWindowById(self.win['view']['z-exag']['slider']).SetValue(1)
+        self.FindWindowById(self.win['view']['z-exag']['text']).SetValue(1)
+        
+        heightSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        heightSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Height:")),
+                      pos = (0, 0), flag = wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL, span = (1, 2))
+        heightSizer.Add(item = self.FindWindowById(self.win['view']['height']['slider']),
+                        flag = wx.ALIGN_RIGHT, pos = (1, 0))
+        heightSizer.Add(item = self.FindWindowById(self.win['view']['height']['text']),
+                        flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT, pos = (1, 1))
+        heightSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Z-exag:")),
+                      pos = (0, 2), flag = wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL, span = (1, 2))
+        heightSizer.Add(item = self.FindWindowById(self.win['view']['z-exag']['slider']),
+                        flag = wx.ALIGN_RIGHT, pos = (1, 2))
+        heightSizer.Add(item = self.FindWindowById(self.win['view']['z-exag']['text']),
+                        flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.TOP |
+                        wx.BOTTOM | wx.RIGHT, pos = (1, 3))
+        
+        gridSizer.Add(item = heightSizer, pos = (0, 1), flag = wx.ALIGN_CENTER)
+        
+        # view setup + reset
+        viewSizer = wx.BoxSizer(wx.HORIZONTAL)
+        viewSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY,
+                                           label = _("Look:")),
+                      flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL,
+                      border = 5)
+        here = wx.ToggleButton(panel, id = wx.ID_ANY, label = _("here"))
+        here.Bind(wx.EVT_TOGGLEBUTTON, self.OnLookAt)
+        here.SetName('here')
+        here.SetToolTipString(_("Allows you to select a point on the surface "
+                                "that becomes the new center of view. "
+                                "Click on the button and then on the surface."))
+        viewSizer.Add(item = here, flag = wx.TOP|wx.BOTTOM|wx.LEFT|wx.ALIGN_CENTER_VERTICAL,
+                      border = 5)
+                    
+        center = wx.Button(panel, id = wx.ID_ANY, label = _("center"))
+        center.Bind(wx.EVT_BUTTON, self.OnLookAt)
+        center.SetName('center')
+        center.SetToolTipString(_("Resets the view to the original default center of view"))
+        viewSizer.Add(item = center, flag = wx.TOP|wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL,
+                      border = 5)
+                    
+        top = wx.Button(panel, id = wx.ID_ANY, label = _("top"))
+        top.Bind(wx.EVT_BUTTON, self.OnLookAt)
+        top.SetName('top')
+        top.SetToolTipString(_("Sets the viewer directly over the scene's center position. This top view orients approximately north south."))
+        viewSizer.Add(item = top, flag = wx.TOP|wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL,
+                      border = 5)
+                    
+        reset = wx.Button(panel, id = wx.ID_ANY, label = _("reset"))
+        reset.SetToolTipString(_("Reset to default view"))
+        reset.Bind(wx.EVT_BUTTON, self.OnResetView)
+        viewSizer.Add(item = reset, proportion = 0,
+                      flag = wx.TOP|wx.BOTTOM|wx.RIGHT| wx.ALIGN_RIGHT,
+                      border = 5)
+        
+        gridSizer.AddGrowableCol(2)
+        gridSizer.Add(item = viewSizer, pos = (4, 0), span = (1, 3),
+                      flag = wx.EXPAND)
+        
+        # body
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 2)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL,
+                      border = 3)
+        
+        box = wx.StaticBox(parent = panel, id = wx.ID_ANY,
+                           label = " %s " % (_("Image Appearance")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        gridSizer.AddGrowableCol(0)
+        
+        # background color
+        self.win['view']['background'] = {}
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Background color:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        color = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                  colour = UserSettings.Get(group = 'nviz', key = 'view',
+                                                            subkey = ['background', 'color']),
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        self.win['view']['background']['color'] = color.GetId()
+        color.Bind(csel.EVT_COLOURSELECT, self.OnBgColor)
+        gridSizer.Add(item = color, pos = (0, 1))
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT,
+                      border = 3)
+        
+        panel.SetSizer(pageSizer)
+        
+        return panel
+        
+    def _createAnimationPage(self):
+        """!Create view settings page"""
+        panel = SP.ScrolledPanel(parent = self, id = wx.ID_ANY)
+        panel.SetupScrolling(scroll_x = False)
+        self.page['animation'] = { 'id' : 0,
+                                   'notebook' : self.GetId()}
+        
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Animation")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        hSizer = wx.BoxSizer(wx.HORIZONTAL)
+        
+        self.win['anim'] = {}
+        # animation help text
+        help = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                             label = _("Press 'Record' button and start changing the view. "
+                                       "It is recommended to use fly-through mode "
+                                       "(Map Display toolbar) to achieve smooth motion."))
+        self.win['anim']['help'] = help.GetId()
+        hSizer.Add(item = help, proportion = 0)
+        boxSizer.Add(item = hSizer, proportion = 1,
+                     flag = wx.ALL | wx.EXPAND, border = 5)
+                     
+        # animation controls
+        hSizer = wx.BoxSizer(wx.HORIZONTAL)
+        record = SymbolButton(parent = panel, id = wx.ID_ANY,
+                                    usage = "record", label = _("Record"))
+        play = SymbolButton(parent = panel, id = wx.ID_ANY,
+                                  usage = "play", label = _("Play"))
+        pause = SymbolButton(parent = panel, id = wx.ID_ANY,
+                                   usage = "pause", label = _("Pause"))
+        stop = SymbolButton(parent = panel, id = wx.ID_ANY,
+                                  usage = "stop", label = _("Stop"))
+        
+        self.win['anim']['record'] = record.GetId()
+        self.win['anim']['play'] = play.GetId()
+        self.win['anim']['pause'] = pause.GetId()
+        self.win['anim']['stop'] = stop.GetId()
+                            
+        self._createControl(panel, data = self.win['anim'], name = 'frameIndex',
+                            range = (0, 1), floatSlider = False,
+                            bind = (self.OnFrameIndex, None, self.OnFrameIndexText))
+        frameSlider = self.FindWindowById(self.win['anim']['frameIndex']['slider'])
+        frameText = self.FindWindowById(self.win['anim']['frameIndex']['text'])
+        infoLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Total number of frames :"))
+        info = wx.StaticText(parent = panel, id = wx.ID_ANY)
+        self.win['anim']['info'] = info.GetId()
+        
+        fpsLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Frame rate (FPS):"))
+        fps = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = UserSettings.Get(group = 'nviz', key = 'animation', subkey = 'fps'),
+                           min = 1,
+                           max = 50)
+        self.win['anim']['fps'] = fps.GetId()
+        fps.SetToolTipString(_("Frames are recorded with given frequency (FPS). "))
+                            
+        record.Bind(wx.EVT_BUTTON, self.OnRecord)
+        play.Bind(wx.EVT_BUTTON, self.OnPlay)
+        stop.Bind(wx.EVT_BUTTON, self.OnStop)
+        pause.Bind(wx.EVT_BUTTON, self.OnPause)
+        fps.Bind(wx.EVT_SPINCTRL, self.OnFPS)
+        
+        hSizer.Add(item = record, proportion = 0)
+        hSizer.Add(item = play, proportion = 0)
+        hSizer.Add(item = pause, proportion = 0)
+        hSizer.Add(item = stop, proportion = 0)
+        boxSizer.Add(item = hSizer, proportion = 0,
+                     flag = wx.ALL | wx.EXPAND, border = 3)
+        
+        sliderBox = wx.BoxSizer(wx.HORIZONTAL)
+        sliderBox.Add(item = frameSlider, proportion = 1, border = 5, flag = wx.EXPAND | wx.RIGHT)
+        sliderBox.Add(item = frameText, proportion = 0, border = 5, flag = wx.EXPAND| wx.RIGHT | wx.LEFT)
+        boxSizer.Add(item = sliderBox, proportion = 0, flag = wx.EXPAND)
+        
+        # total number of frames
+        hSizer = wx.BoxSizer(wx.HORIZONTAL)
+        hSizer.Add(item = infoLabel, proportion = 0, flag = wx.RIGHT, border = 5)
+        hSizer.Add(item = info, proportion = 0, flag = wx.LEFT, border = 5)
+        
+        boxSizer.Add(item = hSizer, proportion = 0,
+                     flag = wx.ALL | wx.EXPAND, border = 5)
+                     
+        # frames per second
+        hSizer = wx.BoxSizer(wx.HORIZONTAL)
+        hSizer.Add(item = fpsLabel, proportion = 0, flag = wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, border = 5)
+        hSizer.Add(item = fps, proportion = 0, flag = wx.LEFT | wx.ALIGN_CENTER_VERTICAL, border = 5)
+        
+        boxSizer.Add(item = hSizer, proportion = 0,
+                     flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+                      
+        # save animation
+        self.win['anim']['save'] = {}
+        self.win['anim']['save']['image'] = {}
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Save image sequence")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        vSizer = wx.BoxSizer(wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 10)
+        
+        pwd = os.getcwd()
+        dir = filebrowse.DirBrowseButton(parent = panel, id = wx.ID_ANY,
+                                         labelText = _("Choose a directory:"),
+                                         dialogTitle = _("Choose a directory for images"),
+                                         buttonText = _('Browse'),
+                                         startDirectory = pwd)
+        dir.SetValue(pwd)
+        prefixLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("File prefix:"))
+        prefixCtrl = wx.TextCtrl(parent = panel, id = wx.ID_ANY, size = (100, -1),
+                                 value = UserSettings.Get(group = 'nviz',
+                                                          key = 'animation', subkey = 'prefix'))
+        prefixCtrl.SetToolTipString(_("Generated files names will look like this: prefix_1.ppm, prefix_2.ppm, ..."))
+        fileTypeLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("File format:"))
+        fileTypeCtrl = wx.Choice(parent = panel, id = wx.ID_ANY, choices = ["TIF", "PPM"])
+        
+        save = wx.Button(parent = panel, id = wx.ID_ANY,
+                         label = "Save")
+                         
+        self.win['anim']['save']['image']['dir'] = dir.GetId()
+        self.win['anim']['save']['image']['prefix'] = prefixCtrl.GetId()
+        self.win['anim']['save']['image']['format'] = fileTypeCtrl.GetId()
+        self.win['anim']['save']['image']['confirm'] = save.GetId()
+        
+        boxSizer.Add(item = dir, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 3)
+        
+        gridSizer.Add(item = prefixLabel, pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
+        gridSizer.Add(item = prefixCtrl, pos = (0, 1), flag = wx.EXPAND )
+        gridSizer.Add(item = fileTypeLabel, pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
+        gridSizer.Add(item = fileTypeCtrl, pos = (1, 1), flag = wx.EXPAND )
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                     flag = wx.ALL | wx.EXPAND, border = 5)
+        boxSizer.Add(item = save, proportion = 0, flag = wx.ALL | wx.ALIGN_RIGHT, border = 5)
+        
+        save.Bind(wx.EVT_BUTTON, self.OnSaveAnimation)
+        
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 
+                      border = 3)
+        
+        panel.SetSizer(pageSizer)
+        
+        return panel
+        
+    def _createDataPage(self):
+        """!Create data (surface, vector, volume) settings page"""
+
+        self.mainPanelData = ScrolledPanel(parent = self)
+        self.mainPanelData.SetupScrolling(scroll_x = False)
+##        style = fpb.CaptionBarStyle()
+##        style.SetCaptionStyle(fpb.CAPTIONBAR_FILLED_RECTANGLE)
+##        style.SetFirstColour(wx.Color(250,250,250))
+        try:# wxpython <= 2.8.10
+            self.foldpanelData = fpb.FoldPanelBar(parent = self.mainPanelData, id = wx.ID_ANY,
+                                                  style = fpb.FPB_DEFAULT_STYLE,
+                                                  extraStyle = fpb.FPB_SINGLE_FOLD)
+        except:
+            try:# wxpython >= 2.8.11
+                self.foldpanelData = fpb.FoldPanelBar(parent = self.mainPanelData, id = wx.ID_ANY,                               
+                                                      agwStyle = fpb.FPB_SINGLE_FOLD)
+            except: # to be sure
+                self.foldpanelData = fpb.FoldPanelBar(parent = self.mainPanelData, id = wx.ID_ANY,                               
+                                                      style = fpb.FPB_SINGLE_FOLD)
+            
+                     
+        self.foldpanelData.Bind(fpb.EVT_CAPTIONBAR, self.OnPressCaption)
+
+
+        
+        # surface page
+        surfacePanel = self.foldpanelData.AddFoldPanel(_("Surface"), collapsed = False)
+        self.foldpanelData.AddFoldPanelWindow(surfacePanel, 
+            window = self._createSurfacePage(parent = surfacePanel), flags = fpb.FPB_ALIGN_WIDTH)
+        self.EnablePage("surface", enabled = False)
+        
+        # constant page
+        constantPanel = self.foldpanelData.AddFoldPanel(_("Constant surface"), collapsed = True)
+        self.foldpanelData.AddFoldPanelWindow(constantPanel,
+            window = self._createConstantPage(parent = constantPanel), flags = fpb.FPB_ALIGN_WIDTH)
+        self.EnablePage("constant", enabled = False)
+        # vector page
+        vectorPanel = self.foldpanelData.AddFoldPanel(_("Vector"), collapsed = True)
+        self.foldpanelData.AddFoldPanelWindow(vectorPanel, 
+            window = self._createVectorPage(parent = vectorPanel), flags = fpb.FPB_ALIGN_WIDTH)
+        self.EnablePage("vector", enabled = False)
+        
+        # volume page
+        volumePanel = self.foldpanelData.AddFoldPanel(_("Volume"), collapsed = True)
+        self.foldpanelData.AddFoldPanelWindow(volumePanel,
+            window = self._createVolumePage(parent = volumePanel), flags = fpb.FPB_ALIGN_WIDTH)
+        self.EnablePage("volume", enabled = False)
+        
+##        self.foldpanelData.ApplyCaptionStyleAll(style)
+        
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        sizer.Add(self.foldpanelData, proportion = 1, flag = wx.EXPAND)
+        self.mainPanelData.SetSizer(sizer)
+        self.mainPanelData.Layout()
+        self.mainPanelData.Fit()
+        
+        return self.mainPanelData
+        
+        
+    def _createAppearancePage(self):
+        """!Create data (surface, vector, volume) settings page"""
+        self.mainPanelAppear = ScrolledPanel(parent = self)
+        self.mainPanelAppear.SetupScrolling(scroll_x = False)
+        
+        try:# wxpython <= 2.8.10
+            self.foldpanelAppear = fpb.FoldPanelBar(parent = self.mainPanelAppear, id = wx.ID_ANY,
+                                                  style = fpb.FPB_DEFAULT_STYLE,
+                                                  extraStyle = fpb.FPB_SINGLE_FOLD)
+        except:
+            try:# wxpython >= 2.8.11
+                self.foldpanelAppear = fpb.FoldPanelBar(parent = self.mainPanelAppear, id = wx.ID_ANY,                               
+                                                      agwStyle = fpb.FPB_SINGLE_FOLD)
+            except: # to be sure
+                self.foldpanelAppear = fpb.FoldPanelBar(parent = self.mainPanelAppear, id = wx.ID_ANY,                               
+                                                      style = fpb.FPB_SINGLE_FOLD)
+            
+        self.foldpanelAppear.Bind(fpb.EVT_CAPTIONBAR, self.OnPressCaption)
+        # light page
+        lightPanel = self.foldpanelAppear.AddFoldPanel(_("Lighting"), collapsed = False)
+        self.foldpanelAppear.AddFoldPanelWindow(lightPanel, 
+            window = self._createLightPage(parent = lightPanel), flags = fpb.FPB_ALIGN_WIDTH)
+    
+        # fringe page
+        fringePanel = self.foldpanelAppear.AddFoldPanel(_("Fringe"), collapsed = True)
+        self.foldpanelAppear.AddFoldPanelWindow(fringePanel, 
+            window = self._createFringePage(parent = fringePanel), flags = fpb.FPB_ALIGN_WIDTH)
+        
+        self.EnablePage('fringe', False)
+        
+        # decoration page
+        decorationPanel = self.foldpanelAppear.AddFoldPanel(_("Decorations"), collapsed = True)
+        self.foldpanelAppear.AddFoldPanelWindow(decorationPanel, 
+            window = self._createDecorationPage(parent = decorationPanel), flags = fpb.FPB_ALIGN_WIDTH)
+        
+        
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        sizer.Add(self.foldpanelAppear, proportion = 1, flag = wx.EXPAND)
+        self.mainPanelAppear.SetSizer(sizer)
+        self.mainPanelAppear.Layout()
+        self.mainPanelAppear.Fit()
+        return self.mainPanelAppear
+    
+    def _createAnalysisPage(self):
+        """!Create data analysis (cutting planes, ...) page"""
+        self.mainPanelAnalysis = ScrolledPanel(parent = self)
+        self.mainPanelAnalysis.SetupScrolling(scroll_x = False)
+        self.foldpanelAnalysis = fpb.FoldPanelBar(parent = self.mainPanelAnalysis, id = wx.ID_ANY,
+                                                  style = fpb.FPB_SINGLE_FOLD)
+        self.foldpanelAnalysis.Bind(fpb.EVT_CAPTIONBAR, self.OnPressCaption)
+        # cutting planes page
+        cplanePanel = self.foldpanelAnalysis.AddFoldPanel(_("Cutting planes"), collapsed = False)
+        self.foldpanelAnalysis.AddFoldPanelWindow(cplanePanel, 
+            window = self._createCPlanePage(parent = cplanePanel), flags = fpb.FPB_ALIGN_WIDTH)
+        
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        sizer.Add(self.foldpanelAnalysis, proportion = 1, flag = wx.EXPAND)
+        self.mainPanelAnalysis.SetSizer(sizer)
+        self.mainPanelAnalysis.Layout()
+        self.mainPanelAnalysis.Fit()
+        return self.mainPanelAnalysis
+        
+    def _createSurfacePage(self, parent):
+        """!Create view settings page"""
+        panel = wx.Panel(parent = parent, id = wx.ID_ANY)
+        self.page['surface'] = { 'id' : 0,
+                                 'notebook' : self.foldpanelData.GetId() }
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        self.win['surface'] = {}
+        
+        # selection
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Raster map")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        rmaps = Select(parent = panel, type = 'raster',
+                       onPopup = self.GselectOnPopup)
+        rmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetRaster)
+        self.win['surface']['map'] = rmaps.GetId()
+        desc = wx.StaticText(parent = panel, id = wx.ID_ANY)
+        self.win['surface']['desc'] = desc.GetId()
+        boxSizer.Add(item = rmaps, proportion = 0,
+                     flag = wx.ALL,
+                     border = 3)
+        boxSizer.Add(item = desc, proportion = 0,
+                     flag = wx.ALL,
+                     border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        
+        #
+        # draw
+        #
+        self.win['surface']['draw'] = {}
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Draw")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        gridSizer.AddGrowableCol(3)
+        
+        # mode
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Mode:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        mode = wx.Choice (parent = panel, id = wx.ID_ANY, size = (-1, -1),
+                          choices = [_("coarse"),
+                                     _("fine"),
+                                     _("both")])
+        mode.SetName("selection")
+        mode.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
+        self.win['surface']['draw']['mode'] = mode.GetId()
+        gridSizer.Add(item = mode, flag = wx.ALIGN_CENTER_VERTICAL|wx.EXPAND,
+                      pos = (0, 1),span = (1, 2))
+        
+        # shading
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Shading:")),
+                      pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT)
+        shade = wx.Choice (parent = panel, id = wx.ID_ANY, size = (-1, -1),
+                           choices = [_("flat"),
+                                      _("gouraud")])
+        shade.SetName("selection")
+        self.win['surface']['draw']['shading'] = shade.GetId()
+        shade.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
+        gridSizer.Add(item = shade, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (0, 4))
+        
+        # set to all
+        all = wx.Button(panel, id = wx.ID_ANY, label = _("Set to all"))
+        all.SetToolTipString(_("Use draw settings for all loaded surfaces"))
+        all.Bind(wx.EVT_BUTTON, self.OnSurfaceModeAll)
+        gridSizer.Add(item = all, flag = wx.ALL | wx.ALIGN_CENTER_VERTICAL | wx.EXPAND,
+                      pos = (3, 4))
+        self.win['surface']['all'] = all.GetId()
+        
+        # resolution coarse
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Coarse mode:")),
+                      pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                        label = _("resolution:")),
+                     pos = (2, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        resC = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = 6,
+                           min = 1,
+                           max = 100)
+        resC.SetName("value")
+        self.win['surface']['draw']['res-coarse'] = resC.GetId()
+        resC.Bind(wx.EVT_SPINCTRL, self.OnSurfaceResolution)
+        gridSizer.Add(item = resC, pos = (2, 2), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT)
+        
+        # Coarse style
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("style:")),
+                      pos = (3, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        style = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
+                          choices = [_("wire"),
+                                     _("surface")])
+        style.SetName("selection")
+        self.win['surface']['draw']['style'] = style.GetId()
+        style.Bind(wx.EVT_CHOICE, self.OnSurfaceMode)
+        gridSizer.Add(item = style, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (3, 2))
+        
+        # color
+        color = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        color.SetName("colour")
+        color.Bind(csel.EVT_COLOURSELECT, self.OnSurfaceWireColor)
+        color.SetToolTipString(_("Change wire color"))
+        self.win['surface']['draw']['wire-color'] = color.GetId()
+        gridSizer.Add(item = color, flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT,
+                      pos = (3, 3))
+        
+        # resolution fine
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Fine mode:")),
+                      pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                        label = _("resolution:")),
+                     pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        resF = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = 3,
+                           min = 1,
+                           max = 100)
+        resF.SetName("value")
+        self.win['surface']['draw']['res-fine'] = resF.GetId()
+        resF.Bind(wx.EVT_SPINCTRL, self.OnSurfaceResolution)
+        gridSizer.Add(item = resF, pos = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT)
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        
+        #
+        # surface attributes
+        #
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Surface attributes")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        gridSizer.AddGrowableCol(2)
+        
+        # type 
+        self.win['surface']['attr'] = {}
+        row = 0
+        for code, attrb in (('color', _("Color")),
+                           ('mask', _("Mask")),
+                           ('transp', _("Transparency")),
+                           ('shine', _("Shininess"))):
+            self.win['surface'][code] = {} 
+            gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                             label = attrb + ':'),
+                          pos = (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+            use = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
+                             choices = [_("map")])
+            
+            if code not in ('color', 'shine'):
+                use.Insert(item = _("unset"), pos = 0)
+                self.win['surface'][code]['required'] = False
+            else:
+                self.win['surface'][code]['required'] = True
+            if code != 'mask':
+                use.Append(item = _('constant'))
+            self.win['surface'][code]['use'] = use.GetId()
+            use.Bind(wx.EVT_CHOICE, self.OnMapObjUse)
+            gridSizer.Add(item = use, flag = wx.ALIGN_CENTER_VERTICAL,
+                          pos = (row, 1))
+            
+            map = Select(parent = panel, id = wx.ID_ANY,
+                         # size = globalvar.DIALOG_GSELECT_SIZE,
+                         size = (-1, -1),
+                         type = "raster")
+            self.win['surface'][code]['map'] = map.GetId() - 1 # FIXME
+            map.Bind(wx.EVT_TEXT, self.OnSurfaceMap)
+            gridSizer.Add(item = map, flag = wx.ALIGN_CENTER_VERTICAL|wx.EXPAND,
+                          pos = (row, 2))
+            
+            if code == 'color':
+                color = UserSettings.Get(group = 'nviz', key = 'surface', subkey = ['color', 'value'])
+                value = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                          colour = color,
+                                          size = globalvar.DIALOG_COLOR_SIZE)
+                value.Bind(csel.EVT_COLOURSELECT, self.OnSurfaceMap)
+            elif code == 'mask':
+                value = None
+            else:
+                value = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                                    initial = 0)
+                value.SetRange(minVal = 0, maxVal = 100)
+                value.Bind(wx.EVT_TEXT, self.OnSurfaceMap)
+            
+            if value:
+                self.win['surface'][code]['const'] = value.GetId()
+                value.Enable(False)
+                gridSizer.Add(item = value, flag = wx.ALIGN_CENTER_VERTICAL,
+                              pos = (row, 3))
+            else:
+                self.win['surface'][code]['const'] = None
+            
+            self.SetMapObjUseMap(nvizType = 'surface',
+                                 attrb = code) # -> enable map / disable constant
+                
+            row += 1
+        boxSizer.Add(item = gridSizer, proportion = 0,
+                  flag = wx.ALL | wx.EXPAND, border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL,
+                      border = 3)
+        #
+        # position
+        #
+        self.win['surface']['position'] = {}
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Position")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        gridSizer.AddGrowableCol(3)
+        
+        # position
+        tooltip = _("Changes the x, y, and z position of the current surface")
+        self._createControl(panel, data = self.win['surface'], name = 'position',
+                            tooltip = tooltip, range = (-10000, 10000), floatSlider = True,
+                            bind = (self.OnSurfacePosition, self.OnSurfacePositionChanged, self.OnSurfacePositionText))
+        
+        axis = wx.Choice (parent = panel, id = wx.ID_ANY, size = (75, -1),
+                          choices = ["X",
+                                     "Y",
+                                     "Z"])
+                                    
+        reset = wx.Button(panel, id = wx.ID_ANY, label = _("Reset"))
+        reset.SetToolTipString(_("Reset to default position"))
+        reset.Bind(wx.EVT_BUTTON, self.OnResetSurfacePosition)
+        self.win['surface']['position']['reset'] = reset.GetId()
+        
+        self.win['surface']['position']['axis'] = axis.GetId()
+        axis.SetSelection(2)
+        axis.Bind(wx.EVT_CHOICE, self.OnSurfaceAxis)
+        
+        pslide = self.FindWindowById(self.win['surface']['position']['slider'])
+        ptext = self.FindWindowById(self.win['surface']['position']['text'])
+        ptext.SetValue('0')
+        
+        gridSizer.Add(item = axis, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 0))
+        gridSizer.Add(item = pslide, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 1))
+        gridSizer.Add(item = ptext, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 2))
+        gridSizer.Add(item = reset, flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT, pos = (0, 3))
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 3)
+        
+        pageSizer.Add(item = boxSizer, proportion = 1,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        #
+        # mask
+        #
+##        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+##                            label = " %s " % (_("Mask")))
+##        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+##        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+##        
+##        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+##                                         label = _("Mask zeros:")),
+##                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+##        
+##        elev = wx.CheckBox(parent = panel, id = wx.ID_ANY,
+##                           label = _("by elevation"))
+##        elev.Enable(False) # TODO: not implemented yet
+##        gridSizer.Add(item = elev, pos = (0, 1))
+##        
+##        color = wx.CheckBox(parent = panel, id = wx.ID_ANY,
+##                           label = _("by color"))
+##        color.Enable(False) # TODO: not implemented yet
+##        gridSizer.Add(item = color, pos = (0, 2))
+##        
+##        boxSizer.Add(item = gridSizer, proportion = 1,
+##                  flag = wx.ALL | wx.EXPAND, border = 3)
+##        pageSizer.Add(item = boxSizer, proportion = 0,
+##                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+##                      border = 3)
+        
+        
+        panel.SetSizer(pageSizer)
+
+        panel.Layout()
+        panel.Fit()
+        
+        return panel
+    def _createCPlanePage(self, parent):
+        """!Create cutting planes page"""  
+        panel = wx.Panel(parent = parent, id = wx.ID_ANY)
+        self.page['cplane'] = { 'id' : 4, 
+                                'notebook' : self.foldpanelData.GetId() }
+        self.win['cplane'] = {}
+        
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Cutting planes")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        horSizer = wx.BoxSizer(wx.HORIZONTAL)
+        
+        # planes
+        horSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Active cutting plane:")),
+                     flag = wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 5)
+        choice = wx.Choice(parent = panel, id = wx.ID_ANY, choices = [])
+        self.win['cplane']['planes'] = choice.GetId()
+        choice.Bind(wx.EVT_CHOICE, self.OnCPlaneSelection)
+        horSizer.Add(item = choice, flag = wx.ALL, border = 5)
+        
+        # shading
+        horSizer.Add(item = wx.Size(-1, -1), proportion = 1)
+        horSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Shading:")),
+                     flag = wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 5)
+        choices = [_("clear"),
+                   _("top color"),
+                   _("bottom color"),
+                   _("blend"),
+                   _("shaded")]
+        choice = wx.Choice(parent = panel, id = wx.ID_ANY, choices = choices)
+        self.win['cplane']['shading'] = choice.GetId()
+        choice.Bind(wx.EVT_CHOICE, self.OnCPlaneShading)
+        horSizer.Add(item = choice, flag = wx.ALL, border = 5)
+        boxSizer.Add(item = horSizer, flag = wx.EXPAND)
+        
+        gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        
+        # cutting plane horizontal x position
+        self.win['cplane']['position'] = {}
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Horizontal X:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        tooltip = _("Sets the X coordinate of the current cutting plane")
+        self._createControl(panel, data = self.win['cplane']['position'], name = 'x', size = 250,
+                            range = (-1000, 1000), sliderHor = True, floatSlider = True, tooltip = tooltip,
+                            bind = (self.OnCPlaneChanging, self.OnCPlaneChangeDone, self.OnCPlaneChangeText))
+        self.FindWindowById(self.win['cplane']['position']['x']['slider']).SetValue(0)
+        self.FindWindowById(self.win['cplane']['position']['x']['text']).SetValue(0)
+        gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['x']['slider']),
+                      pos = (0, 1),  flag = wx.EXPAND|wx.ALIGN_RIGHT)
+        gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['x']['text']),
+                      pos = (0, 2),
+                      flag = wx.ALIGN_CENTER)   
+        
+        # cutting plane horizontal y position
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Horizontal Y:")),
+                      pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        tooltip = _("Sets the Y coordinate of the current cutting plane")
+        self._createControl(panel, data = self.win['cplane']['position'], name = 'y', size = 250,
+                            range = (-1000, 1000), sliderHor = True, floatSlider = True, tooltip = tooltip,
+                            bind = (self.OnCPlaneChanging, self.OnCPlaneChangeDone, self.OnCPlaneChangeText))
+        self.FindWindowById(self.win['cplane']['position']['y']['slider']).SetValue(0)
+        self.FindWindowById(self.win['cplane']['position']['y']['text']).SetValue(0)
+        gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['y']['slider']),
+                      pos = (1, 1),  flag = wx.EXPAND|wx.ALIGN_RIGHT)
+        gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['y']['text']),
+                      pos = (1, 2),
+                      flag = wx.ALIGN_CENTER)                         
+        
+        # cutting plane rotation
+        self.win['cplane']['rotation'] = {}
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Rotation:")),
+                      pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        tooltip = _("Rotates the current cutting plane about vertical axis")
+        self._createControl(panel, data = self.win['cplane']['rotation'], name = 'rot', size = 250,
+                            range = (0, 360), sliderHor = True, tooltip = tooltip,
+                            bind = (self.OnCPlaneChanging, self.OnCPlaneChangeDone, self.OnCPlaneChangeText))
+        self.FindWindowById(self.win['cplane']['rotation']['rot']['slider']).SetValue(180)
+        self.FindWindowById(self.win['cplane']['rotation']['rot']['text']).SetValue(180)
+        gridSizer.Add(item = self.FindWindowById(self.win['cplane']['rotation']['rot']['slider']),
+                      pos = (2, 1),  flag = wx.EXPAND|wx.ALIGN_RIGHT)
+        gridSizer.Add(item = self.FindWindowById(self.win['cplane']['rotation']['rot']['text']),
+                      pos = (2, 2),
+                      flag = wx.ALIGN_CENTER)
+
+        # cutting plane tilt        
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Tilt:")),
+                      pos = (3, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        tooltip = _("Rotates the current cutting plane about horizontal axis")
+        self._createControl(panel, data = self.win['cplane']['rotation'], name = 'tilt', size = 250,
+                            range = (0, 360), sliderHor = True, tooltip = tooltip,
+                            bind = (self.OnCPlaneChanging, self.OnCPlaneChangeDone, self.OnCPlaneChangeText))
+        self.FindWindowById(self.win['cplane']['rotation']['tilt']['slider']).SetValue(0)
+        self.FindWindowById(self.win['cplane']['rotation']['tilt']['text']).SetValue(0)
+        gridSizer.Add(item = self.FindWindowById(self.win['cplane']['rotation']['tilt']['slider']),
+                      pos = (3, 1),  flag = wx.EXPAND|wx.ALIGN_RIGHT)
+        gridSizer.Add(item = self.FindWindowById(self.win['cplane']['rotation']['tilt']['text']),
+                      pos = (3, 2),
+                      flag = wx.ALIGN_CENTER)          
+        
+        # cutting pland height
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Height:")),
+                      pos = (4, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        tooltip = _("Sets the Z coordinate of the current cutting plane (only meaningful when tilt is not 0)")
+        self._createControl(panel, data = self.win['cplane']['position'], name = 'z', size = 250,
+                            range = (-1000, 1000), sliderHor = True, tooltip = tooltip,
+                            bind = (self.OnCPlaneChanging, self.OnCPlaneChangeDone, self.OnCPlaneChangeText))
+        self.FindWindowById(self.win['cplane']['position']['z']['slider']).SetValue(0)
+        self.FindWindowById(self.win['cplane']['position']['z']['text']).SetValue(0)
+        gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['z']['slider']),
+                      pos = (4, 1),  flag = wx.EXPAND|wx.ALIGN_RIGHT)
+        gridSizer.Add(item = self.FindWindowById(self.win['cplane']['position']['z']['text']),
+                      pos = (4, 2),
+                      flag = wx.ALIGN_CENTER)
+        
+        boxSizer.Add(gridSizer, proportion = 0, flag = wx.EXPAND|wx.ALL, border = 5)
+                    
+        horSizer = wx.BoxSizer(wx.HORIZONTAL)
+        horSizer.Add(item = wx.Size(-1, -1), proportion = 1, flag = wx.ALL, border = 5)  
+        # reset
+        reset = wx.Button(parent = panel, id = wx.ID_ANY, label = _("Reset"))
+        self.win['cplane']['reset'] = reset.GetId()
+        reset.Bind(wx.EVT_BUTTON, self.OnCPlaneReset)
+        horSizer.Add(item = reset, flag = wx.ALL, border = 5)
+        boxSizer.Add(horSizer, proportion = 0, flag = wx.EXPAND)            
+        
+        
+        pageSizer.Add(boxSizer, proportion = 0, flag = wx.EXPAND)
+        
+        panel.SetSizer(pageSizer)
+        panel.Fit()    
+        
+        return panel
+        
+    def _createConstantPage(self, parent):
+        """!Create constant page"""
+        panel = wx.Panel(parent = parent, id = wx.ID_ANY)
+        self.page['constant'] = { 'id' : 1, 
+                                'notebook' : self.foldpanelData.GetId() }
+        self.win['constant'] = {}
+        
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Constant surface")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        horsizer = wx.BoxSizer(wx.HORIZONTAL)
+        
+        surface = wx.ComboBox(parent = panel, id = wx.ID_ANY, 
+                              style = wx.CB_SIMPLE | wx.CB_READONLY,
+                              choices = [])
+        self.win['constant']['surface'] = surface.GetId()
+        surface.Bind(wx.EVT_COMBOBOX, self.OnConstantSelection)
+        horsizer.Add(surface, proportion = 1, flag = wx.EXPAND|wx.RIGHT, border = 20)
+
+        addNew = wx.Button(panel, id = wx.ID_ANY, label = _("New"))
+        addNew.Bind(wx.EVT_BUTTON, self.OnNewConstant)
+        self.win['constant']['new'] = addNew.GetId()
+
+        delete = wx.Button(panel, id = wx.ID_ANY, label = _("Delete"))
+        delete.Bind(wx.EVT_BUTTON, self.OnDeleteConstant)
+        self.win['constant']['delete'] = delete.GetId()
+        
+        horsizer.Add(item = addNew, proportion = 0, flag = wx.RIGHT|wx.LEFT, border = 3)
+        horsizer.Add(item = delete, proportion = 0, flag = wx.RIGHT|wx.LEFT, border = 3)
+    
+        boxSizer.Add(item = horsizer, proportion = 0, flag = wx.ALL|wx.EXPAND,
+                      border = 5)
+        
+        gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        # fine resolution
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Fine resolution:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        resF = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           initial = 3,
+                           min = 1,
+                           max = 100)
+        resF.SetName("value")
+        self.win['constant']['resolution'] = resF.GetId()
+        resF.Bind(wx.EVT_SPINCTRL, self.OnSetConstantProp)
+        gridSizer.Add(item = resF, pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT)
+        # value 
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Value:")), pos = (1, 0),
+                                         flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        value = wx.SpinCtrl(panel, id = wx.ID_ANY,
+                                  min = -1e9, max = 1e9,
+                                  size = (65, -1))
+        self.win['constant']['value'] = value.GetId()
+        value.Bind(wx.EVT_SPINCTRL, self.OnSetConstantProp)
+        gridSizer.Add(item = value, pos = (1, 1))
+        
+        # transparency 
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Transparency:")), pos = (2, 0),
+                                         flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        transp = wx.SpinCtrl(panel, id = wx.ID_ANY,
+                                  min = 0, max = 100,
+                                  size = (65, -1))
+        self.win['constant']['transp'] = transp.GetId()
+        transp.Bind(wx.EVT_SPINCTRL, self.OnSetConstantProp)
+        gridSizer.Add(item = transp, pos = (2, 1))
+        
+        # color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Color:")), pos = (3, 0),
+                                         flag = wx.ALIGN_CENTER_VERTICAL)
+        color = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                  colour = (0,0,0),
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        self.win['constant']['color'] = color.GetId()
+        color.Bind(csel.EVT_COLOURSELECT, self.OnSetConstantProp)
+        gridSizer.Add(item = color, pos = (3, 1))
+        boxSizer.Add(item = gridSizer, proportion = 0, flag = wx.ALL,
+                      border = 5)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL,
+                      border = 3)
+        
+        panel.SetSizer(pageSizer)
+        panel.Fit()    
+        
+        return panel
+        
+    def _createVectorPage(self, parent):
+        """!Create view settings page"""
+        panel = wx.Panel(parent = parent, id = wx.ID_ANY)
+        self.page['vector'] = { 'id' : 2,
+                                'notebook' : self.foldpanelData.GetId() }
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        self.win['vector'] = {}
+        
+        # selection
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Vector map")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        vmaps = Select(parent = panel, type = 'vector',
+                       onPopup = self.GselectOnPopup)
+        vmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetVector)
+        self.win['vector']['map'] = vmaps.GetId()
+        desc = wx.StaticText(parent = panel, id = wx.ID_ANY)
+        self.win['vector']['desc'] = desc.GetId()
+        boxSizer.Add(item = vmaps, proportion = 0,
+                     flag = wx.ALL,
+                     border = 3)
+        boxSizer.Add(item = desc, proportion = 0,
+                     flag = wx.ALL,
+                     border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        
+        #
+        # vector lines
+        #
+        self.win['vector']['lines'] = {}
+        
+        showLines = wx.CheckBox(parent = panel, id = wx.ID_ANY,
+                                label = _("Show vector lines"))
+        showLines.SetValue(True)
+        
+        self.win['vector']['lines']['show'] = showLines.GetId()
+        showLines.Bind(wx.EVT_CHECKBOX, self.OnVectorShow)
+        
+        pageSizer.Add(item = showLines, proportion = 0,
+                      flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
+        
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Vector lines")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+        gridSizer.AddGrowableCol(5)
+        
+        # width
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Line:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("width:")),
+                      pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL | 
+                      wx.ALIGN_RIGHT)
+        
+        width = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                            initial = 1,
+                            min = 1,
+                            max = 100)
+        width.SetValue(1)
+        self.win['vector']['lines']['width'] = width.GetId()
+        width.Bind(wx.EVT_SPINCTRL, self.OnVectorLines)
+        gridSizer.Add(item = width, pos = (0, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
+        
+        # color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("color:")),
+                      pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALIGN_RIGHT)
+        
+        color = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                  colour = (0,0,0),
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        self.win['vector']['lines']['color'] = color.GetId()
+        color.Bind(csel.EVT_COLOURSELECT, self.OnVectorLines)
+
+        gridSizer.Add(item = color, pos = (0, 4), flag = wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALIGN_LEFT)
+        
+        # display
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Display")),
+                      pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALIGN_LEFT)
+        
+        display = wx.Choice (parent = panel, id = wx.ID_ANY, size = (-1, -1),
+                             choices = [_("on surface(s):"),
+                                        _("flat")])
+        self.win['vector']['lines']['flat'] = display.GetId()
+        display.Bind(wx.EVT_CHOICE, self.OnVectorDisplay)
+        
+        gridSizer.Add(item = display, flag = wx.ALIGN_CENTER_VERTICAL | 
+                      wx.ALIGN_LEFT|wx.EXPAND, pos = (1, 1), span = (1,4))
+        
+        # height
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Height above surface:")),
+                      pos = (2, 5), flag = wx.ALIGN_BOTTOM|wx.EXPAND)
+        
+        surface = wx.CheckListBox(parent = panel, id = wx.ID_ANY, size = (-1, 60),
+                                  choices = [], style = wx.LB_NEEDED_SB)
+        surface.Bind(wx.EVT_CHECKLISTBOX, self.OnVectorSurface)
+        
+        self.win['vector']['lines']['surface'] = surface.GetId()
+        gridSizer.Add(item = surface, 
+                      pos = (2, 0), span = (3, 5),
+                      flag = wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
+        
+        self._createControl(panel, data = self.win['vector']['lines'], name = 'height', size = -1,
+                            range = (0, 500), sliderHor = True,
+                            bind = (self.OnVectorHeight, self.OnVectorHeightFull, self.OnVectorHeightText))
+        self.FindWindowById(self.win['vector']['lines']['height']['slider']).SetValue(0)
+        self.FindWindowById(self.win['vector']['lines']['height']['text']).SetValue(0)
+        gridSizer.Add(item = self.FindWindowById(self.win['vector']['lines']['height']['slider']),
+                      pos = (3, 5),  flag = wx.EXPAND|wx.ALIGN_RIGHT)
+        gridSizer.Add(item = self.FindWindowById(self.win['vector']['lines']['height']['text']),
+                      pos = (4, 5),
+                      flag = wx.ALIGN_CENTER)
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                     flag = wx.ALL | wx.EXPAND, border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        
+        #
+        # vector points
+        #
+        self.win['vector']['points'] = {}
+        
+        showPoints = wx.CheckBox(parent = panel, id = wx.ID_ANY,
+                                 label = _("Show vector points"))
+        showPoints.SetValue(True)
+        self.win['vector']['points']['show'] = showPoints.GetId()
+        showPoints.Bind(wx.EVT_CHECKBOX, self.OnVectorShow)
+        
+        pageSizer.Add(item = showPoints, proportion = 0,
+                      flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 5)
+        
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Vector points")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        vertSizer = wx.BoxSizer(wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+        gridSizer.AddGrowableCol(0)
+        gridSizer.AddGrowableCol(2)
+        gridSizer.AddGrowableCol(4)
+        gridSizer.AddGrowableCol(6)
+        
+        # icon size
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Icon:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("size:")),
+                      pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALIGN_RIGHT)
+        
+        isize = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                            initial = 1,
+                            min = 1,
+                            max = 1e6)
+        isize.SetName('value')
+        isize.SetValue(100)
+        self.win['vector']['points']['size'] = isize.GetId()
+        isize.Bind(wx.EVT_SPINCTRL, self.OnVectorPoints)
+        isize.Bind(wx.EVT_TEXT, self.OnVectorPoints)
+        gridSizer.Add(item = isize, pos = (0, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
+        
+        # icon color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("color:")),
+                      pos = (0, 3), flag = wx.ALIGN_CENTER_VERTICAL |
+                      wx.ALIGN_RIGHT)
+        icolor = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                   size = globalvar.DIALOG_COLOR_SIZE)
+        icolor.SetName("color")
+        icolor.SetColour((0,0,255))
+        self.win['vector']['points']['color'] = icolor.GetId()
+        icolor.Bind(csel.EVT_COLOURSELECT, self.OnVectorPoints)
+        gridSizer.Add(item = icolor, flag = wx.ALIGN_CENTER_VERTICAL | 
+                      wx.ALIGN_LEFT,
+                      pos = (0, 4))
+
+        # icon width - seems to do nothing
+##        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+##                                           label = _("width")),
+##                      pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL |
+##                      wx.ALIGN_RIGHT)
+##        
+##        iwidth = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+##                             initial = 1,
+##                             min = 1,
+##                             max = 1e6)
+##        iwidth.SetName('value')
+##        iwidth.SetValue(100)
+##        self.win['vector']['points']['width'] = iwidth.GetId()
+##        iwidth.Bind(wx.EVT_SPINCTRL, self.OnVectorPoints)
+##        iwidth.Bind(wx.EVT_TEXT, self.OnVectorPoints)
+##        gridSizer.Add(item = iwidth, pos = (1, 2),
+##                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT)
+        # icon symbol
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("symbol:")),
+                      pos = (0, 5), flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT)
+        isym = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
+                          choices = UserSettings.Get(group = 'nviz', key = 'vector',
+                                                   subkey = ['points', 'marker'], internal = True))
+        isym.SetName("selection")
+        self.win['vector']['points']['marker'] = isym.GetId()
+        isym.Bind(wx.EVT_CHOICE, self.OnVectorPoints)
+        gridSizer.Add(item = isym, flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT,
+                      pos = (0, 6))
+        
+        vertSizer.Add(gridSizer, proportion = 0, flag = wx.EXPAND, border = 0)
+        # high
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+        gridSizer.AddGrowableCol(1)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Display on surface(s):")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Height above surface:")),
+                      pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        surface = wx.CheckListBox(parent = panel, id = wx.ID_ANY, size = (-1, 60),
+                                  choices = [], style = wx.LB_NEEDED_SB)
+        surface.Bind(wx.EVT_CHECKLISTBOX, self.OnVectorSurface)
+        self.win['vector']['points']['surface'] = surface.GetId()
+        gridSizer.Add(item = surface, 
+                      pos = (1, 0), span = (3, 1),
+                      flag = wx.ALIGN_CENTER_VERTICAL|wx.EXPAND)
+        
+        self._createControl(panel, data = self.win['vector']['points'], name = 'height', size = -1,
+                            range = (0, 500),
+                            bind = (self.OnVectorHeight, self.OnVectorHeightFull, self.OnVectorHeightText))
+        
+        self.FindWindowById(self.win['vector']['points']['height']['slider']).SetValue(0)
+        self.FindWindowById(self.win['vector']['points']['height']['text']).SetValue(0)
+        
+        gridSizer.Add(item = self.FindWindowById(self.win['vector']['points']['height']['slider']),
+                      pos = (2, 1),flag = wx.EXPAND|wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.FindWindowById(self.win['vector']['points']['height']['text']),
+                      pos = (3, 1),
+                      flag = wx.ALIGN_CENTER)
+                    
+        vertSizer.Add(gridSizer, proportion = 0, flag = wx.EXPAND, border = 0)
+        boxSizer.Add(item = vertSizer, proportion = 1,
+                     flag = wx.ALL | wx.EXPAND, border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        
+        panel.SetSizer(pageSizer)
+        panel.Fit()
+
+        return panel
+
+    def GselectOnPopup(self, ltype, exclude = False):
+        """Update gselect.Select() items"""
+        maps = list()
+        for layer in self.mapWindow.Map.GetListOfLayers(l_type = ltype, l_active = True):
+            maps.append(layer.GetName())
+        return maps, exclude
+    
+    def _createVolumePage(self, parent):
+        """!Create view settings page"""
+        panel = wx.Panel(parent = parent, id = wx.ID_ANY)
+        self.page['volume'] = { 'id' : 3,
+                                'notebook' : self.foldpanelData.GetId() }
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        self.win['volume'] = {}
+        
+        # selection
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("3D raster map")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        rmaps = Select(parent = panel, type = '3d-raster',
+                       onPopup = self.GselectOnPopup)
+        rmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetRaster3D)
+        self.win['volume']['map'] = rmaps.GetId()
+        desc = wx.StaticText(parent = panel, id = wx.ID_ANY)
+        self.win['volume']['desc'] = desc.GetId()
+        boxSizer.Add(item = rmaps, proportion = 0,
+                     flag = wx.ALL,
+                     border = 3)
+        boxSizer.Add(item = desc, proportion = 0,
+                     flag = wx.ALL,
+                     border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+                
+        #
+        # draw
+        #
+        self.win['volume']['draw'] = {}
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Draw")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+##        gridSizer.AddGrowableCol(4)
+        
+        # mode
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Mode:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        mode = wx.Choice (parent = panel, id = wx.ID_ANY, size = (-1, -1),
+                          choices = [_("isosurfaces"),
+                                     _("slices")])
+        mode.SetSelection(0)
+        mode.SetName("selection")
+        mode.Bind(wx.EVT_CHOICE, self.OnVolumeMode)
+        self.win['volume']['draw']['mode'] = mode.GetId()
+        gridSizer.Add(item = mode, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (0, 1))
+        
+        # shading
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Shading:")),
+                      pos = (0, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+        shade = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
+                           choices = [_("flat"),
+                                      _("gouraud")])
+        shade.SetName("selection")
+        self.win['volume']['draw']['shading'] = shade.GetId()
+        shade.Bind(wx.EVT_CHOICE, self.OnVolumeDrawMode)
+        gridSizer.Add(item = shade, flag = wx.ALIGN_CENTER_VERTICAL,
+                      pos = (0, 3))
+        
+        # resolution (mode)
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                         label = _("Resolution:")),
+                      pos = (0, 4), flag = wx.ALIGN_CENTER_VERTICAL)
+        resol = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                            initial = 1,
+                            min = 1,
+                            max = 100)
+        resol.SetName("value")
+        self.win['volume']['draw']['resolution'] = resol.GetId()
+        resol.Bind(wx.EVT_SPINCTRL, self.OnVolumeResolution)
+        resol.Bind(wx.EVT_TEXT, self.OnVolumeResolution)
+        gridSizer.Add(item = resol, pos = (0, 5))
+        
+        boxSizer.Add(item = gridSizer, proportion = 0,
+                     flag = wx.ALL | wx.EXPAND, border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL,
+                      border = 3)
+        
+        #
+        # manage isosurfaces
+        #
+        box = wx.StaticBox(parent = panel, id = wx.ID_ANY, 
+                           label = " %s " % (_("List of isosurfaces")))
+        box.SetName('listStaticBox')
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        
+        # list
+        isolevel = wx.CheckListBox(parent = panel, id = wx.ID_ANY,
+                                   size = (300, 150))
+        self.Bind(wx.EVT_CHECKLISTBOX, self.OnVolumeCheck, isolevel)
+        self.Bind(wx.EVT_LISTBOX, self.OnVolumeSelect, isolevel)
+        
+        self.win['volume']['isosurfs'] = isolevel.GetId()
+        self.win['volume']['slices'] = isolevel.GetId()
+        gridSizer.Add(item = isolevel, pos = (0, 0), span = (4, 1))
+        
+        # buttons (add, delete, move up, move down)
+        btnAdd = wx.Button(parent = panel, id = wx.ID_ADD)
+        self.win['volume']['btnAdd'] = btnAdd.GetId()
+        btnAdd.Bind(wx.EVT_BUTTON, self.OnVolumeAdd)
+        gridSizer.Add(item = btnAdd,
+                      pos = (0, 1))
+        btnDelete = wx.Button(parent = panel, id = wx.ID_DELETE)
+        self.win['volume']['btnDelete'] = btnDelete.GetId()
+        btnDelete.Bind(wx.EVT_BUTTON, self.OnVolumeDelete)
+        btnDelete.Enable(False)
+        gridSizer.Add(item = btnDelete,
+                      pos = (1, 1))
+        btnMoveUp = wx.Button(parent = panel, id = wx.ID_UP)
+        self.win['volume']['btnMoveUp'] = btnMoveUp.GetId()
+        btnMoveUp.Bind(wx.EVT_BUTTON, self.OnVolumeMoveUp)
+        btnMoveUp.Enable(False)
+        gridSizer.Add(item = btnMoveUp,
+                      pos = (2, 1))
+        btnMoveDown = wx.Button(parent = panel, id = wx.ID_DOWN)
+        self.win['volume']['btnMoveDown'] = btnMoveDown.GetId()
+        btnMoveDown.Bind(wx.EVT_BUTTON, self.OnVolumeMoveDown)
+        btnMoveDown.Enable(False)
+        gridSizer.Add(item = btnMoveDown,
+                      pos = (3, 1))
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                     flag = wx.ALL | wx.EXPAND, border = 3)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        # isosurface/slice 
+        sizer = wx.BoxSizer()
+        self.isoPanel = self._createIsosurfacePanel(panel)
+        self.slicePanel = self._createSlicePanel(panel)
+        sizer.Add(self.isoPanel, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 0)
+        sizer.Add(self.slicePanel, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 0)
+        sizer.Hide(self.slicePanel)
+        pageSizer.Add(item = sizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL,
+                      border = 3)
+        #
+        # position
+        #
+        self.win['volume']['position'] = {}
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Position")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        gridSizer.AddGrowableCol(3)
+        
+        # position
+        self._createControl(panel, data = self.win['volume'], name = 'position',
+                            range = (-10000, 10000), floatSlider = True,
+                            bind = (self.OnVolumePosition, self.OnVolumePositionChanged, self.OnVolumePositionText))
+        
+        axis = wx.Choice (parent = panel, id = wx.ID_ANY, size = (75, -1),
+                          choices = ["X",
+                                     "Y",
+                                     "Z"])
+                                    
+        reset = wx.Button(panel, id = wx.ID_ANY, label = _("Reset"))
+        reset.SetToolTipString(_("Reset to default position"))
+        reset.Bind(wx.EVT_BUTTON, self.OnResetVolumePosition)
+        self.win['volume']['position']['reset'] = reset.GetId()
+        
+        self.win['volume']['position']['axis'] = axis.GetId()
+        axis.SetSelection(2) # Z
+        axis.Bind(wx.EVT_CHOICE, self.OnVolumeAxis)
+        
+        pslide = self.FindWindowById(self.win['volume']['position']['slider'])
+        ptext = self.FindWindowById(self.win['volume']['position']['text'])
+        ptext.SetValue('0')
+        
+        gridSizer.Add(item = axis, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 0))
+        gridSizer.Add(item = pslide, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 1))
+        gridSizer.Add(item = ptext, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 2))
+        gridSizer.Add(item = reset, flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_RIGHT, pos = (0, 3))
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                  flag = wx.ALL | wx.EXPAND, border = 3)
+        
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        panel.SetSizer(pageSizer)
+        panel.Fit()
+        
+        return panel
+       
+        
+    def _createLightPage(self, parent):
+        """!Create light page"""
+        panel = wx.Panel(parent = parent, id = wx.ID_ANY)
+        
+        self.page['light'] = { 'id' : 0, 
+                               'notebook' : self.foldpanelAppear.GetId() }
+        self.win['light'] = {}
+        
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        show = wx.CheckBox(parent = panel, id = wx.ID_ANY,
+                           label = _("Show light model"))
+        show.Bind(wx.EVT_CHECKBOX, self.OnShowLightModel)
+        show.SetValue(True)
+        self._display.showLight = True
+        pageSizer.Add(item = show, proportion = 0,
+                      flag = wx.ALL, border = 3)
+##        surface = wx.CheckBox(parent = panel, id = wx.ID_ANY,
+##                              label = _("Follow source viewpoint"))
+##        pageSizer.Add(item = surface, proportion = 0,
+##                      flag = wx.ALL, border = 3)
+        
+        # position
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Light source position")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        posSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        
+        self._createCompass(panel = panel, sizer = posSizer, type = 'light')
+        
+        pos = LightPositionWindow(panel, id = wx.ID_ANY, size = (175, 175),
+                                  mapwindow = self.mapWindow)
+        self.win['light']['position'] = pos.GetId()
+        posSizer.Add(item = pos,
+                     pos = (1, 1), flag = wx.ALIGN_CENTER | wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = posSizer, pos = (0, 0))
+        
+        # height
+        tooltip = _("Adjusts the light height")
+        self._createControl(panel, data = self.win['light'], name = 'z', sliderHor = False,
+                            range = (0, 100), tooltip = tooltip,
+                            bind = (self.OnLightChange, self.OnLightChanged, self.OnLightChange))
+        
+        heightSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        heightSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Height:")),
+                      pos = (0, 0), flag = wx.ALIGN_LEFT, span = (1, 2))
+        heightSizer.Add(item = self.FindWindowById(self.win['light']['z']['slider']),
+                        flag = wx.ALIGN_RIGHT, pos = (1, 0))
+        heightSizer.Add(item = self.FindWindowById(self.win['light']['z']['text']),
+                        flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_LEFT | wx.TOP |
+                        wx.BOTTOM | wx.RIGHT, pos = (1, 1))
+        
+        gridSizer.Add(item = heightSizer, pos = (0, 2), flag = wx.ALIGN_RIGHT)
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                     flag = wx.ALL | wx.EXPAND, border = 2)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        
+        # position
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Light color and intensity")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+
+        gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Color:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        color = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                  colour = UserSettings.Get(group = 'nviz', key = 'light',
+                                                            subkey = 'color'),
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        self.win['light']['color'] = color.GetId()
+        color.Bind(csel.EVT_COLOURSELECT, self.OnLightColor)
+        gridSizer.Add(item = color, pos = (0, 2))
+
+        gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Brightness:")),
+                      pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        tooltip = _("Adjusts the brightness of the light")
+        self._createControl(panel, data = self.win['light'], name = 'bright', size = 300,
+                            range = (0, 100), tooltip = tooltip, 
+                            bind = (self.OnLightValue, self.OnLightChanged, self.OnLightValue))
+        gridSizer.Add(item = self.FindWindowById(self.win['light']['bright']['slider']),
+                      pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.FindWindowById(self.win['light']['bright']['text']),
+                      pos = (1, 2),
+                      flag = wx.ALIGN_CENTER)
+        gridSizer.Add(item = wx.StaticText(panel, id = wx.ID_ANY, label = _("Ambient:")),
+                      pos = (2, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        tooltip = _("Adjusts the ambient light")
+        self._createControl(panel, data = self.win['light'], name = 'ambient', size = 300,
+                            range = (0, 100), tooltip = tooltip,
+                            bind = (self.OnLightValue, self.OnLightChanged, self.OnLightValue))
+        gridSizer.Add(item = self.FindWindowById(self.win['light']['ambient']['slider']),
+                      pos = (2, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.FindWindowById(self.win['light']['ambient']['text']),
+                      pos = (2, 2),
+                      flag = wx.ALIGN_CENTER)
+
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                     flag = wx.ALL | wx.EXPAND, border = 2)
+        pageSizer.Add(item = boxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        
+        # reset = wx.Button(panel, id = wx.ID_ANY, label = _("Reset"))
+        # reset.SetToolTipString(_("Reset to default view"))
+        # # self.win['reset'] = reset.GetId()
+        # reset.Bind(wx.EVT_BUTTON, self.OnResetView)
+        
+        # viewSizer.Add(item = reset, proportion = 1,
+        #               flag = wx.EXPAND | wx.ALL | wx.ALIGN_RIGHT,
+        #               border = 5)
+        
+        # gridSizer.AddGrowableCol(3)
+        # gridSizer.Add(item = viewSizer, pos = (4, 0), span = (1, 2),
+        #               flag = wx.EXPAND)
+        
+        panel.SetSizer(pageSizer)
+        panel.Layout()
+        panel.Fit()
+        
+        return panel
+
+    def _createFringePage(self, parent):
+        """!Create fringe page"""
+        panel = wx.Panel(parent = parent, id = wx.ID_ANY)
+        
+        self.page['fringe'] = { 'id' : 1,
+                                'notebook' : self.foldpanelAppear.GetId() }
+        self.win['fringe'] = {}
+
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        # selection
+        rbox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                             label = " %s " % (_("Surface")))
+        rboxSizer = wx.StaticBoxSizer(rbox, wx.VERTICAL)
+        rmaps = Select(parent = panel, type = 'raster',
+                       onPopup = self.GselectOnPopup)
+        rmaps.GetChildren()[0].Bind(wx.EVT_TEXT, self.OnSetSurface)
+        self.win['fringe']['map'] = rmaps.GetId()
+        rboxSizer.Add(item = rmaps, proportion = 0,
+                      flag = wx.ALL,
+                      border = 3)
+        pageSizer.Add(item = rboxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        
+        ebox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                             label = " %s " % (_("Edges with fringe")))
+        eboxSizer = wx.StaticBoxSizer(ebox, wx.HORIZONTAL)
+        for edge in [(_("N && W"), "nw"),
+                     (_("N && E"), "ne"),
+                     (_("S && W"), "sw"),
+                     (_("S && E"), "se")]:
+            chkbox = wx.CheckBox(parent = panel,
+                                 label = edge[0],
+                                 name = edge[1])
+            self.win['fringe'][edge[1]] = chkbox.GetId()
+            eboxSizer.Add(item = chkbox, proportion = 0,
+                         flag = wx.ADJUST_MINSIZE | wx.LEFT | wx.RIGHT, border = 5)
+            chkbox.Bind(wx.EVT_CHECKBOX, self.OnFringe)
+        
+        pageSizer.Add(item = eboxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+
+        sbox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                             label = " %s " % (_("Settings")))
+        sboxSizer = wx.StaticBoxSizer(sbox, wx.HORIZONTAL)
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+        
+        # elevation
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                           label = _("Elevation of fringe from bottom:")),
+                      pos = (0, 0),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        spin = wx.SpinCtrl(parent = panel, id = wx.ID_ANY,
+                           size = (65, -1), min = -1e6, max = 1e6)
+        spin.SetValue(UserSettings.Get(group = 'nviz', key = 'fringe', subkey = 'elev'))
+        spin.Bind(wx.EVT_SPINCTRL, self.OnFringe)
+        self.win['fringe']['elev'] = spin.GetId()
+        gridSizer.Add(item = spin, pos = (0, 1))
+        
+        # color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                           label = _("Color:")),
+                      pos = (1, 0),
+                      flag = wx.ALIGN_CENTER_VERTICAL)
+        color = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        color.SetColour(UserSettings.Get(group = 'nviz', key = 'fringe',
+                                         subkey = 'color'))
+        color.Bind(csel.EVT_COLOURSELECT, self.OnFringe)
+        self.win['fringe']['color'] = color.GetId()
+        gridSizer.Add(item = color, pos = (1, 1))
+        
+        sboxSizer.Add(item = gridSizer, proportion = 1,
+                      flag = wx.ALL | wx.EXPAND, border = 3)
+        pageSizer.Add(item = sboxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        
+        panel.SetSizer(pageSizer)
+        panel.Layout()
+        panel.Fit()
+
+        return panel
+    
+    def _createDecorationPage(self, parent):
+        """!Create decoration (north arrow, scalebar, legend) page"""
+        panel = wx.Panel(parent = parent, id = wx.ID_ANY)
+        
+        self.page['decoration'] = { 'id' : 2,
+                                    'notebook' : self.foldpanelAppear.GetId()}
+        self.win['decoration'] = {}
+
+        pageSizer = wx.BoxSizer(wx.VERTICAL)
+        
+        # north arrow
+        self.win['decoration']['arrow'] = {}
+        nabox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                             label = " %s " % (_("North Arrow")))
+        naboxSizer = wx.StaticBoxSizer(nabox, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        # size
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                           label = _("Arrow length (in map units):")),
+                      pos = (0,0), span = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+        sizeCtrl = NumTextCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1), style = wx.TE_PROCESS_ENTER)
+        gridSizer.Add(sizeCtrl, pos = (0, 2))
+        self.win['decoration']['arrow']['size'] = sizeCtrl.GetId()
+        sizeCtrl.Bind(wx.EVT_TEXT_ENTER, self.OnDecorationProp)
+        sizeCtrl.Bind(wx.EVT_KILL_FOCUS, self.OnDecorationProp)
+        
+        # color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                           label = _("Arrow color:")),
+                      pos = (1,0), span = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+        color = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        gridSizer.Add(color, pos = (1, 2))
+        self.win['decoration']['arrow']['color'] = color.GetId()
+        color.Bind(csel.EVT_COLOURSELECT, self.OnDecorationProp)
+        
+        # control
+        toggle = wx.ToggleButton(parent = panel, id = wx.ID_ANY, label = _("Place arrow"))
+        gridSizer.Add(item = toggle, pos = (2, 0))
+        toggle.Bind(wx.EVT_TOGGLEBUTTON, self.OnDecorationPlacement)
+        self.win['decoration']['arrow']['place'] = toggle.GetId()
+        toggle.SetName('placeArrow')
+
+        delete = wx.Button(parent = panel, id = wx.ID_ANY, label = _("Delete"))
+        gridSizer.Add(item = delete, pos = (2, 1))
+        delete.Bind(wx.EVT_BUTTON, self.OnArrowDelete)
+        naboxSizer.Add(item = gridSizer, proportion = 0, flag = wx.EXPAND, border = 3)
+        pageSizer.Add(item = naboxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)
+        
+        
+        # north arrow
+        self.win['decoration']['scalebar'] = {}
+        nabox = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                             label = " %s " % (_("Scale bar")))
+        naboxSizer = wx.StaticBoxSizer(nabox, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        # size
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                           label = _("Scale bar length (in map units):")),
+                      pos = (0,0), span = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+        sizeCtrl = NumTextCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1), style = wx.TE_PROCESS_ENTER)
+        gridSizer.Add(sizeCtrl, pos = (0, 2))
+        self.win['decoration']['scalebar']['size'] = sizeCtrl.GetId()
+        sizeCtrl.Bind(wx.EVT_TEXT_ENTER, self.OnDecorationProp)
+        sizeCtrl.Bind(wx.EVT_KILL_FOCUS, self.OnDecorationProp)
+        
+        # color
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                           label = _("Scale bar color:")),
+                      pos = (1,0), span = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+        color = csel.ColourSelect(parent = panel, id = wx.ID_ANY,
+                                  size = globalvar.DIALOG_COLOR_SIZE)
+        gridSizer.Add(color, pos = (1, 2))
+        self.win['decoration']['scalebar']['color'] = color.GetId()
+        color.Bind(csel.EVT_COLOURSELECT, self.OnDecorationProp)
+        
+        # control
+        toggle = wx.ToggleButton(parent = panel, id = wx.ID_ANY, label = _("Place scalebar"))
+        gridSizer.Add(item = toggle, pos = (2, 0))
+        toggle.Bind(wx.EVT_TOGGLEBUTTON, self.OnDecorationPlacement)
+        self.win['decoration']['scalebar']['place'] = toggle.GetId()
+        toggle.SetName('placeScalebar')
+
+        delete = wx.Button(parent = panel, id = wx.ID_ANY, label = _("Delete last"))
+        gridSizer.Add(item = delete, pos = (2, 1))
+        delete.Bind(wx.EVT_BUTTON, self.OnScalebarDelete)
+        naboxSizer.Add(item = gridSizer, proportion = 0, flag = wx.EXPAND, border = 3)
+        pageSizer.Add(item = naboxSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM,
+                      border = 3)      
+        panel.SetSizer(pageSizer)
+        panel.Layout()
+        panel.Fit()
+
+        return panel
+    
+    def GetLayerData(self, nvizType, nameOnly = False):
+        """!Get nviz data"""
+        name = self.FindWindowById(self.win[nvizType]['map']).GetValue()
+        if nameOnly:
+            return name
+        
+        if nvizType == 'surface' or nvizType == 'fringe':
+            return self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
+        elif nvizType == 'vector':
+            return self.mapWindow.GetLayerByName(name, mapType = 'vector', dataType = 'nviz')
+        elif nvizType == 'volume':
+            return self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')
+        
+        return None
+        
+    def OnRecord(self, event):
+        """!Animation: start recording"""
+        anim = self.mapWindow.GetAnimation()
+        if not anim.IsPaused():
+            if anim.Exists() and not anim.IsSaved():
+                msg = _("Do you want to record new animation without saving the previous one?")
+                dlg = wx.MessageDialog(parent = self,
+                                       message = msg,
+                                       caption =_("Animation already axists"),
+                                       style = wx.YES_NO | wx.CENTRE)
+                if dlg.ShowModal() == wx.ID_NO:
+                    dlg.Destroy()
+                    return
+                
+        
+            anim.Clear()
+            self.UpdateFrameIndex(0)
+            self.UpdateFrameCount()
+            
+        anim.SetPause(False)
+        anim.SetMode(mode = 'record')
+        anim.Start()
+        
+        self.FindWindowById(self.win['anim']['play']).Disable()
+        self.FindWindowById(self.win['anim']['record']).Disable()
+        self.FindWindowById(self.win['anim']['pause']).Enable()
+        self.FindWindowById(self.win['anim']['stop']).Enable()
+        self.FindWindowById(self.win['anim']['frameIndex']['slider']).Disable()
+        self.FindWindowById(self.win['anim']['frameIndex']['text']).Disable()
+        
+    def OnPlay(self, event):
+        """!Animation: replay"""
+        anim = self.mapWindow.GetAnimation()
+        anim.SetPause(False)
+        anim.SetMode(mode = 'play')
+        anim.Start()
+        
+        self.FindWindowById(self.win['anim']['play']).Disable()
+        self.FindWindowById(self.win['anim']['record']).Disable()
+        self.FindWindowById(self.win['anim']['pause']).Enable()
+        self.FindWindowById(self.win['anim']['stop']).Enable()
+        self.FindWindowById(self.win['anim']['frameIndex']['slider']).Enable()
+        self.FindWindowById(self.win['anim']['frameIndex']['text']).Enable()
+        
+    def OnStop(self, event):
+        """!Animation: stop recording/replaying"""
+        anim = self.mapWindow.GetAnimation()
+        anim.SetPause(False)
+        if anim.GetMode() == 'save':
+            anim.StopSaving()
+        if anim.IsRunning():
+            anim.Stop()
+        
+        self.UpdateFrameIndex(0)
+        
+        self.FindWindowById(self.win['anim']['play']).Enable()
+        self.FindWindowById(self.win['anim']['record']).Enable()
+        self.FindWindowById(self.win['anim']['pause']).Disable()
+        self.FindWindowById(self.win['anim']['stop']).Disable()
+        self.FindWindowById(self.win['anim']['frameIndex']['slider']).Disable()
+        self.FindWindowById(self.win['anim']['frameIndex']['text']).Disable()
+        
+    def OnPause(self, event):
+        """!Pause animation"""
+        anim = self.mapWindow.GetAnimation()
+        
+        anim.SetPause(True)
+        mode = anim.GetMode()
+        if anim.IsRunning():
+            anim.Pause()
+            
+        if mode == "record":
+            self.FindWindowById(self.win['anim']['play']).Disable()
+            self.FindWindowById(self.win['anim']['record']).Enable()
+            self.FindWindowById(self.win['anim']['frameIndex']['slider']).Disable()
+            self.FindWindowById(self.win['anim']['frameIndex']['text']).Disable()
+        elif mode == 'play':
+            self.FindWindowById(self.win['anim']['record']).Disable()
+            self.FindWindowById(self.win['anim']['play']).Enable()
+            self.FindWindowById(self.win['anim']['frameIndex']['slider']).Enable()
+            self.FindWindowById(self.win['anim']['frameIndex']['text']).Enable()
+        
+        self.FindWindowById(self.win['anim']['pause']).Disable()
+        self.FindWindowById(self.win['anim']['stop']).Enable()
+
+        
+    def OnFrameIndex(self, event):
+        """!Frame index changed (by slider)"""
+        index = event.GetInt()
+        self.UpdateFrameIndex(index = index, sliderWidget = False)
+        
+    def OnFrameIndexText(self, event):
+        """!Frame index changed by (textCtrl)"""
+        index = event.GetValue()
+        self.UpdateFrameIndex(index = index, textWidget = False)
+        
+    def OnFPS(self, event):
+        """!Frames per second changed"""
+        anim = self.mapWindow.GetAnimation()
+        anim.SetFPS(event.GetInt())
+        
+    def UpdateFrameIndex(self, index, sliderWidget = True, textWidget = True, goToFrame = True):
+        """!Update frame index"""
+        anim = self.mapWindow.GetAnimation()
+        
+        # check index
+        frameCount = anim.GetFrameCount()
+        if index >= frameCount:
+            index = frameCount - 1
+        if index < 0:
+            index = 0
+            
+        if sliderWidget:
+            slider = self.FindWindowById(self.win['anim']['frameIndex']['slider'])
+            slider.SetValue(index)
+        if textWidget:
+            text = self.FindWindowById(self.win['anim']['frameIndex']['text'])
+            text.SetValue(int(index))
+        
+        # if called from tool window, update frame
+        if goToFrame:
+            anim.GoToFrame(int(index))
+            
+    def UpdateFrameCount(self):
+        """!Update frame count label"""
+        anim = self.mapWindow.GetAnimation()
+        count = anim.GetFrameCount()
+        self.FindWindowById(self.win['anim']['info']).SetLabel(str(count))
+        
+    def OnAnimationFinished(self, event):
+        """!Animation finished"""
+        anim = self.mapWindow.GetAnimation()
+        self.UpdateFrameIndex(index = 0)
+        
+        slider = self.FindWindowById(self.win['anim']['frameIndex']['slider'])
+        text = self.FindWindowById(self.win['anim']['frameIndex']['text'])
+        
+        if event.mode == 'record':
+            count = anim.GetFrameCount()
+            slider.SetMax(count)
+            self.UpdateFrameCount()
+            
+        self.FindWindowById(self.win['anim']['pause']).Disable()
+        self.FindWindowById(self.win['anim']['stop']).Disable()
+        self.FindWindowById(self.win['anim']['record']).Enable()
+        self.FindWindowById(self.win['anim']['play']).Enable()
+        self.FindWindowById(self.win['anim']['frameIndex']['slider']).Disable()
+        self.FindWindowById(self.win['anim']['frameIndex']['text']).Disable()
+        self.FindWindowById(self.win['anim']['save']['image']['confirm']).Enable()
+        
+        self.mapWindow.render['quick'] = False
+        self.mapWindow.Refresh(False)
+        
+    def OnAnimationUpdateIndex(self, event):
+        """!Animation: frame index changed"""
+        if event.mode == 'record':
+            self.UpdateFrameCount()
+        elif event.mode == 'play':
+            self.UpdateFrameIndex(index = event.index, goToFrame = False)
+        
+    def OnSaveAnimation(self, event):
+        """!Save animation as a sequence of images"""
+        anim = self.mapWindow.GetAnimation()
+        
+        prefix = self.FindWindowById(self.win['anim']['save']['image']['prefix']).GetValue()
+        format = self.FindWindowById(self.win['anim']['save']['image']['format']).GetSelection()
+        dir = self.FindWindowById(self.win['anim']['save']['image']['dir']).GetValue()
+        
+        if not prefix:
+            GMessage(parent = self,
+                     message = _("No file prefix given."))
+            return
+        elif not os.path.exists(dir):
+            GMessage(parent = self,
+                     message = _("Directory %s does not exist.") % dir)
+            return
+            
+        self.FindWindowById(self.win['anim']['pause']).Disable()
+        self.FindWindowById(self.win['anim']['stop']).Enable()
+        self.FindWindowById(self.win['anim']['record']).Disable()
+        self.FindWindowById(self.win['anim']['play']).Disable()
+        self.FindWindowById(self.win['anim']['frameIndex']['slider']).Disable()
+        self.FindWindowById(self.win['anim']['frameIndex']['text']).Disable()
+        
+        self.FindWindowById(self.win['anim']['save']['image']['confirm']).Disable()
+        
+        anim.SaveAnimationFile(path = dir, prefix = prefix, format = format)
+        
+    def OnNewConstant(self, event):
+        """!Create new surface with constant value"""
+        #TODO settings
+        name = self.mapWindow.NewConstant()
+        win = self.FindWindowById(self.win['constant']['surface'])
+        name = _("constant#") + str(name)
+        win.Append(name)
+        win.SetStringSelection(name)
+        self.OnConstantSelection(None)
+        self.EnablePage(name = 'constant', enabled = True)
+        
+        self.mapWindow.Refresh(eraseBackground = False)
+        
+        # need to update list of surfaces in vector page
+        for vtype in ('points', 'lines'):
+            checklist = self.FindWindowById(self.win['vector'][vtype]['surface'])
+            checklist.Append(name)
+        win = self.FindWindowById(self.win['vector']['map'])
+        win.SetValue(win.GetValue())
+                
+
+    def OnDeleteConstant(self, event):
+        """!Delete selected constant surface"""
+        layerIdx = self.FindWindowById(self.win['constant']['surface']).GetSelection()
+        if layerIdx == wx.NOT_FOUND:
+            return
+        name = self.FindWindowById(self.win['constant']['surface']).GetStringSelection()
+        self.mapWindow.DeleteConstant(layerIdx)
+        win = self.FindWindowById(self.win['constant']['surface'])
+        win.Delete(layerIdx)
+        if win.IsEmpty():
+            win.SetValue("")
+            self.EnablePage(name = 'constant', enabled = False)
+        else:
+            win.SetSelection(0)
+            self.OnConstantSelection(None)
+            
+        # need to update list of surfaces in vector page
+        for vtype in ('points', 'lines'):
+            checklist = self.FindWindowById(self.win['vector'][vtype]['surface'])
+            checklist.Delete(checklist.FindString(name))
+            
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+    
+    def OnConstantSelection(self, event):
+        """!Constant selected"""
+        layerIdx = self.FindWindowById(self.win['constant']['surface']).GetSelection()
+        if layerIdx == wx.NOT_FOUND:
+            return
+        name = _("constant#") + str(layerIdx + 1)
+        data = self.mapWindow.constants[layerIdx]
+        for attr, value in data['constant'].iteritems():
+            if attr == 'color':
+                value = self._getColorFromString(value)
+            if attr in ('color', 'value', 'resolution', 'transp'):
+                if attr == 'transp':
+                    self.FindWindowById(self.win['constant'][attr]).SetValue(self._getPercent(value))
+                self.FindWindowById(self.win['constant'][attr]).SetValue(value)
+        
+    def OnSetConstantProp(self, event):
+        """!Change properties (color, value, resolution)
+            of currently selected constant surface"""
+        layerIdx = self.FindWindowById(self.win['constant']['surface']).GetSelection()
+        if layerIdx == wx.NOT_FOUND:
+            return
+        data = self.mapWindow.constants[layerIdx]
+        for attr in ('resolution', 'value', 'transp'):
+            data['constant'][attr] = self.FindWindowById(self.win['constant'][attr]).GetValue()
+        data['constant']['color'] = self._getColorString(
+                self.FindWindowById(self.win['constant']['color']).GetValue())
+        data['constant']['transp'] = self._getPercent(data['constant']['transp'], toPercent = False)
+        
+       # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event) 
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def OnFringe(self, event):
+        """!Show/hide fringe"""
+        data = self.GetLayerData('fringe')['surface']
+        
+        sid = data['object']['id']
+        elev = self.FindWindowById(self.win['fringe']['elev']).GetValue()
+        color = self.FindWindowById(self.win['fringe']['color']).GetValue()
+        
+        self._display.SetFringe(sid, color, elev,
+                                self.FindWindowById(self.win['fringe']['nw']).IsChecked(),
+                                self.FindWindowById(self.win['fringe']['ne']).IsChecked(),
+                                self.FindWindowById(self.win['fringe']['sw']).IsChecked(),
+                                self.FindWindowById(self.win['fringe']['se']).IsChecked())
+        self.mapWindow.Refresh(False)
+        
+    def OnScroll(self, event, win, data):
+        """!Generic scrolling handler"""
+        winName = self.__GetWindowName(win, event.GetId())
+        if not winName:
+            return
+        data[winName] = self.FindWindowById(event.GetId()).GetValue()
+        for w in win[winName].itervalues():
+            self.FindWindowById(w).SetValue(data[winName])
+        
+        event.Skip()
+        
+    def AdjustSliderRange(self, slider, value):
+        minim, maxim = slider.GetRange()
+        if not (minim <= value <= maxim):
+            slider.SetRange(min(minim, value), max(maxim, value))
+    
+    def _createIsosurfacePanel(self, parent):
+        panel = wx.Panel(parent = parent, id = wx.ID_ANY)
+        
+        vSizer = wx.BoxSizer(wx.HORIZONTAL)
+        
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Isosurface attributes")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        
+        self.win['volume']['attr'] = {}
+        inout = wx.CheckBox(parent = panel, id = wx.ID_ANY, 
+                            label = _("toggle normal direction"))
+        gridSizer.Add(item = inout, pos = (0,0), span = (1,2), flag = wx.ALIGN_CENTER_VERTICAL)
+        inout.Bind(wx.EVT_CHECKBOX, self.OnInOutMode)
+        self.win['volume']['inout'] = inout.GetId()
+        
+        row = 1
+        for code, attrb in (('topo', _("Isosurface value")),
+                            ('color', _("Color")),
+                            ('mask', _("Mask")),
+                            ('transp', _("Transparency")),
+                            ('shine', _("Shininess"))):
+            self.win['volume'][code] = {} 
+            # label
+            colspan = 1
+            if code == 'topo':
+                colspan = 2
+            gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                             label = attrb + ':'),
+                          pos = (row, 0), span = (1, colspan),flag = wx.ALIGN_CENTER_VERTICAL)
+            if code != 'topo':
+                use = wx.Choice (parent = panel, id = wx.ID_ANY, size = (100, -1),
+                                 choices = [_("map")])
+            else:
+                use = None
+            # check for required properties
+            if code not in ('topo', 'color', 'shine'):
+                use.Insert(item = _("unset"), pos = 0)
+                self.win['volume'][code]['required'] = False
+            else:
+                self.win['volume'][code]['required'] = True
+            if use and code != 'mask':
+                use.Append(item = _('constant'))
+            if use:
+                self.win['volume'][code]['use'] = use.GetId()
+                use.Bind(wx.EVT_CHOICE, self.OnMapObjUse)
+                gridSizer.Add(item = use, flag = wx.ALIGN_CENTER_VERTICAL,
+                              pos = (row, 1))
+                    
+            if code != 'topo':
+                map = Select(parent = panel, id = wx.ID_ANY,
+                             # size = globalvar.DIALOG_GSELECT_SIZE,
+                             size = (200, -1),
+                             type = "grid3")
+                self.win['volume'][code]['map'] = map.GetId() - 1 # FIXME
+                map.Bind(wx.EVT_TEXT, self.OnVolumeIsosurfMap)
+                gridSizer.Add(item = map, flag = wx.ALIGN_CENTER_VERTICAL,
+                              pos = (row, 2))
+            else:
+                map = None
+            
+            if code == 'color':
+                color = UserSettings.Get(group = 'nviz', key = 'volume', subkey = ['color', 'value'])
+                value = csel.ColourSelect(panel, id = wx.ID_ANY,
+                                          colour = color,
+                                          size = globalvar.DIALOG_COLOR_SIZE)
+                value.Bind(csel.EVT_COLOURSELECT, self.OnVolumeIsosurfMap)
+                value.SetName('color')
+            elif code == 'mask':
+                value = None
+            elif code == 'topo':
+                value = NumTextCtrl(parent = panel, id = wx.ID_ANY, size = (200, -1),
+                            style = wx.TE_PROCESS_ENTER)
+                value.Bind(wx.EVT_TEXT_ENTER, self.OnVolumeIsosurfMap)
+                value.Bind(wx.EVT_KILL_FOCUS, self.OnVolumeIsosurfMap)
+##                value.Bind(wx.EVT_TEXT, self.OnVolumeIsosurfMap)
+            else:
+                size = (65, -1)
+                value = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = size,
+                                    initial = 0)
+                if code == 'topo':
+                    value.SetRange(minVal = -1e9, maxVal = 1e9)
+                elif code in ('shine', 'transp'):
+                    value.SetRange(minVal = 0, maxVal = 100)
+                
+                value.Bind(wx.EVT_SPINCTRL, self.OnVolumeIsosurfMap)
+                value.Bind(wx.EVT_TEXT, self.OnVolumeIsosurfMap)
+            
+            if value:
+                self.win['volume'][code]['const'] = value.GetId()
+                if code == 'topo':
+                    gridSizer.Add(item = value, flag = wx.ALIGN_CENTER_VERTICAL,
+                                  pos = (row, 2))
+                else:
+                    value.Enable(False)
+                    gridSizer.Add(item = value, flag = wx.ALIGN_CENTER_VERTICAL,
+                                  pos = (row, 3))
+            else:
+                self.win['volume'][code]['const'] = None
+            
+            if code != 'topo':
+                self.SetMapObjUseMap(nvizType = 'volume',
+                                     attrb = code) # -> enable map / disable constant
+            
+            row += 1
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                     flag = wx.ALL | wx.EXPAND, border = 3)
+        vSizer.Add(item = boxSizer, proportion = 1,
+                     flag = wx.EXPAND, border = 0)
+        panel.SetSizer(vSizer)
+        
+        return panel
+    
+    def _createSlicePanel(self, parent):
+        panel = wx.Panel(parent = parent, id = wx.ID_ANY)
+        
+        vSizer = wx.BoxSizer(wx.HORIZONTAL)
+        
+        box = wx.StaticBox (parent = panel, id = wx.ID_ANY,
+                            label = " %s " % (_("Slice attributes")))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        hSizer = wx.BoxSizer()
+        
+        self.win['volume']['slice'] = {}
+        hSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                      label = _("Slice parallel to axis:")), proportion = 0,
+                      flag = wx.ALIGN_CENTER_VERTICAL|wx.RIGHT, border = 3)
+        axes = wx.Choice(parent = panel, id = wx.ID_ANY, size = (65, -1), choices = ("X", "Y", "Z"))
+        hSizer.Add(axes, proportion = 0, flag = wx.ALIGN_LEFT|wx.LEFT, border = 3)
+        self.win['volume']['slice']['axes'] = axes.GetId()
+        axes.Bind(wx.EVT_CHOICE, self.OnVolumeSliceAxes)
+        boxSizer.Add(hSizer, proportion = 0, flag = wx.ALL|wx.EXPAND, border = 3)
+        
+        gridSizer = wx.GridBagSizer(vgap = 3, hgap = 3)
+        gridSizer.AddGrowableCol(0,1)
+        gridSizer.AddGrowableCol(1,2)
+        gridSizer.AddGrowableCol(2,2)
+        
+        # text labels
+        for i in range(2):
+            label = wx.StaticText(parent = panel, id = wx.ID_ANY)
+            label.SetName('label_edge_' + str(i))
+            gridSizer.Add(item = label, pos = (0, i + 1),
+                          flag = wx.ALIGN_CENTER)
+        for i in range(2,4):
+            label = wx.StaticText(parent = panel, id = wx.ID_ANY)
+            label.SetName('label_edge_' + str(i))
+            gridSizer.Add(item = label, pos = (3, i -1),
+                          flag = wx.ALIGN_CENTER)
+        for i in range(2):
+            label = wx.StaticText(parent = panel, id = wx.ID_ANY)
+            label.SetName('label_coord_' + str(i))
+            gridSizer.Add(item = label, pos = (i + 1, 0),
+                          flag = wx.ALIGN_CENTER_VERTICAL)
+        label = wx.StaticText(parent = panel, id = wx.ID_ANY)
+        label.SetName('label_coord_2')
+        gridSizer.Add(item = label, pos = (4, 0), 
+                          flag = wx.ALIGN_CENTER_VERTICAL)
+        # sliders
+        for i, coord in enumerate(('x1', 'x2')):
+            slider = wx.Slider(parent = panel, id = wx.ID_ANY, minValue = 0, maxValue = 100, value = 0)
+            self.win['volume']['slice']['slider_' + coord] = slider.GetId()
+            slider.Bind(wx.EVT_SPIN, self.OnSlicePositionChange)
+            slider.Bind(wx.EVT_SCROLL_THUMBRELEASE, self.OnSlicePositionChanged)
+            gridSizer.Add(item = slider, pos = (1, i + 1), 
+                          flag = wx.ALIGN_CENTER|wx.EXPAND)
+                        
+        for i, coord in enumerate(('y1', 'y2')):
+            slider = wx.Slider(parent = panel, id = wx.ID_ANY, minValue = 0, maxValue = 100, value = 0)
+            self.win['volume']['slice']['slider_' + coord] = slider.GetId()
+            slider.Bind(wx.EVT_SPIN, self.OnSlicePositionChange)
+            slider.Bind(wx.EVT_SCROLL_THUMBRELEASE, self.OnSlicePositionChanged)
+            gridSizer.Add(item = slider, pos = (2, i + 1), 
+                          flag = wx.ALIGN_CENTER|wx.EXPAND)
+        
+        for i, coord in enumerate(('z1', 'z2')):
+            slider = wx.Slider(parent = panel, id = wx.ID_ANY, minValue = 0, maxValue = 100, value = 0)
+            self.win['volume']['slice']['slider_' + coord] = slider.GetId()
+            slider.Bind(wx.EVT_SPIN, self.OnSlicePositionChange)
+            slider.Bind(wx.EVT_SCROLL_THUMBRELEASE, self.OnSlicePositionChanged)
+            gridSizer.Add(item = slider, pos = (4,i+1), 
+                          flag = wx.ALIGN_CENTER|wx.EXPAND)
+                        
+        
+        boxSizer.Add(item = gridSizer, proportion = 1,
+                     flag = wx.ALL | wx.EXPAND, border = 3)
+        
+        # transparency, reset
+        hSizer = wx.BoxSizer()
+        hSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                      label = _("Transparency:")), proportion = 0,
+                      flag = wx.ALIGN_CENTER_VERTICAL|wx.RIGHT|wx.TOP, border = 7)
+        spin = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = (65, -1),
+                           min = 0, max = 100, initial = 0)
+        spin.Bind(wx.EVT_SPINCTRL, self.OnSliceTransparency)
+        self.win['volume']['slice']['transp'] = spin.GetId()
+        hSizer.Add(item = spin, proportion = 0,
+                      flag = wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.TOP, border = 7)
+                    
+        hSizer.Add(item = wx.Size(-1, -1), proportion = 1,
+                      flag = wx.EXPAND)
+        reset = wx.Button(parent = panel, id = wx.ID_ANY, label = _("Reset"))
+        reset.Bind(wx.EVT_BUTTON, self.OnSliceReset)
+        self.win['volume']['slice']['reset'] = reset.GetId()
+        hSizer.Add(item = reset, proportion = 0,
+                      flag = wx.ALIGN_CENTER_VERTICAL|wx.TOP, border = 7)
+        
+        boxSizer.Add(hSizer, proportion = 0, flag = wx.ALL|wx.EXPAND, border = 3)
+        panel.SetSizer(boxSizer)
+        
+        return panel
+    
+    def _createControl(self, parent, data, name, range, tooltip = None, bind = (None, None, None),
+                       sliderHor = True, size = 200, floatSlider = False):
+        """!Add control (Slider + TextCtrl)"""
+        data[name] = dict()
+        if sliderHor:
+            style = wx.SL_HORIZONTAL | wx.SL_AUTOTICKS | \
+                wx.SL_BOTTOM
+            sizeW = (size, -1)
+        else:
+            style = wx.SL_VERTICAL | wx.SL_AUTOTICKS | \
+                wx.SL_INVERSE
+            sizeW = (-1, size)
+        
+        kwargs = dict(parent = parent, id = wx.ID_ANY,
+                           minValue = range[0],
+                           maxValue = range[1],
+                           style = style,
+                           size = sizeW)
+        if floatSlider:
+            slider = FloatSlider(**kwargs)
+        else:
+            slider = wx.Slider(**kwargs)
+            
+        slider.SetName('slider')
+        if bind[0]:
+            #EVT_SCROLL emits event after slider is released, EVT_SPIN not
+            slider.Bind(wx.EVT_SPIN, bind[0])
+        
+        if bind[1]:
+            slider.Bind(wx.EVT_SCROLL_THUMBRELEASE, bind[1]) 
+        data[name]['slider'] = slider.GetId()
+        
+        text = NumTextCtrl(parent = parent, id = wx.ID_ANY, size = (65, -1),
+                            style = wx.TE_PROCESS_ENTER)
+        
+        text.SetName('text')
+        if tooltip:
+            text.SetToolTipString(tooltip)
+        if bind[2]:
+            text.Bind(wx.EVT_TEXT_ENTER, bind[2])
+            text.Bind(wx.EVT_KILL_FOCUS, bind[2])
+        
+        data[name]['text'] = text.GetId()
+        
+    def _createCompass(self, panel, sizer, type):
+        """!Create 'compass' widget for light and view page"""
+        w = wx.Button(panel, id = wx.ID_ANY, label = _("W"))
+        n = wx.Button(panel, id = wx.ID_ANY, label = _("N"))
+        s = wx.Button(panel, id = wx.ID_ANY, label = _("S"))
+        e = wx.Button(panel, id = wx.ID_ANY, label = _("E"))
+        nw = wx.Button(panel, id = wx.ID_ANY, label = _("NW"))
+        ne = wx.Button(panel, id = wx.ID_ANY, label = _("NE"))
+        se = wx.Button(panel, id = wx.ID_ANY, label = _("SE"))
+        sw = wx.Button(panel, id = wx.ID_ANY, label = _("SW"))
+        padding = 15
+        if sys.platform == 'darwin':
+            padding = 20
+        minWidth = sw.GetTextExtent(sw.GetLabel())[0] + padding
+        for win, name in zip((w, n, s, e, nw, ne, se, sw),
+                        ('w', 'n', 's', 'e', 'nw', 'ne', 'se', 'sw')):
+            win.SetMinSize((minWidth, -1))
+            win.Bind(wx.EVT_BUTTON, self.OnLookFrom)
+            win.SetName(type + '_' + name)
+        sizer.Add(item = nw, pos = (0, 0), flag = wx.ALIGN_CENTER)
+        sizer.Add(item = n, pos = (0, 1), flag = wx.ALIGN_CENTER)
+        sizer.Add(item = ne, pos = (0, 2), flag = wx.ALIGN_CENTER)
+        sizer.Add(item = e, pos = (1, 2), flag = wx.ALIGN_CENTER)
+        sizer.Add(item = se, pos = (2, 2), flag = wx.ALIGN_CENTER)
+        sizer.Add(item = s, pos = (2, 1), flag = wx.ALIGN_CENTER)
+        sizer.Add(item = sw, pos = (2, 0), flag = wx.ALIGN_CENTER)
+        sizer.Add(item = w, pos = (1, 0), flag = wx.ALIGN_CENTER)
+        
+        
+        
+    def __GetWindowName(self, data, id):
+        for name in data.iterkeys():
+            if type(data[name]) is type({}):
+                for win in data[name].itervalues():
+                    if win == id:
+                        return name
+            else:
+                if data[name] == id:
+                    return name
+        
+        return None
+
+    def UpdateSettings(self):
+        """!Update view from settings values 
+        stored in self.mapWindow.view dictionary"""
+        for control in ('height',
+                        'persp',
+                        'twist',
+                        'z-exag'):
+            for win in self.win['view'][control].itervalues():             
+                try:
+                    if control == 'height':
+                        value = int(self.mapWindow.iview[control]['value'])
+                    else:
+                        value = self.mapWindow.view[control]['value']
+                except KeyError:
+                    value = -1
+                        
+                self.FindWindowById(win).SetValue(value)
+        
+        viewWin = self.FindWindowById(self.win['view']['position'])
+        x, y = viewWin.UpdatePos(self.mapWindow.view['position']['x'],
+                                 self.mapWindow.view['position']['y'])
+        viewWin.Draw(pos = (x, y), scale = True)
+        viewWin.Refresh(False)
+        
+        color = self._getColorString(self.mapWindow.view['background']['color'])
+        self._display.SetBgColor(str(color))
+        
+        self.Update()
+        
+        self.mapWindow.Refresh(eraseBackground = False)
+        self.mapWindow.render['quick'] = False
+        self.mapWindow.Refresh(True)
+        
+    def OnShowLightModel(self, event):
+        """!Show light model"""
+        self._display.showLight = event.IsChecked()
+        self._display.DrawLightingModel()
+        
+    def OnLightChange(self, event):
+        """!Position of the light changing"""
+        winName = self.__GetWindowName(self.win['light'], event.GetId())
+        if not winName:
+            return
+        
+        value = self.FindWindowById(event.GetId()).GetValue()
+        
+        self.mapWindow.light['position']['z'] = value
+        for win in self.win['light'][winName].itervalues():
+            self.FindWindowById(win).SetValue(value)
+            
+        self.PostLightEvent()
+        
+        event.Skip()
+        
+    def OnLightChanged(self, event):
+        """!Light changed"""
+        self.PostLightEvent(refresh = True)
+        
+    def OnLightColor(self, event):
+        """!Color of the light changed"""
+        self.mapWindow.light['color'] = tuple(event.GetValue())
+        
+        self.PostLightEvent(refresh = True)
+        
+        event.Skip()
+        
+    def OnLightValue(self, event):
+        """!Light brightness/ambient changing"""
+        data = self.mapWindow.light
+        self.OnScroll(event, self.win['light'], data)
+        
+        self.PostLightEvent()
+        event.Skip()
+        
+    def OnBgColor(self, event):
+        """!Background color changed"""
+        color = event.GetValue()
+        self.mapWindow.view['background']['color'] = tuple(color)
+        color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
+        self._display.SetBgColor(str(color))
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def OnSetSurface(self, event):
+        """!Surface selected, currently used for fringes"""
+        name = event.GetString()
+        try:
+            data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')['surface']
+        except:
+            self.EnablePage('fringe', False)
+            return
+        
+        layer = self.mapWindow.GetLayerByName(name, mapType = 'raster')
+        self.EnablePage('fringe', True)
+        
+    def OnSetRaster(self, event):
+        """!Raster map selected, update surface page"""
+        name = event.GetString()
+        try:
+            data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')['surface']
+        except:
+            self.EnablePage('surface', False)
+            return
+
+        layer = self.mapWindow.GetLayerByName(name, mapType = 'raster')
+        self.EnablePage('surface', True)
+        self.UpdateSurfacePage(layer, data, updateName = False)
+        
+    def OnSetVector(self, event):
+        """!Vector map selected, update properties page"""
+        name = event.GetString()
+        try:
+            data = self.mapWindow.GetLayerByName(name, mapType = 'vector', dataType = 'nviz')['vector']
+        except:
+            self.EnablePage('vector', False)
+            return
+        layer = self.mapWindow.GetLayerByName(name, mapType = 'vector')
+        self.EnablePage('vector', True)
+        self.UpdateVectorPage(layer, data, updateName = False)
+
+    def OnSetRaster3D(self, event):
+        """!3D Raster map selected, update surface page"""
+        name = event.GetString()
+        try:
+            data = self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')['volume']
+        except:
+            self.EnablePage('volume', False)
+            return
+        
+        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
+        self.EnablePage('volume', True)
+        self.UpdateVolumePage(layer, data, updateName = False)
+        
+    def OnViewChange(self, event):
+        """!Change view, render in quick mode"""
+        # find control
+        winName = self.__GetWindowName(self.win['view'], event.GetId())
+        if not winName:
+            return
+        
+        value = self.FindWindowById(event.GetId()).GetValue()
+        slider = self.FindWindowById(self.win['view'][winName]['slider'])
+
+        if winName == 'persp' and not (0 <= value <= 180):
+            return
+
+        self.AdjustSliderRange(slider = slider, value = value)
+        
+        if winName == 'height':
+            view = self.mapWindow.iview # internal
+        else:
+            view = self.mapWindow.view
+        
+        if winName == 'z-exag' and value >= 0:
+            self.PostViewEvent(zExag = True)
+        else:
+            self.PostViewEvent(zExag = False)
+        
+        if winName in ('persp', 'twist'):
+            convert = int
+        else:
+            convert = float
+        
+        view[winName]['value'] = convert(value)
+            
+        for win in self.win['view'][winName].itervalues():
+            self.FindWindowById(win).SetValue(value)
+
+        self.mapWindow.iview['dir']['use'] = False
+        self.mapWindow.render['quick'] = True
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+        event.Skip()
+        
+    def OnViewChanged(self, event):
+        """!View changed, render in full resolution"""
+        self.mapWindow.render['quick'] = False
+        self.mapWindow.Refresh(False)
+        self.UpdateSettings()
+        try:# when calling event = None
+            event.Skip()
+        except AttributeError:
+            pass
+            
+    def OnViewChangedText(self, event):
+        """!View changed, render in full resolution""" 
+        self.mapWindow.render['quick'] = False
+        self.OnViewChange(event)
+        self.OnViewChanged(None)
+        self.Update()
+        
+        event.Skip()
+    
+    def OnLookAt(self, event):
+        """!Look here/center"""
+        name = self.FindWindowById(event.GetId()).GetName()
+        if name == 'center':
+            self._display.LookAtCenter()
+            focus = self.mapWindow.iview['focus']
+            focus['x'], focus['y'], focus['z'] = self._display.GetFocus()
+            self.mapWindow.saveHistory = True
+            self.mapWindow.Refresh(False)
+        elif name == 'top':
+            self.mapWindow.view['position']['x'] = 0.5
+            self.mapWindow.view['position']['y'] = 0.5
+            self.PostViewEvent(zExag = True)
+            self.UpdateSettings()
+            self.mapWindow.Refresh(False)
+        else: # here
+            if self.FindWindowById(event.GetId()).GetValue():
+                self.mapDisplay.Raise()
+                self.mapWindow.mouse['use'] = 'lookHere'
+                self.mapWindow.SetCursor(self.mapWindow.cursors["cross"])
+            else:
+                self.mapWindow.mouse['use'] = 'default'
+                self.mapWindow.SetCursor(self.mapWindow.cursors['default'])
+            
+    def OnResetView(self, event):
+        """!Reset to default view (view page)"""
+        self.mapWindow.ResetView()
+        self.UpdateSettings()
+        self.mapWindow.Refresh(False)
+        
+    def OnResetSurfacePosition(self, event):
+        """!Reset position of surface"""
+        
+        for win in self.win['surface']['position'].itervalues():
+            if win == self.win['surface']['position']['axis']:
+                self.FindWindowById(win).SetSelection(2) # Z
+            elif win == self.win['surface']['position']['reset']:
+                continue
+            else:
+                self.FindWindowById(win).SetValue(0)
+                
+        data = self.GetLayerData('surface')
+        data['surface']['position']['x'] = 0
+        data['surface']['position']['y'] = 0
+        data['surface']['position']['z'] = 0
+        data['surface']['position']['update'] = None
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+            
+    def OnLookFrom(self, event):
+        """!Position of view/light changed by buttons"""
+        name = self.FindWindowById(event.GetId()).GetName()
+        buttonName = name.split('_')[1]
+        if name.split('_')[0] == 'view':
+            type = 'view'
+            data = self.mapWindow.view
+        else:
+            type = 'light'
+            data = self.mapWindow.light
+        if buttonName == 'n': # north
+            data['position']['x'] = 0.5
+            data['position']['y'] = 0.0
+        elif buttonName == 's': # south
+            data['position']['x'] = 0.5
+            data['position']['y'] = 1.0
+        elif buttonName == 'e': # east
+            data['position']['x'] = 1.0
+            data['position']['y'] = 0.5
+        elif buttonName =='w': # west
+            data['position']['x'] = 0.0
+            data['position']['y'] = 0.5
+        elif buttonName == 'nw': # north-west
+            data['position']['x'] = 0.0
+            data['position']['y'] = 0.0
+        elif buttonName == 'ne': # north-east
+            data['position']['x'] = 1.0
+            data['position']['y'] = 0.0
+        elif buttonName == 'se': # south-east
+            data['position']['x'] = 1.0
+            data['position']['y'] = 1.0
+        elif buttonName == 'sw': # south-west
+            data['position']['x'] = 0.0
+            data['position']['y'] = 1.0
+        if type == 'view':    
+            self.PostViewEvent(zExag = True)
+            
+            self.UpdateSettings()
+        else:
+            self.PostLightEvent()
+            lightWin = self.FindWindowById(self.win['light']['position'])
+            x, y = lightWin.UpdatePos(self.mapWindow.light['position']['x'],
+                                     self.mapWindow.light['position']['y'])
+            lightWin.Draw(pos = (x, y), scale = True)
+            lightWin.Refresh(False)
+        self.mapWindow.render['quick'] = False
+        self.mapWindow.Refresh(False)
+
+    def OnMapObjUse(self, event):
+        """!Set surface attribute -- use -- map/constant"""
+        if not self.mapWindow.init:
+            return
+        
+        wx.Yield()
+        
+        # find attribute row
+        attrb = self.__GetWindowName(self.win['surface'], event.GetId())
+        if not attrb:
+            attrb = self.__GetWindowName(self.win['volume'], event.GetId())
+            nvizType = 'volume'
+        else:
+            nvizType = 'surface'
+        
+        selection = event.GetSelection()
+        if self.win[nvizType][attrb]['required']: # no 'unset'
+            selection += 1
+        if selection == 0: # unset
+            useMap = None
+            value = ''
+        elif selection == 1: # map
+            useMap = True
+            value = self.FindWindowById(self.win[nvizType][attrb]['map']).GetValue()
+        elif selection == 2: # constant
+            useMap = False
+            if attrb == 'color':
+                value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetColour()
+                value = self._getColorString(value)
+            else:
+                value = self._getPercent(self.FindWindowById(self.win[nvizType][attrb]['const']).GetValue(), toPercent = False)
+        
+        self.SetMapObjUseMap(nvizType = nvizType,
+                             attrb = attrb, map = useMap)
+        
+        name = self.FindWindowById(self.win[nvizType]['map']).GetValue()
+        if nvizType == 'surface':
+            data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
+            data[nvizType]['attribute'][attrb] = { 'map' : useMap,
+                                                   'value' : str(value),
+                                                   'update' : None }
+        else: # volume / isosurface
+            data = self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')
+            list = self.FindWindowById(self.win['volume']['isosurfs'])
+            id = list.GetSelection()
+            if id != -1:
+                data[nvizType]['isosurface'][id][attrb] = { 'map' : useMap,
+                                                            'value' : str(value),
+                                                            'update' : None }
+        
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+ 
+    def EnablePage(self, name, enabled = True):
+        """!Enable/disable all widgets on page"""
+        for key, item in self.win[name].iteritems():
+            if key in ('map', 'surface', 'new','planes'):
+                continue
+            if type(item) == types.DictType:
+                for skey, sitem in self.win[name][key].iteritems():
+                    if type(sitem) == types.DictType:
+                        for ssitem in self.win[name][key][skey].itervalues():
+                            if type(ssitem) == types.IntType:
+                                self.FindWindowById(ssitem).Enable(enabled)
+                    else:
+                        if type(sitem) == types.IntType:
+                            self.FindWindowById(sitem).Enable(enabled)
+            else:
+                if type(item) == types.IntType:
+                    self.FindWindowById(item).Enable(enabled)
+        
+    def SetMapObjUseMap(self, nvizType, attrb, map = None):
+        """!Update dialog widgets when attribute type changed"""
+        if attrb in ('topo', 'color', 'shine'):
+            incSel = -1 # decrement selection (no 'unset')
+        else:
+            incSel = 0
+        if nvizType == 'volume' and attrb == 'topo':
+            return
+        if map is True: # map
+            if attrb != 'topo': # changing map topography not allowed
+                # not sure why, but here must be disabled both ids, should be fixed!
+                self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(True)
+            if self.win[nvizType][attrb]['const']:
+                self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(False)
+            self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(1 + incSel)
+        elif map is False: # const
+            self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(False)
+            if self.win[nvizType][attrb]['const']:
+                self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(True)
+            self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(2 + incSel)
+        else: # unset
+            self.FindWindowById(self.win[nvizType][attrb]['use']).SetSelection(0)
+            self.FindWindowById(self.win[nvizType][attrb]['map'] + 1).Enable(False)
+            if self.win[nvizType][attrb]['const']:
+                self.FindWindowById(self.win[nvizType][attrb]['const']).Enable(False)
+            
+        
+    def OnSurfaceMap(self, event):
+        """!Set surface attribute"""
+        if self.vetoGSelectEvt:
+            self.vetoGSelectEvt = False
+            return
+        self.SetMapObjAttrb(nvizType = 'surface', winId = event.GetId())
+        
+    def SetMapObjAttrb(self, nvizType, winId):
+        """!Set map object (surface/isosurface) attribute (map/constant)"""
+        if not self.mapWindow.init:
+            return
+        
+        attrb = self.__GetWindowName(self.win[nvizType], winId)
+        if not attrb:
+            return
+        
+        if not (nvizType == 'volume' and attrb == 'topo'):
+            selection = self.FindWindowById(self.win[nvizType][attrb]['use']).GetSelection()
+            if self.win[nvizType][attrb]['required']:
+                selection += 1
+
+            if selection == 0: # unset
+                useMap = None
+                value = ''
+            elif selection == 1: # map
+                value = self.FindWindowById(self.win[nvizType][attrb]['map']).GetValue()
+                useMap = True
+            else: # constant
+                if attrb == 'color':
+                    value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetColour()
+                    # tuple to string
+                    value = self._getColorString(value)
+                else:
+                    value = self._getPercent(
+                        self.FindWindowById(self.win[nvizType][attrb]['const']).GetValue(), toPercent = False)
+                    
+                useMap = False
+        else:
+            useMap = None
+            value = self.FindWindowById(self.win[nvizType][attrb]['const']).GetValue()
+        if not self.pageChanging:
+            name = self.FindWindowById(self.win[nvizType]['map']).GetValue()
+            if nvizType == 'surface':
+                data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
+                data[nvizType]['attribute'][attrb] = { 'map' : useMap,
+                                                       'value' : str(value),
+                                                       'update' : None }
+            else:
+                data = self.mapWindow.GetLayerByName(name, mapType = '3d-raster', dataType = 'nviz')
+                list = self.FindWindowById(self.win['volume']['isosurfs'])
+                id = list.GetSelection()
+                if id > -1:
+                    data[nvizType]['isosurface'][id][attrb] = { 'map' : useMap,
+                                                                'value' : str(value),
+                                                                'update' : None }
+                    if attrb == 'topo':
+                        list = self.FindWindowById(self.win['volume']['isosurfs'])
+                        sel = list.GetSelection()
+                        list.SetString(sel, "%s %s" % (_("Level"), str(value)))
+                        list.Check(sel)
+            
+            # update properties
+            event = wxUpdateProperties(data = data)
+            wx.PostEvent(self.mapWindow, event)
+            
+            if self.mapDisplay.IsAutoRendered():
+                self.mapWindow.Refresh(False)
+        
+    def OnSurfaceResolution(self, event):
+        """!Draw resolution changed"""
+        self.SetSurfaceResolution()
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+    
+
+    def SetSurfaceResolution(self):
+        """!Set draw resolution"""
+        coarse = self.FindWindowById(self.win['surface']['draw']['res-coarse']).GetValue()
+        fine = self.FindWindowById(self.win['surface']['draw']['res-fine']).GetValue()
+        
+        data = self.GetLayerData('surface')
+        data['surface']['draw']['resolution'] = { 'coarse' : coarse,
+                                                  'fine' : fine,
+                                                  'update' : None }
+        
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+    def SetSurfaceMode(self):
+        """!Set draw mode"""
+        mode = self.FindWindowById(self.win['surface']['draw']['mode']).GetSelection()
+        style = self.FindWindowById(self.win['surface']['draw']['style']).GetSelection()
+        if style == 0: # wire
+            self.FindWindowById(self.win['surface']['draw']['wire-color']).Enable(True)
+        elif style == 1: # surface
+            self.FindWindowById(self.win['surface']['draw']['wire-color']).Enable(False)
+        
+        shade = self.FindWindowById(self.win['surface']['draw']['shading']).GetSelection()
+        
+        value, desc = self.mapWindow.nvizDefault.GetDrawMode(mode, style, shade)
+        
+        return value, desc
+
+    def OnSurfaceMode(self, event):
+        """!Set draw mode"""
+        value, desc = self.SetSurfaceMode()
+        
+        data = self.GetLayerData('surface')
+        data['surface']['draw']['mode'] = { 'value' : value,
+                                            'desc' : desc,
+                                            'update' : None }
+        
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+
+    def OnSurfaceModeAll(self, event):
+        """!Set draw mode (including wire color) for all loaded surfaces"""
+        value, desc = self.SetSurfaceMode()
+        coarse = self.FindWindowById(self.win['surface']['draw']['res-coarse']).GetValue()
+        fine = self.FindWindowById(self.win['surface']['draw']['res-fine']).GetValue()
+        color = self.FindWindowById(self.win['surface']['draw']['wire-color']).GetColour()
+        cvalue = self._getColorString(color)
+        
+        for name in self.mapWindow.GetLayerNames(type = 'raster'):
+            
+            data = self.mapWindow.GetLayerByName(name, mapType = 'raster', dataType = 'nviz')
+            if not data:
+                continue # shouldy no happen
+            
+            data['surface']['draw']['all'] = True
+            data['surface']['draw']['mode'] = { 'value' : value,
+                                                'desc' : desc,
+                                                'update' : None }
+            data['surface']['draw']['resolution'] = { 'coarse' : coarse,
+                                                      'fine' : fine,
+                                                      'update' : None }
+            data['surface']['draw']['wire-color'] = { 'value' : cvalue,
+                                                      'update' : None }
+            
+            # update properties
+            event = wxUpdateProperties(data = data)
+            wx.PostEvent(self.mapWindow, event)
+            
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def _getColorString(self, color):
+        """!Convert color tuple to R:G:B format
+
+        @param color tuple
+        
+        @return string R:G:B
+        """
+        return str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
+    
+    def _getColorFromString(self, color, delim = ':'):
+        """!Convert color string (R:G:B) to wx.Color
+
+        @param color string
+        @param delim delimiter
+
+        @return wx.Color instance
+        """
+        return wx.Color(*map(int, color.split(delim)))
+    
+    def _get3dRange(self, name):
+        """!Gelper func for getting range of 3d map"""
+        ret = RunCommand('r3.info', read = True, flags = 'r', map = name)
+        if ret:
+            range = []
+            for value in ret.strip('\n').split('\n'):
+                range.append(float(value.split('=')[1]))
+            return range
+        
+        return -1e6, 1e6
+    
+    def _getPercent(self, value, toPercent = True):
+        """!Convert values 0 - 255 to percents and vice versa"""
+        value = int(value)
+        if toPercent:
+            value = int(value/255. * 100)
+        else:
+            value = int(value/100. * 255)
+        return value
+    
+    def OnSurfaceWireColor(self, event):
+        """!Set wire color"""
+        data = self.GetLayerData('surface')
+        value = self._getColorString(event.GetValue())
+        data['surface']['draw']['wire-color'] = { 'value' : value,
+                                                  'update' : None }
+        
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def OnSurfaceAxis(self, event):
+        """!Surface position, axis changed"""
+        data = self.GetLayerData('surface')
+        id = data['surface']['object']['id']
+        
+        axis = self.FindWindowById(self.win['surface']['position']['axis']).GetSelection()
+        slider = self.FindWindowById(self.win['surface']['position']['slider'])
+        text = self.FindWindowById(self.win['surface']['position']['text'])
+        xydim = self._display.GetLongDim()
+        zdim = self._display.GetZRange()
+        zdim = zdim[1] - zdim[0]
+        
+        x, y, z = self._display.GetSurfacePosition(id)
+        
+        if axis == 0: # x
+            slider.SetRange(-3 * xydim, 3 * xydim)
+            slider.SetValue(x)
+            text.SetValue(x)
+        elif axis == 1: # y
+            slider.SetRange(-3 * xydim, 3 * xydim)
+            slider.SetValue(y)
+            text.SetValue(y)
+        else: # z
+            slider.SetRange(-3 * zdim, 3 * zdim)
+            slider.SetValue(z)
+            text.SetValue(z)
+        
+    def OnSurfacePosition(self, event):
+        """!Surface position"""
+        winName = self.__GetWindowName(self.win['surface'], event.GetId())
+        if not winName:
+            return
+        axis = self.FindWindowById(self.win['surface']['position']['axis']).GetSelection()
+        
+        value = self.FindWindowById(event.GetId()).GetValue()
+        slider = self.FindWindowById(self.win['surface'][winName]['slider'])
+        self.AdjustSliderRange(slider = slider, value = value)
+        
+        for win in self.win['surface']['position'].itervalues():
+            if win in (self.win['surface']['position']['axis'],
+                       self.win['surface']['position']['reset']):
+                continue
+            else:
+                self.FindWindowById(win).SetValue(value)
+        
+        data = self.GetLayerData('surface')
+        id = data['surface']['object']['id']
+        x, y, z = self._display.GetSurfacePosition(id)
+        
+        if axis == 0: # x
+            x = value
+        elif axis == 1: # y
+            y = value
+        else: # z
+            z = value
+        
+        data['surface']['position']['x'] = x
+        data['surface']['position']['y'] = y
+        data['surface']['position']['z'] = z
+        data['surface']['position']['update'] = None
+        # update properties
+        
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        self.mapWindow.render['quick'] = True
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        #        self.UpdatePage('surface')
+        
+    def OnSurfacePositionChanged(self, event):
+        """!Surface position changed"""
+        self.mapWindow.render['quick'] = False
+        self.mapWindow.Refresh(False)
+
+    def OnSurfacePositionText(self, event):
+        """!Surface position changed by textctrl"""
+        self.OnSurfacePosition(event)
+        self.OnSurfacePositionChanged(None)
+        
+    def UpdateVectorShow(self, vecType, enabled):
+        """!Enable/disable lines/points widgets
+        
+        @param vecType vector type (lines, points)
+        """
+        if vecType != 'lines' and vecType != 'points':
+            return False
+        
+        for win in self.win['vector'][vecType].keys():
+            if win == 'show':
+                continue
+            if type(self.win['vector'][vecType][win]) == type({}):
+                for swin in self.win['vector'][vecType][win].keys():
+                    if enabled:
+                        self.FindWindowById(self.win['vector'][vecType][win][swin]).Enable(True)
+                    else:
+                        self.FindWindowById(self.win['vector'][vecType][win][swin]).Enable(False)
+            else:
+                if enabled:
+                    self.FindWindowById(self.win['vector'][vecType][win]).Enable(True)
+                else:
+                    self.FindWindowById(self.win['vector'][vecType][win]).Enable(False)
+        
+        return True
+    
+    def OnVectorShow(self, event):
+        """!Show vector lines/points"""
+        winId = event.GetId()
+        if winId == self.win['vector']['lines']['show']:
+            vecType = 'lines'
+            points = False
+        else: # points
+            vecType = 'points' 
+            points = True
+       
+        checked = event.IsChecked()
+        name = self.FindWindowById(self.win['vector']['map']).GetValue()
+        item = self.mapWindow.GetLayerByName(name, mapType = 'vector', dataType = 'item')
+        data = self.GetLayerData('vector')['vector']
+        
+        if checked:
+            self.mapWindow.LoadVector(item, points = points, append = False)
+        else:
+            self.mapWindow.UnloadVector(item, points = points, remove = False)
+        
+        self.UpdateVectorShow(vecType, checked)
+        
+        if checked:
+            try:
+                id = data[vecType]['object']['id']
+            except KeyError:
+                id = -1
+            
+            if id > 0:
+                self.mapWindow.SetMapObjProperties(item, id, vecType)
+                
+                # update properties
+                event = wxUpdateProperties(data = data)
+                wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+        event.Skip()
+    
+    def OnVectorDisplay(self, event):
+        """!Display vector lines on surface/flat"""
+        rasters = self.mapWindow.GetLayerNames('raster')
+        if event.GetSelection() == 0: # surface
+            if len(rasters) < 1:
+                self.FindWindowById(self.win['vector']['lines']['surface']).Enable(False)
+                self.FindWindowById(self.win['vector']['lines']['flat']).SetSelection(1)
+                return
+            
+            self.FindWindowById(self.win['vector']['lines']['surface']).Enable(True)
+            # set first found surface
+            data = self.GetLayerData('vector')
+            data['vector']['lines']['mode']['surface'] = rasters[0]
+            self.FindWindowById(self.win['vector']['lines']['surface']).SetStringSelection( \
+                rasters[0])
+        else: # flat
+            self.FindWindowById(self.win['vector']['lines']['surface']).Enable(False)
+        
+        self.OnVectorLines(event)
+        
+        event.Skip()
+
+    def OnVectorLines(self, event):
+        """!Set vector lines mode, apply changes if auto-rendering is enabled"""
+        data = self.GetLayerData('vector')
+        width = self.FindWindowById(self.win['vector']['lines']['width']).GetValue()
+        
+        mode = {}
+        if self.FindWindowById(self.win['vector']['lines']['flat']).GetSelection() == 0:
+            mode['type'] = 'surface'
+            mode['surface'] = {}
+            checklist = self.FindWindowById(self.win['vector']['lines']['surface'])
+            value = list()
+            checked = list()
+            for surface in range(checklist.GetCount()):
+                value.append(checklist.GetString(surface))
+                checked.append(checklist.IsChecked(surface))
+                    
+            mode['surface']['value'] = value
+            mode['surface']['show'] = checked
+        else:
+            mode['type'] = 'flat'
+        
+        for attrb in ('width', 'mode'):
+            data['vector']['lines'][attrb]['update'] = None
+        data['vector']['lines']['width']['value'] = width
+        data['vector']['lines']['mode'] = mode
+        
+        color = self.FindWindowById(self.win['vector']['lines']['color']).GetColour()
+        
+        if isinstance(color, csel.ColourSelect):
+            pass #color picker not yet instantiated
+        else:
+            color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
+            data['vector']['lines']['color']['update'] = None
+            data['vector']['lines']['color']['value'] = color
+        
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+                        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def OnVectorHeight(self, event):
+        id = event.GetId()
+        if id in self.win['vector']['lines']['height'].values():
+            vtype = 'lines'
+        else:
+            vtype = 'points'
+        
+        value = self.FindWindowById(id).GetValue()
+        slider = self.FindWindowById(self.win['vector'][vtype]['height']['slider'])
+        self.AdjustSliderRange(slider = slider, value = value)
+        
+        for win in self.win['vector'][vtype]['height'].itervalues():
+            self.FindWindowById(win).SetValue(value)
+        
+        data = self.GetLayerData('vector')
+        data['vector'][vtype]['height'] = { 'value' : value,
+                                            'update' : None }
+        
+        # update properties
+        
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        self.mapWindow.render['quick'] = True
+        self.mapWindow.render['v' + vtype] = True
+        self.mapWindow.Refresh(False)
+        
+        event.Skip()
+    
+    def OnVectorHeightFull(self, event):
+        """!Vector height changed, render in full resolution"""
+        self.OnVectorHeight(event)
+##        self.OnVectorSurface(event)
+        id = event.GetId()
+        if id in self.win['vector']['lines']['height'].values():
+            vtype = 'lines'
+        else:
+            vtype = 'points'
+        
+        self.mapWindow.render['quick'] = False
+        self.mapWindow.render['v' + vtype] = False
+        self.mapWindow.Refresh(False)
+
+    def OnVectorHeightText(self, event):
+        """!Vector height changed, render in full resolution"""
+        
+        #        self.OnVectorHeight(event)
+        self.OnVectorHeightFull(event)
+    
+    def OnVectorSurface(self, event):
+        """!Reference surface for vector map (lines/points)"""   
+        id = event.GetId()
+        if id == self.win['vector']['lines']['surface']:
+            vtype = 'lines'
+        else:
+            vtype = 'points'
+        checkList = self.FindWindowById(self.win['vector'][vtype]['surface'])
+        checked = []
+        surfaces = []
+        for items in range(checkList.GetCount()):
+            checked.append(checkList.IsChecked(items))
+            surfaces.append(checkList.GetString(items))
+        
+        data = self.GetLayerData('vector')
+        data['vector'][vtype]['mode']['surface'] = { 'value' : surfaces,
+                                                     'show'  : checked}
+        data['vector'][vtype]['mode']['update'] = None 
+        
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+            
+        
+    def OnVectorPoints(self, event):
+        """!Set vector points mode, apply changes if auto-rendering is enabled"""
+        data = self.GetLayerData('vector')
+        
+        size  = self.FindWindowById(self.win['vector']['points']['size']).GetValue()
+        marker = self.FindWindowById(self.win['vector']['points']['marker']).GetSelection()
+        #        width = self.FindWindowById(self.win['vector']['points']['width']).GetValue()
+        
+        for attrb in ('size', 'marker'):
+            data['vector']['points'][attrb]['update'] = None
+        data['vector']['points']['size']['value'] = size
+        #        data['vector']['points']['width']['value'] = width
+        data['vector']['points']['marker']['value'] = marker
+        
+        color = self.FindWindowById(self.win['vector']['points']['color']).GetColour()
+        if isinstance(color, csel.ColourSelect):
+            pass #color picker not yet instantiated
+        else:
+            color = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
+            data['vector']['points']['color']['update'] = None
+            data['vector']['points']['color']['value'] = color
+        
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+        
+    def UpdateIsosurfButtons(self, list):
+        """!Enable/disable buttons 'add', 'delete',
+        'move up', 'move down'"""
+        nitems = list.GetCount()
+        add = self.parent.FindWindowById(self.win['volume']['btnAdd'])
+        delete = self.parent.FindWindowById(self.win['volume']['btnDelete'])
+        moveDown = self.parent.FindWindowById(self.win['volume']['btnMoveDown'])
+        moveUp = self.parent.FindWindowById(self.win['volume']['btnMoveUp'])
+        if nitems >= wxnviz.MAX_ISOSURFS:
+            # disable add button on max
+            add.Enable(False)
+        else:
+            add.Enable(True)
+        
+        if nitems < 1:
+            # disable 'delete' if only one item in the lis
+            delete.Enable(False)
+        else:
+            delete.Enable(True)
+        
+        if list.GetSelection() >= nitems - 1:
+            # disable 'move-down' if last
+            moveDown.Enable(False)
+        else:
+            moveDown.Enable(True)
+        
+        if list.GetSelection() < 1:
+            # disable 'move-up' if first
+            moveUp.Enable(False)
+        else:
+            moveUp.Enable(True)
+            
+    def OnVolumeMode(self, event):
+        """!Change mode isosurfaces/slices"""
+        mode = self.FindWindowById(self.win['volume']['draw']['mode']).GetSelection()
+        data = self.GetLayerData('volume')['volume']
+        
+        sizer = self.isoPanel.GetContainingSizer()
+        sizer = self.slicePanel.GetContainingSizer()
+        listBox = self.FindWindowByName('listStaticBox')
+        if mode == 0:
+            sizer.Show(self.isoPanel)
+            sizer.Hide(self.slicePanel)
+            listBox.SetLabel(" %s " % _("List of isosurfaces"))
+            data['draw']['mode']['value'] = 0
+            data['draw']['mode']['desc'] = 'isosurface'
+        else:
+            sizer.Hide(self.isoPanel)
+            sizer.Show(self.slicePanel)
+            listBox.SetLabel(" %s " % _("List of slices"))
+            data['draw']['mode']['value'] = 1
+            data['draw']['mode']['desc'] = 'slice'
+        
+        if event:
+            name = self.FindWindowById(self.win['volume']['map']).GetValue()
+            layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
+            self.UpdateVolumePage(layer, data, updateName = False)
+            
+        sizer.Layout()
+        listBox.GetParent().Fit()
+            
+    def OnVolumeDrawMode(self, event):
+        """!Set isosurface/slice draw mode"""
+        self.SetVolumeDrawMode(event.GetSelection())
+        
+    def SetVolumeDrawMode(self, selection):
+        """!Set isosurface draw mode"""
+        data = self.GetLayerData('volume')['volume']
+        id = data['object']['id']
+        
+        mode = 0
+        if selection == 0:
+            mode |= wxnviz.DM_FLAT
+        else:
+            mode |= wxnviz.DM_GOURAUD
+            
+        if self.FindWindowById(self.win['volume']['draw']['mode']).GetSelection() == 0:
+            self._display.SetIsosurfaceMode(id, mode)
+            data['draw']['shading']['isosurface']['desc'] = 'gouraud'
+            data['draw']['shading']['isosurface']['value'] = mode
+        else:
+            self._display.SetSliceMode(id, mode)
+            data['draw']['shading']['slice']['desc'] = 'flat'
+            data['draw']['shading']['slice']['value'] = mode
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def OnVolumeResolution(self, event):
+        """!Set isosurface/slice draw resolution"""
+        self.SetVolumeResolution(event.GetInt())
+        
+    def SetVolumeResolution(self, res):
+        """!Set isosurface draw resolution"""
+        data = self.GetLayerData('volume')['volume']
+        id = data['object']['id']
+        
+        if self.FindWindowById(self.win['volume']['draw']['mode']).GetSelection() == 0:
+            self._display.SetIsosurfaceRes(id, res)
+            data['draw']['resolution']['isosurface']['value'] = res
+        else:
+            self._display.SetSliceRes(id, res)
+            data['draw']['resolution']['slice']['value'] = res
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+    
+    def OnInOutMode(self, event):
+        """!Change isosurfaces mode inout"""
+        data = self.GetLayerData('volume')['volume']
+        id = data['object']['id']
+        isosurfId = self.FindWindowById(self.win['volume']['isosurfs']).GetSelection()
+        
+        ret = self._display.SetIsosurfaceInOut(id, isosurfId, event.GetInt())
+        if ret == 1:
+            data['isosurface'][isosurfId]['inout'] = event.GetInt()
+            
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+    
+        
+    def OnVolumeIsosurfMap(self, event):
+        """!Set surface attribute"""
+        if self.vetoGSelectEvt:
+            self.vetoGSelectEvt = False
+            return
+        self.SetMapObjAttrb(nvizType = 'volume', winId = event.GetId())
+        
+    def OnVolumeCheck(self, event):
+        """!Isosurface/slice checked (->load) or unchecked (->unload)"""
+        if self.FindWindowById(self.win['volume']['draw']['mode']).GetSelection() == 0:
+            mode = 'isosurf'
+        else:
+            mode = 'slice'
+        index = event.GetSelection()
+        list = self.FindWindowById(self.win['volume'][mode + 's'])
+        
+        data = self.GetLayerData('volume')['volume']
+        vid = data['object']['id']
+        
+        id = event.GetSelection()
+        
+        if mode == 'isosurf':
+            if list.IsChecked(index):
+                if 'transp' in data['isosurface'][id] and\
+                    data['isosurface'][id]['transp']['map'] is not None:
+                    if data['isosurface'][id]['transp']['map']:
+                        map = True
+                        value = data['isosurface'][id]['transp']['value']
+                    elif data['isosurface'][id]['transp']['map'] is not None:
+                        map = False
+                        value = data['isosurface'][id]['transp']['value']
+                    self._display.SetIsosurfaceTransp(vid, id, map, value)
+                else:
+                    self._display.SetIsosurfaceTransp(vid, id, False, "0")
+            else:
+                # disable -> make transparent
+                self._display.SetIsosurfaceTransp(vid, id, False, "255")
+        else:
+            if list.IsChecked(index):
+                value = data['slice'][id]['transp']['value']
+                self._display.SetSliceTransp(vid, id, value)
+            else:
+                # disable -> make transparent
+                self._display.SetSliceTransp(vid, id, 255)
+                
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def OnVolumeSelect(self, event):
+        """!Isosurface/Slice item selected"""
+        if self.FindWindowById(self.win['volume']['draw']['mode']).GetSelection() == 0:
+            mode = 'isosurf'
+        else:
+            mode = 'slice'
+            
+        winUp = self.FindWindowById(self.win['volume']['btnMoveUp'])
+        winDown = self.FindWindowById(self.win['volume']['btnMoveDown'])
+        selection = event.GetSelection()
+        if selection == -1:
+            return
+        elif selection == 0:
+            winUp.Enable(False)
+            if not winDown.IsEnabled():
+                winDown.Enable()
+        elif selection == self.FindWindowById(event.GetId()).GetCount() - 1:
+            winDown.Enable(False)
+            if not winUp.IsEnabled():
+                winUp.Enable()
+        else:
+            if not winDown.IsEnabled():
+                winDown.Enable()
+            if not winUp.IsEnabled():
+                winUp.Enable()
+        
+        # update dialog
+        name = self.FindWindowById(self.win['volume']['map']).GetValue()
+        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
+        
+        if mode == 'isosurf':
+            data = self.GetLayerData('volume')['volume']['isosurface'][selection]
+            self.UpdateVolumeIsosurfPage(data)
+        else:
+            data = self.GetLayerData('volume')['volume']['slice'][selection]
+            self.UpdateVolumeSlicePage(data)
+        
+        
+        
+    def OnVolumeAdd(self, event):
+        """!Add new isosurface/slice to the list"""
+        if self.FindWindowById(self.win['volume']['draw']['mode']).GetSelection() == 0:
+            mode = 'isosurf'
+        else:
+            mode = 'slice'
+        list = self.FindWindowById(self.win['volume'][mode + 's'])
+        
+        name = self.FindWindowById(self.win['volume']['map']).GetValue()
+        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
+        data = self.GetLayerData('volume')['volume']
+        id = data['object']['id']
+        
+        sel = list.GetSelection()
+        if mode == 'isosurf':
+            isosurfData = self.mapWindow.nvizDefault.SetIsosurfaceDefaultProp()
+            if isosurfData['color']['map']:
+                isosurfData['color']['value'] = layer.name
+
+            level = isosurfData['topo']['value'] = round(self._get3dRange(name = layer.name)[0], 2)
+        
+            if sel < 0 or sel >= list.GetCount() - 1:
+                item = list.Append(item = "%s %s" % (_("Level"), str(level)))
+            else:
+                list.Insert(item = "%s %s" % (_("Level"), str(level)),
+                            pos = sel+1) # append
+                item = sel + 1
+        else:
+            sliceData = self.mapWindow.nvizDefault.SetSliceDefaultProp()
+            axis = ("X", "Y", "Z")[sliceData['position']['axis']]
+            if sel < 0 or sel >= list.GetCount() - 1:
+                item = list.Append(item = "%s %s" % (_("Slice parallel to"), axis))
+            else:
+                list.Insert(item = "%s" % (_("Slice parallel to"), axis),
+                            pos = sel+1) # append
+                item = sel + 1
+        
+        list.Check(item)
+        list.SetSelection(item)
+        
+        if mode == 'isosurf':
+            data['isosurface'].insert(item, isosurfData)
+            # add isosurface        
+            self._display.AddIsosurface(id, float(level))
+        else:
+            data['slice'].insert(item, sliceData)
+            # add isosurface        
+            nslice = self._display.AddSlice(id)
+            self._display.SetSlicePosition(id, nslice -1, sliceData['position']['x1'], sliceData['position']['x2'],
+                                               sliceData['position']['y1'], sliceData['position']['y2'],
+                                               sliceData['position']['z1'], sliceData['position']['z2'],
+                                               sliceData['position']['axis'])
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        # update buttons
+        self.UpdateIsosurfButtons(list)
+        if mode == 'isosurf':
+            self.UpdateVolumeIsosurfPage(isosurfData)
+        else:
+            self.UpdateVolumeSlicePage(sliceData)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+        event.Skip()
+        
+    def OnVolumeDelete(self, event):
+        """!Remove isosurface/slice from list"""
+        if self.FindWindowById(self.win['volume']['draw']['mode']).GetSelection() == 0:
+            mode = 'isosurf'
+        else:
+            mode = 'slice'
+        list = self.FindWindowById(self.win['volume'][mode + 's'])
+        
+        # remove item from list
+        id = list.GetSelection()
+        list.Delete(id)
+        # select last item
+        if list.GetCount() > 0:
+            list.SetSelection(list.GetCount()-1)
+        
+        name = self.FindWindowById(self.win['volume']['map']).GetValue()
+        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
+        data = self.GetLayerData('volume')['volume']
+
+        vid = data['object']['id']
+        
+        # delete isosurface
+        if mode == 'isosurf':
+            del data['isosurface'][id]
+            self._display.DeleteIsosurface(vid, id)
+        else:
+            del data['slice'][id]
+            self._display.DeleteSlice(vid, id)
+        
+        # update buttons
+        if list.GetCount() > 0:
+            if mode == 'isosurf':
+                self.UpdateVolumeIsosurfPage(data['isosurface'][list.GetSelection()])
+            else:
+                self.UpdateVolumeSlicePage(data['slice'][list.GetSelection()])
+        else:
+            if mode == 'isosurf':
+                self.UpdateVolumeIsosurfPage(data['attribute'])
+            else:
+                self.UpdateVolumeSlicePage(None)
+        self.UpdateIsosurfButtons(list)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+        event.Skip()
+        
+    def OnVolumeMoveUp(self, event):
+        """!Move isosurface/slice up in the list"""
+        if self.FindWindowById(self.win['volume']['draw']['mode']).GetSelection() == 0:
+            mode = 'isosurf'
+        else:
+            mode = 'slice'
+        list = self.FindWindowById(self.win['volume'][mode + 's'])
+        sel = list.GetSelection()
+        
+        if sel < 1:
+            return # this should not happen
+        
+        name = self.FindWindowById(self.win['volume']['map']).GetValue()
+        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
+        data = self.GetLayerData('volume')['volume']
+        
+        id = data['object']['id']
+        
+        # move item up
+        text = list.GetStringSelection()
+        list.Insert(item = text, pos = sel-1)
+        list.Check(sel-1)
+        list.SetSelection(sel-1)
+        list.Delete(sel+1)
+        if mode == 'isosurf':
+            data['isosurface'].insert(sel-1, data['isosurface'][sel])
+            del data['isosurface'][sel+1]
+            self._display.MoveIsosurface(id, sel, True)
+        else:
+            data['slice'].insert(sel-1, data['slice'][sel])
+            del data['slice'][sel+1]
+            self._display.MoveSlice(id, sel, True)
+        
+        # update buttons
+        self.UpdateIsosurfButtons(list)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+        event.Skip()
+        
+    def OnVolumeMoveDown(self, event):
+        """!Move isosurface/slice down in the list"""
+        if self.FindWindowById(self.win['volume']['draw']['mode']).GetSelection() == 0:
+            mode = 'isosurf'
+        else:
+            mode = 'slice'
+        list = self.FindWindowById(self.win['volume'][mode + 's'])
+        sel = list.GetSelection()
+        
+        if sel >= list.GetCount() - 1:
+            return # this should not happen
+        
+        name = self.FindWindowById(self.win['volume']['map']).GetValue()
+        layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
+        data = self.GetLayerData('volume')['volume']
+        
+        id = data['object']['id']
+        
+        # move item up
+        text = list.GetStringSelection()
+        list.Insert(item = text, pos = sel+2)
+        list.Check(sel+2)
+        list.SetSelection(sel+2)
+        list.Delete(sel)
+        if mode == 'isosurf':
+            data['isosurface'].insert(sel+2, data['isosurface'][sel])
+            del data['isosurface'][sel]
+            self._display.MoveIsosurface(id, sel, False)
+        else:
+            data['slice'].insert(sel+2, data['slice'][sel])
+            del data['slice'][sel]
+            self._display.MoveSlice(id, sel, False)
+        
+        # update buttons
+        self.UpdateIsosurfButtons(list)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+        event.Skip()
+    
+    def OnVolumePositionChanged(self, event):
+        """!Volume position changed"""
+        self.mapWindow.render['quick'] = False
+        self.mapWindow.Refresh(False)
+        
+    def OnVolumePosition(self, event):
+        """!Volume position"""
+        winName = self.__GetWindowName(self.win['volume'], event.GetId())
+        if not winName:
+            return
+        axis = self.FindWindowById(self.win['volume']['position']['axis']).GetSelection()
+        
+        value = self.FindWindowById(event.GetId()).GetValue()
+        slider = self.FindWindowById(self.win['volume'][winName]['slider'])
+        self.AdjustSliderRange(slider = slider, value = value)
+        
+        for win in self.win['volume']['position'].itervalues():
+            if win in (self.win['volume']['position']['axis'],
+                       self.win['volume']['position']['reset']):
+                continue
+            else:
+                self.FindWindowById(win).SetValue(value)
+        
+        data = self.GetLayerData('volume')
+        id = data['volume']['object']['id']
+        x, y, z = self._display.GetVolumePosition(id)
+        
+        if axis == 0: # x
+            x = value
+        elif axis == 1: # y
+            y = value
+        else: # z
+            z = value
+        
+        data['volume']['position']['x'] = x
+        data['volume']['position']['y'] = y
+        data['volume']['position']['z'] = z
+        data['volume']['position']['update'] = None
+        # update properties
+        
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        self.mapWindow.render['quick'] = True
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def OnVolumeAxis(self, event):
+        """!Volume position, axis changed"""
+        data = self.GetLayerData('volume')
+        id = data['volume']['object']['id']
+        
+        axis = self.FindWindowById(self.win['volume']['position']['axis']).GetSelection()
+        slider = self.FindWindowById(self.win['volume']['position']['slider'])
+        text = self.FindWindowById(self.win['volume']['position']['text'])
+        xydim = self._display.GetLongDim()
+        zdim = self._display.GetZRange()
+        zdim = zdim[1] - zdim[0]
+        x, y, z = self._display.GetVolumePosition(id)
+        
+        if axis == 0: # x
+            slider.SetRange(-3 * xydim, 3 * xydim)
+            slider.SetValue(x)
+            text.SetValue(x)
+        elif axis == 1: # y
+            slider.SetRange(-3 * xydim, 3 * xydim)
+            slider.SetValue(y)
+            text.SetValue(y)
+        else: # z
+            slider.SetRange(-3 * zdim, 3 * zdim)
+            slider.SetValue(z)
+            text.SetValue(z)
+            
+    def OnVolumePositionText(self, event):
+        """!Volume position changed by textctrl"""
+        self.OnVolumePosition(event)
+        self.OnVolumePositionChanged(None)
+        
+    def OnResetVolumePosition(self, event):
+        """!Reset position of volume"""
+        for win in self.win['volume']['position'].itervalues():
+            if win == self.win['volume']['position']['axis']:
+                self.FindWindowById(win).SetSelection(2) # Z
+            elif win == self.win['volume']['position']['reset']:
+                continue
+            else:
+                self.FindWindowById(win).SetValue(0)
+                
+        data = self.GetLayerData('volume')
+        data['volume']['position']['x'] = 0
+        data['volume']['position']['y'] = 0
+        data['volume']['position']['z'] = 0
+        data['volume']['position']['update'] = None
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def OnVolumeSliceAxes(self, event):
+        """!Slice axis changed"""
+        self.UpdateSliceLabels()
+        data = self.GetLayerData('volume')
+        list = self.FindWindowById(self.win['volume']['slices'])
+        sel = list.GetSelection()
+        if sel < 0:
+            return
+        axis = self.FindWindowById(self.win['volume']['slice']['axes']).GetSelection()
+        data['volume']['slice'][sel]['position']['axis'] = axis
+        data['volume']['slice'][sel]['position']['update'] = None
+        
+        axis = ("X", "Y", "Z")[axis]
+        list.SetString(sel, "%s %s" % (_("Slice parallel to"), axis))
+        list.Check(sel)
+        
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event) 
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+    
+    def OnSliceTransparency(self, event):
+        """!Slice transparency changed"""
+        data = self.GetLayerData('volume')
+        
+        list = self.FindWindowById(self.win['volume']['slices'])
+        sel = list.GetSelection()
+        if sel < 0:
+            return
+        
+        val = self.FindWindowById(self.win['volume']['slice']['transp']).GetValue()
+        data['volume']['slice'][sel]['transp']['value'] = self._getPercent(val, toPercent = False)
+        data['volume']['slice'][sel]['transp']['update'] = None
+        
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def OnSliceReset(self, event):
+        """!Slice position reset"""
+        data = self.GetLayerData('volume')
+        
+        list = self.FindWindowById(self.win['volume']['slices'])
+        sel = list.GetSelection()
+        if sel < 0:
+            return
+        
+        for coord, val in zip(('x1', 'x2', 'y1', 'y2', 'z1', 'z2'),(0, 1, 0, 1, 0, 1, 0)):
+            data['volume']['slice'][sel]['position'][coord] = val
+        data['volume']['slice'][sel]['position']['update'] = None
+        
+        self.UpdateVolumeSlicePage(data['volume']['slice'][sel])
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        
+    def OnSlicePositionChange(self, event):
+        """!Slice position is changing"""
+        data = self.GetLayerData('volume')
+        list = self.FindWindowById(self.win['volume']['slices'])
+        sel = list.GetSelection()
+        if sel < 0:
+            return
+        win = self.win['volume']['slice']
+        winId = event.GetId()
+        value = event.GetInt()/100.
+        
+        for coord in ('x1', 'x2', 'y1', 'y2', 'z1', 'z2'):
+            if win['slider_' + coord] == winId:
+                data['volume']['slice'][sel]['position'][coord] = value
+                data['volume']['slice'][sel]['position']['update'] = None
+                break
+        self.mapWindow.render['quick'] = True
+        # update properties
+        event = wxUpdateProperties(data = data)
+        wx.PostEvent(self.mapWindow, event) 
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+               
+    def OnSlicePositionChanged(self, event):
+        """!Slice position is changed"""
+        self.mapWindow.render['quick'] = False
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+                
+    def OnCPlaneSelection(self, event):
+        """!Cutting plane selected"""
+        plane = self.FindWindowById(self.win['cplane']['planes']).GetStringSelection()
+        try:
+            planeIndex = int(plane.split()[-1]) - 1
+            self.EnablePage("cplane", enabled = True)
+        except:
+            planeIndex = -1
+            self.EnablePage("cplane", enabled = False)
+        self.mapWindow.SelectCPlane(planeIndex)
+        if planeIndex >= 0:
+            self.mapWindow.UpdateCPlane(planeIndex, changes = ['rotation', 'position', 'shading'])
+
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+        self.UpdateCPlanePage(planeIndex)
+        
+    def OnCPlaneChanging(self, event):
+        """!Cutting plane is changing"""
+        plane = self.FindWindowById(self.win['cplane']['planes']).GetStringSelection()
+        try:
+            planeIndex = int(plane.split()[-1]) - 1
+        except:#TODO disabled page
+            planeIndex = -1
+    
+        if event.GetId() in (self.win['cplane']['rotation']['rot'].values() +
+                            self.win['cplane']['rotation']['tilt'].values()):
+            action = 'rotation'
+        else:
+            action = 'position'
+        data = self.mapWindow.cplanes[planeIndex][action]
+        self.OnScroll(event, self.win['cplane'][action], data)
+        
+        self.mapWindow.render['quick'] = True
+        event = wxUpdateCPlane(update = (action,), current = planeIndex)
+        wx.PostEvent(self.mapWindow, event)
+        
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+
+    def OnCPlaneChangeDone(self, event):
+        """!Cutting plane change done"""
+        self.mapWindow.render['quick'] = False
+        if self.mapDisplay.IsAutoRendered():
+            self.mapWindow.Refresh(False)
+            
+    def OnCPlaneChangeText(self, event):
+        """!Cutting plane changed by textctrl"""
+        for axis in ('x', 'y', 'z'):
+            if event.GetId() == self.win['cplane']['position'][axis]['text']:
+                value = self.FindWindowById(event.GetId()).GetValue()
+                slider = self.FindWindowById(self.win['cplane']['position'][axis]['slider'])
+                self.AdjustSliderRange(slider = slider, value = value)
+        self.OnCPlaneChanging(event = event)
+        self.OnCPlaneChangeDone(None)   
+        
+    def OnCPlaneShading(self, event):
+        """!Cutting plane shading changed"""
+        shading = self.FindWindowById(self.win['cplane']['shading']).GetSelection()
+        plane = self.FindWindowById(self.win['cplane']['planes']).GetStringSelection()
+        try:
+            planeIndex = int(plane.split()[-1]) - 1
+        except:#TODO disabled page
+            planeIndex = -1
+            
+        self.mapWindow.cplanes[planeIndex]['shading'] = shading
+        
+        event = wxUpdateCPlane(update = ('shading',), current = planeIndex)
+        wx.PostEvent(self.mapWindow, event)
+        
+        self.OnCPlaneChangeDone(None)
+        
+    def OnCPlaneReset(self, event):
+        """!Reset current cutting plane"""
+        plane = self.FindWindowById(self.win['cplane']['planes']).GetStringSelection()
+        try:
+            planeIndex = int(plane.split()[-1]) - 1
+        except:#TODO disabled page
+            planeIndex = -1
+
+        self.mapWindow.cplanes[planeIndex] = copy.deepcopy(UserSettings.Get(group = 'nviz',
+                                                                            key = 'cplane'))
+        self.mapWindow.cplanes[planeIndex]['on'] = True
+        event = wxUpdateCPlane(update = ('position','rotation','shading'), current = planeIndex)
+        wx.PostEvent(self.mapWindow, event)
+        self.OnCPlaneChangeDone(None)
+        self.UpdateCPlanePage(planeIndex)
+    
+    def OnDecorationPlacement(self, event):
+        """!Place an arrow/scalebar by clicking on display"""
+        if event.GetId() == self.win['decoration']['arrow']['place']:
+            type = 'arrow'
+        elif event.GetId() == self.win['decoration']['scalebar']['place']:
+            type = 'scalebar'
+        else: return
+        
+        if event.GetInt():
+            self.mapDisplay.Raise()
+            self.mapWindow.mouse['use'] = type
+            self.mapWindow.SetCursor(self.mapWindow.cursors["cross"])
+        else:
+            self.mapWindow.mouse['use'] = 'default'
+            self.mapWindow.SetCursor(self.mapWindow.cursors["default"])
+    
+    def OnArrowDelete(self, event):
+        """!Delete arrow"""
+        self._display.DeleteArrow()
+        self.mapWindow.decoration['arrow']['show'] = False
+        self.mapWindow.Refresh(False)
+    
+    def OnScalebarDelete(self, event):
+        """!Delete scalebar"""
+        try:
+            id = self.mapWindow.decoration['scalebar'][-1]['id']
+        except IndexError:
+            return
+        self._display.DeleteScalebar(id = id)
+        del self.mapWindow.decoration['scalebar'][-1]
+        
+        self.mapWindow.Refresh(False)   
+         
+    def OnDecorationProp(self, event):
+        """!Set arrow/scalebar properties"""
+        if event.GetId() in self.win['decoration']['arrow'].values():
+            type = 'arrow'
+        elif event.GetId() in self.win['decoration']['scalebar'].values():
+            type = 'scalebar'
+        else: return
+        
+        color = self.FindWindowById(self.win['decoration'][type]['color']).GetValue()
+        size = self.FindWindowById(self.win['decoration'][type]['size']).GetValue()
+        if type == 'arrow':
+            self.mapWindow.decoration[type]['color'] = self._getColorString(color)
+            self.mapWindow.decoration[type]['size'] = size
+        elif type == 'scalebar'and self.mapWindow.decoration['scalebar']:
+            self.mapWindow.decoration[type][-1]['color'] = self._getColorString(color)
+            self.mapWindow.decoration[type][-1]['size'] = size
+        
+        if type == 'arrow' and self.mapWindow.decoration['arrow']['show']:
+            self._display.SetArrow(self.mapWindow.decoration['arrow']['position']['x'],
+                                   self.mapWindow.decoration['arrow']['position']['y'],
+                                   self.mapWindow.decoration['arrow']['size'],
+                                   self.mapWindow.decoration['arrow']['color'])
+            self._display.DrawArrow()
+        elif type == 'scalebar' and self.mapWindow.decoration['scalebar']:
+            self._display.SetScalebar(self.mapWindow.decoration['scalebar'][-1]['id'],
+                                      self.mapWindow.decoration['scalebar'][-1]['position']['x'],
+                                      self.mapWindow.decoration['scalebar'][-1]['position']['y'],
+                                      self.mapWindow.decoration['scalebar'][-1]['size'],
+                                      self.mapWindow.decoration['scalebar'][-1]['color'])
+            self._display.DrawScalebar()
+            self.mapWindow.Refresh(False)
+        
+    def UpdatePage(self, pageId):
+        """!Update dialog (selected page)"""
+        self.pageChanging = True
+        Debug.msg(1, "NvizToolWindow.UpdatePage(): %s", pageId)
+        
+        if pageId == 'view':
+            self.SetPage('view')
+            hmin = self.mapWindow.iview['height']['min']
+            hmax = self.mapWindow.iview['height']['max']
+            hval = self.mapWindow.iview['height']['value']
+            zmin = self.mapWindow.view['z-exag']['min']
+            zmax = self.mapWindow.view['z-exag']['max']
+            zval = self.mapWindow.view['z-exag']['value']
+
+            for control in ('slider','text'):
+                try:
+                    self.FindWindowById(self.win['view']['height'][control]).SetRange(
+                                                                             hmin, hmax)
+                except OverflowError:
+                    hmin = self.mapWindow.iview['height']['min'] = 0
+                    hmax = self.mapWindow.iview['height']['max'] = 10000
+                    hval = self.mapWindow.iview['height']['value'] = 5000
+                    self.FindWindowById(self.win['view']['height'][control]).SetRange(hmin, hmax)
+                self.FindWindowById(self.win['view']['z-exag'][control]).SetRange(
+                                                                        zmin, zmax) 
+                self.FindWindowById(self.win['view']['height'][control]).SetValue(hval)                                      
+                
+                self.FindWindowById(self.win['view']['z-exag'][control]).SetValue(zval)                                      
+        
+            self.FindWindowById(self.win['view']['background']['color']).SetColour(\
+                            self.mapWindow.view['background']['color'])
+                            
+            tval = self.mapWindow.view['twist']['value']
+            pval = self.mapWindow.view['persp']['value']
+            for control in ('slider','text'):
+                self.FindWindowById(self.win['view']['twist'][control]).SetValue(tval)                                      
+                
+                self.FindWindowById(self.win['view']['persp'][control]).SetValue(pval)
+            
+            
+        elif pageId in ('surface', 'vector', 'volume'):
+            name = self.FindWindowById(self.win[pageId]['map']).GetValue()
+            data = self.GetLayerData(pageId)
+            if data:
+                if pageId == 'surface':
+                    layer = self.mapWindow.GetLayerByName(name, mapType = 'raster')
+                    if layer:
+                        self.UpdateSurfacePage(layer, data['surface'])
+                elif pageId == 'vector':
+                    layer = self.mapWindow.GetLayerByName(name, mapType = 'vector')
+                    if layer:
+                        self.UpdateVectorPage(layer, data['vector'])
+                elif pageId == 'volume':
+                    layer = self.mapWindow.GetLayerByName(name, mapType = '3d-raster')
+                    if layer:
+                        self.UpdateVolumePage(layer, data['volume'])
+        elif pageId == 'light':
+            zval = self.mapWindow.light['position']['z']
+            bval = self.mapWindow.light['bright']
+            aval = self.mapWindow.light['ambient']
+            for control in ('slider','text'):
+                self.FindWindowById(self.win['light']['z'][control]).SetValue(zval)
+                self.FindWindowById(self.win['light']['bright'][control]).SetValue(bval)
+                self.FindWindowById(self.win['light']['ambient'][control]).SetValue(aval)
+            self.FindWindowById(self.win['light']['color']).SetColour(self.mapWindow.light['color'])
+            self.FindWindowById(self.win['light']['position']).PostDraw()
+        elif pageId == 'fringe':
+            win = self.FindWindowById(self.win['fringe']['map'])
+            win.SetValue(self.FindWindowById(self.win['surface']['map']).GetValue())
+        elif pageId == 'decoration':
+            win = self.FindWindowById(self.win['decoration']['arrow']['size'])
+            win.SetValue(self.mapWindow.decoration['arrow']['size'])
+            win = self.FindWindowById(self.win['decoration']['scalebar']['size'])
+            win.SetValue(self.mapWindow._getDecorationSize())
+        elif pageId == 'constant':
+            if self.mapWindow.constants:
+                surface = self.FindWindowById(self.win['constant']['surface'])
+                for item in self.mapWindow.constants:
+                    surface.Append(_("constant#") + str(item['constant']['object']['name']))
+                surface.SetSelection(0)
+                self.OnConstantSelection(None)
+                self.EnablePage('constant', True)
+        elif pageId == 'cplane':
+            count = self._display.GetCPlanesCount()
+            choices = [_("None"),]
+            for plane in range(count):
+                choices.append("%s %i" % (_("Plane"), plane+1))
+            self.FindWindowById(self.win['cplane']['planes']).SetItems(choices)
+            current = 0
+            for i, cplane in enumerate(self.mapWindow.cplanes):
+                if cplane['on']:
+                    current = i + 1
+            self.FindWindowById(self.win['cplane']['planes']).SetSelection(current)
+            
+            xyRange, zRange = self._display.GetXYRange(), self._display.GetZRange()
+            if xyRange > 0: # GTK warning
+                self.FindWindowById(self.win['cplane']['position']['x']['slider']).SetRange(
+                                                                    -xyRange/2., xyRange/2.)
+                self.FindWindowById(self.win['cplane']['position']['y']['slider']).SetRange(
+                                                                    -xyRange/2., xyRange/2.)
+            if zRange[1] - zRange[0] > 1:
+                self.FindWindowById(self.win['cplane']['position']['z']['slider']).SetRange(zRange[0], zRange[1])
+            self.FindWindowById(self.win['cplane']['position']['z']['slider']).SetValue(zRange[0])
+            self.FindWindowById(self.win['cplane']['position']['z']['text']).SetValue(zRange[0])
+            self.OnCPlaneSelection(None)
+            
+        elif pageId == 'animation':
+            self.UpdateAnimationPage()
+            
+        self.Update()
+        self.pageChanging = False
+        
+    def UpdateAnimationPage(self):
+        """!Update animation page"""
+        # wrap help text according to tool window
+        help = self.FindWindowById(self.win['anim']['help'])
+        width = help.GetGrandParent().GetSizeTuple()[0]
+        help.Wrap(width - 15)
+        anim = self.mapWindow.GetAnimation()
+        if anim.Exists():
+            self.FindWindowById(self.win['anim']['play']).Enable()
+        else:
+            self.UpdateFrameIndex(index = 0)
+            
+        self.UpdateFrameCount()
+        
+        self.FindWindowById(self.win['anim']['play']).Disable()
+        self.FindWindowById(self.win['anim']['record']).Enable()
+        self.FindWindowById(self.win['anim']['pause']).Disable()
+        self.FindWindowById(self.win['anim']['stop']).Disable()
+        self.FindWindowById(self.win['anim']['frameIndex']['slider']).Disable()
+        self.FindWindowById(self.win['anim']['frameIndex']['text']).Disable()
+        
+    def UpdateCPlanePage(self, index):
+        """!Update widgets according to selected clip plane"""
+        if index == -1:   
+            return
+        data = self.mapWindow.cplanes[index]
+        for widget in ('text', 'slider'):
+            for axes in ('x', 'y', 'z'):
+                self.FindWindowById(self.win['cplane']['position'][axes][widget]).SetValue(data['position'][axes])
+            for each in ('tilt', 'rot'):
+                self.FindWindowById(self.win['cplane']['rotation'][each][widget]).SetValue(data['rotation'][each])
+        self.FindWindowById(self.win['cplane']['shading']).SetSelection(data['shading'])
+                
+    def UpdateSurfacePage(self, layer, data, updateName = True):
+        """!Update surface page"""
+        desc = grass.raster_info(layer.name)['title']
+        if updateName:
+            self.FindWindowById(self.win['surface']['map']).SetValue(layer.name)
+        self.FindWindowById(self.win['surface']['desc']).SetLabel(desc)
+        
+        # attributes
+        if layer and layer.type == 'raster':
+            self.vetoGSelectEvt = True
+            self.FindWindowById(self.win['surface']['color']['map']).SetValue(layer.name)
+        else:
+            self.FindWindowById(self.win['surface']['color']['map']).SetValue('')
+
+        self.SetMapObjUseMap(nvizType = 'surface',
+                             attrb = 'color', map = True) # -> map
+                                
+        if 'color' in data['attribute']:
+            value = data['attribute']['color']['value']
+
+            if data['attribute']['color']['map']:
+                self.FindWindowById(self.win['surface']['color']['map']).SetValue(value)
+            else: # constant
+                color = map(int, value.split(':'))
+                self.FindWindowById(self.win['surface']['color']['const']).SetColour(color)
+            self.SetMapObjUseMap(nvizType = 'surface',
+                                 attrb = 'color', map = data['attribute']['color']['map'])
+
+        self.SetMapObjUseMap(nvizType = 'surface',
+                             attrb = 'shine', map = data['attribute']['shine']['map'])
+        value = data['attribute']['shine']['value']
+        if data['attribute']['shine']['map']:
+            self.FindWindowById(self.win['surface']['shine']['map']).SetValue(value)
+        else:
+            self.FindWindowById(self.win['surface']['shine']['const']).SetValue(self._getPercent(value))
+        if 'transp' in data['attribute']:  
+            value = data['attribute']['transp']['value']  
+            if data['attribute']['transp']['map']:
+                self.FindWindowById(self.win['surface']['color']['map']).SetValue(value)
+            else:
+                self.FindWindowById(self.win['surface']['transp']['const']).SetValue(self._getPercent(value))
+            self.SetMapObjUseMap(nvizType = 'surface', attrb = 'transp', map = data['attribute']['transp']['map'])
+        else:
+            self.SetMapObjUseMap(nvizType = 'surface', attrb = 'transp', map = None)
+        #
+        # draw
+        #
+        for control, drawData in data['draw'].iteritems():
+            if control == 'all': # skip 'all' property
+                continue
+            if control == 'resolution':
+                self.FindWindowById(self.win['surface']['draw']['res-coarse']).SetValue(drawData['coarse'])
+                self.FindWindowById(self.win['surface']['draw']['res-fine']).SetValue(drawData['fine'])
+                continue
+            
+            if control == 'mode':
+                if drawData['desc']['mode'] == 'coarse':
+                    self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(0)
+                elif drawData['desc']['mode'] == 'fine':
+                    self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(1)
+                else: # both
+                    self.FindWindowById(self.win['surface']['draw']['mode']).SetSelection(2)
+                
+                if drawData['desc']['style'] == 'wire':
+                    self.FindWindowById(self.win['surface']['draw']['style']).SetSelection(0)
+                else: # surface
+                    self.FindWindowById(self.win['surface']['draw']['style']).SetSelection(1)
+                
+                if drawData['desc']['shading'] == 'flat':
+                    self.FindWindowById(self.win['surface']['draw']['shading']).SetSelection(0)
+                else: # gouraud
+                    self.FindWindowById(self.win['surface']['draw']['shading']).SetSelection(1)
+                
+                continue
+            
+            value = drawData['value']
+            win = self.FindWindowById(self.win['surface']['draw'][control])
+            
+            name = win.GetName()
+            
+            if name == "selection":
+                win.SetSelection(value)
+            elif name == "colour":
+                color = map(int, value.split(':'))
+                win.SetColour(color)
+            else:
+                win.SetValue(value)
+        #
+        # position
+        #
+        self.OnSurfaceAxis(None)
+
+        # enable/disable res widget + set draw mode
+        self.OnSurfaceMode(event = None)
+        
+    def UpdateVectorPage(self, layer, data, updateName = True):
+        """!Update vector page"""
+        vInfo = grass.vector_info_topo(layer.GetName())
+        if not vInfo:
+            return
+        if vInfo['map3d']:
+            desc = _("Vector map is 3D")
+            enable = False
+        else:
+            desc = _("Vector map is 2D")
+            enable = True
+        desc += " - " + _("%(features)d features (%(points)d points)") % \
+            { 'features' : vInfo['primitives'], 'points' : vInfo['points']}
+        
+        if updateName:
+            self.FindWindowById(self.win['vector']['map']).SetValue(layer.name)
+        self.FindWindowById(self.win['vector']['desc']).SetLabel(desc)
+        
+        self.FindWindowById(self.win['vector']['lines']['flat']).Enable(enable)
+        for v in ('lines', 'points'):
+            self.FindWindowById(self.win['vector'][v]['surface']).Enable(enable)
+            self.FindWindowById(self.win['vector'][v]['height']['slider']).Enable(enable)
+            self.FindWindowById(self.win['vector'][v]['height']['text']).Enable(enable)
+            
+        #
+        # lines
+        #
+        showLines = self.FindWindowById(self.win['vector']['lines']['show'])
+        if 'object' in data['lines']:
+            showLines.SetValue(True)
+        else:
+            showLines.SetValue(False)
+        if (vInfo['lines'] + vInfo['boundaries']) > 0:
+            showLines.Enable(True)
+        else:
+            showLines.Enable(False)
+        
+        self.UpdateVectorShow('lines', showLines.IsChecked())
+        
+        width = self.FindWindowById(self.win['vector']['lines']['width'])
+        width.SetValue(data['lines']['width']['value'])
+        
+        color = self.FindWindowById(self.win['vector']['lines']['color'])
+        color.SetValue(map(int, data['lines']['color']['value'].split(':')))
+        
+        for vtype in ('lines', 'points'):
+            if vtype == 'lines':
+                display = self.FindWindowById(self.win['vector']['lines']['flat'])
+                if data[vtype]['mode']['type'] == 'flat':
+                    display.SetSelection(1)
+                else:
+                    display.SetSelection(0)
+            if data[vtype]['mode']['type'] == 'surface':
+                rasters = self.mapWindow.GetLayerNames('raster')
+                constants = self.mapWindow.GetLayerNames('constant')
+                surfaces = rasters + constants
+                surfaceWin = self.FindWindowById(self.win['vector'][vtype]['surface'])
+                surfaceWin.SetItems(surfaces)
+                for idx, surface in enumerate(surfaces):
+                    try:# TODO fix this mess
+                        selected = data[vtype]['mode']['surface']['show'][idx]
+                    except (TypeError, IndexError, KeyError):
+                        selected = False
+                    surfaceWin.Check(idx, selected)
+
+        for type in ('slider', 'text'):
+            win = self.FindWindowById(self.win['vector']['lines']['height'][type])
+            win.SetValue(data['lines']['height']['value'])
+        
+        #
+        # points
+        #
+        showPoints = self.FindWindowById(self.win['vector']['points']['show'])
+        
+        if 'object' in data['points']:
+            showPoints.SetValue(True)
+        else:
+            showPoints.SetValue(False)
+        if (vInfo['points'] + vInfo['centroids']) > 0:
+            showPoints.Enable(True)
+        else:
+            showPoints.Enable(False)
+        
+        self.UpdateVectorShow('points', showPoints.IsChecked())
+        # size, width, marker, color
+        for prop in ('size', 'marker', 'color'):
+            win = self.FindWindowById(self.win['vector']['points'][prop])
+            name = win.GetName()
+            if name == 'selection':
+                win.SetSelection(data['points'][prop]['value'])
+            elif name == 'color':
+                color = map(int, data['points'][prop]['value'].split(':'))
+                win.SetValue(color)
+            else:
+                win.SetValue(data['points'][prop]['value'])
+            
+        # height
+        for type in ('slider', 'text'):
+            win = self.FindWindowById(self.win['vector']['points']['height'][type])
+            win.SetValue(data['points']['height']['value'])
+        
+    def UpdateVolumePage(self, layer, data, updateName = True):
+        """!Update volume page"""
+        if updateName:
+            self.FindWindowById(self.win['volume']['map']).SetValue(layer.name)
+        
+        # draw
+        for control, idata in data['draw'].iteritems():
+            if control == 'all': # skip 'all' property
+                continue
+                
+            win = self.FindWindowById(self.win['volume']['draw'][control])
+            if control == 'mode':
+                value = data['draw']['mode']['value']
+            if control == 'shading':
+                if data['draw']['shading'][data['draw']['mode']['desc']]['desc'] == 'flat':
+                    value = 0
+                else:
+                    value = 1
+            if control == 'resolution':
+                value = idata[data['draw']['mode']['desc']]['value']
+            
+            if win.GetName() == "selection":
+                win.SetSelection(value)
+            else:
+                win.SetValue(value)
+                
+        self.OnVolumeMode(None)
+        id = data['object']['id']
+        if data['draw']['mode']['desc'] == 'isosurface':
+            self._display.SetIsosurfaceMode(id, data['draw']['shading']['isosurface']['value'])
+            self._display.SetIsosurfaceRes(id, data['draw']['resolution']['isosurface']['value'])
+        else:
+            self._display.SetSliceMode(id, data['draw']['shading']['slice']['value'])
+            self._display.SetSliceRes(id, data['draw']['resolution']['slice']['value'])
+        box = self.FindWindowById(self.win['volume']['isosurfs'])
+        
+        if data['draw']['mode']['desc'] == 'isosurface':
+            isosurfaces = []
+            for iso in data['isosurface']:
+                level = iso['topo']['value']
+                isosurfaces.append("%s %s" % (_("Level"), level))
+            box.Set(isosurfaces)
+            for i in range(len(isosurfaces)):
+                box.Check(i)
+            if data['isosurface']:
+                box.SetSelection(0)
+                self.UpdateVolumeIsosurfPage(data['isosurface'][0])
+            else:
+                self.UpdateVolumeIsosurfPage(data['attribute'])
+        else:
+            slices = []
+            for slice in data['slice']:
+                axis = ("X", "Y", "Z")[slice['position']['axis']]
+                slices.append("%s %s" % (_("Slice parallel to"), axis))
+            box.Set(slices)
+            for i in range(len(slices)):
+                box.Check(i)
+            if data['slice']:
+                box.SetSelection(0)
+                self.UpdateVolumeSlicePage(data['slice'][0])
+            else:
+                self.UpdateVolumeSlicePage(None)
+        #
+        # position
+        #
+        if 'z' in data['position']:
+            zval = data['position']['z']
+            self.FindWindowById(self.win['volume']['position']['axis']).SetSelection(2)
+            for control in ('slider','text'):
+                    self.FindWindowById(self.win['volume']['position'][control]).SetValue(zval)
+        # set topo range
+        mapRange = self._get3dRange(name = layer.name)
+        desc = self.FindWindowById(self.win['volume']['desc'])
+        desc.SetLabel("%s %.2f - %.2f" % (_("range:"), mapRange[0], mapRange[1]))
+        
+    def UpdateVolumeIsosurfPage(self, data):
+        """!Update dialog -- isosurface attributes"""
+        #
+        # isosurface attributes
+        #
+        for attrb in ('topo', 'color', 'mask',
+                     'transp', 'shine'):
+            # skip empty attributes
+            if attrb not in data:
+                self.SetMapObjUseMap(nvizType = 'volume', attrb = attrb, map = None)
+                continue     
+            
+            value = data[attrb]['value']
+            if attrb == 'color':
+                if data[attrb]['map']:
+                    self.FindWindowById(self.win['volume'][attrb]['map']).SetValue(value)
+                else: # constant
+                    color = map(int, value.split(':'))
+                    self.FindWindowById(self.win['volume'][attrb]['const']).SetColour(color)
+            else:
+                if data[attrb]['map']:
+                    self.vetoGSelectEvt = True
+                    win = self.FindWindowById(self.win['volume'][attrb]['map'])
+                    win.SetValue(value)
+                else:
+                    if value:
+                        win = self.FindWindowById(self.win['volume'][attrb]['const'])
+                        if attrb == 'topo':
+                            win.SetValue(float(value))
+                        else:
+                            win.SetValue(self._getPercent(value))
+                    
+            self.SetMapObjUseMap(nvizType = 'volume',
+                                 attrb = attrb, map = data[attrb]['map'])
+        # set inout
+        if 'inout' in data:
+            self.FindWindowById(self.win['volume']['inout']).SetValue(data['inout'])
+            
+    def UpdateVolumeSlicePage(self, data):
+        """!Update dialog -- slice attributes"""
+        if data:
+            for coord in ('x1', 'x2', 'y1', 'y2', 'z1', 'z2'):
+                win = self.FindWindowById(self.win['volume']['slice']['slider_' + coord])
+                win.Enable()
+                win.SetValue(data['position'][coord] * 100)
+            win = self.FindWindowById(self.win['volume']['slice']['axes'])
+            win.SetSelection(data['position']['axis'])
+            win.Enable()
+            
+            win = self.FindWindowById(self.win['volume']['slice']['transp'])
+            win.SetValue(self._getPercent(data['transp']['value']))
+            win.Enable()
+            self.FindWindowById(self.win['volume']['slice']['reset']).Enable()
+        else:
+            for coord in ('x1', 'x2', 'y1', 'y2', 'z1', 'z2'):
+                self.FindWindowById(self.win['volume']['slice']['slider_' + coord]).Disable()
+            self.FindWindowById(self.win['volume']['slice']['axes']).Disable()
+            self.FindWindowById(self.win['volume']['slice']['transp']).Disable()
+            self.FindWindowById(self.win['volume']['slice']['reset']).Disable()
+        
+        self.UpdateSliceLabels()
+        
+    def UpdateSliceLabels(self):
+        """!Update text labels of slice controls according to axis"""
+        sel = self.FindWindowById(self.win['volume']['slice']['axes']).GetSelection()
+        if sel == 0:
+            self.FindWindowByName('label_edge_0').SetLabel(_("North edge:"))
+            self.FindWindowByName('label_edge_1').SetLabel(_("South edge:"))
+            self.FindWindowByName('label_edge_2').SetLabel(_("West edge:"))
+            self.FindWindowByName('label_edge_3').SetLabel(_("East edge:"))
+            
+            self.FindWindowByName('label_coord_0').SetLabel(_("Northing (Y):"))
+            self.FindWindowByName('label_coord_1').SetLabel(_("Height (Z):"))
+            self.FindWindowByName('label_coord_2').SetLabel(_("Easting (X):"))
+        elif sel == 1:
+            self.FindWindowByName('label_edge_0').SetLabel(_("West edge:"))
+            self.FindWindowByName('label_edge_1').SetLabel(_("East edge:"))
+            self.FindWindowByName('label_edge_2').SetLabel(_("North edge:"))
+            self.FindWindowByName('label_edge_3').SetLabel(_("South edge:"))
+            
+            self.FindWindowByName('label_coord_0').SetLabel(_("Easting (X):"))
+            self.FindWindowByName('label_coord_1').SetLabel(_("Height (Z):"))
+            self.FindWindowByName('label_coord_2').SetLabel(_("Northing (Y):"))
+        else:
+            self.FindWindowByName('label_edge_0').SetLabel(_("West edge:"))
+            self.FindWindowByName('label_edge_1').SetLabel(_("East edge:"))
+            self.FindWindowByName('label_edge_2').SetLabel(_("Bottom edge:"))
+            self.FindWindowByName('label_edge_3').SetLabel(_("Top edge:"))  
+            
+            self.FindWindowByName('label_coord_0').SetLabel(_("Easting (X):"))
+            self.FindWindowByName('label_coord_1').SetLabel(_("Northing (Y):"))
+            self.FindWindowByName('label_coord_2').SetLabel(_("Height (Z):")) 
+        
+    def SetPage(self, name):
+        """!Get named page"""
+        if name == 'view':
+            self.SetSelection(0)
+        elif name in ('surface', 'vector', 'volume'):
+            self.SetSelection(1)
+        else:
+            self.SetSelection(2)
+
+        win = self.FindWindowById(self.page[name]['notebook'])
+        try:
+            win.Expand(win.GetFoldPanel(self.page[name]['id']))
+            self.UpdateScrolling((win.GetFoldPanel(self.page[name]['id']).GetGrandParent(),))
+        except AttributeError:
+            win.SetSelection(self.page[name]['id'])
+
+class PositionWindow(wx.Window):
+    """!Abstract position control window, see subclasses
+    ViewPostionWindow and LightPositionWindow"""
+    def __init__(self, parent, mapwindow, id = wx.ID_ANY,
+                 **kwargs):
+        self.mapWindow = mapwindow
+        self.quick = True
+        
+        wx.Window.__init__(self, parent, id, **kwargs)
+        
+        self.SetBackgroundColour("WHITE")
+        
+        self.pdc = wx.PseudoDC()
+        
+        self.pdc.SetBrush(wx.Brush(colour = 'dark green', style = wx.SOLID))
+        self.pdc.SetPen(wx.Pen(colour = 'dark green', width = 2, style = wx.SOLID))
+
+        self.Bind(wx.EVT_ERASE_BACKGROUND, lambda x: None)
+        self.Bind(wx.EVT_PAINT, self.OnPaint)
+        # self.Bind(wx.EVT_MOTION,       self.OnMouse)
+        self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
+        
+    def Draw(self, pos, scale = False):
+        w, h = self.GetClientSize()
+        x, y = pos
+        if scale:
+            x = x * w
+            y = y * h
+        self.pdc.Clear()
+        self.pdc.BeginDrawing()
+        self.pdc.DrawLine(w / 2, h / 2, x, y)
+        self.pdc.DrawCircle(x, y, 5)
+        self.pdc.EndDrawing()
+        
+    def OnPaint(self, event):
+        dc = wx.BufferedPaintDC(self)
+        dc.SetBackground(wx.Brush("White"))
+        dc.Clear()
+        
+        self.PrepareDC(dc)
+        self.pdc.DrawToDC(dc)
+        
+    def UpdatePos(self, xcoord, ycoord):
+        """!Update position coordinates (origin: UL)"""
+        if xcoord < 0.0:
+            xcoord = 0.0
+        elif xcoord > 1.0:
+            xcoord = 1.0
+        if ycoord < 0.0:
+            ycoord = 0.0
+        elif ycoord > 1.0:
+            ycoord = 1.0
+        
+        x, y = self.TransformCoordinates(xcoord, ycoord)
+        self.data['position']['x'] = x        
+        self.data['position']['y'] = y
+        
+        return xcoord, ycoord
+    
+    def OnMouse(self, event):
+        if event.LeftIsDown():
+            x, y = event.GetPosition()
+            self.Draw(pos = (x, y))
+            w, h = self.GetClientSize()
+            x = float(x) / w
+            y = float(y) / h
+            self.UpdatePos(x, y)
+            self.Refresh(False)
+        
+        event.Skip()
+        
+    def PostDraw(self):
+        x, y = self.UpdatePos(self.data['position']['x'],
+                              self.data['position']['y'])
+        
+        self.Draw(pos = (x,y), scale = True)
+
+class ViewPositionWindow(PositionWindow):
+    """!View position control widget"""
+    def __init__(self, parent, mapwindow, id = wx.ID_ANY,
+                 **kwargs):
+        PositionWindow.__init__(self, parent, mapwindow, id, **kwargs)
+        self.SetToolTipString(_("Adjusts the distance and direction of the image viewpoint"))
+        self.data = self.mapWindow.view
+        self.PostDraw()
+        
+    def UpdatePos(self, xcoord, ycoord):
+        x, y = PositionWindow.UpdatePos(self, xcoord, ycoord)
+        
+        event = wxUpdateView(zExag = True)
+        wx.PostEvent(self.mapWindow, event)
+
+        return x, y
+    
+    def TransformCoordinates(self, x, y, toLight = True):
+        return x, y
+        
+    def OnMouse(self, event):
+        self.mapWindow.iview['dir']['use'] = False # use focus instead of viewdir
+        PositionWindow.OnMouse(self, event)
+        if event.LeftIsDown():
+            self.mapWindow.render['quick'] = self.quick
+            self.mapWindow.Refresh(eraseBackground = False)
+        elif event.LeftUp():
+            self.mapWindow.render['quick'] = False
+            self.mapWindow.Refresh(eraseBackground = False)
+        
+        event.Skip()
+
+class LightPositionWindow(PositionWindow):
+    """!Light position control widget"""
+    def __init__(self, parent, mapwindow, id = wx.ID_ANY,
+                 **kwargs):
+        PositionWindow.__init__(self, parent, mapwindow, id, **kwargs)
+        self.SetToolTipString(_("Adjusts the light direction. "
+                                "Click and drag the puck to change the light direction."))
+        
+        self.data = self.mapWindow.light
+        self.quick = False
+        self.PostDraw()
+
+    def UpdatePos(self, xcoord, ycoord):
+        x, y = PositionWindow.UpdatePos(self, xcoord, ycoord)
+        
+        event = wxUpdateLight(refresh = False)
+        wx.PostEvent(self.mapWindow, event)
+        
+        return x, y
+    
+    def TransformCoordinates(self, x, y, toLight = True):
+        if toLight:
+            x = 2 * x - 1
+            y = -2 * y + 1
+        else:
+            x = (x + 1)/2
+            y = (1 - y)/2
+        return x, y
+    
+    def PostDraw(self):
+        event = wxUpdateLight(refresh = True)
+        wx.PostEvent(self.mapWindow, event)
+        x, y = self.data['position']['x'], self.data['position']['y']
+        x, y = self.TransformCoordinates(x, y, toLight = False)
+        
+        self.Draw(pos = (x,y), scale = True)
+        
+    def OnMouse(self, event):
+        PositionWindow.OnMouse(self, event)
+        if event.LeftUp():
+            self.mapWindow.render['quick'] = False
+            self.mapWindow.Refresh(eraseBackground = False)
diff --git a/gui/wxpython/nviz/workspace.py b/gui/wxpython/nviz/workspace.py
new file mode 100644
index 0000000..6c0d9af
--- /dev/null
+++ b/gui/wxpython/nviz/workspace.py
@@ -0,0 +1,325 @@
+"""!
+ at package nviz.workspace
+
+ at brief wxNviz workspace settings
+
+Classes:
+ - workspace::NvizSettings
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Anna Kratochvilova <kratochanna gmail.com> (wxNviz / Google SoC 2011)
+"""
+
+import copy
+
+from core.settings import UserSettings
+
+try:
+    from nviz import wxnviz
+except ImportError:
+    wxnviz = None
+
+class NvizSettings(object):
+    def __init__(self):
+        pass
+        
+    def SetConstantDefaultProp(self):
+        """Set default constant data properties"""
+        data = dict()
+        for key, value in UserSettings.Get(group='nviz', key='constant').iteritems():
+            data[key] = value
+        color = str(data['color'][0]) + ':' + str(data['color'][1]) + ':' + str(data['color'][2])
+        data['color'] = color
+
+        return data
+    
+    def SetSurfaceDefaultProp(self, data = None):
+        """Set default surface data properties"""
+        if not data:
+            data = dict()
+        for sec in ('attribute', 'draw', 'mask', 'position'):
+            data[sec] = {}
+        
+        #
+        # attributes
+        #
+        for attrb in ('shine', ):
+            data['attribute'][attrb] = {}
+            for key, value in UserSettings.Get(group='nviz', key='surface',
+                                               subkey=attrb).iteritems():
+                data['attribute'][attrb][key] = value
+            data['attribute'][attrb]['update'] = None
+        
+        #
+        # draw
+        #
+        data['draw']['all'] = False # apply only for current surface
+        for control, value in UserSettings.Get(group='nviz', key='surface', subkey='draw').iteritems():
+            if control[:3] == 'res':
+                if 'resolution' not in data['draw']:
+                    data['draw']['resolution'] = {}
+                if 'update' not in data['draw']['resolution']:
+                    data['draw']['resolution']['update'] = None
+                data['draw']['resolution'][control[4:]] = value
+                continue
+            
+            if control == 'wire-color':
+                value = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
+            elif control in ('mode', 'style', 'shading'):
+                if 'mode' not in data['draw']:
+                    data['draw']['mode'] = {}
+                continue
+
+            data['draw'][control] = { 'value' : value }
+            data['draw'][control]['update'] = None
+        
+        value, desc = self.GetDrawMode(UserSettings.Get(group='nviz', key='surface', subkey=['draw', 'mode']),
+                                       UserSettings.Get(group='nviz', key='surface', subkey=['draw', 'style']),
+                                       UserSettings.Get(group='nviz', key='surface', subkey=['draw', 'shading']))
+    
+        data['draw']['mode'] = { 'value' : value,
+                                 'desc' : desc, 
+                                 'update': None }
+        # position
+        for coord in ('x', 'y', 'z'):
+            data['position'][coord] = UserSettings.Get(group='nviz', key='surface', subkey=['position', coord])
+        data['position']['update'] = None
+            
+        return data
+    
+    def SetVolumeDefaultProp(self):
+        """Set default volume data properties"""
+        data = dict()
+        for sec in ('attribute', 'draw', 'position'):
+            data[sec] = dict()
+            for sec in ('isosurface', 'slice'):
+                    data[sec] = list()
+        
+        #
+        # draw
+        #
+        for control, value in UserSettings.Get(group='nviz', key='volume', subkey='draw').iteritems():
+            if control == 'shading':
+                sel = UserSettings.Get(group='nviz', key='volume', subkey=['draw', 'shading'])
+                value, desc = self.GetDrawMode(shade=sel, string=False)
+                
+                data['draw']['shading'] = {}
+                data['draw']['shading']['isosurface'] = { 'value' : value,
+                                                          'desc' : desc['shading'] }
+                data['draw']['shading']['slice'] = { 'value' : value,
+                                                     'desc' : desc['shading'] }
+            elif control == 'mode':
+                sel = UserSettings.Get(group='nviz', key='volume', subkey=['draw', 'mode'])
+                if sel == 0:
+                    desc = 'isosurface'
+                else:
+                    desc = 'slice'
+                data['draw']['mode'] = { 'value' : sel,
+                                         'desc' : desc, }
+            else:
+                data['draw'][control] = {}
+                data['draw'][control]['isosurface'] = { 'value' : value }
+                data['draw'][control]['slice'] = { 'value' : value }
+
+            if 'update' not in data['draw'][control]:
+                data['draw'][control]['update'] = None
+        
+        #
+        # isosurface attributes
+        #
+        for attrb in ('shine', ):
+            data['attribute'][attrb] = {}
+            for key, value in UserSettings.Get(group='nviz', key='volume',
+                                               subkey=attrb).iteritems():
+                data['attribute'][attrb][key] = value
+        
+        return data
+    
+    def SetIsosurfaceDefaultProp(self):
+        """!Set default isosurface properties"""
+        data = dict()
+        for attr in ('shine', 'topo', 'transp', 'color'):
+            data[attr] = {}
+            for key, value in UserSettings.Get(group = 'nviz', key = 'volume',
+                                               subkey = attr).iteritems():
+                data[attr][key] = value
+            data[attr]['update'] = None
+        return data
+    
+    def SetSliceDefaultProp(self):
+        """!Set default slice properties"""
+        data = dict()
+        data['position'] = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'volume',
+                                               subkey = 'slice_position'))
+        data['position']['update'] = None
+        
+        data['transp'] = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'volume',
+                                               subkey = 'transp'))
+        return data
+    
+    def SetVectorDefaultProp(self, data = None):
+        """Set default vector data properties"""
+        if not data:
+            data = dict()
+        for sec in ('lines', 'points'):
+            data[sec] = {}
+        
+        self.SetVectorLinesDefaultProp(data['lines'])
+        self.SetVectorPointsDefaultProp(data['points'])
+
+        return data
+    
+    def SetVectorLinesDefaultProp(self, data):
+        """Set default vector properties -- lines"""
+        # width
+        data['width'] = {'value' : UserSettings.Get(group='nviz', key='vector',
+                                                    subkey=['lines', 'width']) }
+        
+        # color
+        value = UserSettings.Get(group='nviz', key='vector',
+                                 subkey=['lines', 'color'])
+        color = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
+        data['color'] = { 'value' : color }
+
+        # mode
+        if UserSettings.Get(group='nviz', key='vector',
+                            subkey=['lines', 'flat']):
+            type = 'flat'
+            
+        else:
+            type = 'surface'
+            
+        data['mode'] = {}
+        data['mode']['type'] = type
+        data['mode']['update'] = None
+    
+        # height
+        data['height'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
+                                                      subkey=['lines', 'height']) }
+        if 'object' in data:
+            for attrb in ('color', 'width', 'mode', 'height'):
+                data[attrb]['update'] = None
+        
+    def SetVectorPointsDefaultProp(self, data):
+        """Set default vector properties -- points"""
+        # size
+        data['size'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
+                                                    subkey=['points', 'size']) }
+
+        # width
+        data['width'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
+                                                     subkey=['points', 'width']) }
+
+        # marker
+        data['marker'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
+                                                      subkey=['points', 'marker']) }
+
+        # color
+        value = UserSettings.Get(group='nviz', key='vector',
+                                 subkey=['points', 'color'])
+        color = str(value[0]) + ':' + str(value[1]) + ':' + str(value[2])
+        data['color'] = { 'value' : color }
+
+        # mode
+        data['mode'] = { 'type' : 'surface'}
+##                         'surface' : '', }
+        
+        # height
+        data['height'] = { 'value' : UserSettings.Get(group='nviz', key='vector',
+                                                      subkey=['points', 'height']) }
+        
+        if 'object' in data:
+            for attrb in ('size', 'width', 'marker', 'color', 'height'):
+                data[attrb]['update'] = None
+        
+    def GetDrawMode(self, mode=None, style=None, shade=None, string=False):
+        """Get surface draw mode (value) from description/selection
+
+        @param mode,style,shade modes
+        @param string if True input parameters are strings otherwise
+        selections
+        """
+        if not wxnviz:
+            return None
+        
+        value = 0
+        desc = {}
+
+        if string:
+            if mode is not None:
+                if mode == 'coarse':
+                    value |= wxnviz.DM_WIRE
+                elif mode == 'fine':
+                    value |= wxnviz.DM_POLY
+                else: # both
+                    value |= wxnviz.DM_WIRE_POLY
+
+            if style is not None:
+                if style == 'wire':
+                    value |= wxnviz.DM_GRID_WIRE
+                else: # surface
+                    value |= wxnviz.DM_GRID_SURF
+                    
+            if shade is not None:
+                if shade == 'flat':
+                    value |= wxnviz.DM_FLAT
+                else: # surface
+                    value |= wxnviz.DM_GOURAUD
+
+            return value
+
+        # -> string is False
+        if mode is not None:
+            if mode == 0: # coarse
+                value |= wxnviz.DM_WIRE
+                desc['mode'] = 'coarse'
+            elif mode == 1: # fine
+                value |= wxnviz.DM_POLY
+                desc['mode'] = 'fine'
+            else: # both
+                value |= wxnviz.DM_WIRE_POLY
+                desc['mode'] = 'both'
+
+        if style is not None:
+            if style == 0: # wire
+                value |= wxnviz.DM_GRID_WIRE
+                desc['style'] = 'wire'
+            else: # surface
+                value |= wxnviz.DM_GRID_SURF
+                desc['style'] = 'surface'
+
+        if shade is not None:
+            if shade == 0:
+                value |= wxnviz.DM_FLAT
+                desc['shading'] = 'flat'
+            else: # surface
+                value |= wxnviz.DM_GOURAUD
+                desc['shading'] = 'gouraud'
+        
+        return (value, desc)
+    
+    def SetDecorDefaultProp(self, type):
+        """!Set default arrow properties
+        """
+        data = {}
+        
+        # arrow
+        if type == 'arrow':
+            data['arrow'] = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'arrow'))
+            data['arrow']['color'] = "%d:%d:%d" % (
+                UserSettings.Get(group = 'nviz', key = 'arrow', subkey = 'color')[:3])
+            data['arrow'].update(copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'arrow', internal = True)))
+            data['arrow']['show'] = False
+        
+        # arrow
+        if type == 'scalebar':
+            data['scalebar'] = copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'scalebar'))
+            data['scalebar']['color'] = "%d:%d:%d" % (
+                UserSettings.Get(group = 'nviz', key = 'scalebar', subkey = 'color')[:3])
+            data['scalebar'].update(copy.deepcopy(UserSettings.Get(group = 'nviz', key = 'scalebar', internal = True)))
+            data['scalebar']['id'] = 0
+        return data
diff --git a/gui/wxpython/gui_modules/wxnviz.py b/gui/wxpython/nviz/wxnviz.py
similarity index 57%
rename from gui/wxpython/gui_modules/wxnviz.py
rename to gui/wxpython/nviz/wxnviz.py
index 0bfaf50..c87d605 100644
--- a/gui/wxpython/gui_modules/wxnviz.py
+++ b/gui/wxpython/nviz/wxnviz.py
@@ -1,36 +1,55 @@
 """!
- at package wxnviz.py
+ at package nviz.wxnviz
 
- at brief wxGUI 3D view mode
+ at brief wxGUI 3D view mode (ctypes-based classes)
 
-This module implements 3D visualization mode for map display.
+This module implements 3D visualization mode for map display (ctypes
+required).
 
 List of classes:
- - Nviz
+ - wxnviz::Nviz
+ - wxnviz::Texture
+ - wxnviz::ImageTexture
+ - wxnviz::TextTexture
 
-(C) 2008-2010 by the GRASS Development Team
+(C) 2008-2011 by the GRASS Development Team
 
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Martin Landa <landa.martin gmail.com> (Google SoC 2008/2010)
 @author Pythonized by Glynn Clements
+ at author Anna Kratochvilova <KratochAnna seznam.cz> (Google SoC 2011)
 """
 
 import sys
-from threading import Thread
+import locale
+import struct
+from math  import sqrt
+try:
+    from numpy import matrix
+except ImportError:
+    msg = _("This module requires the NumPy module, which could not be "
+            "imported. It probably is not installed (it's not part of the "
+            "standard Python distribution). See the Numeric Python site "
+            "(http://numpy.scipy.org) for information on downloading source or "
+            "binaries.")
+    print >> sys.stderr, "wxnviz.py: " + msg
+
+import wx
 
 from ctypes import *
 try:
-    from grass.lib.gis   import *
-    from grass.lib.g3d   import *
-    from grass.lib.ogsf  import *
-    from grass.lib.nviz  import *
+    from grass.lib.gis      import *
+    from grass.lib.g3d      import *
+    from grass.lib.vector   import *
+    from grass.lib.ogsf     import *
+    from grass.lib.nviz     import *
 except ImportError, e:
     sys.stderr.write(_("3D view mode: %s\n") % e)
-
-from debug import Debug
+    
+from core.debug import Debug
+import grass.script as grass
 
 log      = None
 progress = None
@@ -65,20 +84,24 @@ class Nviz(object):
         """!Initialize Nviz class instance
         
         @param log logging area
+        @param gprogress progressbar
         """
         global errfunc, perfunc, log, progress
         log = glog
         progress = gprogress
         
-        G_gisinit("")
+        G_gisinit("wxnviz")
+        # gislib is already initialized (where?)
         G_set_error_routine(errfunc)
         G_set_percent_routine(perfunc)
         
-        GS_libinit()
-        GVL_libinit()
+        self.Init()
         
         self.data_obj = nv_data()
         self.data = pointer(self.data_obj)
+        self.color_obj = Colors()
+        self.color = pointer(self.color_obj)
+        
         self.width = self.height = -1
         self.showLight = False
         
@@ -91,7 +114,16 @@ class Nviz(object):
         del self.data
         del self.data_obj
         self.log = None
-        
+
+    def Init(self):
+        """!Initialize window"""
+        locale.setlocale(locale.LC_NUMERIC, 'C')
+        #G_unset_window()
+        #Rast_unset_window()
+        #Rast__init_window()
+        GS_libinit()
+        GVL_libinit()
+    
     def ResizeWindow(self, width, height):
         """!GL canvas resized
         
@@ -107,6 +139,10 @@ class Nviz(object):
                   width, height)
         return Nviz_resize_window(width, height)
     
+    def GetLongDim(self):
+        """!Get longest dimension, used for initial size of north arrow"""
+        return Nviz_get_longdim(self.data)
+    
     def SetViewDefault(self):
         """!Set default view (based on loaded data)
         
@@ -141,7 +177,62 @@ class Nviz(object):
         
         Debug.msg(3, "Nviz::SetView(): x=%f, y=%f, height=%f, persp=%f, twist=%f",
                   x, y, height, persp, twist)
+                
+    def GetViewpointPosition(self):
+        x = c_double()
+        y = c_double()
+        h = c_double()
+        Nviz_get_viewpoint_height(byref(h))
+        Nviz_get_viewpoint_position(byref(x), byref(y))
+        
+        return (x.value, y.value, h.value)
+        
+    def LookHere(self, x, y):
+        """!Look here feature 
+        @param x,y screen coordinates
+        """
         
+        Nviz_look_here(x, y)
+        Debug.msg(3, "Nviz::LookHere(): x=%f, y=%f", x, y)
+    
+    def LookAtCenter(self):
+        """!Center view at center of displayed surface"""
+        Nviz_set_focus_map(MAP_OBJ_UNDEFINED, -1)
+        Debug.msg(3, "Nviz::LookAtCenter()")
+    
+    def GetFocus(self):
+        """!Get focus"""
+        Debug.msg(3, "Nviz::GetFocus()")
+        if Nviz_has_focus(self.data):
+            x = c_float()
+            y = c_float()
+            z = c_float()
+            Nviz_get_focus(self.data, byref(x), byref(y), byref(z))
+            return x.value, y.value, z.value
+        else:
+            return -1, -1, -1
+        
+    def SetFocus(self, x, y, z):
+        """!Set focus"""
+        Debug.msg(3, "Nviz::SetFocus()")
+        Nviz_set_focus(self.data, x, y, z)
+        
+    def GetViewdir(self):
+        """!Get viewdir"""
+        Debug.msg(3, "Nviz::GetViewdir()")
+        dir = (c_float * 3)()
+        GS_get_viewdir(byref(dir))
+        
+        return dir[0], dir[1], dir[2]
+        
+    def SetViewdir(self, x, y, z):
+        """!Set viewdir"""
+        Debug.msg(3, "Nviz::SetViewdir(): x=%f, y=%f, z=%f" % (x, y, z))
+        dir = (c_float * 3)()
+        for i, coord in enumerate((x, y, z)):
+            dir[i] = coord
+        GS_set_viewdir(byref(dir))
+                
     def SetZExag(self, z_exag):
         """!Set z-exag value
         
@@ -189,7 +280,7 @@ class Nviz(object):
         # set background color
         Nviz_set_bgcolor(self.data, Nviz_color_from_str("white"))
         
-        GS_clear(Nviz_get_bgcolor(self.data))
+        GS_clear(Nviz_get_bgcolor(self.data))        
         # initialize view, lights
         Nviz_init_view(self.data)
         
@@ -265,7 +356,19 @@ class Nviz(object):
         Debug.msg(1, "Nviz::LoadRaster(): name=%s -> id=%d", name, id)
         
         return id
-
+    
+    def AddConstant(self, value, color):
+        """!Add new constant surface"""
+        id = Nviz_new_map_obj(MAP_OBJ_SURF, None, value, self.data)
+        
+        Nviz_set_attr(id, MAP_OBJ_SURF, ATT_COLOR, CONST_ATT,
+                        None, Nviz_color_from_str(color),
+                        self.data)
+        Nviz_set_focus_map(MAP_OBJ_UNDEFINED, -1)
+        
+        Debug.msg(1, "Nviz::AddConstant(): id=%d", id)
+        return id
+        
     def UnloadSurface(self, id):
         """!Unload surface
         
@@ -290,16 +393,17 @@ class Nviz(object):
         @param name vector map name
         @param points if true load 2d points rather then 2d lines
         
-        @return object id
+        @return object id, id of base surface (or -1 if it is not loaded)
         @return -1 on failure
         """
+        baseId = -1
         if GS_num_surfs() == 0:     # load base surface if no loaded
-            Nviz_new_map_obj(MAP_OBJ_SURF, None, 0.0, self.data)
+            baseId = Nviz_new_map_obj(MAP_OBJ_SURF, None, 0.0, self.data)
             
             nsurf = c_int()
             surf_list = GS_get_surf_list(byref(nsurf))
             GS_set_att_const(surf_list[0], ATT_TRANSP, 255)
-        
+            
         mapset = G_find_vector2 (name, "")
         if mapset is None:
             G_warning(_("Vector map <%s> not found"),
@@ -316,7 +420,7 @@ class Nviz(object):
         
         Debug.msg(1, "Nviz::LoadVector(): name=%s -> id=%d", name, id)
         
-        return id
+        return id, baseId
     
     def UnloadVector(self, id, points):
         """!Unload vector set
@@ -342,6 +446,19 @@ class Nviz(object):
         
         return 1
 
+    def VectorSurfaceSelected(self, vid, sid):
+        """!Check if surface is selected (currently unused)
+        
+        @param vid vector id
+        @param sid surface id
+        
+        @return True if selected
+        @return False if not selected
+        """
+        selected = GV_surf_is_selected(vid, sid)
+        Debug.msg(1, "Nviz::VectorSurfaceSelected(): vid=%s, sid=%d -> selected=%d", vid, sid, selected)
+        return selected
+    
     def LoadVolume(self, name, color_name, color_value):
         """!Load 3d raster map (volume)
         
@@ -423,7 +540,7 @@ class Nviz(object):
         
         @param id surface id
         @param map if true use map otherwise constant
-        @param value map name of value
+        @param value map name or value
         
         @return 1 on success
         @return -1 surface not found
@@ -444,7 +561,7 @@ class Nviz(object):
         @return -1 surface not found
         @return -2 setting attributes failed
         """
-        return self.SetSurfaceAttr(id, ATT_MASK, true, value)
+        return self.SetSurfaceAttr(id, ATT_MASK, True, value)
     
     def SetSurfaceTransp(self, id, map, value):
         """!Set surface mask
@@ -475,7 +592,7 @@ class Nviz(object):
         return self.SetSurfaceAttr(id, ATT_SHINE, map, value)
     
     def SetSurfaceEmit(self, id, map, value):
-        """!Set surface emission
+        """!Set surface emission (currently unused)
         
         @param id surface id
         @param map if true use map otherwise constant
@@ -546,7 +663,7 @@ class Nviz(object):
         return self.UnsetSurfaceAttr(id, ATT_TRANSP)
     
     def UnsetSurfaceEmit(self, id):
-        """!Unset surface emission
+        """!Unset surface emission (currently unused)
         
         @param id surface id
         
@@ -784,6 +901,28 @@ class Nviz(object):
         
         return 1
 
+    def UnsetVectorLineSurface(self, id, surf_id):
+        """!Unset reference surface of vector set (lines)
+        
+        @param id vector set id
+        @param surf_id surface id
+        
+        @return 1 on success
+        @return -1 vector set not found
+        @return -2 surface not found
+        @return -3 on failure
+        """
+        if not GV_vect_exists(id):
+            return -1
+        
+        if not GS_surf_exists(surf_id):
+            return -2
+        
+        if GV_unselect_surf(id, surf_id) < 0:
+            return -3
+        
+        return 1
+        
     def SetVectorPointMode(self, id, color_str, width, size, marker):
         """!Set mode of vector point overlay
         
@@ -797,15 +936,18 @@ class Nviz(object):
         if not GP_site_exists(id):
             return -1
         
+        # dtree and ctree defined but not used
+        if marker > 5:
+            marker += 2
+        
         Debug.msg(3, "Nviz::SetVectorPointMode(): id=%d, color=%s, "
                   "width=%d, size=%f, marker=%d",
                   id, color_str, width, size, marker)
         
         color = Nviz_color_from_str(color_str)
         
-        ### TODO
-        # if GP_set_style(id, color, width, size, marker) < 0:
-        #    return -2
+        if GP_set_sitemode(id, ST_ATT_NONE, color, width, size, marker) < 0:
+            return -2
         
         return 1
 
@@ -850,7 +992,64 @@ class Nviz(object):
         
         return 1
 
-    def AddIsosurface(self, id, level):
+    def ReadVectorColors(self, name, mapset):
+        """!Read vector colors
+        
+        @param name vector map name
+        @mapset mapset name ("" for search path)
+        
+        @return -1 on error 
+        @return 0 if color table missing 
+        @return 1 on success (color table found) 
+        """
+        return Vect_read_colors(name, mapset, self.color)
+        
+    def CheckColorTable(self, id, type):
+        """!Check if color table exists.
+        
+        @param id vector set id
+        @param type vector set type (lines/points)
+        
+        @return 1 color table exists
+        @return 0 no color table found
+        @return -1 on error
+        @return -2 vector set not found
+        """
+        file = c_char_p()
+        
+        if type == 'points':
+            ret = GP_get_sitename(id, byref(file))
+        elif type == 'lines':
+            ret = GV_get_vectname(id, byref(file))
+            
+        if ret < 0:
+            return -2
+        
+        return self.ReadVectorColors(file, "")
+        
+    def UnsetVectorPointSurface(self, id, surf_id):
+        """!Unset reference surface of vector set (points)
+        
+        @param id vector set id
+        @param surf_id surface id
+        
+        @return 1 on success
+        @return -1 vector set not found
+        @return -2 surface not found
+        @return -3 on failure
+        """
+        if not GP_site_exists(id):
+            return -1
+        
+        if not GS_surf_exists(surf_id):
+            return -2
+        
+        if GP_unselect_surf(id, surf_id) < 0:
+            return -3
+        
+        return 1
+        
+    def AddIsosurface(self, id, level, isosurf_id = None):
         """!Add new isosurface
         
         @param id volume id
@@ -862,6 +1061,11 @@ class Nviz(object):
         if not GVL_vol_exists(id):
             return -1
         
+        if isosurf_id is not None:
+            num = GVL_isosurf_num_isosurfs(id)
+            if num < 0 or isosurf_id != num:
+                return -1
+                
         if GVL_isosurf_add(id) < 0:
             return -1
         
@@ -870,6 +1074,27 @@ class Nviz(object):
         
         return GVL_isosurf_set_att_const(id, nisosurfs - 1, ATT_TOPO, level)
     
+    def AddSlice(self, id, slice_id = None):
+        """!Add new slice
+        
+        @param id volume id
+        
+        @return -1 on failure
+        @return number of slices
+        """
+        if not GVL_vol_exists(id):
+            return -1
+        
+        if slice_id is not None:
+            num = GVL_slice_num_slices(id)
+            if num < 0 or slice_id != num:
+                return -1
+                
+        if GVL_slice_add(id) < 0:
+            return -1
+        
+        return GVL_slice_num_slices(id)
+    
     def DeleteIsosurface(self, id, isosurf_id):
         """!Delete isosurface
         
@@ -894,6 +1119,30 @@ class Nviz(object):
 
         return 1
     
+    def DeleteSlice(self, id, slice_id):
+        """!Delete slice
+        
+        @param id volume id
+        @param slice_id slice id
+        
+        @return 1 on success
+        @return -1 volume not found
+        @return -2 slice not found
+        @return -3 on failure
+        """
+        if not GVL_vol_exists(id):
+            return -1
+        
+        if slice_id > GVL_slice_num_slices(id):
+            return -2
+        
+        ret = GVL_slice_del(id, slice_id)
+        
+        if ret < 0:
+            return -3
+
+        return 1
+    
     def MoveIsosurface(self, id, isosurf_id, up):
         """!Move isosurface up/down in the list
         
@@ -922,6 +1171,49 @@ class Nviz(object):
 
         return 1
 
+    def MoveSlice(self, id, slice_id, up):
+        """!Move slice up/down in the list
+        
+        @param id volume id
+        @param slice_id slice id
+        @param up if true move up otherwise down
+        
+        @return 1 on success
+        @return -1 volume not found
+        @return -2 slice not found
+        @return -3 on failure
+        """
+        if not GVL_vol_exists(id):
+            return -1
+        
+        if slice_id > GVL_slice_num_slices(id):
+            return -2
+        
+        if up:
+            ret = GVL_slice_move_up(id, slice_id)
+        else:
+            ret = GVL_slice_move_down(id, slice_id)
+        
+        if ret < 0:
+            return -3
+
+        return 1
+    
+    def SetIsosurfaceTopo(self, id, isosurf_id, map, value):
+        """!Set isosurface level
+        
+        @param id volume id
+        @param isosurf_id isosurface id (0 - MAX_ISOSURFS)
+        @param map if true use map otherwise constant
+        @param value map name of value
+        
+        @return 1 on success
+        @return -1 volume not found
+        @return -2 isosurface not found
+        @return -3 on failure
+        """
+        return self.SetIsosurfaceAttr(id, isosurf_id, ATT_TOPO, map, value)
+    
     def SetIsosurfaceColor(self, id, isosurf_id, map, value):
         """!Set isosurface color
         
@@ -952,7 +1244,7 @@ class Nviz(object):
         @return -2 isosurface not found
         @return -3 on failure
         """
-        return self.SetIsosurfaceAttr(id, isosurf_id, ATT_MASK, true, value)
+        return self.SetIsosurfaceAttr(id, isosurf_id, ATT_MASK, True, value)
     
     def SetIsosurfaceTransp(self, id, isosurf_id, map, value):
         """!Set isosurface transparency
@@ -985,7 +1277,7 @@ class Nviz(object):
         return self.SetIsosurfaceAttr(id, isosurf_id, ATT_SHINE, map, value)
     
     def SetIsosurfaceEmit(self, id, isosurf_id, map, value):
-        """!Set isosurface emission
+        """!Set isosurface emission (currently unused)
         
         @param id volume id
         @param isosurf_id isosurface id (0 - MAX_ISOSURFS)
@@ -1030,7 +1322,7 @@ class Nviz(object):
             ret = GVL_isosurf_set_att_const(id, isosurf_id, attr, val)
         
         Debug.msg(3, "Nviz::SetIsosurfaceAttr(): id=%d, isosurf=%d, "
-                  "attr=%d, map=%d, value=%s",
+                  "attr=%d, map=%s, value=%s",
                   id, isosurf_id, attr, map, value)
         
         if ret < 0:
@@ -1065,7 +1357,7 @@ class Nviz(object):
         return self.UnsetIsosurfaceAttr(id, isosurf_id, ATT_TRANSP)
     
     def UnsetIsosurfaceEmit(self, id, isosurf_id):
-        """!Unset isosurface emission
+        """!Unset isosurface emission (currently unused)
         
         @param id volume id
         @param isosurf_id isosurface id (0 - MAX_ISOSURFS)
@@ -1124,6 +1416,25 @@ class Nviz(object):
         
         return 1
     
+    def SetSliceMode(self, id, mode):
+        """!Set draw mode for slices
+        
+        @param mode
+        
+        @return 1 on success
+        @return -1 volume set not found
+        @return -2 on failure
+        """
+        if not GVL_vol_exists(id):
+            return -1
+        
+        ret = GVL_slice_set_drawmode(id, mode)
+        
+        if ret < 0:
+            return -2
+        
+        return 1
+    
     def SetIsosurfaceRes(self, id, res):
         """!Set draw resolution for isosurfaces
         
@@ -1142,7 +1453,228 @@ class Nviz(object):
             return -2
         
         return 1
-
+    
+    def SetSliceRes(self, id, res):
+        """!Set draw resolution for slices
+        
+        @param res resolution value
+        
+        @return 1 on success
+        @return -1 volume set not found
+        @return -2 on failure
+        """
+        if not GVL_vol_exists(id):
+            return -1
+        
+        ret = GVL_slice_set_drawres(id, res, res, res)
+        
+        if ret < 0:
+            return -2
+        
+        return 1
+    
+    def SetSlicePosition(self, id, slice_id, x1, x2, y1, y2, z1, z2, dir):
+        """!Set slice position
+        
+        @param id volume id
+        @param slice_id slice id
+        @param x1,x2,y1,y2,z1,z2 slice coordinates
+        @param dir axis
+        
+        @return 1 on success
+        @return -1 volume not found
+        @return -2 slice not found
+        @return -3 on failure
+        """
+        if not GVL_vol_exists(id):
+            return -1
+        
+        if slice_id > GVL_slice_num_slices(id):
+            return -2
+        
+        ret = GVL_slice_set_pos(id, slice_id, x1, x2, y1, y2, z1, z2, dir)
+        
+        if ret < 0:
+            return -2
+        
+        return 1
+    
+    def SetSliceTransp(self, id, slice_id, value):
+        """!Set slice transparency
+        
+        @param id volume id
+        @param slice_id slice id
+        @param x1,x2,y1,y2,z1,z2 slice coordinates
+        @param value transparency value (0 - 255)
+        
+        @return 1 on success
+        @return -1 volume not found
+        @return -2 slice not found
+        @return -3 on failure
+        """
+        
+        if not GVL_vol_exists(id):
+            return -1
+        
+        if slice_id > GVL_slice_num_slices(id):
+            return -2
+        
+        ret = GVL_slice_set_transp(id, slice_id, value)
+        
+        if ret < 0:
+            return -2
+        
+        return 1
+    
+    def SetIsosurfaceInOut(self, id, isosurf_id, inout):
+        """!Set inout mode
+        
+        @param inout mode true/false
+        
+        @return 1 on success
+        @return -1 volume set not found
+        @return -2 isosurface not found
+        @return -3 on failure
+        """
+        if not GVL_vol_exists(id):
+            return -1
+        
+        if isosurf_id > GVL_isosurf_num_isosurfs(id) - 1:
+            return -2
+        
+        ret = GVL_isosurf_set_flags(id, isosurf_id, inout)
+        
+        if ret < 0:
+            return -3
+        
+        return 1
+    
+    def GetVolumePosition(self, id):
+        """!Get volume position
+        
+        @param id volume id
+        
+        @return x,y,z
+        @return zero-length vector on error
+        """
+        if not GVL_vol_exists(id):
+            return []
+        
+        x, y, z = c_float(), c_float(), c_float()
+        GVL_get_trans(id, byref(x), byref(y), byref(z))
+        
+        Debug.msg(3, "Nviz::GetVolumePosition(): id=%d, x=%f, y=%f, z=%f",
+                  id, x.value, y.value, z.value)
+        
+        return [x.value, y.value, z.value]
+    
+    def SetVolumePosition(self, id, x, y, z):
+        """!Set volume position
+        
+        @param id volume id
+        @param x,y,z translation values
+        
+        @return 1 on success
+        @return -1 volume not found
+        @return -2 setting position failed
+        """
+        if not GVL_vol_exists(id):
+            return -1
+        
+        Debug.msg(3, "Nviz::SetVolumePosition(): id=%d, x=%f, y=%f, z=%f",
+                  id, x, y, z)
+        
+        GVL_set_trans(id, x, y, z)
+        
+        return 1
+    
+    def GetCPlaneCurrent(self):
+        return Nviz_get_current_cplane(self.data)
+    
+    def GetCPlanesCount(self):
+        """!Returns number of cutting planes"""
+        return Nviz_num_cplanes(self.data) 
+    
+    def GetCPlaneRotation(self):
+        """!Returns rotation parameters of current cutting plane"""
+        x, y, z = c_float(), c_float(), c_float()
+        
+        current = Nviz_get_current_cplane(self.data)
+        Nviz_get_cplane_rotation(self.data, current, byref(x), byref(y), byref(z))
+        
+        return x.value, y.value, z.value
+    
+    def GetCPlaneTranslation(self):
+        """!Returns translation parameters of current cutting plane"""
+        x, y, z = c_float(), c_float(), c_float()
+        
+        current = Nviz_get_current_cplane(self.data)
+        Nviz_get_cplane_translation(self.data, current, byref(x), byref(y), byref(z))
+        
+        return x.value, y.value, z.value
+    
+    def SetCPlaneRotation(self, x, y, z):
+        """!Set current clip plane rotation
+        
+        @param x,y,z rotation parameters
+        """
+        current = Nviz_get_current_cplane(self.data)
+        Nviz_set_cplane_rotation(self.data, current, x, y, z)
+        Nviz_draw_cplane(self.data, -1, -1)
+    
+    def SetCPlaneTranslation(self, x, y, z):
+        """!Set current clip plane translation
+        
+        @param x,y,z translation parameters
+        """
+        current = Nviz_get_current_cplane(self.data)
+        Nviz_set_cplane_translation(self.data, current, x, y, z)
+        Nviz_draw_cplane(self.data, -1, -1) 
+        Debug.msg(3, "Nviz::SetCPlaneTranslation(): id=%d, x=%f, y=%f, z=%f",
+                  current, x, y, z)
+                
+    def SetCPlaneInteractively(self, x, y):
+        current = Nviz_get_current_cplane(self.data)
+        ret = Nviz_set_cplane_here(self.data, current, x, y)
+        if ret:
+            Nviz_draw_cplane(self.data, -1, -1)
+            x, y, z = self.GetCPlaneTranslation()
+            return x, y, z
+        else:
+            return None, None, None
+        
+        
+    def SelectCPlane(self, index):
+        """!Select cutting plane
+        
+        @param index index of cutting plane
+        """
+        Nviz_on_cplane(self.data, index)
+    
+    def UnselectCPlane(self, index):
+        """!Unselect cutting plane
+        
+        @param index index of cutting plane
+        """
+        Nviz_off_cplane(self.data, index)
+        
+    def SetFenceColor(self, index):
+        """!Select current cutting plane
+        
+        @param index type of fence - from 0 (off) to 4
+        """    
+        Nviz_set_fence_color(self.data, index)
+            
+    def GetXYRange(self):
+        """!Get xy range"""
+        return Nviz_get_xyrange(self.data)
+    
+    def GetZRange(self):
+        """!Get z range"""
+        min, max = c_float(), c_float()
+        Nviz_get_zrange(self.data, byref(min), byref(max))
+        return min.value, max.value
+    
     def SaveToFile(self, filename, width = 20, height = 20, itype = 'ppm'):
         """!Save current GL screen to ppm/tif file
 
@@ -1167,8 +1699,12 @@ class Nviz(object):
     def DrawLightingModel(self):
         """!Draw lighting model"""
         if self.showLight:
-            GS_draw_lighting_model()
+            Nviz_draw_model(self.data)
 
+    def DrawFringe(self):
+        """!Draw fringe"""
+        Nviz_draw_fringe(self.data)
+        
     def SetFringe(self, sid, color, elev, nw = False, ne = False, sw = False, se = False):
         """!Set fringe
 
@@ -1178,10 +1714,48 @@ class Nviz(object):
         @param nw,ne,sw,se fringe edges (turn on/off)
         """
         scolor = str(color[0]) + ':' + str(color[1]) + ':' + str(color[2])
-
         Nviz_set_fringe(self.data,
                         sid, Nviz_color_from_str(scolor),
                         elev, int(nw), int(ne), int(sw), int(se))
+    
+    def DrawArrow(self):
+        """!Draw north arrow
+        """
+        return Nviz_draw_arrow(self.data)
+        
+    def SetArrow(self, sx, sy, size, color):
+        """!Set north arrow from canvas coordinates
+        
+        @param sx,sy canvas coordinates
+        @param size arrow length
+        @param color arrow color
+        """
+        return Nviz_set_arrow(self.data, sx, sy, size, Nviz_color_from_str(color))       
+        
+    def DeleteArrow(self):
+        """!Delete north arrow
+        """
+        Nviz_delete_arrow(self.data)
+    
+    def SetScalebar(self, id, sx, sy, size, color):
+        """!Set scale bar from canvas coordinates
+        
+        @param sx,sy canvas coordinates
+        @param id scale bar id
+        @param size scale bar length
+        @param color scale bar color
+        """
+        return Nviz_set_scalebar(self.data, id, sx, sy, size, Nviz_color_from_str(color))
+    
+    def DrawScalebar(self):
+        """!Draw scale bar
+        """
+        return Nviz_draw_scalebar(self.data)
+    
+    def DeleteScalebar(self, id):
+        """!Delete scalebar
+        """
+        Nviz_delete_scalebar(self.data, id)
         
     def GetPointOnSurface(self, sx, sy):
         """!Get point on surface
@@ -1192,7 +1766,7 @@ class Nviz(object):
         x   = c_float()
         y   = c_float()
         z   = c_float()
-        Debug.msg(5, "GLWindow.GetPointOnSurface(): sx=%d sy=%d" % (sx, sy))
+        Debug.msg(5, "Nviz::GetPointOnSurface(): sx=%d sy=%d" % (sx, sy))
         num = GS_get_selected_point_on_surface(sx, sy, byref(sid), byref(x), byref(y), byref(z))
         if num == 0:
             return (None, None, None, None)
@@ -1228,3 +1802,245 @@ class Nviz(object):
                                   byref(d), int(useExag))
         
         return d.value
+
+    def GetRotationParameters(self, dx, dy):
+        """!Get rotation parameters (angle, x, y, z axes)
+        
+        @param dx,dy difference from previous mouse drag event
+        """
+        modelview = (c_double * 16)()
+        Nviz_get_modelview(byref(modelview))
+        
+        angle = sqrt(dx*dx+dy*dy)/float(self.width+1)*180.0
+        m = []
+        row = []
+        for i, item in enumerate(modelview):
+            row.append(item)
+            if (i+1) % 4 == 0:
+                m.append(row)
+                row = []
+        inv = matrix(m).I
+        ax, ay, az = dy, dx, 0.
+        x = inv[0,0]*ax + inv[1,0]*ay + inv[2,0]*az
+        y = inv[0,1]*ax + inv[1,1]*ay + inv[2,1]*az
+        z = inv[0,2]*ax + inv[1,2]*ay + inv[2,2]*az
+        
+        return angle, x, y, z 
+       
+    def Rotate(self, angle, x, y, z):
+        """!Set rotation parameters
+        Rotate scene (difference from current state).
+
+        @param angle angle
+        @param x,y,z axis coordinate
+        """
+        Nviz_set_rotation(angle, x, y, z)
+        
+    def UnsetRotation(self):
+        """!Stop rotating the scene"""
+        Nviz_unset_rotation()
+        
+    def ResetRotation(self):
+        """!Reset scene rotation"""
+        Nviz_init_rotation()
+        
+    def GetRotationMatrix(self):
+        """!Get rotation matrix"""
+        matrix = (c_double * 16)()
+        GS_get_rotation_matrix(byref(matrix))
+        returnMatrix = []
+        for item in matrix:
+            returnMatrix.append(item)
+        return returnMatrix
+        
+    def SetRotationMatrix(self, matrix):
+        """!Set rotation matrix"""
+        mtrx = (c_double * 16)()
+        for i in range(len(matrix)):
+            mtrx[i] = matrix[i]
+        GS_set_rotation_matrix(byref(mtrx))
+    
+    def Start2D(self):
+        Nviz_set_2D(self.width, self.height)
+        
+    def FlyThrough(self, flyInfo, mode, exagInfo):
+        """!Fly through the scene
+        
+        @param flyInfo fly parameters
+        @param mode 0 or 1 for different fly behaviour
+        @param exagInfo parameters changing fly speed
+        """
+        fly = (c_float * 3)()
+        for i, item in enumerate(flyInfo):
+            fly[i] = item
+        exag = (c_int * 2)()
+        exag[0] = int(exagInfo['move'])
+        exag[1] = int(exagInfo['turn'])
+        Nviz_flythrough(self.data, fly, exag, mode)
+        
+class Texture(object):
+    """!Class representing OpenGL texture"""
+    def __init__(self, filepath, overlayId, coords):
+        """!Load image to texture
+
+        @param filepath path to image file
+        @param overlayId id of overlay (1 for legend, 101 and more for text)
+        @param coords image coordinates
+        """
+        self.path = filepath
+        self.image = wx.Image(filepath, wx.BITMAP_TYPE_ANY)
+        self.width = self.image.GetWidth()
+        self.height = self.image.GetHeight()
+        self.id = overlayId
+        self.coords = list(coords)
+        self.bounds = wx.Rect()
+        self.active = True
+        
+        # alpha needs to be initialized
+        if not self.image.HasAlpha():
+            self.image.InitAlpha()
+    
+        # resize image to match 2^n
+        self.Resize()
+        
+        # check max texture size
+        maxSize = c_int()
+        Nviz_get_max_texture(byref(maxSize))
+        self.maxSize = maxSize.value
+        if self.maxSize < self.width or self.maxSize < self.height:
+            # TODO: split up image 
+            self.textureId = None
+        else:
+            self.textureId = self.Load()
+            
+    def __del__(self):
+        """!Delete texture"""
+        if self.textureId:
+            Nviz_del_texture(self.textureId)
+        grass.try_remove(self.path)
+            
+    def Resize(self):    
+        """!Resize image to match 2^n"""
+        n = m = 1
+        while self.width > pow(2,n):
+            n += 1
+        while self.height > pow(2,m):
+            m += 1
+        self.image.Resize(size = (pow(2,n), pow(2,m)), pos = (0, 0))
+        self.width = self.image.GetWidth()
+        self.height = self.image.GetHeight()
+        
+    def Load(self):
+        """!Load image to texture"""  
+        if self.image.HasAlpha():
+            bytesPerPixel = 4
+        else:
+            bytesPerPixel = 3
+        bytes = bytesPerPixel * self.width * self.height
+        rev_val = self.height - 1
+        im = (c_ubyte * bytes)()
+        bytes3 = 3 * self.width * self.height
+        bytes1 = self.width * self.height
+        imageData = struct.unpack(str(bytes3) + 'B', self.image.GetData())
+        if self.image.HasAlpha():
+            alphaData = struct.unpack(str(bytes1) + 'B', self.image.GetAlphaData())
+        
+        # this takes too much time
+        wx.BeginBusyCursor()
+        for i in range(self.height):
+            for j in range(self.width):
+                im[(j + i * self.width) * bytesPerPixel + 0] = imageData[( j + (rev_val - i) * self.width) * 3 + 0]
+                im[(j + i * self.width) * bytesPerPixel + 1] = imageData[( j + (rev_val - i) * self.width) * 3 + 1]
+                im[(j + i * self.width) * bytesPerPixel + 2] = imageData[( j + (rev_val - i) * self.width) * 3 + 2]
+                if self.image.HasAlpha():
+                    im[(j + i * self.width) * bytesPerPixel + 3] = alphaData[( j + (rev_val - i) * self.width)]
+        wx.EndBusyCursor()
+        
+        id = Nviz_load_image(im, self.width, self.height, self.image.HasAlpha())
+        
+        return id
+        
+    def Draw(self):
+        """!Draw texture as an image"""
+        Nviz_draw_image(self.coords[0], self.coords[1], self.width, self.height, self.textureId)
+    
+        
+    def SetBounds(self, rect):
+        """!Set Bounding Rectangle"""
+        self.bounds = rect
+        
+    def HitTest(self, x, y, radius):
+        copy = wx.Rect(*self.bounds)
+        copy.Inflate(radius, radius)
+        return copy.ContainsXY(x, y)
+    
+    def MoveTexture(self, dx, dy):
+        """!Move texture on the screen"""
+        self.coords[0] += dx
+        self.coords[1] += dy
+        self.bounds.OffsetXY(dx, dy)
+    
+    def SetCoords(self, coords):
+        """!Set coordinates"""
+        dx = coords[0] - self.coords[0]
+        dy = coords[1] - self.coords[1]
+        self.MoveTexture(dx, dy)
+        
+    def GetId(self):
+        """!Returns image id."""
+        return self.id
+    
+    def SetActive(self, active = True):
+        self.active = active
+        
+    def IsActive(self):
+        return self.active
+        
+class ImageTexture(Texture):
+    """!Class representing OpenGL texture as an overlay image"""
+    def __init__(self, filepath, overlayId, coords, cmd):
+        """!Load image to texture
+
+        @param filepath path to image file
+        @param overlayId id of overlay (1 for legend)
+        @param coords image coordinates
+        @param cmd d.legend command      
+        """
+        Texture.__init__(self, filepath = filepath, overlayId = overlayId, coords = coords)
+        
+        self.cmd = cmd
+        
+    def GetCmd(self):
+        """!Returns overlay command."""
+        return self.cmd
+        
+    def Corresponds(self, item):
+        return sorted(self.GetCmd()) == sorted(item.GetCmd())
+        
+class TextTexture(Texture):
+    """!Class representing OpenGL texture as a text label"""
+    def __init__(self, filepath, overlayId, coords, textDict):
+        """!Load image to texture
+
+        @param filepath path to image file
+        @param overlayId id of overlay (101 and more for text)
+        @param coords text coordinates
+        @param textDict text properties      
+        """
+        Texture.__init__(self, filepath = filepath, overlayId = overlayId, coords = coords)
+        
+        self.textDict = textDict
+        
+    def GetTextDict(self):
+        """!Returns text properties."""
+        return self.textDict
+        
+        
+    def Corresponds(self, item):
+        t = self.GetTextDict()
+        for prop in t.keys():
+            if prop in ('coords','bbox'): continue
+            if t[prop] != item[prop]:
+                return False
+                
+        return True
diff --git a/gui/wxpython/gui_modules/psmap_dialogs.py b/gui/wxpython/psmap/dialogs.py
similarity index 71%
rename from gui/wxpython/gui_modules/psmap_dialogs.py
rename to gui/wxpython/psmap/dialogs.py
index f367aa1..892652f 100644
--- a/gui/wxpython/gui_modules/psmap_dialogs.py
+++ b/gui/wxpython/psmap/dialogs.py
@@ -1,135 +1,69 @@
 """!
- at package psmap_dialogs.py
+ at package psmap.dialogs
 
- at brief Map feature objects and dialogs for ps.map
+ at brief dialogs for wxPsMap
 
 Classes:
- - UnitConversion
- - TCValidator
- - PenStyleComboBox
- - CheckListCtrl
- - Instruction
- - InstructionObject
- - InitMap
- - MapFrame
- - PageSetup
- - Mapinfo
- - Text
- - Scalebar
- - RasterLegend
- - VectorLegend
- - Raster
- - Vector
- - VProperties
- - PsmapDialog
- - PageSetupDialog
- - MapDialog
- - MapFramePanel
- - RasterPanel
- - VectorPanel
- - RasterDialog
- - MainVectorDialog
- - VPropertiesDialog
- - LegendDialog
- - MapinfoDialog
- - ScalebarDialog
- - TextDialog
-
-(C) 2011 by Anna Kratochvilova, and the GRASS Development Team
+ - dialogs::TCValidator
+ - dialogs::PenStyleComboBox
+ - dialogs::CheckListCtrl
+ - dialogs::PsmapDialog
+ - dialogs::PageSetupDialog
+ - dialogs::MapDialog
+ - dialogs::MapFramePanel
+ - dialogs::RasterPanel
+ - dialogs::VectorPanel
+ - dialogs::RasterDialog
+ - dialogs::MainVectorDialog
+ - dialogs::VPropertiesDialog
+ - dialogs::LegendDialog
+ - dialogs::MapinfoDialog
+ - dialogs::ScalebarDialog
+ - dialogs::TextDialog
+ - dialogs::ImageDialog
+ - dialogs::NorthArrowDialog
+ - dialogs::PointDialog
+ - dialogs::RectangleDialog
+
+(C) 2011-2012 by Anna Kratochvilova, and the GRASS Development Team
+
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
- at author Anna Kratochvilova <anna.kratochvilova fsv.cvut.cz> (bachelor's project)
+ at author Anna Kratochvilova <kratochanna gmail.com> (bachelor's project)
 @author Martin Landa <landa.martin gmail.com> (mentor)
 """
 
-
 import os
 import sys
 import string
-from math import ceil, floor
 from copy import deepcopy
-from time import strftime, localtime
-
-import grass.script as grass
-if int(grass.version()['version'].split('.')[0]) > 6:
-    sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'gui', 'wxpython',
-                                 'gui_modules'))
-else:
-    sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'wxpython',
-                                 'gui_modules'))
-import globalvar
-import dbm_base
-from   utils      import CmdToTuple, GetCmdString
-from   gselect    import Select
-from   gcmd       import RunCommand, GError, GMessage, GWarning
 
 import wx
-import wx.lib.scrolledpanel as scrolled
-import  wx.lib.filebrowsebutton as filebrowse
+import wx.lib.scrolledpanel    as scrolled
+import wx.lib.filebrowsebutton as filebrowse
 from wx.lib.mixins.listctrl import CheckListCtrlMixin, ListCtrlAutoWidthMixin
-from wx.lib.expando import ExpandoTextCtrl, EVT_ETC_LAYOUT_NEEDED
+from wx.lib.expando         import ExpandoTextCtrl, EVT_ETC_LAYOUT_NEEDED
 try:
     import wx.lib.agw.floatspin as fs
 except ImportError:
     fs = None
 
-grass.set_raise_on_error(True)
+import grass.script as grass
+
+from core               import globalvar
+from dbmgr.vinfo        import VectorDBInfo
+from gui_core.gselect   import Select
+from core.gcmd          import RunCommand, GError, GMessage
+from gui_core.dialogs   import SymbolDialog
+from psmap.utils        import *
+from psmap.instructions import *
+
+# grass.set_raise_on_error(True)
 
 PSMAP_COLORS = ['aqua', 'black', 'blue', 'brown', 'cyan', 'gray', 'grey', 'green', 'indigo',
                 'magenta','orange', 'purple', 'red', 'violet', 'white', 'yellow']
-class UnitConversion:
-    """! Class for converting units"""
-    def __init__(self, parent = None):
-        self.parent = parent
-        if self.parent:
-            ppi = wx.ClientDC(self.parent).GetPPI()
-        else: 
-            ppi = (72, 72)
-        self._unitsPage = { 'inch'          : {'val': 1.0, 'tr' : _("inch")},
-                            'point'         : {'val': 72.0, 'tr' : _("point")},
-                            'centimeter'    : {'val': 2.54, 'tr' : _("centimeter")},
-                            'millimeter'    : {'val': 25.4, 'tr' : _("millimeter")}}
-        self._unitsMap = {  'meters'        : {'val': 0.0254, 'tr' : _("meters")},
-                            'kilometers'    : {'val': 2.54e-5, 'tr' : _("kilometers")},
-                            'feet'          : {'val': 1./12, 'tr' : _("feet")},
-                            'miles'         : {'val': 1./63360, 'tr' : _("miles")},
-                            'nautical miles': {'val': 1/72913.386, 'tr' : _("nautical miles")}}
-
-        self._units = { 'pixel'     : {'val': ppi[0], 'tr' : _("pixel")},
-                        'meter'     : {'val': 0.0254, 'tr' : _("meter")},
-                        'nautmiles' : {'val': 1/72913.386, 'tr' :_("nautical miles")},
-                        'degrees'   : {'val': 0.0254 , 'tr' : _("degree")} #like 1 meter, incorrect
-                        }
-        self._units.update(self._unitsPage)
-        self._units.update(self._unitsMap)
-
-    def getPageUnitsNames(self):
-        return sorted(self._unitsPage[unit]['tr'] for unit in self._unitsPage.keys())
-    
-    def getMapUnitsNames(self):
-        return sorted(self._unitsMap[unit]['tr'] for unit in self._unitsMap.keys())
-    
-    def getAllUnits(self):
-        return sorted(self._units.keys())
-    
-    def findUnit(self, name):
-        """!Returns unit by its tr. string"""
-        for unit in self._units.keys():
-            if self._units[unit]['tr'] == name:
-                return unit
-        return None
-    
-    def findName(self, unit):
-        """!Returns tr. string of a unit"""
-        try:
-            return self._units[unit]['tr']
-        except KeyError:
-            return None
-    
-    def convert(self, value, fromUnit = None, toUnit = None):
-        return float(value)/self._units[fromUnit]['val']*self._units[toUnit]['val']
-    
+
     
 class TCValidator(wx.PyValidator):
     """!validates input in textctrls, combobox, taken from wxpython demo"""
@@ -157,7 +91,7 @@ class TCValidator(wx.PyValidator):
         if key < wx.WXK_SPACE or key == wx.WXK_DELETE or key > 255:
             event.Skip()
             return
-        if self.flag == 'DIGIT_ONLY' and chr(key) in string.digits + '.':
+        if self.flag == 'DIGIT_ONLY' and chr(key) in string.digits + '.-':
             event.Skip()
             return
 ##        if self.flag == 'SCALE' and chr(key) in string.digits + ':':
@@ -240,1396 +174,7 @@ class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin, ListCtrlAutoWidthMixin):
         CheckListCtrlMixin.__init__(self) 
         ListCtrlAutoWidthMixin.__init__(self)
         
-class Instruction:
-    """!Class which represents instruction file"""
-    def __init__(self, parent, objectsToDraw):
-        
-        self.parent = parent
-        self.objectsToDraw = objectsToDraw
-        #here are kept objects like mapinfo, rasterlegend, etc.
-        self.instruction = list()
-        
-    def __str__(self):
-        """!Returns text for instruction file"""
-        comment = "# timestamp: " + strftime("%Y-%m-%d %H:%M", localtime()) + '\n'
-        env = grass.gisenv()
-        comment += "# location: %s\n" % env['LOCATION_NAME']
-        comment += "# mapset: %s\n" % env['MAPSET']
-        comment += "# page orientation: %s\n" % self.FindInstructionByType('page')['Orientation']
-        border = ''
-        if not self.FindInstructionByType('map'):
-            border = 'border n\n'
-        text = [str(each) for each in self.instruction]
-        return comment + border + '\n'.join(text) + '\nend'
-    
-    def __getitem__(self, id):
-        for each in self.instruction:
-            if each.id == id:
-                return each
-        return None
-
-    def __contains__(self, id):
-        """!Test if instruction is included"""
-        for each in self.instruction:
-            if each.id == id:
-                return True
-        return False
-    
-    def __delitem__(self, id):
-        """!Delete instruction"""
-        for each in self.instruction:
-            if each.id == id:
-                if each.type == 'map':
-                    #must remove raster, vector layers too
-                    vektor = self.FindInstructionByType('vector', list = True)
-                    vProperties = self.FindInstructionByType('vProperties', list = True)
-                    raster = self.FindInstructionByType('raster', list = True)
-                    for item in vektor + vProperties + raster:
-                        if item in self.instruction:
-                            self.instruction.remove(item)
-                            
-                self.instruction.remove(each)
-                if id in self.objectsToDraw:
-                    self.objectsToDraw.remove(id)
-                return
-            
-    def AddInstruction(self, instruction):
-        """!Add instruction"""
-        # add to instructions
-        if instruction.type == 'map':
-            self.instruction.insert(0, instruction)
-        else:
-            self.instruction.append(instruction)
-        # add to drawable objects
-        if instruction.type not in ('page', 'raster', 'vector', 'vProperties', 'initMap'):
-            if instruction.type == 'map':
-                self.objectsToDraw.insert(0, instruction.id) 
-            else:
-                self.objectsToDraw.append(instruction.id) 
-                
-            
-    def FindInstructionByType(self, type, list = False):
-        """!Find instruction(s) with the given type"""
-        inst = []
-        for each in self.instruction:
-            if each.type == type:
-                inst.append(each)
-        if len(inst) == 1 and not list:
-            return inst[0]
-        return inst
-    
-    def Read(self, filename):
-        """!Reads instruction file and creates instruction objects"""
-        self.filename = filename
-        # open file
-        try:
-            file = open(filename, 'r')
-        except IOError:
-            GError(message = _("Unable to open file\n%s") % filename)
-            return
-        # first read file to get information about region and scaletype
-        isRegionComment = False
-        orientation = 'Portrait'
-        for line in file:
-            if '# g.region' in line:
-                self.SetRegion(regionInstruction = line)
-                isRegionComment = True
-                break
-            if '# page orientation' in line:
-                orientation = line.split(':')[-1].strip()
-                
-        if not isRegionComment:
-            self.SetRegion(regionInstruction = None)
-        # then run ps.map -b to get information for maploc
-        # compute scale and center 
-        map = self.FindInstructionByType('map')
-        region = grass.region()
-        map['center'] = (region['n'] + region['s']) / 2, (region['w'] + region['e']) / 2
-        mapRect = GetMapBounds(self.filename, portrait = (orientation == 'Portrait'))
-        map['rect'] = mapRect
-        proj = projInfo()
-        toM = 1.0
-        if proj['units']:
-            toM = float(proj['meters'])
-        units = UnitConversion(self.parent)
-        w = units.convert(value = mapRect.Get()[2], fromUnit = 'inch', toUnit = 'meter') / toM
-        map['scale'] = w / abs((region['w'] - region['e']))
-        
-        SetResolution(dpi = 300, width = map['rect'].width, height = map['rect'].height)
-        
-        # read file again, now with information about map bounds
-        isBuffer = False
-        buffer = []
-        instruction = None
-        vectorMapNumber = 1
-        file.seek(0)
-        for line in file:
-            if not line.strip(): 
-                continue
-            line = line.strip()
-            if isBuffer:
-                buffer.append(line)
-                if 'end' in line:
-                    isBuffer = False
-                    kwargs = {}
-                    if instruction == 'scalebar':
-                        kwargs['scale'] = map['scale']
-                    elif instruction == 'text':
-                        kwargs['mapInstruction'] = map
-                    elif instruction in ('vpoints', 'vlines', 'vareas'):
-                        kwargs['id'] = wx.NewId()
-                        kwargs['vectorMapNumber'] = vectorMapNumber
-                        vectorMapNumber += 1
-                    elif instruction == 'paper':
-                        kwargs['Orientation'] = orientation
-                        
-                    ok = self.SendToRead(instruction, buffer, **kwargs)
-                    if not ok: return False
-                    buffer = []
-                continue 
-            
-            elif line.startswith('paper'):
-                instruction = 'paper'
-                isBuffer = True
-                buffer.append(line)
-            
-            elif line.startswith('border'):
-                if line.split()[1].lower() in ('n', 'no', 'none'):
-                    ok = self.SendToRead('border', [line])
-                    if not ok: return False
-                elif line.split()[1].lower() in ('y', 'yes'):
-                    instruction = 'border'
-                    isBuffer = True
-                    buffer.append(line)
-            
-            elif line.startswith('scale '):
-                ok = self.SendToRead('scale', line, isRegionComment = isRegionComment)
-                if not ok: return False
-            
-            elif line.startswith('maploc'):
-                ok = self.SendToRead(instruction = 'maploc', text = line)
-                if not ok: return False
-                
-            elif line.startswith('raster'):
-                ok = self.SendToRead(instruction = 'raster', text = line)
-                if not ok: return False
-            
-            elif line.startswith('mapinfo'):
-                instruction = 'mapinfo'
-                isBuffer = True
-                buffer.append(line)
-
-
-            elif line.startswith('scalebar'):
-                instruction = 'scalebar'
-                isBuffer = True
-                buffer.append(line) 
-            
-            elif line.startswith('text'):
-                instruction = 'text'
-                isBuffer = True
-                buffer.append(line) 
-            
-            elif line.startswith('colortable'):
-                if len(line.split()) == 2 and line.split()[1].lower() in ('n', 'no', 'none'):
-                    break
-                instruction = 'colortable'
-                isBuffer = True
-                buffer.append(line) 
-        
-            elif line.startswith('vlegend'):
-                instruction = 'vlegend'
-                isBuffer = True
-                buffer.append(line) 
-                
-            elif line.startswith('vpoints'):
-                instruction = 'vpoints'
-                isBuffer = True
-                buffer.append(line) 
-                
-            elif line.startswith('vlines'):
-                instruction = 'vlines'
-                isBuffer = True
-                buffer.append(line)
-                
-            elif line.startswith('vareas'):
-                instruction = 'vareas'
-                isBuffer = True
-                buffer.append(line)
-
-
-        
-        rasterLegend = self.FindInstructionByType('rasterLegend')
-        raster = self.FindInstructionByType('raster')
-        page = self.FindInstructionByType('page')
-        vector = self.FindInstructionByType('vector')
-        vectorLegend = self.FindInstructionByType('vectorLegend')
-        vectorMaps = self.FindInstructionByType('vProperties', list = True)
-
-        # check (in case of scaletype 0) if map is drawn also
-        map['drawMap'] = False
-        if map['scaleType'] == 0:
-            mapForRegion = map['map']
-            if map['mapType'] == 'raster' and raster:
-                if mapForRegion == raster['raster']:
-                    map['drawMap'] = True
-            elif map['mapType'] == 'vector' and vector:
-                for vmap in vector['list']:
-                    if mapForRegion == vmap[0]:
-                        map['drawMap'] = True
-
-        # rasterLegend
-        if rasterLegend:
-            if rasterLegend['rasterDefault'] and raster:
-                rasterLegend['raster'] = raster['raster']
-                if not rasterLegend['discrete']:
-                    rasterType = getRasterType(map = rasterLegend['raster'])
-                    if rasterType == 'CELL':
-                        rasterLegend['discrete'] = 'y'
-                    else:
-                        rasterLegend['discrete'] = 'n'
-            
-            #estimate size
-            height = rasterLegend.EstimateHeight(raster = rasterLegend['raster'], discrete = rasterLegend['discrete'], 
-                                                 fontsize = rasterLegend['fontsize'],
-                                                 cols = rasterLegend['cols'], 
-                                                 height = rasterLegend['height'])
-            width = rasterLegend.EstimateWidth(raster = rasterLegend['raster'], discrete = rasterLegend['discrete'], 
-                                               fontsize = rasterLegend['fontsize'],
-                                               cols = rasterLegend['cols'] , 
-                                               width = rasterLegend['width'],
-                                               paperInstr = page)
-            rasterLegend['rect'] = wx.Rect2D(x = float(rasterLegend['where'][0]), y = float(rasterLegend['where'][1]),
-                                             w = width, h = height)
-            
-        # vectors, vlegend        
-        
-        if vector:
-            for vmap in vectorMaps:
-                for i, each in enumerate(vector['list']):
-                    if each[2] == vmap.id:
-                        
-                        vector['list'][i][4] = vmap['label']
-                        vector['list'][i][3] = vmap['lpos']
-            if vectorLegend:
-                size = vectorLegend.EstimateSize(vectorInstr = vector, fontsize = vectorLegend['fontsize'],
-                                                 width = vectorLegend['width'], cols = vectorLegend['cols'])                            
-                vectorLegend['rect'] = wx.Rect2D(x = float(vectorLegend['where'][0]), y = float(vectorLegend['where'][1]),
-                                                 w = size[0], h = size[1])
-        
-        
-        page = self.FindInstructionByType('page')
-        if not page:
-            page = PageSetup(wx.NewId())
-            self.AddInstruction(page)
-        else:
-            page['Orientation'] = orientation
-
-
-        #
-        return True
-    
-    def SendToRead(self, instruction, text, **kwargs):
-        psmapInstrDict = dict(paper = ['page'],
-                              maploc = ['map'],
-                              scale = ['map'],
-                              border = ['map'],
-                              raster = ['raster'],
-                              mapinfo = ['mapinfo'],
-                              scalebar = ['scalebar'],
-                              text = ['text'],
-                              vpoints = ['vector', 'vProperties'],
-                              vlines = ['vector', 'vProperties'],
-                              vareas = ['vector', 'vProperties'],
-                              colortable = ['rasterLegend'],
-                              vlegend = ['vectorLegend']
-                              )
-        
-        myInstrDict = dict(page = PageSetup,
-                           map = MapFrame,
-                           raster = Raster,
-                           mapinfo = Mapinfo,
-                           scalebar = Scalebar,
-                           text = Text,
-                           rasterLegend = RasterLegend,
-                           vectorLegend = VectorLegend,
-                           vector = Vector,
-                           vProperties = VProperties
-                           )
-        
-        myInstruction = psmapInstrDict[instruction]
-        
-        for i in myInstruction:
-            instr = self.FindInstructionByType(i)
-            if i in ('text', 'vProperties') or not instr:
-                
-                id = wx.NewId() #!vProperties expect subtype
-                if i == 'vProperties':
-                    id = kwargs['id']
-                    newInstr = myInstrDict[i](id, subType = instruction[1:])
-                else:
-                    newInstr = myInstrDict[i](id)
-                ok = newInstr.Read(instruction, text, **kwargs)
-                if ok:
-                    self.AddInstruction(newInstr)
-                else:
-                    return False
-
-            else:
-                ok = instr.Read(instruction, text, **kwargs)
-
-                if not ok:
-                    return False
-        return True
-    
-    def SetRegion(self, regionInstruction):
-        """!Sets region from file comment or sets current region in case of no comment"""
-        map = MapFrame(wx.NewId())
-        self.AddInstruction(map)
-        if regionInstruction:
-            cmd = CmdToTuple(regionInstruction.strip('# ').split())
-            
-            # define scaleType
-            if len(cmd[1]) <= 3:
-                if 'rast' in cmd[1]:
-                    map['scaleType'] = 0
-                    map['mapType'] = 'raster'   
-                    map['map'] = cmd[1]['rast']  
-                elif 'vect' in cmd[1]:
-                    map['scaleType'] = 0
-                    map['mapType'] = 'vector' 
-                    map['map'] = cmd[1]['vect']  
-                elif 'region' in cmd[1]:
-                    map['scaleType'] = 1  
-                    map['region'] = cmd[1]['region']
-                    
-            else:
-                map['scaleType'] = 2  
-        else:
-            map['scaleType'] = 2
-            grass.del_temp_region()
-            region = grass.region()
-            grass.use_temp_region()    
-            cmd = ['g.region', region]
-        cmdString = GetCmdString(cmd).replace('g.region', '')
-        GMessage(_("Instruction file will be loaded with following region: %s\n") % cmdString)
-        try:
-            RunCommand(cmd[0], **cmd[1])
-            
-        except grass.ScriptError, e:
-            GError(_("Region cannot be set\n%s") % e)
-            return False
-        
-
-class InstructionObject:
-    """!Abtract class representing single instruction"""
-    def __init__(self, id): 
-        self.id = id
-        
-        # default values
-        self.defaultInstruction = dict()
-        # current values
-        self.instruction = self.defaultInstruction   
-        # converting units
-        self.unitConv = UnitConversion() 
-    
-    def __str__(self):
-        """!Returns particular part of text instruction"""
-        return ''
-    
-    def __getitem__(self, key):
-        for each in self.instruction.keys():
-            if each == key:
-                return self.instruction[key]
-        return None
-    
-    def __setitem__(self, key, value):
-        self.instruction[key] = value
-    
-    def GetInstruction(self):
-        """!Get current values"""
-        return self.instruction
-    
-    def SetInstruction(self, instruction):
-        """!Set default values"""
-        self.instruction = instruction
-        
-    def Read(self, instruction, text, **kwargs):
-        """!Read instruction and save them"""
-        pass
-    
-class InitMap(InstructionObject):
-    """!Class representing virtual map"""
-    def __init__(self, id):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'initMap'
-        
-        # default values
-        self.defaultInstruction = dict(rect = None, scale =  None)
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-        
-    
-class MapFrame(InstructionObject):
-    """!Class representing map (instructions maploc, scale, border)"""
-    def __init__(self, id):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'map'
-        # default values
-        self.defaultInstruction = dict(map = None, mapType = None, drawMap = True, region = None,
-                                       rect = wx.Rect2D(), scaleType = 0, scale = None, center = None,
-                                       resolution = 300, border = 'y', width = 1, color = '0:0:0') 
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-        
-    def __str__(self):
-        instr = ''
-        comment = ''
-        
-        #region settings
-        region = grass.region()
-        if self.instruction['scaleType'] == 0: #match map
-            map = self.instruction['map']
-            if self.instruction['mapType'] == 'raster':
-                comment = "# g.region rast=%s nsres=%s ewres=%s\n" % (map, region['nsres'], region['ewres'])
-            else:
-                comment = "# g.region vect=%s\n" % (map)
-        elif self.instruction['scaleType'] == 1:# saved region
-            region = self.instruction['region']
-            comment = "# g.region region=%s\n" % region
-        elif self.instruction['scaleType'] in (2, 3): #current region, fixed scale
-            comment = string.Template("# g.region n=$n s=$s e=$e w=$w rows=$rows cols=$cols \n").substitute(**region)
-        
-        instr += comment
-        instr += '\n'
-        # maploc
-        maplocInstruction = "maploc %.3f %.3f" % (self.instruction['rect'].x, self.instruction['rect'].y)
-        if self.instruction['scaleType'] != 3:
-            maplocInstruction += "  %.3f %.3f"% (self.instruction['rect'].width, self.instruction['rect'].height)
-        instr += maplocInstruction
-        instr += '\n'
-        
-        # scale
-        if self.instruction['scaleType'] == 3: #fixed scale
-            scaleInstruction = "scale 1:%.0f" % (1/self.instruction['scale'])
-            instr += scaleInstruction
-            instr += '\n'
-        # border
-        borderInstruction = ''
-        if self.instruction['border'] == 'n':
-            borderInstruction = "border n"
-        else:
-            borderInstruction = "border y\n"
-            borderInstruction += string.Template("    width $width\n    color $color\n").substitute(self.instruction)
-            borderInstruction += "    end"
-        instr += borderInstruction
-        instr += '\n'
-
-        return instr  
-    
-    def Read(self, instruction, text, **kwargs):
-        """!Read instruction and save information"""
-        if 'isRegionComment' in kwargs:
-            isRegionComment = kwargs['isRegionComment']
-        instr = {}
-        
-        if instruction == 'border':
-            for line in text:
-                if line.startswith('end'):
-                    break
-                try:
-                    if line.split()[1].lower() in ('n', 'no', 'none'):
-                        instr['border'] = 'n'
-                        break
-                    elif line.split()[1].lower() in ('y', 'yes'):
-                        instr['border'] = 'y'
-                    elif line.startswith('width'):
-                        instr['width'] = line.split()[1]
-                    elif line.startswith('color'):
-                        instr['color'] = line.split()[1]
-                except IndexError:
-                    GError(_("Failed to read instruction %s") % instruction)
-                    return False
-                
-        elif instruction == 'scale':
-            try:
-                scaleText = text.strip('scale ').split(':')[1]
-                # when scale instruction given and region comment also, then scaletype is fixed scale
-                if not isRegionComment:
-                    instr['scaleType'] = 2 
-                else:
-                    instr['scaleType'] = 3
-
-                scale = 1/float(scaleText)
-                if abs(scale - self.instruction['scale']) > (0.01 * scale):
-                    GWarning(_("Scale has changed, old value: %(old)s\nnew value: %(new)s") % \
-                                 { 'old' : scale, 'new' : self.instruction['scale'] })
-            except (ValueError, IndexError):
-                GError(_("Failed to read instruction %s.\nUse 1:25000 notation.") % instruction)
-                return False
-        
-        elif instruction == 'maploc':
-            maploc = text.strip('maploc ').split()
-            if len(maploc) >= 2:
-                if  abs(self.instruction['rect'].Get()[0] - float(maploc[0])) > 0.5 or \
-                        abs(self.instruction['rect'].Get()[1] - float(maploc[1])) > 0.5:
-                    GWarning(_("Map frame position changed, old value: %(old1)s %(old2)s\nnew value: %(new1)s %(new2)s") % \
-                                 { 'old1' : maploc[0], 'old2' : maploc[1],
-                                   'new1' : self.instruction['rect'].Get()[0], 'new2' : self.instruction['rect'].Get()[1] })
-                    
-                #instr['rect'] = wx.Rect2D(float(maploc[0]), float(maploc[1]), self.instruction['rect'][2], self.instruction['rect'][3])
-            if len(maploc) == 4:
-                if  abs(self.instruction['rect'].Get()[2] - float(maploc[2])) > 0.5 or \
-                        abs(self.instruction['rect'].Get()[3] - float(maploc[3])) > 0.5:
-                    GWarning(_("Map frame size changed, old value: %(old1)s %(old2)s\nnew value: %(new1)s %(new2)s") % \
-                                 { 'old1' : maploc[2], 'old2' : maploc[3],
-                                   'new1' : self.instruction['rect'].Get()[2], 'new2' : self.instruction['rect'].Get()[3] })
-                #instr['rect'] = wx.Rect2D(*map(float, maploc))
-        self.instruction.update(instr)   
-        return True 
-    
-class PageSetup(InstructionObject):
-    """!Class representing page instruction"""
-    def __init__(self, id):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'page'
-        # default values
-        self.defaultInstruction = dict(Units = 'inch', Format = 'a4', Orientation = 'Portrait',
-                                       Width = 8.268, Height = 11.693, Left = 0.5, Right = 0.5, Top = 1, Bottom = 1)
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-        
-    def __str__(self):
-        if self.instruction['Format'] == 'custom':
-            instr = string.Template("paper\n    width $Width\n    height $Height\n").substitute(self.instruction)
-        else:
-            instr = string.Template("paper $Format\n").substitute(self.instruction)
-        instr += string.Template("    left $Left\n    right $Right\n    bottom $Bottom\n    top $Top\n    end").substitute(self.instruction)
-
-        return instr
-    
-    def Read(self, instruction, text, **kwargs):
-        """!Read instruction and save information"""
-        instr = {}
-        self.cats = ['Width', 'Height', 'Left', 'Right', 'Top', 'Bottom']
-        self.subInstr = dict(zip(['width', 'height', 'left', 'right', 'top', 'bottom'], self.cats))
-        
-        if instruction == 'paper': # just for sure
-            for line in text:
-                if line.startswith('paper'): 
-                    if len(line.split()) > 1:
-                        pformat = line.split()[1]
-                        availableFormats = self._toDict(grass.read_command('ps.map', flags = 'p',
-                                                                           quiet = True))
-                        # e.g. paper a3 
-                        try:
-                            instr['Format'] = pformat
-                            for key, value in availableFormats[pformat].iteritems():
-                                instr[key] = float(value)
-                            break
-                        except KeyError:
-                            GError(_("Failed to read instruction %(file)s.\nUnknown format %(for)s") % \
-                                       { 'file' : instruction, 'for' : format })
-                            return False
-                    else:
-                        # paper
-                        # width ...
-                        instr['Format'] = 'custom'
-                # read subinstructions
-                elif instr['Format'] == 'custom' and not line.startswith('end'):
-                    text = line.split()
-                    try:
-                        instr[self.subInstr[text[0]]] = float(text[1])
-                    except  (IndexError, KeyError):
-                        GError(_("Failed to read instruction %s.") % instruction)
-                        return False
-                    
-            if 'Orientation' in kwargs and kwargs['Orientation'] == 'Landscape':
-                instr['Width'], instr['Height'] = instr['Height'], instr['Width']
-                
-            self.instruction.update(instr)
-        return True  
-    
-    def _toDict(self, paperStr):    
-        sizeDict = dict()
-#     cats = self.subInstr[ 'Width', 'Height', 'Left', 'Right', 'Top', 'Bottom']
-        for line in paperStr.strip().split('\n'):
-            d = dict(zip(self.cats, line.split()[1:]))
-            sizeDict[line.split()[0]] = d
-            
-        return sizeDict    
-    
-class Mapinfo(InstructionObject):
-    """!Class representing mapinfo instruction"""
-    def __init__(self, id):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'mapinfo'
-        # default values
-        self.defaultInstruction = dict(unit = 'inch', where = (0, 0),
-                                       font = 'Helvetica', fontsize = 10, color = '0:0:0', background = 'none', 
-                                       border = 'none', rect = None)
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-        
-    def __str__(self):
-        instr = "mapinfo\n"
-        instr += "    where %.3f %.3f\n" % (self.instruction['where'][0], self.instruction['where'][1])
-        instr += string.Template("    font $font\n    fontsize $fontsize\n    color $color\n").substitute(self.instruction)            
-        instr += string.Template("    background $background\n    border $border\n").substitute(self.instruction)  
-        instr += "    end"
-        return instr
-    
-    def Read(self, instruction, text):
-        """!Read instruction and save information"""
-        instr = {}
-        try:
-            for line in text:
-                sub = line.split(None,1)
-                if sub[0] == 'font':
-                    instr['font'] = sub[1]
-                elif sub[0] == 'fontsize':
-                    instr['fontsize'] = int(sub[1])
-                elif sub[0] == 'color':
-                    instr['color'] = sub[1]
-                elif sub[0] == 'background':
-                    instr['background'] = sub[1]
-                elif sub[0] == 'border':
-                    instr['border'] = sub[1]
-                elif sub[0] == 'where':
-                    instr['where'] = float(sub[1].split()[0]), float(sub[1].split()[1])
-        except (ValueError, IndexError):
-            GError(_("Failed to read instruction %s") % instruction)
-            return False
-        self.instruction.update(instr)
-        self.instruction['rect'] = self.EstimateRect(mapinfoDict = self.instruction)
-        return True
-    
-    def EstimateRect(self, mapinfoDict):
-        """!Estimate size to draw mapinfo"""
-        w = mapinfoDict['fontsize'] * 20 # any better estimation? 
-        h = mapinfoDict['fontsize'] * 7
-        width = self.unitConv.convert(value = w, fromUnit = 'point', toUnit = 'inch')
-        height = self.unitConv.convert(value = h, fromUnit = 'point', toUnit = 'inch')
-        return wx.Rect2D(x = float(mapinfoDict['where'][0]), y = float(mapinfoDict['where'][1]), w = width, h = height)
-    
-class Text(InstructionObject):
-    """!Class representing text instruction"""
-    def __init__(self, id):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'text'
-        # default values
-        self.defaultInstruction = dict(text = "", font = "Helvetica", fontsize = 10, color = 'black', background = 'none',
-                                       hcolor = 'none', hwidth = 1, border = 'none', width = '1', XY = True,
-                                       where = (0,0), unit = 'inch', rotate = None, 
-                                       ref = "center center", xoffset = 0, yoffset = 0, east = None, north = None)
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-        
-    def __str__(self):
-        text = self.instruction['text'].replace('\n','\\n')
-        instr = "text %s %s" % (self.instruction['east'], self.instruction['north'])
-        try:
-            instr += " %s\n" % text.encode('latin_1')
-        except UnicodeEncodeError, err:
-            try:
-                pos = str(err).split('position')[1].split(':')[0].strip()
-            except IndexError:
-                pos = ''
-            if pos:
-                message = _("Characters on position %s are not supported "
-                            "by ISO-8859-1 (Latin 1) encoding "
-                            "which is required by module ps.map.") % pos
-            else:
-                message = _("Not all characters are supported "
-                            "by ISO-8859-1 (Latin 1) encoding "
-                            "which is required by module ps.map.")
-            GMessage(message = message)
-            return ''
-        instr += (string.Template("    font $font\n    fontsize $fontsize\n    color $color\n").
-                                                                   substitute(self.instruction).
-                                                                   encode('latin_1'))
-        instr += string.Template("    hcolor $hcolor\n").substitute(self.instruction).encode('latin_1')
-        if self.instruction['hcolor'] != 'none':
-            instr += string.Template("    hwidth $hwidth\n").substitute(self.instruction).encode('latin_1')
-        instr += string.Template("    border $border\n").substitute(self.instruction).encode('latin_1')
-        if self.instruction['border'] != 'none':
-            instr += string.Template("    width $width\n").substitute(self.instruction).encode('latin_1')
-        instr += string.Template("    background $background\n").substitute(self.instruction).encode('latin_1')
-        if self.instruction["ref"] != '0':
-            instr += string.Template("    ref $ref\n").substitute(self.instruction).encode('latin_1')
-        if self.instruction["rotate"]:
-            instr += string.Template("    rotate $rotate\n").substitute(self.instruction).encode('latin_1')
-        if float(self.instruction["xoffset"]) or float(self.instruction["yoffset"]):
-            instr += (string.Template("    xoffset $xoffset\n    yoffset $yoffset\n").
-                                                            substitute(self.instruction).encode('latin_1'))
-        instr += "    end"
-        return instr
-    
-    def Read(self, instruction, text, **kwargs):
-        """!Read instruction and save information"""
-        map = kwargs['mapInstruction']
-        instr = {}
-        for line in text:
-            try:
-                sub = line.split(None, 1)[0]
-                if sub == 'text':
-                    e, n = line.split(None, 3)[1:3]
-                    if '%' in e and '%' in n:
-                        instr['XY'] = True
-                        instr['east'], instr['north'] = self.PercentToReal(e, n)
-                    else:
-                        instr['XY'] = False
-                        instr['east'], instr['north'] = float(e), float(n)
-                        
-                    instr['text'] = line.split(None, 3)[3]
-                
-                elif sub == 'font':
-                    instr['font'] = line.split(None, 1)[1]
-                elif sub == 'fontsize':
-                    instr['fontsize'] = float(line.split(None, 1)[1])
-                elif sub == 'color':
-                    instr['color'] = line.split(None, 1)[1]
-                elif sub == 'width':
-                    instr['width'] = line.split(None, 1)[1]
-                elif sub == 'hcolor':
-                    instr['hcolor'] = line.split(None, 1)[1]
-                elif sub == 'hwidth':
-                    instr['hwidth'] = line.split(None, 1)[1]
-                elif sub == 'background':
-                    instr['background'] = line.split(None, 1)[1]
-                elif sub == 'border':
-                    instr['border'] = line.split(None, 1)[1]
-                elif sub == 'ref':
-                    instr['ref'] = line.split(None, 1)[1]
-                elif sub == 'rotate':
-                    instr['rotate'] = float(line.split(None, 1)[1])
-                elif sub == 'xoffset':
-                    instr['xoffset'] = int(line.split(None, 1)[1])
-                elif sub == 'yoffset':
-                    instr['yoffset'] = int(line.split(None, 1)[1])
-                elif sub == 'opaque':
-                    if line.split(None, 1)[1].lower() in ('n', 'none'):
-                        instr['background'] = 'none'
-                        
-            except(IndexError, ValueError):
-                GError(_("Failed to read instruction %s") % instruction)
-                return False
-        instr['where'] = PaperMapCoordinates(map = map, x = instr['east'], y = instr['north'], paperToMap = False)       
-        self.instruction.update(instr)
-
-        return True 
-    
-    def PercentToReal(self, e, n):
-        """!Converts text coordinates from percent of region to map coordinates"""
-        e, n = float(e.strip('%')), float(n.strip('%'))
-        region = grass.region()
-        N = region['s'] + (region['n'] - region['s']) / 100 * n
-        E = region['w'] + (region['e'] - region['w']) / 100 * e
-        return E, N
-    
-class Scalebar(InstructionObject):
-    """!Class representing scalebar instruction"""
-    def __init__(self, id):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'scalebar'
-        # default values
-        self.defaultInstruction = dict(unit = 'inch', where = (1,1),
-                                       unitsLength = 'auto', unitsHeight = 'inch',
-                                       length = None, height = 0.1, rect = None,
-                                       fontsize = 10, background = 'y',
-                                       scalebar = 'f', segment = 4, numbers = 1)
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-        
-    def __str__(self):
-        instr = string.Template("scalebar $scalebar\n").substitute(self.instruction)
-        instr += "    where %.3f %.3f\n" % (self.instruction['where'][0], self.instruction['where'][1])
-        instr += string.Template("    length $length\n    units $unitsLength\n").substitute(self.instruction)
-        instr += string.Template("    height $height\n").substitute(self.instruction)
-        instr += string.Template("    segment $segment\n    numbers $numbers\n").substitute(self.instruction)
-        instr += string.Template("    fontsize $fontsize\n    background $background\n").substitute(self.instruction)
-        instr += "    end"
-        return instr
-    
-    def Read(self, instruction, text, **kwargs):
-        """!Read instruction and save information"""
-        scale = kwargs['scale']
-        instr = {}
-        for line in text:
-            try:
-                if line.startswith('scalebar'):
-                    if 'scalebar s' in line:
-                        instr['scalebar'] = 's'
-                    else:
-                        instr['scalebar'] = 'f'
-                elif line.startswith('where'):
-                    instr['where'] = map(float, line.split()[1:3])
-                elif line.startswith('length'):
-                    instr['length'] = float(line.split()[1])
-                elif line.startswith('units'):
-                    if line.split()[1] in ['auto', 'meters', 'kilometers', 'feet', 'miles', 'nautmiles']:
-                        instr['unitsLength'] = line.split()[1]
-                elif line.startswith('height'):
-                    instr['height'] = float(line.split()[1])
-                elif line.startswith('fontsize'):
-                    instr['fontsize'] = float(line.split()[1])
-                elif line.startswith('numbers'):
-                    instr['numbers'] = int(line.split()[1])
-                elif line.startswith('segment'):
-                    instr['segment'] = int(line.split()[1])
-                elif line.startswith('background'):
-                    if line.split()[1].strip().lower() in ('y','yes'):
-                        instr['background'] = 'y'
-                    elif line.split()[1].strip().lower() in ('n','no', 'none'):
-                        instr['background'] = 'n'
-            except(IndexError, ValueError):
-                GError(_("Failed to read instruction %s") % instruction)
-                return False
-            
-        self.instruction.update(instr)
-        w, h = self.EstimateSize(scalebarDict = self.instruction, scale = scale)
-        x = self.instruction['where'][0] - w / 2 
-        y = self.instruction['where'][1] - h / 2
-        self.instruction['rect'] = wx.Rect2D(x, y, w, h)
-        return True 
-    
-    def EstimateSize(self, scalebarDict, scale):
-        """!Estimate size to draw scalebar"""
-        units = projInfo()['units']
-        if not units or units not in self.unitConv.getAllUnits():
-            units = 'meters'
-        if scalebarDict['unitsLength'] != 'auto':
-            length = self.unitConv.convert(value = scalebarDict['length'], fromUnit = scalebarDict['unitsLength'], toUnit = 'inch')
-        else:
-            length = self.unitConv.convert(value = scalebarDict['length'], fromUnit = units, toUnit = 'inch')
-            
-        length *= scale
-        length *= 1.1 #for numbers on the edge
-        height = scalebarDict['height'] + 2 * self.unitConv.convert(value = scalebarDict['fontsize'], fromUnit = 'point', toUnit = 'inch')     
-        return (length, height)
-    
-class RasterLegend(InstructionObject):
-    """!Class representing colortable instruction"""
-    def __init__(self, id):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'rasterLegend'
-        # default values
-        self.defaultInstruction = dict(rLegend = False, unit = 'inch', rasterDefault = True, raster = None,
-                                       discrete = None, type = None,
-                                       where = (0, 0),
-                                       width = None, height = None, cols = 1, font = "Helvetica", fontsize = 10,
-                                       #color = '0:0:0', tickbar = False, range = False, min = 0, max = 0,
-                                       color = 'black', tickbar = 'n', range = False, min = 0, max = 0,
-                                       nodata = 'n')
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-        
-    def __str__(self):
-        instr = "colortable y\n"
-        instr += string.Template("    raster $raster\n").substitute(self.instruction)
-        instr += "    where %.3f %.3f\n" % (self.instruction['where'][0], self.instruction['where'][1])
-        if self.instruction['width']:
-            instr += string.Template("    width $width\n").substitute(self.instruction)
-        instr += string.Template("    discrete $discrete\n").substitute(self.instruction)
-        if self.instruction['discrete'] == 'n':
-            if self.instruction['height']:
-                instr += string.Template("    height $height\n").substitute(self.instruction)
-            instr += string.Template("    tickbar $tickbar\n").substitute(self.instruction)
-            if self.instruction['range']:
-                instr += string.Template("    range $min $max\n").substitute(self.instruction)
-        else:
-            instr += string.Template("    cols $cols\n").substitute(self.instruction)
-            instr += string.Template("    nodata $nodata\n").substitute(self.instruction)
-        instr += string.Template("    font $font\n    fontsize $fontsize\n    color $color\n")\
-            .substitute(self.instruction)
-        instr += "    end"
-        return instr    
-    
-    
-    def Read(self, instruction, text, **kwargs):
-        """!Read instruction and save information"""
-        instr = {}
-        instr['rLegend'] = True
-        for line in text:
-            try:
-                if line.startswith('where'):
-                    instr['where'] = map(float, line.split()[1:3])
-                elif line.startswith('font '):
-                    instr['font'] = line.split()[1]
-                elif line.startswith('fontsize'):
-                    instr['fontsize'] = float(line.split()[1])
-                elif line.startswith('color '):
-                    instr['color'] = line.split()[1]
-                elif line.startswith('raster'):
-                    instr['raster'] = line.split()[1]
-                elif line.startswith('width'):
-                    instr['width'] = float(line.split()[1])
-                elif line.startswith('height'):
-                    instr['height'] = float(line.split()[1])
-                elif line.startswith('cols'):
-                    instr['cols'] = int(line.split()[1])                    
-                elif line.startswith('range'):
-                    instr['range'] = True
-                    instr['min'] = float(line.split()[1])
-                    instr['max'] = float(line.split()[2])
-                elif line.startswith('nodata'):
-                    if line.split()[1].strip().lower() in ('y','yes'):
-                        instr['nodata'] = 'y'
-                    elif line.split()[1].strip().lower() in ('n','no', 'none'):
-                        instr['nodata'] = 'n'
-                elif line.startswith('tickbar'):
-                    if line.split()[1].strip().lower() in ('y','yes'):
-                        instr['tickbar'] = 'y'
-                    elif line.split()[1].strip().lower() in ('n','no', 'none'):
-                        instr['tickbar'] = 'n'
-                elif line.startswith('discrete'):
-                    if line.split()[1].strip().lower() in ('y','yes'):
-                        instr['discrete'] = 'y'
-                    elif line.split()[1].strip().lower() in ('n','no', 'none'):
-                        instr['discrete'] = 'n'            
-
-            except(IndexError, ValueError):
-                GError(_("Failed to read instruction %s") % instruction)
-                return False
-            
-        if 'raster' in instr:
-            instr['rasterDefault'] = False
-            if 'discrete' not in instr:
-                rasterType = getRasterType(map = instr['raster'])
-                instr['type'] = rasterType
-                if rasterType == 'CELL':
-                    instr['discrete'] = 'y'
-                else:
-                    instr['discrete'] = 'n'
-            
-        else:
-            instr['rasterDefault'] = True
-        self.instruction.update(instr)
-        # add 'rect' in the end
-            
-        return True 
-    
-    def EstimateHeight(self, raster, discrete, fontsize, cols = None,  height = None):
-        """!Estimate height to draw raster legend"""
-        if discrete == 'n':
-            if height:
-                height = height
-            else:
-                height = self.unitConv.convert(value = fontsize * 10,
-                                                    fromUnit = 'point', toUnit = 'inch')
-                                                    
-        if discrete == 'y':
-            if cols:
-                cols = cols 
-            else:
-                cols = 1 
-
-            rinfo = grass.raster_info(raster)
-            if rinfo['datatype'] in ('DCELL', 'FCELL'):
-                minim, maxim = rinfo['min'], rinfo['max']
-                rows = ceil(maxim / cols )
-            else:
-                cat = grass.read_command('r.category', map = raster,
-                                    fs = ':').strip().split('\n')
-                rows = ceil(float(len(cat)) / cols )
-                            
-                
-            height = self.unitConv.convert(value =  1.5 * rows * fontsize, fromUnit = 'point', toUnit = 'inch')
-            
-        return height
-        
-    def EstimateWidth(self, raster, discrete, fontsize, cols = None, width = None, paperInstr = None):
-        """!Estimate size to draw raster legend"""
-        
-        if discrete == 'n':
-            rinfo = grass.raster_info(raster)
-            minim, maxim = rinfo['min'], rinfo['max']
-            if width:
-                width = width
-            else:
-                width = self.unitConv.convert(value = fontsize * 2,
-                                                    fromUnit = 'point', toUnit = 'inch')
-            text = len(max(str(minim), str(maxim), key = len))
-            textPart = self.unitConv.convert(value = text * fontsize / 2,
-                                                    fromUnit = 'point', toUnit = 'inch')
-            width += textPart
-                                                    
-        elif discrete == 'y':
-            if cols:
-                cols = cols 
-            else:
-                cols = 1    
-
-            if width:
-                width = width
-            else:
-                paperWidth = paperInstr['Width'] - paperInstr['Right'] - paperInstr['Left']
-                width = (paperWidth / cols) * (cols - 1) + 1
-                
-        return width    
-             
-class VectorLegend(InstructionObject):
-    """!Class representing colortable instruction"""
-    def __init__(self, id):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'vectorLegend'
-        # default values
-        self.defaultInstruction = dict(vLegend = False, unit = 'inch', where = (0, 0),
-                                                defaultSize = True, width = 0.4, cols = 1, span = None,
-                                                font = "Helvetica", fontsize = 10,
-                                                border = 'none')
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-        
-    def __str__(self):
-        instr = "vlegend\n"
-        instr += "    where %.3f %.3f\n" % (self.instruction['where'][0], self.instruction['where'][1])
-        instr += string.Template("    font $font\n    fontsize $fontsize\n").substitute(self.instruction)
-        instr += string.Template("    width $width\n    cols $cols\n").substitute(self.instruction)
-        if self.instruction['span']:
-            instr += string.Template("    span $span\n").substitute(self.instruction)
-        instr += string.Template("    border $border\n").substitute(self.instruction)  
-        instr += "    end"  
-        return instr
-
-    def Read(self, instruction, text, **kwargs):
-        """!Read instruction and save information"""
-        instr = {}
-        instr['vLegend'] = True
-        for line in text:
-            try:
-                if line.startswith('where'):
-                    instr['where'] = map(float, line.split()[1:3])
-                elif line.startswith('font '):
-                    instr['font'] = line.split()[1]
-                elif line.startswith('fontsize'):
-                    instr['fontsize'] = float(line.split()[1])
-                elif line.startswith('width'):
-                    instr['width'] = float(line.split()[1])
-                elif line.startswith('cols'):
-                    instr['cols'] = int(line.split()[1]) 
-                elif line.startswith('span'):
-                    instr['span'] = float(line.split()[1])
-                elif line.startswith('border'):
-                    instr['border'] = line.split()[1]
-                    
-            except(IndexError, ValueError):
-                GError(_("Failed to read instruction %s") % instruction)
-                return False
-            
-        self.instruction.update(instr)
-            
-        return True 
-    
-    def EstimateSize(self, vectorInstr, fontsize, width = None, cols = None):
-        """!Estimate size to draw vector legend"""
-        if width:
-            width = width 
-        else:
-            width = fontsize/24.0
-
-        if cols:
-            cols = cols 
-        else:
-            cols = 1
-
-        vectors = vectorInstr['list']
-        labels = [vector[4] for vector in vectors if vector[3] != 0]
-        extent = (len(max(labels, key = len)) * fontsize / 2, fontsize)
-        wExtent = self.unitConv.convert(value = extent[0], fromUnit = 'point', toUnit = 'inch')
-        hExtent = self.unitConv.convert(value = extent[1], fromUnit = 'point', toUnit = 'inch')
-        w = (width + wExtent) * cols
-        h = len(labels) * hExtent / cols
-        h *= 1.1
-        return (w, h)
-            
-   
-class Raster(InstructionObject):
-    """!Class representing raster instruction"""
-    def __init__(self, id):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'raster'
-        # default values
-        self.defaultInstruction = dict(isRaster = False, raster = None)
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-        
-    def __str__(self):
-        instr = string.Template("raster $raster").substitute(self.instruction)
-        return instr
-    
-    def Read(self, instruction, text):
-        """!Read instruction and save information"""
-        instr = {}
-        instr['isRaster'] = True
-        try:
-            map = text.split()[1]
-        except IndexError:
-            GError(_("Failed to read instruction %s") % instruction)
-            return False
-        try:
-            info = grass.find_file(map, element = 'cell')
-        except grass.ScriptError, e:
-            GError(message = e.value)
-            return False
-        instr['raster'] = info['fullname']
 
-        
-        self.instruction.update(instr)
-        return True
-    
-class Vector(InstructionObject):
-    """!Class keeps vector layers"""
-    def __init__(self, id):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'vector'
-        # default values
-        self.defaultInstruction = dict(list = None)# [vmap, type, id, lpos, label] 
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-    def __str__(self):
-        return ''
-    
-    def Read(self, instruction, text, **kwargs):
-        """!Read instruction and save information"""
-        instr = {}
-        
-        for line in text:
-            if line.startswith('vpoints') or line.startswith('vlines') or line.startswith('vareas'):
-                # subtype
-                if line.startswith('vpoints'):
-                    subType = 'points'
-                elif line.startswith('vlines'):
-                    subType = 'lines'
-                elif line.startswith('vareas'):
-                    subType = 'areas'
-                # name of vector map
-                vmap = line.split()[1]
-                try:
-                    info = grass.find_file(vmap, element = 'vector')
-                except grass.ScriptError, e:
-                    GError(message = e.value)
-                    return False
-                vmap = info['fullname']
-                # id
-                id = kwargs['id']
-                # lpos
-                lpos = kwargs['vectorMapNumber']
-                #label
-                label = '('.join(vmap.split('@')) + ')'
-                break
-        instr = [vmap, subType, id, lpos, label] 
-        if not self.instruction['list']:
-            self.instruction['list'] = []
-        self.instruction['list'].append(instr)
-        
-        return True    
-    
-class VProperties(InstructionObject):
-    """!Class represents instructions vareas, vlines, vpoints"""
-    def __init__(self, id, subType):
-        InstructionObject.__init__(self, id = id)
-        self.type = 'vProperties'
-        self.subType = subType
-        # default values
-        if self.subType == 'points':
-            dd = dict(subType  = 'points', name = None, type = 'point or centroid', connection = False, layer = '1',
-                        masked = 'n', color = '0:0:0', width = 1,
-                        fcolor = '255:0:0', rgbcolumn = None, symbol = os.path.join('basic', 'x'), eps = None,
-                        size = 5, sizecolumn = None, scale = None,
-                        rotation = False, rotate = 0, rotatecolumn = None, label = None, lpos = None)
-        elif self.subType == 'lines':
-            dd = dict(subType = 'lines', name = None, type = 'line or boundary', connection = False, layer = '1',
-                        masked = 'n', color = '0:0:0', hwidth = 1,
-                        hcolor = 'none', rgbcolumn = None,
-                        width = 1, cwidth = None,
-                        style = 'solid', linecap = 'butt', label = None, lpos = None)
-        else: # areas
-            dd = dict(subType = 'areas', name = None, connection = False, layer = '1',    
-                        masked = 'n', color = '0:0:0', width = 1,
-                        fcolor = 'none', rgbcolumn = None,
-                        pat = None, pwidth = 1, scale = 1, label = None, lpos = None)
-        self.defaultInstruction = dd
-        # current values
-        self.instruction = dict(self.defaultInstruction)
-        
-    def __str__(self):
-        dic = self.instruction
-        vInstruction = string.Template("v$subType $name\n").substitute(dic)
-        #data selection
-        if self.subType in ('points', 'lines'):
-           vInstruction += string.Template("    type $type\n").substitute(dic) 
-        if dic['connection']:
-            vInstruction += string.Template("    layer $layer\n").substitute(dic)
-            if dic.has_key('cats'):
-                vInstruction += string.Template("    cats $cats\n").substitute(dic)
-            elif dic.has_key('where'):
-                    vInstruction += string.Template("    where $where\n").substitute(dic)
-        vInstruction += string.Template("    masked $masked\n").substitute(dic)
-        #colors
-        vInstruction += string.Template("    color $color\n").substitute(dic)
-        if self.subType in ('points', 'areas'):
-            if dic['color'] != 'none':
-                vInstruction += string.Template("    width $width\n").substitute(dic)
-            if dic['rgbcolumn']:
-                vInstruction += string.Template("    rgbcolumn $rgbcolumn\n").substitute(dic)
-            vInstruction += string.Template("    fcolor $fcolor\n").substitute(dic)
-        else:
-            if dic['rgbcolumn']:
-                vInstruction += string.Template("    rgbcolumn $rgbcolumn\n").substitute(dic)
-            elif dic['hcolor'] != 'none':
-                vInstruction += string.Template("    hwidth $hwidth\n").substitute(dic)
-                vInstruction += string.Template("    hcolor $hcolor\n").substitute(dic)
-        
-        # size and style
-        if self.subType == 'points':
-            if dic['symbol']:
-                vInstruction += string.Template("    symbol $symbol\n").substitute(dic)
-            else: #eps
-                vInstruction += string.Template("    eps $eps\n").substitute(dic)
-            if dic['size']:
-                vInstruction += string.Template("    size $size\n").substitute(dic)            
-            else: # sizecolumn
-                vInstruction += string.Template("    sizecolumn $sizecolumn\n").substitute(dic)
-                vInstruction += string.Template("    scale $scale\n").substitute(dic)
-            if dic['rotation']:
-                if dic['rotate'] is not None:
-                    vInstruction += string.Template("    rotate $rotate\n").substitute(dic)
-                else:
-                    vInstruction += string.Template("    rotatecolumn $rotatecolumn\n").substitute(dic)
-                    
-        if self.subType == 'areas':
-            if dic['pat'] is not None:
-                vInstruction += string.Template("    pat $pat\n").substitute(dic)
-                vInstruction += string.Template("    pwidth $pwidth\n").substitute(dic)
-                vInstruction += string.Template("    scale $scale\n").substitute(dic)
-                
-        if self.subType == 'lines':
-            if dic['width'] is not None:
-                vInstruction += string.Template("    width $width\n").substitute(dic)
-            else:
-                vInstruction += string.Template("    cwidth $cwidth\n").substitute(dic)
-            vInstruction += string.Template("    style $style\n").substitute(dic)
-            vInstruction += string.Template("    linecap $linecap\n").substitute(dic)
-        #position and label in vlegend
-        vInstruction += string.Template("    label $label\n    lpos $lpos\n").substitute(dic)
-        
-        vInstruction += "    end"
-        return vInstruction
-    
-    def Read(self, instruction, text, **kwargs):
-        """!Read instruction and save information"""
-        instr = {}
-        try:
-            info = grass.find_file(name = text[0].split()[1], element = 'vector')
-        except grass.ScriptError, e:
-            GError(message = e.value)
-            return False
-        instr['name'] = info['fullname']
-        #connection
-        instr['connection'] = True
-        self.mapDBInfo = dbm_base.VectorDBInfo(instr['name'])
-        self.layers = self.mapDBInfo.layers.keys()
-        if not self.layers:
-            instr['connection'] = False
-            
-        # points
-        if text[0].startswith('vpoints'):
-            for line in text[1:]:
-                if line.startswith('type'):
-                    tp = []
-                    if line.find('point') != -1:
-                        tp.append('point')
-                    if line.find('centroid') != -1:
-                        tp.append('centroid')
-                    instr['type'] = ' or '.join(tp)
-                elif line.startswith('fcolor'):
-                    instr['fcolor'] = line.split()[1]
-                elif line.startswith('rgbcolumn'):
-                    instr['rgbcolumn'] = line.split()[1]
-                elif line.startswith('symbol'):
-                    instr['symbol'] = line.split()[1]
-                elif line.startswith('eps'):
-                    instr['eps'] = line.split()[1]
-                elif line.startswith('size '):
-                    instr['size'] = line.split()[1]
-                elif line.startswith('sizecolumn'):
-                    instr['size'] = None
-                    instr['sizecolumn'] = line.split()[1]
-                elif line.startswith('scale '):
-                    instr['scale'] = float(line.split()[1])
-                elif line.startswith('rotate '):
-                    instr['rotation'] = True
-                    instr['rotate'] = line.split()[1]
-                elif line.startswith('rotatecolumn'):
-                    instr['rotatecolumn'] = line.split()[1]
-                    instr['rotation'] = True
-                    instr['rotate'] = None
-                    
-        # lines            
-        elif text[0].startswith('vlines'):
-            for line in text[1:]:
-                if line.startswith('type'):
-                    tp = []
-                    if line.find('line') != -1:
-                        tp.append('line')
-                    if line.find('boundary') != -1:
-                        tp.append('boundary')
-                    instr['type'] = ' or '.join(tp)
-                elif line.startswith('hwidth'):
-                    instr['hwidth'] = float(line.split()[1])
-                elif line.startswith('hcolor'):
-                    instr['hcolor'] = line.split()[1]
-                elif line.startswith('rgbcolumn'):
-                    instr['rgbcolumn'] = line.split()[1]                    
-                elif line.startswith('cwidth'):
-                    instr['cwidth'] = float(line.split()[1])
-                    instr['width'] = None
-                elif line.startswith('style'):
-                    instr['style'] = line.split()[1]       
-                elif line.startswith('linecap'):
-                    instr['linecap'] = line.split()[1]
-         
-        elif text[0].startswith('vareas'):
-            for line in text[1:]:
-                if line.startswith('fcolor'):
-                    instr['fcolor'] = line.split()[1]    
-                elif line.startswith('pat'):
-                    instr['pat'] = line.split()[1]
-                elif line.startswith('pwidth'):
-                    instr['pwidth'] = float(line.split()[1])
-                elif line.startswith('scale'):
-                    instr['scale'] = float(line.split()[1])
-            
-            
-        # same properties for all    
-        for line in text[1:]:
-            if line.startswith('lpos'):
-                instr['lpos'] = int(line.split()[1])
-            elif line.startswith('label'):
-                instr['label'] = line.split(None, 1)[1]
-            elif line.startswith('layer'):
-                instr['layer'] = line.split()[1]
-            elif line.startswith('masked'):
-                if line.split()[1].lower() in ('y', 'yes'):
-                    instr['masked'] = 'y'
-                else:
-                    instr['masked'] = 'n'
-            elif line.startswith('color'):
-                instr['color'] = line.split()[1]
-            elif line.startswith('rgbcolumn'):
-                instr['rgbcolumn'] = line.split()[1] 
-            elif line.startswith('width'):
-                instr['width'] = float(line.split()[1])
-                
-        if 'label' not in instr:
-            instr['label'] = '('.join(instr['name'].split('@')) + ')'
-        if 'lpos' not in instr:
-            instr['lpos'] = kwargs['vectorMapNumber']
-        self.instruction.update(instr)
-        
-        return True
-        
 class PsmapDialog(wx.Dialog):
     def __init__(self, parent, id,  title, settings, apply = True):
         wx.Dialog.__init__(self, parent = parent, id = wx.ID_ANY, 
@@ -1641,7 +186,7 @@ class PsmapDialog(wx.Dialog):
         self.instruction = settings
         self.objectType = None
         self.unitConv = UnitConversion(self)
-        self.spinCtrlSize = (50, -1)
+        self.spinCtrlSize = (65, -1)
         
         self.Bind(wx.EVT_CLOSE, self.OnClose)
         
@@ -1655,7 +200,8 @@ class PsmapDialog(wx.Dialog):
         parent.units['unitsCtrl'].SetStringSelection(self.unitConv.findName(dialogDict['unit']))
           
     def AddPosition(self, parent, dialogDict):
-        parent.position = dict()
+        if not hasattr(parent, "position"):
+            parent.position = dict()
         parent.position['comment'] = wx.StaticText(parent, id = wx.ID_ANY,\
                     label = _("Position of the top left corner\nfrom the top left edge of the paper"))
         parent.position['xLabel'] = wx.StaticText(parent, id = wx.ID_ANY, label = _("X:"))
@@ -1668,6 +214,63 @@ class PsmapDialog(wx.Dialog):
             parent.position['xCtrl'].SetValue("%5.3f" % x)
             parent.position['yCtrl'].SetValue("%5.3f" % y)
         
+    def AddExtendedPosition(self, panel, gridBagSizer, dialogDict):
+        """!Add widgets for setting position relative to paper and to map"""
+        panel.position = dict()
+        positionLabel = wx.StaticText(panel, id = wx.ID_ANY, label = _("Position is given:"))
+        panel.position['toPaper'] = wx.RadioButton(panel, id = wx.ID_ANY, label = _("relative to paper"), style = wx.RB_GROUP)
+        panel.position['toMap'] = wx.RadioButton(panel, id = wx.ID_ANY, label = _("by map coordinates"))
+        panel.position['toPaper'].SetValue(dialogDict['XY'])
+        panel.position['toMap'].SetValue(not dialogDict['XY'])
+        
+        gridBagSizer.Add(positionLabel, pos = (0,0), span = (1,3), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT, border = 0)
+        gridBagSizer.Add(panel.position['toPaper'], pos = (1,0), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT, border = 0)
+        gridBagSizer.Add(panel.position['toMap'], pos = (1,1),flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT, border = 0)
+        
+        # first box - paper coordinates
+        box1   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = "")
+        sizerP = wx.StaticBoxSizer(box1, wx.VERTICAL)
+        self.gridBagSizerP = wx.GridBagSizer (hgap = 5, vgap = 5)
+        self.gridBagSizerP.AddGrowableCol(1)
+        self.gridBagSizerP.AddGrowableRow(3)
+        
+        self.AddPosition(parent = panel, dialogDict = dialogDict)
+        panel.position['comment'].SetLabel(_("Position from the top left\nedge of the paper"))
+        self.AddUnits(parent = panel, dialogDict = dialogDict)
+        self.gridBagSizerP.Add(panel.units['unitsLabel'], pos = (0,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        self.gridBagSizerP.Add(panel.units['unitsCtrl'], pos = (0,1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        self.gridBagSizerP.Add(panel.position['xLabel'], pos = (1,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        self.gridBagSizerP.Add(panel.position['xCtrl'], pos = (1,1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        self.gridBagSizerP.Add(panel.position['yLabel'], pos = (2,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        self.gridBagSizerP.Add(panel.position['yCtrl'], pos = (2,1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        self.gridBagSizerP.Add(panel.position['comment'], pos = (3,0), span = (1,2), flag = wx.ALIGN_BOTTOM, border = 0)
+        
+        sizerP.Add(self.gridBagSizerP, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 5)
+        gridBagSizer.Add(sizerP, pos = (2,0),span = (1,1), flag = wx.ALIGN_CENTER_HORIZONTAL|wx.EXPAND, border = 0)
+        
+        # second box - map coordinates
+        box2   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = "")
+        sizerM = wx.StaticBoxSizer(box2, wx.VERTICAL)
+        self.gridBagSizerM = wx.GridBagSizer (hgap = 5, vgap = 5)
+        self.gridBagSizerM.AddGrowableCol(0)
+        self.gridBagSizerM.AddGrowableCol(1)
+        
+        eastingLabel  = wx.StaticText(panel, id = wx.ID_ANY, label = "E:")
+        northingLabel  = wx.StaticText(panel, id = wx.ID_ANY, label = "N:")
+        panel.position['eCtrl'] = wx.TextCtrl(panel, id = wx.ID_ANY, value = "")
+        panel.position['nCtrl'] = wx.TextCtrl(panel, id = wx.ID_ANY, value = "")
+        east, north = PaperMapCoordinates(mapInstr = self.instruction[self.mapId], x = dialogDict['where'][0], y = dialogDict['where'][1], paperToMap = True)
+        panel.position['eCtrl'].SetValue(str(east))
+        panel.position['nCtrl'].SetValue(str(north))
+        
+        self.gridBagSizerM.Add(eastingLabel, pos = (0,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        self.gridBagSizerM.Add(northingLabel, pos = (1,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        self.gridBagSizerM.Add(panel.position['eCtrl'], pos = (0,1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        self.gridBagSizerM.Add(panel.position['nCtrl'], pos = (1,1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        
+        sizerM.Add(self.gridBagSizerM, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 5)
+        gridBagSizer.Add(sizerM, pos = (2,1), flag = wx.ALIGN_LEFT|wx.EXPAND, border = 0)
+        
     def AddFont(self, parent, dialogDict, color = True):
         parent.font = dict()
 ##        parent.font['fontLabel'] = wx.StaticText(parent, id = wx.ID_ANY, label = _("Choose font:"))
@@ -2602,24 +1205,31 @@ class RasterPanel(wx.Panel):
         
     def update(self):
         #draw raster
-        map = self.instruction.FindInstructionByType('map')
+        mapInstr = self.instruction.FindInstructionByType('map')
+        if not mapInstr: # no map frame
+            GMessage(message = _("Please, create map frame first."))
+            return
+            
         if self.rasterNoRadio.GetValue() or not self.rasterSelect.GetValue():
             self.rasterDict['isRaster'] = False
             self.rasterDict['raster'] = None
-            map['drawMap'] = False
+            mapInstr['drawMap'] = False
             if self.id in self.instruction:
                 del self.instruction[self.id]
 
         else:
             self.rasterDict['isRaster'] = True
             self.rasterDict['raster'] = self.rasterSelect.GetValue()
-            if self.rasterDict['raster'] != map['drawMap']:
-                map['drawMap'] = False
-            
-            if self.id not in self.instruction:
+            if self.rasterDict['raster'] != mapInstr['drawMap']:
+                mapInstr['drawMap'] = False
+
+            raster = self.instruction.FindInstructionByType('raster')
+            if not raster:
                 raster = Raster(self.id)
                 self.instruction.AddInstruction(raster)
-            self.instruction[self.id].SetInstruction(self.rasterDict)
+                self.instruction[self.id].SetInstruction(self.rasterDict)
+            else:
+                self.instruction[raster.id].SetInstruction(self.rasterDict)
             
         if 'map' in self.mainDialog.parent.openDialogs:
             self.mainDialog.parent.openDialogs['map'].updateDialog()
@@ -2678,7 +1288,7 @@ class VectorPanel(wx.Panel):
         self.topologyTypeList = ["points", "lines", "areas"]
         self.vectorType = wx.RadioBox(self, id = wx.ID_ANY, label = " %s " % _("Data Type"), choices = topologyTypeTr,
                                       majorDimension = 3, style = wx.RA_SPECIFY_COLS)
-        
+            
         self.AddVector = wx.Button(self, id = wx.ID_ANY, label = _("Add"))
         
         gridBagSizer.Add(text, pos = (0,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
@@ -2981,7 +1591,7 @@ class VPropertiesDialog(PsmapDialog):
         #vector map info
         self.connection = True
         try:
-            self.mapDBInfo = dbm_base.VectorDBInfo(self.vectorName)
+            self.mapDBInfo = VectorDBInfo(self.vectorName)
             self.layers = self.mapDBInfo.layers.keys()
         except grass.ScriptError:
             self.connection = False
@@ -3019,6 +1629,7 @@ class VPropertiesDialog(PsmapDialog):
         if self.type == 'points':
             self.OnSize(None)
             self.OnRotation(None)
+            self.OnSymbology(None)
         if self.type == 'areas':
             self.OnPattern(None)
         
@@ -3347,8 +1958,11 @@ class VPropertiesDialog(PsmapDialog):
         self.symbolRadio = wx.RadioButton(panel, id = wx.ID_ANY, label = _("symbol:"), style = wx.RB_GROUP)
         self.symbolRadio.SetValue(bool(self.vPropertiesDict['symbol']))
             
-         
-        self.symbolChoice = wx.Choice(panel, id = wx.ID_ANY, choices = self.symbols)
+        self.symbolName = wx.StaticText(panel, id = wx.ID_ANY)
+        self.symbolName.SetLabel(self.vPropertiesDict['symbol'])
+        bitmap = wx.Bitmap(os.path.join(globalvar.ETCSYMBOLDIR,
+                                        self.vPropertiesDict['symbol']) + '.png')
+        self.symbolButton = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bitmap)
             
         self.epsRadio = wx.RadioButton(panel, id = wx.ID_ANY, label = _("eps file:"))
         self.epsRadio.SetValue(bool(self.vPropertiesDict['eps']))
@@ -3357,24 +1971,28 @@ class VPropertiesDialog(PsmapDialog):
                                 buttonText =  _("Browse"), toolTip = _("Type filename or click browse to choose file"), 
                                 dialogTitle = _("Choose a file"), startDirectory = '', initialValue = '',
                                 fileMask = "Encapsulated PostScript (*.eps)|*.eps|All files (*.*)|*.*", fileMode = wx.OPEN)
-        if self.vPropertiesDict['symbol']:
-            self.symbolChoice.SetStringSelection(self.vPropertiesDict['symbol'])
+        if not self.vPropertiesDict['eps']:
             self.epsFileCtrl.SetValue('')
         else: #eps chosen
             self.epsFileCtrl.SetValue(self.vPropertiesDict['eps'])
-            self.symbolChoice.SetSelection(0)
             
+        gridBagSizer.AddGrowableCol(2)
         gridBagSizer.Add(self.symbolRadio, pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        gridBagSizer.Add(self.symbolChoice, pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        gridBagSizer.Add(self.symbolName, pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border = 10)
+        gridBagSizer.Add(self.symbolButton, pos = (0, 2), flag = wx.ALIGN_RIGHT , border = 0)
         gridBagSizer.Add(self.epsRadio, pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        gridBagSizer.Add(self.epsFileCtrl, pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, border = 0)
+        gridBagSizer.Add(self.epsFileCtrl, pos = (1, 1), span = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, border = 0)
         
         sizer.Add(gridBagSizer, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 5)
         border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
         
+        self.Bind(wx.EVT_BUTTON, self.OnSymbolSelection, self.symbolButton)
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnSymbology, self.symbolRadio)
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnSymbology, self.epsRadio)
+        
         #size
         
-        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Size"))        
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Size"))
         sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
         gridBagSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
         gridBagSizer.AddGrowableCol(0)
@@ -3631,6 +2249,24 @@ class VPropertiesDialog(PsmapDialog):
         for each in (self.patFileCtrl, self.patWidthText, self.patWidthSpin, self.patScaleText, self.patScaleSpin):
             each.Enable(self.patternCheck.GetValue())
             
+    def OnSymbology(self, event):
+        useSymbol = self.symbolRadio.GetValue()
+        
+        self.symbolButton.Enable(useSymbol)
+        self.symbolName.Enable(useSymbol)
+        self.epsFileCtrl.Enable(not useSymbol)
+            
+    def OnSymbolSelection(self, event):
+        dlg = SymbolDialog(self, symbolPath = globalvar.ETCSYMBOLDIR,
+                           currentSymbol = self.symbolName.GetLabel())
+        if dlg.ShowModal() == wx.ID_OK:
+            img = dlg.GetSelectedSymbolPath()
+            name = dlg.GetSelectedSymbolName()
+            self.symbolButton.SetBitmapLabel(wx.Bitmap(img + '.png'))
+            self.symbolName.SetLabel(name)
+            
+        dlg.Destroy()
+                
     def EnableLayerSelection(self, enable = True):
         for widget in self.gridBagSizerL.GetChildren():
             if widget.GetWindow() != self.warning:
@@ -3714,11 +2350,10 @@ class VPropertiesDialog(PsmapDialog):
         if self.type == 'points':
             #symbols
             if self.symbolRadio.GetValue():
-                self.vPropertiesDict['symbol'] = self.symbolChoice.GetStringSelection()
+                self.vPropertiesDict['symbol'] = self.symbolName.GetLabel()
                 self.vPropertiesDict['eps'] = None
             else:
                 self.vPropertiesDict['eps'] = self.epsFileCtrl.GetValue()
-                self.vPropertiesDict['symbol'] = None
             #size
             if self.sizeRadio.GetValue():
                 self.vPropertiesDict['size'] = self.sizeSpin.GetValue()
@@ -4400,7 +3035,7 @@ class LegendDialog(PsmapDialog):
             drawWidth = self.rasterLegend.EstimateWidth(raster = self.rLegendDict['raster'], discrete = self.rLegendDict['discrete'],
                                             fontsize = self.rLegendDict['fontsize'], cols = self.rLegendDict['cols'],
                                             width = self.rLegendDict['width'], paperInstr = self.instruction[self.pageId])
-            self.rLegendDict['rect'] = wx.Rect2D(x = x, y = y, w = drawWidth, h = drawHeight)
+            self.rLegendDict['rect'] = Rect2D(x = x, y = y, width = drawWidth, height = drawHeight)
                         
             # no data
             if self.rLegendDict['discrete'] == 'y':
@@ -4481,9 +3116,8 @@ class LegendDialog(PsmapDialog):
                 self.vLegendDict['font'] = self.panelVector.font['fontCtrl'].GetStringSelection()
                 self.vLegendDict['fontsize'] = self.panelVector.font['fontSizeCtrl'].GetValue()
                 dc = wx.ClientDC(self)
-                font = dc.GetFont()
-                dc.SetFont(wx.Font(pointSize = self.vLegendDict['fontsize'], family = font.GetFamily(),
-                                   style = font.GetStyle(), weight = wx.FONTWEIGHT_NORMAL))
+                dc.SetFont(wx.Font(pointSize = self.vLegendDict['fontsize'], family = wx.FONTFAMILY_DEFAULT,
+                                   style = wx.FONTSTYLE_NORMAL, weight = wx.FONTWEIGHT_NORMAL))
                 #size
                 width = self.unitConv.convert(value = float(self.panelVector.widthCtrl.GetValue()),
                                               fromUnit = currUnit, toUnit = 'inch')
@@ -4503,7 +3137,7 @@ class LegendDialog(PsmapDialog):
                 w = (width + wExtent) * self.vLegendDict['cols']
                 h = len(labels) * hExtent / self.vLegendDict['cols']
                 h *= 1.1
-                self.vLegendDict['rect'] = wx.Rect2D(x, y, w, h)
+                self.vLegendDict['rect'] = Rect2D(x, y, w, h)
                 
                 #border
                 if self.borderCheck.GetValue():
@@ -4583,7 +3217,7 @@ class LegendDialog(PsmapDialog):
              
 class MapinfoDialog(PsmapDialog):
     def __init__(self, parent, id, settings):
-        PsmapDialog.__init__(self, parent = parent, id = id, title = "Mapinfo settings", settings = settings)
+        PsmapDialog.__init__(self, parent = parent, id = id, title = _("Mapinfo settings"), settings = settings)
         
         self.objectType = ('mapinfo',)
         if self.id is not None:
@@ -5011,7 +3645,7 @@ class ScalebarDialog(PsmapDialog):
          
         rectSize = self.scalebar.EstimateSize(scalebarDict = self.scalebarDict,
                                                                 scale = self.instruction[mapId]['scale'])
-        self.scalebarDict['rect'] = wx.Rect2D(x = x, y = y, w = rectSize[0], h = rectSize[1])
+        self.scalebarDict['rect'] = Rect2D(x = x, y = y, width = rectSize[0], height = rectSize[1])
         self.scalebarDict['where'] = self.scalebarDict['rect'].GetCentre() 
 
         if self.id not in self.instruction:
@@ -5052,7 +3686,7 @@ class TextDialog(PsmapDialog):
             map = self.instruction.FindInstructionByType('initMap')
         self.mapId = map.id
 
-        self.textDict['east'], self.textDict['north'] = PaperMapCoordinates(map = map, x = self.textDict['where'][0], y = self.textDict['where'][1], paperToMap = True)
+        self.textDict['east'], self.textDict['north'] = PaperMapCoordinates(mapInstr = map, x = self.textDict['where'][0], y = self.textDict['where'][1], paperToMap = True)
         
         notebook = wx.Notebook(parent = self, id = wx.ID_ANY, style = wx.BK_DEFAULT)     
         self.textPanel = self._textPanel(notebook)
@@ -5174,73 +3808,21 @@ class TextDialog(PsmapDialog):
         panel.Fit()
         
         return panel 
-    
+        
     def _positionPanel(self, notebook):
         panel = wx.Panel(parent = notebook, id = wx.ID_ANY, style = wx.TAB_TRAVERSAL)
         notebook.AddPage(page = panel, text = _("Position"))
 
         border = wx.BoxSizer(wx.VERTICAL) 
 
-        #Position
         box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Position"))
         sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
         gridBagSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
         gridBagSizer.AddGrowableCol(0)
         gridBagSizer.AddGrowableCol(1)
         
-        self.positionLabel = wx.StaticText(panel, id = wx.ID_ANY, label = _("Position is given:"))
-        self.paperPositionCtrl = wx.RadioButton(panel, id = wx.ID_ANY, label = _("relatively to paper"), style = wx.RB_GROUP)
-        self.mapPositionCtrl = wx.RadioButton(panel, id = wx.ID_ANY, label = _("by map coordinates"))
-        self.paperPositionCtrl.SetValue(self.textDict['XY'])
-        self.mapPositionCtrl.SetValue(not self.textDict['XY'])
-        
-        gridBagSizer.Add(self.positionLabel, pos = (0,0), span = (1,3), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT, border = 0)
-        gridBagSizer.Add(self.paperPositionCtrl, pos = (1,0), flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT, border = 0)
-        gridBagSizer.Add(self.mapPositionCtrl, pos = (1,1),flag = wx.ALIGN_CENTER_VERTICAL|wx.ALIGN_LEFT, border = 0)
-        
-        # first box - paper coordinates
-        box1   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = "")
-        sizerP = wx.StaticBoxSizer(box1, wx.VERTICAL)
-        self.gridBagSizerP = wx.GridBagSizer (hgap = 5, vgap = 5)
-        self.gridBagSizerP.AddGrowableCol(1)
-        self.gridBagSizerP.AddGrowableRow(3)
-        
-        self.AddPosition(parent = panel, dialogDict = self.textDict)
-        panel.position['comment'].SetLabel(_("Position from the top left\nedge of the paper"))
-        self.AddUnits(parent = panel, dialogDict = self.textDict)
-        self.gridBagSizerP.Add(panel.units['unitsLabel'], pos = (0,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        self.gridBagSizerP.Add(panel.units['unitsCtrl'], pos = (0,1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        self.gridBagSizerP.Add(panel.position['xLabel'], pos = (1,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        self.gridBagSizerP.Add(panel.position['xCtrl'], pos = (1,1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        self.gridBagSizerP.Add(panel.position['yLabel'], pos = (2,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        self.gridBagSizerP.Add(panel.position['yCtrl'], pos = (2,1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        self.gridBagSizerP.Add(panel.position['comment'], pos = (3,0), span = (1,2), flag = wx.ALIGN_BOTTOM, border = 0)
-        
-        sizerP.Add(self.gridBagSizerP, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 5)
-        gridBagSizer.Add(sizerP, pos = (2,0),span = (1,1), flag = wx.ALIGN_CENTER_HORIZONTAL|wx.EXPAND, border = 0)
-        
-        # second box - map coordinates
-        box2   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = "")
-        sizerM = wx.StaticBoxSizer(box2, wx.VERTICAL)
-        self.gridBagSizerM = wx.GridBagSizer (hgap = 5, vgap = 5)
-        self.gridBagSizerM.AddGrowableCol(0)
-        self.gridBagSizerM.AddGrowableCol(1)
-        
-        self.eastingLabel  = wx.StaticText(panel, id = wx.ID_ANY, label = "E:")
-        self.northingLabel  = wx.StaticText(panel, id = wx.ID_ANY, label = "N:")
-        self.eastingCtrl = wx.TextCtrl(panel, id = wx.ID_ANY, value = "")
-        self.northingCtrl = wx.TextCtrl(panel, id = wx.ID_ANY, value = "")
-        east, north = PaperMapCoordinates(map = self.instruction[self.mapId], x = self.textDict['where'][0], y = self.textDict['where'][1], paperToMap = True)
-        self.eastingCtrl.SetValue(str(east))
-        self.northingCtrl.SetValue(str(north))
-        
-        self.gridBagSizerM.Add(self.eastingLabel, pos = (0,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        self.gridBagSizerM.Add(self.northingLabel, pos = (1,0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        self.gridBagSizerM.Add(self.eastingCtrl, pos = (0,1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        self.gridBagSizerM.Add(self.northingCtrl, pos = (1,1), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
-        
-        sizerM.Add(self.gridBagSizerM, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 5)
-        gridBagSizer.Add(sizerM, pos = (2,1), flag = wx.ALIGN_LEFT|wx.EXPAND, border = 0)
+        #Position
+        self.AddExtendedPosition(panel, gridBagSizer, self.textDict)
         
         #offset
         box3   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " %_("Offset"))
@@ -5305,8 +3887,8 @@ class TextDialog(PsmapDialog):
         panel.SetSizer(border)
         panel.Fit()
           
-        self.Bind(wx.EVT_RADIOBUTTON, self.OnPositionType, self.paperPositionCtrl) 
-        self.Bind(wx.EVT_RADIOBUTTON, self.OnPositionType, self.mapPositionCtrl)
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnPositionType, panel.position['toPaper']) 
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnPositionType, panel.position['toMap'])
         self.Bind(wx.EVT_CHECKBOX, self.OnRotation, self.rotCtrl)
         
         return panel
@@ -5321,7 +3903,7 @@ class TextDialog(PsmapDialog):
             self.rotValue.Disable()
             
     def OnPositionType(self, event):
-        if self.paperPositionCtrl.GetValue():
+        if self.positionPanel.position['toPaper'].GetValue():
             for widget in self.gridBagSizerP.GetChildren():
                 widget.GetWindow().Enable()
             for widget in self.gridBagSizerM.GetChildren():
@@ -5402,7 +3984,7 @@ class TextDialog(PsmapDialog):
         self.textDict['yoffset'] = self.yoffCtrl.GetValue()
 
         #position
-        if self.paperPositionCtrl.GetValue():
+        if self.positionPanel.position['toPaper'].GetValue():
             self.textDict['XY'] = True
             currUnit = self.unitConv.findUnit(self.positionPanel.units['unitsCtrl'].GetStringSelection())
             self.textDict['unit'] = currUnit
@@ -5422,17 +4004,17 @@ class TextDialog(PsmapDialog):
             self.textDict['east'], self.textDict['north'] = PaperMapCoordinates(self.instruction[self.mapId], x, y, paperToMap = True)
         else:
             self.textDict['XY'] = False
-            if self.eastingCtrl.GetValue():
-                self.textDict['east'] = self.eastingCtrl.GetValue() 
+            if self.positionPanel.position['eCtrl'].GetValue():
+                self.textDict['east'] = self.positionPanel.position['eCtrl'].GetValue() 
             else:
                 self.textDict['east'] = self.textDict['east']
 
-            if self.northingCtrl.GetValue():
-                self.textDict['north'] = self.northingCtrl.GetValue() 
+            if self.positionPanel.position['nCtrl'].GetValue():
+                self.textDict['north'] = self.positionPanel.position['nCtrl'].GetValue() 
             else:
                 self.textDict['north'] = self.textDict['north']
 
-            self.textDict['where'] = PaperMapCoordinates(map = self.instruction[self.mapId], x = float(self.textDict['east']),
+            self.textDict['where'] = PaperMapCoordinates(mapInstr = self.instruction[self.mapId], x = float(self.textDict['east']),
                                                             y = float(self.textDict['north']), paperToMap = False)
         #rotation
         if self.rotCtrl.GetValue():
@@ -5467,236 +4049,924 @@ class TextDialog(PsmapDialog):
         self.positionPanel.position['yCtrl'].SetValue("%5.3f" % y)
         # EN coordinates
         e, n = self.textDict['east'], self.textDict['north']
-        self.eastingCtrl.SetValue(str(self.textDict['east']))
-        self.northingCtrl.SetValue(str(self.textDict['north']))
-        
-def convertRGB(rgb):
-    """!Converts wx.Colour(r,g,b,a) to string 'r:g:b' or named color,
-            or named color/r:g:b string to wx.Colour, depending on input""" 
-    # transform a wx.Colour tuple into an r:g:b string    
-    if type(rgb) == wx.Colour:
-        for name, color in grass.named_colors.items(): 
-            if  rgb.Red() == int(color[0] * 255) and\
-                rgb.Green() == int(color[1] * 255) and\
-                rgb.Blue() == int(color[2] * 255):
-                return name
-        return str(rgb.Red()) + ':' + str(rgb.Green()) + ':' + str(rgb.Blue())
-    # transform a GRASS named color or an r:g:b string into a wx.Colour tuple
-    else:
-        color = (grass.parse_color(rgb)[0]*255,
-                 grass.parse_color(rgb)[1]*255,
-                 grass.parse_color(rgb)[2]*255)
-        color = wx.Color(*color)
-        if color.IsOk():
-            return color
-        else:  
-            return None
-        
-def PaperMapCoordinates(map, x, y, paperToMap = True):
-    """!Converts paper (inch) coordinates -> map coordinates"""
-    unitConv = UnitConversion()
-    currRegionDict = grass.region()
-    cornerEasting, cornerNorthing = currRegionDict['w'], currRegionDict['n']
-    xMap = map['rect'][0]
-    yMap = map['rect'][1]
-    widthMap = map['rect'][2] * 0.0254 # to meter
-    heightMap = map['rect'][3] * 0.0254
-    xScale = widthMap / abs(currRegionDict['w'] - currRegionDict['e'])
-    yScale = heightMap / abs(currRegionDict['n'] - currRegionDict['s'])
-    currScale = (xScale + yScale) / 2
- 
-    if not paperToMap:
-        textEasting, textNorthing = x, y
-        eastingDiff = textEasting - cornerEasting 
-        if currRegionDict['w'] > currRegionDict['e']:
-            eastingDiff = - eastingDiff
+        self.positionPanel.position['eCtrl'].SetValue(str(self.textDict['east']))
+        self.positionPanel.position['nCtrl'].SetValue(str(self.textDict['north']))
+        
+class ImageDialog(PsmapDialog):
+    """!Dialog for setting image properties.
+    
+    It's base dialog for North Arrow dialog.
+    """
+    def __init__(self, parent, id, settings, imagePanelName = _("Image")):
+        PsmapDialog.__init__(self, parent = parent, id = id, title = "Image settings",
+                             settings = settings)
+        
+        self.objectType = ('image',)
+        if self.id is not None:
+            self.imageObj = self.instruction[self.id]
+            self.imageDict = self.instruction[id].GetInstruction()
         else:
-            eastingDiff = eastingDiff
+            self.id = wx.NewId()
+            self.imageObj = self._newObject()
+            self.imageDict = self.imageObj.GetInstruction()
+            page = self.instruction.FindInstructionByType('page').GetInstruction()
+            self.imageDict['where'] = page['Left'], page['Top'] 
+                
+        map = self.instruction.FindInstructionByType('map')
+        if not map:
+            map = self.instruction.FindInstructionByType('initMap')
+        self.mapId = map.id
 
-        northingDiff = textNorthing - cornerNorthing
-        if currRegionDict['n'] > currRegionDict['s']:
-            northingDiff = - northingDiff 
+        self.imageDict['east'], self.imageDict['north'] = PaperMapCoordinates(mapInstr = map, x = self.imageDict['where'][0], y = self.imageDict['where'][1], paperToMap = True)
+        
+        notebook = wx.Notebook(parent = self, id = wx.ID_ANY, style = wx.BK_DEFAULT)
+        self.imagePanelName = imagePanelName
+        self.imagePanel = self._imagePanel(notebook)
+        self.positionPanel = self._positionPanel(notebook)
+        self.OnPositionType(None)
+        
+        if self.imageDict['epsfile']:
+            self.imagePanel.image['dir'].SetValue(os.path.dirname(self.imageDict['epsfile']))
+        else:
+            self.imagePanel.image['dir'].SetValue(self._getImageDirectory())
+        self.OnDirChanged(None)
+     
+        self._layout(notebook)
+        
+        
+    def _newObject(self):
+        """!Create corresponding instruction object"""
+        return Image(self.id, self.instruction)
+        
+    def _imagePanel(self, notebook):
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY, size = (-1, -1), style = wx.TAB_TRAVERSAL)
+        notebook.AddPage(page = panel, text = self.imagePanelName)
+        border = wx.BoxSizer(wx.VERTICAL)
+        #
+        # choose image
+        #
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Image"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        # choose directory
+        panel.image = {}
+        if self.imageDict['epsfile']:
+            startDir = os.path.dirname(self.imageDict['epsfile'])
+        else:
+            startDir = self._getImageDirectory()
+        dir = filebrowse.DirBrowseButton(parent = panel, id = wx.ID_ANY,
+                                         labelText = _("Choose a directory:"),
+                                         dialogTitle = _("Choose a directory with images"),
+                                         buttonText = _('Browse'),
+                                         startDirectory = startDir,
+                                         changeCallback = self.OnDirChanged)
+        panel.image['dir'] = dir
+       
+        
+        sizer.Add(item = dir, proportion = 0, flag = wx.EXPAND, border = 0)
+        
+        # image list
+        hSizer = wx.BoxSizer(wx.HORIZONTAL)
+        
+        imageList = wx.ListBox(parent = panel, id = wx.ID_ANY)
+        panel.image['list'] = imageList
+        imageList.Bind(wx.EVT_LISTBOX, self.OnImageSelectionChanged)
+        
+        hSizer.Add(item = imageList, proportion = 1, flag = wx.EXPAND | wx.RIGHT, border = 10)
+        
+        # image preview
+        vSizer = wx.BoxSizer(wx.VERTICAL)
+        self.previewSize = (150, 150)
+        img = wx.EmptyImage(*self.previewSize)
+        panel.image['preview'] = wx.StaticBitmap(parent = panel, id = wx.ID_ANY,
+                                                bitmap = wx.BitmapFromImage(img))
+        vSizer.Add(item = panel.image['preview'], proportion = 0, flag = wx.EXPAND | wx.BOTTOM, border = 5)
+        panel.image['sizeInfo'] = wx.StaticText(parent = panel, id = wx.ID_ANY)
+        vSizer.Add(item = panel.image['sizeInfo'], proportion = 0, flag = wx.ALIGN_CENTER, border = 0)
+        
+        hSizer.Add(item = vSizer, proportion = 0, flag = wx.EXPAND, border = 0)
+        sizer.Add(item = hSizer, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 3)
+        
+        epsInfo = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                label = _("Note: only EPS format supported"))
+        sizer.Add(item = epsInfo, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL | wx.ALL, border = 3)
+        
+        
+        border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+        
+        #
+        # rotation
+        #
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Scale And Rotation"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        
+        scaleLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Scale:"))
+        if fs:
+            panel.image['scale'] = fs.FloatSpin(panel, id = wx.ID_ANY, min_val = 0, max_val = 50,
+                                          increment = 0.5, value = 1, style = fs.FS_RIGHT, size = self.spinCtrlSize)
+            panel.image['scale'].SetFormat("%f")
+            panel.image['scale'].SetDigits(1)
         else:
-            northingDiff = northingDiff
-
-        xPaper = xMap + unitConv.convert(value = eastingDiff, fromUnit = 'meter', toUnit = 'inch') * currScale
-        yPaper = yMap + unitConv.convert(value = northingDiff, fromUnit = 'meter', toUnit = 'inch') * currScale
-        return xPaper, yPaper
-    else:
-        if currRegionDict['w'] < currRegionDict['e']:
-            eastingDiff = (x - xMap) 
+            panel.image['scale'] = wx.TextCtrl(panel, id = wx.ID_ANY, size = self.spinCtrlSize,
+                                                  validator = TCValidator(flag = 'DIGIT_ONLY'))
+        
+        if self.imageDict['scale']:
+            if fs:
+                value = float(self.imageDict['scale'])
+            else:
+                value = str(self.imageDict['scale'])
         else:
-            eastingDiff = (xMap - x)
-        if currRegionDict['n'] < currRegionDict['s']:
-            northingDiff = (y - yMap) 
+            if fs:
+                value = 0
+            else:
+                value = '0'
+        panel.image['scale'].SetValue(value)
+            
+        gridSizer.Add(item = scaleLabel, pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = panel.image['scale'], pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        
+        rotLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Rotation angle (deg):"))
+        if fs:
+            panel.image['rotate'] = fs.FloatSpin(panel, id = wx.ID_ANY, min_val = 0, max_val = 360,
+                                          increment = 0.5, value = 0, style = fs.FS_RIGHT, size = self.spinCtrlSize)
+            panel.image['rotate'].SetFormat("%f")
+            panel.image['rotate'].SetDigits(1)
         else:
-            northingDiff = (yMap - y)
-
-        textEasting = cornerEasting + unitConv.convert(value = eastingDiff, fromUnit = 'inch', toUnit = 'meter') / currScale
-        textNorthing = cornerNorthing + unitConv.convert(value = northingDiff, fromUnit = 'inch', toUnit = 'meter') / currScale
-        return int(textEasting), int(textNorthing)
-        
-def AutoAdjust(self, scaleType,  rect, map = None, mapType = None, region = None):
-    """!Computes map scale, center and map frame rectangle to fit region (scale is not fixed)"""
-    currRegionDict = {}
-    if scaleType == 0 and map:# automatic, region from raster or vector
-        res = ''
-        if mapType == 'raster': 
-            try:
-                res = grass.read_command("g.region", flags = 'gu', rast = map)
-            except grass.ScriptError:
-                pass
-        elif mapType == 'vector':
-            res = grass.read_command("g.region", flags = 'gu', vect = map)
-        currRegionDict = grass.parse_key_val(res, val_type = float)
-    elif scaleType == 1 and region: # saved region
-        res = grass.read_command("g.region", flags = 'gu', region = region)
-        currRegionDict = grass.parse_key_val(res, val_type = float)
-    elif scaleType == 2: # current region
-        env = grass.gisenv()
-        windFilePath = os.path.join(env['GISDBASE'], env['LOCATION_NAME'], env['MAPSET'], 'WIND')
+            panel.image['rotate'] = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = self.spinCtrlSize,
+                                                min = 0, max = 359, initial = 0)
+        panel.image['rotate'].SetToolTipString(_("Counterclockwise rotation in degrees"))
+        if self.imageDict['rotate']:
+            panel.image['rotate'].SetValue(int(self.imageDict['rotate']))
+        else:
+            panel.image['rotate'].SetValue(0)
+            
+        gridSizer.Add(item = rotLabel, pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        gridSizer.Add(item = panel.image['rotate'], pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        self._addConvergence(panel = panel, gridBagSizer = gridSizer)
+        sizer.Add(item = gridSizer, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+        
+        panel.SetSizer(border)
+        panel.Fit()
+        
+        return panel
+        
+    def _positionPanel(self, notebook):
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY, size = (-1, -1), style = wx.TAB_TRAVERSAL)
+        notebook.AddPage(page = panel, text = _("Position"))
+        border = wx.BoxSizer(wx.VERTICAL)
+        #
+        # set position
+        #
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Position"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridBagSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        gridBagSizer.AddGrowableCol(0)
+        gridBagSizer.AddGrowableCol(1)
+        
+        self.AddExtendedPosition(panel, gridBagSizer, self.imageDict)
+        
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnPositionType, panel.position['toPaper']) 
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnPositionType, panel.position['toMap'])
+        
+        
+        sizer.Add(gridBagSizer, proportion = 1, flag = wx.ALIGN_CENTER_VERTICAL| wx.ALL, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+        
+        panel.SetSizer(border)
+        panel.Fit()
+        
+        return panel
+        
+    def OnDirChanged(self, event):
+        """!Image directory changed"""
+        path = self.imagePanel.image['dir'].GetValue()
+        try:
+            files = os.listdir(path)
+        except OSError: # no such directory
+            files = []
+        imageList = []
+        
+        # no setter for startDirectory?
         try:
-            windFile = open(windFilePath, 'r').read()
-        except IOError:
-            currRegionDict = grass.region()
-        regionDict = grass.parse_key_val(windFile, sep = ':', val_type = float)
-        region = grass.read_command("g.region", flags = 'gu', n = regionDict['north'], s = regionDict['south'],
-                                    e = regionDict['east'], w = regionDict['west'])
-        currRegionDict = grass.parse_key_val(region, val_type = float)
-                                                                
-    else:
-        return None, None, None
+            self.imagePanel.image['dir'].startDirectory = path
+        except AttributeError: # for sure
+            pass
+        for file in files:
+            if os.path.splitext(file)[1].lower() == '.eps':
+                imageList.append(file)
+        
+        imageList.sort()
+        self.imagePanel.image['list'].SetItems(imageList)
+        if self.imageDict['epsfile']:
+            file = os.path.basename(self.imageDict['epsfile'])
+            self.imagePanel.image['list'].SetStringSelection(file)
+        elif imageList:
+            self.imagePanel.image['list'].SetSelection(0)
+        self.OnImageSelectionChanged(None)
+        
+    def OnPositionType(self, event):
+        if self.positionPanel.position['toPaper'].GetValue():
+            for widget in self.gridBagSizerP.GetChildren():
+                widget.GetWindow().Enable()
+            for widget in self.gridBagSizerM.GetChildren():
+                widget.GetWindow().Disable()
+        else:
+            for widget in self.gridBagSizerM.GetChildren():
+                widget.GetWindow().Enable()
+            for widget in self.gridBagSizerP.GetChildren():
+                widget.GetWindow().Disable()
+                
+    def _getImageDirectory(self):
+        """!Default image directory"""
+        return os.getcwd()
+        
+    def _addConvergence(self, panel, gridBagSizer):
+        pass
+        
+    def OnImageSelectionChanged(self, event):
+        """!Image selected, show preview and size"""
+        if not self.imagePanel.image['dir']: # event is emitted when closing dialog an it causes error
+            return
+            
+        if not havePILImage:
+            self.DrawWarningText(_("PIL\nmissing"))
+            return
+        
+        imageName = self.imagePanel.image['list'].GetStringSelection()
+        if not imageName:
+            self.ClearPreview()
+            return
+        basePath = self.imagePanel.image['dir'].GetValue()
+        file = os.path.join(basePath, imageName)
+        if not os.path.exists(file):
+            return
+            
+        if os.path.splitext(file)[1].lower() == '.eps':
+            try:
+                pImg = PILImage.open(file)
+                if sys.platform == 'win32':
+                    import types
+                    pImg.load = types.MethodType(loadPSForWindows, pImg)
+                img = PilImageToWxImage(pImg)
+            except IOError, e:
+                GError(message = _("Unable to read file %s") % file)
+                self.ClearPreview()
+                return
+            self.SetSizeInfoLabel(img)
+            img = self.ScaleToPreview(img)
+            bitmap = img.ConvertToBitmap()
+            self.DrawBitmap(bitmap)
+            
+        else:
+            # TODO: read other formats and convert by PIL to eps
+            pass
     
-    if not currRegionDict:
-        return None, None, None
-    rX = rect.x
-    rY = rect.y
-    rW = rect.width
-    rH = rect.height
-    if not hasattr(self, 'unitConv'):
-        self.unitConv = UnitConversion(self)
-    toM = 1
-    if projInfo()['proj'] != 'xy':
-        toM = float(projInfo()['meters'])
+    def ScaleToPreview(self, img):
+        """!Scale image to preview size"""
+        w = img.GetWidth()
+        h = img.GetHeight()
+        if w <= self.previewSize[0] and h <= self.previewSize[1]:
+            return img
+        if w > h:
+            newW = self.previewSize[0]
+            newH = self.previewSize[0] * h / w
+        else:
+            newH = self.previewSize[0]
+            newW = self.previewSize[0] * w / h
+        return img.Scale(newW, newH, wx.IMAGE_QUALITY_HIGH)
+        
+    def DrawWarningText(self, warning):
+        """!Draw text on preview window"""
+        buffer = wx.EmptyBitmap(*self.previewSize)
+        dc = wx.MemoryDC()
+        dc.SelectObject(buffer)
+        dc.SetBrush(wx.Brush(wx.Color(250, 250, 250)))
+        dc.Clear()
+        extent = dc.GetTextExtent(warning)
+        posX = self.previewSize[0] / 2 - extent[0] / 2
+        posY = self.previewSize[1] / 2 - extent[1] / 2
+        dc.DrawText(warning, posX, posY)
+        self.imagePanel.image['preview'].SetBitmap(buffer)
+        dc.SelectObject(wx.NullBitmap)
+        
+    def DrawBitmap(self, bitmap):
+        """!Draw bitmap, center it if smaller than preview size"""
+        if bitmap.GetWidth() <= self.previewSize[0] and bitmap.GetHeight() <= self.previewSize[1]:
+            buffer = wx.EmptyBitmap(*self.previewSize)
+            dc = wx.MemoryDC()
+            dc.SelectObject(buffer)
+            dc.SetBrush(dc.GetBrush())
+            dc.Clear()
+            posX = self.previewSize[0] / 2 - bitmap.GetWidth() / 2
+            posY = self.previewSize[1] / 2 - bitmap.GetHeight() / 2
+            dc.DrawBitmap(bitmap, posX, posY)
+            self.imagePanel.image['preview'].SetBitmap(buffer)
+            dc.SelectObject(wx.NullBitmap)
+        else:
+            self.imagePanel.image['preview'].SetBitmap(bitmap)
+        self.imagePanel.Refresh()
+            
+    def SetSizeInfoLabel(self, image):
+        """!Update image size label"""
+        self.imagePanel.image['sizeInfo'].SetLabel(_("size: %(width)s x %(height)s pts") % \
+                                                       { 'width'  : image.GetWidth(),
+                                                         'height' : image.GetHeight() })
+        self.imagePanel.image['sizeInfo'].GetContainingSizer().Layout()
+        
+    def ClearPreview(self):
+        """!Clear preview window"""
+        buffer = wx.EmptyBitmap(*self.previewSize)
+        dc = wx.MemoryDC()
+        dc.SelectObject(buffer)
+        dc.SetBrush(wx.WHITE_BRUSH)
+        dc.Clear()
+        dc.SelectObject(wx.NullBitmap)
+        mask = wx.Mask(buffer, wx.WHITE)
+        buffer.SetMask(mask)
+        self.imagePanel.image['preview'].SetBitmap(buffer)
+        
+    def update(self): 
+        # epsfile
+        selected = self.imagePanel.image['list'].GetStringSelection()
+        basePath = self.imagePanel.image['dir'].GetValue()
+        if not selected:
+            GMessage(parent = self, message = _("No image selected."))
+            return False
+            
+        self.imageDict['epsfile'] = os.path.join(basePath, selected)
+        
+        #position
+        if self.positionPanel.position['toPaper'].GetValue():
+            self.imageDict['XY'] = True
+            currUnit = self.unitConv.findUnit(self.positionPanel.units['unitsCtrl'].GetStringSelection())
+            self.imageDict['unit'] = currUnit
+            if self.positionPanel.position['xCtrl'].GetValue():
+                x = self.positionPanel.position['xCtrl'].GetValue() 
+            else:
+                x = self.imageDict['where'][0]
+
+            if self.positionPanel.position['yCtrl'].GetValue():
+                y = self.positionPanel.position['yCtrl'].GetValue() 
+            else:
+                y = self.imageDict['where'][1]
+
+            x = self.unitConv.convert(value = float(x), fromUnit = currUnit, toUnit = 'inch')
+            y = self.unitConv.convert(value = float(y), fromUnit = currUnit, toUnit = 'inch')
+            self.imageDict['where'] = x, y
+            
+        else:
+            self.imageDict['XY'] = False
+            if self.positionPanel.position['eCtrl'].GetValue():
+                e = self.positionPanel.position['eCtrl'].GetValue() 
+            else:
+                self.imageDict['east'] = self.imageDict['east']
+
+            if self.positionPanel.position['nCtrl'].GetValue():
+                n = self.positionPanel.position['nCtrl'].GetValue() 
+            else:
+                self.imageDict['north'] = self.imageDict['north']
+
+            x, y = PaperMapCoordinates(mapInstr = self.instruction[self.mapId], x = float(self.imageDict['east']),
+                                       y = float(self.imageDict['north']), paperToMap = False)
 
-    mW = self.unitConv.convert(value = (currRegionDict['e'] - currRegionDict['w']) * toM, fromUnit = 'meter', toUnit = 'inch')
-    mH = self.unitConv.convert(value = (currRegionDict['n'] - currRegionDict['s']) * toM, fromUnit = 'meter', toUnit = 'inch')
-    scale = min(rW/mW, rH/mH)
+        #rotation
+        rot = self.imagePanel.image['rotate'].GetValue()
+        if rot == 0:
+            self.imageDict['rotate'] = None
+        else:
+            self.imageDict['rotate'] = rot
+        
+        #scale
+        self.imageDict['scale'] = self.imagePanel.image['scale'].GetValue()
+                
+        # scale
+        w, h = self.imageObj.GetImageOrigSize(self.imageDict['epsfile'])
+        if self.imageDict['rotate']:
+            self.imageDict['size'] = BBoxAfterRotation(w, h, self.imageDict['rotate'])
+        else:
+            self.imageDict['size'] = w, h
+            
+        w = self.unitConv.convert(value = self.imageDict['size'][0],
+                                  fromUnit = 'point', toUnit = 'inch')
+        h = self.unitConv.convert(value = self.imageDict['size'][1],
+                                  fromUnit = 'point', toUnit = 'inch')
+                                  
+    
+        self.imageDict['rect'] = Rect2D(x = x, y = y,
+                                        width = w * self.imageDict['scale'],
+                                        height = h * self.imageDict['scale'])
+        
+        if self.id not in self.instruction:
+            image = self._newObject()
+            self.instruction.AddInstruction(image)
+        self.instruction[self.id].SetInstruction(self.imageDict)
+        
+        if self.id not in self.parent.objectId:
+            self.parent.objectId.append(self.id)
+
+        return True
+        
+    def updateDialog(self):
+        """!Update text coordinates, after moving"""
+        # XY coordinates
+        x, y = self.imageDict['where'][:2]
+        currUnit = self.unitConv.findUnit(self.positionPanel.units['unitsCtrl'].GetStringSelection())
+        x = self.unitConv.convert(value = x, fromUnit = 'inch', toUnit = currUnit)
+        y = self.unitConv.convert(value = y, fromUnit = 'inch', toUnit = currUnit)
+        self.positionPanel.position['xCtrl'].SetValue("%5.3f" % x)
+        self.positionPanel.position['yCtrl'].SetValue("%5.3f" % y)
+        # EN coordinates
+        e, n = self.imageDict['east'], self.imageDict['north']
+        self.positionPanel.position['eCtrl'].SetValue(str(self.imageDict['east']))
+        self.positionPanel.position['nCtrl'].SetValue(str(self.imageDict['north']))
+        
+        
+class NorthArrowDialog(ImageDialog):
+    def __init__(self, parent, id, settings):
+        ImageDialog.__init__(self, parent = parent, id = id, settings = settings,
+                             imagePanelName = _("North Arrow"))
+        
+        self.objectType = ('northArrow',)
+        self.SetTitle(_("North Arrow settings"))
     
-    if rW/rH > mW/mH:
-        x = rX - (rH*(mW/mH) - rW)/2
-        y = rY
-        rWNew = rH*(mW/mH)
-        rHNew = rH
-    else:
-        x = rX
-        y = rY - (rW*(mH/mW) - rH)/2
-        rHNew = rW*(mH/mW)
-        rWNew = rW
-
-    # center
-    cE = (currRegionDict['w'] + currRegionDict['e'])/2
-    cN = (currRegionDict['n'] + currRegionDict['s'])/2
-    return scale, (cE, cN), wx.Rect2D(x, y, rWNew, rHNew) #inch
-
-def SetResolution(dpi, width, height):
-    """!If resolution is too high, lower it
+    def _newObject(self):
+        return NorthArrow(self.id, self.instruction)
+        
+    def _getImageDirectory(self):
+        gisbase = os.getenv("GISBASE")
+        return os.path.join(gisbase, 'etc', 'paint', 'decorations')
     
-    @param dpi max DPI
-    @param width map frame width
-    @param height map frame height
-    """
-    region = grass.region()
-    if region['cols'] > width * dpi or region['rows'] > height * dpi:
-        rows = height * dpi
-        cols = width * dpi
-        RunCommand('g.region', rows = rows, cols = cols)
-               
-def ComputeSetRegion(self, mapDict):
-    """!Computes and sets region from current scale, map center coordinates and map rectangle"""
-
-    if mapDict['scaleType'] == 3: # fixed scale
-        scale = mapDict['scale']
+    def _addConvergence(self, panel, gridBagSizer):
+        convergence = wx.Button(parent = panel, id = wx.ID_ANY,
+                                               label = _("Compute convergence"))
+        gridBagSizer.Add(item = convergence, pos = (1, 2),
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.EXPAND)
+        convergence.Bind(wx.EVT_BUTTON, self.OnConvergence)
+        panel.image['convergence'] = convergence
+        
+    def OnConvergence(self, event):
+        ret = RunCommand('g.region', read = True, flags = 'ng')
+        if ret:
+            convergence = float(ret.strip().split('=')[1])
+            if convergence < 0:
+                self.imagePanel.image['rotate'].SetValue(abs(convergence))
+            else:
+                self.imagePanel.image['rotate'].SetValue(360 - convergence)
             
-        if not hasattr(self, 'unitConv'):
-            self.unitConv = UnitConversion(self)
         
-        fromM = 1
-        if projInfo()['proj'] != 'xy':
-            fromM = float(projInfo()['meters'])
-        rectHalfInch = (mapDict['rect'].width/2, mapDict['rect'].height/2)
-        rectHalfMeter = (self.unitConv.convert(value = rectHalfInch[0], fromUnit = 'inch', toUnit = 'meter')/ fromM /scale,
-                         self.unitConv.convert(value = rectHalfInch[1], fromUnit = 'inch', toUnit = 'meter')/ fromM /scale) 
+class PointDialog(PsmapDialog):
+    """!Dialog for setting point properties."""
+    def __init__(self, parent, id, settings, coordinates = None, pointPanelName = _("Point")):
+        PsmapDialog.__init__(self, parent = parent, id = id, title = "Point settings",
+                             settings = settings)
         
-        centerE = mapDict['center'][0]
-        centerN = mapDict['center'][1]
+        self.objectType = ('point',)
+        if self.id is not None:
+            self.pointObj = self.instruction[self.id]
+            self.pointDict = self.instruction[id].GetInstruction()
+        else:
+            self.id = wx.NewId()
+            self.pointObj = Point(self.id)
+            self.pointDict = self.pointObj.GetInstruction()
+            self.pointDict['where'] = coordinates 
+        self.defaultDict = self.pointObj.defaultInstruction
+                
+        mapObj = self.instruction.FindInstructionByType('map')
+        if not mapObj:
+            mapObj = self.instruction.FindInstructionByType('initMap')
+        self.mapId = mapObj.id
         
-        raster = self.instruction.FindInstructionByType('raster')
-        if raster:
-            rasterId = raster.id 
+        self.pointDict['east'], self.pointDict['north'] = PaperMapCoordinates(mapInstr = mapObj, x = self.pointDict['where'][0], y = self.pointDict['where'][1], paperToMap = True)
+        
+        notebook = wx.Notebook(parent = self, id = wx.ID_ANY, style = wx.BK_DEFAULT)
+        self.pointPanelName = pointPanelName
+        self.pointPanel = self._pointPanel(notebook)
+        self.positionPanel = self._positionPanel(notebook)
+        self.OnPositionType(None)
+        
+     
+        self._layout(notebook)
+        
+    def _pointPanel(self, notebook):
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY, size = (-1, -1), style = wx.TAB_TRAVERSAL)
+        notebook.AddPage(page = panel, text = self.pointPanelName)
+        border = wx.BoxSizer(wx.VERTICAL)
+        #
+        # choose image
+        #
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Symbol"))
+        sizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
+        
+        gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        gridSizer.AddGrowableCol(1)
+
+        gridSizer.Add(item = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Select symbol:")),
+                      pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        self.symbolLabel = wx.StaticText(parent = panel, id = wx.ID_ANY,
+                                          label = self.pointDict['symbol'])
+        gridSizer.Add(item = self.symbolLabel, pos = (0, 1),
+                      flag = wx.ALIGN_CENTER_VERTICAL )
+        bitmap = wx.Bitmap(os.path.join(globalvar.ETCSYMBOLDIR,
+                                        self.pointDict['symbol']) + '.png')
+        self.symbolButton = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bitmap)
+        self.symbolButton.Bind(wx.EVT_BUTTON, self.OnSymbolSelection)
+
+        gridSizer.Add(self.symbolButton, pos = (0, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+        self.noteLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, 
+                                       label = _("Note: Selected symbol is not displayed\n"
+                                                 "in draft mode (only in preview mode)"))
+        gridSizer.Add(self.noteLabel, pos = (1, 0), span = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+
+        sizer.Add(item = gridSizer, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
+        
+        border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+        
+        #
+        # outline/fill color
+        #
+
+        # outline
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Color"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        
+        outlineLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Outline color:"))
+        self.outlineColorCtrl = wx.ColourPickerCtrl(panel, id = wx.ID_ANY)
+        self.outlineTranspCtrl = wx.CheckBox(panel, id = wx.ID_ANY, label = _("transparent"))
+
+        if self.pointDict['color'] != 'none':
+            self.outlineTranspCtrl.SetValue(False)
+            self.outlineColorCtrl.SetColour(convertRGB(self.pointDict['color']))
         else:
-            rasterId = None
-
-        if rasterId:
-            RunCommand('g.region', n = ceil(centerN + rectHalfMeter[1]),
-                       s = floor(centerN - rectHalfMeter[1]),
-                       e = ceil(centerE + rectHalfMeter[0]),
-                       w = floor(centerE - rectHalfMeter[0]),
-                       rast = self.instruction[rasterId]['raster'])
+            self.outlineTranspCtrl.SetValue(True)
+            self.outlineColorCtrl.SetColour(convertRGB(self.defaultDict['color']))
+
+        gridSizer.Add(item = outlineLabel, pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.outlineColorCtrl, pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.outlineTranspCtrl, pos = (0, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+
+        fillLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Fill color:"))
+        self.fillColorCtrl = wx.ColourPickerCtrl(panel, id = wx.ID_ANY)
+        self.fillTranspCtrl = wx.CheckBox(panel, id = wx.ID_ANY, label = _("transparent"))
+
+        if self.pointDict['fcolor'] != 'none':
+            self.fillTranspCtrl.SetValue(False)
+            self.fillColorCtrl.SetColour(convertRGB(self.pointDict['fcolor']))
         else:
-            RunCommand('g.region', n = ceil(centerN + rectHalfMeter[1]),
-                       s = floor(centerN - rectHalfMeter[1]),
-                       e = ceil(centerE + rectHalfMeter[0]),
-                       w = floor(centerE - rectHalfMeter[0]))
-                    
-def projInfo():
-    """!Return region projection and map units information,
-    taken from render.py"""
-    
-    projinfo = dict()
-    
-    ret = RunCommand('g.proj', read = True, flags = 'p')
-    
-    if not ret:
-        return projinfo
-    
-    for line in ret.splitlines():
-        if ':' in line:
-            key, val = line.split(':')
-            projinfo[key.strip()] = val.strip()
-        elif "XY location (unprojected)" in line:
-            projinfo['proj'] = 'xy'
-            projinfo['units'] = ''
-            break
-    
-    return projinfo
+            self.fillTranspCtrl.SetValue(True)
+            self.fillColorCtrl.SetColour(convertRGB(self.defaultDict['fcolor']))
+
+        gridSizer.Add(item = fillLabel, pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.fillColorCtrl, pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.fillTranspCtrl, pos = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        sizer.Add(item = gridSizer, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+
+        #
+        # size and rotation
+        #
+
+        # size
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Size and Rotation"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        
+        sizeLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Size (pt):"))
+        self.sizeCtrl = wx.SpinCtrl(panel, id = wx.ID_ANY, size = self.spinCtrlSize)
+        self.sizeCtrl.SetToolTipString(_("Symbol size in points"))
+        self.sizeCtrl.SetValue(self.pointDict['size'])
+        
+        gridSizer.Add(item = sizeLabel, pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.sizeCtrl, pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        # rotation
+        rotLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Rotation angle (deg):"))
+        if fs:
+            self.rotCtrl = fs.FloatSpin(panel, id = wx.ID_ANY, min_val = -360, max_val = 360,
+                                          increment = 1, value = 0, style = fs.FS_RIGHT, size = self.spinCtrlSize)
+            self.rotCtrl.SetFormat("%f")
+            self.rotCtrl.SetDigits(1)
+        else:
+            self.rotCtrl = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = self.spinCtrlSize,
+                                                min = -360, max = 360, initial = 0)
+        self.rotCtrl.SetToolTipString(_("Counterclockwise rotation in degrees"))
+        self.rotCtrl.SetValue(float(self.pointDict['rotate']))
+            
+        gridSizer.Add(item = rotLabel, pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL, border = 0)
+        gridSizer.Add(item = self.rotCtrl, pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        
+        sizer.Add(item = gridSizer, proportion = 0, flag = wx.EXPAND | wx.ALL, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+        
+        panel.SetSizer(border)
+        panel.Fit()
+        
+        return panel
+        
+    def _positionPanel(self, notebook):
+        panel = wx.Panel(parent = notebook, id = wx.ID_ANY, size = (-1, -1), style = wx.TAB_TRAVERSAL)
+        notebook.AddPage(page = panel, text = _("Position"))
+        border = wx.BoxSizer(wx.VERTICAL)
+        #
+        # set position
+        #
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Position"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridBagSizer = wx.GridBagSizer(hgap = 5, vgap = 5)
+        gridBagSizer.AddGrowableCol(0)
+        gridBagSizer.AddGrowableCol(1)
+        
+        self.AddExtendedPosition(panel, gridBagSizer, self.pointDict)
+        
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnPositionType, panel.position['toPaper']) 
+        self.Bind(wx.EVT_RADIOBUTTON, self.OnPositionType, panel.position['toMap'])
+        
+        
+        sizer.Add(gridBagSizer, proportion = 1, flag = wx.ALIGN_CENTER_VERTICAL| wx.ALL, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+        
+        panel.SetSizer(border)
+        panel.Fit()
+        
+        return panel
+        
+    def OnPositionType(self, event):
+        if self.positionPanel.position['toPaper'].GetValue():
+            for widget in self.gridBagSizerP.GetChildren():
+                widget.GetWindow().Enable()
+            for widget in self.gridBagSizerM.GetChildren():
+                widget.GetWindow().Disable()
+        else:
+            for widget in self.gridBagSizerM.GetChildren():
+                widget.GetWindow().Enable()
+            for widget in self.gridBagSizerP.GetChildren():
+                widget.GetWindow().Disable()
+                
+    def OnSymbolSelection(self, event):
+        dlg = SymbolDialog(self, symbolPath = globalvar.ETCSYMBOLDIR,
+                           currentSymbol = self.symbolLabel.GetLabel())
+        if dlg.ShowModal() == wx.ID_OK:
+            img = dlg.GetSelectedSymbolPath()
+            name = dlg.GetSelectedSymbolName()
+            self.symbolButton.SetBitmapLabel(wx.Bitmap(img + '.png'))
+            self.symbolLabel.SetLabel(name)
+            
+        dlg.Destroy()
+        
+    def update(self): 
+        # symbol
+        self.pointDict['symbol'] = self.symbolLabel.GetLabel()
+
+        
+        #position
+        if self.positionPanel.position['toPaper'].GetValue():
+            self.pointDict['XY'] = True
+            currUnit = self.unitConv.findUnit(self.positionPanel.units['unitsCtrl'].GetStringSelection())
+            self.pointDict['unit'] = currUnit
+            if self.positionPanel.position['xCtrl'].GetValue():
+                x = self.positionPanel.position['xCtrl'].GetValue() 
+            else:
+                x = self.pointDict['where'][0]
+
+            if self.positionPanel.position['yCtrl'].GetValue():
+                y = self.positionPanel.position['yCtrl'].GetValue() 
+            else:
+                y = self.pointDict['where'][1]
+
+            x = self.unitConv.convert(value = float(x), fromUnit = currUnit, toUnit = 'inch')
+            y = self.unitConv.convert(value = float(y), fromUnit = currUnit, toUnit = 'inch')
+            self.pointDict['where'] = x, y
+            
+        else:
+            self.pointDict['XY'] = False
+            if self.positionPanel.position['eCtrl'].GetValue():
+                e = self.positionPanel.position['eCtrl'].GetValue() 
+            else:
+                self.pointDict['east'] = self.pointDict['east']
+
+            if self.positionPanel.position['nCtrl'].GetValue():
+                n = self.positionPanel.position['nCtrl'].GetValue() 
+            else:
+                self.pointDict['north'] = self.pointDict['north']
+
+            x, y = PaperMapCoordinates(mapInstr = self.instruction[self.mapId], x = float(self.pointDict['east']),
+                                       y = float(self.pointDict['north']), paperToMap = False)
+
+        #rotation
+        self.pointDict['rotate'] = self.rotCtrl.GetValue()
+        
+        # size
+        self.pointDict['size'] = self.sizeCtrl.GetValue()
+            
+        w = h = self.unitConv.convert(value = self.pointDict['size'],
+                                  fromUnit = 'point', toUnit = 'inch')
+                                  
+        # outline color
+        if self.outlineTranspCtrl.GetValue():
+            self.pointDict['color'] = 'none'
+        else:
+            self.pointDict['color'] = convertRGB(self.outlineColorCtrl.GetColour())
+
+        # fill color
+        if self.fillTranspCtrl.GetValue():
+            self.pointDict['fcolor'] = 'none'
+        else:
+            self.pointDict['fcolor'] = convertRGB(self.fillColorCtrl.GetColour())
+
+        self.pointDict['rect'] = Rect2D(x = x - w / 2, y = y - h / 2, width = w, height = h)
+        
+        if self.id not in self.instruction:
+            point = Point(self.id)
+            self.instruction.AddInstruction(point)
+        self.instruction[self.id].SetInstruction(self.pointDict)
+        
+        if self.id not in self.parent.objectId:
+            self.parent.objectId.append(self.id)
+
+        return True
+        
+    def updateDialog(self):
+        """!Update text coordinates, after moving"""
+        # XY coordinates
+        x, y = self.pointDict['where'][:2]
+        currUnit = self.unitConv.findUnit(self.positionPanel.units['unitsCtrl'].GetStringSelection())
+        x = self.unitConv.convert(value = x, fromUnit = 'inch', toUnit = currUnit)
+        y = self.unitConv.convert(value = y, fromUnit = 'inch', toUnit = currUnit)
+        self.positionPanel.position['xCtrl'].SetValue("%5.3f" % x)
+        self.positionPanel.position['yCtrl'].SetValue("%5.3f" % y)
+        # EN coordinates
+        e, n = self.pointDict['east'], self.pointDict['north']
+        self.positionPanel.position['eCtrl'].SetValue(str(self.pointDict['east']))
+        self.positionPanel.position['nCtrl'].SetValue(str(self.pointDict['north']))
+        
+class RectangleDialog(PsmapDialog):
+    def __init__(self, parent, id, settings, type = 'rectangle', coordinates = None):
+        """!
+
+        @param coordinates begin and end point coordinate (wx.Point, wx.Point)
+        """
+        if type == 'rectangle':
+            title = _("Rectangle settings")
+        else:
+            title = _("Line settings")
+        PsmapDialog.__init__(self, parent = parent, id = id, title = title, settings = settings)
+        
+        self.objectType = (type,)
+
+        if self.id is not None:
+            self.rectObj = self.instruction[self.id]
+            self.rectDict = self.rectObj.GetInstruction()
+        else:
+            self.id = wx.NewId()
+            if type == 'rectangle':
+                self.rectObj = Rectangle(self.id)
+            else:
+                self.rectObj = Line(self.id)
+            self.rectDict = self.rectObj.GetInstruction()
+
+            self.rectDict['rect'] = Rect2DPP(coordinates[0], coordinates[1])
+            self.rectDict['where'] = coordinates
+
+        self.defaultDict = self.rectObj.defaultInstruction
+        self.panel = self._rectPanel()
+        
+        self._layout(self.panel)
+
+    def _rectPanel(self):
+        panel = wx.Panel(parent = self, id = wx.ID_ANY, style = wx.TAB_TRAVERSAL)
+        border = wx.BoxSizer(wx.VERTICAL)
+                
+        # color
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Color"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer (hgap = 5, vgap = 5)
+        
+        outlineLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Outline color:"))
+        self.outlineColorCtrl = wx.ColourPickerCtrl(panel, id = wx.ID_ANY)
+        self.outlineTranspCtrl = wx.CheckBox(panel, id = wx.ID_ANY, label = _("transparent"))
+
+        if self.rectDict['color'] != 'none':
+            self.outlineTranspCtrl.SetValue(False)
+            self.outlineColorCtrl.SetColour(convertRGB(self.rectDict['color']))
+        else:
+            self.outlineTranspCtrl.SetValue(True)
+            self.outlineColorCtrl.SetColour(convertRGB(self.defaultDict['color']))
+
+        # transparent outline makes sense only for rectangle
+        if self.objectType == ('line',):
+            self.outlineTranspCtrl.Hide()
+
+        gridSizer.Add(item = outlineLabel, pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.outlineColorCtrl, pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.outlineTranspCtrl, pos = (0, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+
+        # fill color only in rectangle
+        if self.objectType == ('rectangle',):
+            fillLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Fill color:"))
+            self.fillColorCtrl = wx.ColourPickerCtrl(panel, id = wx.ID_ANY)
+            self.fillTranspCtrl = wx.CheckBox(panel, id = wx.ID_ANY, label = _("transparent"))
+
+            if self.rectDict['fcolor'] != 'none':
+                self.fillTranspCtrl.SetValue(False)
+                self.fillColorCtrl.SetColour(convertRGB(self.rectDict['fcolor']))
+            else:
+                self.fillTranspCtrl.SetValue(True)
+                self.fillColorCtrl.SetColour(wx.WHITE)
+
+            gridSizer.Add(item = fillLabel, pos = (1, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+            gridSizer.Add(item = self.fillColorCtrl, pos = (1, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+            gridSizer.Add(item = self.fillTranspCtrl, pos = (1, 2), flag = wx.ALIGN_CENTER_VERTICAL)
+
+        sizer.Add(gridSizer, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+        gridSizer = wx.GridBagSizer (hgap = 5, vgap = 5)
+
+        # width
+        box   = wx.StaticBox (parent = panel, id = wx.ID_ANY, label = " %s " % _("Line style"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        widthLabel = wx.StaticText(parent = panel, id = wx.ID_ANY, label = _("Line width:"))
+        if fs:
+            self.widthCtrl = fs.FloatSpin(panel, id = wx.ID_ANY, min_val = 0, max_val = 50,
+                                          increment = 1, value = 0, style = fs.FS_RIGHT, size = self.spinCtrlSize)
+            self.widthCtrl.SetFormat("%f")
+            self.widthCtrl.SetDigits(1)
+        else:
+            self.widthCtrl = wx.SpinCtrl(parent = panel, id = wx.ID_ANY, size = self.spinCtrlSize,
+                                                min = -360, max = 360, initial = 0)
+        self.widthCtrl.SetToolTipString(_("Line width in points"))
+        self.widthCtrl.SetValue(float(self.rectDict['width']))
+
+        gridSizer.Add(item = widthLabel, pos = (0, 0), flag = wx.ALIGN_CENTER_VERTICAL)
+        gridSizer.Add(item = self.widthCtrl, pos = (0, 1), flag = wx.ALIGN_CENTER_VERTICAL)
+
+        sizer.Add(gridSizer, proportion = 1, flag = wx.EXPAND|wx.ALL, border = 5)
+        border.Add(item = sizer, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+
+        panel.SetSizer(border)
+        
+        return panel
+        
+
+    def update(self):
+        mapInstr = self.instruction.FindInstructionByType('map')
+        if not mapInstr:
+            mapInstr = self.instruction.FindInstructionByType('initMap')
+        self.mapId = mapInstr.id
+        point1 = self.rectDict['where'][0]
+        point2 = self.rectDict['where'][1]
+        self.rectDict['east1'], self.rectDict['north1'] = PaperMapCoordinates(mapInstr = mapInstr,
+                                                                                x = point1[0],
+                                                                                y = point1[1],
+                                                                                paperToMap = True)
+        self.rectDict['east2'], self.rectDict['north2'] = PaperMapCoordinates(mapInstr = mapInstr,
+                                                                                x = point2[0],
+                                                                                y = point2[1],
+                                                                                paperToMap = True)
+        # width
+        self.rectDict['width'] = self.widthCtrl.GetValue()
+        
+        # outline color
+        if self.outlineTranspCtrl.GetValue():
+            self.rectDict['color'] = 'none'
+        else:
+            self.rectDict['color'] = convertRGB(self.outlineColorCtrl.GetColour())
+
+        # fill color
+        if self.objectType == ('rectangle',):
+            if self.fillTranspCtrl.GetValue():
+                self.rectDict['fcolor'] = 'none'
+            else:
+                self.rectDict['fcolor'] = convertRGB(self.fillColorCtrl.GetColour())
+
+        if self.id not in self.instruction:
+            if self.objectType == ('rectangle',):
+                rect = Rectangle(self.id)
+            else:
+                rect = Line(self.id)
+            self.instruction.AddInstruction(rect)
+            
+        self.instruction[self.id].SetInstruction(self.rectDict)
+
+        if self.id not in self.parent.objectId:
+            self.parent.objectId.append(self.id)
+            
+        self.updateDialog()
+
+        return True
+
+    def updateDialog(self):
+        """!Update text coordinates, after moving"""
+        pass
 
-def GetMapBounds(filename, portrait = True):
-    """!Run ps.map -b to get information about map bounding box
-    
-        @param filename psmap input file
-        @param portrait page orientation"""
-    orient = ''
-    if not portrait:
-        orient = 'r'
-    try:
-        bb = map(float, grass.read_command('ps.map',
-                                           flags = 'b' + orient,
-                                           quiet = True,
-                                           input = filename).strip().split('=')[1].split(','))
-    except (grass.ScriptError, IndexError):
-        GError(message = _("Unable to run `ps.map -b`"))
-        return None
-    return wx.Rect2D(bb[0], bb[3], bb[2] - bb[0], bb[1] - bb[3])
-
-def getRasterType(map):
-    """!Returns type of raster map (CELL, FCELL, DCELL)"""
-    if map is None:
-        map = ''
-    file = grass.find_file(name = map, element = 'cell')
-    if file['file']:
-        rasterType = grass.raster_info(map)['datatype']
-        return rasterType
-    else:
-        return None
-   
diff --git a/gui/wxpython/gui_modules/psmap.py b/gui/wxpython/psmap/frame.py
similarity index 59%
rename from gui/wxpython/gui_modules/psmap.py
rename to gui/wxpython/psmap/frame.py
index 0c7e796..5473ad6 100644
--- a/gui/wxpython/gui_modules/psmap.py
+++ b/gui/wxpython/psmap/frame.py
@@ -1,17 +1,17 @@
 """!
- at package psmap.py
+ at package psmap.frame
 
 @brief GUI for ps.map
 
 Classes:
- - PsMapFrame
- - PsMapBufferedWindow
+ - frame::PsMapFrame
+ - frame::PsMapBufferedWindow
 
-(C) 2011 by Anna Kratochvilova, and the GRASS Development Team
+(C) 2011-2012 by Anna Kratochvilova, and the GRASS Development Team
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
- at author Anna Kratochvilova <anna.kratochvilova fsv.cvut.cz> (bachelor's project)
+ at author Anna Kratochvilova <kratochanna gmail.com> (bachelor's project)
 @author Martin Landa <landa.martin gmail.com> (mentor)
 """
 
@@ -19,37 +19,33 @@ import os
 import sys
 import textwrap
 import Queue
-try:
-    import Image
-    haveImage = True
-except ImportError:
-    haveImage = False
-from math import sin, cos, pi
-
-import grass.script as grass
-if int(grass.version()['version'].split('.')[0]) > 6:
-    sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'gui', 'wxpython',
-                                 'gui_modules'))
-else:
-    sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'wxpython',
-                                 'gui_modules'))
-import globalvar
-import menu
-from   goutput    import CmdThread, EVT_CMD_DONE
-from   menudata   import PsMapData
-from   toolbars   import PsMapToolbar
-from   icon       import Icons, MetaIcon, iconSet
-from   gcmd       import RunCommand, GError, GMessage
-from   menuform   import GUI
-from psmap_dialogs import *
+from math import sin, cos, pi, sqrt
 
+if __name__ == "__main__":
+    sys.path.append(os.path.join(os.getenv('GISBASE'), 'etc', 'gui', 'wxpython'))
+from core             import globalvar
 import wx
 
 try:
     import wx.lib.agw.flatnotebook as fnb
 except ImportError:
     import wx.lib.flatnotebook as fnb
-    
+
+import grass.script as grass
+
+from gui_core.menu      import Menu
+from gui_core.goutput   import CmdThread, EVT_CMD_DONE
+from psmap.toolbars     import PsMapToolbar
+from core.gcmd          import RunCommand, GError, GMessage
+from core.settings      import UserSettings
+from gui_core.forms     import GUI
+from gui_core.dialogs   import HyperlinkDialog
+from psmap.menudata     import PsMapData
+
+from psmap.dialogs      import *
+from psmap.instructions import *
+from psmap.utils        import *
+
 class PsMapFrame(wx.Frame):
     def __init__(self, parent = None, id = wx.ID_ANY,
                  title = _("GRASS GIS Cartographic Composer (experimental prototype)"), **kwargs):
@@ -66,7 +62,7 @@ class PsMapFrame(wx.Frame):
         wx.Frame.__init__(self, parent = parent, id = id, title = title, name = "PsMap", **kwargs)
         self.SetIcon(wx.Icon(os.path.join(globalvar.ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
         #menubar
-        self.menubar = menu.Menu(parent = self, data = PsMapData())
+        self.menubar = Menu(parent = self, data = PsMapData())
         self.SetMenuBar(self.menubar)
         #toolbar
 
@@ -101,18 +97,26 @@ class PsMapFrame(wx.Frame):
             'vectorLegend': wx.Pen(colour = wx.Color(219, 216, 4), width = 2),
             'mapinfo': wx.Pen(colour = wx.Color(5, 184, 249), width = 2),
             'scalebar': wx.Pen(colour = wx.Color(150, 150, 150), width = 2),
+            'image': wx.Pen(colour = wx.Color(255, 150, 50), width = 2),
+            'northArrow': wx.Pen(colour = wx.Color(200, 200, 200), width = 2),
+            'point': wx.Pen(colour = wx.Color(100, 100, 100), width = 2),
+            'line': wx.Pen(colour = wx.Color(0, 0, 0), width = 2),
             'box': wx.Pen(colour = 'RED', width = 2, style = wx.SHORT_DASH),
             'select': wx.Pen(colour = 'BLACK', width = 1, style = wx.SHORT_DASH),
             'resize': wx.Pen(colour = 'BLACK', width = 1)
             }
         self.brush = {
             'paper': wx.WHITE_BRUSH,
-            'margins': wx.TRANSPARENT_BRUSH,            
+            'margins': wx.TRANSPARENT_BRUSH,
             'map': wx.Brush(wx.Color(151, 214, 90)),
             'rasterLegend': wx.Brush(wx.Color(250, 247, 112)),
             'vectorLegend': wx.Brush(wx.Color(250, 247, 112)),
             'mapinfo': wx.Brush(wx.Color(127, 222, 252)),
             'scalebar': wx.Brush(wx.Color(200, 200, 200)),
+            'image': wx.Brush(wx.Color(255, 200, 50)),
+            'northArrow': wx.Brush(wx.Color(255, 255, 255)),
+            'point': wx.Brush(wx.Color(200, 200, 200)),
+            'line': wx.TRANSPARENT_BRUSH,
             'box': wx.TRANSPARENT_BRUSH,
             'select':wx.TRANSPARENT_BRUSH,
             'resize': wx.BLACK_BRUSH
@@ -166,7 +170,7 @@ class PsMapFrame(wx.Frame):
         self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
         self.Bind(EVT_CMD_DONE, self.OnCmdDone)
         
-        if not haveImage:
+        if not havePILImage:
             wx.CallAfter(self._showErrMsg)
         
     def _showErrMsg(self):
@@ -215,17 +219,18 @@ class PsMapFrame(wx.Frame):
         """!Launch ps.map dialog
         """
         GUI(parent = self).ParseCommand(cmd = ['ps.map'])
-        
+
     def OnPDFFile(self, event):
         """!Generate PDF from PS with ps2pdf if available"""
-        try:
-            p = grass.Popen(["ps2pdf"], stderr = grass.PIPE)
-            p.stderr.close()
-        
-        except OSError:
-            GMessage(parent = self,
-                     message = _("Program ps2pdf is not available. Please install it first to create PDF."))
-            return
+        if not sys.platform == 'win32':
+            try:
+                p = grass.Popen(["ps2pdf"], stderr = grass.PIPE)
+                p.stderr.close()
+            
+            except OSError:
+                GMessage(parent = self,
+                         message = _("Program ps2pdf is not available. Please install it first to create PDF."))
+                return
         
         filename = self.getFile(wildcard = "PDF (*.pdf)|*.pdf")
         if filename:  
@@ -290,35 +295,63 @@ class PsMapFrame(wx.Frame):
             return
         
         if event.userData['pdfname']:
+            if sys.platform == 'win32':
+                command = ['gswin32c',
+                           '-P-', '-dSAFER',
+                           '-dCompatibilityLevel=1.4',
+                           '-q', '-P-',
+                           '-dNOPAUSE', '-dBATCH',
+                           '-sDEVICE=pdfwrite',
+                           '-dPDFSETTINGS=/prepress', '-r1200',
+                           '-sstdout=%stderr',
+                           '-sOutputFile=%s' % event.userData['pdfname'],
+                           '-P-', '-dSAFER',
+                           '-dCompatibilityLevel=1.4',
+                           '-c', '.setpdfwrite', '-f',
+                            event.userData['filename']]
+            else:
+                command = ['ps2pdf', '-dPDFSETTINGS=/prepress', '-r1200', 
+                           event.userData['filename'], event.userData['pdfname']]
             try:
-                proc = grass.Popen(['ps2pdf', '-dPDFSETTINGS=/prepress', '-r1200', 
-                                    event.userData['filename'], event.userData['pdfname']])
-                
+                proc = grass.Popen(command)
                 ret = proc.wait()                        
                 if ret > 0:
                     GMessage(parent = self,
-                             message = _("ps2pdf exited with return code %s") % ret)
-
+                             message = _("%(prg)s exited with return code %(code)s") % {'prg': command[0],
+                                                                                        'code': ret})
+                else:
+                    self.SetStatusText(_('PDF generated'), 0)
             except OSError, e:
                 GError(parent = self,
                        message = _("Program ps2pdf is not available. Please install it to create PDF.\n\n %s") % e)
-                
+
+        elif not event.userData['temp']:
+            self.SetStatusText(_('PostScript file generated'), 0)
+
         # show preview only when user doesn't want to create ps or pdf 
-        if haveImage and event.userData['temp'] and not event.userData['pdfname']:
+        if havePILImage and event.userData['temp'] and not event.userData['pdfname']:
             RunCommand('g.region', cols = event.userData['regionOld']['cols'], rows = event.userData['regionOld']['rows'])
-## wx.BusyInfo does not display the message
-##            busy = wx.BusyInfo(message = "Generating preview, wait please", parent = self)
 
+            busy = wx.BusyInfo(message = _("Generating preview, wait please"), parent = self)
+            wx.Yield()
             try:
-                im = Image.open(event.userData['filename'])
+                im = PILImage.open(event.userData['filename'])
                 if self.instruction[self.pageId]['Orientation'] == 'Landscape':
                     im = im.rotate(270)
-                
+
+                # hack for Windows, change method for loading EPS
+                if sys.platform == 'win32':
+                    import types
+                    im.load = types.MethodType(loadPSForWindows, im)
                 im.save(self.imgName, format = 'PNG')
-                
             except IOError, e:
-                GError(parent = self,
-                       message = _("Unable to generate preview. %s") % e)
+                del busy
+                dlg = HyperlinkDialog(self, title=_("Preview not available"),
+                                      message=_("Preview is not available probably due to missing Ghostscript."),
+                                      hyperlink='http://trac.osgeo.org/grass/wiki/CompileOnWindows#Ghostscript',
+                                      hyperlinkLabel=_("Please follow instructions on GRASS Trac Wiki."))
+                dlg.ShowModal()
+                dlg.Destroy()
                 return
             
                 
@@ -326,7 +359,7 @@ class PsMapFrame(wx.Frame):
             self.previewCanvas.image = wx.Image(self.imgName, wx.BITMAP_TYPE_PNG)
             self.previewCanvas.DrawImage(rect = rect)
             
-##            busy.Destroy()
+            del busy
             self.SetStatusText(_('Preview generated'), 0)
             self.book.SetSelection(1)
             self.currentPage = 1
@@ -334,7 +367,9 @@ class PsMapFrame(wx.Frame):
         grass.try_remove(event.userData['instrFile'])
         if event.userData['temp']:
             grass.try_remove(event.userData['filename'])
-        
+            
+        self.delayedCall = wx.CallLater(4000, lambda: self.SetStatusText("", 0))
+
     def getFile(self, wildcard):
         suffix = []
         for filter in wildcard.split('|')[1::2]:
@@ -577,36 +612,7 @@ class PsMapFrame(wx.Frame):
                 dlg =  MainVectorDialog(self, id = id, settings = self.instruction)
                 self.openDialogs['vector'] = dlg
             self.openDialogs['vector'].Show()
-        
-    def OnDecoration(self, event):
-        """!Decorations overlay menu
-        """
-        decmenu = wx.Menu()
-        # legend
-        AddLegend = wx.MenuItem(decmenu, wx.ID_ANY, Icons['psMap']["addLegend"].GetLabel())
-        AddLegend.SetBitmap(Icons['psMap']["addLegend"].GetBitmap(self.iconsize))
-        decmenu.AppendItem(AddLegend)
-        self.Bind(wx.EVT_MENU, self.OnAddLegend, AddLegend)
-        # mapinfo
-        AddMapinfo = wx.MenuItem(decmenu, wx.ID_ANY, Icons['psMap']["addMapinfo"].GetLabel())
-        AddMapinfo.SetBitmap(Icons['psMap']["addMapinfo"].GetBitmap(self.iconsize))
-        decmenu.AppendItem(AddMapinfo)
-        self.Bind(wx.EVT_MENU, self.OnAddMapinfo, AddMapinfo) 
-        # scalebar
-        AddScalebar = wx.MenuItem(decmenu, wx.ID_ANY, Icons['psMap']["addScalebar"].GetLabel())
-        AddScalebar.SetBitmap(Icons['psMap']["addScalebar"].GetBitmap(self.iconsize))
-        decmenu.AppendItem(AddScalebar)
-        self.Bind(wx.EVT_MENU, self.OnAddScalebar, AddScalebar) 
-        # text
-        AddText = wx.MenuItem(decmenu, wx.ID_ANY, Icons['psMap']["addText"].GetLabel())
-        AddText.SetBitmap(Icons['psMap']["addText"].GetBitmap(self.iconsize))
-        decmenu.AppendItem(AddText)
-        self.Bind(wx.EVT_MENU, self.OnAddText, AddText) 
-        # Popup the menu.  If an item is selected then its handler
-        # will be called before PopupMenu returns.
-        self.PopupMenu(decmenu)
-        decmenu.Destroy()
-        
+       
     def OnAddScalebar(self, event):
         """!Add scalebar"""
         if projInfo()['proj'] == 'll':
@@ -647,6 +653,30 @@ class PsMapFrame(wx.Frame):
             self.openDialogs['mapinfo'] = dlg
         self.openDialogs['mapinfo'].Show()
         
+    def OnAddImage(self, event, id = None):
+        """!Show dialog for image adding and editing"""
+        position = None
+        if 'image' in self.openDialogs:
+            position = self.openDialogs['image'].GetPosition()
+            self.openDialogs['image'].OnApply(event = None)
+            self.openDialogs['image'].Destroy()
+        dlg = ImageDialog(self, id = id, settings = self.instruction)
+        self.openDialogs['image'] = dlg 
+        if position: 
+            dlg.SetPosition(position)
+        dlg.Show()
+        
+    def OnAddNorthArrow(self, event, id = None):
+        """!Show dialog for north arrow adding and editing"""
+        if self.instruction.FindInstructionByType('northArrow'):
+            id = self.instruction.FindInstructionByType('northArrow').id
+        else: id = None
+        
+        if 'northArrow' not in self.openDialogs:
+            dlg = NorthArrowDialog(self, id = id, settings = self.instruction)
+            self.openDialogs['northArrow'] = dlg
+        self.openDialogs['northArrow'].Show()
+        
     def OnAddText(self, event, id = None):
         """!Show dialog for text adding and editing"""
         position = None
@@ -660,6 +690,81 @@ class PsMapFrame(wx.Frame):
             dlg.SetPosition(position)
         dlg.Show()
         
+    def OnAddPoint(self, event):
+        """!Add point action selected"""
+        self.mouse["use"] = "addPoint"
+        self.canvas.SetCursor(self.cursors["cross"])
+        
+    def AddPoint(self, id = None, coordinates = None):
+        """!Add point and open property dialog.
+
+        @param id id point id (None if creating new point)
+        @param coordinates coordinates of new point
+        """
+        position = None
+        if 'point' in self.openDialogs:
+            position = self.openDialogs['point'].GetPosition()
+            self.openDialogs['point'].OnApply(event = None)
+            self.openDialogs['point'].Destroy()
+        dlg = PointDialog(self, id = id, settings = self.instruction,
+                          coordinates = coordinates)
+        self.openDialogs['point'] = dlg
+        if position: 
+            dlg.SetPosition(position)
+        if coordinates:
+            dlg.OnApply(event = None)
+        dlg.Show()
+        
+    def OnAddLine(self, event):
+        """!Add line action selected"""
+        self.mouse["use"] = "addLine"
+        self.canvas.SetCursor(self.cursors["cross"])
+
+    def AddLine(self, id = None, coordinates = None):
+        """!Add line and open property dialog.
+        
+        @param id id line id (None if creating new line)
+        @param coordinates coordinates of new line
+        """
+        position = None
+        if 'line' in self.openDialogs:
+            position = self.openDialogs['line'].GetPosition()
+            self.openDialogs['line'].OnApply(event = None)
+            self.openDialogs['line'].Destroy()
+        dlg = RectangleDialog(self, id = id, settings = self.instruction,
+                              type = 'line', coordinates = coordinates)
+        self.openDialogs['line'] = dlg
+        if position: 
+            dlg.SetPosition(position)
+        if coordinates:
+            dlg.OnApply(event = None)
+        dlg.Show()
+
+    def OnAddRectangle(self, event):
+        """!Add rectangle action selected"""
+        self.mouse["use"] = "addRectangle"
+        self.canvas.SetCursor(self.cursors["cross"])
+
+    def AddRectangle(self, id = None, coordinates = None):
+        """!Add rectangle and open property dialog.
+        
+        @param id id rectangle id (None if creating new rectangle)
+        @param coordinates coordinates of new rectangle
+        """
+        position = None
+        if 'rectangle' in self.openDialogs:
+            position = self.openDialogs['rectangle'].GetPosition()
+            self.openDialogs['rectangle'].OnApply(event = None)
+            self.openDialogs['rectangle'].Destroy()
+        dlg = RectangleDialog(self, id = id, settings = self.instruction,
+                              type = 'rectangle', coordinates = coordinates)
+        self.openDialogs['rectangle'] = dlg
+        if position: 
+            dlg.SetPosition(position)
+        if coordinates:
+            dlg.OnApply(event = None)
+        dlg.Show()
+
     def getModifiedTextBounds(self, x, y, textExtent, rotation):
         """!computes bounding box of rotated text, not very precisely"""
         w, h = textExtent
@@ -794,12 +899,44 @@ class PsMapFrame(wx.Frame):
         for id in ids:
             itype = self.instruction[id].type
             
-            if itype in ('scalebar', 'mapinfo'):
+            if itype in ('scalebar', 'mapinfo', 'image'):
                 drawRectangle = self.canvas.CanvasPaperCoordinates(rect = self.instruction[id]['rect'], canvasToPaper = False)
+                self.canvas.UpdateLabel(itype = itype, id = id)
                 self.canvas.Draw(pen = self.pen[itype], brush = self.brush[itype],
                                  pdc = self.canvas.pdcObj, drawid = id, pdctype = 'rectText', bb = drawRectangle)
                 self.canvas.RedrawSelectBox(id)
-                
+            if itype == 'northArrow':
+                self.canvas.UpdateLabel(itype = itype, id = id)
+                drawRectangle = self.canvas.CanvasPaperCoordinates(rect = self.instruction[id]['rect'], canvasToPaper = False)
+                self.canvas.Draw(pen = self.pen[itype], brush = self.brush[itype],
+                                 pdc = self.canvas.pdcObj, drawid = id, pdctype = 'bitmap', bb = drawRectangle)
+                self.canvas.RedrawSelectBox(id)
+
+            if itype in ('point', 'line', 'rectangle'):
+                drawRectangle = self.canvas.CanvasPaperCoordinates(rect = self.instruction[id]['rect'], canvasToPaper = False)
+                # coords only for line
+                coords = None
+                if itype == 'line':
+                    point1 = self.instruction[id]['where'][0]
+                    point2 = self.instruction[id]['where'][1]
+                    point1Coords = self.canvas.CanvasPaperCoordinates(rect = Rect2DPS(point1, (0, 0)), canvasToPaper = False)[:2]
+                    point2Coords = self.canvas.CanvasPaperCoordinates(rect = Rect2DPS(point2, (0, 0)), canvasToPaper = False)[:2]
+                    coords = (point1Coords, point2Coords)
+
+                # fill color is not in line
+                fcolor = None
+                if 'fcolor' in self.instruction[id].GetInstruction():
+                    fcolor = self.instruction[id]['fcolor']
+                # width is not in point
+                width = None
+                if 'width' in self.instruction[id].GetInstruction():
+                    width = self.instruction[id]['width']
+
+                self.canvas.DrawGraphics(drawid = id, color = self.instruction[id]['color'], shape = itype,
+                                       fcolor = fcolor, width = width, bb = drawRectangle, lineCoords = coords)
+
+                self.canvas.RedrawSelectBox(id)
+
             if itype == 'text':
                 
                 if self.instruction[id]['rotate']:
@@ -808,7 +945,7 @@ class PsMapFrame(wx.Frame):
                     rot = 0
 
                 extent = self.getTextExtent(textDict = self.instruction[id].GetInstruction())
-                rect = wx.Rect2D(self.instruction[id]['where'][0], self.instruction[id]['where'][1], 0, 0)
+                rect = Rect2DPS(self.instruction[id]['where'], (0, 0))
                 self.instruction[id]['coords'] = list(self.canvas.CanvasPaperCoordinates(rect = rect, canvasToPaper = False)[:2])
                 
                 #computes text coordinates according to reference point, not precisely
@@ -835,9 +972,8 @@ class PsMapFrame(wx.Frame):
             if itype in ('map', 'vector', 'raster'):
                 
                 if itype == 'raster':#set resolution
-                    resol = RunCommand('r.info', read = True, flags = 's', map = self.instruction[id]['raster'])
-                    resol = grass.parse_key_val(resol, val_type = float)
-                    RunCommand('g.region', nsres = resol['nsres'], ewres = resol['ewres'])
+                    info = grass.raster_info(self.instruction[id]['raster'])
+                    RunCommand('g.region', nsres = info['nsres'], ewres = info['ewres'])
                     # change current raster in raster legend
                     
                 if 'rasterLegend' in self.openDialogs:
@@ -864,6 +1000,7 @@ class PsMapFrame(wx.Frame):
                 
             if itype == 'rasterLegend':
                 if self.instruction[id]['rLegend']:
+                    self.canvas.UpdateLabel(itype = itype, id = id)
                     drawRectangle = self.canvas.CanvasPaperCoordinates(rect = self.instruction[id]['rect'], canvasToPaper = False)
                     self.canvas.Draw(pen = self.pen[itype], brush = self.brush[itype],
                                      pdc = self.canvas.pdcObj, drawid = id, pdctype = 'rectText', bb = drawRectangle)
@@ -875,6 +1012,7 @@ class PsMapFrame(wx.Frame):
                 if not self.instruction.FindInstructionByType('vector'):
                     self.deleteObject(id)
                 elif self.instruction[id]['vLegend']:
+                    self.canvas.UpdateLabel(itype = itype, id = id)
                     drawRectangle = self.canvas.CanvasPaperCoordinates(rect = self.instruction[id]['rect'], canvasToPaper = False)
                     self.canvas.Draw(pen = self.pen[itype], brush = self.brush[itype],
                                      pdc = self.canvas.pdcObj, drawid = id, pdctype = 'rectText', bb = drawRectangle)
@@ -886,6 +1024,11 @@ class PsMapFrame(wx.Frame):
     def OnPageChanged(self, event):
         """!Flatnotebook page has changed"""
         self.currentPage = self.book.GetPageIndex(self.book.GetCurrentPage())
+        if self.currentPage == 1:
+            self.SetStatusText(_("Press button with green triangle icon to generate preview."))
+        else:
+            self.SetStatusText('')
+
         
         
     def OnPageChanging(self, event):
@@ -924,6 +1067,8 @@ class PsMapFrame(wx.Frame):
         except OSError:
             pass
         grass.set_raise_on_error(False)
+        if hasattr(self, 'delayedCall') and self.delayedCall.IsRunning():
+            self.delayedCall.Stop()
         self.Destroy()
 
 
@@ -964,11 +1109,14 @@ class PsMapBufferedWindow(wx.Window):
         
         
         #labels
-        self.itemLabels = { 'map': ['MAP FRAME'],
-                            'rasterLegend': ['RASTER LEGEND'],
-                            'vectorLegend': ['VECTOR LEGEND'],
-                            'mapinfo': ['MAP INFO'],
-                            'scalebar': ['SCALE BAR']}
+        self.itemLabelsDict = { 'map': 'MAP FRAME',
+                                'rasterLegend': 'RASTER LEGEND',
+                                'vectorLegend': 'VECTOR LEGEND',
+                                'mapinfo': 'MAP INFO',
+                                'scalebar': 'SCALE BAR',
+                                'image': 'IMAGE',
+                                'northArrow': 'NORTH ARROW'}
+        self.itemLabels = {}
         
         # define PseudoDC
         self.pdc = wx.PseudoDC()
@@ -985,6 +1133,10 @@ class PsMapBufferedWindow(wx.Window):
         self.idBoxTmp = wx.NewId()
         self.idZoomBoxTmp = wx.NewId()
         self.idResizeBoxTmp = wx.NewId()
+        self.idLinePointsTmp = (wx.NewId(), wx.NewId()) # ids of marks for moving line vertices
+
+        self.resizeBoxSize = wx.Size(8, 8)
+        self.showResizeHelp = False # helper for correctly working statusbar
         
         
 
@@ -1006,7 +1158,8 @@ class PsMapBufferedWindow(wx.Window):
         self.Bind(wx.EVT_PAINT, self.OnPaint)
         self.Bind(wx.EVT_SIZE,  self.OnSize)
         self.Bind(wx.EVT_IDLE,  self.OnIdle)
-        self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
+        # self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
+        self.Bind(wx.EVT_MOUSE_EVENTS, self.MouseActions)
 
 
     def Clear(self):
@@ -1043,12 +1196,12 @@ class PsMapBufferedWindow(wx.Window):
             scale = self.currScale
             pRectx = units.convert(value =  - pRect.x, fromUnit = 'pixel', toUnit = 'inch' ) /scale #inch, real, negative
             pRecty = units.convert(value =  - pRect.y, fromUnit = 'pixel', toUnit = 'inch' ) /scale 
-        Width = units.convert(value = rect.width, fromUnit = fromU, toUnit = toU) * scale
-        Height = units.convert(value = rect.height, fromUnit = fromU, toUnit = toU) * scale
-        X = units.convert(value = (rect.x - pRectx), fromUnit = fromU, toUnit = toU) * scale
-        Y = units.convert(value = (rect.y - pRecty), fromUnit = fromU, toUnit = toU) * scale
+        Width = units.convert(value = rect.GetWidth(), fromUnit = fromU, toUnit = toU) * scale
+        Height = units.convert(value = rect.GetHeight(), fromUnit = fromU, toUnit = toU) * scale
+        X = units.convert(value = (rect.GetX() - pRectx), fromUnit = fromU, toUnit = toU) * scale
+        Y = units.convert(value = (rect.GetY() - pRecty), fromUnit = fromU, toUnit = toU) * scale
 
-        return wx.Rect2D(X, Y, Width, Height)
+        return Rect2D(X, Y, Width, Height)
 
     
     
@@ -1090,13 +1243,31 @@ class PsMapBufferedWindow(wx.Window):
             mapId = self.instruction.FindInstructionByType('map').id
         except AttributeError:
             mapId = self.instruction.FindInstructionByType('initMap').id
-            
-        texts = self.instruction.FindInstructionByType('text', list = True)
-        for text in texts:
-            e, n = PaperMapCoordinates(map = self.instruction[mapId], x = self.instruction[text.id]['where'][0],
-                                       y = self.instruction[text.id]['where'][1], paperToMap = True)
-            self.instruction[text.id]['east'], self.instruction[text.id]['north'] = e, n
-            
+        
+        for itemType in ('text', 'image', 'northArrow', 'point', 'line', 'rectangle'):
+            items = self.instruction.FindInstructionByType(itemType, list = True)
+            for item in items:
+                instr = self.instruction[item.id]
+                if itemType in ('line', 'rectangle'):
+                    if itemType == 'line':
+                        e1, n1 = PaperMapCoordinates(mapInstr = self.instruction[mapId], x = instr['where'][0][0],
+                                                     y = instr['where'][0][1], paperToMap = True)
+                        e2, n2 = PaperMapCoordinates(mapInstr = self.instruction[mapId], x = instr['where'][1][0],
+                                                     y = instr['where'][1][1], paperToMap = True)
+                    else: 
+                        e1, n1 = PaperMapCoordinates(mapInstr = self.instruction[mapId], x = instr['rect'].GetLeft(),
+                                                     y = instr['rect'].GetTop(), paperToMap = True)
+                        e2, n2 = PaperMapCoordinates(mapInstr = self.instruction[mapId], x = instr['rect'].GetRight(),
+                                                     y = instr['rect'].GetBottom(), paperToMap = True)
+                    instr['east1'] = e1
+                    instr['north1'] = n1
+                    instr['east2'] = e2
+                    instr['north2'] = n2
+                else:
+                    e, n = PaperMapCoordinates(mapInstr = self.instruction[mapId], x = instr['where'][0],
+                                               y = instr['where'][1], paperToMap = True)
+                    instr['east'], instr['north'] = e, n
+                
     def OnPaint(self, event):
         """!Draw pseudo DC to buffer
         """
@@ -1122,244 +1293,455 @@ class PsMapBufferedWindow(wx.Window):
             self.pdcImage.DrawToDCClipped(dc, rgn.GetBox())
         self.pdcTmp.DrawToDCClipped(dc, rgn.GetBox())
         
-    def OnMouse(self, event):
-
-        if event.GetWheelRotation():
-            zoom = event.GetWheelRotation()
-            use = self.mouse['use']
-            self.mouse['begin'] = event.GetPosition()
-            if zoom > 0:
-                self.mouse['use'] = 'zoomin'
-            else:
-                self.mouse['use'] = 'zoomout'
+    def MouseActions(self, event):
+        """!Mouse motion and button click notifier
+        """
+        # zoom with mouse wheel
+        if event.GetWheelRotation() != 0:
+            self.OnMouseWheel(event)
+            
+        # left mouse button pressed
+        elif event.LeftDown():
+            self.OnLeftDown(event)
+        
+        # left mouse button released
+        elif event.LeftUp():
+            self.OnLeftUp(event)
+        
+        # dragging
+        elif event.Dragging():
+            self.OnDragging(event)
+        
+        # double click
+        elif event.ButtonDClick():
+            self.OnButtonDClick(event)
+        
+        # middle mouse button pressed
+        elif event.MiddleDown():
+            self.OnMiddleDown(event)
+        
+        elif event.Moving():
+            self.OnMouseMoving(event)
                 
-            zoomFactor, view = self.ComputeZoom(wx.Rect(0,0,0,0))
-            self.Zoom(zoomFactor, view)
-            self.mouse['use'] = use
+    def OnMouseWheel(self, event):
+        """!Mouse wheel scrolled.
+
+        Changes zoom."""
+        if UserSettings.Get(group = 'display',
+                            key = 'mouseWheelZoom',
+                            subkey = 'selection') == 2:
+            event.Skip()
+            return
+
+        zoom = event.GetWheelRotation()
+        oldUse = self.mouse['use']
+        self.mouse['begin'] = event.GetPosition()
+        
+        if UserSettings.Get(group = 'display',
+                            key = 'scrollDirection',
+                            subkey = 'selection'):
+            zoom *= -1
             
-        if event.Moving():
-            if self.mouse['use'] in ('pointer', 'resize'):
-                pos = event.GetPosition()
-                foundResize = self.pdcTmp.FindObjects(pos[0], pos[1])
-                if foundResize and foundResize[0] == self.idResizeBoxTmp:
-                    self.SetCursor(self.cursors["sizenwse"])
-                    self.parent.SetStatusText(_('Click and drag to resize object'), 0)
-                else:
+        if zoom > 0:
+            self.mouse['use'] = 'zoomin'
+        else:
+            self.mouse['use'] = 'zoomout'
+            
+        zoomFactor, view = self.ComputeZoom(wx.Rect(0, 0, 0, 0))
+        self.Zoom(zoomFactor, view)
+        self.mouse['use'] = oldUse
+
+    def OnMouseMoving(self, event):
+        """!Mouse cursor moving.
+
+        Change cursor when moving over resize marker.
+        """
+        if self.preview:
+            return
+
+        if self.mouse['use'] in ('pointer', 'resize'):
+            pos = event.GetPosition()
+            foundResize = self.pdcTmp.FindObjects(pos[0], pos[1])
+            if foundResize and foundResize[0] in (self.idResizeBoxTmp,) + self.idLinePointsTmp:
+                self.SetCursor(self.cursors["sizenwse"])
+                self.parent.SetStatusText(_('Click and drag to resize object'), 0)
+                self.showResizeHelp = True
+            else:
+                if self.showResizeHelp:
                     self.parent.SetStatusText('', 0)
                     self.SetCursor(self.cursors["default"])
-                    
-        elif event.LeftDown():
-            self.mouse['begin'] = event.GetPosition()
-            self.begin = self.mouse['begin']
-            if self.mouse['use'] in ('pan', 'zoomin', 'zoomout', 'addMap'):
-                pass
-            
-            #select
-            if self.mouse['use'] == 'pointer':
-                found = self.pdcObj.FindObjects(self.mouse['begin'][0], self.mouse['begin'][1])
-                foundResize = self.pdcTmp.FindObjects(self.mouse['begin'][0], self.mouse['begin'][1])
+                    self.showResizeHelp = False
+                
+    def OnLeftDown(self, event):
+        """!Left mouse button pressed.
 
-                if foundResize and foundResize[0] == self.idResizeBoxTmp:
-                    self.mouse['use'] = 'resize'
-                    
-                    # when resizing, proportions match region
-                    if self.instruction[self.dragId].type == 'map':
-                        self.constraint = False
+        Select objects, redraw, prepare for moving/resizing.
+        """
+        self.mouse['begin'] = event.GetPosition()
+        self.begin = self.mouse['begin']
+        
+        # select
+        if self.mouse['use'] == 'pointer':
+            found = self.pdcObj.FindObjects(self.mouse['begin'][0], self.mouse['begin'][1])
+            foundResize = self.pdcTmp.FindObjects(self.mouse['begin'][0], self.mouse['begin'][1])
+
+            if foundResize and foundResize[0] in (self.idResizeBoxTmp,) + self.idLinePointsTmp:
+                self.mouse['use'] = 'resize'
+                
+                # when resizing, proportions match region
+                if self.instruction[self.dragId].type == 'map':
+                    self.constraint = False
+                    self.mapBounds = self.pdcObj.GetIdBounds(self.dragId)
+                    if self.instruction[self.dragId]['scaleType'] in (0, 1, 2):
+                        self.constraint = True
                         self.mapBounds = self.pdcObj.GetIdBounds(self.dragId)
-                        if self.instruction[self.dragId]['scaleType'] in (0, 1, 2):
-                            self.constraint = True
-                            self.mapBounds = self.pdcObj.GetIdBounds(self.dragId)
+
+                if self.instruction[self.dragId].type == 'line':
+                    self.currentLinePoint = self.idLinePointsTmp.index(foundResize[0])
+                
+            elif found:
+                self.dragId = found[0]
+                self.RedrawSelectBox(self.dragId)
+                if self.instruction[self.dragId].type not in ('map', 'rectangle'):
+                    self.pdcTmp.RemoveId(self.idResizeBoxTmp)
+                    self.Refresh()
+                if self.instruction[self.dragId].type != 'line':
+                    for id in self.idLinePointsTmp:
+                        self.pdcTmp.RemoveId(id)
+                    self.Refresh()
                     
-                elif found:
-                    self.dragId = found[0]  
-                    self.RedrawSelectBox(self.dragId)
-                    if self.instruction[self.dragId].type != 'map':
-                        self.pdcTmp.RemoveId(self.idResizeBoxTmp)
-                        self.Refresh()
+            else:
+                self.dragId = -1
+                self.pdcTmp.RemoveId(self.idBoxTmp)
+                self.pdcTmp.RemoveId(self.idResizeBoxTmp)
+                for id in self.idLinePointsTmp:
+                    self.pdcTmp.RemoveId(id)
+                self.Refresh()
+
+    def OnLeftUp(self, event):
+        """!Left mouse button released.
+
+        Recalculate zooming/resizing/moving and redraw.
+        """
+        # zoom in, zoom out
+        if self.mouse['use'] in ('zoomin','zoomout'):
+            zoomR = self.pdcTmp.GetIdBounds(self.idZoomBoxTmp)
+            self.pdcTmp.RemoveId(self.idZoomBoxTmp)
+            self.Refresh()
+            zoomFactor, view = self.ComputeZoom(zoomR)
+            self.Zoom(zoomFactor, view)
+
+        # draw map frame
+        if self.mouse['use'] == 'addMap':
+            rectTmp = self.pdcTmp.GetIdBounds(self.idZoomBoxTmp)
+            # too small rectangle, it's usually some mistake
+            if rectTmp.GetWidth() < 20 or rectTmp.GetHeight() < 20:
+                self.pdcTmp.RemoveId(self.idZoomBoxTmp)
+                self.Refresh()
+                return
+            rectPaper = self.CanvasPaperCoordinates(rect = rectTmp, canvasToPaper = True)
+
+            dlg = MapDialog(parent = self.parent, id = [None, None, None], settings = self.instruction, 
+                            rect = rectPaper)
+            self.openDialogs['map'] = dlg
+            self.openDialogs['map'].Show()
+            
+            self.mouse['use'] = self.parent.mouseOld
+
+            self.SetCursor(self.parent.cursorOld)
+            self.parent.toolbar.ToggleTool(self.parent.actionOld, True)
+            self.parent.toolbar.ToggleTool(self.parent.toolbar.action['id'], False)
+            self.parent.toolbar.action['id'] = self.parent.actionOld
+            return
+
+        # resize resizable objects (map, line, rectangle)
+        if self.mouse['use'] == 'resize':
+            mapObj = self.instruction.FindInstructionByType('map')
+            if not mapObj:
+                mapObj = self.instruction.FindInstructionByType('initMap')
+            mapId = mapObj.id
+            
+            if self.dragId == mapId:
+                # necessary to change either map frame (scaleType 0,1,2) or region (scaletype 3)
+                newRectCanvas = self.pdcObj.GetIdBounds(mapId)
+                newRectPaper = self.CanvasPaperCoordinates(rect = newRectCanvas, canvasToPaper = True)
+                self.instruction[mapId]['rect'] = newRectPaper
+                
+                if self.instruction[mapId]['scaleType'] in (0, 1, 2):
+                    if self.instruction[mapId]['scaleType'] == 0:
                         
-                else:
-                    self.dragId = -1
-                    self.pdcTmp.RemoveId(self.idBoxTmp)
-                    self.pdcTmp.RemoveId(self.idResizeBoxTmp)
-                    self.Refresh()           
+                        scale, foo, rect = AutoAdjust(self, scaleType = 0,
+                                                      map = self.instruction[mapId]['map'],
+                                                      mapType = self.instruction[mapId]['mapType'], 
+                                                      rect = self.instruction[mapId]['rect'])
+                        
+                    elif self.instruction[mapId]['scaleType'] == 1:
+                        scale, foo, rect = AutoAdjust(self, scaleType = 1,
+                                                      region = self.instruction[mapId]['region'],
+                                                      rect = self.instruction[mapId]['rect'])
+                    else:
+                        scale, foo, rect = AutoAdjust(self, scaleType = 2,
+                                                      rect = self.instruction[mapId]['rect'])
+                    self.instruction[mapId]['rect'] = rect
+                    self.instruction[mapId]['scale'] = scale
                     
+                    rectCanvas = self.CanvasPaperCoordinates(rect = rect, canvasToPaper = False)
+                    self.Draw(pen = self.pen['map'], brush = self.brush['map'],
+                              pdc = self.pdcObj, drawid = mapId, pdctype = 'rectText', bb = rectCanvas)
                     
-        elif event.Dragging() and event.LeftIsDown():
-            #draw box when zooming, creating map 
-            if self.mouse['use'] in ('zoomin', 'zoomout', 'addMap'):
+                elif self.instruction[mapId]['scaleType'] == 3:
+                    ComputeSetRegion(self, mapDict = self.instruction[mapId].GetInstruction())
+                #check resolution
+                SetResolution(dpi = self.instruction[mapId]['resolution'],
+                              width = self.instruction[mapId]['rect'].width,
+                              height = self.instruction[mapId]['rect'].height)
+                
+                self.RedrawSelectBox(mapId)
+                self.Zoom(zoomFactor = 1, view = (0, 0))
+
+            elif self.instruction[self.dragId].type == 'line':
+                points = self.instruction[self.dragId]['where']
+                self.instruction[self.dragId]['rect'] = Rect2DPP(points[0], points[1])
+                self.RecalculatePosition(ids = [self.dragId])
+
+            elif self.instruction[self.dragId].type == 'rectangle':
+                self.RecalculatePosition(ids = [self.dragId])
+
+            self.mouse['use'] = 'pointer'
+            
+        # recalculate the position of objects after dragging
+        if self.mouse['use'] in ('pointer', 'resize') and self.dragId != -1:
+            if self.mouse['begin'] != event.GetPosition(): #for double click
+                
+                self.RecalculatePosition(ids = [self.dragId])
+                if self.instruction[self.dragId].type in self.openDialogs:
+                    self.openDialogs[self.instruction[self.dragId].type].updateDialog()
+        
+        elif self.mouse['use'] in ('addPoint', 'addLine', 'addRectangle'):
+            endCoordinates = self.CanvasPaperCoordinates(rect = wx.Rect(event.GetX(), event.GetY(), 0, 0),
+                                                         canvasToPaper = True)[:2]
+
+            diffX = event.GetX() - self.mouse['begin'][0]
+            diffY = event.GetY() - self.mouse['begin'][1]
+
+            if self.mouse['use'] == 'addPoint':
+                self.parent.AddPoint(coordinates = endCoordinates)
+            elif self.mouse['use'] in ('addLine', 'addRectangle'):
+                # not too small lines/rectangles
+                if sqrt(diffX * diffX + diffY * diffY) < 5:
+                    self.pdcTmp.RemoveId(self.idZoomBoxTmp)
+                    self.Refresh()
+                    return
+
+                beginCoordinates = self.CanvasPaperCoordinates(rect = wx.Rect(self.mouse['begin'][0],
+                                                                              self.mouse['begin'][1], 0, 0),
+                                                               canvasToPaper = True)[:2]
+                if self.mouse['use'] == 'addLine':
+                    self.parent.AddLine(coordinates = [beginCoordinates, endCoordinates])
+                else:
+                    self.parent.AddRectangle(coordinates = [beginCoordinates, endCoordinates])
+                self.pdcTmp.RemoveId(self.idZoomBoxTmp)
+                self.Refresh()
+
+    def OnButtonDClick(self, event):
+        """!Open object dialog for editing."""
+        if self.mouse['use'] == 'pointer' and self.dragId != -1:
+            itemCall = {'text':self.parent.OnAddText,
+                        'mapinfo': self.parent.OnAddMapinfo,
+                        'scalebar': self.parent.OnAddScalebar,
+                        'image': self.parent.OnAddImage,
+                        'northArrow' : self.parent.OnAddNorthArrow,
+                        'point': self.parent.AddPoint,
+                        'line': self.parent.AddLine,
+                        'rectangle': self.parent.AddRectangle,
+                        'rasterLegend': self.parent.OnAddLegend,
+                        'vectorLegend': self.parent.OnAddLegend,
+                        'map': self.parent.OnAddMap}
+
+            itemArg = { 'text': dict(event = None, id = self.dragId),
+                        'mapinfo': dict(event = None),
+                        'scalebar': dict(event = None),
+                        'image': dict(event = None, id = self.dragId),
+                        'northArrow': dict(event = None, id = self.dragId),
+                        'point': dict(id = self.dragId),
+                        'line': dict(id = self.dragId),
+                        'rectangle': dict(id = self.dragId),
+                        'rasterLegend': dict(event = None),
+                        'vectorLegend': dict(event = None, page = 1),
+                        'map': dict(event = None, notebook = True)}
+
+            type = self.instruction[self.dragId].type
+            itemCall[type](**itemArg[type])
+
+    def OnDragging(self, event):
+        """!Process panning/resizing/drawing/moving."""
+        if event.MiddleIsDown():
+            # panning
+            self.mouse['end'] = event.GetPosition()
+            self.Pan(begin = self.mouse['begin'], end = self.mouse['end'])
+            self.mouse['begin'] = event.GetPosition()
+
+        elif event.LeftIsDown():
+            # draw box when zooming, creating map 
+            if self.mouse['use'] in ('zoomin', 'zoomout', 'addMap', 'addLine', 'addRectangle'):
                 self.mouse['end'] = event.GetPosition()
                 r = wx.Rect(self.mouse['begin'][0], self.mouse['begin'][1],
                             self.mouse['end'][0]-self.mouse['begin'][0], self.mouse['end'][1]-self.mouse['begin'][1])
                 r = self.modifyRectangle(r)
-                self.Draw(pen = self.pen['box'], brush = self.brush['box'], pdc = self.pdcTmp, drawid = self.idZoomBoxTmp,
-                          pdctype = 'rect', bb = r)
-                
-            # panning                
+
+                if self.mouse['use'] in ('addLine', 'addRectangle'):
+                    if self.mouse['use'] == 'addLine':
+                        pdcType = 'line'
+                        lineCoords = (self.mouse['begin'], self.mouse['end'])
+                    else:
+                        pdcType = 'rect'
+                        lineCoords = None
+                        if r[2] < 2 or r[3] < 2:
+                            # to avoid strange behavoiur
+                            return
+
+                    self.Draw(pen = self.pen['line'], brush = self.brush['line'],
+                              pdc = self.pdcTmp, drawid = self.idZoomBoxTmp,
+                              pdctype = pdcType, bb = r, lineCoords = lineCoords)
+
+                else:
+                    self.Draw(pen = self.pen['box'], brush = self.brush['box'],
+                              pdc = self.pdcTmp, drawid = self.idZoomBoxTmp,
+                              pdctype = 'rect', bb = r)
+
+            # panning
             if self.mouse["use"] == 'pan':
                 self.mouse['end'] = event.GetPosition()
-                view = self.mouse['begin'][0] - self.mouse['end'][0], self.mouse['begin'][1] - self.mouse['end'][1]
-                zoomFactor = 1
-                self.Zoom(zoomFactor, view)
+                self.Pan(begin = self.mouse['begin'], end = self.mouse['end'])
                 self.mouse['begin'] = event.GetPosition()
-                
-            #move object
+
+            # move object
             if self.mouse['use'] == 'pointer' and self.dragId != -1:
-                
                 self.mouse['end'] = event.GetPosition()
                 dx, dy = self.mouse['end'][0] - self.begin[0], self.mouse['end'][1] - self.begin[1]
                 self.pdcObj.TranslateId(self.dragId, dx, dy)
                 self.pdcTmp.TranslateId(self.idBoxTmp, dx, dy)
                 self.pdcTmp.TranslateId(self.idResizeBoxTmp, dx, dy)
+                for id in self.idLinePointsTmp:
+                    self.pdcTmp.TranslateId(id, dx, dy)
                 if self.instruction[self.dragId].type == 'text': 
                     self.instruction[self.dragId]['coords'] = self.instruction[self.dragId]['coords'][0] + dx,\
                         self.instruction[self.dragId]['coords'][1] + dy
                 self.begin = event.GetPosition()
                 self.Refresh()
-                
+
             # resize object
             if self.mouse['use'] == 'resize':
-                type = self.instruction[self.dragId].type
                 pos = event.GetPosition()
-                x, y = self.mapBounds.GetX(), self.mapBounds.GetY()
-                width, height = self.mapBounds.GetWidth(), self.mapBounds.GetHeight()
                 diffX = pos[0] - self.mouse['begin'][0]
                 diffY = pos[1] - self.mouse['begin'][1]
-                # match given region
-                if self.constraint:
-                    if width > height:
-                        newWidth = width + diffX
-                        newHeight = height + diffX * (float(height) / width)
+                if self.instruction[self.dragId].type == 'map':
+                    x, y = self.mapBounds.GetX(), self.mapBounds.GetY()
+                    width, height = self.mapBounds.GetWidth(), self.mapBounds.GetHeight()
+                    # match given region
+                    if self.constraint:
+                        if width > height:
+                            newWidth = width + diffX
+                            newHeight = height + diffX * (float(height) / width)
+                        else:
+                            newWidth = width + diffY * (float(width) / height)
+                            newHeight = height + diffY
                     else:
-                        newWidth = width + diffY * (float(width) / height)
+                        newWidth = width + diffX
                         newHeight = height + diffY
-                else:
-                    newWidth = width + diffX
-                    newHeight = height + diffY
-                    
-                if newWidth < 10 or newHeight < 10:
-                    return
-                
-                bounds = wx.Rect(x, y, newWidth, newHeight)    
-                self.Draw(pen = self.pen[type], brush = self.brush[type], pdc = self.pdcObj, drawid = self.dragId,
-                          pdctype = 'rectText', bb = bounds)
-                self.RedrawSelectBox(self.dragId)
-                
-        elif event.LeftUp():
-            # zoom in, zoom out
-            if self.mouse['use'] in ('zoomin','zoomout'):
-                zoomR = self.pdcTmp.GetIdBounds(self.idZoomBoxTmp)
-                self.pdcTmp.RemoveId(self.idZoomBoxTmp)
-                self.Refresh()
-                zoomFactor, view = self.ComputeZoom(zoomR)
-                self.Zoom(zoomFactor, view)
-
-                
-            # draw map frame    
-            if self.mouse['use'] == 'addMap':
-                rectTmp = self.pdcTmp.GetIdBounds(self.idZoomBoxTmp)
-                # too small rectangle, it's usually some mistake
-                if rectTmp.GetWidth() < 20 or rectTmp.GetHeight() < 20:
-                    self.pdcTmp.RemoveId(self.idZoomBoxTmp)
-                    self.Refresh()
-                    return
-                rectPaper = self.CanvasPaperCoordinates(rect = rectTmp, canvasToPaper = True)                
-                
-                dlg = MapDialog(parent = self.parent, id = [None, None, None], settings = self.instruction, 
-                                rect = rectPaper)
-                self.openDialogs['map'] = dlg
-                self.openDialogs['map'].Show()
-                
-                
-                self.mouse['use'] = self.parent.mouseOld
-
-                self.SetCursor(self.parent.cursorOld)
-                self.parent.toolbar.ToggleTool(self.parent.actionOld, True)
-                self.parent.toolbar.ToggleTool(self.parent.toolbar.action['id'], False)
-                self.parent.toolbar.action['id'] = self.parent.actionOld
-                
+                        
+                    if newWidth < 10 or newHeight < 10:
+                        return
+
+                    bounds = wx.Rect(x, y, newWidth, newHeight)
+                    self.Draw(pen = self.pen['map'], brush = self.brush['map'], pdc = self.pdcObj, drawid = self.dragId,
+                              pdctype = 'rectText', bb = bounds)
+
+                elif self.instruction[self.dragId].type == 'rectangle':
+                    instr = self.instruction[self.dragId]
+                    rect = self.CanvasPaperCoordinates(rect = instr['rect'], canvasToPaper = False)
+                    rect.SetWidth(rect.GetWidth() + diffX)
+                    rect.SetHeight(rect.GetHeight() + diffY)
+
+                    if rect.GetWidth() < 5 or rect.GetHeight() < 5:
+                        return
+
+                    self.DrawGraphics(drawid = self.dragId, shape = 'rectangle', color = instr['color'],
+                                      fcolor = instr['fcolor'], width = instr['width'], bb = rect)
+
+                elif self.instruction[self.dragId].type == 'line':
+                    instr = self.instruction[self.dragId]
+                    points = instr['where']
+                    # moving point
+                    if self.currentLinePoint == 0:
+                        pPaper = points[1]
+                    else:
+                        pPaper = points[0]
+                    pCanvas = self.CanvasPaperCoordinates(rect = Rect2DPS(pPaper, (0, 0)),
+                                                          canvasToPaper = False)[:2]
+                    bounds = wx.RectPP(pCanvas, pos)
+                    self.DrawGraphics(drawid = self.dragId, shape = 'line', color = instr['color'],
+                                      width = instr['width'], bb = bounds, lineCoords = (pos, pCanvas))
 
+                    # update paper coordinates
+                    points[self.currentLinePoint] = self.CanvasPaperCoordinates(rect = wx.RectPS(pos, (0, 0)),
+                                                                                canvasToPaper = True)[:2]
 
-            # resize resizable objects (only map sofar)
-            if self.mouse['use'] == 'resize':
-                mapId = self.instruction.FindInstructionByType('map').id
-                
-                if self.dragId == mapId:
-                    # necessary to change either map frame (scaleType 0,1,2) or region (scaletype 3)
-                    newRectCanvas = self.pdcObj.GetIdBounds(mapId)
-                    newRectPaper = self.CanvasPaperCoordinates(rect = newRectCanvas, canvasToPaper = True)
-                    self.instruction[mapId]['rect'] = newRectPaper
-                    
-                    if self.instruction[mapId]['scaleType'] in (0, 1, 2):
-                        if self.instruction[mapId]['scaleType'] == 0:
-                            
-                            scale, foo, rect = AutoAdjust(self, scaleType = 0,
-                                                          map = self.instruction[mapId]['map'],
-                                                          mapType = self.instruction[mapId]['mapType'], 
-                                                          rect = self.instruction[mapId]['rect'])
-                            
-                        elif self.instruction[mapId]['scaleType'] == 1:
-                            scale, foo, rect = AutoAdjust(self, scaleType = 1,
-                                                          region = self.instruction[mapId]['region'],
-                                                          rect = self.instruction[mapId]['rect'])
-                        else:
-                            scale, foo, rect = AutoAdjust(self, scaleType = 2,
-                                                          rect = self.instruction[mapId]['rect'])
-                        self.instruction[mapId]['rect'] = rect
-                        self.instruction[mapId]['scale'] = scale
-                        
-                        rectCanvas = self.CanvasPaperCoordinates(rect = rect, canvasToPaper = False)
-                        self.Draw(pen = self.pen['map'], brush = self.brush['map'],
-                                  pdc = self.pdcObj, drawid = mapId, pdctype = 'rectText', bb = rectCanvas)
-                        
-                    elif self.instruction[mapId]['scaleType'] == 3:
-                        ComputeSetRegion(self, mapDict = self.instruction[mapId].GetInstruction())
-                    #check resolution
-                    SetResolution(dpi = self.instruction[mapId]['resolution'],
-                                  width = self.instruction[mapId]['rect'].width,
-                                  height = self.instruction[mapId]['rect'].height)
-                    
-                    self.RedrawSelectBox(mapId)
-                    self.Zoom(zoomFactor = 1, view = (0, 0))
-                self.mouse['use'] = 'pointer'
-                
-            # recalculate the position of objects after dragging    
-            if self.mouse['use'] in ('pointer', 'resize') and self.dragId != -1:
-                if self.mouse['begin'] != event.GetPosition(): #for double click
-                    
-                    self.RecalculatePosition(ids = [self.dragId])
-                    if self.instruction[self.dragId].type in self.openDialogs:
-                        self.openDialogs[self.instruction[self.dragId].type].updateDialog()
+                self.RedrawSelectBox(self.dragId)
 
-        # double click launches dialogs
-        elif event.LeftDClick():
-            if self.mouse['use'] == 'pointer' and self.dragId != -1:
-                itemCall = {    'text':self.parent.OnAddText, 'mapinfo': self.parent.OnAddMapinfo,
-                                'scalebar': self.parent.OnAddScalebar,
-                                'rasterLegend': self.parent.OnAddLegend, 'vectorLegend': self.parent.OnAddLegend,  
-                                'map': self.parent.OnAddMap}
-                itemArg = { 'text': dict(event = None, id = self.dragId), 'mapinfo': dict(event = None),
-                            'scalebar': dict(event = None),
-                            'rasterLegend': dict(event = None), 'vectorLegend': dict(event = None, page = 1),
-                            'map': dict(event = None, notebook = True)}
-                type = self.instruction[self.dragId].type
-                itemCall[type](**itemArg[type])
+    def OnMiddleDown(self, event):
+        """!Middle mouse button pressed."""
+        self.mouse['begin'] = event.GetPosition()
 
-                
-                
+    def Pan(self, begin, end):
+        """!Move canvas while dragging.
+        
+        @param begin x,y coordinates of first point
+        @param end x,y coordinates of second point
+        """
+        view = begin[0] - end[0], begin[1] - end[1]
+        zoomFactor = 1
+        self.Zoom(zoomFactor, view)
                 
     def RecalculatePosition(self, ids):
         for id in ids:
             itype = self.instruction[id].type
-            if itype == 'map':
+            if itype in ('map', 'rectangle'):
                 self.instruction[id]['rect'] = self.CanvasPaperCoordinates(rect = self.pdcObj.GetIdBounds(id),
                                                                            canvasToPaper = True)
                 self.RecalculateEN()
                 
-            elif itype in ('mapinfo' ,'rasterLegend', 'vectorLegend'):
+            elif itype in ('mapinfo' ,'rasterLegend', 'vectorLegend', 'image', 'northArrow'):
                 self.instruction[id]['rect'] = self.CanvasPaperCoordinates(rect = self.pdcObj.GetIdBounds(id),
                                                                            canvasToPaper = True)
                 self.instruction[id]['where'] = self.CanvasPaperCoordinates(rect = self.pdcObj.GetIdBounds(id),
-                                                                            canvasToPaper = True)[:2]            
+                                                                            canvasToPaper = True)[:2] 
+                if itype in ('image', 'northArrow'):
+                    self.RecalculateEN()
+
+            elif itype == 'point':
+                rect = self.pdcObj.GetIdBounds(id)
+                self.instruction[id]['rect'] = self.CanvasPaperCoordinates(rect = rect,
+                                                                           canvasToPaper = True)
+                rect.OffsetXY(rect.GetWidth()/2, rect.GetHeight()/2)
+                self.instruction[id]['where'] = self.CanvasPaperCoordinates(rect = rect,
+                                                                            canvasToPaper = True)[:2]
+                self.RecalculateEN()
+
+            elif itype == 'line':
+                rect = self.pdcObj.GetIdBounds(id)
+                oldRect = self.instruction[id]['rect']
+                newRect = self.CanvasPaperCoordinates(rect = rect, canvasToPaper = True)
+                xDiff = newRect[0] - oldRect[0]
+                yDiff = newRect[1] - oldRect[1]
+                self.instruction[id]['rect'] = newRect
+
+                point1 = wx.Point2D(xDiff, yDiff) + self.instruction[id]['where'][0]
+                point2 = wx.Point2D(xDiff, yDiff) + self.instruction[id]['where'][1]
+                self.instruction[id]['where'] = [point1, point2]
+                
+                self.RecalculateEN()
+
             elif  itype == 'scalebar':
                 self.instruction[id]['rect'] = self.CanvasPaperCoordinates(rect = self.pdcObj.GetIdBounds(id),
                                                                            canvasToPaper = True)
@@ -1387,7 +1769,7 @@ class PsMapBufferedWindow(wx.Window):
                     x += extent[0]/2 * cos(rot)
                     y -= extent[0]/2 * sin(rot)
                 
-                self.instruction[id]['where'] = self.CanvasPaperCoordinates(rect = wx.Rect2D(x, y, 0, 0),
+                self.instruction[id]['where'] = self.CanvasPaperCoordinates(rect = Rect2D(x, y, 0, 0),
                                                                             canvasToPaper = True)[:2]
                 self.RecalculateEN()
         
@@ -1418,7 +1800,7 @@ class PsMapBufferedWindow(wx.Window):
 
 
             if self.mouse['use'] == 'zoomout':
-                zoomFactor = min(rW/cW, rH/cH)
+                zoomFactor = min(rW/cW, rH/cH) 
             try:
                 if rW/rH > cW/cH:
                     yView = rect.GetY() - (rW*(cH/cW) - rH)/2
@@ -1435,7 +1817,6 @@ class PsMapBufferedWindow(wx.Window):
                         xView, yView = -x, -y
             except ZeroDivisionError:
                 xView, yView = rect.GetX(), rect.GetY()
-                
         return zoomFactor, (int(xView), int(yView))
     
     
@@ -1465,16 +1846,41 @@ class PsMapBufferedWindow(wx.Window):
                     coords = self.instruction[id]['coords']# recalculate coordinates, they are not equal to BB
                     self.instruction[id]['coords'] = coords = [(int(coord) - view[i]) * zoomFactor
                                                                for i, coord in enumerate(coords)]
-                    self.DrawRotText(pdc = self.pdcObj, drawId = id, textDict = self.instruction[id],
-                                     coords = coords, bounds = oRect )
                     extent = self.parent.getTextExtent(textDict = self.instruction[id])
                     if self.instruction[id]['rotate']:
                         rot = float(self.instruction[id]['rotate']) 
                     else:
                         rot = 0
-
                     self.instruction[id]['rect'] = bounds = self.parent.getModifiedTextBounds(coords[0], coords[1], extent, rot)
+                    self.DrawRotText(pdc = self.pdcObj, drawId = id, textDict = self.instruction[id],
+                                     coords = coords, bounds = bounds )
+
                     self.pdcObj.SetIdBounds(id, bounds)
+
+                elif type == 'northArrow':
+                    self.Draw(pen = self.pen[type], brush = self.brush[type], pdc = self.pdcObj,
+                              drawid = id, pdctype = 'bitmap', bb = oRect)
+
+                elif type in ('point', 'line', 'rectangle'):
+                    instr = self.instruction[id]
+                    color = self.instruction[id]['color']
+                    width = fcolor = coords = None
+
+                    if type in ('point', 'rectangle'):
+                        fcolor = self.instruction[id]['fcolor']
+                    if type in ('line', 'rectangle'):
+                        width = self.instruction[id]['width']
+                    if type in ('line'):
+                        point1, point2 = instr['where'][0], instr['where'][1]
+                        point1 = self.CanvasPaperCoordinates(rect = Rect2DPS(point1, (0, 0)),
+                                                             canvasToPaper = False)[:2]
+                        point2 = self.CanvasPaperCoordinates(rect = Rect2DPS(point2, (0, 0)),
+                                                             canvasToPaper = False)[:2]
+                        coords = (point1, point2)
+
+                    self.DrawGraphics(drawid = id, shape = type, bb = oRect, lineCoords = coords,
+                                    color = color, fcolor = fcolor, width = width)
+
                 else:
                     self.Draw(pen = self.pen[type], brush = self.brush[type], pdc = self.pdcObj,
                               drawid = id, pdctype = 'rectText', bb = oRect)
@@ -1499,8 +1905,14 @@ class PsMapBufferedWindow(wx.Window):
         zoomFactor, view = self.ComputeZoom(zoomP)
         self.Zoom(zoomFactor, view)
         
-    def Draw(self, pen, brush, pdc, drawid = None, pdctype = 'rect', bb = wx.Rect(0,0,0,0)): 
-        """! Draw object"""    
+    def Draw(self, pen, brush, pdc, drawid = None, pdctype = 'rect', bb = wx.Rect(0,0,0,0), lineCoords = None): 
+        """! Draw object with given pen and brush.
+
+        @param pdc PseudoDC
+        @param pdctype 'bitmap'/'rectText'/'rect'/'point'/'line'
+        @param bb bounding box
+        @param lineCoords coordinates of line start, end points (wx.Point, wx.Point)
+        """    
         if drawid is None:
             drawid = wx.NewId()
         bb = bb.Get()
@@ -1509,8 +1921,18 @@ class PsMapBufferedWindow(wx.Window):
         pdc.SetId(drawid)
         pdc.SetPen(pen)
         pdc.SetBrush(brush)
+        
+        if pdctype == 'bitmap':
+            if havePILImage:
+                file = self.instruction[drawid]['epsfile']
+                rotation = self.instruction[drawid]['rotate']
+                self.DrawBitmap(pdc = pdc, filePath = file, rotation = rotation, bbox = bb)
+            else: # draw only rectangle with label
+                pdctype = 'rectText'
+                
         if pdctype in ('rect', 'rectText'):
             pdc.DrawRectangle(*bb)
+            
         if pdctype == 'rectText':
             dc = wx.ClientDC(self) # dc created because of method GetTextExtent, which pseudoDC lacks
             font = self.font
@@ -1519,7 +1941,7 @@ class PsMapBufferedWindow(wx.Window):
             font.SetStyle(wx.ITALIC)
             dc.SetFont(font)
             pdc.SetFont(font)
-            text = '\n'.join(self.itemLabels[self.instruction[drawid].type])
+            text = '\n'.join(self.itemLabels[drawid])
             w,h,lh = dc.GetMultiLineTextExtent(text)
             textExtent = (w,h)
             textRect = wx.Rect(0, 0, *textExtent).CenterIn(bb)
@@ -1533,21 +1955,82 @@ class PsMapBufferedWindow(wx.Window):
                 textRect = wx.Rect(0, 0, *textExtent).CenterIn(bb)
             pdc.SetTextForeground(wx.Color(100,100,100,200)) 
             pdc.SetBackgroundMode(wx.TRANSPARENT)
-            pdc.DrawText(text = text, x = textRect.x, y = textRect.y)
-            
+            pdc.DrawLabel(text = text, rect = textRect)
+
+        elif pdctype == 'point':
+            pdc.DrawCircle(x = bb[0] + bb[2] / 2,
+                           y = bb[1] + bb[3] / 2,
+                           radius = bb[2] / 2)
+                           
+        elif pdctype == 'line':
+            pdc.DrawLinePoint(lineCoords[0], lineCoords[1])
+
         pdc.SetIdBounds(drawid, bb)
         pdc.EndDrawing()
         self.Refresh()
 
         return drawid
     
+    def DrawGraphics(self, drawid, shape, color, bb, width = None, fcolor = None, lineCoords = None):
+        """!Draw point/line/rectangle with given color and width
+
+        @param drawid id of drawn object
+        @param shape drawn shape: 'point'/'line'/'rectangle'
+        @param color pen outline color ('RRR:GGG:BBB')
+        @param fcolor brush fill color, if meaningful ('RRR:GGG:BBB')
+        @param width pen width
+        @param bb bounding box
+        @param lineCoords line coordinates (for line only)
+        """
+        pdctype = {'point'     : 'point',
+                   'line'      : 'line',
+                   'rectangle' : 'rect'}
+
+        if color == 'none':
+            pen = wx.TRANSPARENT_PEN
+        else:
+            if width is not None:
+                units = UnitConversion(self)
+                width = int(units.convert(value = width, fromUnit = 'point', toUnit = 'pixel') * self.currScale)
+            else:
+                width = 2
+            pen = wx.Pen(colour = convertRGB(color), width = width)
+            pen.SetCap(wx.CAP_BUTT) # this is how ps.map draws
+
+        brush = wx.TRANSPARENT_BRUSH
+        if fcolor and fcolor != 'none':
+            brush = wx.Brush(colour = convertRGB(fcolor))
+        
+        self.Draw(pen = pen, brush = brush, pdc = self.pdcObj, pdctype = pdctype[shape],
+                  drawid = drawid, bb = bb, lineCoords = lineCoords)
+
+    def DrawBitmap(self, pdc, filePath, rotation, bbox):
+        """!Draw bitmap using PIL"""
+        pImg = PILImage.open(filePath)
+        if sys.platform == 'win32' and \
+           'eps' in os.path.splitext(filePath)[1].lower():
+               import types
+               pImg.load = types.MethodType(loadPSForWindows, pImg)
+        
+        if rotation:
+            # get rid of black background
+            pImg = pImg.convert("RGBA")
+            rot = pImg.rotate(rotation, expand = 1)
+            new = PILImage.new('RGBA', rot.size, (255,) * 4)
+            pImg = PILImage.composite(rot, new, rot)
+        pImg = pImg.resize((int(bbox[2]), int(bbox[3])), resample = PILImage.BICUBIC)
+        img = PilImageToWxImage(pImg)
+        bitmap = img.ConvertToBitmap()
+        mask = wx.Mask(bitmap, wx.WHITE)
+        bitmap.SetMask(mask)
+        pdc.DrawBitmap(bitmap, bbox[0], bbox[1], useMask = True)
+        
     def DrawRotText(self, pdc, drawId, textDict, coords, bounds):
         if textDict['rotate']:
             rot = float(textDict['rotate']) 
         else:
             rot = 0
-        
-        fontsize = textDict['fontsize'] * self.currScale
+
         if textDict['background'] != 'none':
             background = textDict['background'] 
         else:
@@ -1572,10 +2055,13 @@ class PsMapBufferedWindow(wx.Window):
             pdc.SetBackgroundMode(wx.TRANSPARENT)
         
         fn = self.parent.makePSFont(textDict)
-        
+
         pdc.SetFont(fn)
-        pdc.SetTextForeground(convertRGB(textDict['color']))        
-        pdc.DrawRotatedText(textDict['text'], coords[0], coords[1], rot)
+        pdc.SetTextForeground(convertRGB(textDict['color']))
+        if rot == 0:
+            pdc.DrawLabel(text=textDict['text'], rect=bounds)
+        else:
+            pdc.DrawRotatedText(textDict['text'], coords[0], coords[1], rot)
         
         pdc.SetIdBounds(drawId, wx.Rect(*bounds))
         self.Refresh()
@@ -1641,17 +2127,32 @@ class PsMapBufferedWindow(wx.Window):
     def RedrawSelectBox(self, id):
         """!Redraws select box when selected object changes its size"""
         if self.dragId == id:
-            rect = [self.pdcObj.GetIdBounds(id).Inflate(3,3)]
-            type = ['select']
-            ids = [self.idBoxTmp]
-            if self.instruction[id].type == 'map':
+            rect = self.pdcObj.GetIdBounds(id)
+            if self.instruction[id].type != 'line':
+                rect = rect.Inflate(3,3)
+            # draw select box around object
+            self.Draw(pen = self.pen['select'], brush = self.brush['select'], pdc = self.pdcTmp,
+                      drawid = self.idBoxTmp, pdctype = 'rect', bb = rect)
+            
+            # draw small marks signalizing resizing
+            if self.instruction[id].type in ('map', 'rectangle'):
                 controlP = self.pdcObj.GetIdBounds(id).GetBottomRight()
-                rect.append(wx.Rect(controlP.x, controlP.y, 10,10))
-                type.append('resize')
-                ids.append(self.idResizeBoxTmp)
-            for id, type, rect in zip(ids, type, rect):
-                self.Draw(pen = self.pen[type], brush = self.brush[type], pdc = self.pdcTmp,
-                          drawid = id, pdctype = 'rect', bb = rect)
+                rect  = wx.RectPS(controlP, self.resizeBoxSize)
+                self.Draw(pen = self.pen['resize'], brush = self.brush['resize'], pdc = self.pdcTmp,
+                          drawid = self.idResizeBoxTmp, pdctype = 'rect', bb = rect)
+
+            elif self.instruction[id].type == 'line':
+                p1Paper = self.instruction[id]['where'][0]
+                p2Paper = self.instruction[id]['where'][1]
+                p1Canvas = self.CanvasPaperCoordinates(rect = Rect2DPS(p1Paper, (0, 0)), canvasToPaper = False)[:2]
+                p2Canvas = self.CanvasPaperCoordinates(rect = Rect2DPS(p2Paper, (0, 0)), canvasToPaper = False)[:2]
+                rect = []
+                box = wx.RectS(self.resizeBoxSize)
+                rect.append(box.CenterIn(wx.RectPS(p1Canvas, wx.Size())))
+                rect.append(box.CenterIn(wx.RectPS(p2Canvas, wx.Size())))
+                for i, point in enumerate((p1Canvas, p2Canvas)):
+                    self.Draw(pen = self.pen['resize'], brush = self.brush['resize'], pdc = self.pdcTmp,
+                              drawid = self.idLinePointsTmp[i], pdctype = 'rect', bb = rect[i])
         
     def UpdateMapLabel(self):
         """!Updates map frame label"""
@@ -1672,12 +2173,21 @@ class PsMapBufferedWindow(wx.Window):
         if rasterId:
             rasterName = self.instruction[rasterId]['raster'].split('@')[0]
             
-        self.itemLabels['map'] = self.itemLabels['map'][0:1]
-        self.itemLabels['map'].append("raster: " + rasterName)
+        mapId = self.instruction.FindInstructionByType('map').id
+        self.itemLabels[mapId] = []
+        self.itemLabels[mapId].append(self.itemLabelsDict['map'])
+        self.itemLabels[mapId].append("raster: " + rasterName)
         if vectorId: 
             for map in self.instruction[vectorId]['list']:
-                self.itemLabels['map'].append('vector: ' + map[0].split('@')[0])
+                self.itemLabels[mapId].append('vector: ' + map[0].split('@')[0])
             
+    def UpdateLabel(self, itype, id):
+        self.itemLabels[id] = []
+        self.itemLabels[id].append(self.itemLabelsDict[itype])
+        if itype == 'image':
+            file = os.path.basename(self.instruction[id]['epsfile'])
+            self.itemLabels[id].append(file)
+        
     def OnSize(self, event):
         """!Init image size to match window size
         """
@@ -1703,9 +2213,13 @@ class PsMapBufferedWindow(wx.Window):
     def ScaleRect(self, rect, scale):
         """! Scale rectangle"""
         return wx.Rect(rect.GetLeft()*scale, rect.GetTop()*scale,
-                       rect.GetSize()[0]*scale, rect.GetSize()[1]*scale)   
-    
+                       rect.GetSize()[0]*scale, rect.GetSize()[1]*scale) 
+
+
 def main():
+    import gettext
+    gettext.install('grasswxpy', os.path.join(os.getenv("GISBASE"), 'locale'), unicode = True)
+    
     app = wx.PySimpleApp()
     wx.InitAllImageHandlers()
     frame = PsMapFrame()
diff --git a/gui/wxpython/psmap/instructions.py b/gui/wxpython/psmap/instructions.py
new file mode 100644
index 0000000..ed3d9c2
--- /dev/null
+++ b/gui/wxpython/psmap/instructions.py
@@ -0,0 +1,1816 @@
+"""!
+ at package psmap.instructions
+
+ at brief Map feature objects
+
+Classes:
+ - dialogs::Instruction
+ - dialogs::InstructionObject
+ - dialogs::InitMap
+ - dialogs::MapFrame
+ - dialogs::PageSetup
+ - dialogs::Mapinfo
+ - dialogs::Text
+ - dialogs::Image
+ - dialogs::NorthArrow
+ - dialogs::Point
+ - dialogs::Line
+ - dialogs::Rectangle
+ - dialogs::Scalebar
+ - dialogs::RasterLegend
+ - dialogs::VectorLegend
+ - dialogs::Raster
+ - dialogs::Vector
+ - dialogs::VProperties
+
+(C) 2011-2012 by Anna Kratochvilova, and the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Anna Kratochvilova <kratochanna gmail.com> (bachelor's project)
+ at author Martin Landa <landa.martin gmail.com> (mentor)
+"""
+
+import os
+import string
+from math import ceil
+from time import strftime, localtime
+
+import wx
+import grass.script as grass
+
+from core.gcmd          import RunCommand, GError, GMessage, GWarning
+from core.utils         import CmdToTuple, GetCmdString
+from dbmgr.vinfo        import VectorDBInfo
+from psmap.utils        import *
+
+class Instruction:
+    """!Class which represents instruction file"""
+    def __init__(self, parent, objectsToDraw):
+        
+        self.parent = parent
+        self.objectsToDraw = objectsToDraw
+        #here are kept objects like mapinfo, rasterlegend, etc.
+        self.instruction = list()
+        
+    def __str__(self):
+        """!Returns text for instruction file"""
+        comment = "# timestamp: " + strftime("%Y-%m-%d %H:%M", localtime()) + '\n'
+        env = grass.gisenv()
+        comment += "# location: %s\n" % env['LOCATION_NAME']
+        comment += "# mapset: %s\n" % env['MAPSET']
+        comment += "# page orientation: %s\n" % self.FindInstructionByType('page')['Orientation']
+        border = ''
+        if not self.FindInstructionByType('map'):
+            border = 'border n\n'
+        text = [str(each) for each in self.instruction]
+        return comment + border + '\n'.join(text) + '\nend'
+    
+    def __getitem__(self, id):
+        for each in self.instruction:
+            if each.id == id:
+                return each
+        return None
+
+    def __contains__(self, id):
+        """!Test if instruction is included"""
+        for each in self.instruction:
+            if each.id == id:
+                return True
+        return False
+    
+    def __delitem__(self, id):
+        """!Delete instruction"""
+        for each in self.instruction:
+            if each.id == id:
+                if each.type == 'map':
+                    #must remove raster, vector layers too
+                    vektor = self.FindInstructionByType('vector', list = True)
+                    vProperties = self.FindInstructionByType('vProperties', list = True)
+                    raster = self.FindInstructionByType('raster', list = True)
+                    for item in vektor + vProperties + raster:
+                        if item in self.instruction:
+                            self.instruction.remove(item)
+                            
+                self.instruction.remove(each)
+                if id in self.objectsToDraw:
+                    self.objectsToDraw.remove(id)
+                return
+            
+    def AddInstruction(self, instruction):
+        """!Add instruction"""
+        # add to instructions
+        if instruction.type == 'map':
+            self.instruction.insert(0, instruction)
+        else:
+            self.instruction.append(instruction)
+        # add to drawable objects
+        if instruction.type not in ('page', 'raster', 'vector', 'vProperties', 'initMap'):
+            if instruction.type == 'map':
+                self.objectsToDraw.insert(0, instruction.id) 
+            else:
+                self.objectsToDraw.append(instruction.id) 
+                
+            
+    def FindInstructionByType(self, type, list = False):
+        """!Find instruction(s) with the given type"""
+        inst = []
+        for each in self.instruction:
+            if each.type == type:
+                inst.append(each)
+        if len(inst) == 1 and not list:
+            return inst[0]
+        return inst
+    
+    def Read(self, filename):
+        """!Reads instruction file and creates instruction objects"""
+        self.filename = filename
+        # open file
+        try:
+            file = open(filename, 'r')
+        except IOError:
+            GError(message = _("Unable to open file\n%s") % filename)
+            return
+        # first read file to get information about region and scaletype
+        isRegionComment = False
+        orientation = 'Portrait'
+        for line in file:
+            if '# g.region' in line:
+                self.SetRegion(regionInstruction = line)
+                isRegionComment = True
+                break
+            if '# page orientation' in line:
+                orientation = line.split(':')[-1].strip()
+                
+        if not isRegionComment:
+            self.SetRegion(regionInstruction = None)
+        # then run ps.map -b to get information for maploc
+        # compute scale and center 
+        map = self.FindInstructionByType('map')
+        region = grass.region()
+        map['center'] = (region['n'] + region['s']) / 2, (region['w'] + region['e']) / 2
+        mapRect = GetMapBounds(self.filename, portrait = (orientation == 'Portrait'))
+        map['rect'] = mapRect
+        proj = projInfo()
+        toM = 1.0
+        if proj['units']:
+            toM = float(proj['meters'])
+        units = UnitConversion(self.parent)
+        w = units.convert(value = mapRect.Get()[2], fromUnit = 'inch', toUnit = 'meter') / toM
+        map['scale'] = w / abs((region['w'] - region['e']))
+        
+        SetResolution(dpi = 300, width = map['rect'].width, height = map['rect'].height)
+        
+        # read file again, now with information about map bounds
+        isBuffer = False
+        buffer = []
+        instruction = None
+        vectorMapNumber = 1
+        file.seek(0)
+        for line in file:
+            if not line.strip(): 
+                continue
+            line = line.strip()
+            if isBuffer:
+                buffer.append(line)
+                if 'end' in line:
+                    isBuffer = False
+                    kwargs = {}
+                    if instruction == 'scalebar':
+                        kwargs['scale'] = map['scale']
+                    elif instruction in ('text', 'eps', 'point', 'line', 'rectangle'):
+                        kwargs['mapInstruction'] = map
+                    elif instruction in ('vpoints', 'vlines', 'vareas'):
+                        kwargs['id'] = wx.NewId()
+                        kwargs['vectorMapNumber'] = vectorMapNumber
+                        vectorMapNumber += 1
+                    elif instruction == 'paper':
+                        kwargs['Orientation'] = orientation
+                        
+                    ok = self.SendToRead(instruction, buffer, **kwargs)
+                    if not ok: return False
+                    buffer = []
+                continue 
+            
+            elif line.startswith('paper'):
+                instruction = 'paper'
+                isBuffer = True
+                buffer.append(line)
+            
+            elif line.startswith('border'):
+                if line.split()[1].lower() in ('n', 'no', 'none'):
+                    ok = self.SendToRead('border', [line])
+                    if not ok: return False
+                elif line.split()[1].lower() in ('y', 'yes'):
+                    instruction = 'border'
+                    isBuffer = True
+                    buffer.append(line)
+            
+            elif line.startswith('scale '):
+                if isBuffer:
+                    continue
+                ok = self.SendToRead('scale', line, isRegionComment = isRegionComment)
+                if not ok: return False
+            
+            elif line.startswith('maploc'):
+                ok = self.SendToRead(instruction = 'maploc', text = line)
+                if not ok: return False
+                
+            elif line.startswith('raster'):
+                ok = self.SendToRead(instruction = 'raster', text = line)
+                if not ok: return False
+            
+            elif line.startswith('mapinfo'):
+                instruction = 'mapinfo'
+                isBuffer = True
+                buffer.append(line)
+
+
+            elif line.startswith('scalebar'):
+                instruction = 'scalebar'
+                isBuffer = True
+                buffer.append(line) 
+            
+            elif line.startswith('text'):
+                instruction = 'text'
+                isBuffer = True
+                buffer.append(line)
+                
+            elif line.startswith('eps'):
+                instruction = 'eps'
+                isBuffer = True
+                buffer.append(line)
+
+            elif line.startswith('point'):
+                instruction = 'point'
+                isBuffer = True
+                buffer.append(line)
+
+            elif line.startswith('line'):
+                instruction = 'line'
+                isBuffer = True
+                buffer.append(line)
+
+            elif line.startswith('rectangle'):
+                instruction = 'rectangle'
+                isBuffer = True
+                buffer.append(line) 
+            
+            elif line.startswith('colortable'):
+                if len(line.split()) == 2 and line.split()[1].lower() in ('n', 'no', 'none'):
+                    break
+                instruction = 'colortable'
+                isBuffer = True
+                buffer.append(line) 
+        
+            elif line.startswith('vlegend'):
+                instruction = 'vlegend'
+                isBuffer = True
+                buffer.append(line) 
+                
+            elif line.startswith('vpoints'):
+                instruction = 'vpoints'
+                isBuffer = True
+                buffer.append(line) 
+                
+            elif line.startswith('vlines'):
+                instruction = 'vlines'
+                isBuffer = True
+                buffer.append(line)
+                
+            elif line.startswith('vareas'):
+                instruction = 'vareas'
+                isBuffer = True
+                buffer.append(line)
+
+
+        
+        rasterLegend = self.FindInstructionByType('rasterLegend')
+        raster = self.FindInstructionByType('raster')
+        page = self.FindInstructionByType('page')
+        vector = self.FindInstructionByType('vector')
+        vectorLegend = self.FindInstructionByType('vectorLegend')
+        vectorMaps = self.FindInstructionByType('vProperties', list = True)
+
+        # check (in case of scaletype 0) if map is drawn also
+        map['drawMap'] = False
+        if map['scaleType'] == 0:
+            mapForRegion = map['map']
+            if map['mapType'] == 'raster' and raster:
+                if mapForRegion == raster['raster']:
+                    map['drawMap'] = True
+            elif map['mapType'] == 'vector' and vector:
+                for vmap in vector['list']:
+                    if mapForRegion == vmap[0]:
+                        map['drawMap'] = True
+
+        # rasterLegend
+        if rasterLegend:
+            if rasterLegend['rasterDefault'] and raster:
+                rasterLegend['raster'] = raster['raster']
+                if not rasterLegend['discrete']:
+                    rasterType = getRasterType(map = rasterLegend['raster'])
+                    if rasterType == 'CELL':
+                        rasterLegend['discrete'] = 'y'
+                    else:
+                        rasterLegend['discrete'] = 'n'
+            
+            #estimate size
+            height = rasterLegend.EstimateHeight(raster = rasterLegend['raster'], discrete = rasterLegend['discrete'], 
+                                                 fontsize = rasterLegend['fontsize'],
+                                                 cols = rasterLegend['cols'], 
+                                                 height = rasterLegend['height'])
+            width = rasterLegend.EstimateWidth(raster = rasterLegend['raster'], discrete = rasterLegend['discrete'], 
+                                               fontsize = rasterLegend['fontsize'],
+                                               cols = rasterLegend['cols'] , 
+                                               width = rasterLegend['width'],
+                                               paperInstr = page)
+            rasterLegend['rect'] = Rect2D(x = float(rasterLegend['where'][0]), y = float(rasterLegend['where'][1]),
+                                          width = width, height = height)
+            
+        # vectors, vlegend        
+        
+        if vector:
+            for vmap in vectorMaps:
+                for i, each in enumerate(vector['list']):
+                    if each[2] == vmap.id:
+                        
+                        vector['list'][i][4] = vmap['label']
+                        vector['list'][i][3] = vmap['lpos']
+            if vectorLegend:
+                size = vectorLegend.EstimateSize(vectorInstr = vector, fontsize = vectorLegend['fontsize'],
+                                                 width = vectorLegend['width'], cols = vectorLegend['cols'])                            
+                vectorLegend['rect'] = Rect2D(x = float(vectorLegend['where'][0]), y = float(vectorLegend['where'][1]),
+                                              width = size[0], height = size[1])
+        
+        
+        page = self.FindInstructionByType('page')
+        if not page:
+            page = PageSetup(wx.NewId())
+            self.AddInstruction(page)
+        else:
+            page['Orientation'] = orientation
+
+
+        #
+        return True
+    
+    def SendToRead(self, instruction, text, **kwargs):
+        psmapInstrDict = dict(paper = ['page'],
+                              maploc = ['map'],
+                              scale = ['map'],
+                              border = ['map'],
+                              raster = ['raster'],
+                              mapinfo = ['mapinfo'],
+                              scalebar = ['scalebar'],
+                              text = ['text'],
+                              eps = ['image', 'northArrow'],
+                              point = ['point'],
+                              line = ['line'],
+                              rectangle = ['rectangle'],
+                              vpoints = ['vector', 'vProperties'],
+                              vlines = ['vector', 'vProperties'],
+                              vareas = ['vector', 'vProperties'],
+                              colortable = ['rasterLegend'],
+                              vlegend = ['vectorLegend']
+                              )
+        
+        myInstrDict = dict(page = PageSetup,
+                           map = MapFrame,
+                           raster = Raster,
+                           mapinfo = Mapinfo,
+                           scalebar = Scalebar,
+                           text = Text,
+                           image = Image,
+                           northArrow = NorthArrow,
+                           point = Point,
+                           line = Line,
+                           rectangle = Rectangle,
+                           rasterLegend = RasterLegend,
+                           vectorLegend = VectorLegend,
+                           vector = Vector,
+                           vProperties = VProperties
+                           )
+        
+        myInstruction = psmapInstrDict[instruction]
+        
+        for i in myInstruction:
+            instr = self.FindInstructionByType(i)
+            if i in ('text', 'vProperties', 'image', 'northArrow', 'point', 'line', 'rectangle') or not instr:
+                
+                id = wx.NewId() #!vProperties expect subtype
+                if i == 'vProperties':
+                    id = kwargs['id']
+                    newInstr = myInstrDict[i](id, subType = instruction[1:])
+                elif i in ('image', 'northArrow'):
+                    commentFound = False
+                    for line in text:
+                        if line.find("# north arrow") >= 0:
+                            commentFound = True
+                    if i == 'image' and commentFound or \
+                       i == 'northArrow' and not commentFound:
+                        continue
+                    newInstr = myInstrDict[i](id, settings = self)
+                else:
+                    newInstr = myInstrDict[i](id)
+                ok = newInstr.Read(instruction, text, **kwargs)
+                if ok:
+                    self.AddInstruction(newInstr)
+                else:
+                    return False
+
+            else:
+                ok = instr.Read(instruction, text, **kwargs)
+
+                if not ok:
+                    return False
+        return True
+    
+    def SetRegion(self, regionInstruction):
+        """!Sets region from file comment or sets current region in case of no comment"""
+        map = MapFrame(wx.NewId())
+        self.AddInstruction(map)
+        if regionInstruction:
+            cmd = CmdToTuple(regionInstruction.strip('# ').split())
+            
+            # define scaleType
+            if len(cmd[1]) <= 3:
+                if 'rast' in cmd[1]:
+                    map['scaleType'] = 0
+                    map['mapType'] = 'raster'   
+                    map['map'] = cmd[1]['rast']  
+                elif 'vect' in cmd[1]:
+                    map['scaleType'] = 0
+                    map['mapType'] = 'vector' 
+                    map['map'] = cmd[1]['vect']  
+                elif 'region' in cmd[1]:
+                    map['scaleType'] = 1  
+                    map['region'] = cmd[1]['region']
+                    
+            else:
+                map['scaleType'] = 2  
+        else:
+            map['scaleType'] = 2
+            grass.del_temp_region()
+            region = grass.region()
+            grass.use_temp_region()    
+            cmd = ['g.region', region]
+        cmdString = GetCmdString(cmd).replace('g.region', '')
+        GMessage(_("Instruction file will be loaded with following region: %s\n") % cmdString)
+        try:
+            RunCommand(cmd[0], **cmd[1])
+            
+        except grass.ScriptError, e:
+            GError(_("Region cannot be set\n%s") % e)
+            return False
+        
+
+class InstructionObject:
+    """!Abtract class representing single instruction"""
+    def __init__(self, id): 
+        self.id = id
+        
+        # default values
+        self.defaultInstruction = dict()
+        # current values
+        self.instruction = self.defaultInstruction   
+        # converting units
+        self.unitConv = UnitConversion() 
+    
+    def __str__(self):
+        """!Returns particular part of text instruction"""
+        return ''
+    
+    def __getitem__(self, key):
+        for each in self.instruction.keys():
+            if each == key:
+                return self.instruction[key]
+        return None
+    
+    def __setitem__(self, key, value):
+        self.instruction[key] = value
+    
+    def GetInstruction(self):
+        """!Get current values"""
+        return self.instruction
+    
+    def SetInstruction(self, instruction):
+        """!Set default values"""
+        self.instruction = instruction
+        
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save them"""
+        pass
+        
+    def PercentToReal(self, e, n):
+        """!Converts text coordinates from percent of region to map coordinates"""
+        e, n = float(e.strip('%')), float(n.strip('%'))
+        region = grass.region()
+        N = region['s'] + (region['n'] - region['s']) / 100 * n
+        E = region['w'] + (region['e'] - region['w']) / 100 * e
+        return E, N
+
+class InitMap(InstructionObject):
+    """!Class representing virtual map"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'initMap'
+        
+        # default values
+        self.defaultInstruction = dict(rect = None, scale =  None)
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    
+class MapFrame(InstructionObject):
+    """!Class representing map (instructions maploc, scale, border)"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'map'
+        # default values
+        self.defaultInstruction = dict(map = None, mapType = None, drawMap = True, region = None,
+                                       rect = Rect2D(), scaleType = 0, scale = None, center = None,
+                                       resolution = 300, border = 'y', width = 1, color = '0:0:0') 
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        instr = ''
+        comment = ''
+        
+        #region settings
+        region = grass.region()
+        if self.instruction['scaleType'] == 0: #match map
+            map = self.instruction['map']
+            if self.instruction['mapType'] == 'raster':
+                comment = "# g.region rast=%s nsres=%s ewres=%s\n" % (map, region['nsres'], region['ewres'])
+            else:
+                comment = "# g.region vect=%s\n" % (map)
+        elif self.instruction['scaleType'] == 1:# saved region
+            region = self.instruction['region']
+            comment = "# g.region region=%s\n" % region
+        elif self.instruction['scaleType'] in (2, 3): #current region, fixed scale
+            comment = string.Template("# g.region n=$n s=$s e=$e w=$w rows=$rows cols=$cols \n").substitute(**region)
+        
+        instr += comment
+        instr += '\n'
+        # maploc
+        maplocInstruction = "maploc %.3f %.3f" % (self.instruction['rect'].x, self.instruction['rect'].y)
+        if self.instruction['scaleType'] != 3:
+            maplocInstruction += "  %.3f %.3f"% (self.instruction['rect'].width, self.instruction['rect'].height)
+        instr += maplocInstruction
+        instr += '\n'
+        
+        # scale
+        if self.instruction['scaleType'] == 3: #fixed scale
+            scaleInstruction = "scale 1:%.0f" % (1/self.instruction['scale'])
+            instr += scaleInstruction
+            instr += '\n'
+        # border
+        borderInstruction = ''
+        if self.instruction['border'] == 'n':
+            borderInstruction = "border n"
+        else:
+            borderInstruction = "border y\n"
+            borderInstruction += string.Template("    width $width\n    color $color\n").substitute(self.instruction)
+            borderInstruction += "    end"
+        instr += borderInstruction
+        instr += '\n'
+
+        return instr  
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        if 'isRegionComment' in kwargs:
+            isRegionComment = kwargs['isRegionComment']
+        instr = {}
+        
+        if instruction == 'border':
+            for line in text:
+                if line.startswith('end'):
+                    break
+                try:
+                    if line.split()[1].lower() in ('n', 'no', 'none'):
+                        instr['border'] = 'n'
+                        break
+                    elif line.split()[1].lower() in ('y', 'yes'):
+                        instr['border'] = 'y'
+                    elif line.startswith('width'):
+                        instr['width'] = line.split()[1]
+                    elif line.startswith('color'):
+                        instr['color'] = line.split()[1]
+                except IndexError:
+                    GError(_("Failed to read instruction %s") % instruction)
+                    return False
+                
+        elif instruction == 'scale':
+            try:
+                scaleText = text.strip('scale ').split(':')[1]
+                # when scale instruction given and region comment also, then scaletype is fixed scale
+                if not isRegionComment:
+                    instr['scaleType'] = 2 
+                else:
+                    instr['scaleType'] = 3
+
+                scale = 1/float(scaleText)
+                if abs(scale - self.instruction['scale']) > (0.01 * scale):
+                    GWarning(_("Scale has changed, old value: %(old)s\nnew value: %(new)s") % \
+                                 { 'old' : scale, 'new' : self.instruction['scale'] })
+            except (ValueError, IndexError):
+                GError(_("Failed to read instruction %s.\nUse 1:25000 notation.") % instruction)
+                return False
+        
+        elif instruction == 'maploc':
+            maploc = text.strip('maploc ').split()
+            if len(maploc) >= 2:
+                if  abs(self.instruction['rect'].Get()[0] - float(maploc[0])) > 0.5 or \
+                        abs(self.instruction['rect'].Get()[1] - float(maploc[1])) > 0.5:
+                    GWarning(_("Map frame position changed, old value: %(old1)s %(old2)s\nnew value: %(new1)s %(new2)s") % \
+                                 { 'old1' : maploc[0], 'old2' : maploc[1],
+                                   'new1' : self.instruction['rect'].Get()[0], 'new2' : self.instruction['rect'].Get()[1] })
+                    
+                #instr['rect'] = wx.Rect2D(float(maploc[0]), float(maploc[1]), self.instruction['rect'][2], self.instruction['rect'][3])
+            if len(maploc) == 4:
+                if  abs(self.instruction['rect'].Get()[2] - float(maploc[2])) > 0.5 or \
+                        abs(self.instruction['rect'].Get()[3] - float(maploc[3])) > 0.5:
+                    GWarning(_("Map frame size changed, old value: %(old1)s %(old2)s\nnew value: %(new1)s %(new2)s") % \
+                                 { 'old1' : maploc[2], 'old2' : maploc[3],
+                                   'new1' : self.instruction['rect'].Get()[2], 'new2' : self.instruction['rect'].Get()[3] })
+                #instr['rect'] = wx.Rect2D(*map(float, maploc))
+        self.instruction.update(instr)   
+        return True 
+    
+class PageSetup(InstructionObject):
+    """!Class representing page instruction"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'page'
+        # default values
+        self.defaultInstruction = dict(Units = 'inch', Format = 'a4', Orientation = 'Portrait',
+                                       Width = 8.268, Height = 11.693, Left = 0.5, Right = 0.5, Top = 1, Bottom = 1)
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        if self.instruction['Format'] == 'custom':
+            instr = string.Template("paper\n    width $Width\n    height $Height\n").substitute(self.instruction)
+        else:
+            instr = string.Template("paper $Format\n").substitute(self.instruction)
+        instr += string.Template("    left $Left\n    right $Right\n    bottom $Bottom\n    top $Top\n    end").substitute(self.instruction)
+
+        return instr
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        instr = {}
+        self.cats = ['Width', 'Height', 'Left', 'Right', 'Top', 'Bottom']
+        self.subInstr = dict(zip(['width', 'height', 'left', 'right', 'top', 'bottom'], self.cats))
+        
+        if instruction == 'paper': # just for sure
+            for line in text:
+                if line.startswith('paper'): 
+                    if len(line.split()) > 1:
+                        pformat = line.split()[1]
+                        availableFormats = self._toDict(grass.read_command('ps.map', flags = 'p',
+                                                                           quiet = True))
+                        # e.g. paper a3 
+                        try:
+                            instr['Format'] = pformat
+                            for key, value in availableFormats[pformat].iteritems():
+                                instr[key] = float(value)
+                            break
+                        except KeyError:
+                            GError(_("Failed to read instruction %(file)s.\nUnknown format %(for)s") % \
+                                       { 'file' : instruction, 'for' : format })
+                            return False
+                    else:
+                        # paper
+                        # width ...
+                        instr['Format'] = 'custom'
+                # read subinstructions
+                elif instr['Format'] == 'custom' and not line.startswith('end'):
+                    text = line.split()
+                    try:
+                        instr[self.subInstr[text[0]]] = float(text[1])
+                    except  (IndexError, KeyError):
+                        GError(_("Failed to read instruction %s.") % instruction)
+                        return False
+                    
+            if 'Orientation' in kwargs and kwargs['Orientation'] == 'Landscape':
+                instr['Width'], instr['Height'] = instr['Height'], instr['Width']
+                
+            self.instruction.update(instr)
+        return True  
+    
+    def _toDict(self, paperStr):    
+        sizeDict = dict()
+#     cats = self.subInstr[ 'Width', 'Height', 'Left', 'Right', 'Top', 'Bottom']
+        for line in paperStr.strip().split('\n'):
+            d = dict(zip(self.cats, line.split()[1:]))
+            sizeDict[line.split()[0]] = d
+            
+        return sizeDict    
+    
+class Mapinfo(InstructionObject):
+    """!Class representing mapinfo instruction"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'mapinfo'
+        # default values
+        self.defaultInstruction = dict(unit = 'inch', where = (0, 0),
+                                       font = 'Helvetica', fontsize = 10, color = '0:0:0', background = 'none', 
+                                       border = 'none', rect = None)
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        instr = "mapinfo\n"
+        instr += "    where %.3f %.3f\n" % (self.instruction['where'][0], self.instruction['where'][1])
+        instr += string.Template("    font $font\n    fontsize $fontsize\n    color $color\n").substitute(self.instruction)            
+        instr += string.Template("    background $background\n    border $border\n").substitute(self.instruction)  
+        instr += "    end"
+        return instr
+    
+    def Read(self, instruction, text):
+        """!Read instruction and save information"""
+        instr = {}
+        try:
+            for line in text:
+                sub = line.split(None,1)
+                if sub[0] == 'font':
+                    instr['font'] = sub[1]
+                elif sub[0] == 'fontsize':
+                    instr['fontsize'] = int(sub[1])
+                elif sub[0] == 'color':
+                    instr['color'] = sub[1]
+                elif sub[0] == 'background':
+                    instr['background'] = sub[1]
+                elif sub[0] == 'border':
+                    instr['border'] = sub[1]
+                elif sub[0] == 'where':
+                    instr['where'] = float(sub[1].split()[0]), float(sub[1].split()[1])
+        except (ValueError, IndexError):
+            GError(_("Failed to read instruction %s") % instruction)
+            return False
+        self.instruction.update(instr)
+        self.instruction['rect'] = self.EstimateRect(mapinfoDict = self.instruction)
+        return True
+    
+    def EstimateRect(self, mapinfoDict):
+        """!Estimate size to draw mapinfo"""
+        w = mapinfoDict['fontsize'] * 20 # any better estimation? 
+        h = mapinfoDict['fontsize'] * 7
+        width = self.unitConv.convert(value = w, fromUnit = 'point', toUnit = 'inch')
+        height = self.unitConv.convert(value = h, fromUnit = 'point', toUnit = 'inch')
+        return Rect2D(x = float(mapinfoDict['where'][0]), y = float(mapinfoDict['where'][1]),
+                      width = width, height = height)
+    
+class Text(InstructionObject):
+    """!Class representing text instruction"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'text'
+        # default values
+        self.defaultInstruction = dict(text = "", font = "Helvetica", fontsize = 10, color = 'black', background = 'none',
+                                       hcolor = 'none', hwidth = 1, border = 'none', width = '1', XY = True,
+                                       where = (0,0), unit = 'inch', rotate = None, 
+                                       ref = "center center", xoffset = 0, yoffset = 0, east = None, north = None)
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        text = self.instruction['text'].replace('\n','\\n')
+        instr = u"text %s %s" % (self.instruction['east'], self.instruction['north'])
+        instr += " %s\n" % text
+        instr += (string.Template("    font $font\n    fontsize $fontsize\n    color $color\n").
+                                                                   substitute(self.instruction))
+        instr += string.Template("    hcolor $hcolor\n").substitute(self.instruction)
+        if self.instruction['hcolor'] != 'none':
+            instr += string.Template("    hwidth $hwidth\n").substitute(self.instruction)
+        instr += string.Template("    border $border\n").substitute(self.instruction)
+        if self.instruction['border'] != 'none':
+            instr += string.Template("    width $width\n").substitute(self.instruction)
+        instr += string.Template("    background $background\n").substitute(self.instruction)
+        if self.instruction["ref"] != '0':
+            instr += string.Template("    ref $ref\n").substitute(self.instruction)
+        if self.instruction["rotate"]:
+            instr += string.Template("    rotate $rotate\n").substitute(self.instruction)
+        if float(self.instruction["xoffset"]) or float(self.instruction["yoffset"]):
+            instr += (string.Template("    xoffset $xoffset\n    yoffset $yoffset\n").
+                                                            substitute(self.instruction))
+        instr += "    end"
+        try:
+            instr = instr.encode('latin1')
+        except UnicodeEncodeError, err:
+            try:
+                pos = str(err).split('position')[1].split(':')[0].strip()
+            except IndexError:
+                pos = ''
+            if pos:
+                message = _("Characters on position %s are not supported "
+                            "by ISO-8859-1 (Latin 1) encoding "
+                            "which is required by module ps.map.") % pos
+            else:
+                message = _("Not all characters are supported "
+                            "by ISO-8859-1 (Latin 1) encoding "
+                            "which is required by module ps.map.")
+            GMessage(message = message)
+            return ''
+        
+        return instr
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        map = kwargs['mapInstruction']
+        instr = {}
+        for line in text:
+            try:
+                sub = line.split(None, 1)[0]
+                if sub == 'text':
+                    e, n = line.split(None, 3)[1:3]
+                    if '%' in e and '%' in n:
+                        instr['XY'] = True
+                        instr['east'], instr['north'] = self.PercentToReal(e, n)
+                    else:
+                        instr['XY'] = False
+                        instr['east'], instr['north'] = float(e), float(n)
+                        
+                    instr['text'] = line.split(None, 3)[3].decode('latin_1')
+                
+                elif sub == 'font':
+                    instr['font'] = line.split(None, 1)[1]
+                elif sub == 'fontsize':
+                    instr['fontsize'] = float(line.split(None, 1)[1])
+                elif sub == 'color':
+                    instr['color'] = line.split(None, 1)[1]
+                elif sub == 'width':
+                    instr['width'] = line.split(None, 1)[1]
+                elif sub == 'hcolor':
+                    instr['hcolor'] = line.split(None, 1)[1]
+                elif sub == 'hwidth':
+                    instr['hwidth'] = line.split(None, 1)[1]
+                elif sub == 'background':
+                    instr['background'] = line.split(None, 1)[1]
+                elif sub == 'border':
+                    instr['border'] = line.split(None, 1)[1]
+                elif sub == 'ref':
+                    instr['ref'] = line.split(None, 1)[1]
+                elif sub == 'rotate':
+                    instr['rotate'] = float(line.split(None, 1)[1])
+                elif sub == 'xoffset':
+                    instr['xoffset'] = int(line.split(None, 1)[1])
+                elif sub == 'yoffset':
+                    instr['yoffset'] = int(line.split(None, 1)[1])
+                elif sub == 'opaque':
+                    if line.split(None, 1)[1].lower() in ('n', 'none'):
+                        instr['background'] = 'none'
+                        
+            except(IndexError, ValueError):
+                GError(_("Failed to read instruction %s") % instruction)
+                return False
+        instr['where'] = PaperMapCoordinates(mapInstr = map, x = instr['east'], y = instr['north'], paperToMap = False)       
+        self.instruction.update(instr)
+
+        return True 
+        
+class Image(InstructionObject):
+    """!Class representing eps instruction - image"""
+    def __init__(self, id, settings):
+        InstructionObject.__init__(self, id = id)
+        self.settings = settings
+        self.type = 'image'
+        # default values
+        self.defaultInstruction = dict(epsfile = "", XY = True, where = (0,0), unit = 'inch',
+                                       east = None, north = None,
+                                       rotate = None, scale = 1)
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        self.ChangeRefPoint(toCenter = True)
+        epsfile = self.instruction['epsfile'].replace(os.getenv('GISBASE'), "$GISBASE")
+        
+        instr = "eps %s %s\n" % (self.instruction['east'], self.instruction['north'])
+        instr += "    epsfile %s\n" % epsfile
+        if self.instruction["rotate"]:
+            instr += string.Template("    rotate $rotate\n").substitute(self.instruction)
+        if self.instruction["scale"]:
+            instr += string.Template("    scale $scale\n").substitute(self.instruction)
+        instr += "    end"
+        return instr
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        mapInstr = kwargs['mapInstruction']
+        instr = {}
+        for line in text:
+            try:
+                sub = line.split(None, 1)[0]
+                if sub == 'eps':
+                    e, n = line.split(None, 3)[1:3]
+                    if '%' in e and '%' in n:
+                        instr['XY'] = True
+                        instr['east'], instr['north'] = self.PercentToReal(e, n)
+                    else:
+                        instr['XY'] = False
+                        instr['east'], instr['north'] = float(e), float(n)
+                
+                elif sub == 'epsfile':
+                    epsfile = line.split(None, 1)[1]
+                    instr['epsfile'] = epsfile.replace("$GISBASE", os.getenv("GISBASE"))
+                elif sub == 'rotate':
+                    instr['rotate'] = float(line.split(None, 1)[1])
+                elif sub == 'scale':
+                    instr['scale'] = float(line.split(None, 1)[1])
+                        
+            except(IndexError, ValueError):
+                GError(_("Failed to read instruction %s") % instruction)
+                return False
+        if not os.path.exists(instr['epsfile']):
+            GError(_("Failed to read instruction %(inst)s: "
+                     "file %(file)s not found.") % { 'inst' : instruction,
+                                                     'file' : instr['epsfile'] })
+            return False
+        
+        instr['epsfile'] = os.path.abspath(instr['epsfile'])
+        instr['size'] = self.GetImageOrigSize(instr['epsfile'])
+        if 'rotate' in instr:
+            instr['size'] = BBoxAfterRotation(instr['size'][0], instr['size'][1], instr['rotate'])
+        self.instruction.update(instr)
+        self.ChangeRefPoint(toCenter = False)
+        instr['where'] = PaperMapCoordinates(mapInstr = mapInstr, x = self.instruction['east'],
+                                             y = self.instruction['north'], paperToMap = False)       
+        w = self.unitConv.convert(value = instr['size'][0], fromUnit = 'point', toUnit = 'inch')
+        h = self.unitConv.convert(value = instr['size'][1], fromUnit = 'point', toUnit = 'inch')
+        instr['rect'] = Rect2D(x = float(instr['where'][0]), y = float(instr['where'][1]),
+                               width = w * self.instruction['scale'], height = h * self.instruction['scale'])
+        self.instruction.update(instr)
+
+        return True 
+        
+    def ChangeRefPoint(self, toCenter):
+        """!Change reference point (left top x center)"""
+        mapInstr = self.settings.FindInstructionByType('map')
+        if not mapInstr:
+            mapInstr = self.settings.FindInstructionByType('initMap')
+        mapId = mapInstr.id
+        if toCenter:
+            center = self.instruction['rect'].GetCentre()
+            ENCenter = PaperMapCoordinates(mapInstr = self.settings[mapId],
+                                           x = center[0], y = center[1], paperToMap = True)
+                                           
+            self.instruction['east'], self.instruction['north'] = ENCenter
+        else:
+            x, y = PaperMapCoordinates(mapInstr = self.settings[mapId], x = self.instruction['east'],
+                                       y = self.instruction['north'], paperToMap = False)
+            w = self.unitConv.convert(value = self.instruction['size'][0], fromUnit = 'point', toUnit = 'inch')
+            h = self.unitConv.convert(value = self.instruction['size'][1], fromUnit = 'point', toUnit = 'inch')
+            x -= w * self.instruction['scale'] / 2
+            y -= h * self.instruction['scale'] / 2
+            e, n = PaperMapCoordinates(mapInstr = self.settings[mapId], x = x, y = y, paperToMap = True)
+            self.instruction['east'], self.instruction['north'] = e, n
+
+    def GetImageOrigSize(self, imagePath):
+        """!Get image size.
+        
+        If eps, size is read from image header.
+        """
+        fileName = os.path.split(imagePath)[1]
+        # if eps, read info from header
+        if os.path.splitext(fileName)[1].lower() == '.eps':
+            bbInfo = "%%BoundingBox"
+            file = open(imagePath,"r")
+            w = h = 0
+            while file:
+                line = file.readline()
+                if line.find(bbInfo) == 0:
+                    w, h = line.split()[3:5]
+                    break
+            file.close()
+            return float(w), float(h)
+        else: # we can use wx.Image
+            img = wx.Image(fileName, type=wx.BITMAP_TYPE_ANY)
+            return img.GetWidth(), img.GetHeight()
+            
+class NorthArrow(Image):
+    """!Class representing eps instruction -- North Arrow"""
+    def __init__(self, id, settings):
+        Image.__init__(self, id = id, settings = settings)
+        self.type = 'northArrow'
+        
+    def __str__(self):
+        self.ChangeRefPoint(toCenter = True)
+        epsfile = self.instruction['epsfile'].replace(os.getenv('GISBASE'), "$GISBASE")
+
+        instr = "eps %s %s\n" % (self.instruction['east'], self.instruction['north'])
+        instr += "# north arrow\n"
+        instr += "    epsfile %s\n" % epsfile
+        if self.instruction["rotate"]:
+            instr += string.Template("    rotate $rotate\n").substitute(self.instruction)
+        if self.instruction["scale"]:
+            instr += string.Template("    scale $scale\n").substitute(self.instruction)
+        instr += "    end"
+        return instr
+        
+class Point(InstructionObject):
+    """!Class representing point instruction"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'point'
+        # default values
+        self.defaultInstruction = dict(symbol = os.path.join('basic', 'x'),
+                                       color = '0:0:0', fcolor = '200:200:200',
+                                       rotate = 0, size = 10,
+                                       XY = True, where = (0,0), unit = 'inch',
+                                       east = None, north = None)
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        instr = string.Template("point $east $north\n").substitute(self.instruction)
+        instr += string.Template("    symbol $symbol\n").substitute(self.instruction)
+        instr += string.Template("    color $color\n").substitute(self.instruction)
+        instr += string.Template("    fcolor $fcolor\n").substitute(self.instruction)
+        instr += string.Template("    rotate $rotate\n").substitute(self.instruction)
+        instr += string.Template("    size $size\n").substitute(self.instruction)
+        instr += "    end"
+        return instr
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        mapInstr = kwargs['mapInstruction']
+        instr = {}
+        for line in text:
+            try:
+                sub = line.split(None, 1)[0]
+                if sub == 'point':
+                    e, n = line.split(None, 3)[1:3]
+                    if '%' in e and '%' in n:
+                        instr['XY'] = True
+                        instr['east'], instr['north'] = self.PercentToReal(e, n)
+                    else:
+                        instr['XY'] = False
+                        instr['east'], instr['north'] = float(e), float(n)
+                
+                elif sub == 'symbol':
+                    instr['symbol'] = line.split(None, 1)[1]
+                elif sub == 'rotate':
+                    instr['rotate'] = float(line.split(None, 1)[1])
+                elif sub == 'size':
+                    instr['size'] = float(line.split(None, 1)[1])
+                elif sub == 'color':
+                    instr['color'] = line.split(None, 1)[1]
+                elif sub == 'fcolor':
+                    instr['fcolor'] = line.split(None, 1)[1]
+
+                        
+            except(IndexError, ValueError):
+                GError(_("Failed to read instruction %s") % instruction)
+                return False
+        
+        self.instruction.update(instr)
+        instr['where'] = PaperMapCoordinates(mapInstr = mapInstr, x = self.instruction['east'],
+                                             y = self.instruction['north'], paperToMap = False)
+        w = h = self.unitConv.convert(value = instr['size'], fromUnit = 'point', toUnit = 'inch')
+        instr['rect'] = Rect2D(x = float(instr['where'][0]) - w / 2, y = float(instr['where'][1] - h / 2),
+                               width = w, height = h)
+        self.instruction.update(instr)
+
+        return True
+
+class Line(InstructionObject):
+    """!Class representing line instruction"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'line'
+        # default values
+        self.defaultInstruction = dict(color = '0:0:0', width = 2,
+                                       where = [wx.Point2D(), wx.Point2D()],
+                                       east1 = None, north1 = None,
+                                       east2 = None, north2 = None)
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        instr = string.Template("line $east1 $north1 $east2 $north2\n").substitute(self.instruction)
+        instr += string.Template("    color $color\n").substitute(self.instruction)
+        instr += string.Template("    width $width\n").substitute(self.instruction)
+        instr += "    end\n"
+        return instr
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        mapInstr = kwargs['mapInstruction']
+        instr = {}
+        for line in text:
+            try:
+                sub = line.split(None, 1)[0]
+                if sub == 'line':
+                    e1, n1, e2, n2 = line.split(None, 5)[1:5]
+                    if '%' in e1 and '%' in n1 and '%' in e2 and '%' in n2:
+                        instr['east1'], instr['north1'] = self.PercentToReal(e1, n1)
+                        instr['east2'], instr['north2'] = self.PercentToReal(e2, n2)
+                    else:
+                        instr['east1'], instr['north1'] = float(e1), float(n1)
+                        instr['east2'], instr['north2'] = float(e2), float(n2)
+                
+                elif sub == 'width':
+                    instr['width'] = float(line.split(None, 1)[1])
+                elif sub == 'color':
+                    instr['color'] = line.split(None, 1)[1]
+                        
+            except(IndexError, ValueError):
+                GError(_("Failed to read instruction %s") % instruction)
+                return False
+        
+        self.instruction.update(instr)
+        e1, n1 = PaperMapCoordinates(mapInstr = mapInstr, x = self.instruction['east1'],
+                                     y = self.instruction['north1'], paperToMap = False)
+        e2, n2 = PaperMapCoordinates(mapInstr = mapInstr, x = self.instruction['east2'],
+                                     y = self.instruction['north2'], paperToMap = False)
+        instr['where'] = [wx.Point2D(e1, n1), wx.Point2D(e2, n2)]
+        instr['rect'] = Rect2DPP(instr['where'][0], instr['where'][1])
+        self.instruction.update(instr)
+
+        return True
+
+class Rectangle(InstructionObject):
+    """!Class representing rectangle instruction"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'rectangle'
+        # default values
+        self.defaultInstruction = dict(color = '0:0:0', fcolor = 'none', width = 2,
+                                       east1 = None, north1 = None,
+                                       east2 = None, north2 = None)
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        instr = string.Template("rectangle $east1 $north1 $east2 $north2\n").substitute(self.instruction)
+        instr += string.Template("    color $color\n").substitute(self.instruction)
+        instr += string.Template("    fcolor $fcolor\n").substitute(self.instruction)
+        instr += string.Template("    width $width\n").substitute(self.instruction)
+        instr += "    end\n"
+        return instr
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        mapInstr = kwargs['mapInstruction']
+        instr = {}
+        for line in text:
+            try:
+                sub = line.split(None, 1)[0]
+                if sub == 'rectangle':
+                    e1, n1, e2, n2 = line.split(None, 5)[1:5]
+                    if '%' in e1 and '%' in n1 and '%' in e2 and '%' in n2:
+                        instr['east1'], instr['north1'] = self.PercentToReal(e1, n1)
+                        instr['east2'], instr['north2'] = self.PercentToReal(e2, n2)
+                    else:
+                        instr['east1'], instr['north1'] = float(e1), float(n1)
+                        instr['east2'], instr['north2'] = float(e2), float(n2)
+                
+                elif sub == 'width':
+                    instr['width'] = float(line.split(None, 1)[1])
+                elif sub == 'color':
+                    instr['color'] = line.split(None, 1)[1]
+                elif sub == 'fcolor':
+                    instr['fcolor'] = line.split(None, 1)[1]
+
+                        
+            except(IndexError, ValueError):
+                GError(_("Failed to read instruction %s") % instruction)
+                return False
+        
+        self.instruction.update(instr)
+        e1, n1 = PaperMapCoordinates(mapInstr = mapInstr, x = self.instruction['east1'],
+                                       y = self.instruction['north1'], paperToMap = False)
+        e2, n2 = PaperMapCoordinates(mapInstr = mapInstr, x = self.instruction['east2'],
+                                       y = self.instruction['north2'], paperToMap = False)
+        instr['rect'] = Rect2DPP(wx.Point2D(e1, n1), wx.Point2D(e2, n2))
+        self.instruction.update(instr)
+
+        return True
+        
+class Scalebar(InstructionObject):
+    """!Class representing scalebar instruction"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'scalebar'
+        # default values
+        self.defaultInstruction = dict(unit = 'inch', where = (1,1),
+                                       unitsLength = 'auto', unitsHeight = 'inch',
+                                       length = None, height = 0.1, rect = None,
+                                       fontsize = 10, background = 'y',
+                                       scalebar = 'f', segment = 4, numbers = 1)
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        instr = string.Template("scalebar $scalebar\n").substitute(self.instruction)
+        instr += "    where %.3f %.3f\n" % (self.instruction['where'][0], self.instruction['where'][1])
+        instr += string.Template("    length $length\n    units $unitsLength\n").substitute(self.instruction)
+        instr += string.Template("    height $height\n").substitute(self.instruction)
+        instr += string.Template("    segment $segment\n    numbers $numbers\n").substitute(self.instruction)
+        instr += string.Template("    fontsize $fontsize\n    background $background\n").substitute(self.instruction)
+        instr += "    end"
+        return instr
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        scale = kwargs['scale']
+        instr = {}
+        for line in text:
+            try:
+                if line.startswith('scalebar'):
+                    if 'scalebar s' in line:
+                        instr['scalebar'] = 's'
+                    else:
+                        instr['scalebar'] = 'f'
+                elif line.startswith('where'):
+                    instr['where'] = map(float, line.split()[1:3])
+                elif line.startswith('length'):
+                    instr['length'] = float(line.split()[1])
+                elif line.startswith('units'):
+                    if line.split()[1] in ['auto', 'meters', 'kilometers', 'feet', 'miles', 'nautmiles']:
+                        instr['unitsLength'] = line.split()[1]
+                elif line.startswith('height'):
+                    instr['height'] = float(line.split()[1])
+                elif line.startswith('fontsize'):
+                    instr['fontsize'] = float(line.split()[1])
+                elif line.startswith('numbers'):
+                    instr['numbers'] = int(line.split()[1])
+                elif line.startswith('segment'):
+                    instr['segment'] = int(line.split()[1])
+                elif line.startswith('background'):
+                    if line.split()[1].strip().lower() in ('y','yes'):
+                        instr['background'] = 'y'
+                    elif line.split()[1].strip().lower() in ('n','no', 'none'):
+                        instr['background'] = 'n'
+            except(IndexError, ValueError):
+                GError(_("Failed to read instruction %s") % instruction)
+                return False
+            
+        self.instruction.update(instr)
+        w, h = self.EstimateSize(scalebarDict = self.instruction, scale = scale)
+        x = self.instruction['where'][0] - w / 2 
+        y = self.instruction['where'][1] - h / 2
+        self.instruction['rect'] = Rect2D(x, y, w, h)
+        return True 
+    
+    def EstimateSize(self, scalebarDict, scale):
+        """!Estimate size to draw scalebar"""
+        units = projInfo()['units']
+        if not units or units not in self.unitConv.getAllUnits():
+            units = 'meters'
+        if scalebarDict['unitsLength'] != 'auto':
+            length = self.unitConv.convert(value = scalebarDict['length'], fromUnit = scalebarDict['unitsLength'], toUnit = 'inch')
+        else:
+            length = self.unitConv.convert(value = scalebarDict['length'], fromUnit = units, toUnit = 'inch')
+            
+        length *= scale
+        length *= 1.1 #for numbers on the edge
+        height = scalebarDict['height'] + 2 * self.unitConv.convert(value = scalebarDict['fontsize'], fromUnit = 'point', toUnit = 'inch')     
+        return (length, height)
+    
+class RasterLegend(InstructionObject):
+    """!Class representing colortable instruction"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'rasterLegend'
+        # default values
+        self.defaultInstruction = dict(rLegend = False, unit = 'inch', rasterDefault = True, raster = None,
+                                       discrete = None, type = None,
+                                       where = (0, 0),
+                                       width = None, height = None, cols = 1, font = "Helvetica", fontsize = 10,
+                                       #color = '0:0:0', tickbar = False, range = False, min = 0, max = 0,
+                                       color = 'black', tickbar = 'n', range = False, min = 0, max = 0,
+                                       nodata = 'n')
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        instr = "colortable y\n"
+        instr += string.Template("    raster $raster\n").substitute(self.instruction)
+        instr += "    where %.3f %.3f\n" % (self.instruction['where'][0], self.instruction['where'][1])
+        if self.instruction['width']:
+            instr += string.Template("    width $width\n").substitute(self.instruction)
+        instr += string.Template("    discrete $discrete\n").substitute(self.instruction)
+        if self.instruction['discrete'] == 'n':
+            if self.instruction['height']:
+                instr += string.Template("    height $height\n").substitute(self.instruction)
+            instr += string.Template("    tickbar $tickbar\n").substitute(self.instruction)
+            if self.instruction['range']:
+                instr += string.Template("    range $min $max\n").substitute(self.instruction)
+        else:
+            instr += string.Template("    cols $cols\n").substitute(self.instruction)
+            instr += string.Template("    nodata $nodata\n").substitute(self.instruction)
+        instr += string.Template("    font $font\n    fontsize $fontsize\n    color $color\n")\
+            .substitute(self.instruction)
+        instr += "    end"
+        return instr    
+    
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        instr = {}
+        instr['rLegend'] = True
+        for line in text:
+            try:
+                if line.startswith('where'):
+                    instr['where'] = map(float, line.split()[1:3])
+                elif line.startswith('font '):
+                    instr['font'] = line.split()[1]
+                elif line.startswith('fontsize'):
+                    instr['fontsize'] = float(line.split()[1])
+                elif line.startswith('color '):
+                    instr['color'] = line.split()[1]
+                elif line.startswith('raster'):
+                    instr['raster'] = line.split()[1]
+                elif line.startswith('width'):
+                    instr['width'] = float(line.split()[1])
+                elif line.startswith('height'):
+                    instr['height'] = float(line.split()[1])
+                elif line.startswith('cols'):
+                    instr['cols'] = int(line.split()[1])                    
+                elif line.startswith('range'):
+                    instr['range'] = True
+                    instr['min'] = float(line.split()[1])
+                    instr['max'] = float(line.split()[2])
+                elif line.startswith('nodata'):
+                    if line.split()[1].strip().lower() in ('y','yes'):
+                        instr['nodata'] = 'y'
+                    elif line.split()[1].strip().lower() in ('n','no', 'none'):
+                        instr['nodata'] = 'n'
+                elif line.startswith('tickbar'):
+                    if line.split()[1].strip().lower() in ('y','yes'):
+                        instr['tickbar'] = 'y'
+                    elif line.split()[1].strip().lower() in ('n','no', 'none'):
+                        instr['tickbar'] = 'n'
+                elif line.startswith('discrete'):
+                    if line.split()[1].strip().lower() in ('y','yes'):
+                        instr['discrete'] = 'y'
+                    elif line.split()[1].strip().lower() in ('n','no', 'none'):
+                        instr['discrete'] = 'n'            
+
+            except(IndexError, ValueError):
+                GError(_("Failed to read instruction %s") % instruction)
+                return False
+            
+        if 'raster' in instr:
+            instr['rasterDefault'] = False
+            if 'discrete' not in instr:
+                rasterType = getRasterType(map = instr['raster'])
+                instr['type'] = rasterType
+                if rasterType == 'CELL':
+                    instr['discrete'] = 'y'
+                else:
+                    instr['discrete'] = 'n'
+            
+        else:
+            instr['rasterDefault'] = True
+        self.instruction.update(instr)
+        # add 'rect' in the end
+            
+        return True 
+    
+    def EstimateHeight(self, raster, discrete, fontsize, cols = None,  height = None):
+        """!Estimate height to draw raster legend"""
+        if discrete == 'n':
+            if height:
+                height = height
+            else:
+                height = self.unitConv.convert(value = fontsize * 10,
+                                                    fromUnit = 'point', toUnit = 'inch')
+                                                    
+        if discrete == 'y':
+            if cols:
+                cols = cols 
+            else:
+                cols = 1 
+
+            rinfo = grass.raster_info(raster)
+            if rinfo['datatype'] in ('DCELL', 'FCELL'):
+                minim, maxim = rinfo['min'], rinfo['max']
+                rows = ceil(maxim / cols )
+            else:
+                cat = grass.read_command('r.category', map = raster,
+                                    fs = ':').strip().split('\n')
+                rows = ceil(float(len(cat)) / cols )
+                            
+                
+            height = self.unitConv.convert(value =  1.5 * rows * fontsize, fromUnit = 'point', toUnit = 'inch')
+            
+        return height
+        
+    def EstimateWidth(self, raster, discrete, fontsize, cols = None, width = None, paperInstr = None):
+        """!Estimate size to draw raster legend"""
+        
+        if discrete == 'n':
+            rinfo = grass.raster_info(raster)
+            minim, maxim = rinfo['min'], rinfo['max']
+            if width:
+                width = width
+            else:
+                width = self.unitConv.convert(value = fontsize * 2,
+                                                    fromUnit = 'point', toUnit = 'inch')
+            text = len(max(str(minim), str(maxim), key = len))
+            textPart = self.unitConv.convert(value = text * fontsize / 2,
+                                                    fromUnit = 'point', toUnit = 'inch')
+            width += textPart
+                                                    
+        elif discrete == 'y':
+            if cols:
+                cols = cols 
+            else:
+                cols = 1    
+
+            if width:
+                width = width
+            else:
+                paperWidth = paperInstr['Width'] - paperInstr['Right'] - paperInstr['Left']
+                width = (paperWidth / cols) * (cols - 1) + 1
+                
+        return width    
+             
+class VectorLegend(InstructionObject):
+    """!Class representing colortable instruction"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'vectorLegend'
+        # default values
+        self.defaultInstruction = dict(vLegend = False, unit = 'inch', where = (0, 0),
+                                                defaultSize = True, width = 0.4, cols = 1, span = None,
+                                                font = "Helvetica", fontsize = 10,
+                                                border = 'none')
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        instr = "vlegend\n"
+        instr += "    where %.3f %.3f\n" % (self.instruction['where'][0], self.instruction['where'][1])
+        instr += string.Template("    font $font\n    fontsize $fontsize\n").substitute(self.instruction)
+        instr += string.Template("    width $width\n    cols $cols\n").substitute(self.instruction)
+        if self.instruction['span']:
+            instr += string.Template("    span $span\n").substitute(self.instruction)
+        instr += string.Template("    border $border\n").substitute(self.instruction)  
+        instr += "    end"  
+        return instr
+
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        instr = {}
+        instr['vLegend'] = True
+        for line in text:
+            try:
+                if line.startswith('where'):
+                    instr['where'] = map(float, line.split()[1:3])
+                elif line.startswith('font '):
+                    instr['font'] = line.split()[1]
+                elif line.startswith('fontsize'):
+                    instr['fontsize'] = float(line.split()[1])
+                elif line.startswith('width'):
+                    instr['width'] = float(line.split()[1])
+                elif line.startswith('cols'):
+                    instr['cols'] = int(line.split()[1]) 
+                elif line.startswith('span'):
+                    instr['span'] = float(line.split()[1])
+                elif line.startswith('border'):
+                    instr['border'] = line.split()[1]
+                    
+            except(IndexError, ValueError):
+                GError(_("Failed to read instruction %s") % instruction)
+                return False
+            
+        self.instruction.update(instr)
+            
+        return True 
+    
+    def EstimateSize(self, vectorInstr, fontsize, width = None, cols = None):
+        """!Estimate size to draw vector legend"""
+        if width:
+            width = width 
+        else:
+            width = fontsize/24.0
+
+        if cols:
+            cols = cols 
+        else:
+            cols = 1
+
+        vectors = vectorInstr['list']
+        labels = [vector[4] for vector in vectors if vector[3] != 0]
+        extent = (len(max(labels, key = len)) * fontsize / 2, fontsize)
+        wExtent = self.unitConv.convert(value = extent[0], fromUnit = 'point', toUnit = 'inch')
+        hExtent = self.unitConv.convert(value = extent[1], fromUnit = 'point', toUnit = 'inch')
+        w = (width + wExtent) * cols
+        h = len(labels) * hExtent / cols
+        h *= 1.1
+        return (w, h)
+            
+   
+class Raster(InstructionObject):
+    """!Class representing raster instruction"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'raster'
+        # default values
+        self.defaultInstruction = dict(isRaster = False, raster = None)
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        instr = string.Template("raster $raster").substitute(self.instruction)
+        return instr
+    
+    def Read(self, instruction, text):
+        """!Read instruction and save information"""
+        instr = {}
+        instr['isRaster'] = True
+        try:
+            map = text.split()[1]
+        except IndexError:
+            GError(_("Failed to read instruction %s") % instruction)
+            return False
+        try:
+            info = grass.find_file(map, element = 'cell')
+        except grass.ScriptError, e:
+            GError(message = e.value)
+            return False
+        instr['raster'] = info['fullname']
+
+        
+        self.instruction.update(instr)
+        return True
+    
+class Vector(InstructionObject):
+    """!Class keeps vector layers"""
+    def __init__(self, id):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'vector'
+        # default values
+        self.defaultInstruction = dict(list = None)# [vmap, type, id, lpos, label] 
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+    def __str__(self):
+        return ''
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        instr = {}
+        
+        for line in text:
+            if line.startswith('vpoints') or line.startswith('vlines') or line.startswith('vareas'):
+                # subtype
+                if line.startswith('vpoints'):
+                    subType = 'points'
+                elif line.startswith('vlines'):
+                    subType = 'lines'
+                elif line.startswith('vareas'):
+                    subType = 'areas'
+                # name of vector map
+                vmap = line.split()[1]
+                try:
+                    info = grass.find_file(vmap, element = 'vector')
+                except grass.ScriptError, e:
+                    GError(message = e.value)
+                    return False
+                vmap = info['fullname']
+                # id
+                id = kwargs['id']
+                # lpos
+                lpos = kwargs['vectorMapNumber']
+                #label
+                label = '('.join(vmap.split('@')) + ')'
+                break
+        instr = [vmap, subType, id, lpos, label] 
+        if not self.instruction['list']:
+            self.instruction['list'] = []
+        self.instruction['list'].append(instr)
+        
+        return True    
+    
+class VProperties(InstructionObject):
+    """!Class represents instructions vareas, vlines, vpoints"""
+    def __init__(self, id, subType):
+        InstructionObject.__init__(self, id = id)
+        self.type = 'vProperties'
+        self.subType = subType
+        # default values
+        if self.subType == 'points':
+            dd = dict(subType  = 'points', name = None, type = 'point or centroid', connection = False, layer = '1',
+                        masked = 'n', color = '0:0:0', width = 1,
+                        fcolor = '255:0:0', rgbcolumn = None, symbol = os.path.join('basic', 'x'), eps = None,
+                        size = 5, sizecolumn = None, scale = None,
+                        rotation = False, rotate = 0, rotatecolumn = None, label = None, lpos = None)
+        elif self.subType == 'lines':
+            dd = dict(subType = 'lines', name = None, type = 'line or boundary', connection = False, layer = '1',
+                        masked = 'n', color = '0:0:0', hwidth = 1,
+                        hcolor = 'none', rgbcolumn = None,
+                        width = 1, cwidth = None,
+                        style = 'solid', linecap = 'butt', label = None, lpos = None)
+        else: # areas
+            dd = dict(subType = 'areas', name = None, connection = False, layer = '1',    
+                        masked = 'n', color = '0:0:0', width = 1,
+                        fcolor = 'none', rgbcolumn = None,
+                        pat = None, pwidth = 1, scale = 1, label = None, lpos = None)
+        self.defaultInstruction = dd
+        # current values
+        self.instruction = dict(self.defaultInstruction)
+        
+    def __str__(self):
+        dic = self.instruction
+        vInstruction = string.Template("v$subType $name\n").substitute(dic)
+        #data selection
+        if self.subType in ('points', 'lines'):
+           vInstruction += string.Template("    type $type\n").substitute(dic) 
+        if dic['connection']:
+            vInstruction += string.Template("    layer $layer\n").substitute(dic)
+            if dic.has_key('cats'):
+                vInstruction += string.Template("    cats $cats\n").substitute(dic)
+            elif dic.has_key('where'):
+                    vInstruction += string.Template("    where $where\n").substitute(dic)
+        vInstruction += string.Template("    masked $masked\n").substitute(dic)
+        #colors
+        vInstruction += string.Template("    color $color\n").substitute(dic)
+        if self.subType in ('points', 'areas'):
+            if dic['color'] != 'none':
+                vInstruction += string.Template("    width $width\n").substitute(dic)
+            if dic['rgbcolumn']:
+                vInstruction += string.Template("    rgbcolumn $rgbcolumn\n").substitute(dic)
+            vInstruction += string.Template("    fcolor $fcolor\n").substitute(dic)
+        else:
+            if dic['rgbcolumn']:
+                vInstruction += string.Template("    rgbcolumn $rgbcolumn\n").substitute(dic)
+            elif dic['hcolor'] != 'none':
+                vInstruction += string.Template("    hwidth $hwidth\n").substitute(dic)
+                vInstruction += string.Template("    hcolor $hcolor\n").substitute(dic)
+        
+        # size and style
+        if self.subType == 'points':
+            if not dic['eps']:
+                vInstruction += string.Template("    symbol $symbol\n").substitute(dic)
+            else: #eps
+                vInstruction += string.Template("    eps $eps\n").substitute(dic)
+            if dic['size']:
+                vInstruction += string.Template("    size $size\n").substitute(dic)            
+            else: # sizecolumn
+                vInstruction += string.Template("    sizecolumn $sizecolumn\n").substitute(dic)
+                vInstruction += string.Template("    scale $scale\n").substitute(dic)
+            if dic['rotation']:
+                if dic['rotate'] is not None:
+                    vInstruction += string.Template("    rotate $rotate\n").substitute(dic)
+                else:
+                    vInstruction += string.Template("    rotatecolumn $rotatecolumn\n").substitute(dic)
+                    
+        if self.subType == 'areas':
+            if dic['pat'] is not None:
+                patternFile = dic['pat'].replace(os.getenv("GISBASE"), "$GISBASE")
+                vInstruction += "    pat %s\n" % patternFile
+                vInstruction += string.Template("    pwidth $pwidth\n").substitute(dic)
+                vInstruction += string.Template("    scale $scale\n").substitute(dic)
+                
+        if self.subType == 'lines':
+            if dic['width'] is not None:
+                vInstruction += string.Template("    width $width\n").substitute(dic)
+            else:
+                vInstruction += string.Template("    cwidth $cwidth\n").substitute(dic)
+            vInstruction += string.Template("    style $style\n").substitute(dic)
+            vInstruction += string.Template("    linecap $linecap\n").substitute(dic)
+        #position and label in vlegend
+        vInstruction += string.Template("    label $label\n    lpos $lpos\n").substitute(dic)
+        
+        vInstruction += "    end"
+        try:
+            vInstruction = vInstruction.encode('Latin_1')
+        except UnicodeEncodeError, err:
+            try:
+                pos = str(err).split('position')[1].split(':')[0].strip()
+            except IndexError:
+                pos = ''
+            if pos:
+                message = _("Characters on position %s are not supported "
+                            "by ISO-8859-1 (Latin 1) encoding "
+                            "which is required by module ps.map.") % pos
+            else:
+                message = _("Not all characters are supported "
+                            "by ISO-8859-1 (Latin 1) encoding "
+                            "which is required by module ps.map.")
+            GMessage(message = message)
+            return ''
+        return vInstruction
+    
+    def Read(self, instruction, text, **kwargs):
+        """!Read instruction and save information"""
+        instr = {}
+        try:
+            info = grass.find_file(name = text[0].split()[1], element = 'vector')
+        except grass.ScriptError, e:
+            GError(message = e.value)
+            return False
+        instr['name'] = info['fullname']
+        #connection
+        instr['connection'] = True
+        self.mapDBInfo = VectorDBInfo(instr['name'])
+        self.layers = self.mapDBInfo.layers.keys()
+        if not self.layers:
+            instr['connection'] = False
+            
+        # points
+        if text[0].startswith('vpoints'):
+            for line in text[1:]:
+                if line.startswith('type'):
+                    tp = []
+                    if line.find('point') != -1:
+                        tp.append('point')
+                    if line.find('centroid') != -1:
+                        tp.append('centroid')
+                    instr['type'] = ' or '.join(tp)
+                elif line.startswith('fcolor'):
+                    instr['fcolor'] = line.split()[1]
+                elif line.startswith('rgbcolumn'):
+                    instr['rgbcolumn'] = line.split()[1]
+                elif line.startswith('symbol'):
+                    instr['symbol'] = line.split()[1]
+                elif line.startswith('eps'):
+                    instr['eps'] = line.split()[1]
+                elif line.startswith('size '):
+                    instr['size'] = line.split()[1]
+                elif line.startswith('sizecolumn'):
+                    instr['size'] = None
+                    instr['sizecolumn'] = line.split()[1]
+                elif line.startswith('scale '):
+                    instr['scale'] = float(line.split()[1])
+                elif line.startswith('rotate '):
+                    instr['rotation'] = True
+                    instr['rotate'] = line.split()[1]
+                elif line.startswith('rotatecolumn'):
+                    instr['rotatecolumn'] = line.split()[1]
+                    instr['rotation'] = True
+                    instr['rotate'] = None
+                    
+        # lines            
+        elif text[0].startswith('vlines'):
+            for line in text[1:]:
+                if line.startswith('type'):
+                    tp = []
+                    if line.find('line') != -1:
+                        tp.append('line')
+                    if line.find('boundary') != -1:
+                        tp.append('boundary')
+                    instr['type'] = ' or '.join(tp)
+                elif line.startswith('hwidth'):
+                    instr['hwidth'] = float(line.split()[1])
+                elif line.startswith('hcolor'):
+                    instr['hcolor'] = line.split()[1]
+                elif line.startswith('rgbcolumn'):
+                    instr['rgbcolumn'] = line.split()[1]                    
+                elif line.startswith('cwidth'):
+                    instr['cwidth'] = float(line.split()[1])
+                    instr['width'] = None
+                elif line.startswith('style'):
+                    instr['style'] = line.split()[1]       
+                elif line.startswith('linecap'):
+                    instr['linecap'] = line.split()[1]
+         
+        elif text[0].startswith('vareas'):
+            for line in text[1:]:
+                if line.startswith('fcolor'):
+                    instr['fcolor'] = line.split()[1]    
+                elif line.startswith('pat'):
+                    patternFile = line.split()[1]
+                    instr['pat'] = patternFile.replace("$GISBASE", os.getenv("GISBASE"))
+                elif line.startswith('pwidth'):
+                    instr['pwidth'] = float(line.split()[1])
+                elif line.startswith('scale'):
+                    instr['scale'] = float(line.split()[1])
+            
+            
+        # same properties for all    
+        for line in text[1:]:
+            if line.startswith('lpos'):
+                instr['lpos'] = int(line.split()[1])
+            elif line.startswith('label'):
+                instr['label'] = line.split(None, 1)[1].decode('latin_1')
+            elif line.startswith('layer'):
+                instr['layer'] = line.split()[1]
+            elif line.startswith('masked'):
+                if line.split()[1].lower() in ('y', 'yes'):
+                    instr['masked'] = 'y'
+                else:
+                    instr['masked'] = 'n'
+            elif line.startswith('color'):
+                instr['color'] = line.split()[1]
+            elif line.startswith('rgbcolumn'):
+                instr['rgbcolumn'] = line.split()[1] 
+            elif line.startswith('width'):
+                instr['width'] = float(line.split()[1])
+                
+        if 'label' not in instr:
+            instr['label'] = '('.join(instr['name'].split('@')) + ')'
+        if 'lpos' not in instr:
+            instr['lpos'] = kwargs['vectorMapNumber']
+        self.instruction.update(instr)
+        
+        return True
diff --git a/gui/wxpython/psmap/menudata.py b/gui/wxpython/psmap/menudata.py
new file mode 100644
index 0000000..883edf5
--- /dev/null
+++ b/gui/wxpython/psmap/menudata.py
@@ -0,0 +1,33 @@
+"""!
+ at package ps.menudata
+
+ at brief wxPsMap - menu entries
+
+Classes:
+ - menudata::PsMapData
+
+(C) 2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Anna Kratochvilova <kratochanna gmail.com>
+"""
+
+import os
+
+from core                 import globalvar
+from core.menudata        import MenuData
+
+class PsMapData(MenuData):
+    def __init__(self, path = None):
+        """!Menu for Cartographic Composer (psmap.py)
+        
+        @path path to XML to be read (None for menudata_psmap.xml)
+        """
+        if not path:
+            gisbase = os.getenv('GISBASE')
+            global etcwxdir
+        path = os.path.join(globalvar.ETCWXDIR, 'xml', 'menudata_psmap.xml')
+        
+        MenuData.__init__(self, path)
diff --git a/gui/wxpython/psmap/toolbars.py b/gui/wxpython/psmap/toolbars.py
new file mode 100644
index 0000000..08168f2
--- /dev/null
+++ b/gui/wxpython/psmap/toolbars.py
@@ -0,0 +1,162 @@
+"""!
+ at package psmap.toolbars
+
+ at brief wxPsMap toolbars classes
+
+Classes:
+ - toolbars::PsMapToolbar
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Anna Kratochvilova <kratochanna gmail.com>
+"""
+
+import os
+import sys
+
+import wx
+
+from core              import globalvar
+from gui_core.toolbars import BaseToolbar, BaseIcons
+from icons.icon        import MetaIcon
+
+class PsMapToolbar(BaseToolbar):
+    def __init__(self, parent):
+        """!Toolbar Cartographic Composer (psmap.py)
+        
+        @param parent parent window
+        """
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        self.Realize()
+        
+        self.action = { 'id' : self.pointer }
+        self.defaultAction = { 'id' : self.pointer,
+                               'bind' : self.parent.OnPointer }
+        self.OnTool(None)
+        
+        from psmap.frame import havePILImage
+        if not havePILImage:
+            self.EnableTool(self.preview, False)
+        
+    def _toolbarData(self):
+        """!Toolbar data
+        """
+        icons = {
+            'scriptSave' : MetaIcon(img = 'script-save',
+                                    label = _('Generate text file with mapping instructions')),
+            'scriptLoad' : MetaIcon(img = 'script-load',
+                                    label = _('Load text file with mapping instructions')),                           
+            'psExport'   : MetaIcon(img = 'ps-export',
+                                    label = _('Generate PostScript output')),
+            'pdfExport'  : MetaIcon(img = 'pdf-export',
+                                    label = _('Generate PDF output')),
+            'pageSetup'  : MetaIcon(img = 'page-settings',
+                                    label = _('Page setup'),
+                                    desc = _('Specify paper size, margins and orientation')),
+            'fullExtent' : MetaIcon(img = 'zoom-extent',
+                                    label = _("Full extent"),
+                                    desc = _("Zoom to full extent")),
+            'addMap'     : MetaIcon(img = 'layer-add',
+                                    label = _("Map frame"),
+                                    desc = _("Click and drag to place map frame")),
+            'deleteObj'  : MetaIcon(img = 'layer-remove',
+                                    label = _("Delete selected object")),
+            'preview'    : MetaIcon(img = 'execute',
+                                    label = _("Show preview")),
+            'quit'       : MetaIcon(img = 'quit',
+                                    label = _('Quit Cartographic Composer')),
+            'addText'    : MetaIcon(img = 'text-add',
+                                    label = _('Text')),
+            'addMapinfo' : MetaIcon(img = 'map-info',
+                                    label = _('Map info')),
+            'addLegend'  : MetaIcon(img = 'legend-add',
+                                    label = _('Legend')),
+            'addScalebar' : MetaIcon(img = 'scalebar-add',
+                                     label = _('Scale bar')),
+            'addImage'   : MetaIcon(img = 'image-add',
+                                    label = _('Image')),
+            'addNorthArrow': MetaIcon(img = 'north-arrow-add',
+                                      label = _('North Arrow')),
+            'drawGraphics': MetaIcon(img = 'edit',
+                                     label = _('Add simple graphics')),
+            'pointAdd'    : MetaIcon(img = 'point-add',
+                                     label = _('Point')),
+            'lineAdd'     : MetaIcon(img = 'line-add',
+                                     label = _('Line')),
+            'rectangleAdd': MetaIcon(img = 'rectangle-add',
+                                     label = _('Rectangle')),
+            }
+        self.icons = icons
+        
+        return self._getToolbarData((('loadFile', icons['scriptLoad'],
+                                      self.parent.OnLoadFile),                                    
+                                     ('instructionFile', icons['scriptSave'],
+                                      self.parent.OnInstructionFile),
+                                     (None, ),
+                                     ('pagesetup', icons['pageSetup'],
+                                      self.parent.OnPageSetup),
+                                     (None, ),
+                                     ("pointer", BaseIcons["pointer"],
+                                      self.parent.OnPointer, wx.ITEM_CHECK),
+                                     ('pan', BaseIcons['pan'],
+                                      self.parent.OnPan, wx.ITEM_CHECK),
+                                     ("zoomin", BaseIcons["zoomIn"],
+                                      self.parent.OnZoomIn, wx.ITEM_CHECK),
+                                     ("zoomout", BaseIcons["zoomOut"],
+                                      self.parent.OnZoomOut, wx.ITEM_CHECK),
+                                     ('zoomAll', icons['fullExtent'],
+                                      self.parent.OnZoomAll),
+                                     (None, ),
+                                     ('addMap', icons['addMap'],
+                                      self.parent.OnAddMap, wx.ITEM_CHECK),
+                                     ('addRaster', BaseIcons['addRast'],
+                                      self.parent.OnAddRaster),
+                                     ('addVector', BaseIcons['addVect'],
+                                      self.parent.OnAddVect),
+                                     ("dec", BaseIcons["overlay"],
+                                      self.OnDecoration),
+                                     ("drawGraphics", icons["drawGraphics"],
+                                      self.OnDrawGraphics, wx.ITEM_CHECK),
+                                     ("delete", icons["deleteObj"],
+                                      self.parent.OnDelete),
+                                     (None, ),
+                                     ("preview", icons["preview"],
+                                      self.parent.OnPreview),
+                                     ('generatePS', icons['psExport'],
+                                      self.parent.OnPSFile),
+                                     ('generatePDF', icons['pdfExport'],
+                                      self.parent.OnPDFFile),
+                                     (None, ),
+                                     ("help", BaseIcons['help'],
+                                      self.parent.OnHelp),
+                                     ('quit', icons['quit'],
+                                      self.parent.OnCloseWindow))
+                                    )
+
+    def OnDecoration(self, event):
+        """!Decorations overlay menu
+        """
+        self._onMenu(((self.icons["addLegend"],     self.parent.OnAddLegend),
+                      (self.icons["addMapinfo"],    self.parent.OnAddMapinfo),
+                      (self.icons["addScalebar"],   self.parent.OnAddScalebar),
+                      (self.icons["addText"],       self.parent.OnAddText),
+                      (self.icons["addImage"],      self.parent.OnAddImage),
+                      (self.icons["addNorthArrow"], self.parent.OnAddNorthArrow)))
+
+    def OnDrawGraphics(self, event):
+        """!Simple geometry features (point, line, rectangle) overlay menu
+        """
+        # we need the previous id
+        self.actionOld = self.action['id']
+        self.OnTool(event)
+        self.action['id'] = self.actionOld
+        self._onMenu(((self.icons["pointAdd"],      self.parent.OnAddPoint),
+                      (self.icons["lineAdd"],       self.parent.OnAddLine),
+                      (self.icons["rectangleAdd"],  self.parent.OnAddRectangle),
+                    ))
diff --git a/gui/wxpython/psmap/utils.py b/gui/wxpython/psmap/utils.py
new file mode 100644
index 0000000..db040ad
--- /dev/null
+++ b/gui/wxpython/psmap/utils.py
@@ -0,0 +1,479 @@
+"""!
+ at package psmap.utils
+
+ at brief utilities for wxpsmap (classes, functions)
+
+Classes:
+ - utils::Rect2D
+ - utils::Rect2DPP
+ - utils::Rect2DPS
+ - utils::UnitConversion
+
+(C) 2012 by Anna Kratochvilova, and the GRASS Development Team
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Anna Kratochvilova <kratochanna gmail.com>
+"""
+import os
+import wx
+import string
+from math import ceil, floor, sin, cos, pi
+
+try:
+    import Image as PILImage
+    havePILImage = True
+except ImportError:
+    havePILImage = False
+
+import grass.script as grass
+from core.gcmd          import RunCommand
+
+class Rect2D(wx.Rect2D):
+    """!Class representing rectangle with floating point values.
+
+    Overrides wx.Rect2D to unify Rect access methods, which are
+    different (e.g. wx.Rect.GetTopLeft() x wx.Rect2D.GetLeftTop()).
+    More methods can be added depending on needs.
+    """
+    def __init__(self, x = 0, y = 0, width = 0, height = 0):
+        wx.Rect2D.__init__(self, x = x, y = y, w = width, h = height)
+
+    def GetX(self):
+        return self.x
+        
+    def GetY(self):
+        return self.y
+
+    def GetWidth(self):
+        return self.width
+
+    def SetWidth(self, width):
+        self.width = width
+        
+    def GetHeight(self):
+        return self.height
+
+    def SetHeight(self, height):
+        self.height = height
+
+class Rect2DPP(Rect2D):
+    """!Rectangle specified by 2 points (with floating point values).
+
+    @see Rect2D, Rect2DPS
+    """
+    def __init__(self, topLeft = wx.Point2D(), bottomRight = wx.Point2D()):
+        Rect2D.__init__(self, x = 0, y = 0, width = 0, height = 0)
+
+        x1, y1 = topLeft[0], topLeft[1]
+        x2, y2 = bottomRight[0], bottomRight[1]
+
+        self.SetLeft(min(x1, x2))
+        self.SetTop(min(y1, y2))
+        self.SetRight(max(x1, x2))
+        self.SetBottom(max(y1, y2))
+
+class Rect2DPS(Rect2D):
+    """!Rectangle specified by point and size (with floating point values).
+
+    @see Rect2D, Rect2DPP
+    """
+    def __init__(self, pos = wx.Point2D(), size = (0, 0)):
+        Rect2D.__init__(self, x = pos[0], y = pos[1], width = size[0], height = size[1])
+
+class UnitConversion:
+    """! Class for converting units"""
+    def __init__(self, parent = None):
+        self.parent = parent
+        if self.parent:
+            ppi = wx.ClientDC(self.parent).GetPPI()
+        else: 
+            ppi = (72, 72)
+        self._unitsPage = { 'inch'          : {'val': 1.0, 'tr' : _("inch")},
+                            'point'         : {'val': 72.0, 'tr' : _("point")},
+                            'centimeter'    : {'val': 2.54, 'tr' : _("centimeter")},
+                            'millimeter'    : {'val': 25.4, 'tr' : _("millimeter")}}
+        self._unitsMap = {  'meters'        : {'val': 0.0254, 'tr' : _("meters")},
+                            'kilometers'    : {'val': 2.54e-5, 'tr' : _("kilometers")},
+                            'feet'          : {'val': 1./12, 'tr' : _("feet")},
+                            'miles'         : {'val': 1./63360, 'tr' : _("miles")},
+                            'nautical miles': {'val': 1/72913.386, 'tr' : _("nautical miles")}}
+
+        self._units = { 'pixel'     : {'val': ppi[0], 'tr' : _("pixel")},
+                        'meter'     : {'val': 0.0254, 'tr' : _("meter")},
+                        'nautmiles' : {'val': 1/72913.386, 'tr' :_("nautical miles")},
+                        'degrees'   : {'val': 0.0254 , 'tr' : _("degree")} #like 1 meter, incorrect
+                        }
+        self._units.update(self._unitsPage)
+        self._units.update(self._unitsMap)
+
+    def getPageUnitsNames(self):
+        return sorted(self._unitsPage[unit]['tr'] for unit in self._unitsPage.keys())
+    
+    def getMapUnitsNames(self):
+        return sorted(self._unitsMap[unit]['tr'] for unit in self._unitsMap.keys())
+    
+    def getAllUnits(self):
+        return sorted(self._units.keys())
+    
+    def findUnit(self, name):
+        """!Returns unit by its tr. string"""
+        for unit in self._units.keys():
+            if self._units[unit]['tr'] == name:
+                return unit
+        return None
+    
+    def findName(self, unit):
+        """!Returns tr. string of a unit"""
+        try:
+            return self._units[unit]['tr']
+        except KeyError:
+            return None
+    
+    def convert(self, value, fromUnit = None, toUnit = None):
+        return float(value)/self._units[fromUnit]['val']*self._units[toUnit]['val']
+
+def convertRGB(rgb):
+    """!Converts wx.Colour(r,g,b,a) to string 'r:g:b' or named color,
+            or named color/r:g:b string to wx.Colour, depending on input""" 
+    # transform a wx.Colour tuple into an r:g:b string    
+    if type(rgb) == wx.Colour:
+        for name, color in grass.named_colors.items(): 
+            if  rgb.Red() == int(color[0] * 255) and\
+                rgb.Green() == int(color[1] * 255) and\
+                rgb.Blue() == int(color[2] * 255):
+                return name
+        return str(rgb.Red()) + ':' + str(rgb.Green()) + ':' + str(rgb.Blue())
+    # transform a GRASS named color or an r:g:b string into a wx.Colour tuple
+    else:
+        color = (grass.parse_color(rgb)[0]*255,
+                 grass.parse_color(rgb)[1]*255,
+                 grass.parse_color(rgb)[2]*255)
+        color = wx.Color(*color)
+        if color.IsOk():
+            return color
+        else:  
+            return None
+        
+        
+def PaperMapCoordinates(mapInstr, x, y, paperToMap = True):
+    """!Converts paper (inch) coordinates <-> map coordinates.
+
+    @param mapInstr map frame instruction
+    @param x,y paper coords in inches or mapcoords in map units
+    @param paperToMap specify conversion direction
+    """
+    region = grass.region()
+    mapWidthPaper = mapInstr['rect'].GetWidth()
+    mapHeightPaper = mapInstr['rect'].GetHeight()
+    mapWidthEN = region['e'] - region['w']
+    mapHeightEN = region['n'] - region['s']
+
+    if paperToMap:
+        diffX = x - mapInstr['rect'].GetX()
+        diffY = y - mapInstr['rect'].GetY()
+        diffEW = diffX * mapWidthEN / mapWidthPaper
+        diffNS = diffY * mapHeightEN / mapHeightPaper
+        e = region['w'] + diffEW
+        n = region['n'] - diffNS
+
+        if projInfo()['proj'] == 'll':
+            return e, n
+        else:
+            return int(e), int(n)
+
+    else:
+        diffEW = x - region['w']
+        diffNS = region['n'] - y
+        diffX = mapWidthPaper * diffEW / mapWidthEN
+        diffY = mapHeightPaper * diffNS / mapHeightEN
+        xPaper = mapInstr['rect'].GetX() + diffX
+        yPaper = mapInstr['rect'].GetY() + diffY
+
+        return xPaper, yPaper
+
+
+def AutoAdjust(self, scaleType,  rect, map = None, mapType = None, region = None):
+    """!Computes map scale, center and map frame rectangle to fit region (scale is not fixed)"""
+    currRegionDict = {}
+    if scaleType == 0 and map:# automatic, region from raster or vector
+        res = ''
+        if mapType == 'raster': 
+            try:
+                res = grass.read_command("g.region", flags = 'gu', rast = map)
+            except grass.ScriptError:
+                pass
+        elif mapType == 'vector':
+            res = grass.read_command("g.region", flags = 'gu', vect = map)
+        currRegionDict = grass.parse_key_val(res, val_type = float)
+    elif scaleType == 1 and region: # saved region
+        res = grass.read_command("g.region", flags = 'gu', region = region)
+        currRegionDict = grass.parse_key_val(res, val_type = float)
+    elif scaleType == 2: # current region
+        env = grass.gisenv()
+        windFilePath = os.path.join(env['GISDBASE'], env['LOCATION_NAME'], env['MAPSET'], 'WIND')
+        try:
+            windFile = open(windFilePath, 'r').read()
+        except IOError:
+            currRegionDict = grass.region()
+        regionDict = grass.parse_key_val(windFile, sep = ':', val_type = float)
+        region = grass.read_command("g.region", flags = 'gu', n = regionDict['north'], s = regionDict['south'],
+                                    e = regionDict['east'], w = regionDict['west'])
+        currRegionDict = grass.parse_key_val(region, val_type = float)
+                                                                
+    else:
+        return None, None, None
+    
+    if not currRegionDict:
+        return None, None, None
+    rX = rect.x
+    rY = rect.y
+    rW = rect.width
+    rH = rect.height
+    if not hasattr(self, 'unitConv'):
+        self.unitConv = UnitConversion(self)
+    toM = 1
+    if projInfo()['proj'] != 'xy':
+        toM = float(projInfo()['meters'])
+
+    mW = self.unitConv.convert(value = (currRegionDict['e'] - currRegionDict['w']) * toM, fromUnit = 'meter', toUnit = 'inch')
+    mH = self.unitConv.convert(value = (currRegionDict['n'] - currRegionDict['s']) * toM, fromUnit = 'meter', toUnit = 'inch')
+    scale = min(rW/mW, rH/mH)
+    
+    if rW/rH > mW/mH:
+        x = rX - (rH*(mW/mH) - rW)/2
+        y = rY
+        rWNew = rH*(mW/mH)
+        rHNew = rH
+    else:
+        x = rX
+        y = rY - (rW*(mH/mW) - rH)/2
+        rHNew = rW*(mH/mW)
+        rWNew = rW
+
+    # center
+    cE = (currRegionDict['w'] + currRegionDict['e'])/2
+    cN = (currRegionDict['n'] + currRegionDict['s'])/2
+    return scale, (cE, cN), Rect2D(x, y, rWNew, rHNew) #inch
+
+def SetResolution(dpi, width, height):
+    """!If resolution is too high, lower it
+    
+    @param dpi max DPI
+    @param width map frame width
+    @param height map frame height
+    """
+    region = grass.region()
+    if region['cols'] > width * dpi or region['rows'] > height * dpi:
+        rows = height * dpi
+        cols = width * dpi
+        RunCommand('g.region', rows = rows, cols = cols)
+               
+def ComputeSetRegion(self, mapDict):
+    """!Computes and sets region from current scale, map center coordinates and map rectangle"""
+
+    if mapDict['scaleType'] == 3: # fixed scale
+        scale = mapDict['scale']
+            
+        if not hasattr(self, 'unitConv'):
+            self.unitConv = UnitConversion(self)
+        
+        fromM = 1
+        if projInfo()['proj'] != 'xy':
+            fromM = float(projInfo()['meters'])
+        rectHalfInch = (mapDict['rect'].width/2, mapDict['rect'].height/2)
+        rectHalfMeter = (self.unitConv.convert(value = rectHalfInch[0], fromUnit = 'inch', toUnit = 'meter')/ fromM /scale,
+                         self.unitConv.convert(value = rectHalfInch[1], fromUnit = 'inch', toUnit = 'meter')/ fromM /scale) 
+        
+        centerE = mapDict['center'][0]
+        centerN = mapDict['center'][1]
+        
+        raster = self.instruction.FindInstructionByType('raster')
+        if raster:
+            rasterId = raster.id 
+        else:
+            rasterId = None
+
+        if rasterId:
+            RunCommand('g.region', n = ceil(centerN + rectHalfMeter[1]),
+                       s = floor(centerN - rectHalfMeter[1]),
+                       e = ceil(centerE + rectHalfMeter[0]),
+                       w = floor(centerE - rectHalfMeter[0]),
+                       rast = self.instruction[rasterId]['raster'])
+        else:
+            RunCommand('g.region', n = ceil(centerN + rectHalfMeter[1]),
+                       s = floor(centerN - rectHalfMeter[1]),
+                       e = ceil(centerE + rectHalfMeter[0]),
+                       w = floor(centerE - rectHalfMeter[0]))
+                    
+def projInfo():
+    """!Return region projection and map units information,
+    taken from render.py"""
+    
+    projinfo = dict()
+    
+    ret = RunCommand('g.proj', read = True, flags = 'p')
+    
+    if not ret:
+        return projinfo
+    
+    for line in ret.splitlines():
+        if ':' in line:
+            key, val = line.split(':')
+            projinfo[key.strip()] = val.strip()
+        elif "XY location (unprojected)" in line:
+            projinfo['proj'] = 'xy'
+            projinfo['units'] = ''
+            break
+    
+    return projinfo
+
+def GetMapBounds(filename, portrait = True):
+    """!Run ps.map -b to get information about map bounding box
+    
+        @param filename psmap input file
+        @param portrait page orientation"""
+    orient = ''
+    if not portrait:
+        orient = 'r'
+    try:
+        bb = map(float, grass.read_command('ps.map',
+                                           flags = 'b' + orient,
+                                           quiet = True,
+                                           input = filename).strip().split('=')[1].split(','))
+    except (grass.ScriptError, IndexError):
+        GError(message = _("Unable to run `ps.map -b`"))
+        return None
+    return Rect2D(bb[0], bb[3], bb[2] - bb[0], bb[1] - bb[3])
+
+def getRasterType(map):
+    """!Returns type of raster map (CELL, FCELL, DCELL)"""
+    if map is None:
+        map = ''
+    file = grass.find_file(name = map, element = 'cell')
+    if file['file']:
+        rasterType = grass.raster_info(map)['datatype']
+        return rasterType
+    else:
+        return None
+   
+def PilImageToWxImage(pilImage, copyAlpha = True):
+    """!Convert PIL image to wx.Image
+    
+    Based on http://wiki.wxpython.org/WorkingWithImages
+    """
+    hasAlpha = pilImage.mode[-1] == 'A'
+    if copyAlpha and hasAlpha :  # Make sure there is an alpha layer copy.
+        wxImage = wx.EmptyImage( *pilImage.size )
+        pilImageCopyRGBA = pilImage.copy()
+        pilImageCopyRGB = pilImageCopyRGBA.convert('RGB')    # RGBA --> RGB
+        pilImageRgbData = pilImageCopyRGB.tostring()
+        wxImage.SetData(pilImageRgbData)
+        wxImage.SetAlphaData(pilImageCopyRGBA.tostring()[3::4])  # Create layer and insert alpha values.
+
+    else :    # The resulting image will not have alpha.
+        wxImage = wx.EmptyImage(*pilImage.size)
+        pilImageCopy = pilImage.copy()
+        pilImageCopyRGB = pilImageCopy.convert('RGB')    # Discard any alpha from the PIL image.
+        pilImageRgbData = pilImageCopyRGB.tostring()
+        wxImage.SetData(pilImageRgbData)
+
+    return wxImage
+
+def BBoxAfterRotation(w, h, angle):
+    """!Compute bounding box or rotated rectangle
+    
+    @param w rectangle width
+    @param h rectangle height
+    @param angle angle (0, 360) in degrees
+    """
+    angleRad = angle / 180. * pi
+    ct = cos(angleRad)
+    st = sin(angleRad)
+    
+    hct = h * ct
+    wct = w * ct
+    hst = h * st
+    wst = w * st
+    y = x = 0
+    
+    if 0 < angle <= 90:
+        y_min = y
+        y_max = y + hct + wst
+        x_min = x - hst
+        x_max = x + wct
+    elif 90 < angle <= 180:
+        y_min = y + hct
+        y_max = y + wst
+        x_min = x - hst + wct
+        x_max = x
+    elif 180 < angle <= 270:
+        y_min = y + wst + hct
+        y_max = y
+        x_min = x + wct
+        x_max = x - hst
+    elif 270 < angle <= 360:
+        y_min = y + wst
+        y_max = y + hct
+        x_min = x
+        x_max = x + wct - hst
+        
+    width = int(ceil(abs(x_max) + abs(x_min)))
+    height = int(ceil(abs(y_max) + abs(y_min)))
+    return width, height
+
+# hack for Windows, loading EPS works only on Unix
+# these functions are taken from EpsImagePlugin.py
+def loadPSForWindows(self):
+    # Load EPS via Ghostscript
+    if not self.tile:
+        return
+    self.im = GhostscriptForWindows(self.tile, self.size, self.fp)
+    self.mode = self.im.mode
+    self.size = self.im.size
+    self.tile = []
+
+def GhostscriptForWindows(tile, size, fp):
+    """Render an image using Ghostscript (Windows only)"""
+    # Unpack decoder tile
+    decoder, tile, offset, data = tile[0]
+    length, bbox = data
+
+    import tempfile, os
+
+    file = tempfile.mkstemp()[1]
+
+    # Build ghostscript command - for Windows
+    command = ["gswin32c",
+               "-q",                    # quite mode
+               "-g%dx%d" % size,        # set output geometry (pixels)
+               "-dNOPAUSE -dSAFER",     # don't pause between pages, safe mode
+               "-sDEVICE=ppmraw",       # ppm driver
+               "-sOutputFile=%s" % file # output file
+              ]
+
+    command = string.join(command)
+
+    # push data through ghostscript
+    try:
+        gs = os.popen(command, "w")
+        # adjust for image origin
+        if bbox[0] != 0 or bbox[1] != 0:
+            gs.write("%d %d translate\n" % (-bbox[0], -bbox[1]))
+        fp.seek(offset)
+        while length > 0:
+            s = fp.read(8192)
+            if not s:
+                break
+            length = length - len(s)
+            gs.write(s)
+        status = gs.close()
+        if status:
+            raise IOError("gs failed (status %d)" % status)
+        im = PILImage.core.open_ppm(file)
+
+    finally:
+        try: os.unlink(file)
+        except: pass
+
+    return im
diff --git a/gui/wxpython/gui_modules/states.txt b/gui/wxpython/states.txt
similarity index 100%
rename from gui/wxpython/gui_modules/states.txt
rename to gui/wxpython/states.txt
diff --git a/gui/wxpython/vdigit/dialogs.py b/gui/wxpython/vdigit/dialogs.py
new file mode 100644
index 0000000..7f9a4e5
--- /dev/null
+++ b/gui/wxpython/vdigit/dialogs.py
@@ -0,0 +1,754 @@
+"""!
+ at package vdigit.dialogs
+
+ at brief wxGUI vector digitizer dialogs
+
+Classes:
+ - dialogs::VDigitCategoryDialog
+ - dialogs::CategoryListCtrl
+ - dialogs::VDigitZBulkDialog
+ - dialogs::VDigitDuplicatesDialog
+ - dialogs::CheckListFeature
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+import sys
+import copy
+
+import wx
+import wx.lib.mixins.listctrl as listmix
+
+from core.gcmd        import RunCommand, GError
+from core.debug       import Debug
+from core.settings    import UserSettings
+
+class VDigitCategoryDialog(wx.Dialog, listmix.ColumnSorterMixin):
+    def __init__(self, parent, title,
+                 vectorName, query = None, cats = None,
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
+        """!Dialog used to display/modify categories of vector objects
+        
+        @param parent
+        @param title dialog title
+        @param query {coordinates, qdist} - used by v.edit/v.what
+        @param cats  directory of lines (layer/categories) - used by vdigit
+        @param style dialog style
+        """
+        self.parent = parent       # mapdisplay.BufferedWindow class instance
+        self.digit = parent.digit
+        
+        # map name
+        self.vectorName = vectorName
+        
+        # line : {layer: [categories]}
+        self.cats = {}
+        
+        # do not display dialog if no line is found (-> self.cats)
+        if cats is None:
+            if self._getCategories(query[0], query[1]) == 0 or not self.line:
+                Debug.msg(3, "VDigitCategoryDialog(): nothing found!")
+        else:
+            self.cats = cats
+            for line in cats.keys():
+                for layer in cats[line].keys():
+                    self.cats[line][layer] = list(cats[line][layer])
+            
+            layers = []
+            for layer in self.digit.GetLayers():
+                layers.append(str(layer))
+        
+        # make copy of cats (used for 'reload')
+        self.cats_orig = copy.deepcopy(self.cats)
+        
+        wx.Dialog.__init__(self, parent = self.parent, id = wx.ID_ANY, title = title,
+                           style = style, **kwargs)
+        
+        # list of categories
+        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                           label = " %s " % _("List of categories - right-click to delete"))
+        listSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        self.list = CategoryListCtrl(parent = self, id = wx.ID_ANY,
+                                     style = wx.LC_REPORT |
+                                     wx.BORDER_NONE |
+                                     wx.LC_SORT_ASCENDING |
+                                     wx.LC_HRULES |
+                                     wx.LC_VRULES)
+        # sorter
+        self.fid = self.cats.keys()[0]
+        self.itemDataMap = self.list.Populate(self.cats[self.fid])
+        listmix.ColumnSorterMixin.__init__(self, 2)
+        self.fidMulti = wx.Choice(parent = self, id = wx.ID_ANY,
+                                  size = (150, -1))
+        self.fidMulti.Bind(wx.EVT_CHOICE, self.OnFeature)
+        self.fidText = wx.StaticText(parent = self, id = wx.ID_ANY)
+        if len(self.cats.keys()) == 1:
+            self.fidMulti.Show(False)
+            self.fidText.SetLabel(str(self.fid))
+        else:
+            self.fidText.Show(False)
+            choices = []
+            for fid in self.cats.keys():
+                choices.append(str(fid))
+            self.fidMulti.SetItems(choices)
+            self.fidMulti.SetSelection(0)
+        
+        listSizer.Add(item = self.list, proportion = 1, flag = wx.EXPAND)
+
+        # add new category
+        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                           label = " %s " % _("Add new category"))
+        addSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        flexSizer = wx.FlexGridSizer (cols = 5, hgap = 5, vgap = 5)
+        flexSizer.AddGrowableCol(3)
+
+        layerNewTxt = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                 label = "%s:" % _("Layer"))
+        self.layerNew = wx.Choice(parent = self, id = wx.ID_ANY, size = (75, -1),
+                                  choices = layers)
+        if len(layers) > 0:
+            self.layerNew.SetSelection(0)
+        
+        catNewTxt = wx.StaticText(parent = self, id = wx.ID_ANY,
+                               label = "%s:" % _("Category"))
+
+        try:
+            newCat = max(self.cats[self.fid][1]) + 1
+        except KeyError:
+            newCat = 1
+        self.catNew = wx.SpinCtrl(parent = self, id = wx.ID_ANY, size = (75, -1),
+                                  initial = newCat, min = 0, max = 1e9)
+        btnAddCat = wx.Button(self, wx.ID_ADD)
+        flexSizer.Add(item = layerNewTxt, proportion = 0,
+                      flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
+        flexSizer.Add(item = self.layerNew, proportion = 0,
+                      flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
+        flexSizer.Add(item = catNewTxt, proportion = 0,
+                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT,
+                      border = 10)
+        flexSizer.Add(item = self.catNew, proportion = 0,
+                      flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
+        flexSizer.Add(item = btnAddCat, proportion = 0,
+                      flag = wx.EXPAND | wx.ALIGN_RIGHT | wx.FIXED_MINSIZE)
+        addSizer.Add(item = flexSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
+
+        # buttons
+        btnApply = wx.Button(self, wx.ID_APPLY)
+        btnApply.SetToolTipString(_("Apply changes"))
+        btnCancel = wx.Button(self, wx.ID_CANCEL)
+        btnCancel.SetToolTipString(_("Ignore changes and close dialog"))
+        btnOk = wx.Button(self, wx.ID_OK)
+        btnOk.SetToolTipString(_("Apply changes and close dialog"))
+        btnOk.SetDefault()
+
+        # sizers
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(btnCancel)
+        #btnSizer.AddButton(btnReload)
+        #btnSizer.SetNegativeButton(btnReload)
+        btnSizer.AddButton(btnApply)
+        btnSizer.AddButton(btnOk)
+        btnSizer.Realize()
+        
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        mainSizer.Add(item = listSizer, proportion = 1,
+                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+        mainSizer.Add(item = addSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALIGN_CENTER |
+                      wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
+        fidSizer = wx.BoxSizer(wx.HORIZONTAL)
+        fidSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
+                                        label = _("Feature id:")),
+                     proportion = 0, border = 5,
+                     flag = wx.ALIGN_CENTER_VERTICAL)
+        fidSizer.Add(item = self.fidMulti, proportion = 0,
+                     flag = wx.EXPAND | wx.ALL,  border = 5)
+        fidSizer.Add(item = self.fidText, proportion = 0,
+                     flag = wx.EXPAND | wx.ALL,  border = 5)
+        mainSizer.Add(item = fidSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL, border = 5)
+        mainSizer.Add(item = btnSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+        
+        self.SetSizer(mainSizer)
+        mainSizer.Fit(self)
+        self.SetAutoLayout(True)
+
+        # set min size for dialog
+        self.SetMinSize(self.GetBestSize())
+
+        # bindings
+        btnApply.Bind(wx.EVT_BUTTON, self.OnApply)
+        btnOk.Bind(wx.EVT_BUTTON, self.OnOK)
+        btnAddCat.Bind(wx.EVT_BUTTON, self.OnAddCat)
+        btnCancel.Bind(wx.EVT_BUTTON, self.OnCancel)
+                                     
+        # list
+        self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightUp) #wxMSW
+        self.list.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) #wxGTK
+        self.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT, self.OnBeginEdit, self.list)
+        self.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEndEdit, self.list)
+        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self.list)
+
+    def GetListCtrl(self):
+        """!Used by ColumnSorterMixin
+        """
+        return self.list
+
+    def OnColClick(self, event):
+        """!Click on column header (order by)
+        """
+        event.Skip()
+        
+    def OnBeginEdit(self, event):
+        """!Editing of item started
+        """
+        event.Allow()
+
+    def OnEndEdit(self, event):
+        """!Finish editing of item
+        """
+        itemIndex = event.GetIndex()
+        layerOld = int (self.list.GetItem(itemIndex, 0).GetText())
+        catOld = int (self.list.GetItem(itemIndex, 1).GetText())
+
+        if event.GetColumn() == 0:
+            layerNew = int(event.GetLabel())
+            catNew = catOld
+        else:
+            layerNew = layerOld
+            catNew = int(event.GetLabel())
+        
+        try:
+            if layerNew not in self.cats[self.fid].keys():
+                self.cats[self.fid][layerNew] = []
+            self.cats[self.fid][layerNew].append(catNew)
+            self.cats[self.fid][layerOld].remove(catOld)
+        except:
+            event.Veto()
+            self.list.SetStringItem(itemIndex, 0, str(layerNew))
+            self.list.SetStringItem(itemIndex, 1, str(catNew))
+            dlg = wx.MessageDialog(self, _("Unable to add new layer/category <%(layer)s/%(category)s>.\n"
+                                           "Layer and category number must be integer.\n"
+                                           "Layer number must be greater than zero.") %
+                                   { 'layer': self.layerNew.GetStringSelection(),
+                                     'category' : str(self.catNew.GetValue()) },
+                                   _("Error"), wx.OK | wx.ICON_ERROR)
+            dlg.ShowModal()
+            dlg.Destroy()
+            return False
+
+    def OnRightDown(self, event):
+        """!Mouse right button down
+        """
+        x = event.GetX()
+        y = event.GetY()
+        item, flags = self.list.HitTest((x, y))
+
+        if item !=  wx.NOT_FOUND and \
+                flags & wx.LIST_HITTEST_ONITEM:
+            self.list.Select(item)
+
+        event.Skip()
+
+    def OnRightUp(self, event):
+        """!Mouse right button up
+        """
+        if not hasattr(self, "popupID1"):
+            self.popupID1 = wx.NewId()
+            self.popupID2 = wx.NewId()
+            self.popupID3 = wx.NewId()
+            self.Bind(wx.EVT_MENU, self.OnItemDelete,    id = self.popupID1)
+            self.Bind(wx.EVT_MENU, self.OnItemDeleteAll, id = self.popupID2)
+            self.Bind(wx.EVT_MENU, self.OnReload, id = self.popupID3)
+
+        # generate popup-menu
+        menu = wx.Menu()
+        menu.Append(self.popupID1, _("Delete selected"))
+        if self.list.GetFirstSelected() == -1:
+            menu.Enable(self.popupID1, False)
+
+        menu.Append(self.popupID2, _("Delete all"))
+        menu.AppendSeparator()
+        menu.Append(self.popupID3, _("Reload"))
+
+        self.PopupMenu(menu)
+        menu.Destroy()
+
+    def OnItemSelected(self, event):
+        """!Item selected
+        """
+        event.Skip()
+
+    def OnItemDelete(self, event):
+        """!Delete selected item(s) from the list (layer/category pair)
+        """
+        item = self.list.GetFirstSelected()
+        while item != -1:
+            layer = int (self.list.GetItem(item, 0).GetText())
+            cat = int (self.list.GetItem(item, 1).GetText())
+            self.list.DeleteItem(item)
+            self.cats[self.fid][layer].remove(cat)
+
+            item = self.list.GetFirstSelected()
+            
+        event.Skip()
+        
+    def OnItemDeleteAll(self, event):
+        """!Delete all items from the list
+        """
+        self.list.DeleteAllItems()
+        self.cats[self.fid] = {}
+
+        event.Skip()
+
+    def OnFeature(self, event):
+        """!Feature id changed (on duplicates)
+        """
+        self.fid = int(event.GetString())
+        
+        self.itemDataMap = self.list.Populate(self.cats[self.fid],
+                                              update = True)
+
+        try:
+            newCat = max(self.cats[self.fid][1]) + 1
+        except KeyError:
+            newCat = 1
+            
+        self.catNew.SetValue(newCat)
+        
+        event.Skip()
+        
+    def _getCategories(self, coords, qdist):
+        """!Get layer/category pairs for all available
+        layers
+
+        Return True line found or False if not found
+        """
+        ret = RunCommand('v.what',
+                         parent = self,
+                         quiet = True,
+                         map = self.vectorName,
+                         east_north = '%f,%f' % \
+                             (float(coords[0]), float(coords[1])),
+                         distance = qdist)
+
+        if not ret:
+            return False
+
+        for item in ret.splitlines():
+            litem = item.lower()
+            if "id:" in litem: # get line id
+                self.line = int(item.split(':')[1].strip())
+            elif "layer:" in litem: # add layer
+                layer = int(item.split(':')[1].strip())
+                if layer not in self.cats.keys():
+                    self.cats[layer] = []
+            elif "category:" in litem: # add category
+                self.cats[layer].append(int(item.split(':')[1].strip()))
+
+        return True
+
+    def OnReload(self, event):
+        """!Reload button pressed
+        """
+        # restore original list
+        self.cats = copy.deepcopy(self.cats_orig)
+
+        # polulate list
+        self.itemDataMap = self.list.Populate(self.cats[self.fid],
+                                              update = True)
+
+        event.Skip()
+
+    def OnCancel(self, event):
+        """!Cancel button pressed
+        """
+        self.parent.parent.dialogs['category'] = None
+        if self.digit:
+            self.digit.GetDisplay().SetSelected([])
+            self.parent.UpdateMap(render = False)
+        else:
+            self.parent.parent.OnRender(None)
+            
+        self.Close()
+
+    def OnApply(self, event):
+        """!Apply button pressed
+        """
+        for fid in self.cats.keys():
+            newfid = self.ApplyChanges(fid)
+            if fid == self.fid and newfid > 0:
+                self.fid = newfid
+            
+    def ApplyChanges(self, fid):
+        """!Apply changes 
+
+        @param fid feature id
+        """
+        cats = self.cats[fid]
+        cats_orig = self.cats_orig[fid]
+
+        # action : (catsFrom, catsTo)
+        check = {'catadd': (cats,      cats_orig),
+                 'catdel': (cats_orig, cats)}
+
+        newfid = -1
+        
+        # add/delete new category
+        for action, catsCurr in check.iteritems():
+            for layer in catsCurr[0].keys():
+                catList = []
+                for cat in catsCurr[0][layer]:
+                    if layer not in catsCurr[1].keys() or \
+                            cat not in catsCurr[1][layer]:
+                        catList.append(cat)
+                if catList != []:
+                    if action == 'catadd':
+                        add = True
+                    else:
+                        add = False
+                        
+                    newfid = self.digit.SetLineCats(fid, layer,
+                                                    catList, add)
+                    if len(self.cats.keys()) == 1:
+                        self.fidText.SetLabel("%d" % newfid)
+                    else:
+                        choices = self.fidMulti.GetItems()
+                        choices[choices.index(str(fid))] = str(newfid)
+                        self.fidMulti.SetItems(choices)
+                        self.fidMulti.SetStringSelection(str(newfid))
+                    
+                    self.cats[newfid] = self.cats[fid]
+                    del self.cats[fid]
+                    
+                    fid = newfid
+                    if self.fid < 0:
+                        wx.MessageBox(parent = self, message = _("Unable to update vector map."),
+                                      caption = _("Error"), style = wx.OK | wx.ICON_ERROR)
+        
+        self.cats_orig[fid] = copy.deepcopy(cats)
+        
+        return newfid
+
+    def OnOK(self, event):
+        """!OK button pressed
+        """
+        self.OnApply(event)
+        self.OnCancel(event)
+
+    def OnAddCat(self, event):
+        """!Button 'Add' new category pressed
+        """
+        try:
+            layer = int(self.layerNew.GetStringSelection())
+            cat   = int(self.catNew.GetValue())
+            if layer <= 0:
+                raise ValueError
+        except ValueError:
+            GError(parent = self,
+                   message = _("Unable to add new layer/category <%(layer)s/%(category)s>.\n"
+                               "Layer and category number must be integer.\n"
+                               "Layer number must be greater than zero.") %
+                   {'layer' : str(self.layerNew.GetValue()),
+                    'category' : str(self.catNew.GetValue())})
+            return False
+        
+        if layer not in self.cats[self.fid].keys():
+            self.cats[self.fid][layer] = []
+        
+        self.cats[self.fid][layer].append(cat)
+        
+        # reload list
+        self.itemDataMap = self.list.Populate(self.cats[self.fid],
+                                              update = True)
+        
+        # update category number for add
+        self.catNew.SetValue(cat + 1)
+        
+        event.Skip()
+
+        return True
+
+    def GetLine(self):
+        """!Get id of selected line of 'None' if no line is selected
+        """
+        return self.cats.keys()
+
+    def UpdateDialog(self, query = None, cats = None):
+        """!Update dialog
+        
+        @param query {coordinates, distance} - v.what
+        @param cats  directory layer/cats    - vdigit
+        Return True if updated otherwise False
+        """
+        # line: {layer: [categories]}
+        self.cats = {}
+        # do not display dialog if no line is found (-> self.cats)
+        if cats is None:
+            ret = self._getCategories(query[0], query[1])
+        else:
+            self.cats = cats
+            for line in cats.keys():
+                for layer in cats[line].keys():
+                    self.cats[line][layer] = list(cats[line][layer])
+            ret = 1
+        if ret == 0 or len(self.cats.keys()) < 1:
+            Debug.msg(3, "VDigitCategoryDialog(): nothing found!")
+            return False
+        
+        # make copy of cats (used for 'reload')
+        self.cats_orig = copy.deepcopy(self.cats)
+
+        # polulate list
+        self.fid = self.cats.keys()[0]
+        self.itemDataMap = self.list.Populate(self.cats[self.fid],
+                                              update = True)
+
+        try:
+            newCat = max(self.cats[self.fid][1]) + 1
+        except KeyError:
+            newCat = 1
+        self.catNew.SetValue(newCat)
+        
+        if len(self.cats.keys()) == 1:
+            self.fidText.Show(True)
+            self.fidMulti.Show(False)
+            self.fidText.SetLabel("%d" % self.fid)
+        else:
+            self.fidText.Show(False)
+            self.fidMulti.Show(True)
+            choices = []
+            for fid in self.cats.keys():
+                choices.append(str(fid))
+            self.fidMulti.SetItems(choices)
+            self.fidMulti.SetSelection(0)
+
+        self.Layout()
+        
+        return True
+
+class CategoryListCtrl(wx.ListCtrl,
+                       listmix.ListCtrlAutoWidthMixin,
+                       listmix.TextEditMixin):
+    def __init__(self, parent, id, pos = wx.DefaultPosition,
+                 size = wx.DefaultSize, style = 0):
+        """!List of layers/categories"""
+        self.parent = parent
+        
+        wx.ListCtrl.__init__(self, parent, id, pos, size, style)
+
+        listmix.ListCtrlAutoWidthMixin.__init__(self)
+        listmix.TextEditMixin.__init__(self)
+
+    def Populate(self, cats, update = False):
+        """!Populate the list
+        """
+        itemData = {} # requested by sorter
+
+        if not update:
+            self.InsertColumn(0, _("Layer"))
+            self.InsertColumn(1, _("Category"))
+        else:
+            self.DeleteAllItems()
+
+        i = 1
+        for layer in cats.keys():
+            catsList = cats[layer]
+            for cat in catsList:
+                index = self.InsertStringItem(sys.maxint, str(catsList[0]))
+                self.SetStringItem(index, 0, str(layer))
+                self.SetStringItem(index, 1, str(cat))
+                self.SetItemData(index, i)
+                itemData[i] = (str(layer), str(cat))
+                i = i + 1
+
+        if not update:
+            self.SetColumnWidth(0, 100)
+            self.SetColumnWidth(1, wx.LIST_AUTOSIZE)
+
+        self.currentItem = 0
+
+        return itemData
+
+class VDigitZBulkDialog(wx.Dialog):
+    def __init__(self, parent, title, nselected, style = wx.DEFAULT_DIALOG_STYLE):
+        """!Dialog used for Z bulk-labeling tool
+        """
+        wx.Dialog.__init__(self, parent = parent, id = wx.ID_ANY, title = title, style = style)
+
+        self.parent = parent # mapdisplay.BufferedWindow class instance
+
+        # panel  = wx.Panel(parent=self, id=wx.ID_ANY)
+
+        border = wx.BoxSizer(wx.VERTICAL)
+        
+        txt = wx.StaticText(parent = self,
+                            label = _("%d lines selected for z bulk-labeling") % nselected);
+        border.Add(item = txt, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
+
+        box   = wx.StaticBox (parent = self, id = wx.ID_ANY, label = " %s " % _("Set value"))
+        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        flexSizer = wx.FlexGridSizer (cols = 2, hgap = 5, vgap = 5)
+        flexSizer.AddGrowableCol(0)
+
+        # starting value
+        txt = wx.StaticText(parent = self,
+                            label = _("Starting value"));
+        self.value = wx.SpinCtrl(parent = self, id = wx.ID_ANY, size = (150, -1),
+                                 initial = 0,
+                                 min = -1e6, max = 1e6)
+        flexSizer.Add(txt, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
+        flexSizer.Add(self.value, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
+
+        # step
+        txt = wx.StaticText(parent = self,
+                            label = _("Step"))
+        self.step  = wx.SpinCtrl(parent = self, id = wx.ID_ANY, size = (150, -1),
+                                 initial = 0,
+                                 min = 0, max = 1e6)
+        flexSizer.Add(txt, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
+        flexSizer.Add(self.step, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
+
+        sizer.Add(item = flexSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 1)
+        border.Add(item = sizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 0)
+
+        # buttons
+        btnCancel = wx.Button(self, wx.ID_CANCEL)
+        btnOk = wx.Button(self, wx.ID_OK)
+        btnOk.SetDefault()
+
+        # sizers
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(btnCancel)
+        btnSizer.AddButton(btnOk)
+        btnSizer.Realize()
+        
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        mainSizer.Add(item = border, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
+        mainSizer.Add(item = btnSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+
+        self.SetSizer(mainSizer)
+        mainSizer.Fit(self)
+
+class VDigitDuplicatesDialog(wx.Dialog):
+    def __init__(self, parent, data, title = _("List of duplicates"),
+                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER,
+                 pos = wx.DefaultPosition):
+        """!Show duplicated feature ids
+        """
+        wx.Dialog.__init__(self, parent = parent, id = wx.ID_ANY, title = title, style = style,
+                           pos = pos)
+        
+        self.parent = parent # BufferedWindow
+        self.data = data
+        self.winList = []
+
+        # panel  = wx.Panel(parent=self, id=wx.ID_ANY)
+
+        # notebook
+        self.notebook = wx.Notebook(parent = self, id = wx.ID_ANY, style = wx.BK_DEFAULT)
+
+        id = 1
+        for key in self.data.keys():
+            panel = wx.Panel(parent = self.notebook, id = wx.ID_ANY)
+            self.notebook.AddPage(page = panel, text = " %d " % (id))
+            
+            # notebook body
+            border = wx.BoxSizer(wx.VERTICAL)
+
+            win = CheckListFeature(parent = panel, data = list(self.data[key]))
+            self.winList.append(win.GetId())
+
+            border.Add(item = win, proportion = 1,
+                       flag = wx.ALL | wx.EXPAND, border = 5)
+
+            panel.SetSizer(border)
+
+            id += 1
+
+        # buttons
+        btnCancel = wx.Button(self, wx.ID_CANCEL)
+        btnOk = wx.Button(self, wx.ID_OK)
+        btnOk.SetDefault()
+
+        # sizers
+        btnSizer = wx.StdDialogButtonSizer()
+        btnSizer.AddButton(btnCancel)
+        btnSizer.AddButton(btnOk)
+        btnSizer.Realize()
+        
+        mainSizer = wx.BoxSizer(wx.VERTICAL)
+        mainSizer.Add(item = self.notebook, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
+        mainSizer.Add(item = btnSizer, proportion = 0,
+                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
+
+        self.SetSizer(mainSizer)
+        mainSizer.Fit(self)
+        self.SetAutoLayout(True)
+
+        # set min size for dialog
+        self.SetMinSize((250, 180))
+
+    def GetUnSelected(self):
+        """!Get unselected items (feature id)
+
+        @return list of ids
+        """
+        ids = []
+        for id in self.winList:
+            wlist = self.FindWindowById(id)
+
+            for item in range(wlist.GetItemCount()):
+                if not wlist.IsChecked(item):
+                    ids.append(int(wlist.GetItem(item, 0).GetText()))
+                    
+        return ids
+
+class CheckListFeature(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.CheckListCtrlMixin):
+    def __init__(self, parent, data,
+                 pos = wx.DefaultPosition, log = None):
+        """!List of mapset/owner/group
+        """
+        self.parent = parent
+        self.data = data
+
+        wx.ListCtrl.__init__(self, parent, wx.ID_ANY,
+                             style = wx.LC_REPORT)
+
+        listmix.CheckListCtrlMixin.__init__(self)
+
+        self.log = log
+
+        # setup mixins
+        listmix.ListCtrlAutoWidthMixin.__init__(self)
+
+        self.LoadData(self.data)
+
+    def LoadData(self, data):
+        """!Load data into list
+        """
+        self.InsertColumn(0, _('Feature id'))
+        self.InsertColumn(1, _('Layer (Categories)'))
+
+        for item in data:
+            index = self.InsertStringItem(sys.maxint, str(item[0]))
+            self.SetStringItem(index, 1, str(item[1]))
+
+        # enable all items by default
+        for item in range(self.GetItemCount()):
+            self.CheckItem(item, True)
+
+        self.SetColumnWidth(col = 0, width = wx.LIST_AUTOSIZE_USEHEADER)
+        self.SetColumnWidth(col = 1, width = wx.LIST_AUTOSIZE_USEHEADER)
+                
+    def OnCheckItem(self, index, flag):
+        """!Mapset checked/unchecked
+        """
+        pass
diff --git a/gui/wxpython/vdigit/main.py b/gui/wxpython/vdigit/main.py
new file mode 100644
index 0000000..a7f9794
--- /dev/null
+++ b/gui/wxpython/vdigit/main.py
@@ -0,0 +1,35 @@
+"""!
+ at package vdigit.main
+
+ at brief wxGUI vector digitizer
+
+Classes:
+ - main::VDigit
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+
+try:
+    from vdigit.wxdigit import IVDigit, GV_LINES
+    haveVDigit = True
+    errorMsg   = ''
+except (ImportError, NameError), err:
+    haveVDigit = False
+    errorMsg   = err
+    GV_LINES   = -1
+    class IVDigit:
+        def __init__(self):
+            pass
+
+class VDigit(IVDigit):
+    def __init__(self, mapwindow):
+        """!Base class of vector digitizer
+        
+        @param mapwindow reference to mapwindow (mapdisp_window.BufferedWindow) instance
+        """
+        IVDigit.__init__(self, mapwindow)
diff --git a/gui/wxpython/gui_modules/mapdisp_vdigit.py b/gui/wxpython/vdigit/mapwindow.py
similarity index 92%
rename from gui/wxpython/gui_modules/mapdisp_vdigit.py
rename to gui/wxpython/vdigit/mapwindow.py
index b2f4de9..d586fe7 100644
--- a/gui/wxpython/gui_modules/mapdisp_vdigit.py
+++ b/gui/wxpython/vdigit/mapwindow.py
@@ -1,34 +1,29 @@
 """!
- at package mapdisp_vdigit.py
+ at package vdigit.mapwindow
 
- at brief Map display canvas extended for vector digitizer
-
-See also vdigit.py, wxvdriver.py and wxvdigit.py
+ at brief Map display canvas for wxGUI vector digitizer
 
 Classes:
- - VDigitWindow
+ - mapwindow::VDigitWindow
 
 (C) 2011 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Martin Landa <landa.martin gmail.com>
 """
 
 import wx
 
-import dbm_dialogs
-
-import gcmd
-from debug          import Debug
-from mapdisp_window import BufferedWindow
-from preferences    import globalSettings as UserSettings
-from utils          import ListOfCatsToRange
-from globalvar      import QUERYLAYER
-from vdigit import VDigitCategoryDialog
-from vdigit import VDigitZBulkDialog
-from vdigit import VDigitDuplicatesDialog
+from dbmgr.dialogs  import DisplayAttributesDialog
+from core.gcmd      import RunCommand, GMessage, GError
+from core.debug     import Debug
+from mapdisp.mapwindow import BufferedWindow
+from core.settings  import UserSettings
+from core.utils     import ListOfCatsToRange
+from core.globalvar import QUERYLAYER
+from vdigit.dialogs import VDigitCategoryDialog, VDigitZBulkDialog, VDigitDuplicatesDialog
 
 class VDigitWindow(BufferedWindow):
     """!A Buffered window extended for vector digitizer.
@@ -40,11 +35,16 @@ class VDigitWindow(BufferedWindow):
                                 style, **kwargs)
         
         self.pdcVector = wx.PseudoDC()
-        self.toolbar   = self.parent.toolbars['vdigit']
+        self.toolbar   = self.parent.GetToolbar('vdigit')
         self.digit     = None # wxvdigit.IVDigit
         
         self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
         
+    def GetDisplay(self):
+        if self.digit:
+            return self.digit.GetDisplay()
+        return None
+
     def SetToolbar(self, toolbar):
         """!Set up related toolbar
         """
@@ -71,7 +71,7 @@ class VDigitWindow(BufferedWindow):
             distance_tot += self.Distance(self.polycoords[idx-1],
                                           self.polycoords[idx],
                                           screen = False)[0]
-        self.parent.statusbar.SetStatusText("%.*f, %.*f (seg: %.*f; tot: %.*f)" % \
+        self.parent.SetStatusText("%.*f, %.*f (seg: %.*f; tot: %.*f)" % \
                                                 (precision, e, precision, n,
                                                  precision, distance_seg,
                                                  precision, distance_tot), 0)
@@ -156,10 +156,10 @@ class VDigitWindow(BufferedWindow):
                 posWindow = self.ClientToScreen((self.mouse['end'][0] + self.dialogOffset,
                                                  self.mouse['end'][1] + self.dialogOffset))
                 
-                addRecordDlg = dbm_dialogs.DisplayAttributesDialog(parent = self, map = mapLayer,
-                                                                   cats = cats,
-                                                                   pos = posWindow,
-                                                                   action = "add")
+                addRecordDlg = DisplayAttributesDialog(parent = self, map = mapLayer,
+                                                       cats = cats,
+                                                       pos = posWindow,
+                                                       action = "add", ignoreError = True)
                 
                 if self.toolbar.GetAction('type') == 'centroid':
                     for fid in fids:
@@ -173,10 +173,10 @@ class VDigitWindow(BufferedWindow):
                         sqlfile.file.write(sql + ";\n")
                     sqlfile.file.flush()
                     
-                    gcmd.RunCommand('db.execute',
-                                    parent = self,
-                                    quiet = True, 
-                                    input = sqlfile.name)
+                    RunCommand('db.execute',
+                               parent = self,
+                               quiet = True, 
+                               input = sqlfile.name)
                 
                 if addRecordDlg.mapDBInfo:
                     self._updateATM()
@@ -255,10 +255,10 @@ class VDigitWindow(BufferedWindow):
                                            dbInfo.GetKeyColumn(layer), cat))
             
             sqlfile.file.flush()
-            gcmd.RunCommand('db.execute',
-                            parent = True,
-                            quiet = True,
-                            input = sqlfile.name)
+            RunCommand('db.execute',
+                       parent = True,
+                       quiet = True,
+                       input = sqlfile.name)
             
     def _updateATM(self):
         """!Update open Attribute Table Manager
@@ -343,14 +343,15 @@ class VDigitWindow(BufferedWindow):
             # select attributes based on coordinates (all layers)
             if self.parent.dialogs['attributes'] is None:
                 self.parent.dialogs['attributes'] = \
-                    dbm_dialogs.DisplayAttributesDialog(parent = self, map = mapLayer,
-                                                        cats = cats,
-                                                        action = "update")
+                    DisplayAttributesDialog(parent = self, map = mapLayer,
+                                            cats = cats,
+                                            action = "update")
             else:
                 # upgrade dialog
                 self.parent.dialogs['attributes'].UpdateDialog(cats = cats)
            
-            if self.parent.dialogs['attributes']:
+            if self.parent.dialogs['attributes'] and \
+                    self.parent.dialogs['attributes'].mapDBInfo:
                 if len(cats.keys()) > 0:
                     # highlight feature & re-draw map
                     if not self.parent.dialogs['attributes'].IsShown():
@@ -489,13 +490,18 @@ class VDigitWindow(BufferedWindow):
         try:
             mapLayer = self.toolbar.GetLayer().GetName()
         except:
-            gcmd.GMessage(parent = self,
-                          message = _("No vector map selected for editing."))
+            GMessage(parent = self,
+                     message = _("No vector map selected for editing."))
             event.Skip()
             return
         
         action = self.toolbar.GetAction()
+        
         if not action:
+            GMessage(parent = self,
+                     message = _("Nothing to do. "
+                                 "Choose appropriate tool from digitizer toolbar."))
+            event.Skip()
             return
         
         if action not in ("moveVertex",
@@ -503,9 +509,13 @@ class VDigitWindow(BufferedWindow):
                           "removeVertex",
                           "editLine"):
             # set pen
-            self.pen = wx.Pen(colour = 'Red', width = 2, style = wx.SHORT_DASH)
-            self.polypen = wx.Pen(colour = 'dark green', width = 2, style = wx.SOLID)
-            
+            self.pen = wx.Pen(colour = UserSettings.Get(group = 'vdigit', key = 'symbol',
+                                                        subkey = ['newSegment', 'color']),
+                              width = 2, style = wx.SHORT_DASH)
+            self.polypen = wx.Pen(colour = UserSettings.Get(group = 'vdigit', key = 'symbol',
+                                                            subkey = ['newLine', 'color']),
+                                  width = 2, style = wx.SOLID)
+        
         if action in ("addVertex",
                       "removeVertex",
                       "splitLines"):
@@ -845,8 +855,8 @@ class VDigitWindow(BufferedWindow):
                 mapName = self.toolbar.GetLayer().GetName()
             except:
                 mapName = None
-                gcmd.GError(parent = self,
-                            message = _("No vector map selected for editing."))
+                GError(parent = self,
+                       message = _("No vector map selected for editing."))
                     
             if mapName:
                 if self.toolbar.GetAction('type') == 'line':
@@ -880,10 +890,10 @@ class VDigitWindow(BufferedWindow):
                                 (UserSettings.Get(group = 'vdigit', key = "category", subkey = 'value'), )
                             }}
                     
-                    addRecordDlg = dbm_dialogs.DisplayAttributesDialog(parent = self, map = mapName,
-                                                                       cats = cats,
-                                                                       pos = posWindow,
-                                                                       action = "add")
+                    addRecordDlg = DisplayAttributesDialog(parent = self, map = mapName,
+                                                           cats = cats,
+                                                           pos = posWindow,
+                                                           action = "add", ignoreError = True)
                     
                     for fid in fids:
                         self._geomAttrb(fid, addRecordDlg, 'length')
@@ -898,10 +908,10 @@ class VDigitWindow(BufferedWindow):
                         for sql in addRecordDlg.GetSQLString():
                             sqlfile.file.write(sql + ";\n")
                         sqlfile.file.flush()
-                        gcmd.RunCommand('db.execute',
-                                        parent = True,
-                                        quiet = True,
-                                        input = sqlfile.name)
+                        RunCommand('db.execute',
+                                   parent = True,
+                                   quiet = True,
+                                   input = sqlfile.name)
                         
                     if addRecordDlg.mapDBInfo:
                         self._updateATM()
@@ -1066,4 +1076,3 @@ class VDigitWindow(BufferedWindow):
         self.moveInfo['beginDiff'] = (dx, dy)
         for id in self.moveInfo['id']:
             self.pdcTmp.RemoveId(id)
-        
diff --git a/gui/wxpython/gui_modules/vdigit.py b/gui/wxpython/vdigit/preferences.py
similarity index 57%
rename from gui/wxpython/gui_modules/vdigit.py
rename to gui/wxpython/vdigit/preferences.py
index 3643c77..4e0aba5 100644
--- a/gui/wxpython/gui_modules/vdigit.py
+++ b/gui/wxpython/vdigit/preferences.py
@@ -1,64 +1,30 @@
 """!
- at package vdigit
+ at package vdigit.preferences
 
- at brief Dialogs for wxGUI vector digitizer
+ at brief wxGUI vector digitizer preferences dialogs
 
 Classes:
- - VDigit
- - VDigitSettingsDialog
- - VDigitCategoryDialog
- - CategoryListCtrl
- - VDigitZBulkDialog
- - VDigitDuplicatesDialog
- - CheckListFeature
+ - preferences::VDigitSettingsDialog
 
 (C) 2007-2011 by the GRASS Development Team
+
 This program is free software under the GNU General Public License
 (>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Martin Landa <landa.martin gmail.com>
 """
 
-import os
-import sys
-import string
-import copy
 import textwrap
-import traceback
-
-from threading import Thread
 
 import wx
 import wx.lib.colourselect as csel
-import wx.lib.mixins.listctrl as listmix
-
-import gcmd
-import dbm
-from debug import Debug as Debug
-import gselect
-import globalvar
-from units import Units
-from preferences import globalSettings as UserSettings
-try:
-    from wxvdigit  import IVDigit, GV_LINES
-    haveVDigit = True
-    errorMsg = ''
-except (ImportError, NameError), err:
-    haveVDigit = False
-    errorMsg = err
-    GV_LINES = -1
-    class IVDigit:
-        def __init__(self):
-            pass
-
-class VDigit(IVDigit):
-    def __init__(self, mapwindow):
-        """!Base class of vector digitizer
-        
-        @param mapwindow reference to mapwindow (mapdisp_window.BufferedWindow) instance
-        """
-        IVDigit.__init__(self, mapwindow)
-        
+
+from core             import globalvar
+from core.debug       import Debug
+from gui_core.gselect import ColumnSelect
+from core.units       import Units
+from core.settings    import UserSettings
+
 class VDigitSettingsDialog(wx.Dialog):
     def __init__(self, parent, title, style = wx.DEFAULT_DIALOG_STYLE):
         """!Standard settings dialog for digitization purposes
@@ -70,9 +36,9 @@ class VDigitSettingsDialog(wx.Dialog):
         
         # notebook
         notebook = wx.Notebook(parent = self, id = wx.ID_ANY, style = wx.BK_DEFAULT)
+        self._createGeneralPage(notebook)
         self._createSymbologyPage(notebook)
         self.digit.SetCategory()
-        self._createGeneralPage(notebook)
         self._createAttributesPage(notebook)
         self._createQueryPage(notebook)
 
@@ -123,7 +89,8 @@ class VDigitSettingsDialog(wx.Dialog):
             textLabel = wx.StaticText(panel, wx.ID_ANY, label)
             color = csel.ColourSelect(panel, id = wx.ID_ANY,
                                       colour = UserSettings.Get(group = 'vdigit', key = 'symbol',
-                                                              subkey = [key, 'color']), size = globalvar.DIALOG_COLOR_SIZE)
+                                                                subkey = [key, 'color']),
+                                      size = (40, 25))
             isEnabled = UserSettings.Get(group = 'vdigit', key = 'symbol',
                                          subkey = [key, 'enabled'])
             if isEnabled is not None:
@@ -467,7 +434,7 @@ class VDigitSettingsDialog(wx.Dialog):
             ### self.deleteRecord.SetValue(UserSettings.Get(group='vdigit', key="delRecord", subkey='enabled'))
             check.Bind(wx.EVT_CHECKBOX, self.OnGeomAttrb)
             # column (only numeric)
-            column = gselect.ColumnSelect(parent = panel, size = (200, -1))
+            column = ColumnSelect(parent = panel, size = (200, -1))
             column.InsertColumns(vector = vectorName,
                                  layer = layer, excludeKey = True,
                                  type = ['integer', 'double precision'])
@@ -542,7 +509,8 @@ class VDigitSettingsDialog(wx.Dialog):
         """
 
         return (
-            #            ("Background", "symbolBackground"),
+            (_("Digitize new line segment"), "newSegment"),
+            (_("Digitize new line/boundary"), "newLine"),
             (_("Highlight"), "highlight"),
             (_("Highlight (duplicates)"), "highlightDupl"),
             (_("Point"), "point"),
@@ -606,7 +574,8 @@ class VDigitSettingsDialog(wx.Dialog):
     def OnChangeAddRecord(self, event):
         """!Checkbox 'Add new record' status changed
         """
-        self.category.SetValue(self.digit.SetCategory())
+        pass
+        # self.category.SetValue(self.digit.SetCategory())
             
     def OnChangeSnappingValue(self, event):
         """!Change snapping value - update static text
@@ -811,730 +780,5 @@ class VDigitSettingsDialog(wx.Dialog):
         self.digit.UpdateSettings()
         
         # redraw map if auto-rendering is enabled
-        if self.parent.statusbarWin['render'].GetValue(): 
+        if self.parent.IsAutoRendered(): 
             self.parent.OnRender(None)
-
-class VDigitCategoryDialog(wx.Dialog, listmix.ColumnSorterMixin):
-    def __init__(self, parent, title,
-                 vectorName, query = None, cats = None,
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, **kwargs):
-        """!Dialog used to display/modify categories of vector objects
-        
-        @param parent
-        @param title dialog title
-        @param query {coordinates, qdist} - used by v.edit/v.what
-        @param cats  directory of lines (layer/categories) - used by vdigit
-        @param style dialog style
-        """
-        self.parent = parent       # mapdisplay.BufferedWindow class instance
-        self.digit = parent.digit
-        
-        # map name
-        self.vectorName = vectorName
-        
-        # line : {layer: [categories]}
-        self.cats = {}
-        
-        # do not display dialog if no line is found (-> self.cats)
-        if cats is None:
-            if self._getCategories(query[0], query[1]) == 0 or not self.line:
-                Debug.msg(3, "VDigitCategoryDialog(): nothing found!")
-        else:
-            self.cats = cats
-            for line in cats.keys():
-                for layer in cats[line].keys():
-                    self.cats[line][layer] = list(cats[line][layer])
-            
-            layers = []
-            for layer in self.digit.GetLayers():
-                layers.append(str(layer))
-        
-        # make copy of cats (used for 'reload')
-        self.cats_orig = copy.deepcopy(self.cats)
-        
-        wx.Dialog.__init__(self, parent = self.parent, id = wx.ID_ANY, title = title,
-                           style = style, **kwargs)
-        
-        # list of categories
-        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
-                           label = " %s " % _("List of categories - right-click to delete"))
-        listSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        self.list = CategoryListCtrl(parent = self, id = wx.ID_ANY,
-                                     style = wx.LC_REPORT |
-                                     wx.BORDER_NONE |
-                                     wx.LC_SORT_ASCENDING |
-                                     wx.LC_HRULES |
-                                     wx.LC_VRULES)
-        # sorter
-        self.fid = self.cats.keys()[0]
-        self.itemDataMap = self.list.Populate(self.cats[self.fid])
-        listmix.ColumnSorterMixin.__init__(self, 2)
-        self.fidMulti = wx.Choice(parent = self, id = wx.ID_ANY,
-                                  size = (150, -1))
-        self.fidMulti.Bind(wx.EVT_CHOICE, self.OnFeature)
-        self.fidText = wx.StaticText(parent = self, id = wx.ID_ANY)
-        if len(self.cats.keys()) == 1:
-            self.fidMulti.Show(False)
-            self.fidText.SetLabel(str(self.fid))
-        else:
-            self.fidText.Show(False)
-            choices = []
-            for fid in self.cats.keys():
-                choices.append(str(fid))
-            self.fidMulti.SetItems(choices)
-            self.fidMulti.SetSelection(0)
-        
-        listSizer.Add(item = self.list, proportion = 1, flag = wx.EXPAND)
-
-        # add new category
-        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
-                           label = " %s " % _("Add new category"))
-        addSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        flexSizer = wx.FlexGridSizer (cols = 5, hgap = 5, vgap = 5)
-        flexSizer.AddGrowableCol(3)
-
-        layerNewTxt = wx.StaticText(parent = self, id = wx.ID_ANY,
-                                 label = "%s:" % _("Layer"))
-        self.layerNew = wx.Choice(parent = self, id = wx.ID_ANY, size = (75, -1),
-                                  choices = layers)
-        if len(layers) > 0:
-            self.layerNew.SetSelection(0)
-        
-        catNewTxt = wx.StaticText(parent = self, id = wx.ID_ANY,
-                               label = "%s:" % _("Category"))
-
-        try:
-            newCat = max(self.cats[self.fid][1]) + 1
-        except KeyError:
-            newCat = 1
-        self.catNew = wx.SpinCtrl(parent = self, id = wx.ID_ANY, size = (75, -1),
-                                  initial = newCat, min = 0, max = 1e9)
-        btnAddCat = wx.Button(self, wx.ID_ADD)
-        flexSizer.Add(item = layerNewTxt, proportion = 0,
-                      flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
-        flexSizer.Add(item = self.layerNew, proportion = 0,
-                      flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
-        flexSizer.Add(item = catNewTxt, proportion = 0,
-                      flag = wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.LEFT,
-                      border = 10)
-        flexSizer.Add(item = self.catNew, proportion = 0,
-                      flag = wx.FIXED_MINSIZE | wx.ALIGN_CENTER_VERTICAL)
-        flexSizer.Add(item = btnAddCat, proportion = 0,
-                      flag = wx.EXPAND | wx.ALIGN_RIGHT | wx.FIXED_MINSIZE)
-        addSizer.Add(item = flexSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 5)
-
-        # buttons
-        btnApply = wx.Button(self, wx.ID_APPLY)
-        btnApply.SetToolTipString(_("Apply changes"))
-        btnCancel = wx.Button(self, wx.ID_CANCEL)
-        btnCancel.SetToolTipString(_("Ignore changes and close dialog"))
-        btnOk = wx.Button(self, wx.ID_OK)
-        btnOk.SetToolTipString(_("Apply changes and close dialog"))
-        btnOk.SetDefault()
-
-        # sizers
-        btnSizer = wx.StdDialogButtonSizer()
-        btnSizer.AddButton(btnCancel)
-        #btnSizer.AddButton(btnReload)
-        #btnSizer.SetNegativeButton(btnReload)
-        btnSizer.AddButton(btnApply)
-        btnSizer.AddButton(btnOk)
-        btnSizer.Realize()
-        
-        mainSizer = wx.BoxSizer(wx.VERTICAL)
-        mainSizer.Add(item = listSizer, proportion = 1,
-                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
-        mainSizer.Add(item = addSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALIGN_CENTER |
-                      wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 5)
-        fidSizer = wx.BoxSizer(wx.HORIZONTAL)
-        fidSizer.Add(item = wx.StaticText(parent = self, id = wx.ID_ANY,
-                                        label = _("Feature id:")),
-                     proportion = 0, border = 5,
-                     flag = wx.ALIGN_CENTER_VERTICAL)
-        fidSizer.Add(item = self.fidMulti, proportion = 0,
-                     flag = wx.EXPAND | wx.ALL,  border = 5)
-        fidSizer.Add(item = self.fidText, proportion = 0,
-                     flag = wx.EXPAND | wx.ALL,  border = 5)
-        mainSizer.Add(item = fidSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL, border = 5)
-        mainSizer.Add(item = btnSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
-        
-        self.SetSizer(mainSizer)
-        mainSizer.Fit(self)
-        self.SetAutoLayout(True)
-
-        # set min size for dialog
-        self.SetMinSize(self.GetBestSize())
-
-        # bindings
-        btnApply.Bind(wx.EVT_BUTTON, self.OnApply)
-        btnOk.Bind(wx.EVT_BUTTON, self.OnOK)
-        btnAddCat.Bind(wx.EVT_BUTTON, self.OnAddCat)
-        btnCancel.Bind(wx.EVT_BUTTON, self.OnCancel)
-                                     
-        # list
-        self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightUp) #wxMSW
-        self.list.Bind(wx.EVT_RIGHT_UP, self.OnRightUp) #wxGTK
-        self.Bind(wx.EVT_LIST_BEGIN_LABEL_EDIT, self.OnBeginEdit, self.list)
-        self.Bind(wx.EVT_LIST_END_LABEL_EDIT, self.OnEndEdit, self.list)
-        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self.list)
-
-    def GetListCtrl(self):
-        """!Used by ColumnSorterMixin
-        """
-        return self.list
-
-    def OnColClick(self, event):
-        """!Click on column header (order by)
-        """
-        event.Skip()
-        
-    def OnBeginEdit(self, event):
-        """!Editing of item started
-        """
-        event.Allow()
-
-    def OnEndEdit(self, event):
-        """!Finish editing of item
-        """
-        itemIndex = event.GetIndex()
-        layerOld = int (self.list.GetItem(itemIndex, 0).GetText())
-        catOld = int (self.list.GetItem(itemIndex, 1).GetText())
-
-        if event.GetColumn() == 0:
-            layerNew = int(event.GetLabel())
-            catNew = catOld
-        else:
-            layerNew = layerOld
-            catNew = int(event.GetLabel())
-        
-        try:
-            if layerNew not in self.cats[self.fid].keys():
-                self.cats[self.fid][layerNew] = []
-            self.cats[self.fid][layerNew].append(catNew)
-            self.cats[self.fid][layerOld].remove(catOld)
-        except:
-            event.Veto()
-            self.list.SetStringItem(itemIndex, 0, str(layerNew))
-            self.list.SetStringItem(itemIndex, 1, str(catNew))
-            dlg = wx.MessageDialog(self, _("Unable to add new layer/category <%(layer)s/%(category)s>.\n"
-                                           "Layer and category number must be integer.\n"
-                                           "Layer number must be greater than zero.") %
-                                   { 'layer': self.layerNew.GetStringSelection(),
-                                     'category' : str(self.catNew.GetValue()) },
-                                   _("Error"), wx.OK | wx.ICON_ERROR)
-            dlg.ShowModal()
-            dlg.Destroy()
-            return False
-
-    def OnRightDown(self, event):
-        """!Mouse right button down
-        """
-        x = event.GetX()
-        y = event.GetY()
-        item, flags = self.list.HitTest((x, y))
-
-        if item !=  wx.NOT_FOUND and \
-                flags & wx.LIST_HITTEST_ONITEM:
-            self.list.Select(item)
-
-        event.Skip()
-
-    def OnRightUp(self, event):
-        """!Mouse right button up
-        """
-        if not hasattr(self, "popupID1"):
-            self.popupID1 = wx.NewId()
-            self.popupID2 = wx.NewId()
-            self.popupID3 = wx.NewId()
-            self.Bind(wx.EVT_MENU, self.OnItemDelete,    id = self.popupID1)
-            self.Bind(wx.EVT_MENU, self.OnItemDeleteAll, id = self.popupID2)
-            self.Bind(wx.EVT_MENU, self.OnReload, id = self.popupID3)
-
-        # generate popup-menu
-        menu = wx.Menu()
-        menu.Append(self.popupID1, _("Delete selected"))
-        if self.list.GetFirstSelected() == -1:
-            menu.Enable(self.popupID1, False)
-
-        menu.Append(self.popupID2, _("Delete all"))
-        menu.AppendSeparator()
-        menu.Append(self.popupID3, _("Reload"))
-
-        self.PopupMenu(menu)
-        menu.Destroy()
-
-    def OnItemSelected(self, event):
-        """!Item selected
-        """
-        event.Skip()
-
-    def OnItemDelete(self, event):
-        """!Delete selected item(s) from the list (layer/category pair)
-        """
-        item = self.list.GetFirstSelected()
-        while item != -1:
-            layer = int (self.list.GetItem(item, 0).GetText())
-            cat = int (self.list.GetItem(item, 1).GetText())
-            self.list.DeleteItem(item)
-            self.cats[self.fid][layer].remove(cat)
-
-            item = self.list.GetFirstSelected()
-            
-        event.Skip()
-        
-    def OnItemDeleteAll(self, event):
-        """!Delete all items from the list
-        """
-        self.list.DeleteAllItems()
-        self.cats[self.fid] = {}
-
-        event.Skip()
-
-    def OnFeature(self, event):
-        """!Feature id changed (on duplicates)
-        """
-        self.fid = int(event.GetString())
-        
-        self.itemDataMap = self.list.Populate(self.cats[self.fid],
-                                              update = True)
-
-        try:
-            newCat = max(self.cats[self.fid][1]) + 1
-        except KeyError:
-            newCat = 1
-            
-        self.catNew.SetValue(newCat)
-        
-        event.Skip()
-        
-    def _getCategories(self, coords, qdist):
-        """!Get layer/category pairs for all available
-        layers
-
-        Return True line found or False if not found
-        """
-        ret = gcmd.RunCommand('v.what',
-                              parent = self,
-                              quiet = True,
-                              map = self.vectorName,
-                              east_north = '%f,%f' % \
-                                  (float(coords[0]), float(coords[1])),
-                              distance = qdist)
-
-        if not ret:
-            return False
-
-        for item in ret.splitlines():
-            litem = item.lower()
-            if "id:" in litem: # get line id
-                self.line = int(item.split(':')[1].strip())
-            elif "layer:" in litem: # add layer
-                layer = int(item.split(':')[1].strip())
-                if layer not in self.cats.keys():
-                    self.cats[layer] = []
-            elif "category:" in litem: # add category
-                self.cats[layer].append(int(item.split(':')[1].strip()))
-
-        return True
-
-    def OnReload(self, event):
-        """!Reload button pressed
-        """
-        # restore original list
-        self.cats = copy.deepcopy(self.cats_orig)
-
-        # polulate list
-        self.itemDataMap = self.list.Populate(self.cats[self.fid],
-                                              update = True)
-
-        event.Skip()
-
-    def OnCancel(self, event):
-        """!Cancel button pressed
-        """
-        self.parent.parent.dialogs['category'] = None
-        if self.digit:
-            self.digit.GetDisplay().SetSelected([])
-            self.parent.UpdateMap(render = False)
-        else:
-            self.parent.parent.OnRender(None)
-            
-        self.Close()
-
-    def OnApply(self, event):
-        """!Apply button pressed
-        """
-        for fid in self.cats.keys():
-            newfid = self.ApplyChanges(fid)
-            if fid == self.fid and newfid > 0:
-                self.fid = newfid
-            
-    def ApplyChanges(self, fid):
-        """!Apply changes 
-
-        @param fid feature id
-        """
-        cats = self.cats[fid]
-        cats_orig = self.cats_orig[fid]
-
-        # action : (catsFrom, catsTo)
-        check = {'catadd': (cats,      cats_orig),
-                 'catdel': (cats_orig, cats)}
-
-        newfid = -1
-        
-        # add/delete new category
-        for action, catsCurr in check.iteritems():
-            for layer in catsCurr[0].keys():
-                catList = []
-                for cat in catsCurr[0][layer]:
-                    if layer not in catsCurr[1].keys() or \
-                            cat not in catsCurr[1][layer]:
-                        catList.append(cat)
-                if catList != []:
-                    if action == 'catadd':
-                        add = True
-                    else:
-                        add = False
-                        
-                    newfid = self.digit.SetLineCats(fid, layer,
-                                                    catList, add)
-                    if len(self.cats.keys()) == 1:
-                        self.fidText.SetLabel("%d" % newfid)
-                    else:
-                        choices = self.fidMulti.GetItems()
-                        choices[choices.index(str(fid))] = str(newfid)
-                        self.fidMulti.SetItems(choices)
-                        self.fidMulti.SetStringSelection(str(newfid))
-                    
-                    self.cats[newfid] = self.cats[fid]
-                    del self.cats[fid]
-                    
-                    fid = newfid
-                    if self.fid < 0:
-                        wx.MessageBox(parent = self, message = _("Unable to update vector map."),
-                                      caption = _("Error"), style = wx.OK | wx.ICON_ERROR)
-        
-        self.cats_orig[fid] = copy.deepcopy(cats)
-        
-        return newfid
-
-    def OnOK(self, event):
-        """!OK button pressed
-        """
-        self.OnApply(event)
-        self.OnCancel(event)
-
-    def OnAddCat(self, event):
-        """!Button 'Add' new category pressed
-        """
-        try:
-            layer = int(self.layerNew.GetStringSelection())
-            cat   = int(self.catNew.GetValue())
-            if layer <= 0:
-                raise ValueError
-        except ValueError:
-            gcmd.GError(parent = self,
-                        message = _("Unable to add new layer/category <%(layer)s/%(category)s>.\n"
-                                    "Layer and category number must be integer.\n"
-                                    "Layer number must be greater then zero.") %
-                        {'layer' : str(self.layerNew.GetValue()),
-                         'category' : str(self.catNew.GetValue())})
-            return False
-        
-        if layer not in self.cats[self.fid].keys():
-            self.cats[self.fid][layer] = []
-        
-        self.cats[self.fid][layer].append(cat)
-        
-        # reload list
-        self.itemDataMap = self.list.Populate(self.cats[self.fid],
-                                              update = True)
-        
-        # update category number for add
-        self.catNew.SetValue(cat + 1)
-        
-        event.Skip()
-
-        return True
-
-    def GetLine(self):
-        """!Get id of selected line of 'None' if no line is selected
-        """
-        return self.cats.keys()
-
-    def UpdateDialog(self, query = None, cats = None):
-        """!Update dialog
-        
-        @param query {coordinates, distance} - v.what
-        @param cats  directory layer/cats    - vdigit
-        Return True if updated otherwise False
-        """
-        # line: {layer: [categories]}
-        self.cats = {}
-        # do not display dialog if no line is found (-> self.cats)
-        if cats is None:
-            ret = self._getCategories(query[0], query[1])
-        else:
-            self.cats = cats
-            for line in cats.keys():
-                for layer in cats[line].keys():
-                    self.cats[line][layer] = list(cats[line][layer])
-            ret = 1
-        if ret == 0 or len(self.cats.keys()) < 1:
-            Debug.msg(3, "VDigitCategoryDialog(): nothing found!")
-            return False
-        
-        # make copy of cats (used for 'reload')
-        self.cats_orig = copy.deepcopy(self.cats)
-
-        # polulate list
-        self.fid = self.cats.keys()[0]
-        self.itemDataMap = self.list.Populate(self.cats[self.fid],
-                                              update = True)
-
-        try:
-            newCat = max(self.cats[self.fid][1]) + 1
-        except KeyError:
-            newCat = 1
-        self.catNew.SetValue(newCat)
-        
-        if len(self.cats.keys()) == 1:
-            self.fidText.Show(True)
-            self.fidMulti.Show(False)
-            self.fidText.SetLabel("%d" % self.fid)
-        else:
-            self.fidText.Show(False)
-            self.fidMulti.Show(True)
-            choices = []
-            for fid in self.cats.keys():
-                choices.append(str(fid))
-            self.fidMulti.SetItems(choices)
-            self.fidMulti.SetSelection(0)
-
-        self.Layout()
-        
-        return True
-
-class CategoryListCtrl(wx.ListCtrl,
-                       listmix.ListCtrlAutoWidthMixin,
-                       listmix.TextEditMixin):
-    def __init__(self, parent, id, pos = wx.DefaultPosition,
-                 size = wx.DefaultSize, style = 0):
-        """!List of layers/categories"""
-        self.parent = parent
-        
-        wx.ListCtrl.__init__(self, parent, id, pos, size, style)
-
-        listmix.ListCtrlAutoWidthMixin.__init__(self)
-        listmix.TextEditMixin.__init__(self)
-
-    def Populate(self, cats, update = False):
-        """!Populate the list
-        """
-        itemData = {} # requested by sorter
-
-        if not update:
-            self.InsertColumn(0, _("Layer"))
-            self.InsertColumn(1, _("Category"))
-        else:
-            self.DeleteAllItems()
-
-        i = 1
-        for layer in cats.keys():
-            catsList = cats[layer]
-            for cat in catsList:
-                index = self.InsertStringItem(sys.maxint, str(catsList[0]))
-                self.SetStringItem(index, 0, str(layer))
-                self.SetStringItem(index, 1, str(cat))
-                self.SetItemData(index, i)
-                itemData[i] = (str(layer), str(cat))
-                i = i + 1
-
-        if not update:
-            self.SetColumnWidth(0, 100)
-            self.SetColumnWidth(1, wx.LIST_AUTOSIZE)
-
-        self.currentItem = 0
-
-        return itemData
-
-class VDigitZBulkDialog(wx.Dialog):
-    def __init__(self, parent, title, nselected, style = wx.DEFAULT_DIALOG_STYLE):
-        """!Dialog used for Z bulk-labeling tool
-        """
-        wx.Dialog.__init__(self, parent = parent, id = wx.ID_ANY, title = title, style = style)
-
-        self.parent = parent # mapdisplay.BufferedWindow class instance
-
-        # panel  = wx.Panel(parent=self, id=wx.ID_ANY)
-
-        border = wx.BoxSizer(wx.VERTICAL)
-        
-        txt = wx.StaticText(parent = self,
-                            label = _("%d lines selected for z bulk-labeling") % nselected);
-        border.Add(item = txt, proportion = 0, flag = wx.ALL | wx.EXPAND, border = 5)
-
-        box   = wx.StaticBox (parent = self, id = wx.ID_ANY, label = " %s " % _("Set value"))
-        sizer = wx.StaticBoxSizer(box, wx.VERTICAL)
-        flexSizer = wx.FlexGridSizer (cols = 2, hgap = 5, vgap = 5)
-        flexSizer.AddGrowableCol(0)
-
-        # starting value
-        txt = wx.StaticText(parent = self,
-                            label = _("Starting value"));
-        self.value = wx.SpinCtrl(parent = self, id = wx.ID_ANY, size = (150, -1),
-                                 initial = 0,
-                                 min = -1e6, max = 1e6)
-        flexSizer.Add(txt, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
-        flexSizer.Add(self.value, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
-
-        # step
-        txt = wx.StaticText(parent = self,
-                            label = _("Step"))
-        self.step  = wx.SpinCtrl(parent = self, id = wx.ID_ANY, size = (150, -1),
-                                 initial = 0,
-                                 min = 0, max = 1e6)
-        flexSizer.Add(txt, proportion = 0, flag = wx.ALIGN_CENTER_VERTICAL)
-        flexSizer.Add(self.step, proportion = 0, flag = wx.ALIGN_CENTER | wx.FIXED_MINSIZE)
-
-        sizer.Add(item = flexSizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 1)
-        border.Add(item = sizer, proportion = 1, flag = wx.ALL | wx.EXPAND, border = 0)
-
-        # buttons
-        btnCancel = wx.Button(self, wx.ID_CANCEL)
-        btnOk = wx.Button(self, wx.ID_OK)
-        btnOk.SetDefault()
-
-        # sizers
-        btnSizer = wx.StdDialogButtonSizer()
-        btnSizer.AddButton(btnCancel)
-        btnSizer.AddButton(btnOk)
-        btnSizer.Realize()
-        
-        mainSizer = wx.BoxSizer(wx.VERTICAL)
-        mainSizer.Add(item = border, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
-        mainSizer.Add(item = btnSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
-
-        self.SetSizer(mainSizer)
-        mainSizer.Fit(self)
-
-class VDigitDuplicatesDialog(wx.Dialog):
-    def __init__(self, parent, data, title = _("List of duplicates"),
-                 style = wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER,
-                 pos = wx.DefaultPosition):
-        """!Show duplicated feature ids
-        """
-        wx.Dialog.__init__(self, parent = parent, id = wx.ID_ANY, title = title, style = style,
-                           pos = pos)
-        
-        self.parent = parent # BufferedWindow
-        self.data = data
-        self.winList = []
-
-        # panel  = wx.Panel(parent=self, id=wx.ID_ANY)
-
-        # notebook
-        self.notebook = wx.Notebook(parent = self, id = wx.ID_ANY, style = wx.BK_DEFAULT)
-
-        id = 1
-        for key in self.data.keys():
-            panel = wx.Panel(parent = self.notebook, id = wx.ID_ANY)
-            self.notebook.AddPage(page = panel, text = " %d " % (id))
-            
-            # notebook body
-            border = wx.BoxSizer(wx.VERTICAL)
-
-            win = CheckListFeature(parent = panel, data = list(self.data[key]))
-            self.winList.append(win.GetId())
-
-            border.Add(item = win, proportion = 1,
-                       flag = wx.ALL | wx.EXPAND, border = 5)
-
-            panel.SetSizer(border)
-
-            id += 1
-
-        # buttons
-        btnCancel = wx.Button(self, wx.ID_CANCEL)
-        btnOk = wx.Button(self, wx.ID_OK)
-        btnOk.SetDefault()
-
-        # sizers
-        btnSizer = wx.StdDialogButtonSizer()
-        btnSizer.AddButton(btnCancel)
-        btnSizer.AddButton(btnOk)
-        btnSizer.Realize()
-        
-        mainSizer = wx.BoxSizer(wx.VERTICAL)
-        mainSizer.Add(item = self.notebook, proportion = 1, flag = wx.EXPAND | wx.ALL, border = 5)
-        mainSizer.Add(item = btnSizer, proportion = 0,
-                      flag = wx.EXPAND | wx.ALL | wx.ALIGN_CENTER, border = 5)
-
-        self.SetSizer(mainSizer)
-        mainSizer.Fit(self)
-        self.SetAutoLayout(True)
-
-        # set min size for dialog
-        self.SetMinSize((250, 180))
-
-    def GetUnSelected(self):
-        """!Get unselected items (feature id)
-
-        @return list of ids
-        """
-        ids = []
-        for id in self.winList:
-            wlist = self.FindWindowById(id)
-
-            for item in range(wlist.GetItemCount()):
-                if not wlist.IsChecked(item):
-                    ids.append(int(wlist.GetItem(item, 0).GetText()))
-                    
-        return ids
-
-class CheckListFeature(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.CheckListCtrlMixin):
-    def __init__(self, parent, data,
-                 pos = wx.DefaultPosition, log = None):
-        """!List of mapset/owner/group
-        """
-        self.parent = parent
-        self.data = data
-
-        wx.ListCtrl.__init__(self, parent, wx.ID_ANY,
-                             style = wx.LC_REPORT)
-
-        listmix.CheckListCtrlMixin.__init__(self)
-
-        self.log = log
-
-        # setup mixins
-        listmix.ListCtrlAutoWidthMixin.__init__(self)
-
-        self.LoadData(self.data)
-
-    def LoadData(self, data):
-        """!Load data into list
-        """
-        self.InsertColumn(0, _('Feature id'))
-        self.InsertColumn(1, _('Layer (Categories)'))
-
-        for item in data:
-            index = self.InsertStringItem(sys.maxint, str(item[0]))
-            self.SetStringItem(index, 1, str(item[1]))
-
-        # enable all items by default
-        for item in range(self.GetItemCount()):
-            self.CheckItem(item, True)
-
-        self.SetColumnWidth(col = 0, width = wx.LIST_AUTOSIZE_USEHEADER)
-        self.SetColumnWidth(col = 1, width = wx.LIST_AUTOSIZE_USEHEADER)
-                
-    def OnCheckItem(self, index, flag):
-        """!Mapset checked/unchecked
-        """
-        pass
diff --git a/gui/wxpython/vdigit/toolbars.py b/gui/wxpython/vdigit/toolbars.py
new file mode 100644
index 0000000..1a080a1
--- /dev/null
+++ b/gui/wxpython/vdigit/toolbars.py
@@ -0,0 +1,821 @@
+"""!
+ at package vdigit.toolbars
+
+ at brief wxGUI vector digitizer toolbars
+
+List of classes:
+ - toolbars::VDigitToolbar
+
+(C) 2007-2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Martin Landa <landa.martin gmail.com>
+"""
+import wx
+
+from grass.script import core as grass
+
+from gui_core.toolbars  import BaseToolbar, BaseIcons
+from gui_core.dialogs   import CreateNewVector
+from vdigit.preferences import VDigitSettingsDialog
+from vdigit.main        import VDigit
+from core.debug         import Debug
+from core.settings      import UserSettings
+from core.gcmd          import GError
+from icons.icon         import MetaIcon
+
+class VDigitToolbar(BaseToolbar):
+    """!Toolbar for digitization
+    """
+    def __init__(self, parent, mapcontent, layerTree = None, log = None):
+        self.mapcontent    = mapcontent # Map class instance
+        self.layerTree     = layerTree  # reference to layer tree associated to map display
+        self.log           = log        # log area
+        BaseToolbar.__init__(self, parent)
+        self.digit         = None
+        
+        # currently selected map layer for editing (reference to MapLayer instance)
+        self.mapLayer = None
+        # list of vector layers from Layer Manager (only in the current mapset)
+        self.layers   = [] 
+        
+        self.comboid    = None
+        
+        # only one dialog can be open
+        self.settingsDialog   = None
+        
+        # create toolbars (two rows optionally)
+        self.InitToolbar(self._toolbarData())
+        self.Bind(wx.EVT_TOOL, self.OnTool)
+        
+        # default action (digitize new point, line, etc.)
+        self.action = { 'desc' : '',
+                        'type' : '',
+                        'id'   : -1 }
+        
+        # list of available vector maps
+        self.UpdateListOfLayers(updateTool = True)
+        
+        # realize toolbar
+        self.Realize()
+        # workaround for Mac bug. May be fixed by 2.8.8, but not before then.
+        self.combo.Hide()
+        self.combo.Show()
+        
+        # disable undo/redo
+        self.EnableTool(self.undo, False)
+        ### hide undo - this tool is quite buggy in GRASS 6 
+        self.RemoveTool(self.undo) 
+        
+        # toogle to pointer by default
+        self.OnTool(None)
+        
+        self.FixSize(width = 105)
+        
+    def _toolbarData(self):
+        """!Toolbar data
+        """
+        data = []
+        
+        icons = {
+            'addPoint'        : MetaIcon(img = 'point-create',
+                                         label = _('Digitize new point'),
+                                         desc = _('Left: new point')),
+            'addLine'         : MetaIcon(img = 'line-create',
+                                         label = _('Digitize new line'),
+                                         desc = _('Left: new point; Ctrl+Left: undo last point; Right: close line')),
+            'addBoundary'     : MetaIcon(img = 'boundary-create',
+                                         label = _('Digitize new boundary'),
+                                         desc = _('Left: new point; Ctrl+Left: undo last point; Right: close line')),
+            'addCentroid'     : MetaIcon(img = 'centroid-create',
+                                         label = _('Digitize new centroid'),
+                                         desc = _('Left: new point')),
+            'addArea'         : MetaIcon(img = 'polygon-create',
+                                         label = _('Digitize new area (composition of boundaries without category and one centroid with category)'),
+                                         desc = _('Left: new point')),
+            'addVertex'       : MetaIcon(img = 'vertex-create',
+                                         label = _('Add new vertex'),
+                                         desc = _('Left: Select; Ctrl+Left: Unselect; Right: Confirm')),
+            'deleteLine'      : MetaIcon(img = 'line-delete',
+                                         label = _('Delete feature(s)'),
+                                         desc = _('Left: Select; Ctrl+Left: Unselect; Right: Confirm')),
+            'displayAttr'     : MetaIcon(img = 'attributes-display',
+                                         label = _('Display/update attributes'),
+                                         desc = _('Left: Select')),
+            'displayCats'     : MetaIcon(img = 'cats-display',
+                                         label = _('Display/update categories'),
+                                         desc = _('Left: Select')),
+            'editLine'        : MetaIcon(img = 'line-edit',
+                                         label = _('Edit line/boundary'),
+                                         desc = _('Left: new point; Ctrl+Left: undo last point; Right: close line')),
+            'moveLine'        : MetaIcon(img = 'line-move',
+                                         label = _('Move feature(s)'),
+                                         desc = _('Left: Select; Ctrl+Left: Unselect; Right: Confirm')),
+            'moveVertex'      : MetaIcon(img = 'vertex-move',
+                                         label = _('Move vertex'),
+                                         desc = _('Left: Select; Ctrl+Left: Unselect; Right: Confirm')),
+            'removeVertex'    : MetaIcon(img = 'vertex-delete',
+                                         label = _('Remove vertex'),
+                                         desc = _('Left: Select; Ctrl+Left: Unselect; Right: Confirm')),
+            'settings'        : BaseIcons['settings'].SetLabel(_('Digitization settings')),
+            'quit'            : BaseIcons['quit'].SetLabel(label = _('Quit digitizer'),
+                                                           desc = _('Quit digitizer and save changes')),
+            'help'            : BaseIcons['help'].SetLabel(label = _('Vector Digitizer manual'),
+                                                           desc = _('Show Vector Digitizer manual')),
+            'additionalTools' : MetaIcon(img = 'tools',
+                                         label = _('Additional tools '
+                                                   '(copy, flip, connect, etc.)'),
+                                         desc = _('Left: Select; Ctrl+Left: Unselect; Right: Confirm')),
+            'undo'             : MetaIcon(img = 'undo',
+                                          label = _('Undo'),
+                                          desc = _('Undo previous changes')),
+            }
+        
+        return self._getToolbarData(((None, ),
+                                     ("addPoint", icons["addPoint"],
+                                      self.OnAddPoint,
+                                      wx.ITEM_CHECK),
+                                     ("addLine", icons["addLine"],
+                                      self.OnAddLine,
+                                      wx.ITEM_CHECK),
+                                     ("addBoundary", icons["addBoundary"],
+                                      self.OnAddBoundary,
+                                      wx.ITEM_CHECK),
+                                     ("addCentroid", icons["addCentroid"],
+                                      self.OnAddCentroid,
+                                      wx.ITEM_CHECK),
+                                     ("addArea", icons["addArea"],
+                                      self.OnAddArea,
+                                      wx.ITEM_CHECK),
+                                     ("moveVertex", icons["moveVertex"],
+                                      self.OnMoveVertex,
+                                      wx.ITEM_CHECK),
+                                     ("addVertex", icons["addVertex"],
+                                      self.OnAddVertex,
+                                      wx.ITEM_CHECK),
+                                     ("removeVertex", icons["removeVertex"],
+                                      self.OnRemoveVertex,
+                                      wx.ITEM_CHECK),
+                                     ("editLine", icons["editLine"],
+                                      self.OnEditLine,
+                                      wx.ITEM_CHECK),
+                                     ("moveLine", icons["moveLine"],
+                                      self.OnMoveLine,
+                                      wx.ITEM_CHECK),
+                                     ("deleteLine", icons["deleteLine"],
+                                      self.OnDeleteLine,
+                                      wx.ITEM_CHECK),
+                                     ("displayCats", icons["displayCats"],
+                                      self.OnDisplayCats,
+                                      wx.ITEM_CHECK),
+                                     ("displayAttr", icons["displayAttr"],
+                                      self.OnDisplayAttr,
+                                      wx.ITEM_CHECK),
+                                     ("additionalTools", icons["additionalTools"],
+                                      self.OnAdditionalToolMenu,
+                                      wx.ITEM_CHECK),                                      
+                                     (None, ),
+                                     ("undo", icons["undo"],
+                                      self.OnUndo),
+                                     ("settings", icons["settings"],
+                                      self.OnSettings),
+                                     ("help", icons["help"],
+                                      self.OnHelp),
+                                     ("quit", icons["quit"],
+                                      self.OnExit))
+                                    )
+    
+    def OnTool(self, event):
+        """!Tool selected -> disable selected tool in map toolbar"""
+        aId = self.parent.toolbars['map'].GetAction(type = 'id')
+        self.parent.toolbars['map'].ToggleTool(aId, False)
+        
+        # set cursor
+        cursor = self.parent.cursors["cross"]
+        self.parent.MapWindow.SetCursor(cursor)
+        
+        # pointer
+        self.parent.OnPointer(None)
+        
+        if event:
+            # deselect previously selected tool
+            aId = self.action.get('id', -1)
+            if aId != event.GetId() and \
+                    self.action['id'] != -1:
+                self.ToggleTool(self.action['id'], False)
+            else:
+                self.ToggleTool(self.action['id'], True)
+            
+            self.action['id'] = event.GetId()
+            
+            event.Skip()
+        
+        if self.action['id'] != -1:
+            self.ToggleTool(self.action['id'], True)
+        
+        # clear tmp canvas
+        if self.action['id'] != aId:
+            self.parent.MapWindow.ClearLines(pdc = self.parent.MapWindow.pdcTmp)
+            if self.digit and \
+                    len(self.parent.MapWindow.digit.GetDisplay().GetSelected()) > 0:
+                # cancel action
+                self.parent.MapWindow.OnMiddleDown(None)
+        
+        # set focus
+        self.parent.MapWindow.SetFocus()
+        
+    def OnAddPoint(self, event):
+        """!Add point to the vector map Laier"""
+        Debug.msg (2, "VDigitToolbar.OnAddPoint()")
+        self.action = { 'desc' : "addLine",
+                        'type' : "point",
+                        'id'   : self.addPoint }
+        self.parent.MapWindow.mouse['box'] = 'point'
+        
+    def OnAddLine(self, event):
+        """!Add line to the vector map layer"""
+        Debug.msg (2, "VDigitToolbar.OnAddLine()")
+        self.action = { 'desc' : "addLine",
+                        'type' : "line",
+                        'id'   : self.addLine }
+        self.parent.MapWindow.mouse['box'] = 'line'
+        ### self.parent.MapWindow.polycoords = [] # reset temp line
+                
+    def OnAddBoundary(self, event):
+        """!Add boundary to the vector map layer"""
+        Debug.msg (2, "VDigitToolbar.OnAddBoundary()")
+        if self.action['desc'] != 'addLine' or \
+                self.action['type'] != 'boundary':
+            self.parent.MapWindow.polycoords = [] # reset temp line
+        self.action = { 'desc' : "addLine",
+                        'type' : "boundary",
+                        'id'   : self.addBoundary }
+        self.parent.MapWindow.mouse['box'] = 'line'
+        
+    def OnAddCentroid(self, event):
+        """!Add centroid to the vector map layer"""
+        Debug.msg (2, "VDigitToolbar.OnAddCentroid()")
+        self.action = { 'desc' : "addLine",
+                        'type' : "centroid",
+                        'id'   : self.addCentroid }
+        self.parent.MapWindow.mouse['box'] = 'point'
+
+    def OnAddArea(self, event):
+        """!Add area to the vector map layer"""
+        Debug.msg (2, "VDigitToolbar.OnAddCentroid()")
+        self.action = { 'desc' : "addLine",
+                        'type' : "area",
+                        'id'   : self.addArea }
+        self.parent.MapWindow.mouse['box'] = 'line'
+
+    def OnExit (self, event=None):
+        """!Quit digitization tool"""
+        # stop editing of the currently selected map layer
+        if self.mapLayer:
+            self.StopEditing()
+        
+        # close dialogs if still open
+        if self.settingsDialog:
+            self.settingsDialog.OnCancel(None)
+            
+        # set default mouse settings
+        self.parent.MapWindow.mouse['use'] = "pointer"
+        self.parent.MapWindow.mouse['box'] = "point"
+        self.parent.MapWindow.polycoords = []
+        
+        # disable the toolbar
+        self.parent.RemoveToolbar("vdigit")
+        
+    def OnMoveVertex(self, event):
+        """!Move line vertex"""
+        Debug.msg(2, "Digittoolbar.OnMoveVertex():")
+        self.action = { 'desc' : "moveVertex",
+                        'id'   : self.moveVertex }
+        self.parent.MapWindow.mouse['box'] = 'point'
+
+    def OnAddVertex(self, event):
+        """!Add line vertex"""
+        Debug.msg(2, "Digittoolbar.OnAddVertex():")
+        self.action = { 'desc' : "addVertex",
+                        'id'   : self.addVertex }
+        self.parent.MapWindow.mouse['box'] = 'point'
+        
+    def OnRemoveVertex(self, event):
+        """!Remove line vertex"""
+        Debug.msg(2, "Digittoolbar.OnRemoveVertex():")
+        self.action = { 'desc' : "removeVertex",
+                        'id'   : self.removeVertex }
+        self.parent.MapWindow.mouse['box'] = 'point'
+
+    def OnEditLine(self, event):
+        """!Edit line"""
+        Debug.msg(2, "Digittoolbar.OnEditLine():")
+        self.action = { 'desc' : "editLine",
+                        'id'   : self.editLine }
+        self.parent.MapWindow.mouse['box'] = 'line'
+
+    def OnMoveLine(self, event):
+        """!Move line"""
+        Debug.msg(2, "Digittoolbar.OnMoveLine():")
+        self.action = { 'desc' : "moveLine",
+                        'id'   : self.moveLine }
+        self.parent.MapWindow.mouse['box'] = 'box'
+
+    def OnDeleteLine(self, event):
+        """!Delete line"""
+        Debug.msg(2, "Digittoolbar.OnDeleteLine():")
+        self.action = { 'desc' : "deleteLine",
+                        'id'   : self.deleteLine }
+        self.parent.MapWindow.mouse['box'] = 'box'
+
+    def OnDisplayCats(self, event):
+        """!Display/update categories"""
+        Debug.msg(2, "Digittoolbar.OnDisplayCats():")
+        self.action = { 'desc' : "displayCats",
+                        'id'   : self.displayCats }
+        self.parent.MapWindow.mouse['box'] = 'point'
+
+    def OnDisplayAttr(self, event):
+        """!Display/update attributes"""
+        Debug.msg(2, "Digittoolbar.OnDisplayAttr():")
+        self.action = { 'desc' : "displayAttrs",
+                        'id'   : self.displayAttr }
+        self.parent.MapWindow.mouse['box'] = 'point'
+        
+    def OnUndo(self, event):
+        """!Undo previous changes"""
+        self.digit.Undo()
+        
+        event.Skip()
+
+    def EnableUndo(self, enable=True):
+        """!Enable 'Undo' in toolbar
+        
+        @param enable False for disable
+        """
+        if not self.FindById(self.undo):
+            return
+        
+        if enable:
+            if self.GetToolEnabled(self.undo) is False:
+                self.EnableTool(self.undo, True)
+        else:
+            if self.GetToolEnabled(self.undo) is True:
+                self.EnableTool(self.undo, False)
+        
+    def OnSettings(self, event):
+        """!Show settings dialog"""
+        if self.digit is None:
+            try:
+                self.digit = self.parent.MapWindow.digit = VDigit(mapwindow = self.parent.MapWindow)
+            except SystemExit:
+                self.digit = self.parent.MapWindow.digit = None
+        
+        if not self.settingsDialog:
+            self.settingsDialog = VDigitSettingsDialog(parent = self.parent, title = _("Digitization settings"),
+                                                       style = wx.DEFAULT_DIALOG_STYLE)
+            self.settingsDialog.Show()
+
+    def OnHelp(self, event):
+        """!Show digitizer help page in web browser"""
+        log = self.parent.GetLayerManager().GetLogWindow()
+        log.RunCmd(['g.manual',
+                    'entry=wxGUI.Vector_Digitizer'])
+
+    def OnAdditionalToolMenu(self, event):
+        """!Menu for additional tools"""
+        point = wx.GetMousePosition()
+        toolMenu = wx.Menu()
+        
+        for label, itype, handler, desc in (
+            (_('Break selected lines/boundaries at intersection'),
+             wx.ITEM_CHECK, self.OnBreak, "breakLine"),
+            (_('Connect selected lines/boundaries'),
+             wx.ITEM_CHECK, self.OnConnect, "connectLine"),
+            (_('Copy categories'),
+             wx.ITEM_CHECK, self.OnCopyCats, "copyCats"),
+            (_('Copy features from (background) vector map'),
+             wx.ITEM_CHECK, self.OnCopy, "copyLine"),
+            (_('Copy attributes'),
+             wx.ITEM_CHECK, self.OnCopyAttrb, "copyAttrs"),
+            (_('Feature type conversion'),
+             wx.ITEM_CHECK, self.OnTypeConversion, "typeConv"),
+            (_('Flip selected lines/boundaries'),
+             wx.ITEM_CHECK, self.OnFlip, "flipLine"),
+            (_('Merge selected lines/boundaries'),
+             wx.ITEM_CHECK, self.OnMerge, "mergeLine"),
+            (_('Snap selected lines/boundaries (only to nodes)'),
+             wx.ITEM_CHECK, self.OnSnap, "snapLine"),
+            (_('Split line/boundary'),
+             wx.ITEM_CHECK, self.OnSplitLine, "splitLine"),
+            (_('Query features'),
+             wx.ITEM_CHECK, self.OnQuery, "queryLine"),
+            (_('Z bulk-labeling of 3D lines'),
+             wx.ITEM_CHECK, self.OnZBulk, "zbulkLine")):
+            # Add items to the menu
+            item = wx.MenuItem(parentMenu = toolMenu, id = wx.ID_ANY,
+                               text = label,
+                               kind = itype)
+            toolMenu.AppendItem(item)
+            self.parent.MapWindow.Bind(wx.EVT_MENU, handler, item)
+            if self.action['desc'] == desc:
+                item.Check(True)
+        
+        # Popup the menu.  If an item is selected then its handler
+        # will be called before PopupMenu returns.
+        self.parent.MapWindow.PopupMenu(toolMenu)
+        toolMenu.Destroy()
+        
+        if self.action['desc'] == 'addPoint':
+            self.ToggleTool(self.additionalTools, False)
+        
+    def OnCopy(self, event):
+        """!Copy selected features from (background) vector map"""
+        if self.action['desc'] == 'copyLine': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.additionalTools, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnCopy():")
+        self.action = { 'desc' : "copyLine",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'box'
+
+    def OnSplitLine(self, event):
+        """!Split line"""
+        if self.action['desc'] == 'splitLine': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.additionalTools, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnSplitLine():")
+        self.action = { 'desc' : "splitLine",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'point'
+
+
+    def OnCopyCats(self, event):
+        """!Copy categories"""
+        if self.action['desc'] == 'copyCats': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.copyCats, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnCopyCats():")
+        self.action = { 'desc' : "copyCats",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'point'
+
+    def OnCopyAttrb(self, event):
+        """!Copy attributes"""
+        if self.action['desc'] == 'copyAttrs': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.copyCats, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnCopyAttrb():")
+        self.action = { 'desc' : "copyAttrs",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'point'
+        
+
+    def OnFlip(self, event):
+        """!Flip selected lines/boundaries"""
+        if self.action['desc'] == 'flipLine': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.additionalTools, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnFlip():")
+        self.action = { 'desc' : "flipLine",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'box'
+
+    def OnMerge(self, event):
+        """!Merge selected lines/boundaries"""
+        if self.action['desc'] == 'mergeLine': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.additionalTools, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnMerge():")
+        self.action = { 'desc' : "mergeLine",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'box'
+
+    def OnBreak(self, event):
+        """!Break selected lines/boundaries"""
+        if self.action['desc'] == 'breakLine': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.additionalTools, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnBreak():")
+        self.action = { 'desc' : "breakLine",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'box'
+
+    def OnSnap(self, event):
+        """!Snap selected features"""
+        if self.action['desc'] == 'snapLine': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.additionalTools, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnSnap():")
+        self.action = { 'desc' : "snapLine",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'box'
+
+    def OnConnect(self, event):
+        """!Connect selected lines/boundaries"""
+        if self.action['desc'] == 'connectLine': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.additionalTools, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnConnect():")
+        self.action = { 'desc' : "connectLine",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'box'
+
+    def OnQuery(self, event):
+        """!Query selected lines/boundaries"""
+        if self.action['desc'] == 'queryLine': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.additionalTools, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnQuery(): %s" % \
+                      UserSettings.Get(group = 'vdigit', key = 'query', subkey = 'selection'))
+        self.action = { 'desc' : "queryLine",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'box'
+
+    def OnZBulk(self, event):
+        """!Z bulk-labeling selected lines/boundaries"""
+        if not self.digit.IsVector3D():
+            GError(parent = self.parent,
+                   message = _("Vector map is not 3D. Operation canceled."))
+            return
+        
+        if self.action['desc'] == 'zbulkLine': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.additionalTools, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnZBulk():")
+        self.action = { 'desc' : "zbulkLine",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'line'
+
+    def OnTypeConversion(self, event):
+        """!Feature type conversion
+
+        Supported conversions:
+         - point <-> centroid
+         - line <-> boundary
+        """
+        if self.action['desc'] == 'typeConv': # select previous action
+            self.ToggleTool(self.addPoint, True)
+            self.ToggleTool(self.additionalTools, False)
+            self.OnAddPoint(event)
+            return
+        
+        Debug.msg(2, "Digittoolbar.OnTypeConversion():")
+        self.action = { 'desc' : "typeConv",
+                        'id'   : self.additionalTools }
+        self.parent.MapWindow.mouse['box'] = 'box'
+
+    def OnSelectMap (self, event):
+        """!Select vector map layer for editing
+
+        If there is a vector map layer already edited, this action is
+        firstly terminated. The map layer is closed. After this the
+        selected map layer activated for editing.
+        """
+        if event.GetSelection() == 0: # create new vector map layer
+            if self.mapLayer:
+                openVectorMap = self.mapLayer.GetName(fullyQualified = False)['name']
+            else:
+                openVectorMap = None
+            dlg = CreateNewVector(self.parent,
+                                  exceptMap = openVectorMap, log = self.log,
+                                  cmd = (('v.edit',
+                                          { 'tool' : 'create' },
+                                          'map')),
+                                  disableAdd = True)
+            
+            if dlg and dlg.GetName():
+                # add layer to map layer tree
+                if self.layerTree:
+                    mapName = dlg.GetName() + '@' + grass.gisenv()['MAPSET']
+                    self.layerTree.AddLayer(ltype = 'vector',
+                                            lname = mapName,
+                                            lcmd = ['d.vect', 'map=%s' % mapName])
+                    
+                    vectLayers = self.UpdateListOfLayers(updateTool = True)
+                    selection = vectLayers.index(mapName)
+                
+                # create table ?
+                if dlg.IsChecked('table'):
+                    lmgr = self.parent.GetLayerManager()
+                    if lmgr:
+                        lmgr.OnShowAttributeTable(None, selection = 'table')
+                dlg.Destroy()
+            else:
+                self.combo.SetValue(_('Select vector map'))
+                if dlg:
+                    dlg.Destroy()
+                return
+        else:
+            selection = event.GetSelection() - 1 # first option is 'New vector map'
+        
+        # skip currently selected map
+        if self.layers[selection] == self.mapLayer:
+            return
+        
+        if self.mapLayer:
+            # deactive map layer for editing
+            self.StopEditing()
+        
+        # select the given map layer for editing
+        self.StartEditing(self.layers[selection])
+        
+        event.Skip()
+        
+    def StartEditing (self, mapLayer):
+        """!Start editing selected vector map layer.
+        
+        @param mapLayer MapLayer to be edited
+        """
+        # deactive layer
+        self.mapcontent.ChangeLayerActive(mapLayer, False)
+        
+        # clean map canvas
+        self.parent.MapWindow.EraseMap()
+        
+        # unset background map if needed
+        if mapLayer:
+            if UserSettings.Get(group = 'vdigit', key = 'bgmap',
+                                subkey = 'value', internal = True) == mapLayer.GetName():
+                UserSettings.Set(group = 'vdigit', key = 'bgmap',
+                                 subkey = 'value', value = '', internal = True)
+            
+            self.parent.SetStatusText(_("Please wait, "
+                                        "opening vector map <%s> for editing...") % mapLayer.GetName(),
+                                        0)
+        
+        self.parent.MapWindow.pdcVector = wx.PseudoDC()
+        self.digit = self.parent.MapWindow.digit = VDigit(mapwindow = self.parent.MapWindow)
+        
+        self.mapLayer = mapLayer
+        
+        # open vector map
+        if self.digit.OpenMap(mapLayer.GetName()) is None:
+            self.mapLayer = None
+            self.StopEditing()
+            return False
+        
+        # update toolbar
+        self.combo.SetValue(mapLayer.GetName())
+        self.parent.toolbars['map'].combo.SetValue (_('Digitize'))
+        lmgr = self.parent.GetLayerManager()
+        if lmgr:
+            lmgr.toolbars['tools'].Enable('vdigit', enable = False)
+        
+        Debug.msg (4, "VDigitToolbar.StartEditing(): layer=%s" % mapLayer.GetName())
+        
+        # change cursor
+        if self.parent.MapWindow.mouse['use'] == 'pointer':
+            self.parent.MapWindow.SetCursor(self.parent.cursors["cross"])
+        
+        if not self.parent.MapWindow.resize:
+            self.parent.MapWindow.UpdateMap(render = True)
+        
+        # respect opacity
+        opacity = mapLayer.GetOpacity(float = True)
+        if opacity < 1.0:
+            alpha = int(opacity * 255)
+            self.digit.GetDisplay().UpdateSettings(alpha = alpha)
+        
+        return True
+
+    def StopEditing(self):
+        """!Stop editing of selected vector map layer.
+
+        @return True on success
+        @return False on failure
+        """
+        self.combo.SetValue (_('Select vector map'))
+        
+        # save changes
+        if self.mapLayer:
+            Debug.msg (4, "VDigitToolbar.StopEditing(): layer=%s" % self.mapLayer.GetName())
+            if UserSettings.Get(group = 'vdigit', key = 'saveOnExit', subkey = 'enabled') is False:
+                if self.digit.GetUndoLevel() > -1:
+                    dlg = wx.MessageDialog(parent = self.parent,
+                                           message = _("Do you want to save changes "
+                                                     "in vector map <%s>?") % self.mapLayer.GetName(),
+                                           caption = _("Save changes?"),
+                                           style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+                    if dlg.ShowModal() == wx.ID_NO:
+                        # revert changes
+                        self.digit.Undo(0)
+                    dlg.Destroy()
+            
+            self.parent.SetStatusText(_("Please wait, "
+                                        "closing and rebuilding topology of "
+                                        "vector map <%s>...") % self.mapLayer.GetName(),
+                                      0)
+            self.digit.CloseMap()
+            
+            lmgr = self.parent.GetLayerManager()
+            if lmgr:
+                lmgr.toolbars['tools'].Enable('vdigit', enable = True)
+                lmgr.GetLogWindow().GetProgressBar().SetValue(0)
+                lmgr.GetLogWindow().WriteCmdLog(_("Editing of vector map <%s> successfully finished") % \
+                                                    self.mapLayer.GetName(),
+                                                switchPage = False)
+            # re-active layer 
+            item = self.parent.tree.FindItemByData('maplayer', self.mapLayer)
+            if item and self.parent.tree.IsItemChecked(item):
+                self.mapcontent.ChangeLayerActive(self.mapLayer, True)
+        
+        # change cursor
+        self.parent.MapWindow.SetCursor(self.parent.cursors["default"])
+        self.parent.MapWindow.pdcVector = None
+        
+        # close dialogs
+        for dialog in ('attributes', 'category'):
+            if self.parent.dialogs[dialog]:
+                self.parent.dialogs[dialog].Close()
+                self.parent.dialogs[dialog] = None
+        
+        del self.digit
+        del self.parent.MapWindow.digit
+        
+        self.mapLayer = None
+        
+        self.parent.MapWindow.redrawAll = True
+        
+        return True
+    
+    def UpdateListOfLayers (self, updateTool = False):
+        """!Update list of available vector map layers.
+        This list consists only editable layers (in the current mapset)
+
+        @param updateTool True to update also toolbar
+        """
+        Debug.msg (4, "VDigitToolbar.UpdateListOfLayers(): updateTool=%d" % \
+                   updateTool)
+        
+        layerNameSelected = None
+         # name of currently selected layer
+        if self.mapLayer:
+            layerNameSelected = self.mapLayer.GetName()
+        
+        # select vector map layer in the current mapset
+        layerNameList = []
+        self.layers = self.mapcontent.GetListOfLayers(l_type = "vector",
+                                                      l_mapset = grass.gisenv()['MAPSET'])
+        
+        for layer in self.layers:
+            if not layer.name in layerNameList: # do not duplicate layer
+                layerNameList.append (layer.GetName())
+        
+        if updateTool: # update toolbar
+            if not self.mapLayer:
+                value = _('Select vector map')
+            else:
+                value = layerNameSelected
+
+            if not self.comboid:
+                self.combo = wx.ComboBox(self, id = wx.ID_ANY, value = value,
+                                         choices = [_('New vector map'), ] + layerNameList, size = (80, -1),
+                                         style = wx.CB_READONLY)
+                self.comboid = self.InsertControl(0, self.combo)
+                self.parent.Bind(wx.EVT_COMBOBOX, self.OnSelectMap, self.comboid)
+            else:
+                self.combo.SetItems([_('New vector map'), ] + layerNameList)
+            
+            self.Realize()
+        
+        return layerNameList
+
+    def GetLayer(self):
+        """!Get selected layer for editing -- MapLayer instance"""
+        return self.mapLayer
diff --git a/gui/wxpython/gui_modules/wxvdigit.py b/gui/wxpython/vdigit/wxdigit.py
similarity index 97%
rename from gui/wxpython/gui_modules/wxvdigit.py
rename to gui/wxpython/vdigit/wxdigit.py
index b441d9d..d901520 100644
--- a/gui/wxpython/gui_modules/wxvdigit.py
+++ b/gui/wxpython/vdigit/wxdigit.py
@@ -1,5 +1,5 @@
 """!
- at package wxvdigit.py
+ at package vdigit.wxdigit
 
 @brief wxGUI vector digitizer (base class)
 
@@ -7,8 +7,15 @@ Code based on wxVdigit C++ component from GRASS 6.4.0
 (gui/wxpython/vdigit). Converted to Python in 2010/12-2011/01.
 
 List of classes:
- - VDigitError
- - IVDigit
+ - wxdigit::VDigitError
+ - wxdigit::IVDigit
+
+ at todo Read large amounts of data from Vlib into arrays, which could
+then be processed using NumPy and rendered using glDrawArrays or
+glDrawElements, so no per-line/per-vertex processing in Python. Bulk
+data processing with NumPy is much faster than iterating in Python
+(and NumPy would be an excellent candidate for acceleration via
+e.g. OpenCL or CUDA; I'm surprised it hasn't happened already).
 
 (C) 2007-2011 by the GRASS Development Team
 
@@ -18,16 +25,20 @@ This program is free software under the GNU General Public License
 @author Martin Landa <landa.martin gmail.com>
 """
 
-from gcmd        import GError
-from debug       import Debug
-from preferences import globalSettings as UserSettings
+import grass.script.core as grass
 
-from wxvdriver   import DisplayDriver
+from core.gcmd        import GError
+from core.debug       import Debug
+from core.settings    import UserSettings
+from vdigit.wxdisplay import DisplayDriver
 
-from grass.lib.gis    import *
-from grass.lib.vector import *
-from grass.lib.vedit  import *
-from grass.lib.dbmi   import *
+try:
+    from grass.lib.gis    import *
+    from grass.lib.vector import *
+    from grass.lib.vedit  import *
+    from grass.lib.dbmi   import *
+except ImportError:
+    pass
 
 class VDigitError:
     def __init__(self, parent):
@@ -44,7 +55,7 @@ class VDigitError:
             message = _('Unable to open vector map <%s>.') % name
         else:
             message =  _('No vector map open for editing.')
-        GError(message + ' ' + _('Operation cancelled.'),
+        GError(message + ' ' + _('Operation canceled.'),
                parent  = self.parent,
                caption = self.caption)
 
@@ -60,7 +71,7 @@ class VDigitError:
         """!Reading line failed
         """
         GError(message = _('Reading feature id %d failed. '
-                           'Operation cancelled.') % line,
+                           'Operation canceled.') % line,
                parent  = self.parent,
                caption = self.caption)
 
@@ -68,7 +79,7 @@ class VDigitError:
         """!No dblink available
         """
         GError(message = _('Database link %d not available. '
-                           'Operation cancelled.') % dblink,
+                           'Operation canceled.') % dblink,
                parent  = self.parent,
                caption = self.caption)
 
@@ -76,7 +87,7 @@ class VDigitError:
         """!Staring driver failed
         """
         GError(message = _('Unable to start database driver <%s>. '
-                           'Operation cancelled.') % driver,
+                           'Operation canceled.') % driver,
                parent  = self.parent,
                caption = self.caption)
 
@@ -84,7 +95,7 @@ class VDigitError:
         """!Opening database failed
         """
         GError(message = _('Unable to open database <%(db)s> by driver <%(driver)s>. '
-                           'Operation cancelled.') % { 'db' : database, 'driver' : driver},
+                           'Operation canceled.') % { 'db' : database, 'driver' : driver},
                parent  = self.parent,
                caption = self.caption)
 
@@ -92,7 +103,7 @@ class VDigitError:
         """!Sql query failed
         """
         GError(message = _("Unable to execute SQL query '%s'. "
-                           "Operation cancelled.") % sql,
+                           "Operation canceled.") % sql,
                parent  = self.parent,
                caption = self.caption)
 
@@ -100,7 +111,7 @@ class VDigitError:
         """!Dead line
         """
         GError(message = _("Feature id %d is marked as dead. "
-                           "Operation cancelled.") % line,
+                           "Operation canceled.") % line,
                parent  = self.parent,
                caption = self.caption)
 
@@ -108,7 +119,7 @@ class VDigitError:
         """!Unknown feature type
         """
         GError(message = _("Unsupported feature type %d. "
-                           "Operation cancelled.") % ftype,
+                           "Operation canceled.") % ftype,
                parent  = self.parent,
                caption = self.caption)
         
@@ -480,25 +491,22 @@ class IVDigit:
         
         # collect categories for delete if requested
         if deleteRec:
-            poCats    = Vect_new_cats_struct()
             poCatsDel = Vect_new_cats_struct()
             for i in self._display.selected['ids']:
-                if Vect_read_line(self.poMapInfo, None, poCats, i) < 0:
+                if Vect_read_line(self.poMapInfo, None, self.poCats, i) < 0:
                     Vect_destroy_cats_struct(poCatsDel)
                     self._error.ReadLine(i)
                     return -1
                 
-                cats = poCats.contents
+                cats = self.poCats.contents
                 for j in range(cats.n_cats):
                     Vect_cat_set(poCatsDel, cats.field[j], cats.cat[j])
-            
-            Vect_destroy_cats_struct(poCats)
         
         # register changeset
         changeset = self._addActionsBefore()
-        
         poList = self._display.GetSelectedIList()
         nlines = Vedit_delete_lines(self.poMapInfo, poList)
+        
         Vect_destroy_list(poList)
         self._display.selected['ids'] = list()
         
@@ -1502,8 +1510,8 @@ class IVDigit:
             # close boundary
             points = self.poPoints.contents
             last = points.n_points - 1
-            if Vect_points_distance(points.x[0], points.x[0], points.z[0],
-                                    points.x[last], points.x[last], points.z[last],
+            if Vect_points_distance(points.x[0], points.y[0], points.z[0],
+                                    points.x[last], points.y[last], points.z[last],
                                     is3D) <= threshold:
                 points.x[last] = points.x[0]
                 points.y[last] = points.y[0]
@@ -1737,4 +1745,3 @@ class IVDigit:
         Note: Changesets starts wiht 0
         """
         return self.changesetCurrent
-    
diff --git a/gui/wxpython/gui_modules/wxvdriver.py b/gui/wxpython/vdigit/wxdisplay.py
similarity index 91%
rename from gui/wxpython/gui_modules/wxvdriver.py
rename to gui/wxpython/vdigit/wxdisplay.py
index 453eda8..bdb6642 100644
--- a/gui/wxpython/gui_modules/wxvdriver.py
+++ b/gui/wxpython/vdigit/wxdisplay.py
@@ -1,5 +1,5 @@
 """!
- at package wxvdriver.py
+ at package vdigit.wxdisplay
 
 @brief wxGUI vector digitizer (display driver)
 
@@ -7,7 +7,7 @@ Code based on wxVdigit C++ component from GRASS 6.4.0
 (gui/wxpython/vdigit). Converted to Python in 2010/12-2011/01.
 
 List of classes:
- - DisplayDriver
+ - wxdisplay::DisplayDriver
 
 (C) 2007-2011 by the GRASS Development Team
 
@@ -17,17 +17,19 @@ This program is free software under the GNU General Public License
 @author Martin Landa <landa.martin gmail.com>
 """
 
-import math
 import locale
 
 import wx
 
-from debug import Debug
-from preferences import globalSettings as UserSettings
+from core.debug    import Debug
+from core.settings import UserSettings
 
-from grass.lib.gis    import *
-from grass.lib.vector import *
-from grass.lib.vedit  import *
+try:
+    from grass.lib.gis    import *
+    from grass.lib.vector import *
+    from grass.lib.vedit  import *
+except ImportError:
+    pass
 
 log      = None
 progress = None
@@ -223,15 +225,18 @@ class DisplayDriver:
         if not self.dc or not self.dcTmp:
             return -1
         
-        Debug.msg(3, "_drawObject(): type=%d npoints=%d", robj.type, robj.npoints)
+        Debug.msg(3, "_drawObject(): line=%d type=%d npoints=%d", robj.fid, robj.type, robj.npoints)
         brush = None
         if self._isSelected(robj.fid):
             pdc = self.dcTmp
-            if self.settings['highlightDupl']['enabled'] and self._isDuplicated(robj.fid):
-                pen = wx.Pen(self.settings['highlightDupl']['color'], self.settings['lineWidth'], wx.SOLID)
-            else:            
-                pen = wx.Pen(self.settings['highlight'], self.settings['lineWidth'], wx.SOLID)
-            
+            if robj.type == TYPE_AREA:
+                return 1
+            else:
+                if self.settings['highlightDupl']['enabled'] and self._isDuplicated(robj.fid):
+                    pen = wx.Pen(self.settings['highlightDupl']['color'], self.settings['lineWidth'], wx.SOLID)
+                else:            
+                    pen = wx.Pen(self.settings['highlight'], self.settings['lineWidth'], wx.SOLID)
+                    
             dcId = 1
             self.topology['highlight'] += 1
             if not self._drawSelected:
@@ -390,20 +395,8 @@ class DisplayDriver:
         @return True if vector object is selected
         @return False if vector object is not selected
         """
-        if len(self.selected['cats']) < 1 or force:
-            # select by id
-            if line in self.selected['ids']:
-                return True
-        else: 
-            # select by cat
-            cats = self.poCats.contents
-            for i in range(cats.n_cats):
-                if cats.field[i] == self.selected['field'] and \
-                        cats.cat[i] in self.selected['cats']:
-                    # remember id
-                    # -> after drawing all features selected.cats is reseted */
-                    self.selected['ids'].append(line)
-                    return True
+        if line in self.selected['ids']:
+            return True
         
         return False
 
@@ -697,13 +690,34 @@ class DisplayDriver:
             self._drawSelected = True
         else:
             self._drawSelected = False
-        
+
+        self.selected['field'] = layer        
         if layer > 0:
-            selected.field = layer
-            self.selected['cats'] = ids
+            self.selected['cats']  = ids
+            self.selected['ids']   = list()
+            ### cidx is not up-to-date
+            # Vect_cidx_find_all(self.poMapInfo, layer, GV_POINTS | GV_LINES, lid, ilist)
+            nlines = Vect_get_num_lines(self.poMapInfo)
+            for line in range(1, nlines + 1):
+                if not Vect_line_alive(self.poMapInfo, line):
+                    continue
+                
+                ltype = Vect_read_line (self.poMapInfo, None, self.poCats, line)
+                if not (ltype & (GV_POINTS | GV_LINES)):
+                    continue
+                
+                found = False
+                cats = self.poCats.contents
+                for i in range(0, cats.n_cats):
+                    for cat in self.selected['cats']:
+                        if cats.cat[i] == cat:
+                            found = True
+                            break
+                if found:
+                    self.selected['ids'].append(line)
         else:
-            field = -1
-            self.selected['ids'] = ids
+            self.selected['ids']   = ids
+            self.selected['cats']  = []
         
     def GetSelectedVertex(self, pos):
         """!Get PseudoDC vertex id of selected line
@@ -771,6 +785,34 @@ class DisplayDriver:
         
         return returnId
 
+    def GetRegionSelected(self):
+        """!Get minimal region extent of selected features
+	
+        @return n,s,w,e
+        """
+        regionBox = bound_box()
+        lineBox = bound_box()
+        setRegion = True
+        
+        nareas = Vect_get_num_areas(self.poMapInfo)
+        for line in self.selected['ids']:
+            area = Vect_get_centroid_area(self.poMapInfo, line)
+            
+            if area > 0 and area <= nareas:
+                if not Vect_get_area_box(self.poMapInfo, area, byref(lineBox)):
+                    continue
+            else:
+                if not Vect_get_line_box(self.poMapInfo, line, byref(lineBox)):
+                    continue
+                
+            if setRegion:
+                Vect_box_copy(byref(regionBox), byref(lineBox))
+                setRegion = False
+            else:
+                Vect_box_extend(byref(regionBox), byref(lineBox))
+        
+        return regionBox.N, regionBox.S, regionBox.W, regionBox.E
+
     def DrawSelected(self, flag):
         """!Draw selected features
         
@@ -991,5 +1033,3 @@ class DisplayDriver:
             self.GetDuplicates()
         
         return len(self.selected['ids'])
-    
-
diff --git a/gui/wxpython/wxplot/base.py b/gui/wxpython/wxplot/base.py
new file mode 100644
index 0000000..4b49d21
--- /dev/null
+++ b/gui/wxpython/wxplot/base.py
@@ -0,0 +1,522 @@
+"""!
+ at package wxplot.base
+
+ at brief Base classes for iinteractive plotting using PyPlot
+
+Classes:
+ - base::PlotIcons
+ - base::BasePlotFrame
+
+(C) 2011 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton, Arizona State University
+"""
+
+import os
+import sys
+
+import wx
+import wx.lib.plot as plot
+
+from core.globalvar    import ETCICONDIR
+from core.settings     import UserSettings
+from wxplot.dialogs    import TextDialog, OptDialog
+from core.render       import Map
+from icons.icon        import MetaIcon
+from gui_core.toolbars import BaseIcons
+
+import grass.script as grass
+
+PlotIcons = {
+    'draw'         : MetaIcon(img = 'show',
+                              label = _('Draw/re-draw plot')),
+    'transect'     : MetaIcon(img = 'layer-raster-profile',
+                              label = _('Draw transect in map display window to profile')),
+    'options'      : MetaIcon(img = 'settings',
+                              label = _('Plot options')),
+    'statistics'   : MetaIcon(img = 'check',
+                              label = _('Plot statistics')),
+    'save'         : MetaIcon(img = 'save',
+                              label = _('Save profile data to CSV file')),
+    'quit'         : BaseIcons['quit'].SetLabel(_('Quit plot tool')),
+    }
+
+class BasePlotFrame(wx.Frame):
+    """!Abstract PyPlot display frame class"""
+    def __init__(self, parent = None, id = wx.ID_ANY, size = wx.Size(700, 400),
+                 style = wx.DEFAULT_FRAME_STYLE, rasterList = [],  **kwargs):
+
+        wx.Frame.__init__(self, parent, id, size = size, style = style, **kwargs)
+        
+        self.parent = parent            # MapFrame for a plot type
+        self.mapwin = self.parent.MapWindow
+        self.Map    = Map()             # instance of render.Map to be associated with display
+        self.rasterList = rasterList    #list of rasters to plot
+        self.raster = {}    # dictionary of raster maps and their plotting parameters
+        self.plottype = ''
+        
+        self.linestyledict = { 'solid' : wx.SOLID,
+                            'dot' : wx.DOT,
+                            'long-dash' : wx.LONG_DASH,
+                            'short-dash' : wx.SHORT_DASH,
+                            'dot-dash' : wx.DOT_DASH }
+
+        self.ptfilldict = { 'transparent' : wx.TRANSPARENT,
+                            'solid' : wx.SOLID }
+
+        #
+        # Icon
+        #
+        self.SetIcon(wx.Icon(os.path.join(ETCICONDIR, 'grass.ico'), wx.BITMAP_TYPE_ICO))
+                
+        #
+        # Add statusbar
+        #
+        self.statusbar = self.CreateStatusBar(number = 2, style = 0)
+        self.statusbar.SetStatusWidths([-2, -1])
+
+        #
+        # Define canvas and settings
+        #
+        # 
+        self.client = plot.PlotCanvas(self)
+
+        #define the function for drawing pointLabels
+        self.client.SetPointLabelFunc(self.DrawPointLabel)
+
+        # Create mouse event for showing cursor coords in status bar
+        self.client.canvas.Bind(wx.EVT_LEFT_DOWN, self.OnMouseLeftDown)
+
+        # Show closest point when enabled
+        self.client.canvas.Bind(wx.EVT_MOTION, self.OnMotion)
+
+        self.plotlist = []      # list of things to plot
+        self.plot = None        # plot draw object
+        self.ptitle = ""        # title of window
+        self.xlabel = ""        # default X-axis label
+        self.ylabel = ""        # default Y-axis label
+
+        #
+        # Bind various events
+        #
+        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
+        
+        self.CentreOnScreen()
+        
+        self._createColorDict()
+
+
+    def _createColorDict(self):
+        """!Create color dictionary to return wx.Color tuples
+        for assigning colors to images in imagery groups"""
+                
+        self.colorDict = {}
+        for clr in grass.named_colors.iterkeys():
+            if clr == 'white' or clr == 'black': continue
+            r = grass.named_colors[clr][0] * 255
+            g = grass.named_colors[clr][1] * 255
+            b = grass.named_colors[clr][2] * 255
+            self.colorDict[clr] = (r,g,b,255)
+
+    def InitPlotOpts(self, plottype):
+        """!Initialize options for entire plot
+        """        
+        self.plottype = plottype                # profile
+
+        self.properties = {}                    # plot properties
+        self.properties['font'] = {}
+        self.properties['font']['prop'] = UserSettings.Get(group = self.plottype, key = 'font')
+        self.properties['font']['wxfont'] = wx.Font(11, wx.FONTFAMILY_SWISS,
+                                                    wx.FONTSTYLE_NORMAL,
+                                                    wx.FONTWEIGHT_NORMAL)
+        
+        self.properties['raster'] = {}
+        self.properties['raster'] = UserSettings.Get(group = self.plottype, key = 'raster')
+        colstr = str(self.properties['raster']['pcolor'])
+        self.properties['raster']['pcolor'] = tuple(int(colval) for colval in colstr.strip('()').split(','))
+
+        if self.plottype == 'profile':
+            self.properties['marker'] = UserSettings.Get(group = self.plottype, key = 'marker')
+            # changing color string to tuple for markers/points
+            colstr = str(self.properties['marker']['color'])
+            self.properties['marker']['color'] = tuple(int(colval) for colval in colstr.strip('()').split(','))
+ 
+
+        self.properties['grid'] = UserSettings.Get(group = self.plottype, key = 'grid')        
+        colstr = str(self.properties['grid']['color']) # changing color string to tuple        
+        self.properties['grid']['color'] = tuple(int(colval) for colval in colstr.strip('()').split(','))
+                
+        self.properties['x-axis'] = {}
+        self.properties['x-axis']['prop'] = UserSettings.Get(group = self.plottype, key = 'x-axis')
+        self.properties['x-axis']['axis'] = None
+
+        self.properties['y-axis'] = {}
+        self.properties['y-axis']['prop'] = UserSettings.Get(group = self.plottype, key = 'y-axis')
+        self.properties['y-axis']['axis'] = None
+        
+        self.properties['legend'] = UserSettings.Get(group = self.plottype, key = 'legend')
+
+        self.zoom = False  # zooming disabled
+        self.drag = False  # draging disabled
+        self.client.SetShowScrollbars(True) # vertical and horizontal scrollbars
+
+        # x and y axis set to normal (non-log)
+        self.client.setLogScale((False, False))
+        if self.properties['x-axis']['prop']['type']:
+            self.client.SetXSpec(self.properties['x-axis']['prop']['type'])
+        else:
+            self.client.SetXSpec('auto')
+        
+        if self.properties['y-axis']['prop']['type']:
+            self.client.SetYSpec(self.properties['y-axis']['prop']['type'])
+        else:
+            self.client.SetYSpec('auto')
+        
+    def InitRasterOpts(self, rasterList, plottype):
+        """!Initialize or update raster dictionary for plotting
+        """
+
+        rdict = {} # initialize a dictionary
+
+        self.properties['raster'] = UserSettings.Get(group = self.plottype, key = 'raster')
+
+        for r in rasterList:
+            idx = rasterList.index(r)
+            
+            try:
+                ret = grass.raster_info(r)
+            except:
+                continue
+                # if r.info cannot parse map, skip it
+               
+            self.raster[r] = self.properties['raster'] # some default settings
+            rdict[r] = {} # initialize sub-dictionaries for each raster in the list
+            
+            rdict[r]['units'] = ''
+            if ret['units'] not in ('(none)', '"none"', '', None):
+                rdict[r]['units'] = ret['units']
+            
+            rdict[r]['plegend'] = r.split('@')[0]
+            rdict[r]['datalist'] = [] # list of cell value,frequency pairs for plotting
+            rdict[r]['pline'] = None
+            rdict[r]['datatype'] = ret['datatype']
+
+            #    
+            #initialize with saved values
+            #
+            if self.properties['raster']['pwidth'] != None:
+                rdict[r]['pwidth'] = self.properties['raster']['pwidth']
+            else:
+                rdict[r]['pwidth'] = 1
+                
+            if self.properties['raster']['pstyle'] != None and \
+                self.properties['raster']['pstyle'] != '':
+                rdict[r]['pstyle'] = self.properties['raster']['pstyle']
+            else:
+                rdict[r]['pstyle'] = 'solid'
+                        
+            if idx <= len(self.colorList):
+                if idx == 0:
+                    # use saved color for first plot
+                    if self.properties['raster']['pcolor'] != None:
+                        rdict[r]['pcolor'] = self.properties['raster']['pcolor'] 
+                    else:
+                        rdict[r]['pcolor'] = self.colorDict[self.colorList[idx]]
+                else:
+                    rdict[r]['pcolor'] = self.colorDict[self.colorList[idx]]
+            else:
+                r = randint(0, 255)
+                b = randint(0, 255)
+                g = randint(0, 255)
+                rdict[r]['pcolor'] = ((r,g,b,255))
+        
+        return rdict
+
+    def SetGraphStyle(self):
+        """!Set plot and text options
+        """
+        self.client.SetFont(self.properties['font']['wxfont'])
+        self.client.SetFontSizeTitle(self.properties['font']['prop']['titleSize'])
+        self.client.SetFontSizeAxis(self.properties['font']['prop']['axisSize'])
+
+        self.client.SetEnableZoom(self.zoom)
+        self.client.SetEnableDrag(self.drag)
+        
+        #
+        # axis settings
+        #
+        if self.properties['x-axis']['prop']['type'] == 'custom':
+            self.client.SetXSpec('min')
+        else:
+            self.client.SetXSpec(self.properties['x-axis']['prop']['type'])
+
+        if self.properties['y-axis']['prop']['type'] == 'custom':
+            self.client.SetYSpec('min')
+        else:
+            self.client.SetYSpec(self.properties['y-axis']['prop'])
+
+        if self.properties['x-axis']['prop']['type'] == 'custom' and \
+               self.properties['x-axis']['prop']['min'] < self.properties['x-axis']['prop']['max']:
+            self.properties['x-axis']['axis'] = (self.properties['x-axis']['prop']['min'],
+                                                 self.properties['x-axis']['prop']['max'])
+        else:
+            self.properties['x-axis']['axis'] = None
+
+        if self.properties['y-axis']['prop']['type'] == 'custom' and \
+                self.properties['y-axis']['prop']['min'] < self.properties['y-axis']['prop']['max']:
+            self.properties['y-axis']['axis'] = (self.properties['y-axis']['prop']['min'],
+                                                 self.properties['y-axis']['prop']['max'])
+        else:
+            self.properties['y-axis']['axis'] = None
+            
+        if self.properties['x-axis']['prop']['log'] == True:
+            self.properties['x-axis']['axis'] = None
+            self.client.SetXSpec('min')
+        if self.properties['y-axis']['prop']['log'] == True:
+            self.properties['y-axis']['axis'] = None
+            self.client.SetYSpec('min')
+                        
+        self.client.setLogScale((self.properties['x-axis']['prop']['log'],
+                                 self.properties['y-axis']['prop']['log']))
+        
+        #
+        # grid settings
+        #
+        self.client.SetEnableGrid(self.properties['grid']['enabled'])
+                
+        self.client.SetGridColour(wx.Color(self.properties['grid']['color'][0],
+                                           self.properties['grid']['color'][1],
+                                           self.properties['grid']['color'][2],
+                                           255))
+        
+        #
+        # legend settings
+        #
+        self.client.SetFontSizeLegend(self.properties['font']['prop']['legendSize'])
+        self.client.SetEnableLegend(self.properties['legend']['enabled'])
+
+    def DrawPlot(self, plotlist):
+        """!Draw line and point plot from list plot elements.
+        """
+        self.plot = plot.PlotGraphics(plotlist,
+                                         self.ptitle,
+                                         self.xlabel,
+                                         self.ylabel)
+
+        if self.properties['x-axis']['prop']['type'] == 'custom':
+            self.client.SetXSpec('min')
+        else:
+            self.client.SetXSpec(self.properties['x-axis']['prop']['type'])
+
+        if self.properties['y-axis']['prop']['type'] == 'custom':
+            self.client.SetYSpec('min')
+        else:
+            self.client.SetYSpec(self.properties['y-axis']['prop']['type'])
+
+        self.client.Draw(self.plot, self.properties['x-axis']['axis'],
+                         self.properties['y-axis']['axis'])
+                
+    def DrawPointLabel(self, dc, mDataDict):
+        """!This is the fuction that defines how the pointLabels are
+            plotted dc - DC that will be passed mDataDict - Dictionary
+            of data that you want to use for the pointLabel
+
+            As an example I have decided I want a box at the curve
+            point with some text information about the curve plotted
+            below.  Any wxDC method can be used.
+        """
+        dc.SetPen(wx.Pen(wx.BLACK))
+        dc.SetBrush(wx.Brush( wx.BLACK, wx.SOLID ) )
+
+        sx, sy = mDataDict["scaledXY"] #scaled x,y of closest point
+        dc.DrawRectangle( sx-5,sy-5, 10, 10)  #10by10 square centered on point
+        px,py = mDataDict["pointXY"]
+        cNum = mDataDict["curveNum"]
+        pntIn = mDataDict["pIndex"]
+        legend = mDataDict["legend"]
+        #make a string to display
+        s = "Crv# %i, '%s', Pt. (%.2f,%.2f), PtInd %i" %(cNum, legend, px, py, pntIn)
+        dc.DrawText(s, sx , sy+1)
+
+    def OnZoom(self, event):
+        """!Enable zooming and disable dragging
+        """
+        self.zoom = True
+        self.drag = False
+        self.client.SetEnableZoom(self.zoom)
+        self.client.SetEnableDrag(self.drag)
+
+    def OnDrag(self, event):
+        """!Enable dragging and disable zooming
+        """
+        self.zoom = False
+        self.drag = True
+        self.client.SetEnableDrag(self.drag)
+        self.client.SetEnableZoom(self.zoom)
+
+    def OnRedraw(self, event):
+        """!Redraw the plot window. Unzoom to original size
+        """
+        self.client.Reset()
+        self.client.Redraw()
+       
+    def OnErase(self, event):
+        """!Erase the plot window
+        """
+        self.client.Clear()
+        self.mapwin.ClearLines(self.mapwin.pdc)
+        self.mapwin.ClearLines(self.mapwin.pdcTmp)
+        self.mapwin.polycoords = []
+        self.mapwin.Refresh()
+
+    def SaveToFile(self, event):
+        """!Save plot to graphics file
+        """
+        self.client.SaveFile()
+
+    def OnMouseLeftDown(self,event):
+        self.SetStatusText(_("Left Mouse Down at Point:") + \
+                               " (%.4f, %.4f)" % self.client._getXY(event))
+        event.Skip() # allows plotCanvas OnMouseLeftDown to be called
+
+    def OnMotion(self, event):
+        """!Indicate when mouse is outside the plot area
+        """
+        if self.client.OnLeave(event): print 'out of area'
+        #show closest point (when enbled)
+        if self.client.GetEnablePointLabel() == True:
+            #make up dict with info for the pointLabel
+            #I've decided to mark the closest point on the closest curve
+            dlst =  self.client.GetClosetPoint( self.client._getXY(event), pointScaled =  True)
+            if dlst != []:      #returns [] if none
+                curveNum, legend, pIndex, pointXY, scaledXY, distance = dlst
+                #make up dictionary to pass to my user function (see DrawPointLabel)
+                mDataDict =  {"curveNum":curveNum, "legend":legend, "pIndex":pIndex,\
+                    "pointXY":pointXY, "scaledXY":scaledXY}
+                #pass dict to update the pointLabel
+                self.client.UpdatePointLabel(mDataDict)
+        event.Skip()           #go to next handler        
+ 
+ 
+    def PlotOptionsMenu(self, event):
+        """!Popup menu for plot and text options
+        """
+        point = wx.GetMousePosition()
+        popt = wx.Menu()
+
+        # Add items to the menu
+        settext = wx.MenuItem(popt, wx.ID_ANY, _('Text settings'))
+        popt.AppendItem(settext)
+        self.Bind(wx.EVT_MENU, self.PlotText, settext)
+
+        setgrid = wx.MenuItem(popt, wx.ID_ANY, _('Plot settings'))
+        popt.AppendItem(setgrid)
+        self.Bind(wx.EVT_MENU, self.PlotOptions, setgrid)
+
+        # Popup the menu.  If an item is selected then its handler
+        # will be called before PopupMenu returns.
+        self.PopupMenu(popt)
+        popt.Destroy()
+
+    def NotFunctional(self):
+        """!Creates a 'not functional' message dialog
+        """
+        dlg = wx.MessageDialog(parent = self,
+                               message = _('This feature is not yet functional'),
+                               caption = _('Under Construction'),
+                               style = wx.OK | wx.ICON_INFORMATION)
+        dlg.ShowModal()
+        dlg.Destroy()
+
+    def OnPlotText(self, dlg):
+        """!Custom text settings.
+        """
+        self.ptitle = dlg.ptitle
+        self.xlabel = dlg.xlabel
+        self.ylabel = dlg.ylabel
+
+        self.client.SetFont(self.properties['font']['wxfont'])
+        self.client.SetFontSizeTitle(self.properties['font']['prop']['titleSize'])
+        self.client.SetFontSizeAxis(self.properties['font']['prop']['axisSize'])
+
+        if self.plot:
+            self.plot.setTitle(dlg.ptitle)
+            self.plot.setXLabel(dlg.xlabel)
+            self.plot.setYLabel(dlg.ylabel)
+
+        self.OnRedraw(event = None)
+    
+    def PlotText(self, event):
+        """!Set custom text values for profile title and axis labels.
+        """
+        dlg = TextDialog(parent = self, id = wx.ID_ANY, 
+                         plottype = self.plottype, 
+                         title = _('Text settings'))
+        
+        btnval = dlg.ShowModal()
+        if btnval == wx.ID_SAVE or btnval == wx.ID_OK or btnval == wx.ID_CANCEL:
+            dlg.Destroy()            
+        
+    def PlotOptions(self, event):
+        """!Set various profile options, including: line width, color,
+        style; marker size, color, fill, and style; grid and legend
+        options.  Calls OptDialog class.
+        """
+       
+        dlg = OptDialog(parent = self, id = wx.ID_ANY, 
+                        plottype = self.plottype, 
+                        title = _('Plot settings'))
+
+        btnval = dlg.ShowModal()
+
+        if btnval == wx.ID_SAVE or btnval == wx.ID_OK or btnval == wx.ID_CANCEL:
+            dlg.Destroy()            
+
+    def PrintMenu(self, event):
+        """!Print options and output menu
+        """
+        point = wx.GetMousePosition()
+        printmenu = wx.Menu()
+        for title, handler in ((_("Page setup"), self.OnPageSetup),
+                               (_("Print preview"), self.OnPrintPreview),
+                               (_("Print display"), self.OnDoPrint)):
+            item = wx.MenuItem(printmenu, wx.ID_ANY, title)
+            printmenu.AppendItem(item)
+            self.Bind(wx.EVT_MENU, handler, item)
+        
+        # Popup the menu.  If an item is selected then its handler
+        # will be called before PopupMenu returns.
+        self.PopupMenu(printmenu)
+        printmenu.Destroy()
+
+    def OnPageSetup(self, event):
+        self.client.PageSetup()
+
+    def OnPrintPreview(self, event):
+        self.client.PrintPreview()
+
+    def OnDoPrint(self, event):
+        self.client.Printout()
+
+    def OnQuit(self, event):
+        self.Close(True)
+
+    def OnCloseWindow(self, event):
+        """!Close plot window and clean up
+        """
+        try:
+            self.mapwin.ClearLines()
+            self.mapwin.mouse['begin'] = self.mapwin.mouse['end'] = (0.0, 0.0)
+            self.mapwin.mouse['use'] = 'pointer'
+            self.mapwin.mouse['box'] = 'point'
+            self.mapwin.polycoords = []
+            self.mapwin.UpdateMap(render = False, renderVector = False)
+        except:
+            pass
+        
+        self.mapwin.SetCursor(self.Parent.cursors["default"])
+        self.Destroy()
+        
diff --git a/gui/wxpython/wxplot/dialogs.py b/gui/wxpython/wxplot/dialogs.py
new file mode 100644
index 0000000..21e3778
--- /dev/null
+++ b/gui/wxpython/wxplot/dialogs.py
@@ -0,0 +1,875 @@
+"""!
+ at package wxplot.dialogs
+
+ at brief Dialogs for different plotting routines
+
+Classes:
+ - dialogs::ProfileRasterDialog
+ - dialogs::ScatterRasterDialog
+ - dialogs::PlotStatsFrame
+ - dialogs::HistRasterDialog
+ - dialogs::TextDialog
+ - dialogs::OptDialog
+
+(C) 2011-2012 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton, Arizona State University
+"""
+
+import wx
+import wx.lib.colourselect  as csel
+import wx.lib.scrolledpanel as scrolled
+
+from core             import globalvar
+from core.settings    import UserSettings
+from gui_core.gselect import Select
+
+from grass.script import core  as grass
+
+class ProfileRasterDialog(wx.Dialog):
+    def __init__(self, parent, id = wx.ID_ANY, 
+                 title = _("Select raster maps to profile"),
+                 style = wx.DEFAULT_DIALOG_STYLE, **kwargs):
+        """!Dialog to select raster maps to profile.
+        """
+
+        wx.Dialog.__init__(self, parent, id, title, style = style, **kwargs)
+
+
+        self.parent = parent
+        self.colorList = ["blue", "red", "green", "yellow", "magenta", "cyan", \
+                    "aqua", "black", "grey", "orange", "brown", "purple", "violet", \
+                    "indigo"]
+
+        self.rasterList = self.parent.rasterList
+        
+        self._do_layout()
+        
+    def _do_layout(self):
+
+        sizer = wx.BoxSizer(wx.VERTICAL)
+
+        box = wx.GridBagSizer (hgap = 3, vgap = 3)
+        
+        rastText = ''
+        for r in self.rasterList:
+            rastText += '%s,' % r
+            
+        rastText = rastText.rstrip(',')
+        
+        txt = _("Select raster map(s) to profile:")
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = txt)
+        box.Add(item = label,
+                flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 0))
+        
+        selection = Select(self, id = wx.ID_ANY,
+                           size = globalvar.DIALOG_GSELECT_SIZE,
+                           type = 'cell', multiple=True)
+        selection.SetValue(rastText)
+        selection.Bind(wx.EVT_TEXT, self.OnSelection)
+        
+        box.Add(item = selection, pos = (0, 1))
+            
+        sizer.Add(item = box, proportion = 0,
+                  flag = wx.ALL, border = 10)
+
+        line = wx.StaticLine(parent = self, id = wx.ID_ANY, size = (20, -1), style = wx.LI_HORIZONTAL)
+        sizer.Add(item = line, proportion = 0,
+                  flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, border = 5)
+
+        btnsizer = wx.StdDialogButtonSizer()
+
+        btn = wx.Button(self, wx.ID_OK)
+        btn.SetDefault()
+        btnsizer.AddButton(btn)
+
+        btn = wx.Button(self, wx.ID_CANCEL)
+        btnsizer.AddButton(btn)
+        btnsizer.Realize()
+
+        sizer.Add(item = btnsizer, proportion = 0, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
+
+        self.SetSizer(sizer)
+        sizer.Fit(self)
+
+    def OnSelection(self, event):
+        """!Choose maps to profile. Convert these into a list
+        """
+        self.rasterList = []
+        self.rasterList = event.GetString().split(',')
+        
+class PlotStatsFrame(wx.Frame):
+    def __init__(self, parent, id, message = '', title = '',
+                 style = wx.DEFAULT_FRAME_STYLE, **kwargs):
+        """!Dialog to display and save statistics for plots
+        """
+        wx.Frame.__init__(self, parent, id, style = style, **kwargs)
+        self.SetLabel(_("Statistics"))
+        
+        sp = scrolled.ScrolledPanel(self, -1, size=(400, 400),
+                                    style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="Statistics" )
+                
+
+        #
+        # initialize variables
+        #
+        self.parent = parent
+        self.message = message 
+        self.title = title   
+        self.CenterOnParent()  
+        
+        #
+        # Display statistics
+        #
+        sizer = wx.BoxSizer(wx.VERTICAL)
+        txtSizer = wx.BoxSizer(wx.VERTICAL)
+
+        statstitle = wx.StaticText(parent = self, id = wx.ID_ANY, label = self.title)
+        sizer.Add(item = statstitle, proportion = 0,
+                  flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 3)
+        line = wx.StaticLine(parent = self, id = wx.ID_ANY, size = (20, -1), style = wx.LI_HORIZONTAL)
+        sizer.Add(item = line, proportion = 0,
+                  flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 3)
+        for stats in self.message:
+            statstxt = wx.StaticText(parent = sp, id = wx.ID_ANY, label = stats)
+            statstxt.SetBackgroundColour("WHITE")
+            txtSizer.Add(item = statstxt, proportion = 1, 
+                         flag = wx.EXPAND|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, border = 3)
+            line = wx.StaticLine(parent = sp, id = wx.ID_ANY, size = (20, -1), style = wx.LI_HORIZONTAL) 
+            txtSizer.Add(item = line, proportion = 0,
+                         flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.ALL, border = 3)      
+
+        sp.SetSizer(txtSizer)
+        sp.SetAutoLayout(1)
+        sp.SetupScrolling() 
+
+        sizer.Add(item = sp, proportion = 1, 
+                  flag = wx.GROW | wx.LEFT | wx.RIGHT | wx.BOTTOM, border = 3)
+
+        line = wx.StaticLine(parent = self, id = wx.ID_ANY, size = (20, -1), style = wx.LI_HORIZONTAL)
+        sizer.Add(item = line, proportion = 0,
+                  flag = wx.GROW |wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, border = 3)
+
+        #
+        # buttons
+        #
+        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+
+        btn_clipboard = wx.Button(self, id = wx.ID_COPY, label = _('C&opy'))
+        btn_clipboard.SetToolTipString(_("Copy regression statistics the clipboard (Ctrl+C)"))
+        btnSizer.Add(item = btn_clipboard, proportion = 0, flag = wx.ALIGN_LEFT | wx.ALL, border = 5)
+        
+        btnCancel = wx.Button(self, wx.ID_CLOSE)
+        btnCancel.SetDefault()
+        btnSizer.Add(item = btnCancel, proportion = 0, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)        
+
+        sizer.Add(item = btnSizer, proportion = 0, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
+
+        # bindings
+        btnCancel.Bind(wx.EVT_BUTTON, self.OnClose)
+        btn_clipboard.Bind(wx.EVT_BUTTON, self.OnCopy)
+        
+        self.SetSizer(sizer)
+        sizer.Fit(self)
+
+    def OnCopy(self, event):
+        """!Copy the regression stats to the clipboard
+        """
+        str = self.title + '\n'
+        for item in self.message:
+            str += item
+            
+        rdata = wx.TextDataObject()
+        rdata.SetText(str)
+        
+        if wx.TheClipboard.Open():
+            wx.TheClipboard.SetData(rdata)
+            wx.TheClipboard.Close()
+            wx.MessageBox(_("Regression statistics copied to clipboard"))
+        
+    def OnClose(self, event):
+        """!Button 'Close' pressed
+        """
+        self.Close(True)
+
+class TextDialog(wx.Dialog):
+    def __init__(self, parent, id, title, plottype = '', 
+                 style = wx.DEFAULT_DIALOG_STYLE, **kwargs):
+        """!Dialog to set plot text options: font, title
+        and font size, axis labels and font size
+        """
+        wx.Dialog.__init__(self, parent, id, title, style = style, **kwargs)
+        #
+        # initialize variables
+        #
+        # combo box entry lists
+        self.ffamilydict = { 'default' : wx.FONTFAMILY_DEFAULT,
+                             'decorative' : wx.FONTFAMILY_DECORATIVE,
+                             'roman' : wx.FONTFAMILY_ROMAN,
+                             'script' : wx.FONTFAMILY_SCRIPT,
+                             'swiss' : wx.FONTFAMILY_SWISS,
+                             'modern' : wx.FONTFAMILY_MODERN,
+                             'teletype' : wx.FONTFAMILY_TELETYPE }
+
+        self.fstyledict = { 'normal' : wx.FONTSTYLE_NORMAL,
+                            'slant' : wx.FONTSTYLE_SLANT,
+                            'italic' : wx.FONTSTYLE_ITALIC }
+
+        self.fwtdict = { 'normal' : wx.FONTWEIGHT_NORMAL,
+                         'light' : wx.FONTWEIGHT_LIGHT,
+                         'bold' : wx.FONTWEIGHT_BOLD }
+
+        self.parent = parent
+        self.plottype = plottype
+
+        self.ptitle = self.parent.ptitle
+        self.xlabel = self.parent.xlabel
+        self.ylabel = self.parent.ylabel
+
+        self.properties = self.parent.properties # read-only
+        
+        # font size
+        self.fontfamily = self.properties['font']['wxfont'].GetFamily()
+        self.fontstyle = self.properties['font']['wxfont'].GetStyle()
+        self.fontweight = self.properties['font']['wxfont'].GetWeight()
+
+        self._do_layout()
+                
+    def _do_layout(self):
+        """!Do layout"""
+        # dialog layout
+        sizer = wx.BoxSizer(wx.VERTICAL)
+
+        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                           label = " %s " % _("Text settings"))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+
+        #
+        # profile title
+        #
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Profile title:"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 0))
+        self.ptitleentry = wx.TextCtrl(parent = self, id = wx.ID_ANY, value = "", size = (250,-1))
+        # self.ptitleentry.SetFont(self.font)
+        self.ptitleentry.SetValue(self.ptitle)
+        gridSizer.Add(item = self.ptitleentry, pos = (0, 1))
+
+        #
+        # title font
+        #
+        tlabel = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Title font size (pts):"))
+        gridSizer.Add(item = tlabel, flag = wx.ALIGN_CENTER_VERTICAL, pos = (1, 0))
+        self.ptitlesize = wx.SpinCtrl(parent = self, id = wx.ID_ANY, value = "", pos = (30, 50),
+                                      size = (50,-1), style = wx.SP_ARROW_KEYS)
+        self.ptitlesize.SetRange(5,100)
+        self.ptitlesize.SetValue(int(self.properties['font']['prop']['titleSize']))
+        gridSizer.Add(item = self.ptitlesize, pos = (1, 1))
+
+        #
+        # x-axis label
+        #
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("X-axis label:"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (2, 0))
+        self.xlabelentry = wx.TextCtrl(parent = self, id = wx.ID_ANY, value = "", size = (250,-1))
+        # self.xlabelentry.SetFont(self.font)
+        self.xlabelentry.SetValue(self.xlabel)
+        gridSizer.Add(item = self.xlabelentry, pos = (2, 1))
+
+        #
+        # y-axis label
+        #
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Y-axis label:"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (3, 0))
+        self.ylabelentry = wx.TextCtrl(parent = self, id = wx.ID_ANY, value = "", size = (250,-1))
+        # self.ylabelentry.SetFont(self.font)
+        self.ylabelentry.SetValue(self.ylabel)
+        gridSizer.Add(item = self.ylabelentry, pos = (3, 1))
+
+        #
+        # font size
+        #
+        llabel = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Label font size (pts):"))
+        gridSizer.Add(item = llabel, flag = wx.ALIGN_CENTER_VERTICAL, pos = (4, 0))
+        self.axislabelsize = wx.SpinCtrl(parent = self, id = wx.ID_ANY, value = "", pos = (30, 50),
+                                         size = (50, -1), style = wx.SP_ARROW_KEYS)
+        self.axislabelsize.SetRange(5, 100) 
+        self.axislabelsize.SetValue(int(self.properties['font']['prop']['axisSize']))
+        gridSizer.Add(item = self.axislabelsize, pos = (4,1))
+
+        boxSizer.Add(item = gridSizer)
+        sizer.Add(item = boxSizer, flag = wx.ALL | wx.EXPAND, border = 3)
+
+        #
+        # font settings
+        #
+        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                           label = " %s " % _("Font settings"))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+        gridSizer.AddGrowableCol(1)
+
+        #
+        # font family
+        #
+        label1 = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Font family:"))
+        gridSizer.Add(item = label1, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 0))
+        self.ffamilycb = wx.ComboBox(parent = self, id = wx.ID_ANY, size = (250, -1),
+                                choices = self.ffamilydict.keys(), style = wx.CB_DROPDOWN)
+        self.ffamilycb.SetStringSelection('swiss')
+        for item in self.ffamilydict.items():
+            if self.fontfamily == item[1]:
+                self.ffamilycb.SetStringSelection(item[0])
+                break
+        gridSizer.Add(item = self.ffamilycb, pos = (0, 1), flag = wx.ALIGN_RIGHT)
+
+        #
+        # font style
+        #
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Style:"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (1, 0))
+        self.fstylecb = wx.ComboBox(parent = self, id = wx.ID_ANY, size = (250, -1),
+                                    choices = self.fstyledict.keys(), style = wx.CB_DROPDOWN)
+        self.fstylecb.SetStringSelection('normal')
+        for item in self.fstyledict.items():
+            if self.fontstyle == item[1]:
+                self.fstylecb.SetStringSelection(item[0])
+                break
+        gridSizer.Add(item = self.fstylecb, pos = (1, 1), flag = wx.ALIGN_RIGHT)
+
+        #
+        # font weight
+        #
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Weight:"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (2, 0))
+        self.fwtcb = wx.ComboBox(parent = self, size = (250, -1),
+                                 choices = self.fwtdict.keys(), style = wx.CB_DROPDOWN)
+        self.fwtcb.SetStringSelection('normal')
+        for item in self.fwtdict.items():
+            if self.fontweight == item[1]:
+                self.fwtcb.SetStringSelection(item[0])
+                break
+
+        gridSizer.Add(item = self.fwtcb, pos = (2, 1), flag = wx.ALIGN_RIGHT)
+                      
+        boxSizer.Add(item = gridSizer, flag = wx.EXPAND)
+        sizer.Add(item = boxSizer, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
+
+        line = wx.StaticLine(parent = self, id = wx.ID_ANY, size = (20, -1), style = wx.LI_HORIZONTAL)
+        sizer.Add(item = line, proportion = 0,
+                  flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, border = 3)
+
+        #
+        # buttons
+        #
+        btnSave = wx.Button(self, wx.ID_SAVE)
+        btnApply = wx.Button(self, wx.ID_APPLY)
+        btnOk = wx.Button(self, wx.ID_OK)
+        btnCancel = wx.Button(self, wx.ID_CANCEL)
+        btnOk.SetDefault()
+
+        # bindings
+        btnApply.Bind(wx.EVT_BUTTON, self.OnApply)
+        btnApply.SetToolTipString(_("Apply changes for the current session"))
+        btnOk.Bind(wx.EVT_BUTTON, self.OnOk)
+        btnOk.SetToolTipString(_("Apply changes for the current session and close dialog"))
+        btnOk.SetDefault()
+        btnSave.Bind(wx.EVT_BUTTON, self.OnSave)
+        btnSave.SetToolTipString(_("Apply and save changes to user settings file (default for next sessions)"))
+        btnCancel.Bind(wx.EVT_BUTTON, self.OnCancel)
+        btnCancel.SetToolTipString(_("Close dialog and ignore changes"))
+
+        # sizers
+        btnStdSizer = wx.StdDialogButtonSizer()
+        btnStdSizer.AddButton(btnOk)
+        btnStdSizer.AddButton(btnApply)
+        btnStdSizer.AddButton(btnCancel)
+        btnStdSizer.Realize()
+        
+        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+        btnSizer.Add(item = btnSave, proportion = 0, flag = wx.ALIGN_LEFT | wx.ALL, border = 5)
+        btnSizer.Add(item = btnStdSizer, proportion = 0, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
+        sizer.Add(item = btnSizer, proportion = 0, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
+
+        #
+        # bindings
+        #
+        self.ptitleentry.Bind(wx.EVT_TEXT, self.OnTitle)
+        self.xlabelentry.Bind(wx.EVT_TEXT, self.OnXLabel)
+        self.ylabelentry.Bind(wx.EVT_TEXT, self.OnYLabel)
+
+        self.SetSizer(sizer)
+        sizer.Fit(self)
+
+    def OnTitle(self, event):
+        self.ptitle = event.GetString()
+
+    def OnXLabel(self, event):
+        self.xlabel = event.GetString()
+
+    def OnYLabel(self, event):
+        self.ylabel = event.GetString()
+
+    def UpdateSettings(self):
+        self.properties['font']['prop']['titleSize'] = self.ptitlesize.GetValue()
+        self.properties['font']['prop']['axisSize'] = self.axislabelsize.GetValue()
+
+        family = self.ffamilydict[self.ffamilycb.GetStringSelection()]
+        self.properties['font']['wxfont'].SetFamily(family)
+        style = self.fstyledict[self.fstylecb.GetStringSelection()]
+        self.properties['font']['wxfont'].SetStyle(style)
+        weight = self.fwtdict[self.fwtcb.GetStringSelection()]
+        self.properties['font']['wxfont'].SetWeight(weight)
+
+    def OnSave(self, event):
+        """!Button 'Save' pressed"""
+        self.OnApply(None)
+        fileSettings = {}
+        UserSettings.ReadSettingsFile(settings = fileSettings)
+        fileSettings[self.plottype] = UserSettings.Get(group = self.plottype)
+        UserSettings.SaveToFile(fileSettings)
+        self.parent.parent.GetLayerManager().goutput.WriteLog(_('Plot text sizes saved to file \'%s\'.') % UserSettings.filePath)
+        self.EndModal(wx.ID_OK)
+
+    def OnApply(self, event):
+        """!Button 'Apply' pressed"""
+        self.UpdateSettings()
+        self.parent.OnPlotText(self)
+        
+    def OnOk(self, event):
+        """!Button 'OK' pressed"""
+        self.OnApply(None)
+        self.EndModal(wx.ID_OK)
+
+    def OnCancel(self, event):
+        """!Button 'Cancel' pressed"""
+        self.EndModal(wx.ID_CANCEL)
+        
+class OptDialog(wx.Dialog):
+    def __init__(self, parent, id, title, plottype = '', 
+                 style = wx.DEFAULT_DIALOG_STYLE, **kwargs): 
+        """!Dialog to set various options for data plotted, including: line
+        width, color, style; marker size, color, fill, and style; grid
+        and legend options.
+        """
+        wx.Dialog.__init__(self, parent, id, title, style = style, **kwargs)
+
+        # init variables
+        self.parent = parent
+        self.linestyledict = parent.linestyledict
+        self.ptfilldict = parent.ptfilldict
+        self.parent = parent
+        self.plottype = plottype
+        
+        self.pttypelist = ['circle',
+                           'dot',
+                           'square',
+                           'triangle',
+                           'triangle_down',
+                           'cross',
+                           'plus']
+        
+        self.axislist = ['min',
+                         'auto',
+                         'custom']
+
+        # widgets ids
+        self.wxId = {}
+        
+        self.parent = parent
+
+        # read-only
+        self.raster = self.parent.raster
+        self.rasterList = self.parent.rasterList
+        self.properties = self.parent.properties
+        self.map = ''
+        
+        if len(self.rasterList) == 0:
+            wx.MessageBox(parent = self,
+                              message = _("No map or image group selected to plot."),
+                              caption = _("Warning"), style = wx.OK | wx.ICON_ERROR)
+            
+        self._do_layout()
+        
+    def _do_layout(self):
+        """!Options dialog layout
+        """
+        sizer = wx.BoxSizer(wx.VERTICAL)
+
+        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                           label = " %s " % _("Plot settings")) 
+        boxMainSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
+
+        self.wxId['pcolor']  = 0
+        self.wxId['pwidth']  = 0
+        self.wxId['pstyle']  = 0
+        self.wxId['psize'] = 0
+        self.wxId['ptype'] = 0
+        self.wxId['pfill'] = 0
+        self.wxId['plegend'] = 0
+        self.wxId['marker'] = {}
+        self.wxId['x-axis'] = {}
+        self.wxId['y-axis'] = {}
+        
+        #
+        # plot line settings and point settings
+        #
+        if len(self.rasterList) == 0: return
+        
+        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                           label = _("Map/image plotted"))
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+        
+        row = 0
+        choicelist = []
+        for i in self.rasterList:
+            choicelist.append(str(i))
+
+        self.mapchoice = wx.Choice(parent = self, id = wx.ID_ANY, size = (300, -1),
+                                   choices = choicelist)
+        self.mapchoice.SetToolTipString(_("Settings for selected map"))
+
+        if not self.map:
+            self.map = self.rasterList[self.mapchoice.GetCurrentSelection()]
+        else:
+            self.mapchoice.SetStringSelection(str(self.map))
+            
+                
+        gridSizer.Add(item = self.mapchoice, flag = wx.ALIGN_CENTER_VERTICAL, 
+                      pos = (row, 0), span = (1, 2))
+        
+        #
+        # options for profile
+        #
+        row +=1            
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Line color"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (row, 0))
+        color = csel.ColourSelect(parent = self, id = wx.ID_ANY, colour = self.raster[self.map]['pcolor'])
+        self.wxId['pcolor'] = color.GetId()
+        gridSizer.Add(item = color, pos = (row, 1))
+
+        row += 1
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Line width"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (row, 0))
+        width = wx.SpinCtrl(parent = self, id = wx.ID_ANY, value = "",
+                             size = (50,-1), style = wx.SP_ARROW_KEYS)
+        width.SetRange(1, 10)
+        width.SetValue(self.raster[self.map]['pwidth'])
+        self.wxId['pwidth'] = width.GetId()
+        gridSizer.Add(item = width, pos = (row, 1))
+
+        row +=1
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Line style"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (row, 0))
+        style = wx.Choice(parent = self, id = wx.ID_ANY, 
+                             size = (120, -1), choices = self.linestyledict.keys())
+        style.SetStringSelection(self.raster[self.map]['pstyle'])
+        self.wxId['pstyle'] = style.GetId()
+        gridSizer.Add(item = style, pos = (row, 1))
+
+        row += 1
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Legend"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (row, 0))
+        legend = wx.TextCtrl(parent = self, id = wx.ID_ANY, value = "", size = (200,-1))
+        legend.SetValue(self.raster[self.map]['plegend'])
+        gridSizer.Add(item = legend, pos = (row, 1))
+        self.wxId['plegend'] = legend.GetId()
+        
+        boxSizer.Add(item = gridSizer)
+        boxMainSizer.Add(item = boxSizer, flag = wx.ALL, border = 3)
+
+        #
+        # segment marker settings for profiles
+        #       
+        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                           label = " %s " % _("Transect segment marker settings"))
+        
+        boxSizer = wx.StaticBoxSizer(box, wx.VERTICAL)
+        
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Color"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (0, 0))
+        ptcolor = csel.ColourSelect(parent = self, id = wx.ID_ANY, colour = self.properties['marker']['color'])
+        self.wxId['marker']['color'] = ptcolor.GetId()
+        gridSizer.Add(item = ptcolor, pos = (0, 1))
+
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Size"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (1, 0))
+        ptsize = wx.SpinCtrl(parent = self, id = wx.ID_ANY, value = "",
+                             size = (50, -1), style = wx.SP_ARROW_KEYS)
+        ptsize.SetRange(1, 10)
+        ptsize.SetValue(self.properties['marker']['size'])
+        self.wxId['marker']['size'] = ptsize.GetId()
+        gridSizer.Add(item = ptsize, pos = (1, 1))
+        
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Fill"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (2, 0))
+        ptfill = wx.Choice(parent = self, id = wx.ID_ANY, 
+                           size = (120, -1), choices = self.ptfilldict.keys())
+        ptfill.SetStringSelection(self.properties['marker']['fill'])
+        self.wxId['marker']['fill'] = ptfill.GetId()
+        gridSizer.Add(item = ptfill, pos = (2, 1))
+        
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Legend"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (3, 0))
+        ptlegend = wx.TextCtrl(parent = self, id = wx.ID_ANY, value = "", size = (200,-1))
+        ptlegend.SetValue(self.properties['marker']['legend'])
+        self.wxId['marker']['legend'] = ptlegend.GetId()
+        gridSizer.Add(item = ptlegend, pos = (3, 1))
+                
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Style"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (4, 0))
+        pttype = wx.Choice(parent = self, size = (200, -1), choices = self.pttypelist)
+        pttype.SetStringSelection(self.properties['marker']['type'])
+        self.wxId['marker']['type'] = pttype.GetId()
+        gridSizer.Add(item = pttype, pos = (4, 1))
+
+        boxSizer.Add(item = gridSizer)
+        boxMainSizer.Add(item = boxSizer, flag = wx.ALL, border = 3)
+                        
+        sizer.Add(item = boxMainSizer, flag = wx.ALL | wx.EXPAND, border = 3)
+
+        #
+        # axis options for all plots
+        #
+        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                           label = " %s " % _("Axis settings"))
+        boxMainSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
+
+        middleSizer = wx.BoxSizer(wx.HORIZONTAL)
+
+        idx = 0
+        for axis, atype in [(_("X-Axis"), 'x-axis'),
+                     (_("Y-Axis"), 'y-axis')]:
+            box = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                               label = " %s " % axis)
+            boxSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
+            gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+
+            prop = self.properties[atype]['prop']
+            
+            row = 0
+            label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Scale"))
+            gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (row, 0))
+            type = wx.Choice(parent = self, id = wx.ID_ANY, 
+                             size = (100, -1), choices = self.axislist)
+            type.SetStringSelection(prop['type']) 
+            type.SetToolTipString(_("Automatic axis scaling, custom max and min, or scale matches data range (min)" ))
+            self.wxId[atype]['type'] = type.GetId()
+            gridSizer.Add(item = type, pos = (row, 1))
+                        
+            row += 1
+            label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Custom min"))
+            gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (row, 0))
+            min = wx.TextCtrl(parent = self, id = wx.ID_ANY, value = "", size = (70, -1))
+            min.SetValue(str(prop['min']))
+            self.wxId[atype]['min'] = min.GetId()
+            gridSizer.Add(item = min, pos = (row, 1))
+
+            row += 1
+            label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Custom max"))
+            gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (row, 0))
+            max = wx.TextCtrl(parent = self, id = wx.ID_ANY, value = "", size = (70, -1))
+            max.SetValue(str(prop['max']))
+            self.wxId[atype]['max'] = max.GetId()
+            gridSizer.Add(item = max, pos = (row, 1))
+            
+            row += 1
+            log = wx.CheckBox(parent = self, id = wx.ID_ANY, label = _("Log scale"))
+            log.SetValue(prop['log'])
+            self.wxId[atype]['log'] = log.GetId()
+            gridSizer.Add(item = log, pos = (row, 0), span = (1, 2))
+
+            if idx == 0:
+                flag = wx.ALL | wx.EXPAND
+            else:
+                flag = wx.TOP | wx.BOTTOM | wx.RIGHT | wx.EXPAND
+
+            boxSizer.Add(item = gridSizer, flag = wx.ALL, border = 3)
+            boxMainSizer.Add(item = boxSizer, flag = flag, border = 3)
+
+            idx += 1
+            
+        middleSizer.Add(item = boxMainSizer, flag = wx.ALL | wx.EXPAND, border = 3)
+
+        #
+        # grid & legend options for all plots
+        #
+        self.wxId['grid'] = {}
+        self.wxId['legend'] = {}
+        self.wxId['font'] = {}
+        box = wx.StaticBox(parent = self, id = wx.ID_ANY,
+                           label = " %s " % _("Grid and Legend settings"))
+        boxMainSizer = wx.StaticBoxSizer(box, wx.HORIZONTAL)
+        gridSizer = wx.GridBagSizer(vgap = 5, hgap = 5)
+
+        row = 0
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Grid color"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (row, 0))
+        gridcolor = csel.ColourSelect(parent = self, id = wx.ID_ANY, colour = self.properties['grid']['color'])
+        self.wxId['grid']['color'] = gridcolor.GetId()
+        gridSizer.Add(item = gridcolor, pos = (row, 1))
+
+        row +=1
+        gridshow = wx.CheckBox(parent = self, id = wx.ID_ANY, label = _("Show grid"))
+        gridshow.SetValue(self.properties['grid']['enabled'])
+        self.wxId['grid']['enabled'] = gridshow.GetId()
+        gridSizer.Add(item = gridshow, pos = (row, 0), span = (1, 2))
+
+        row +=1
+        label = wx.StaticText(parent = self, id = wx.ID_ANY, label = _("Legend font size"))
+        gridSizer.Add(item = label, flag = wx.ALIGN_CENTER_VERTICAL, pos = (row, 0))
+        legendfontsize = wx.SpinCtrl(parent = self, id = wx.ID_ANY, value = "", 
+                                     size = (50, -1), style = wx.SP_ARROW_KEYS)
+        legendfontsize.SetRange(5,100)
+        legendfontsize.SetValue(int(self.properties['font']['prop']['legendSize']))
+        self.wxId['font']['legendSize'] = legendfontsize.GetId()
+        gridSizer.Add(item = legendfontsize, pos = (row, 1))
+
+        row += 1
+        legendshow = wx.CheckBox(parent = self, id = wx.ID_ANY, label = _("Show legend"))
+        legendshow.SetValue(self.properties['legend']['enabled'])
+        self.wxId['legend']['enabled'] = legendshow.GetId()
+        gridSizer.Add(item = legendshow, pos = (row, 0), span = (1, 2))
+
+        boxMainSizer.Add(item = gridSizer, flag = flag, border = 3)
+
+        middleSizer.Add(item = boxMainSizer, flag = wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND, border = 3)
+
+        sizer.Add(item = middleSizer, flag = wx.ALL, border = 0)
+        
+        #
+        # line & buttons
+        #
+        line = wx.StaticLine(parent = self, id = wx.ID_ANY, size = (20, -1), style = wx.LI_HORIZONTAL)
+        sizer.Add(item = line, proportion = 0,
+                  flag = wx.GROW|wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, border = 3)
+
+        #
+        # buttons
+        #
+        btnSave = wx.Button(self, wx.ID_SAVE)
+        btnApply = wx.Button(self, wx.ID_APPLY)
+        btnOk = wx.Button(self, wx.ID_OK)
+        btnCancel = wx.Button(self, wx.ID_CANCEL)
+        btnOk.SetDefault()
+
+        # tooltips for buttons
+        btnApply.SetToolTipString(_("Apply changes for the current session"))
+        btnOk.SetToolTipString(_("Apply changes for the current session and close dialog"))
+        btnSave.SetToolTipString(_("Apply and save changes to user settings file (default for next sessions)"))
+        btnCancel.SetToolTipString(_("Close dialog and ignore changes"))
+
+        # sizers
+        btnStdSizer = wx.StdDialogButtonSizer()
+        btnStdSizer.AddButton(btnOk)
+        btnStdSizer.AddButton(btnApply)
+        btnStdSizer.AddButton(btnCancel)
+        btnStdSizer.Realize()
+        
+        btnSizer = wx.BoxSizer(wx.HORIZONTAL)
+        btnSizer.Add(item = btnSave, proportion = 0, flag = wx.ALIGN_LEFT | wx.ALL, border = 5)
+        btnSizer.Add(item = btnStdSizer, proportion = 0, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
+        sizer.Add(item = btnSizer, proportion = 0, flag = wx.ALIGN_RIGHT | wx.ALL, border = 5)
+
+        #
+        # bindings for buttons and map plot settings controls
+        #
+        self.mapchoice.Bind(wx.EVT_CHOICE, self.OnSetMap)
+
+        # bindings
+        btnApply.Bind(wx.EVT_BUTTON, self.OnApply)
+        btnOk.Bind(wx.EVT_BUTTON, self.OnOk)
+        btnOk.SetDefault()
+        btnSave.Bind(wx.EVT_BUTTON, self.OnSave)
+        btnCancel.Bind(wx.EVT_BUTTON, self.OnCancel)
+
+        self.SetSizer(sizer)
+        sizer.Fit(self)
+
+    def OnSetMap(self, event):
+        """!Handler for changing map selection"""
+        idx = event.GetSelection()
+        self.map = self.rasterList[idx]
+        
+        # update settings controls for all plots
+        self.FindWindowById(self.wxId['pcolor']).SetColour(self.raster[self.map]['pcolor'])
+        self.FindWindowById(self.wxId['plegend']).SetValue(self.raster[self.map]['plegend'])
+        self.FindWindowById(self.wxId['pwidth']).SetValue(self.raster[self.map]['pwidth'])
+        self.FindWindowById(self.wxId['pstyle']).SetStringSelection(self.raster[self.map]['pstyle'])
+            
+        self.Refresh()
+        
+    def OnSetOpt(self, event):
+        """!Handler for changing any other option"""
+        self.map = self.rasterList[self.mapchoice.GetCurrentSelection()]
+        self.UpdateSettings()
+        self.parent.SetGraphStyle()
+        p = self.parent.CreatePlotList()
+        self.parent.DrawPlot(p)
+
+    def UpdateSettings(self):
+        """!Apply settings to each map and to entire plot"""
+        self.raster[self.map]['pcolor'] = self.FindWindowById(self.wxId['pcolor']).GetColour()
+        self.properties['raster']['pcolor'] = self.raster[self.map]['pcolor']
+        
+        self.raster[self.map]['plegend'] = self.FindWindowById(self.wxId['plegend']).GetValue()
+        
+        self.raster[self.map]['pwidth'] = int(self.FindWindowById(self.wxId['pwidth']).GetValue())
+        self.properties['raster']['pwidth'] = self.raster[self.map]['pwidth']
+        self.raster[self.map]['pstyle'] = self.FindWindowById(self.wxId['pstyle']).GetStringSelection()
+        self.properties['raster']['pstyle'] = self.raster[self.map]['pstyle']
+            
+        # update settings for entire plot
+        for axis in ('x-axis', 'y-axis'):
+            self.properties[axis]['prop']['type'] = self.FindWindowById(self.wxId[axis]['type']).GetStringSelection()
+            self.properties[axis]['prop']['min'] = float(self.FindWindowById(self.wxId[axis]['min']).GetValue())
+            self.properties[axis]['prop']['max'] = float(self.FindWindowById(self.wxId[axis]['max']).GetValue())
+            self.properties[axis]['prop']['log'] = self.FindWindowById(self.wxId[axis]['log']).IsChecked()
+
+        if self.plottype == 'profile':
+            self.properties['marker']['color'] = self.FindWindowById(self.wxId['marker']['color']).GetColour()
+            self.properties['marker']['fill'] = self.FindWindowById(self.wxId['marker']['fill']).GetStringSelection()
+            self.properties['marker']['size'] = self.FindWindowById(self.wxId['marker']['size']).GetValue()
+            self.properties['marker']['type'] = self.FindWindowById(self.wxId['marker']['type']).GetStringSelection()
+            self.properties['marker']['legend'] = self.FindWindowById(self.wxId['marker']['legend']).GetValue()
+
+        self.properties['grid']['color'] = self.FindWindowById(self.wxId['grid']['color']).GetColour()
+        self.properties['grid']['enabled'] = self.FindWindowById(self.wxId['grid']['enabled']).IsChecked()
+
+        # this makes more sense in the text properties, including for settings update. But will need to change
+        # layout for controls to text dialog too.
+        self.properties['font']['prop']['legendSize'] = self.FindWindowById(self.wxId['font']['legendSize']).GetValue()
+        self.properties['legend']['enabled'] = self.FindWindowById(self.wxId['legend']['enabled']).IsChecked()
+
+    def OnSave(self, event):
+        """!Button 'Save' pressed"""
+        self.OnApply(None)
+        fileSettings = {}
+        UserSettings.ReadSettingsFile(settings = fileSettings)
+        fileSettings[self.plottype] = UserSettings.Get(group = self.plottype)
+        UserSettings.SaveToFile(fileSettings)
+        self.parent.parent.GetLayerManager().goutput.WriteLog(_('Plot settings saved to file \'%s\'.') % UserSettings.filePath)
+        self.Close()
+
+    def OnApply(self, event):
+        """!Button 'Apply' pressed. Does not close dialog"""
+        self.UpdateSettings()
+        self.parent.SetGraphStyle()
+        p = self.parent.CreatePlotList()
+        self.parent.DrawPlot(p)
+
+    def OnOk(self, event):
+        """!Button 'OK' pressed"""
+        self.OnApply(None)
+        self.EndModal(wx.ID_OK)
+        
+    def OnCancel(self, event):
+        """!Button 'Cancel' pressed"""
+        self.Close()
+     
diff --git a/gui/wxpython/wxplot/profile.py b/gui/wxpython/wxplot/profile.py
new file mode 100644
index 0000000..d69af35
--- /dev/null
+++ b/gui/wxpython/wxplot/profile.py
@@ -0,0 +1,455 @@
+"""!
+ at package wxplot.profile
+
+ at brief Profiling using PyPlot
+
+Classes:
+ - profile::ProfileFrame
+ - profile::ProfileToolbar
+
+(C) 2011-2012 by the GRASS Development Team
+
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
+
+ at author Michael Barton, Arizona State University
+"""
+
+import os
+import sys
+import math
+
+import wx
+import wx.lib.plot as plot
+
+import grass.script as grass
+
+try:
+    import numpy
+except ImportError:
+    msg = _("This module requires the NumPy module, which could not be "
+            "imported. It probably is not installed (it's not part of the "
+            "standard Python distribution). See the Numeric Python site "
+            "(http://numpy.scipy.org) for information on downloading source or "
+            "binaries.")
+    print >> sys.stderr, "wxplot.py: " + msg
+
+from wxplot.base       import BasePlotFrame, PlotIcons
+from gui_core.toolbars import BaseToolbar, BaseIcons
+from wxplot.dialogs    import ProfileRasterDialog, PlotStatsFrame
+from core.gcmd         import RunCommand, GWarning, GError, GMessage
+
+class ProfileFrame(BasePlotFrame):
+    """!Mainframe for displaying profile of one or more raster maps. Uses wx.lib.plot.
+    """
+    def __init__(self, parent, id = wx.ID_ANY, style = wx.DEFAULT_FRAME_STYLE,
+                 size = wx.Size(700, 400),
+                 rasterList = [], **kwargs):
+        BasePlotFrame.__init__(self, parent, size = size, **kwargs)
+
+        self.toolbar = ProfileToolbar(parent = self)
+        self.SetToolBar(self.toolbar)
+        self.SetTitle(_("GRASS Profile Analysis Tool"))
+        
+        #
+        # Init variables
+        #
+        self.rasterList = rasterList
+        self.plottype = 'profile'
+        self.coordstr = ''              # string of coordinates for r.profile
+        self.seglist = []               # segment endpoint list
+        self.ppoints = ''               # segment endpoints data         
+        self.transect_length = 0.0      # total transect length        
+        self.ptitle = _('Profile of')   # title of window
+        self.colorList =  ["blue", "red", "green", "yellow", "magenta", "cyan",
+                           "aqua", "black", "grey", "orange", "brown", "purple", "violet",
+                           "indigo"]
+
+        self._initOpts()
+        
+        if len(self.rasterList) > 0: # set raster name(s) from layer manager if a map is selected
+            self.raster = self.InitRasterOpts(self.rasterList, self.plottype)
+        else:
+            self.raster = {}
+                
+        # determine units (axis labels)
+        if self.parent.Map.projinfo['units'] != '':
+            self.xlabel = _('Distance (%s)') % self.parent.Map.projinfo['units']
+        else:
+            self.xlabel = _("Distance along transect")
+        self.ylabel = _("Cell values")
+        
+    def _initOpts(self):
+        """!Initialize plot options
+        """
+        self.InitPlotOpts('profile')
+
+    def OnDrawTransect(self, event):
+        """!Draws transect to profile in map display
+        """
+        self.mapwin.polycoords = []
+        self.seglist = []
+        self.mapwin.ClearLines(self.mapwin.pdc)
+        self.ppoints = ''
+
+        self.parent.SetFocus()
+        self.parent.Raise()
+        
+        self.mapwin.mouse['use'] = 'profile'
+        self.mapwin.mouse['box'] = 'line'
+        self.mapwin.pen = wx.Pen(colour = 'Red', width = 2, style = wx.SHORT_DASH)
+        self.mapwin.polypen = wx.Pen(colour = 'dark green', width = 2, style = wx.SHORT_DASH)
+        self.mapwin.SetCursor(self.Parent.cursors["cross"])
+
+    def OnSelectRaster(self, event):
+        """!Select raster map(s) to profile
+        """
+        dlg = ProfileRasterDialog(parent = self)
+
+        if dlg.ShowModal() == wx.ID_OK:
+            self.rasterList = dlg.rasterList
+            self.raster = self.InitRasterOpts(self.rasterList, self.plottype)
+            
+            # plot profile
+            if len(self.mapwin.polycoords) > 0 and len(self.rasterList) > 0:
+                self.OnCreateProfile(event = None)
+
+        dlg.Destroy()
+
+    def SetupProfile(self):
+        """!Create coordinate string for profiling. Create segment list for
+           transect segment markers.
+        """
+
+        #
+        # create list of coordinate points for r.profile
+        #                
+        dist = 0
+        cumdist = 0
+        self.coordstr = ''
+        lasteast = lastnorth = None
+        
+        region = grass.region()
+        insideRegion = True
+        if len(self.mapwin.polycoords) > 0:
+            for point in self.mapwin.polycoords:
+                if not (region['w'] <= point[0] <= region['e'] and region['s'] <= point[1] <= region['n']):
+                    insideRegion = False
+                # build string of coordinate points for r.profile
+                if self.coordstr == '':
+                    self.coordstr = '%d,%d' % (point[0], point[1])
+                else:
+                    self.coordstr = '%s,%d,%d' % (self.coordstr, point[0], point[1])
+
+        if not insideRegion:
+            GWarning(message = _("Not all points of profile lie inside computational region."),
+                     parent = self)
+
+        if len(self.rasterList) == 0:
+            return
+
+        # title of window
+        self.ptitle = _('Profile of')
+
+        #
+        # create list of coordinates for transect segment markers
+        #
+        if len(self.mapwin.polycoords) > 0:
+            self.seglist = []
+            for point in self.mapwin.polycoords:
+                # get value of raster cell at coordinate point
+                ret = RunCommand('r.what',
+                                 parent = self,
+                                 read = True,
+                                 input = self.rasterList[0],
+                                 east_north = '%d,%d' % (point[0],point[1]))
+                
+                val = ret.splitlines()[0].split('|')[3]
+                if val == None or val == '*': continue
+                val = float(val)
+                
+                # calculate distance between coordinate points
+                if lasteast and lastnorth:
+                    dist = math.sqrt(math.pow((lasteast-point[0]),2) + math.pow((lastnorth-point[1]),2))
+                cumdist += dist
+                
+                #store total transect length
+                self.transect_length = cumdist
+
+                # build a list of distance,value pairs for each segment of transect
+                self.seglist.append((cumdist,val))
+                lasteast = point[0]
+                lastnorth = point[1]
+
+            # delete extra first segment point
+            try:
+                self.seglist.pop(0)
+            except:
+                pass
+
+        #
+        # create datalist of dist/value pairs and y labels for each raster map
+        #    
+        self.ylabel = ''
+        i = 0
+        
+        for r in self.raster.iterkeys():
+            self.raster[r]['datalist'] = []
+            datalist = self.CreateDatalist(r, self.coordstr)
+            if len(datalist) > 0:   
+                self.raster[r]['datalist'] = datalist
+
+                # update ylabel to match units if they exist           
+                if self.raster[r]['units'] != '':
+                    self.ylabel += '%s (%d),' % (r['units'], i)
+                i += 1
+
+                # update title
+                self.ptitle += ' %s ,' % r.split('@')[0]
+
+        self.ptitle = self.ptitle.rstrip(',')
+            
+        if self.ylabel == '':
+            self.ylabel = _('Raster values')
+        else:
+            self.ylabel = self.ylabel.rstrip(',')
+
+    def CreateDatalist(self, raster, coords):
+        """!Build a list of distance, value pairs for points along transect using r.profile
+        """
+        datalist = []
+        
+        # keep total number of transect points to 500 or less to avoid 
+        # freezing with large, high resolution maps
+        region = grass.region()
+        curr_res = min(float(region['nsres']),float(region['ewres']))
+        transect_rec = 0
+        if self.transect_length / curr_res > 500:
+            transect_res = self.transect_length / 500
+        else: transect_res = curr_res
+        
+        ret = RunCommand("r.profile",
+                         parent = self,
+                         input = raster,
+                         profile = coords,
+                         res = transect_res,
+                         null = "nan",
+                         quiet = True,
+                         read = True)
+        
+        if not ret:
+            return []
+            
+        for line in ret.splitlines():
+            dist, elev = line.strip().split(' ')
+            if dist == None or dist == '' or dist == 'nan' or \
+                elev == None or elev == '' or elev == 'nan':
+                continue
+            dist = float(dist)
+            elev = float(elev)
+            datalist.append((dist,elev))
+
+        return datalist
+
+    def OnCreateProfile(self, event):
+        """!Main routine for creating a profile. Uses r.profile to
+        create a list of distance,cell value pairs. This is passed to
+        plot to create a line graph of the profile. If the profile
+        transect is in multiple segments, these are drawn as
+        points. Profile transect is drawn, using methods in mapdisp.py
+        """
+            
+        if len(self.mapwin.polycoords) == 0 or len(self.rasterList) == 0:
+            dlg = wx.MessageDialog(parent = self,
+                                   message = _('You must draw a transect to profile in the map display window.'),
+                                   caption = _('Nothing to profile'),
+                                   style = wx.OK | wx.ICON_INFORMATION | wx.CENTRE)
+            dlg.ShowModal()
+            dlg.Destroy()
+            return
+
+        self.mapwin.SetCursor(self.parent.cursors["default"])
+        self.SetCursor(self.parent.cursors["default"])
+        self.SetGraphStyle()
+        self.SetupProfile()
+        p = self.CreatePlotList()
+        self.DrawPlot(p)
+
+        # reset transect
+        self.mapwin.mouse['begin'] = self.mapwin.mouse['end'] = (0.0,0.0)
+        self.mapwin.mouse['use'] = 'pointer'
+        self.mapwin.mouse['box'] = 'point'
+
+    def CreatePlotList(self):
+        """!Create a plot data list from transect datalist and
+            transect segment endpoint coordinates.
+        """
+        # graph the distance, value pairs for the transect
+        self.plotlist = []
+
+        # Add segment marker points to plot data list
+        if len(self.seglist) > 0 :
+            self.ppoints = plot.PolyMarker(self.seglist,
+                                           legend = ' ' + self.properties['marker']['legend'],
+                                           colour = wx.Color(self.properties['marker']['color'][0],
+                                                           self.properties['marker']['color'][1],
+                                                           self.properties['marker']['color'][2],
+                                                           255),
+                                           size = self.properties['marker']['size'],
+                                           fillstyle = self.ptfilldict[self.properties['marker']['fill']],
+                                           marker = self.properties['marker']['type'])
+            self.plotlist.append(self.ppoints)
+
+        # Add profile distance/elevation pairs to plot data list for each raster profiled
+        for r in self.rasterList:
+            col = wx.Color(self.raster[r]['pcolor'][0],
+                           self.raster[r]['pcolor'][1],
+                           self.raster[r]['pcolor'][2],
+                           255)
+            self.raster[r]['pline'] = plot.PolyLine(self.raster[r]['datalist'],
+                                                    colour = col,
+                                                    width = self.raster[r]['pwidth'],
+                                                    style = self.linestyledict[self.raster[r]['pstyle']],
+                                                    legend = self.raster[r]['plegend'])
+
+            self.plotlist.append(self.raster[r]['pline'])
+
+        if len(self.plotlist) > 0:        
+            return self.plotlist
+        else:
+            return None
+
+    def Update(self):
+        """!Update profile after changing options
+        """
+        self.SetGraphStyle()
+        p = self.CreatePlotList()
+        self.DrawPlot(p)
+
+    def SaveProfileToFile(self, event):
+        """!Save r.profile data to a csv file
+        """    
+        dlg = wx.FileDialog(parent = self,
+                            message = _("Choose prefix for file(s) where to save profile values..."),
+                            defaultDir = os.getcwd(), 
+                            wildcard = _("Comma separated value (*.csv)|*.csv"), style = wx.SAVE)
+        pfile = []
+        if dlg.ShowModal() == wx.ID_OK:
+            path = dlg.GetPath()
+            for r in self.rasterList:
+                pfile.append(path + '_' + str(r.replace('@', '_')) + '.csv')
+                if os.path.exists(pfile[-1]):
+                    dlgOv = wx.MessageDialog(self,
+                                             message = _("File <%s> already exists. "
+                                                         "Do you want to overwrite this file?") % pfile[-1],
+                                             caption = _("Overwrite file?"),
+                                             style = wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION)
+                    if dlgOv.ShowModal() != wx.ID_YES:
+                        pfile.pop()
+                        dlgOv.Destroy()
+                        continue
+                
+                try:
+                    fd = open(pfile[-1], "w")
+                except IOError, e:
+                    GError(parent = self,
+                           message = _("Unable to open file <%(file)s> for "
+                                       "writing.\nReason: %(e)s") % {'file': pfile[-1],
+                                                                     'e': e})
+                    dlg.Destroy()
+                    return
+                
+                for datapair in self.raster[r]['datalist']:
+                    fd.write('%d,%d\n' % (float(datapair[0]),float(datapair[1])))
+                
+                fd.close()
+        
+        dlg.Destroy()
+        if pfile:
+            message = _("%(l)d files created:\n%(p)s") % {'l': len(pfile),
+                                                          'p':'\n'.join(pfile)}
+        else:
+            message = _("No files generated.")
+        
+        GMessage(parent = self, message = message)
+                        
+    def OnStats(self, event):
+        """!Displays regression information in messagebox
+        """
+        message = []
+        title = _('Statistics for Profile(s)')
+
+        for r in self.raster.iterkeys():
+            try:
+                rast = r.split('@')[0] 
+                statstr = 'Profile of %s\n\n' % rast
+
+                iterable = (i[1] for i in self.raster[r]['datalist'])            
+                a = numpy.fromiter(iterable, numpy.float)
+                
+                statstr += 'n: %f\n' % a.size
+                statstr += 'minimum: %f\n' % numpy.amin(a)
+                statstr += 'maximum: %f\n' % numpy.amax(a)
+                statstr += 'range: %f\n' % numpy.ptp(a)
+                statstr += 'mean: %f\n' % numpy.mean(a)
+                statstr += 'standard deviation: %f\n' % numpy.std(a)
+                statstr += 'variance: %f\n' % numpy.var(a)
+                cv = numpy.std(a)/numpy.mean(a)
+                statstr += 'coefficient of variation: %f\n' % cv
+                statstr += 'sum: %f\n' % numpy.sum(a)
+                statstr += 'median: %f\n' % numpy.median(a)
+                statstr += 'distance along transect: %f\n\n' % self.transect_length       
+                message.append(statstr)
+            except:
+                pass
+            
+        stats = PlotStatsFrame(self, id = wx.ID_ANY, message = message, 
+                               title = title)
+
+        if stats.Show() == wx.ID_CLOSE:
+            stats.Destroy()       
+
+    
+class ProfileToolbar(BaseToolbar):
+    """!Toolbar for profiling raster map
+    """ 
+    def __init__(self, parent):
+        BaseToolbar.__init__(self, parent)
+        
+        self.InitToolbar(self._toolbarData())
+        
+        # realize the toolbar
+        self.Realize()
+        
+    def _toolbarData(self):
+        """!Toolbar data"""
+        return self._getToolbarData((('addraster', BaseIcons["addRast"],
+                                      self.parent.OnSelectRaster),
+                                     ('transect', PlotIcons["transect"],
+                                      self.parent.OnDrawTransect),
+                                     (None, ),
+                                     ('draw', PlotIcons["draw"],
+                                      self.parent.OnCreateProfile),
+                                     ('erase', BaseIcons["erase"],
+                                      self.parent.OnErase),
+                                     ('drag', BaseIcons['pan'],
+                                      self.parent.OnDrag),
+                                     ('zoom', BaseIcons['zoomIn'],
+                                      self.parent.OnZoom),
+                                     ('unzoom', BaseIcons['zoomBack'],
+                                      self.parent.OnRedraw),
+                                     (None, ),
+                                     ('statistics', PlotIcons['statistics'],
+                                      self.parent.OnStats),
+                                     ('datasave', PlotIcons["save"],
+                                      self.parent.SaveProfileToFile),
+                                     ('image', BaseIcons["saveFile"],
+                                      self.parent.SaveToFile),
+                                     ('print', BaseIcons["print"],
+                                      self.parent.PrintMenu),
+                                     (None, ),
+                                     ('settings', PlotIcons["options"],
+                                      self.parent.PlotOptionsMenu),
+                                     ('quit', PlotIcons["quit"],
+                                      self.parent.OnQuit),
+                                     ))
diff --git a/imagery/i.landsat.acca/Makefile b/imagery/i.landsat.acca/Makefile
new file mode 100644
index 0000000..9f03616
--- /dev/null
+++ b/imagery/i.landsat.acca/Makefile
@@ -0,0 +1,10 @@
+MODULE_TOPDIR = ../..
+
+PGM = i.landsat.acca
+
+LIBES = $(GISLIB)
+DEPENDENCIES = $(GISDEP)
+
+include $(MODULE_TOPDIR)/include/Make/Module.make
+
+default: cmd
diff --git a/imagery/i.landsat.acca/algorithm.c b/imagery/i.landsat.acca/algorithm.c
new file mode 100644
index 0000000..f639478
--- /dev/null
+++ b/imagery/i.landsat.acca/algorithm.c
@@ -0,0 +1,495 @@
+/* File: algorithm.c
+ *
+ *  AUTHOR:    E. Jorge Tizado, Spain 2010
+ *
+ *  COPYRIGHT: (c) 2010 E. Jorge Tizado
+ *             This program is free software under the GNU General Public
+ *             License (>=v2). Read the file COPYING that comes with GRASS
+ *             for details.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <unistd.h>
+#include <grass/gis.h>
+#include <grass/raster.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+
+#define SCALE   200.
+#define K_BASE  230.
+
+
+/* value and count */
+#define TOTAL 0
+#define WARM  1
+#define COLD  2
+#define SNOW  3
+#define SOIL  4
+
+/* signa */
+#define COVER       1
+#define SUM_COLD    0
+#define SUM_WARM    1
+#define KMEAN       2
+#define KMAX        3
+#define KMIN        4
+
+/* re-use value */
+#define KLOWER      0
+#define KUPPER      1
+#define MEAN        2
+#define SKEW        3
+#define DSTD        4
+
+
+/**********************************************************
+ *
+ * Automatic Cloud Cover Assessment (ACCA): Irish 2000
+ *
+ **********************************************************/
+
+/*--------------------------------------------------------
+  CONSTANTS
+  Usar esta forma para que via extern puedan modificarse
+  como opciones desde el programa main.
+ ---------------------------------------------------------*/
+
+double th_1 = 0.08;		/* Band 3 Brightness Threshold */
+double th_1_b = 0.07;
+double th_2[] = { -0.25, 0.70 };	/* Normalized Snow Difference Index */
+
+double th_2_b = 0.8;
+double th_3 = 300.;		/* Band 6 Temperature Threshold */
+double th_4 = 225.;		/* Band 5/6 Composite */
+double th_4_b = 0.08;
+double th_5 = 2.35;		/* Band 4/3 Ratio */
+double th_6 = 2.16248;		/* Band 4/2 Ratio */
+double th_7 = 1.0; /* Band 4/5 Ratio */ ;
+double th_8 = 210.;		/* Band 5/6 Composite */
+
+extern int hist_n;
+
+void acca_algorithm(Gfile * out, Gfile band[],
+		    int single_pass, int with_shadow, int cloud_signature)
+{
+    int i, count[5], hist_cold[hist_n], hist_warm[hist_n];
+    double max, value[5], signa[5], idesert, review_warm, shift;
+
+    /* Reset variables ... */
+    for (i = 0; i < 5; i++) {
+	count[i] = 0;
+	value[i] = 0.;
+    }
+    for (i = 0; i < hist_n; i++) {
+	hist_cold[i] = hist_warm[i] = 0;
+    }
+
+    /* FIRST FILTER ... */
+    acca_first(out, band, with_shadow,
+	       count, hist_cold, hist_warm, signa);
+    /* CATEGORIES: NO_DEFINED, WARM_CLOUD, COLD_CLOUD, NULL (= NO_CLOUD) */
+
+    value[WARM] = (double)count[WARM] / (double)count[TOTAL];
+    value[COLD] = (double)count[COLD] / (double)count[TOTAL];
+    value[SNOW] = (double)count[SNOW] / (double)count[TOTAL];
+    value[SOIL] = (double)count[SOIL] / (double)count[TOTAL];
+
+    value[0] = (double)(count[WARM] + count[COLD]);
+    idesert = (value[0] == 0. ? 0. : value[0] / ((double)count[SOIL]));
+
+    /* BAND-6 CLOUD SIGNATURE DEVELOPMENT */
+    if (idesert <= .5 || value[SNOW] > 0.01) {
+	/* Only the cold clouds are used
+	   if snow or desert soil is present */
+	review_warm = 1;
+    }
+    else {
+	/* The cold and warm clouds are combined
+	   and treated as a single population */
+	review_warm = 0;
+	count[COLD] += count[WARM];
+	value[COLD] += value[WARM];
+	signa[SUM_COLD] += signa[SUM_WARM];
+	for (i = 0; i < hist_n; i++)
+	    hist_cold[i] += hist_warm[i];
+    }
+
+    signa[KMEAN] = SCALE * signa[SUM_COLD] / ((double)count[COLD]);
+    signa[COVER] = ((double)count[COLD]) / ((double)count[TOTAL]);
+
+    G_message(_("Preliminary scene analysis:"));
+    G_message(_("* Desert index: %.2lf"), idesert);
+    G_message(_("* Snow cover: %.2lf %%"), 100. * value[SNOW]);
+    G_message(_("* Cloud cover: %.2lf %%"), 100. * signa[COVER]);
+    G_message(_("* Temperature of clouds:"));
+    G_message(_("** Maximum: %.2lf K"), signa[KMAX]);
+    G_message(_("** Mean (%s cloud): %.2lf K"),
+	    (review_warm ? "cold" : "all"), signa[KMEAN]);
+    G_message(_("** Minimum: %.2lf K"), signa[KMIN]);
+
+    /* WARNING: re-use of the variable 'value' with new meaning */
+
+    /* step 14 */
+
+    /* To correct Irish2006: idesert has to be bigger than 0.5 to start pass 2 processing (see Irish2000)
+       because then we have no desert condition (thanks to Matthias Eder, Germany) */
+    if (cloud_signature ||
+	(idesert > .5 && signa[COVER] > 0.004 && signa[KMEAN] < 295.)) {
+	G_message(_("Histogram cloud signature:"));
+
+	value[MEAN] = quantile(0.5, hist_cold) + K_BASE;
+	value[DSTD] = sqrt(moment(2, hist_cold, 1));
+	value[SKEW] = moment(3, hist_cold, 3) / pow(value[DSTD], 3);
+
+	G_message(_("* Mean temperature: %.2lf K"), value[MEAN]);
+	G_message(_("* Standard deviation: %.2lf"), value[DSTD]);
+	G_message(_("* Skewness: %.2lf"), value[SKEW]);
+	G_message(_("* Histogram classes: %d"), hist_n);
+
+	shift = value[SKEW];
+	if (shift > 1.)
+	    shift = 1.;
+	else if (shift < 0.)
+	    shift = 0.;
+
+	max = quantile(0.9875, hist_cold) + K_BASE;
+	value[KUPPER] = quantile(0.975, hist_cold) + K_BASE;
+	value[KLOWER] = quantile(0.835, hist_cold) + K_BASE;
+
+	G_message(_("* 98.75 percentile: %.2lf K"), max);
+	G_message(_("* 97.50 percentile: %.2lf K"), value[KUPPER]);
+	G_message(_("* 83.50 percentile: %.2lf K"), value[KLOWER]);
+
+	/* step 17 & 18 */
+	if (shift > 0.) {
+	    shift *= value[DSTD];
+
+	    if ((value[KUPPER] + shift) > max) {
+                if ((value[KLOWER] + shift) > max) {
+                    value[KLOWER] += (max - value[KUPPER]);
+                }
+                else {
+                    value[KLOWER] += shift;
+                }
+		value[KUPPER] = max;
+	    }
+	    else {
+		value[KLOWER] += shift;
+		value[KUPPER] += shift;
+	    }
+	}
+
+	G_message(_("Maximum temperature:"));
+	G_message(_("* Cold cloud: %.2lf K"), value[KUPPER]);
+	G_message(_("* Warm cloud: %.2lf K"), value[KLOWER]);
+    }
+    else {
+	if (signa[KMEAN] < 295.) {
+	    /* Retained warm and cold clouds */
+	    G_message(_("Result: Scene with clouds"));
+	    review_warm = 0;
+	    value[KUPPER] = 0.;
+	    value[KLOWER] = 0.;
+	}
+	else {
+	    /* Retained cold clouds */
+	    G_message(_("Result: Scene cloud free"));
+	    review_warm = 1;
+	    value[KUPPER] = 0.;
+	    value[KLOWER] = 0.;
+	}
+    }
+
+    /* SECOND FILTER ... */
+    /* By-pass two processing but it retains warm and cold clouds */
+    if (single_pass == TRUE) {
+	review_warm = -1.;
+	value[KUPPER] = 0.;
+	value[KLOWER] = 0.;
+    }
+    acca_second(out, band[BAND6],
+		review_warm, value[KUPPER], value[KLOWER]);
+    /* CATEGORIES: IS_WARM_CLOUD, IS_COLD_CLOUD, IS_SHADOW, NULL (= NO_CLOUD) */
+
+    return;
+}
+
+
+void acca_first(Gfile *out, Gfile band[],
+		int with_shadow,
+		int count[], int cold[], int warm[], double stats[])
+{
+    int i, row, col, nrows, ncols;
+    char *mapset;
+
+    char code;
+    double pixel[5], nsdi, rat56;
+
+    /* Creation of output file */
+    if ((out->fd = G_open_raster_new(out->name, CELL_TYPE)) < 0)
+	G_fatal_error(_("Unable to create raster map <%s>"), out->name);
+
+    out->rast = G_allocate_raster_buf(CELL_TYPE);
+    /* ----- ----- */
+    G_important_message(_("Processing first pass..."));
+
+    stats[SUM_COLD] = 0.;
+    stats[SUM_WARM] = 0.;
+    stats[KMAX] = 0.;
+    stats[KMIN] = 10000.;
+
+    nrows = G_window_rows();
+    ncols = G_window_cols();
+
+    for (row = 0; row < nrows; row++) {
+	G_percent(row, nrows, 2);
+	for (i = BAND2; i <= BAND6; i++) {
+	    if (G_get_d_raster_row(band[i].fd, band[i].rast, row) < 0)
+		G_fatal_error(_("Unable to read raster map <%s> row %d"),
+			      band[i].name, row);
+	}
+	for (col = 0; col < ncols; col++) {
+	    code = NO_DEFINED;
+	    /* Null when null pixel in any band */
+	    for (i = BAND2; i <= BAND6; i++) {
+		if (G_is_d_null_value((void *)((DCELL *) band[i].rast + col))) {
+		    code = NO_CLOUD;
+		    break;
+		}
+		pixel[i] = (double)((DCELL *) band[i].rast)[col];
+	    }
+	    /* Determina los pixeles de sombras */
+	    if (code == NO_DEFINED && with_shadow) {
+		code = shadow_algorithm(pixel);
+	    }
+	    /* Analiza el valor de los pixeles no definidos */
+	    if (code == NO_DEFINED) {
+		code = NO_CLOUD;
+		count[TOTAL]++;
+		nsdi = (pixel[BAND2] - pixel[BAND5]) /
+		    (pixel[BAND2] + pixel[BAND5]);
+		/* ----------------------------------------------------- */
+		/* step 1. Brightness Threshold: Eliminates dark images */
+		if (pixel[BAND3] > th_1) {
+		    /* step 3. Normalized Snow Difference Index: Eliminates many types of snow */
+		    if (nsdi > th_2[0] && nsdi < th_2[1]) {
+			/* step 5. Temperature Threshold: Eliminates warm image features */
+			if (pixel[BAND6] < th_3) {
+			    rat56 = (1. - pixel[BAND5]) * pixel[BAND6];
+			    /* step 6. Band 5/6 Composite: Eliminates numerous categories including ice */
+			    if (rat56 < th_4) {
+				/* step 8. Eliminates growing vegetation */
+				if ((pixel[BAND4] / pixel[BAND3]) < th_5) {
+				    /* step 9. Eliminates senescing vegetation */
+				    if ((pixel[BAND4] / pixel[BAND2]) < th_6) {
+					/* step 10. Eliminates rocks and desert */
+					count[SOIL]++;
+					if ((pixel[BAND4] / pixel[BAND5]) >
+					    th_7) {
+					    /* step 11. Distinguishes warm clouds from cold clouds */
+					    if (rat56 < th_8) {
+						code = COLD_CLOUD;
+						count[COLD]++;
+						/* for statistic */
+						stats[SUM_COLD] +=
+						    (pixel[BAND6] / SCALE);
+						hist_put(pixel[BAND6] -
+							 K_BASE, cold);
+					    }
+					    else {
+						code = WARM_CLOUD;
+						count[WARM]++;
+						/* for statistic */
+						stats[SUM_WARM] +=
+						    (pixel[BAND6] / SCALE);
+						hist_put(pixel[BAND6] -
+							 K_BASE, warm);
+					    }
+					    if (pixel[BAND6] > stats[KMAX])
+						stats[KMAX] = pixel[BAND6];
+					    if (pixel[BAND6] < stats[KMIN])
+						stats[KMIN] = pixel[BAND6];
+					}
+					else {
+					    code = NO_DEFINED;
+					}
+				    }
+				    else {
+					code = NO_DEFINED;
+					count[SOIL]++;
+				    }
+				}
+				else {
+				    code = NO_DEFINED;
+				}
+			    }
+			    else {
+				/* step 7 */
+				code =
+				    (pixel[BAND5] <
+				     th_4_b) ? NO_CLOUD : NO_DEFINED;
+			    }
+			}
+			else {
+			    code = NO_CLOUD;
+			}
+		    }
+		    else {
+			/* step 3 */
+			code = NO_CLOUD;
+			if (nsdi > th_2_b)
+			    count[SNOW]++;
+		    }
+		}
+		else {
+		    /* step 2 */
+		    code = (pixel[BAND3] < th_1_b) ? NO_CLOUD : NO_DEFINED;
+		}
+		/* ----------------------------------------------------- */
+	    }
+	    if (code == NO_CLOUD) {
+		G_set_c_null_value((CELL *) out->rast + col, 1);
+	    }
+	    else {
+		((CELL *) out->rast)[col] = code;
+	    }
+	}
+	if (G_put_raster_row(out->fd, out->rast, CELL_TYPE) < 0)
+	    G_fatal_error(_("Failed writing raster map <%s> row %d"),
+			  out->name, row);
+    }
+    G_percent(1, 1, 1);
+
+    G_free(out->rast);
+    G_close_cell(out->fd);
+
+    return;
+}
+
+
+void acca_second(Gfile * out, Gfile band,
+		 int review_warm, double upper, double lower)
+{
+    int row, col, nrows, ncols;
+    char *mapset;
+
+    int code;
+    double temp;
+    Gfile tmp;
+
+    /* Open to read */
+    mapset = G_find_cell2(out->name, "");
+    if (mapset == NULL)
+	G_fatal_error(_("Raster map <%s> not found"), out->name);
+    if ((out->fd = G_open_cell_old(out->name, "")) < 0)
+	G_fatal_error(_("Unable to open raster map <%s>"), out->name);
+
+    out->rast = G_allocate_raster_buf(CELL_TYPE);
+
+    /* Open to write */
+    sprintf(tmp.name, "_%d.BBB", getpid());
+    tmp.rast = G_allocate_raster_buf(CELL_TYPE);
+    if ((tmp.fd = G_open_raster_new(tmp.name, CELL_TYPE)) < 0)
+	G_fatal_error(_("Unable to create raster map <%s>"), tmp.name);
+
+    if (upper == 0.)
+	G_important_message(_("Removing ambiguous pixels..."));
+    else
+	G_important_message(_("Pass two processing..."));
+
+    nrows = G_window_rows();
+    ncols = G_window_cols();
+
+    for (row = 0; row < nrows; row++) {
+	G_percent(row, nrows, 2);
+
+	if (G_get_d_raster_row(band.fd, band.rast, row) < 0)
+	    G_fatal_error(_("Unable to read raster map <%s> row %d"),
+			  band.name, row);
+	if (G_get_c_raster_row(out->fd, out->rast, row) < 0)
+	    G_fatal_error(_("Unable to read raster map <%s> row %d"),
+			  out->name, row);
+
+	for (col = 0; col < ncols; col++) {
+	    if (G_is_c_null_value((void *)((CELL *) out->rast + col))) {
+		G_set_c_null_value((CELL *) tmp.rast + col, 1);
+	    }
+	    else {
+		code = (int)((CELL *) out->rast)[col];
+		/* Resolve ambiguous pixels */
+		if (code == NO_DEFINED ||
+		    (code == WARM_CLOUD && review_warm == 1)) {
+		    temp = (double)((DCELL *) band.rast)[col];
+		    if (temp > upper) {
+			G_set_c_null_value((CELL *) tmp.rast + col, 1);
+		    }
+		    else {
+			((CELL *) tmp.rast)[col] =
+			    (temp < lower) ? IS_WARM_CLOUD : IS_COLD_CLOUD;
+		    }
+		}
+		else
+		    /* Join warm (not ambiguous) and cold clouds */
+		if (code == COLD_CLOUD || code == WARM_CLOUD) {
+		    ((CELL *) tmp.rast)[col] = (code == WARM_CLOUD &&
+						review_warm ==
+						0) ? IS_WARM_CLOUD :
+			IS_COLD_CLOUD;
+		}
+		else
+		    ((CELL *) tmp.rast)[col] = IS_SHADOW;
+	    }
+	}
+	if (G_put_raster_row(tmp.fd, tmp.rast, CELL_TYPE) < 0) {
+	    G_fatal_error(_("Cannot write to raster map <%s>"), tmp.name);
+	}
+    }
+    G_percent(1, 1, 1);
+
+    G_free(tmp.rast);
+    G_close_cell(tmp.fd);
+
+    G_free(out->rast);
+    G_close_cell(out->fd);
+
+    G_remove("cats", out->name);
+    G_remove("cell", out->name);
+    G_remove("cellhd", out->name);
+    G_remove("cell_misc", out->name);
+    G_remove("hist", out->name);
+
+    G_rename("cats", tmp.name, out->name);
+    G_rename("cell", tmp.name, out->name);
+    G_rename("cellhd", tmp.name, out->name);
+    G_rename("cell_misc", tmp.name, out->name);
+    G_rename("hist", tmp.name, out->name);
+
+    return;
+}
+
+/**********************************************************
+ *
+ * Cloud shadows
+ *
+ **********************************************************/
+
+int shadow_algorithm(double pixel[])
+{
+    /* I think this filter is better but not in any paper */
+    if (pixel[BAND3] < 0.07 && (1 - pixel[BAND4]) * pixel[BAND6] > 240. &&
+	pixel[BAND4] / pixel[BAND2] > 1. &&
+	(pixel[BAND3] - pixel[BAND5]) / (pixel[BAND3] + pixel[BAND5]) < 0.10)
+	/*
+	   if (pixel[BAND3] < 0.07 && (1 - pixel[BAND4]) * pixel[BAND6] > 240. &&
+	   pixel[BAND4] / pixel[BAND2] > 1.)
+	 */
+    {
+	return IS_SHADOW;
+    }
+
+    return NO_DEFINED;
+}
diff --git a/imagery/i.landsat.acca/description.html b/imagery/i.landsat.acca/description.html
new file mode 100644
index 0000000..c0fb9ff
--- /dev/null
+++ b/imagery/i.landsat.acca/description.html
@@ -0,0 +1,76 @@
+<h2>DESCRIPTION</h2>
+
+<em>i.landsat.acca</em> implements the <b>Automated Cloud-Cover
+Assessment</B> (ACCA) Algorithm from Irish (2000) with the constant
+values for pass filter one from Irish et al. (2006). To do this, it
+needs Landsat band numbers 2, 3, 4, 5, and 6 (or band 61 for Landsat-7
+ETM+) which have already been processed from DN into reflectance and
+band-6 temperature
+with <em><a href="i.landsat.toar.html">i.landsat.toar</a></em>).
+
+<p>
+The ACCA algorithm gives good results over most of the planet with the
+exception of ice sheets because ACCA operates on the premise that
+clouds are colder than the land surface they cover. The algorithm was
+designed for Landsat-7 ETM+ but because reflectance is used it is also
+useful for Landsat-4/5 TM.
+
+<h2>NOTES</h2>
+
+<em>i.landsat.acca</em> works in the current region settings.
+
+<h2>EXAMPLES</h2>
+
+Run the standard ACCA algorithm with filling of small cloud holes
+(the <b>-f</b> flag): With per-band reflectance raster maps
+named <tt>226_62.toar.1, 226_62.toar.2, </tt> [...] and LANDSAT-7
+thermal band <tt>226_62.toar.61</tt>, outputing to a new raster map
+named <tt>226_62.acca</tt>:
+
+<div class="code"><pre>
+i.landsat.toar sensor=tm7 gain=HHHLHLHHL date=2003-04-07 product_date=2008-11-27 input_prefix=226_62 \
+  output_prefix=226_62_toar solar_elevation=49.51654
+i.landsat.acca -f band_prefix=226_62.toar output=226_62.acca
+</pre></div>
+
+or
+
+<div class="code"><pre>
+i.landsat.toar input_prefix=L5121060_06020060714. output_prefix=L5121060_06020060714_toar sensor=tm5 \
+  metfile=L5121060_06020060714_MTL.txt -t
+i.landsat.acca -5 -f input_prefix=L5121060_06020060714_toar. output=L5121060_06020060714.acca
+</pre></div>
+
+Using the cloud mask:
+<div class="code"><pre>
+ # Mask out the clouds:
+ r.mapcalc "MASK = if(isnull(L5121060_06020060714.acca))"
+ d.rast L5121060_06020060714_toar.1
+</pre></div>
+
+<h2>REFERENCES</h2>
+
+<ol>
+  <li>Irish R.R., Barker J.L., Goward S.N., and Arvidson T., 2006.
+    Characterization of the Landsat-7 ETM+ Automated Cloud-Cover
+    Assessment (ACCA) Algorithm. Photogrammetric Engineering and Remote
+    Sensing vol. 72(10): 1179-1188.</li>
+  
+  <li>Irish, R.R., 2000. Landsat 7 Automatic Cloud Cover Assessment. In
+    S.S. Shen and M.R. Descour (Eds.): Algorithms for Multispectral,
+    Hyperspectral, and Ultraspectral Imagery VI. Proceedings of SPIE,
+    4049: 348-355.</li>
+</ol>
+
+<h2>SEE ALSO</h2>
+
+<em>
+  <a href="i.landsat.toar.html">i.landsat.toar</a>
+</em>
+
+<h2>AUTHOR</h2>
+
+E. Jorge Tizado  (ej.tizado unileon es), Dept. Biodiversity and Environmental Management, University of León, Spain
+
+<p>
+<i>Last changed: $Date: 2011-11-08 03:23:06 -0800 (Tue, 08 Nov 2011) $</i>
diff --git a/imagery/i.landsat.acca/local_proto.h b/imagery/i.landsat.acca/local_proto.h
new file mode 100644
index 0000000..90394af
--- /dev/null
+++ b/imagery/i.landsat.acca/local_proto.h
@@ -0,0 +1,43 @@
+#ifndef _LOCAL_PROTO_H
+#define _LOCAL_PROTO_H
+
+
+#define BAND2   0
+#define BAND3   1
+#define BAND4   2
+#define BAND5   3
+#define BAND6   4
+
+#define NO_CLOUD      0
+#define IS_CLOUD      1
+#define COLD_CLOUD   30
+#define WARM_CLOUD   50
+
+#define NO_DEFINED    1
+#define IS_SHADOW     2
+#define IS_COLD_CLOUD 6
+#define IS_WARM_CLOUD 9
+
+
+typedef struct
+{
+    int fd;
+    void *rast;
+    char name[GNAME_MAX];
+
+} Gfile;
+
+
+void acca_algorithm(Gfile *, Gfile[], int, int, int);
+void acca_first(Gfile *, Gfile[], int, int[], int[], int[], double[]);
+void acca_second(Gfile *, Gfile, int, double, double);
+
+int shadow_algorithm(double[]);
+
+void filter_holes(Gfile *);
+
+void hist_put(double t, int hist[]);
+double quantile(double q, int hist[]);
+double moment(int n, int hist[], int k);
+
+#endif
diff --git a/imagery/i.landsat.acca/main.c b/imagery/i.landsat.acca/main.c
new file mode 100644
index 0000000..12321d2
--- /dev/null
+++ b/imagery/i.landsat.acca/main.c
@@ -0,0 +1,225 @@
+
+/****************************************************************************
+ *
+ * MODULE:       i.landsat.acca
+ *
+ * AUTHOR(S):    E. Jorge Tizado - ej.tizado at unileon.es
+ *
+ * PURPOSE:      Landsat TM/ETM+ Automatic Cloud Cover Assessment
+ *               Adopted for GRASS 7 by Martin Landa <landa.martin gmail.com>
+ *
+ * COPYRIGHT:    (C) 2008, 2010 by the GRASS Development Team
+ *
+ *               This program is free software under the GNU General Public
+ *   	    	 License (>=v2). Read the file COPYING that comes with GRASS
+ *   	    	 for details.
+ *
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+
+extern int hist_n;
+
+/*----------------------------------------------*
+ * Constant threshold of ACCA algorithm
+ *----------------------------------------------*/
+
+extern double th_1;
+extern double th_1_b;
+extern double th_2[];
+extern double th_2_b;
+extern double th_3;
+extern double th_4;
+extern double th_4_b;
+extern double th_5;
+extern double th_6;
+extern double th_7;
+extern double th_8;
+
+/*----------------------------------------------*
+ *
+ * Check a raster name y return fd of open file
+ *
+ *----------------------------------------------*/
+int check_raster(char *raster_name)
+{
+    RASTER_MAP_TYPE map_type;
+    int raster_fd;
+    char *mapset;
+    
+    mapset = G_find_cell2(raster_name, "");
+    if (mapset == NULL)
+	G_fatal_error(_("Raster map <%s> not found"), raster_name);
+    
+    if ((raster_fd = G_open_cell_old(raster_name, "")) < 0)
+	G_fatal_error(_("Unable to open raster map <%s>"), raster_name);
+    
+    /* Uncomment to work in full raster map
+       if (G_get_cellhd(raster_name, mapset, &cellhd) < 0) {
+       G_warning(_("Unable to read header of raster map <%s>"), raster_name);
+       return -1;
+       }
+       if (G_set_window(&cellhd) < 0) {
+       G_warning(_("Cannot reset current region"));
+       return -1;
+       }
+     */
+    if ((map_type = G_raster_map_type(raster_name, mapset)) != DCELL_TYPE)
+	G_fatal_error(_("Input raster map <%s> is not floating point "
+			"(process DN using i.landsat.toar to radiance first)"), raster_name);
+    
+    return raster_fd;
+}
+
+/*----------------------------------------------*
+ *
+ *      MAIN FUNCTION
+ *
+ *----------------------------------------------*/
+int main(int argc, char *argv[])
+{
+    struct History history;
+    struct GModule *module;
+
+    int i;
+    struct Option *band_prefix, *output, *hist, *b56c, *b45r;
+    struct Flag *shadow, *filter, *sat5, *pass2, *csig;
+    char *in_name, *out_name;
+    struct Categories cats;
+
+    Gfile band[5], out;
+
+    char title[1024];
+    
+    /* initialize GIS environment */
+    G_gisinit(argv[0]);
+
+    /* initialize module */
+    module = G_define_module();
+    module->description =
+	_("Performs Landsat TM/ETM+ Automatic Cloud Cover Assessment (ACCA).");
+    module->keywords = _("imagery, landsat, acca");
+    
+    band_prefix = G_define_option();
+    band_prefix->key = "input_prefix";
+    band_prefix->label = _("Base name of input raster bands");
+    band_prefix->description = _("Example: 'B.' for B.1, B.2, ...");
+    band_prefix->type = TYPE_STRING;
+    band_prefix->required = YES;
+    
+    output = G_define_standard_option(G_OPT_R_OUTPUT);
+
+    b56c = G_define_option();
+    b56c->key = "b56composite";
+    b56c->type = TYPE_DOUBLE;
+    b56c->required = NO;
+    b56c->description = _("B56composite (step 6)");
+    b56c->answer = "225.";
+
+    b45r = G_define_option();
+    b45r->key = "b45ratio";
+    b45r->type = TYPE_DOUBLE;
+    b45r->required = NO;
+    b45r->description = _("B45ratio: Desert detection (step 10)");
+    b45r->answer = "1.";
+
+    hist = G_define_option();
+    hist->key = "histogram";
+    hist->type = TYPE_INTEGER;
+    hist->required = NO;
+    hist->description =
+	_("Number of classes in the cloud temperature histogram");
+    hist->answer = "100";
+    hist->guisection = _("Cloud settings");
+    
+    sat5 = G_define_flag();
+    sat5->key = '5';
+    sat5->label = _("Data is Landsat-5 TM");
+    sat5->description = _("I.e. Thermal band is '.6' not '.61')");
+
+    filter = G_define_flag();
+    filter->key = 'f';
+    filter->description =
+	_("Apply post-processing filter to remove small holes");
+
+    csig = G_define_flag();
+    csig->key = 'x';
+    csig->description = _("Always use cloud signature (step 14)");
+    csig->guisection = _("Cloud settings");
+
+    pass2 = G_define_flag();
+    pass2->key = '2';
+    pass2->description =
+	_("Bypass second-pass processing, and merge warm (not ambiguous) and cold clouds");
+    pass2->guisection = _("Cloud settings");
+
+    shadow = G_define_flag();
+    shadow->key = 's';
+    shadow->description = _("Include a category for cloud shadows");
+    shadow->guisection = _("Cloud settings");
+
+    if (G_parser(argc, argv))
+	exit(EXIT_FAILURE);
+
+    /* stores OPTIONS and FLAGS to variables */
+
+    hist_n = atoi(hist->answer);
+    if (hist_n < 10)
+	hist_n = 10;
+
+    in_name = band_prefix->answer;
+
+    for (i = BAND2; i <= BAND6; i++) {
+	sprintf(band[i].name, "%s%d%c", in_name, i + 2,
+		 (i == BAND6 && !sat5->answer ? '1' : '\0'));
+	band[i].fd = check_raster(band[i].name);
+	band[i].rast = G_allocate_raster_buf(DCELL_TYPE);
+    }
+
+    out_name = output->answer;
+
+    sprintf(out.name, "%s", out_name);
+    if (G_legal_filename(out_name) < 0)
+	G_fatal_error(_("<%s> is an illegal file name"), out.name);
+
+    /* --------------------------------------- */
+    th_4 = atof(b56c->answer);
+    th_7 = atof(b45r->answer);
+    acca_algorithm(&out, band, pass2->answer, shadow->answer,
+		   csig->answer);
+
+    if (filter->answer)
+	filter_holes(&out);
+    /* --------------------------------------- */
+
+    for (i = BAND2; i <= BAND6; i++) {
+	G_free(band[i].rast);
+	G_close_cell(band[i].fd);
+    }
+
+    /* write out map title and category labels */
+    G_init_cats((CELL) 0, "", &cats);
+    sprintf(title, "LANDSAT-%s Automatic Cloud Cover Assessment",
+	    sat5->answer ? "5 TM" : "7 ETM+");
+    G_set_cats_title(title, &cats);
+
+    G_set_cat(IS_SHADOW, "Shadow", &cats);
+    G_set_cat(IS_COLD_CLOUD, "Cold cloud", &cats);
+    G_set_cat(IS_WARM_CLOUD, "Warm cloud", &cats);
+    
+    G_write_cats(out.name, &cats);
+    G_free_cats(&cats);
+
+    /* write out command line opts */
+    G_short_history(out.name, "raster", &history);
+    G_command_history(&history);
+    G_write_history(out.name, &history);
+
+    exit(EXIT_SUCCESS);
+}
diff --git a/imagery/i.landsat.acca/tools.c b/imagery/i.landsat.acca/tools.c
new file mode 100644
index 0000000..e319f5c
--- /dev/null
+++ b/imagery/i.landsat.acca/tools.c
@@ -0,0 +1,317 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <unistd.h>
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+
+
+/*--------------------------------------------------------
+  HISTOGRAM ANALYSIS
+  Define un factor de escala = hist_n/100 con objeto
+  de dividir el entero 1 por 100/hist_n partes y
+  aumentar la precision.
+
+  Afecta al almacenamiento en el histograma pero
+  modifica el calculo de quantiles y momentos.
+ --------------------------------------------------------*/
+
+/* Global variable
+   allow use as parameter in the command line */
+int hist_n = 100;		/* interval of real data 100/hist_n */
+
+void hist_put(double t, int hist[])
+{
+    int i;
+
+    /* scale factor */
+    i = (int)(t * ((double)hist_n / 100.));
+
+    if (i < 1)
+	i = 1;
+    if (i > hist_n)
+	i = hist_n;
+
+    hist[i - 1] += 1;
+}
+
+/* histogram moment */
+double moment(int n, int hist[], int k)
+{
+    int i, total;
+    double value, mean;
+
+    k = 0;
+
+    total = 0;
+    mean = 0.;
+    for (i = 0; i < hist_n; i++) {
+	total += hist[i];
+	mean += (double)(i * hist[i]);
+    }
+    mean /= ((double)total);	/* histogram mean */
+
+    value = 0.;
+    for (i = 0; i < hist_n; i++) {
+	value += (pow((i - mean), n) * ((double)hist[i]));
+    }
+    value /= (double)(total - k);
+
+    return (value / pow((double)hist_n / 100., n) );
+}
+
+/* Real data quantile */
+double quantile(double q, int hist[])
+{
+    int i, total;
+    double value, qmax, qmin;
+
+    total = 0;
+    for (i = 0; i < hist_n; i++) {
+	total += hist[i];
+    }
+
+    value = 0;
+    qmax = 1.;
+    for (i = hist_n - 1; i >= 0; i--) {
+	qmin = qmax - (double)hist[i] / (double)total;
+	if (q >= qmin) {
+	    value = (q - qmin) / (qmax - qmin) + (i - 1);
+	    break;
+	}
+	qmax = qmin;
+    }
+
+    /* remove scale factor */
+    return (value / ((double)hist_n / 100.));
+}
+
+/*--------------------------------------------------------
+    FILTER HOLES OF CLOUDS
+    This a >=50% filter of 3x3
+    if >= 50% vecinos cloud then pixel set to cloud
+ --------------------------------------------------------*/
+
+int pval(void *rast, int i)
+{
+    void *ptr = (void *)((CELL *) rast + i);
+
+    if (G_is_c_null_value(ptr))
+	return 0;
+    else
+	return (int)((CELL *) rast)[i];
+}
+
+void filter_holes(Gfile * out)
+{
+    int row, col, nrows, ncols;
+    char *mapset;
+    
+    void *arast, *brast, *crast;
+    int i, pixel[9], cold, warm, shadow, nulo, lim;
+
+    Gfile tmp;
+
+    nrows = G_window_rows();
+    ncols = G_window_cols();
+
+    if (nrows < 3 || ncols < 3)
+	return;
+
+    /* Open to read */
+    mapset = G_find_cell2(out->name, "");
+    if (mapset == NULL)
+	G_fatal_error(_("Raster map <%s> not found"), out->name);
+    
+    if ((out->fd = G_open_cell_old(out->name, "")) < 0)
+	G_fatal_error(_("Unable to open raster map <%s>"), out->name);
+    
+    arast = G_allocate_raster_buf(CELL_TYPE);
+    brast = G_allocate_raster_buf(CELL_TYPE);
+    crast = G_allocate_raster_buf(CELL_TYPE);
+
+    /* Open to write */
+    sprintf(tmp.name, "_%d.BBB", getpid());
+    tmp.rast = G_allocate_raster_buf(CELL_TYPE);
+    if ((tmp.fd = G_open_raster_new(tmp.name, CELL_TYPE)) < 0)
+	G_fatal_error(_("Unable to create raster map <%s>"), tmp.name);
+
+    G_important_message(_("Filling small holes in clouds..."));
+
+    /* Se puede acelerar creandolos nulos y luego arast = brast
+       brast = crast y cargando crast solamente
+       G_set_f_null_value(cell[2], ncols);
+     */
+
+    for (row = 0; row < nrows; row++) {
+	/* Read row values */
+	G_percent(row, nrows, 2);
+	
+	if (row != 0) {
+	    if (G_get_c_raster_row(out->fd, arast, row - 1) < 0)
+		G_fatal_error(_("Unable to read raster map <%s> row %d"),
+			      out->name, row - 1);
+	}
+	if (G_get_c_raster_row(out->fd, brast, row) < 0)
+	    G_fatal_error(_("Unable to read raster map <%s> row %d"),
+			  out->name, row);
+	if (row != (nrows - 1)) {
+	    if (G_get_c_raster_row(out->fd, crast, row + 1) < 0)
+		G_fatal_error(_("Unable to read raster map <%s> row %d"),
+			      out->name, row + 1);
+	}
+	/* Analysis of all pixels */
+	for (col = 0; col < ncols; col++) {
+	    pixel[0] = pval(brast, col);
+	    if (pixel[0] == 0) {
+		if (row == 0) {
+		    pixel[1] = -1;
+		    pixel[2] = -1;
+		    pixel[3] = -1;
+		    if (col == 0) {
+			pixel[4] = -1;
+			pixel[5] = pval(brast, col + 1);
+			pixel[6] = -1;
+			pixel[7] = pval(crast, col);
+			pixel[8] = pval(crast, col + 1);
+		    }
+		    else if (col != (ncols - 1)) {
+			pixel[4] = pval(brast, col - 1);
+			pixel[5] = pval(brast, col + 1);
+			pixel[6] = pval(crast, col - 1);
+			pixel[7] = pval(crast, col);
+			pixel[8] = pval(crast, col + 1);
+		    }
+		    else {
+			pixel[4] = pval(brast, col - 1);
+			pixel[5] = -1;
+			pixel[6] = pval(crast, col - 1);
+			pixel[7] = pval(crast, col);
+			pixel[8] = -1;
+		    }
+		}
+		else if (row != (nrows - 1)) {
+		    if (col == 0) {
+			pixel[1] = -1;
+			pixel[2] = pval(arast, col);
+			pixel[3] = pval(arast, col + 1);
+			pixel[4] = -1;
+			pixel[5] = pval(brast, col + 1);
+			pixel[6] = -1;
+			pixel[7] = pval(crast, col);
+			pixel[8] = pval(crast, col + 1);
+		    }
+		    else if (col != (ncols - 1)) {
+			pixel[1] = pval(arast, col - 1);
+			pixel[2] = pval(arast, col);
+			pixel[3] = pval(arast, col + 1);
+			pixel[4] = pval(brast, col - 1);
+			pixel[5] = pval(brast, col + 1);
+			pixel[6] = pval(crast, col - 1);
+			pixel[7] = pval(crast, col);
+			pixel[8] = pval(crast, col + 1);
+		    }
+		    else {
+			pixel[1] = pval(arast, col - 1);
+			pixel[2] = pval(arast, col);
+			pixel[3] = -1;
+			pixel[4] = pval(brast, col - 1);
+			pixel[5] = -1;
+			pixel[6] = pval(crast, col - 1);
+			pixel[7] = pval(crast, col);
+			pixel[8] = -1;
+		    }
+		}
+		else {
+		    pixel[6] = -1;
+		    pixel[7] = -1;
+		    pixel[8] = -1;
+		    if (col == 0) {
+			pixel[1] = -1;
+			pixel[2] = pval(arast, col);
+			pixel[3] = pval(arast, col + 1);
+			pixel[4] = -1;
+			pixel[5] = pval(brast, col + 1);
+		    }
+		    else if (col != (ncols - 1)) {
+			pixel[1] = pval(arast, col - 1);
+			pixel[2] = pval(arast, col);
+			pixel[3] = pval(arast, col + 1);
+			pixel[4] = pval(brast, col - 1);
+			pixel[5] = pval(brast, col + 1);
+		    }
+		    else {
+			pixel[1] = pval(arast, col - 1);
+			pixel[2] = pval(arast, col);
+			pixel[3] = -1;
+			pixel[4] = pval(brast, col - 1);
+			pixel[5] = -1;
+		    }
+		}
+
+		cold = warm = shadow = nulo = 0;
+		for (i = 1; i < 9; i++) {
+		    switch (pixel[i]) {
+		    case IS_COLD_CLOUD:
+			cold++;
+			break;
+		    case IS_WARM_CLOUD:
+			warm++;
+			break;
+		    case IS_SHADOW:
+			shadow++;
+			break;
+		    default:
+			nulo++;
+			break;
+		    }
+		}
+		lim = (int)(cold + warm + shadow + nulo) / 2;
+
+		/* Entra pixel[0] = 0 */
+		if (nulo < lim) {
+		    if (shadow >= (cold + warm))
+			pixel[0] = IS_SHADOW;
+		    else
+			pixel[0] =
+			    (warm > cold) ? IS_WARM_CLOUD : IS_COLD_CLOUD;
+		}
+	    }
+	    if (pixel[0] != 0) {
+		((CELL *) tmp.rast)[col] = pixel[0];
+	    }
+	    else {
+		G_set_c_null_value((CELL *) tmp.rast + col, 1);
+	    }
+	}
+	if (G_put_raster_row(tmp.fd, tmp.rast, CELL_TYPE) < 0)
+	    G_fatal_error(_("Failed writing raster map <%s> row %d"),
+			  tmp.name, row);
+    }
+    G_percent(1, 1, 1);
+    
+    G_free(arast);
+    G_free(brast);
+    G_free(crast);
+    G_close_cell(out->fd);
+
+    G_free(tmp.rast);
+    G_close_cell(tmp.fd);
+
+    G_remove("cats", out->name);
+    G_remove("cell", out->name);
+    G_remove("cellhd", out->name);
+    G_remove("cell_misc", out->name);
+    G_remove("hist", out->name);
+
+    G_rename("cats", tmp.name, out->name);
+    G_rename("cell", tmp.name, out->name);
+    G_rename("cellhd", tmp.name, out->name);
+    G_rename("cell_misc", tmp.name, out->name);
+    G_rename("hist", tmp.name, out->name);
+
+    return;
+}
diff --git a/imagery/i.landsat.toar/Makefile b/imagery/i.landsat.toar/Makefile
new file mode 100644
index 0000000..3d72931
--- /dev/null
+++ b/imagery/i.landsat.toar/Makefile
@@ -0,0 +1,10 @@
+MODULE_TOPDIR = ../..
+
+PGM = i.landsat.toar
+
+LIBES = $(GISLIB)
+DEPENDENCIES = $(GISDEP)
+
+include $(MODULE_TOPDIR)/include/Make/Module.make
+
+default: cmd
diff --git a/imagery/i.landsat.toar/description.html b/imagery/i.landsat.toar/description.html
new file mode 100644
index 0000000..9e78369
--- /dev/null
+++ b/imagery/i.landsat.toar/description.html
@@ -0,0 +1,218 @@
+<h2>DESCRIPTION</h2>
+
+<em>i.landsat.toar</em> is used to transform the calibrated digital
+number of Landsat imagery products to top-of-atmosphere radiance or
+top-of-atmosphere reflectance and temperature (band 6 of the sensors
+TM and ETM+). Optionally, it can be used to calculate the at-surface
+radiance or reflectance with atmospheric correction (DOS method).
+
+<p>
+Usually, to do so the production date, the acquisition date, and the
+solar elevation are needed. Moreover, for Landsat-7 ETM+ it is also
+needed the gain (high or low) of the nine respective bands.
+
+<p>
+Optionally (recommended), the data can be read from metadata file
+(.met or MTL.txt) for all Landsat MSS, TM, ETM+ and OLI/TIRS. However,
+if the solar elevation is given the value of the metadata file are
+overwritten. This is necessary when the data in the .met file is
+incorrect or not accurate. Also, if acquisition or production dates are
+not found in the metadata file then the command line values are used.
+
+<p>
+<b>Attention</b>: Any null value or smaller than QCALmin in the input
+raster is set to null in the output raster and it is not included in
+the equations.
+
+<h2>Uncorrected at-sensor values (method=uncorrected, default)</h2>
+
+The standard geometric and radiometric corrections result in a
+calibrated digital number (QCAL = DN) images. To further standardize
+the impact of illumination geometry, the QCAL images are first
+converted first to at-sensor radiance and then to at-sensor
+reflectance. The thermal band is first converted from QCAL to
+at-sensor radiance, and then to effective at-sensor temperature in
+Kelvin degrees.
+
+<p>
+Radiometric calibration converts QCAL to <b>at-sensor radiance</b>, a
+radiometric quantity measured in W/(m&sup2; * sr * µm) using the
+equations:
+<ul>
+  <li> gain = (Lmax - Lmin) / (QCALmax - QCALmin)</li>
+  <li> bias = Lmin - gain * QCALmin </li>
+  <li> radiance = gain * QCAL + bias </li>
+</ul>
+
+where, <em>Lmax</em> and <em>Lmin</em> are the calibration constants,
+and <em>QCALmax</em> and <em>QCALmin</em> are the highest and the
+lowest points of the range of rescaled radiance in QCAL.
+
+<p>
+Then, to calculate <b>at-sensor reflectance</b> the equations are:
+
+<ul>
+  <li> sun_radiance = [Esun * sin(e)] / (PI * d^2)</li>
+  <li> reflectance = radiance / sun_radiance </li>
+</ul>
+
+where, <em>d</em> is the earth-sun distance in astronomical
+units, <em>e</em> is the solar elevation angle, and <em>Esun</em> is
+the mean solar exoatmospheric irradiance in W/(m&sup2; * µm).
+
+<h2>Corrected at-sensor values (method=corrected)</h2>
+
+At-sensor reflectance values range from zero to one, whereas at-sensor
+radiance must be greater or equal to zero. However, since Lmin can be
+a negative number then the at-sensor values can also be negative. To
+avoid these possible negative values and set the minimum possible
+values at-sensor to zero, this method corrects the radiance to output
+a corrected at-sensor values using the equations (not for thermal
+bands):
+<ul>
+  <li> radiance = (uncorrected_radiance - Lmin) </li>
+  <li> reflectance = radiance / sun_radiance </li>
+</ul>
+
+<p>
+<b>Note</b>: Other possibility to avoid negative values is set to zero
+this values (radiance and/or reflectance), but this option is ease
+with uncorrected method
+and <em><a href="r.mapcalc.html">r.mapcalc</a></em>.
+
+<h2>Simplified at-surface values (method=dos[1-4])</h2>
+
+Atmospheric correction and reflectance calibration remove the path
+radiance, i.e. the stray light from the atmosphere, and the spectral
+effect of solar illumination. To output these simple <b>at-surface
+radiance</b> and <b>at-surface reflectance</b>, the equations are (not
+for thermal bands):
+
+<ul>
+  <li> sun_radiance = TAUv * [Esun * sin(e) * TAUz + Esky] / (PI * d^2) </li>
+  <li> radiance_path = radiance_dark - percent * sun_radiance </li>
+  <li> radiance = (at-sensor_radiance - radiance_path) </li>
+  <li> reflectance = radiance / sun_radiance </li>
+</ul>
+
+where, <em>percent</em> is a value between 0.0 and 1.0 (usually
+0.01), <em>Esky</em> is the diffuse sky irradiance, <em>TAUz</em> is
+the atmospheric transmittance along the path from the sun to the
+ground surface, and <em>TAUv</em> is the atmospheric transmittance
+along the path from the ground surface to the
+sensor. <em>radiance_dark</em> is the at-sensor radiance calculated
+from the darkest object, i.e. DN with a least 'dark_parameter'
+(usually 1000) pixels for the entire image.
+
+The values are,
+
+<ul>
+  <li>DOS1: TAUv = 1.0, TAUz = 1.0 and Esky = 0.0</li>
+  <li>DOS2: TAUv = 1.0, Esky = 0.0, and TAUz = sin(e) for all bands
+    with maximum wave length less than 1. (i.e. bands 4-6 MSS, 1-4 TM,
+    and 1-4 ETM+) other bands TAUz = 1.0</li>
+  <li>DOS3: TAUv = exp[-t/cos(sat_zenith)],
+    TAUz = exp[-t/sin(e)], Esky = rayleigh</li>
+  <li>DOS4: TAUv = exp[-t/cos(sat_zenith)],
+    TAUz = exp[-t/sin(e)], Esky = PI * radiance_dark </li>
+</ul>
+
+<b>Attention</b>: Output radiance remain untouched (i.e. no set to
+0. when it is negative) then they are possible negative
+values. However, output reflectance is set to 0. when is obtained a
+negative value.
+
+<h2>NOTES</h2>
+
+In verbose mode (flag <b>--verbose</b>), the program write basic
+satellite data and the parameters used in the transformations.
+
+<p>
+Production date is not an exact value but it is necessary to apply
+correct calibration constants, which were changed in the dates:
+<ul>
+  <li>Landsat-1 MSS: never </li>
+  <li>Landsat-2 MSS: July 16, 1975</li>
+  <li>Landsat-3 MSS: June 1, 1978</li>
+  <li>Landsat-4 MSS: August 26, 1982 and April 1, 1983</li>
+  <li>Landsat-4 TM:  August 1, 1983 and January 15, 1984</li>
+  <li>Landsat-5 MSS: April 6, 1984 and November 9, 1984</li>
+  <li>Landsat-5 TM:  May 4, 2003 and April, 2 2007</li>
+  <li>Landsat-7 ETM+: July 1, 2000</li>
+  <li>Landsat-8 OLI/TIRS: launched in 2013</li>
+</ul>
+
+<h2>EXAMPLES</h2>
+
+Transform digital numbers of Landsat-7 ETM+ in band rasters 203_30.1,
+203_30.2 [...] to uncorrected at-sensor reflectance in output files
+203_30.1_toar, 203_30.2_toar [...] and at-sensor temperature in output
+files 293_39.61_toar and 293_39.62_toar:
+
+<div class="code"><pre>
+i.landsat.toar input_prefix=203_30. output_prefix=_toar \
+  metfile=p203r030_7x20010620.met
+</pre></div>
+
+or
+
+<div class="code"><pre>
+i.landsat.toar input_prefix=L5121060_06020060714. \
+  output_prefix=L5121060_06020060714_toar \
+  metfile=L5121060_06020060714_MTL.txt
+</pre></div>
+
+or
+
+<div class="code"><pre>
+i.landsat.toar input_prefix=203_30. output_prefix=_toar \
+  sensor=tm7 product_date=2004-06-07 date=2001-06-20 \
+  sun_elevation=64.3242970 gain="HHHLHLHHL"
+</pre></div>
+
+<h2>REFERENCES</h2>
+
+<ul>
+  <li>Chander G., B.L. Markham and D.L. Helder, 2009: Remote Sensing of
+    Environment, vol. 113</li>
+
+  <li>Chander G.H. and B. Markham, 2003.: IEEE Transactions On Geoscience And
+    Remote Sensing, vol. 41, no. 11.</li>
+
+  <li>Chavez P.S., jr. 1996. Image-based atmospheric corrections -
+    Revisited and Improved. Photogrammetric Engineering and Remote
+    Sensing 62(9): 1025-1036.</li>
+
+  <li>Huang et al: At-Satellite Reflectance, 2002: A First Order Normalization
+    Of Landsat 7 ETM+ Images.</li>
+
+  <li>R. Irish: <a href="http://landsathandbook.gsfc.nasa.gov/orbit_coverage/">Landsat
+      7. Science Data Users Handbook</a>. February 17, 2007; 15 May 2011.</li>
+
+  <li>Markham B.L. and J.L. Barker, 1986: Landsat MSS and TM Post-Calibration
+    Dynamic Ranges, Exoatmospheric Reflectances and At-Satellite
+    Temperatures. EOSAT Landsat Technical Notes, No. 1.</li>
+
+  <li>Moran M.S., R.D. Jackson, P.N. Slater and P.M. Teillet, 1992: Remote
+    Sensing of Environment, vol. 41.</li>
+
+  <li>Song et al, 2001: Classification and Change Detection Using Landsat TM
+    Data, When and How to Correct Atmospheric Effects? Remote Sensing
+    of Environment, vol. 75.</li>
+</ul>
+
+<h2>SEE ALSO</h2>
+
+<em>
+  <a href="i.atcorr.html">i.atcorr</a>,
+  <a href="r.mapcalc.html">r.mapcalc</a>,
+  <a href="r.in.gdal.html">r.in.gdal</a>
+</em>
+
+<h2>AUTHOR</h2>
+
+E. Jorge Tizado  (ej.tizado unileon es), Dept. Biodiversity and Environmental Management,
+University of León, Spain
+
+<p>
+<i>Last changed: $Date: 2013-03-14 05:01:18 -0700 (Thu, 14 Mar 2013) $</i>
diff --git a/imagery/i.landsat.toar/earth_sun.c b/imagery/i.landsat.toar/earth_sun.c
new file mode 100644
index 0000000..97c0b3d
--- /dev/null
+++ b/imagery/i.landsat.toar/earth_sun.c
@@ -0,0 +1,1101 @@
+/*
+ *  Modified from LIBNOVA-0.12
+ *
+ *  This 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 of the License, or (at your option) any later version.
+ *
+ *  This 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 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
+ *
+ *  Some functions in this file use the VSOP87 solution by
+ *  Messrs. Bretagnon and Francou.
+ *
+ *  Copyright (C) 2000 - 2005 Liam Girdwood
+ *  Modified to GRASS (C) 2006 E. Jorge Tizado
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "earth_sun.h"
+
+#define RADIUS_R0 523
+#define RADIUS_R1 290
+#define RADIUS_R2 134
+#define RADIUS_R3 20
+#define RADIUS_R4 9
+#define RADIUS_R5 2
+
+static const struct ln_vsop earth_radius_r0[RADIUS_R0] = {
+    {1.00013988784, 0.00000000000, 0.00000000000},
+    {0.01670699632, 3.09846350258, 6283.07584999140},
+    {0.00013956024, 3.05524609456, 12566.15169998280},
+    {0.00003083720, 5.19846674381, 77713.77146812050},
+    {0.00001628463, 1.17387558054, 5753.38488489680},
+    {0.00001575572, 2.84685214877, 7860.41939243920},
+    {0.00000924799, 5.45292236722, 11506.76976979360},
+    {0.00000542439, 4.56409151453, 3930.20969621960},
+    {0.00000472110, 3.66100022149, 5884.92684658320},
+    {0.00000328780, 5.89983686142, 5223.69391980220},
+    {0.00000345969, 0.96368627272, 5507.55323866740},
+    {0.00000306784, 0.29867139512, 5573.14280143310},
+    {0.00000174844, 3.01193636733, 18849.22754997420},
+    {0.00000243181, 4.27349530790, 11790.62908865880},
+    {0.00000211836, 5.84714461348, 1577.34354244780},
+    {0.00000185740, 5.02199710705, 10977.07880469900},
+    {0.00000109835, 5.05510635860, 5486.77784317500},
+    {0.00000098316, 0.88681311278, 6069.77675455340},
+    {0.00000086500, 5.68956418946, 15720.83878487840},
+    {0.00000085831, 1.27079125277, 161000.68573767410},
+    {0.00000062917, 0.92177053978, 529.69096509460},
+    {0.00000057056, 2.01374292245, 83996.84731811189},
+    {0.00000064908, 0.27251341435, 17260.15465469040},
+    {0.00000049384, 3.24501240359, 2544.31441988340},
+    {0.00000055736, 5.24159799170, 71430.69561812909},
+    {0.00000042520, 6.01110257982, 6275.96230299060},
+    {0.00000046966, 2.57799853213, 775.52261132400},
+    {0.00000038963, 5.36063832897, 4694.00295470760},
+    {0.00000044666, 5.53715663816, 9437.76293488700},
+    {0.00000035661, 1.67447135798, 12036.46073488820},
+    {0.00000031922, 0.18368299942, 5088.62883976680},
+    {0.00000031846, 1.77775642078, 398.14900340820},
+    {0.00000033193, 0.24370221704, 7084.89678111520},
+    {0.00000038245, 2.39255343973, 8827.39026987480},
+    {0.00000028468, 1.21344887533, 6286.59896834040},
+    {0.00000037486, 0.82961281844, 19651.04848109800},
+    {0.00000036957, 4.90107587287, 12139.55350910680},
+    {0.00000034537, 1.84270693281, 2942.46342329160},
+    {0.00000026275, 4.58896863104, 10447.38783960440},
+    {0.00000024596, 3.78660838036, 8429.24126646660},
+    {0.00000023587, 0.26866098169, 796.29800681640},
+    {0.00000027795, 1.89934427832, 6279.55273164240},
+    {0.00000023927, 4.99598548145, 5856.47765911540},
+    {0.00000020345, 4.65282190725, 2146.16541647520},
+    {0.00000023287, 2.80783632869, 14143.49524243060},
+    {0.00000022099, 1.95002636847, 3154.68708489560},
+    {0.00000019509, 5.38233922479, 2352.86615377180},
+    {0.00000017958, 0.19871369960, 6812.76681508600},
+    {0.00000017178, 4.43322156854, 10213.28554621100},
+    {0.00000016190, 5.23159323213, 17789.84561978500},
+    {0.00000017315, 6.15224075188, 16730.46368959580},
+    {0.00000013814, 5.18962074032, 8031.09226305840},
+    {0.00000018834, 0.67280058021, 149854.40013480789},
+    {0.00000018330, 2.25348717053, 23581.25817731760},
+    {0.00000013639, 3.68511810757, 4705.73230754360},
+    {0.00000013142, 0.65267698994, 13367.97263110660},
+    {0.00000010414, 4.33285688501, 11769.85369316640},
+    {0.00000009978, 4.20126336356, 6309.37416979120},
+    {0.00000010170, 1.59366684542, 4690.47983635860},
+    {0.00000007564, 2.62560597391, 6256.77753019160},
+    {0.00000009654, 3.67583728703, 27511.46787353720},
+    {0.00000006743, 0.56269927047, 3340.61242669980},
+    {0.00000008743, 6.06359123461, 1748.01641306700},
+    {0.00000007786, 3.67371235367, 12168.00269657460},
+    {0.00000006633, 5.66149277789, 11371.70468975820},
+    {0.00000007712, 0.31242577788, 7632.94325965020},
+    {0.00000006586, 3.13580054586, 801.82093112380},
+    {0.00000007460, 5.64758066660, 11926.25441366880},
+    {0.00000006933, 2.92384586372, 6681.22485339960},
+    {0.00000006805, 1.42327153767, 23013.53953958720},
+    {0.00000006118, 5.13395999022, 1194.44701022460},
+    {0.00000006477, 2.64986648493, 19804.82729158280},
+    {0.00000005233, 4.62432817299, 6438.49624942560},
+    {0.00000006147, 3.02863936662, 233141.31440436149},
+    {0.00000004608, 1.72194702724, 7234.79425624200},
+    {0.00000004221, 1.55697533726, 7238.67559160000},
+    {0.00000005310, 2.40821524293, 11499.65622279280},
+    {0.00000005128, 5.32398965690, 11513.88331679440},
+    {0.00000004770, 0.25554311730, 11856.21865142450},
+    {0.00000005519, 2.09089153789, 17298.18232732620},
+    {0.00000005625, 4.34052903053, 90955.55169449610},
+    {0.00000004578, 4.46569641570, 5746.27133789600},
+    {0.00000003788, 4.90728294810, 4164.31198961300},
+    {0.00000005337, 5.09957905103, 31441.67756975680},
+    {0.00000003967, 1.20054555175, 1349.86740965880},
+    {0.00000004005, 3.02853885902, 1059.38193018920},
+    {0.00000003480, 0.76066308841, 10973.55568635000},
+    {0.00000004232, 1.05485713117, 5760.49843189760},
+    {0.00000004582, 3.76570026763, 6386.16862421000},
+    {0.00000003335, 3.13829943354, 6836.64525283380},
+    {0.00000003420, 3.00043974511, 4292.33083295040},
+    {0.00000003595, 5.70703236079, 5643.17856367740},
+    {0.00000003236, 4.16387400645, 9917.69687450980},
+    {0.00000004154, 2.59940749519, 7058.59846131540},
+    {0.00000003362, 4.54577164994, 4732.03062734340},
+    {0.00000002978, 1.30561268820, 6283.14316029419},
+    {0.00000002765, 0.51311975671, 26.29831979980},
+    {0.00000002807, 5.66230537649, 8635.94200376320},
+    {0.00000002927, 5.73787834080, 16200.77272450120},
+    {0.00000003167, 1.69181759900, 11015.10647733480},
+    {0.00000002598, 2.96244118358, 25132.30339996560},
+    {0.00000003519, 3.62639325753, 244287.60000722769},
+    {0.00000002676, 4.20727719487, 18073.70493865020},
+    {0.00000002978, 1.74971565805, 6283.00853968860},
+    {0.00000002287, 1.06976449088, 14314.16811304980},
+    {0.00000002863, 5.92838917309, 14712.31711645800},
+    {0.00000003071, 0.23793217000, 35371.88726597640},
+    {0.00000002656, 0.89959301615, 12352.85260454480},
+    {0.00000002415, 2.79975176800, 709.93304855830},
+    {0.00000002811, 3.51513864541, 21228.39202354580},
+    {0.00000001977, 2.61358297551, 951.71840625060},
+    {0.00000002548, 2.47684686575, 6208.29425142410},
+    {0.00000001999, 0.56090396506, 7079.37385680780},
+    {0.00000002305, 1.05376463592, 22483.84857449259},
+    {0.00000001855, 2.86093570752, 5216.58037280140},
+    {0.00000002157, 1.31395211105, 154717.60988768269},
+    {0.00000001970, 4.36931551625, 167283.76158766549},
+    {0.00000001754, 2.14452400686, 6290.18939699220},
+    {0.00000001628, 5.85704450617, 10984.19235169980},
+    {0.00000002154, 6.03828353794, 10873.98603048040},
+    {0.00000001714, 3.70158195222, 1592.59601363280},
+    {0.00000001541, 6.21599512982, 23543.23050468179},
+    {0.00000001602, 1.99860679677, 10969.96525769820},
+    {0.00000001712, 1.34295218697, 3128.38876509580},
+    {0.00000001647, 5.54948299069, 6496.37494542940},
+    {0.00000001495, 5.43980459648, 155.42039943420},
+    {0.00000001827, 5.91227480351, 3738.76143010800},
+    {0.00000001726, 2.16765465036, 10575.40668294180},
+    {0.00000001532, 5.35683107063, 13521.75144159140},
+    {0.00000001824, 1.66056145084, 39302.09696219600},
+    {0.00000001605, 1.90930973224, 6133.51265285680},
+    {0.00000001282, 2.46013372544, 13916.01910964160},
+    {0.00000001211, 4.41360631550, 3894.18182954220},
+    {0.00000001394, 1.77801929250, 9225.53927328300},
+    {0.00000001571, 4.95512957606, 25158.60171976540},
+    {0.00000001205, 1.19212756308, 3.52311834900},
+    {0.00000001132, 2.69830084955, 6040.34724601740},
+    {0.00000001504, 5.77577388271, 18209.33026366019},
+    {0.00000001393, 1.62625077326, 5120.60114558360},
+    {0.00000001081, 2.93726744446, 17256.63153634140},
+    {0.00000001232, 0.71651766504, 143571.32428481648},
+    {0.00000001087, 0.99769687961, 955.59974160860},
+    {0.00000001068, 5.28472576591, 65147.61976813770},
+    {0.00000001169, 3.11663802316, 14945.31617355440},
+    {0.00000000975, 5.10887260780, 6172.86952877200},
+    {0.00000001202, 4.02992510403, 553.56940284240},
+    {0.00000000979, 2.00000879106, 15110.46611986620},
+    {0.00000000962, 4.02380771400, 6282.09552892320},
+    {0.00000000999, 3.62643002790, 6262.30045449900},
+    {0.00000001030, 5.84987815239, 213.29909543800},
+    {0.00000001014, 2.84227679965, 8662.24032356300},
+    {0.00000001185, 1.51330629149, 17654.78053974960},
+    {0.00000000967, 2.67081017562, 5650.29211067820},
+    {0.00000001222, 2.65423784904, 88860.05707098669},
+    {0.00000000986, 2.36212814824, 6206.80977871580},
+    {0.00000001034, 0.13634950642, 11712.95531823080},
+    {0.00000001103, 3.08477302937, 43232.30665841560},
+    {0.00000000781, 2.53374971725, 16496.36139620240},
+    {0.00000001019, 3.04569392376, 6037.24420376200},
+    {0.00000000795, 5.80662989126, 5230.80746680300},
+    {0.00000000813, 3.57702871938, 10177.25767953360},
+    {0.00000000962, 5.31470594766, 6284.05617105960},
+    {0.00000000717, 5.95797471837, 12559.03815298200},
+    {0.00000000967, 2.74413738053, 6244.94281435360},
+    {0.00000000921, 0.10160160830, 29088.81141598500},
+    {0.00000000719, 5.91788189939, 4136.91043351620},
+    {0.00000000688, 3.89489045092, 1589.07289528380},
+    {0.00000000772, 4.05505380285, 6127.65545055720},
+    {0.00000000706, 5.49323197725, 22003.91463486980},
+    {0.00000000665, 1.60002747134, 11087.28512591840},
+    {0.00000000690, 4.50539825729, 426.59819087600},
+    {0.00000000854, 3.26104645060, 20426.57109242200},
+    {0.00000000656, 4.32410182940, 16858.48253293320},
+    {0.00000000840, 2.59572585212, 28766.92442448400},
+    {0.00000000686, 0.61944033771, 11403.67699557500},
+    {0.00000000700, 3.40901412473, 7.11354700080},
+    {0.00000000728, 0.04050185963, 5481.25491886760},
+    {0.00000000653, 1.03869451230, 6062.66320755260},
+    {0.00000000559, 4.79221805695, 20199.09495963300},
+    {0.00000000633, 5.70229959167, 45892.73043315699},
+    {0.00000000591, 6.10986487621, 9623.68827669120},
+    {0.00000000520, 3.62310356479, 5333.90024102160},
+    {0.00000000602, 5.58381898589, 10344.29506538580},
+    {0.00000000496, 2.21027756314, 1990.74501704100},
+    {0.00000000691, 1.96733114988, 12416.58850284820},
+    {0.00000000640, 1.59062417043, 18319.53658487960},
+    {0.00000000625, 3.82358168221, 13517.87010623340},
+    {0.00000000475, 1.17025904180, 12569.67481833180},
+    {0.00000000660, 5.08498512995, 283.85931886520},
+    {0.00000000664, 4.50029469969, 47162.51635463520},
+    {0.00000000569, 0.16318535463, 17267.26820169119},
+    {0.00000000568, 3.86100969474, 6076.89030155420},
+    {0.00000000462, 0.26368763517, 4590.91018048900},
+    {0.00000000535, 4.83225423196, 18422.62935909819},
+    {0.00000000466, 0.75873879417, 7342.45778018060},
+    {0.00000000541, 3.07212190556, 226858.23855437008},
+    {0.00000000610, 1.53597089605, 33019.02111220460},
+    {0.00000000617, 2.62356328726, 11190.37790013700},
+    {0.00000000548, 4.55798855803, 18875.52586977400},
+    {0.00000000633, 4.60110281228, 66567.48586525429},
+    {0.00000000587, 5.78087907808, 632.78373931320},
+    {0.00000000603, 5.38458554802, 316428.22867391503},
+    {0.00000000525, 5.01522072363, 12132.43996210600},
+    {0.00000000469, 0.59975173763, 21954.15760939799},
+    {0.00000000548, 3.50627043672, 17253.04110768959},
+    {0.00000000502, 0.98804327589, 11609.86254401220},
+    {0.00000000568, 1.98497313089, 7668.63742494250},
+    {0.00000000482, 1.62460405687, 12146.66705610760},
+    {0.00000000391, 3.68718382972, 18052.92954315780},
+    {0.00000000457, 3.77214896610, 156137.47598479928},
+    {0.00000000401, 5.29221540240, 15671.08175940660},
+    {0.00000000469, 1.80963351735, 12562.62858163380},
+    {0.00000000514, 3.37031288919, 20597.24396304120},
+    {0.00000000452, 5.66811219778, 10454.50138660520},
+    {0.00000000375, 4.98528185039, 9779.10867612540},
+    {0.00000000523, 0.97215560834, 155427.54293624099},
+    {0.00000000403, 5.13948189770, 1551.04522264800},
+    {0.00000000372, 3.69883738807, 9388.00590941520},
+    {0.00000000367, 4.43875659833, 4535.05943692440},
+    {0.00000000406, 4.20863156497, 12592.45001978260},
+    {0.00000000362, 2.55099560446, 242.72860397400},
+    {0.00000000471, 4.61907324819, 5436.99301524020},
+    {0.00000000388, 4.96020928400, 24356.78078864160},
+    {0.00000000441, 5.83872966262, 3496.03282613400},
+    {0.00000000349, 6.16307810648, 19800.94595622480},
+    {0.00000000356, 0.23819081240, 5429.87946823940},
+    {0.00000000346, 5.60809622572, 2379.16447357160},
+    {0.00000000380, 2.72105213132, 11933.36796066960},
+    {0.00000000432, 0.24215988572, 17996.03116822220},
+    {0.00000000378, 5.22516848076, 7477.52286021600},
+    {0.00000000337, 5.10885555836, 5849.36411211460},
+    {0.00000000315, 0.57827745123, 10557.59416082380},
+    {0.00000000318, 4.49949007320, 3634.62102451840},
+    {0.00000000323, 1.55850824803, 10440.27429260360},
+    {0.00000000314, 5.77154773334, 20.77539549240},
+    {0.00000000303, 2.34615580398, 4686.88940770680},
+    {0.00000000414, 5.93237602310, 51092.72605085480},
+    {0.00000000362, 2.17561997119, 28237.23345938940},
+    {0.00000000288, 0.18377405421, 13095.84266507740},
+    {0.00000000277, 5.12952205030, 13119.72110282519},
+    {0.00000000325, 6.18608287927, 6268.84875598980},
+    {0.00000000273, 0.30522428863, 23141.55838292460},
+    {0.00000000267, 5.76152585786, 5966.68398033480},
+    {0.00000000345, 2.94246040875, 36949.23080842420},
+    {0.00000000253, 5.20994580359, 24072.92146977640},
+    {0.00000000342, 5.76212804329, 16460.33352952499},
+    {0.00000000307, 6.01039067183, 22805.73556599360},
+    {0.00000000261, 2.00304796059, 6148.01076995600},
+    {0.00000000238, 5.08241964961, 6915.85958930460},
+    {0.00000000249, 2.94762789744, 135.06508003540},
+    {0.00000000306, 3.89765478921, 10988.80815753500},
+    {0.00000000308, 0.05451027736, 4701.11650170840},
+    {0.00000000319, 2.95712862064, 163096.18036118349},
+    {0.00000000272, 2.07967681309, 4804.20927592700},
+    {0.00000000209, 4.43768461442, 6546.15977336420},
+    {0.00000000217, 0.73691592312, 6303.85124548380},
+    {0.00000000203, 0.32033085531, 25934.12433108940},
+    {0.00000000205, 5.22936478995, 20995.39296644940},
+    {0.00000000213, 0.20671418919, 28286.99048486120},
+    {0.00000000197, 0.48286131290, 16737.57723659660},
+    {0.00000000230, 6.06567392849, 6287.00800325450},
+    {0.00000000219, 1.29194216300, 5326.78669402080},
+    {0.00000000201, 1.74700937253, 22743.40937951640},
+    {0.00000000207, 4.45440927276, 6279.48542133960},
+    {0.00000000269, 6.05640445030, 64471.99124174489},
+    {0.00000000190, 0.99261116842, 29296.61538957860},
+    {0.00000000194, 3.82656562755, 419.48464387520},
+    {0.00000000262, 5.26961924126, 522.57741809380},
+    {0.00000000210, 4.68618183158, 6254.62666252360},
+    {0.00000000197, 2.80624554186, 4933.20844033260},
+    {0.00000000252, 4.36220154620, 40879.44050464380},
+    {0.00000000261, 1.07241516738, 55022.93574707440},
+    {0.00000000233, 5.41751014958, 39609.65458316560},
+    {0.00000000185, 4.14324541379, 5642.19824260920},
+    {0.00000000247, 3.44855612987, 6702.56049386660},
+    {0.00000000205, 4.04424043226, 536.80451209540},
+    {0.00000000191, 3.15807087926, 16723.35014259500},
+    {0.00000000222, 5.16259496507, 23539.70738633280},
+    {0.00000000180, 4.56214752149, 6489.26139842860},
+    {0.00000000227, 0.60156339452, 5905.70224207560},
+    {0.00000000170, 0.93185903228, 16062.18452611680},
+    {0.00000000159, 0.92751013112, 23937.85638974100},
+    {0.00000000157, 4.69607868164, 6805.65326808520},
+    {0.00000000218, 0.85533373430, 16627.37091537720},
+    {0.00000000169, 0.94641052064, 3097.88382272579},
+    {0.00000000207, 4.88410451334, 6286.66627864320},
+    {0.00000000160, 4.95943826819, 10021.83728009940},
+    {0.00000000175, 6.12762824563, 239424.39025435288},
+    {0.00000000173, 3.13887234973, 6179.98307577280},
+    {0.00000000157, 3.62822057807, 18451.07854656599},
+    {0.00000000206, 5.74617821138, 3646.35037735440},
+    {0.00000000157, 4.67695912207, 6709.67404086740},
+    {0.00000000146, 3.09506069745, 4907.30205014560},
+    {0.00000000165, 2.27139128760, 10660.68693504240},
+    {0.00000000144, 3.96947747592, 6019.99192661860},
+    {0.00000000171, 5.91302216729, 6058.73105428950},
+    {0.00000000144, 2.13155655120, 26084.02180621620},
+    {0.00000000151, 0.67417383565, 2388.89402044920},
+    {0.00000000196, 1.67718461229, 2107.03450754240},
+    {0.00000000146, 5.10373877968, 10770.89325626180},
+    {0.00000000187, 1.23915444627, 19402.79695281660},
+    {0.00000000137, 1.26247412216, 12566.21901028560},
+    {0.00000000191, 5.03547476279, 263.08392337280},
+    {0.00000000137, 3.52825454595, 639.89728631400},
+    {0.00000000135, 0.73840670927, 5017.50837136500},
+    {0.00000000164, 2.39195095081, 6357.85744855870},
+    {0.00000000168, 0.05515907462, 9380.95967271720},
+    {0.00000000161, 1.15721259392, 26735.94526221320},
+    {0.00000000144, 1.76097645199, 5888.44996493220},
+    {0.00000000131, 2.51859277344, 6599.46771964800},
+    {0.00000000142, 2.43802911123, 5881.40372823420},
+    {0.00000000159, 5.90325893762, 6281.59137728310},
+    {0.00000000151, 3.72338532519, 12669.24447420140},
+    {0.00000000132, 2.38417741883, 6525.80445396540},
+    {0.00000000127, 0.00254936441, 10027.90319572920},
+    {0.00000000148, 2.85102145528, 6418.14093002680},
+    {0.00000000143, 5.74460279560, 26087.90314157420},
+    {0.00000000172, 0.41289962240, 174242.46596404970},
+    {0.00000000136, 4.15497742275, 6311.52503745920},
+    {0.00000000170, 5.98194913129, 327574.51427678125},
+    {0.00000000136, 2.48430537541, 13341.67431130680},
+    {0.00000000149, 0.33002271275, 245.83164622940},
+    {0.00000000165, 2.49667924600, 58953.14544329400},
+    {0.00000000123, 1.67328384813, 32217.20018108080},
+    {0.00000000123, 3.45660563754, 6277.55292568400},
+    {0.00000000117, 0.86065134175, 6245.04817735560},
+    {0.00000000149, 5.61358281003, 5729.50644714900},
+    {0.00000000128, 0.71204006448, 103.09277421860},
+    {0.00000000159, 2.43166592149, 221995.02880149524},
+    {0.00000000137, 1.70657709200, 12566.08438968000},
+    {0.00000000129, 2.80667872683, 6016.46880826960},
+    {0.00000000113, 3.58302904101, 25685.87280280800},
+    {0.00000000109, 3.26403795962, 6819.88036208680},
+    {0.00000000122, 0.34120688202, 1162.47470440780},
+    {0.00000000106, 1.59721172719, 17782.73207278420},
+    {0.00000000144, 2.28891651774, 12489.88562870720},
+    {0.00000000137, 5.82029768354, 44809.65020086340},
+    {0.00000000134, 1.26539983018, 5331.35744374080},
+    {0.00000000103, 5.96518130595, 6321.10352262720},
+    {0.00000000109, 0.33808549034, 11300.58422135640},
+    {0.00000000129, 5.89187277190, 12029.34718788740},
+    {0.00000000122, 5.77325634636, 11919.14086666800},
+    {0.00000000107, 6.24998989350, 77690.75950573849},
+    {0.00000000107, 1.00535580713, 77736.78343050249},
+    {0.00000000115, 5.86963518266, 12721.57209941700},
+    {0.00000000102, 5.66283467269, 5540.08578945880},
+    {0.00000000143, 0.24122178432, 4214.06901508480},
+    {0.00000000143, 0.88529649733, 7576.56007357400},
+    {0.00000000107, 2.92124030351, 31415.37924995700},
+    {0.00000000100, 5.99485644501, 4061.21921539440},
+    {0.00000000103, 2.41941934525, 5547.19933645960},
+    {0.00000000104, 4.44106051277, 2118.76386037840},
+    {0.00000000110, 0.37559635174, 5863.59120611620},
+    {0.00000000124, 2.55619029611, 12539.85338018300},
+    {0.00000000110, 3.66952094465, 238004.52415723629},
+    {0.00000000112, 4.32512422724, 97238.62754448749},
+    {0.00000000120, 1.26895630075, 12043.57428188900},
+    {0.00000000097, 5.42612959752, 7834.12107263940},
+    {0.00000000094, 2.56461130309, 19004.64794940840},
+    {0.00000000105, 5.68272475301, 16522.65971600220},
+    {0.00000000117, 3.65425622684, 34520.30930938080},
+    {0.00000000108, 1.24206843948, 84672.47584450469},
+    {0.00000000098, 0.13589994287, 11080.17157891760},
+    {0.00000000097, 2.46722096722, 71980.63357473118},
+    {0.00000000095, 5.36958330451, 6288.59877429880},
+    {0.00000000096, 0.20796618776, 18139.29450141590},
+    {0.00000000111, 5.01961920313, 11823.16163945020},
+    {0.00000000090, 2.72355843779, 26880.31981303260},
+    {0.00000000099, 0.90164266199, 18635.92845453620},
+    {0.00000000126, 4.78722177847, 305281.94307104882},
+    {0.00000000124, 5.00979495566, 172146.97134054029},
+    {0.00000000090, 4.50544881196, 40077.61957352000},
+    {0.00000000104, 5.63679680710, 2787.04302385740},
+    {0.00000000091, 5.43564326147, 6272.03014972750},
+    {0.00000000100, 2.00639461597, 12323.42309600880},
+    {0.00000000117, 2.35555589778, 83286.91426955358},
+    {0.00000000105, 2.59824000109, 30666.15495843280},
+    {0.00000000090, 2.35779490026, 12491.37010141550},
+    {0.00000000089, 3.57152453732, 11720.06886523160},
+    {0.00000000095, 5.67015349858, 14919.01785375460},
+    {0.00000000087, 1.86043406047, 27707.54249429480},
+    {0.00000000106, 3.04150600352, 22345.26037610820},
+    {0.00000000082, 5.58298993353, 10241.20229116720},
+    {0.00000000083, 3.10607039533, 36147.40987730040},
+    {0.00000000094, 5.47749711149, 9924.81042151060},
+    {0.00000000082, 4.71988314145, 15141.39079431200},
+    {0.00000000096, 3.89073946348, 6379.05507720920},
+    {0.00000000110, 4.92131611151, 5621.84292321040},
+    {0.00000000110, 4.89978492291, 72140.62866668739},
+    {0.00000000097, 5.20764563059, 6303.43116939020},
+    {0.00000000085, 1.61269222311, 33326.57873317420},
+    {0.00000000093, 1.32651591333, 23020.65308658799},
+    {0.00000000090, 0.57733016380, 26482.17080962440},
+    {0.00000000078, 3.99588630754, 11293.47067435560},
+    {0.00000000106, 3.92012705073, 62883.35513951360},
+    {0.00000000098, 2.94397773524, 316.39186965660},
+    {0.00000000076, 3.96310417608, 29026.48522950779},
+    {0.00000000098, 0.95914722366, 48739.85989708300},
+    {0.00000000078, 1.97068528043, 90279.92316810328},
+    {0.00000000076, 0.23027966596, 21424.46664430340},
+    {0.00000000079, 1.46227790922, 8982.81066930900},
+    {0.00000000078, 2.28840998832, 266.60704172180},
+    {0.00000000071, 1.51940765590, 33794.54372352860},
+    {0.00000000076, 0.22880641443, 57375.80190084620},
+    {0.00000000097, 0.39449562097, 24279.10701821359},
+    {0.00000000075, 2.77638584795, 12964.30070339100},
+    {0.00000000077, 5.18846946344, 11520.99686379520},
+    {0.00000000068, 0.50006599129, 4274.51831083240},
+    {0.00000000075, 2.07323762803, 15664.03552270859},
+    {0.00000000077, 0.46665178780, 16207.88627150200},
+    {0.00000000081, 4.10452219483, 161710.61878623239},
+    {0.00000000071, 3.91415328513, 7875.67186362420},
+    {0.00000000081, 0.91938383406, 74.78159856730},
+    {0.00000000083, 4.69916218791, 23006.42599258639},
+    {0.00000000069, 0.98999300277, 6393.28217121080},
+    {0.00000000065, 5.41938745446, 28628.33622609960},
+    {0.00000000073, 2.45564765251, 15508.61512327440},
+    {0.00000000065, 3.02336771694, 5959.57043333400},
+    {0.00000000064, 0.18375587635, 1066.49547719000},
+    {0.00000000080, 5.81239171612, 12341.80690428090},
+    {0.00000000066, 2.15105504851, 38.02767263580},
+    {0.00000000067, 5.14047250153, 9814.60410029120},
+    {0.00000000062, 2.43313614978, 10138.10951694860},
+    {0.00000000068, 2.24442548639, 24383.07910844140},
+    {0.00000000078, 1.39649333997, 9411.46461508720},
+    {0.00000000059, 4.95362151577, 35707.71008290740},
+    {0.00000000073, 1.35229143121, 5327.47610838280},
+    {0.00000000057, 3.16018882154, 5490.30096152400},
+    {0.00000000072, 5.91833527334, 10881.09957748120},
+    {0.00000000067, 0.66414713064, 29864.33402730900},
+    {0.00000000065, 0.30352816135, 7018.95236352320},
+    {0.00000000059, 5.36231868425, 10239.58386601080},
+    {0.00000000056, 3.22196331515, 2636.72547263700},
+    {0.00000000068, 5.32086226658, 3116.65941225980},
+    {0.00000000059, 1.63156134967, 61306.01159706580},
+    {0.00000000054, 4.29491690425, 21947.11137270000},
+    {0.00000000070, 0.29271565928, 6528.90749622080},
+    {0.00000000057, 5.89190132575, 34513.26307268280},
+    {0.00000000054, 2.51856815404, 6279.19451463340},
+    {0.00000000074, 1.38235845304, 9967.45389998160},
+    {0.00000000054, 0.92276712152, 6286.95718534940},
+    {0.00000000070, 5.00933012248, 6453.74872061060},
+    {0.00000000053, 3.86543309344, 32370.97899156560},
+    {0.00000000055, 4.51794544854, 34911.41207609100},
+    {0.00000000063, 5.41479412056, 11502.83761653050},
+    {0.00000000063, 2.34416220742, 11510.70192305670},
+    {0.00000000056, 0.91310629913, 9910.58332750900},
+    {0.00000000067, 4.03308763854, 34596.36465465240},
+    {0.00000000060, 5.57024703495, 5756.90800324580},
+    {0.00000000072, 2.80863088166, 10866.87248347960},
+    {0.00000000066, 6.12047940728, 12074.48840752400},
+    {0.00000000051, 2.59519527563, 11396.56344857420},
+    {0.00000000062, 5.14746754396, 25287.72379939980},
+    {0.00000000054, 2.50994032776, 5999.21653112620},
+    {0.00000000051, 4.51195861837, 29822.78323632420},
+    {0.00000000059, 0.44167237876, 250570.67585721909},
+    {0.00000000051, 3.68849066760, 6262.72053059260},
+    {0.00000000049, 0.54704693048, 22594.05489571199},
+    {0.00000000065, 2.38423614501, 52670.06959330260},
+    {0.00000000069, 5.34363738671, 66813.56483573320},
+    {0.00000000056, 2.67216180349, 17892.93839400359},
+    {0.00000000049, 4.18361320516, 18606.49894600020},
+    {0.00000000055, 0.83886167974, 20452.86941222180},
+    {0.00000000050, 1.46327331958, 37455.72649597440},
+    {0.00000000058, 3.34847975377, 33990.61834428620},
+    {0.00000000065, 1.45522693982, 76251.32777062019},
+    {0.00000000056, 2.35650664200, 37724.75341974820},
+    {0.00000000048, 1.80689447612, 206.18554843720},
+    {0.00000000056, 3.84224878744, 5483.25472482600},
+    {0.00000000053, 0.17334326094, 77717.29458646949},
+    {0.00000000053, 0.79879700631, 77710.24834977149},
+    {0.00000000047, 0.43240779709, 735.87651353180},
+    {0.00000000053, 4.58786566028, 11616.97609101300},
+    {0.00000000048, 6.20230111054, 4171.42553661380},
+    {0.00000000052, 2.91719053030, 6993.00889854970},
+    {0.00000000057, 3.42008310383, 50317.20343953080},
+    {0.00000000048, 0.12356889012, 13362.44970679920},
+    {0.00000000060, 5.52056066934, 949.17560896980},
+    {0.00000000045, 3.37963782356, 10763.77970926100},
+    {0.00000000047, 5.50958184902, 12779.45079542080},
+    {0.00000000052, 5.42770349015, 310145.15282392364},
+    {0.00000000061, 2.93237974631, 5791.41255753260},
+    {0.00000000044, 2.87440620802, 8584.66166590080},
+    {0.00000000046, 4.03141796560, 10667.80048204320},
+    {0.00000000044, 1.21579107625, 6272.43918464160},
+    {0.00000000047, 2.57670800912, 11492.54267579200},
+    {0.00000000044, 3.62570223167, 63658.87775083760},
+    {0.00000000051, 0.84531181151, 12345.73905754400},
+    {0.00000000046, 1.17584556517, 149.56319713460},
+    {0.00000000043, 0.01524970172, 37853.87549938260},
+    {0.00000000043, 0.79038834934, 640.87760738220},
+    {0.00000000044, 2.22554419931, 6293.71251534120},
+    {0.00000000049, 1.01528394907, 149144.46708624958},
+    {0.00000000041, 3.27146326065, 8858.31494432060},
+    {0.00000000045, 3.03765521215, 65236.22129328540},
+    {0.00000000058, 5.45843180927, 1975.49254585600},
+    {0.00000000041, 1.32190847146, 2547.83753823240},
+    {0.00000000047, 3.67626039848, 28313.28880466100},
+    {0.00000000047, 6.21438985953, 10991.30589870060},
+    {0.00000000040, 2.37237751212, 8273.82086703240},
+    {0.00000000056, 1.09773690181, 77376.20102240759},
+    {0.00000000040, 2.35698541041, 2699.73481931760},
+    {0.00000000043, 5.28030897946, 17796.95916678580},
+    {0.00000000054, 2.59175932091, 22910.44676536859},
+    {0.00000000055, 0.07988985505, 83467.15635301729},
+    {0.00000000041, 4.47510694062, 5618.31980486140},
+    {0.00000000040, 1.35670430524, 27177.85152920020},
+    {0.00000000041, 2.48011323946, 6549.68289171320},
+    {0.00000000050, 2.56387920528, 82576.98122099529},
+    {0.00000000042, 4.78798367468, 7856.89627409019},
+    {0.00000000047, 2.75482175292, 18202.21671665939},
+    {0.00000000039, 1.97008298629, 24491.42579258340},
+    {0.00000000042, 4.04346599946, 7863.94251078820},
+    {0.00000000039, 3.01033936420, 853.19638175200},
+    {0.00000000038, 0.49178679251, 38650.17350619900},
+    {0.00000000044, 1.35931241699, 21393.54196985760},
+    {0.00000000036, 4.86047906533, 4157.19844261220},
+    {0.00000000043, 5.64354880978, 1062.90504853820},
+    {0.00000000039, 3.92736779879, 3903.91137641980},
+    {0.00000000040, 5.39694918320, 9498.21223063460},
+    {0.00000000043, 2.40863861919, 29424.63423291600},
+    {0.00000000046, 2.08022244271, 12573.26524698360},
+    {0.00000000050, 6.15760345261, 78051.34191383338},
+};
+
+static const struct ln_vsop earth_radius_r1[RADIUS_R1] = {
+    {0.00103018607, 1.10748968172, 6283.07584999140},
+    {0.00001721238, 1.06442300386, 12566.15169998280},
+    {0.00000702217, 3.14159265359, 0.00000000000},
+    {0.00000032345, 1.02168583254, 18849.22754997420},
+    {0.00000030801, 2.84358443952, 5507.55323866740},
+    {0.00000024978, 1.31906570344, 5223.69391980220},
+    {0.00000018487, 1.42428709076, 1577.34354244780},
+    {0.00000010077, 5.91385248388, 10977.07880469900},
+    {0.00000008635, 0.27158192945, 5486.77784317500},
+    {0.00000008654, 1.42046854427, 6275.96230299060},
+    {0.00000005069, 1.68613408916, 5088.62883976680},
+    {0.00000004985, 6.01402338185, 6286.59896834040},
+    {0.00000004667, 5.98749245692, 529.69096509460},
+    {0.00000004395, 0.51800423445, 4694.00295470760},
+    {0.00000003870, 4.74932206877, 2544.31441988340},
+    {0.00000003755, 5.07053801166, 796.29800681640},
+    {0.00000004100, 1.08424801084, 9437.76293488700},
+    {0.00000003518, 0.02290216978, 83996.84731811189},
+    {0.00000003436, 0.94937503872, 71430.69561812909},
+    {0.00000003221, 6.15628775321, 2146.16541647520},
+    {0.00000003418, 5.41151581880, 775.52261132400},
+    {0.00000002863, 5.48433323746, 10447.38783960440},
+    {0.00000002525, 0.24296913555, 398.14900340820},
+    {0.00000002205, 4.94892172085, 6812.76681508600},
+    {0.00000002186, 0.41991932164, 8031.09226305840},
+    {0.00000002828, 3.41986300734, 2352.86615377180},
+    {0.00000002554, 6.13241770582, 6438.49624942560},
+    {0.00000001932, 5.31374587091, 8429.24126646660},
+    {0.00000002427, 3.09118902115, 4690.47983635860},
+    {0.00000001730, 1.53685999718, 4705.73230754360},
+    {0.00000002250, 3.68836395620, 7084.89678111520},
+    {0.00000002094, 1.28169060400, 1748.01641306700},
+    {0.00000001483, 3.22226346483, 7234.79425624200},
+    {0.00000001434, 0.81293662216, 14143.49524243060},
+    {0.00000001754, 3.22883705112, 6279.55273164240},
+    {0.00000001583, 4.09815978783, 11499.65622279280},
+    {0.00000001575, 5.53890314149, 3154.68708489560},
+    {0.00000001847, 1.82041234937, 7632.94325965020},
+    {0.00000001499, 3.63177937611, 11513.88331679440},
+    {0.00000001337, 4.64442556061, 6836.64525283380},
+    {0.00000001275, 2.69329661394, 1349.86740965880},
+    {0.00000001348, 6.15284035323, 5746.27133789600},
+    {0.00000001126, 3.35676107739, 17789.84561978500},
+    {0.00000001470, 3.65282991735, 1194.44701022460},
+    {0.00000001101, 4.49747427670, 4292.33083295040},
+    {0.00000001168, 2.58033028504, 13367.97263110660},
+    {0.00000001236, 5.64980098028, 5760.49843189760},
+    {0.00000000985, 0.65326301914, 5856.47765911540},
+    {0.00000000928, 2.32555018290, 10213.28554621100},
+    {0.00000001073, 5.82672338169, 12036.46073488820},
+    {0.00000000918, 0.76907130762, 16730.46368959580},
+    {0.00000000876, 1.50335727807, 11926.25441366880},
+    {0.00000001023, 5.62071200879, 6256.77753019160},
+    {0.00000000853, 0.65678134630, 155.42039943420},
+    {0.00000000802, 4.10519132094, 951.71840625060},
+    {0.00000000859, 1.42880883564, 5753.38488489680},
+    {0.00000000992, 1.14238001610, 1059.38193018920},
+    {0.00000000814, 1.63584008733, 6681.22485339960},
+    {0.00000000664, 4.55039663226, 5216.58037280140},
+    {0.00000000627, 1.50782904323, 5643.17856367740},
+    {0.00000000644, 4.19480024859, 6040.34724601740},
+    {0.00000000590, 6.18371704849, 4164.31198961300},
+    {0.00000000635, 0.52423584770, 6290.18939699220},
+    {0.00000000650, 0.97935492869, 25132.30339996560},
+    {0.00000000568, 2.30121525349, 10973.55568635000},
+    {0.00000000549, 5.26737827342, 3340.61242669980},
+    {0.00000000547, 2.20143332641, 1592.59601363280},
+    {0.00000000526, 0.92464258271, 11371.70468975820},
+    {0.00000000493, 5.91036281399, 3894.18182954220},
+    {0.00000000483, 1.66005711540, 12168.00269657460},
+    {0.00000000514, 3.59683072524, 10969.96525769820},
+    {0.00000000516, 3.97164781773, 17298.18232732620},
+    {0.00000000529, 5.03538677680, 9917.69687450980},
+    {0.00000000487, 2.50544745305, 6127.65545055720},
+    {0.00000000419, 4.05235655996, 10984.19235169980},
+    {0.00000000538, 5.54081539813, 553.56940284240},
+    {0.00000000402, 2.16859478359, 7860.41939243920},
+    {0.00000000552, 2.32219865498, 11506.76976979360},
+    {0.00000000367, 3.39145698451, 6496.37494542940},
+    {0.00000000360, 5.34467204596, 7079.37385680780},
+    {0.00000000334, 3.61346365667, 11790.62908865880},
+    {0.00000000454, 0.28755421898, 801.82093112380},
+    {0.00000000419, 3.69613970002, 10575.40668294180},
+    {0.00000000319, 0.30793759304, 16200.77272450120},
+    {0.00000000376, 5.81560210508, 7058.59846131540},
+    {0.00000000364, 1.08425056923, 6309.37416979120},
+    {0.00000000294, 4.54798604178, 11856.21865142450},
+    {0.00000000290, 1.26451946335, 8635.94200376320},
+    {0.00000000394, 4.15683669084, 26.29831979980},
+    {0.00000000260, 5.09424572996, 10177.25767953360},
+    {0.00000000241, 2.25766000302, 11712.95531823080},
+    {0.00000000239, 1.06936978753, 242.72860397400},
+    {0.00000000276, 3.44260568764, 5884.92684658320},
+    {0.00000000255, 5.38496803122, 21228.39202354580},
+    {0.00000000307, 4.24313885601, 3738.76143010800},
+    {0.00000000213, 3.44661200485, 213.29909543800},
+    {0.00000000198, 0.69427265195, 1990.74501704100},
+    {0.00000000195, 5.16563409007, 12352.85260454480},
+    {0.00000000213, 3.89937836808, 13916.01910964160},
+    {0.00000000214, 4.00445200772, 5230.80746680300},
+    {0.00000000184, 5.59805976614, 6283.14316029419},
+    {0.00000000184, 2.85275392124, 7238.67559160000},
+    {0.00000000179, 2.54259058252, 14314.16811304980},
+    {0.00000000236, 5.58826125715, 6069.77675455340},
+    {0.00000000189, 2.72689937708, 6062.66320755260},
+    {0.00000000184, 6.04216273598, 6283.00853968860},
+    {0.00000000225, 1.66128561344, 4732.03062734340},
+    {0.00000000230, 3.62591335086, 6284.05617105960},
+    {0.00000000172, 0.97566476085, 3930.20969621960},
+    {0.00000000162, 2.19467339429, 18073.70493865020},
+    {0.00000000215, 1.04672844028, 3496.03282613400},
+    {0.00000000182, 5.17782354566, 17253.04110768959},
+    {0.00000000167, 2.17754938066, 6076.89030155420},
+    {0.00000000167, 4.75672473773, 17267.26820169119},
+    {0.00000000149, 0.80944185798, 709.93304855830},
+    {0.00000000149, 0.17584214812, 9779.10867612540},
+    {0.00000000192, 5.00680790235, 11015.10647733480},
+    {0.00000000141, 4.38420380014, 4136.91043351620},
+    {0.00000000158, 4.60969054283, 9623.68827669120},
+    {0.00000000133, 3.30507062245, 154717.60988768269},
+    {0.00000000166, 6.13191098325, 3.52311834900},
+    {0.00000000181, 1.60715321141, 7.11354700080},
+    {0.00000000150, 5.28136702046, 13517.87010623340},
+    {0.00000000142, 0.49788089569, 25158.60171976540},
+    {0.00000000124, 6.03440459813, 9225.53927328300},
+    {0.00000000124, 0.99251562639, 65147.61976813770},
+    {0.00000000128, 1.92032744711, 22483.84857449259},
+    {0.00000000124, 3.99739675184, 4686.88940770680},
+    {0.00000000121, 2.37814805239, 167283.76158766549},
+    {0.00000000123, 5.62315112940, 5642.19824260920},
+    {0.00000000117, 5.81755956156, 12569.67481833180},
+    {0.00000000157, 3.40236948518, 16496.36139620240},
+    {0.00000000130, 2.10499918142, 1589.07289528380},
+    {0.00000000116, 0.55839966736, 5849.36411211460},
+    {0.00000000123, 5.81645568991, 6282.09552892320},
+    {0.00000000110, 0.42176497674, 6172.86952877200},
+    {0.00000000150, 4.26279600865, 3128.38876509580},
+    {0.00000000106, 2.27436561182, 5429.87946823940},
+    {0.00000000114, 1.52894564202, 12559.03815298200},
+    {0.00000000121, 0.39459045915, 12132.43996210600},
+    {0.00000000104, 2.41845930933, 426.59819087600},
+    {0.00000000109, 5.82786999856, 16858.48253293320},
+    {0.00000000102, 4.46626484910, 23543.23050468179},
+    {0.00000000100, 2.93812275274, 4535.05943692440},
+    {0.00000000097, 3.97935904984, 6133.51265285680},
+    {0.00000000098, 0.87616810121, 6525.80445396540},
+    {0.00000000110, 6.22339014386, 12146.66705610760},
+    {0.00000000098, 3.17344332543, 10440.27429260360},
+    {0.00000000096, 2.44128701699, 3097.88382272579},
+    {0.00000000099, 5.75642493267, 7342.45778018060},
+    {0.00000000090, 0.18984343165, 13119.72110282519},
+    {0.00000000099, 5.58884724219, 2388.89402044920},
+    {0.00000000091, 6.04278320182, 20426.57109242200},
+    {0.00000000080, 1.29028142103, 5650.29211067820},
+    {0.00000000086, 3.94529200528, 10454.50138660520},
+    {0.00000000085, 1.92836879835, 29088.81141598500},
+    {0.00000000076, 2.70726317966, 143571.32428481648},
+    {0.00000000091, 5.63859073351, 8827.39026987480},
+    {0.00000000076, 1.80783856698, 28286.99048486120},
+    {0.00000000075, 3.40858032804, 5481.25491886760},
+    {0.00000000070, 4.53719487231, 17256.63153634140},
+    {0.00000000089, 1.10064490942, 11769.85369316640},
+    {0.00000000066, 2.78384937771, 536.80451209540},
+    {0.00000000068, 3.88199295043, 17260.15465469040},
+    {0.00000000088, 3.88075269535, 7477.52286021600},
+    {0.00000000061, 6.17558202197, 11087.28512591840},
+    {0.00000000060, 4.34824715818, 6206.80977871580},
+    {0.00000000082, 4.59843208943, 9388.00590941520},
+    {0.00000000079, 1.63139280394, 4933.20844033260},
+    {0.00000000081, 1.55550779371, 9380.95967271720},
+    {0.00000000078, 4.20905757519, 5729.50644714900},
+    {0.00000000058, 5.76889633224, 3634.62102451840},
+    {0.00000000060, 0.93813100594, 12721.57209941700},
+    {0.00000000071, 6.11408885148, 8662.24032356300},
+    {0.00000000057, 5.48112524468, 18319.53658487960},
+    {0.00000000070, 0.01749174864, 14945.31617355440},
+    {0.00000000074, 1.09976045820, 16460.33352952499},
+    {0.00000000056, 1.63036186739, 15720.83878487840},
+    {0.00000000055, 4.86788348404, 13095.84266507740},
+    {0.00000000060, 5.93729841267, 12539.85338018300},
+    {0.00000000054, 0.22608242982, 15110.46611986620},
+    {0.00000000054, 2.30250047594, 16062.18452611680},
+    {0.00000000064, 2.13513754101, 7875.67186362420},
+    {0.00000000059, 5.87963500139, 5331.35744374080},
+    {0.00000000058, 2.30546168615, 955.59974160860},
+    {0.00000000049, 1.93839278478, 5333.90024102160},
+    {0.00000000054, 5.80331607119, 12043.57428188900},
+    {0.00000000054, 4.44671053809, 4701.11650170840},
+    {0.00000000049, 0.30241161485, 6805.65326808520},
+    {0.00000000046, 2.76898193028, 6709.67404086740},
+    {0.00000000046, 3.98449608961, 98068.53671630539},
+    {0.00000000049, 3.72022009896, 12323.42309600880},
+    {0.00000000045, 3.30065998328, 22003.91463486980},
+    {0.00000000048, 0.71071357303, 6303.43116939020},
+    {0.00000000061, 1.66030429494, 6262.30045449900},
+    {0.00000000047, 1.26317154881, 11919.14086666800},
+    {0.00000000051, 1.08020906825, 10988.80815753500},
+    {0.00000000045, 0.89150445122, 51868.24866217880},
+    {0.00000000043, 0.57756724285, 24356.78078864160},
+    {0.00000000043, 1.61526242998, 6277.55292568400},
+    {0.00000000045, 2.96132920534, 8982.81066930900},
+    {0.00000000043, 5.74295325645, 11403.67699557500},
+    {0.00000000055, 3.14274403422, 33019.02111220460},
+    {0.00000000057, 0.06379726305, 15671.08175940660},
+    {0.00000000041, 2.53761820726, 6262.72053059260},
+    {0.00000000040, 1.53130436944, 18451.07854656599},
+    {0.00000000052, 1.71451922581, 1551.04522264800},
+    {0.00000000055, 0.89439119424, 11933.36796066960},
+    {0.00000000045, 3.88495384656, 60530.48898574180},
+    {0.00000000040, 4.75740908001, 38526.57435087200},
+    {0.00000000040, 3.77498297348, 26087.90314157420},
+    {0.00000000039, 2.97113832621, 2118.76386037840},
+    {0.00000000040, 3.36050962605, 10021.83728009940},
+    {0.00000000047, 1.67051113434, 6303.85124548380},
+    {0.00000000052, 5.21827368711, 77713.77146812050},
+    {0.00000000047, 4.26356628717, 21424.46664430340},
+    {0.00000000037, 1.66712389942, 6819.88036208680},
+    {0.00000000037, 0.65746800933, 12029.34718788740},
+    {0.00000000035, 3.36255650927, 24072.92146977640},
+    {0.00000000036, 0.11087914947, 10344.29506538580},
+    {0.00000000040, 4.14725582115, 2787.04302385740},
+    {0.00000000035, 5.93650887012, 31570.79964939120},
+    {0.00000000036, 2.15108874765, 30774.50164257480},
+    {0.00000000036, 1.75078825382, 16207.88627150200},
+    {0.00000000034, 2.75708224536, 12139.55350910680},
+    {0.00000000034, 6.16891378800, 24491.42579258340},
+    {0.00000000034, 2.31528650443, 55798.45835839840},
+    {0.00000000032, 4.21446357042, 15664.03552270859},
+    {0.00000000034, 3.19783054699, 32217.20018108080},
+    {0.00000000039, 1.24979117796, 6418.14093002680},
+    {0.00000000038, 5.89832942685, 640.87760738220},
+    {0.00000000033, 4.80200120107, 16723.35014259500},
+    {0.00000000032, 1.72442327688, 27433.88921587499},
+    {0.00000000035, 4.44608896525, 18202.21671665939},
+    {0.00000000031, 4.52790731280, 6702.56049386660},
+    {0.00000000034, 3.96287980676, 18216.44381066100},
+    {0.00000000030, 5.06259854444, 226858.23855437008},
+    {0.00000000034, 1.43910280005, 49515.38250840700},
+    {0.00000000030, 0.29303163371, 13521.75144159140},
+    {0.00000000029, 2.02633840220, 11609.86254401220},
+    {0.00000000030, 2.54923230240, 9924.81042151060},
+    {0.00000000032, 4.91793198558, 11300.58422135640},
+    {0.00000000030, 0.23284423547, 23581.25817731760},
+    {0.00000000029, 1.62807736495, 639.89728631400},
+    {0.00000000028, 3.84568936822, 2699.73481931760},
+    {0.00000000029, 1.83149729794, 29822.78323632420},
+    {0.00000000033, 4.60320094415, 19004.64794940840},
+    {0.00000000027, 1.86151121799, 6288.59877429880},
+    {0.00000000030, 4.46494072240, 36147.40987730040},
+    {0.00000000028, 5.19684492912, 5863.59120611620},
+    {0.00000000035, 4.52695674113, 36949.23080842420},
+    {0.00000000027, 3.52528177609, 10770.89325626180},
+    {0.00000000026, 1.48499438453, 11080.17157891760},
+    {0.00000000035, 2.82154380962, 19402.79695281660},
+    {0.00000000025, 2.46339998836, 6279.48542133960},
+    {0.00000000026, 4.97688894643, 16737.57723659660},
+    {0.00000000027, 0.40827112500, 12964.30070339100},
+    {0.00000000029, 4.15148654061, 45892.73043315699},
+    {0.00000000026, 4.56404104286, 17796.95916678580},
+    {0.00000000025, 2.89309528854, 6286.66627864320},
+    {0.00000000026, 4.82914580957, 1066.49547719000},
+    {0.00000000031, 3.93096113738, 29864.33402730900},
+    {0.00000000024, 6.14987193584, 18606.49894600020},
+    {0.00000000024, 3.74225964547, 29026.48522950779},
+    {0.00000000025, 5.70460621565, 27707.54249429480},
+    {0.00000000025, 5.33928840652, 15141.39079431200},
+    {0.00000000023, 2.37624087345, 17996.03116822220},
+    {0.00000000026, 1.34231351782, 18875.52586977400},
+    {0.00000000022, 5.50791626120, 6245.04817735560},
+    {0.00000000024, 1.33998410121, 19800.94595622480},
+    {0.00000000023, 0.22512280890, 6279.78949257360},
+    {0.00000000022, 1.17576471775, 11925.27409260060},
+    {0.00000000022, 3.58603606640, 6915.85958930460},
+    {0.00000000023, 3.21621246666, 6286.36220740920},
+    {0.00000000029, 2.09564449439, 15265.88651930040},
+    {0.00000000022, 4.74660932338, 28230.18722269139},
+    {0.00000000021, 2.30688751432, 5999.21653112620},
+    {0.00000000028, 3.92087592807, 18208.34994259200},
+    {0.00000000021, 3.22643339385, 25934.12433108940},
+    {0.00000000021, 3.04956726238, 6566.93516885660},
+    {0.00000000027, 5.35645770522, 33794.54372352860},
+    {0.00000000025, 5.91542362188, 6489.26139842860},
+    {0.00000000020, 1.52296293311, 135.06508003540},
+    {0.00000000019, 1.78134428631, 156137.47598479928},
+    {0.00000000019, 0.34388684087, 5327.47610838280},
+    {0.00000000026, 3.41701003233, 25287.72379939980},
+    {0.00000000019, 2.86664271911, 18422.62935909819},
+    {0.00000000019, 4.71432851499, 77690.75950573849},
+    {0.00000000019, 2.54227398241, 77736.78343050249},
+    {0.00000000020, 5.91915117116, 48739.85989708300},
+};
+
+static const struct ln_vsop earth_radius_r2[RADIUS_R2] = {
+    {0.00004359385, 5.78455133808, 6283.07584999140},
+    {0.00000123633, 5.57935427994, 12566.15169998280},
+    {0.00000012342, 3.14159265359, 0.00000000000},
+    {0.00000008792, 3.62777893099, 77713.77146812050},
+    {0.00000005689, 1.86958905084, 5573.14280143310},
+    {0.00000003302, 5.47034879713, 18849.22754997420},
+    {0.00000001471, 4.47964125007, 5507.55323866740},
+    {0.00000001013, 2.81323115556, 5223.69391980220},
+    {0.00000000854, 3.10776566900, 1577.34354244780},
+    {0.00000001102, 2.84173992403, 161000.68573767410},
+    {0.00000000648, 5.47348203398, 775.52261132400},
+    {0.00000000608, 1.37894173533, 6438.49624942560},
+    {0.00000000499, 4.41649242250, 6286.59896834040},
+    {0.00000000416, 0.90332697974, 10977.07880469900},
+    {0.00000000404, 3.20567269530, 5088.62883976680},
+    {0.00000000351, 1.81081728907, 5486.77784317500},
+    {0.00000000466, 3.65086758149, 7084.89678111520},
+    {0.00000000458, 5.38585314743, 149854.40013480789},
+    {0.00000000304, 3.51015066341, 796.29800681640},
+    {0.00000000266, 6.17413982699, 6836.64525283380},
+    {0.00000000281, 1.83874672540, 4694.00295470760},
+    {0.00000000262, 1.41420110644, 2146.16541647520},
+    {0.00000000264, 3.14103683911, 71430.69561812909},
+    {0.00000000319, 5.35037932146, 3154.68708489560},
+    {0.00000000238, 2.17695432424, 155.42039943420},
+    {0.00000000229, 4.75969588070, 7234.79425624200},
+    {0.00000000291, 4.61776401638, 4690.47983635860},
+    {0.00000000211, 0.21864885298, 4705.73230754360},
+    {0.00000000204, 4.22895113488, 1349.86740965880},
+    {0.00000000195, 4.58550676556, 529.69096509460},
+    {0.00000000255, 2.81442711144, 1748.01641306700},
+    {0.00000000182, 5.70454011389, 6040.34724601740},
+    {0.00000000180, 6.02147727878, 4292.33083295040},
+    {0.00000000186, 1.58690991244, 6309.37416979120},
+    {0.00000000167, 2.88802733052, 9437.76293488700},
+    {0.00000000166, 1.99990574734, 8031.09226305840},
+    {0.00000000160, 0.04412738495, 2544.31441988340},
+    {0.00000000197, 2.01089431842, 1194.44701022460},
+    {0.00000000165, 5.78372596774, 83996.84731811189},
+    {0.00000000214, 3.38300910371, 7632.94325965020},
+    {0.00000000140, 0.36669664351, 10447.38783960440},
+    {0.00000000151, 0.95519595275, 6127.65545055720},
+    {0.00000000136, 1.48417295645, 2352.86615377180},
+    {0.00000000128, 5.48057748834, 951.71840625060},
+    {0.00000000126, 5.26866506592, 6279.55273164240},
+    {0.00000000127, 3.77552907014, 6812.76681508600},
+    {0.00000000103, 4.95897533789, 398.14900340820},
+    {0.00000000104, 0.70183576826, 1592.59601363280},
+    {0.00000000101, 1.14481598642, 3894.18182954220},
+    {0.00000000131, 0.76624310306, 553.56940284240},
+    {0.00000000109, 5.41063597567, 6256.77753019160},
+    {0.00000000078, 5.84775340741, 242.72860397400},
+    {0.00000000097, 1.94685257714, 11856.21865142450},
+    {0.00000000100, 5.19725292131, 244287.60000722769},
+    {0.00000000076, 0.70480774041, 8429.24126646660},
+    {0.00000000080, 6.18430772683, 1059.38193018920},
+    {0.00000000068, 5.29561709093, 14143.49524243060},
+    {0.00000000085, 5.39487308005, 25132.30339996560},
+    {0.00000000055, 5.16874637579, 7058.59846131540},
+    {0.00000000063, 0.48494730699, 801.82093112380},
+    {0.00000000058, 4.07254840265, 13367.97263110660},
+    {0.00000000051, 3.89696552232, 12036.46073488820},
+    {0.00000000051, 5.56335232286, 1990.74501704100},
+    {0.00000000060, 2.25046596710, 8635.94200376320},
+    {0.00000000049, 5.58163417371, 6290.18939699220},
+    {0.00000000051, 3.87240194908, 26.29831979980},
+    {0.00000000051, 4.19300909995, 7860.41939243920},
+    {0.00000000041, 3.97169191582, 10973.55568635000},
+    {0.00000000041, 3.57080919230, 7079.37385680780},
+    {0.00000000056, 2.76959005761, 90955.55169449610},
+    {0.00000000042, 1.91461189163, 7477.52286021600},
+    {0.00000000042, 0.42775891995, 10213.28554621100},
+    {0.00000000042, 1.06925480488, 709.93304855830},
+    {0.00000000038, 6.17935925345, 9917.69687450980},
+    {0.00000000050, 0.81691517401, 11506.76976979360},
+    {0.00000000053, 1.45828359397, 233141.31440436149},
+    {0.00000000038, 3.32444534628, 5643.17856367740},
+    {0.00000000047, 6.21543665927, 6681.22485339960},
+    {0.00000000037, 0.36359309980, 10177.25767953360},
+    {0.00000000045, 5.29587706357, 10575.40668294180},
+    {0.00000000034, 5.63446915337, 6525.80445396540},
+    {0.00000000034, 5.36385158519, 4933.20844033260},
+    {0.00000000035, 5.36152295839, 25158.60171976540},
+    {0.00000000042, 5.08837645072, 11015.10647733480},
+    {0.00000000042, 4.22496037505, 88860.05707098669},
+    {0.00000000039, 1.99171699618, 6284.05617105960},
+    {0.00000000029, 3.19088628170, 11926.25441366880},
+    {0.00000000029, 0.14996158324, 12168.00269657460},
+    {0.00000000030, 1.58346276808, 9779.10867612540},
+    {0.00000000026, 4.16210340581, 12569.67481833180},
+    {0.00000000036, 2.74684637873, 3738.76143010800},
+    {0.00000000026, 0.72824915320, 1589.07289528380},
+    {0.00000000031, 5.34906371821, 143571.32428481648},
+    {0.00000000025, 0.10240267494, 22483.84857449259},
+    {0.00000000030, 3.47110495524, 14945.31617355440},
+    {0.00000000026, 3.89359701125, 5753.38488489680},
+    {0.00000000024, 1.18744224678, 4535.05943692440},
+    {0.00000000033, 2.99317143244, 3930.20969621960},
+    {0.00000000024, 1.57253767584, 6496.37494542940},
+    {0.00000000024, 3.47434797542, 4136.91043351620},
+    {0.00000000022, 3.91230073719, 6275.96230299060},
+    {0.00000000025, 4.02978941287, 3128.38876509580},
+    {0.00000000023, 1.07724492065, 12721.57209941700},
+    {0.00000000021, 1.89591807148, 16730.46368959580},
+    {0.00000000025, 2.42198937013, 5729.50644714900},
+    {0.00000000020, 1.78163489101, 17789.84561978500},
+    {0.00000000021, 0.49258939822, 29088.81141598500},
+    {0.00000000026, 4.14947806747, 2388.89402044920},
+    {0.00000000027, 2.54785812264, 3496.03282613400},
+    {0.00000000020, 4.29944129273, 16858.48253293320},
+    {0.00000000021, 5.97796936723, 7.11354700080},
+    {0.00000000019, 0.80292033311, 16062.18452611680},
+    {0.00000000024, 4.89894141052, 17260.15465469040},
+    {0.00000000025, 1.37003752175, 6282.09552892320},
+    {0.00000000022, 4.92663152168, 18875.52586977400},
+    {0.00000000023, 5.68902059771, 16460.33352952499},
+    {0.00000000023, 3.03021283729, 66567.48586525429},
+    {0.00000000016, 3.89713736666, 5331.35744374080},
+    {0.00000000016, 5.68562539832, 12559.03815298200},
+    {0.00000000016, 3.95085099736, 3097.88382272579},
+    {0.00000000016, 3.99041783945, 6283.14316029419},
+    {0.00000000020, 6.10643919100, 167283.76158766549},
+    {0.00000000015, 4.09775914607, 11712.95531823080},
+    {0.00000000016, 5.71769940700, 17298.18232732620},
+    {0.00000000016, 3.28894009404, 5884.92684658320},
+    {0.00000000015, 4.42564243680, 13517.87010623340},
+    {0.00000000016, 4.43452080930, 6283.00853968860},
+    {0.00000000014, 1.44384279999, 4164.31198961300},
+    {0.00000000014, 4.47380919159, 11790.62908865880},
+    {0.00000000014, 4.77646531825, 7342.45778018060},
+    {0.00000000011, 2.56768522896, 5481.25491886760},
+    {0.00000000011, 1.51443332200, 16200.77272450120},
+    {0.00000000011, 0.88708889185, 21228.39202354580},
+    {0.00000000014, 4.50116508534, 640.87760738220},
+};
+
+static const struct ln_vsop earth_radius_r3[RADIUS_R3] = {
+    {0.00000144595, 4.27319433901, 6283.07584999140},
+    {0.00000006729, 3.91706261708, 12566.15169998280},
+    {0.00000000774, 0.00000000000, 0.00000000000},
+    {0.00000000247, 3.73021571217, 18849.22754997420},
+    {0.00000000036, 2.80081409050, 6286.59896834040},
+    {0.00000000033, 5.62990083112, 6127.65545055720},
+    {0.00000000018, 3.72826142555, 6438.49624942560},
+    {0.00000000016, 4.26011484232, 6525.80445396540},
+    {0.00000000014, 3.47817116396, 6256.77753019160},
+    {0.00000000012, 3.55747379482, 25132.30339996560},
+    {0.00000000010, 4.43995693209, 4705.73230754360},
+    {0.00000000010, 4.28045255470, 83996.84731811189},
+    {0.00000000009, 5.36457057335, 6040.34724601740},
+    {0.00000000008, 1.78458957263, 5507.55323866740},
+    {0.00000000009, 0.47275199930, 6279.55273164240},
+    {0.00000000009, 1.34741231639, 6309.37416979120},
+    {0.00000000009, 0.77092900708, 5729.50644714900},
+    {0.00000000007, 3.50146897332, 7058.59846131540},
+    {0.00000000005, 2.89071061700, 775.52261132400},
+    {0.00000000006, 2.36514111314, 6836.64525283380},
+};
+
+static const struct ln_vsop earth_radius_r4[RADIUS_R4] = {
+    {0.00000003858, 2.56389016346, 6283.07584999140},
+    {0.00000000306, 2.26911740541, 12566.15169998280},
+    {0.00000000053, 3.44031471924, 5573.14280143310},
+    {0.00000000015, 2.03136359366, 18849.22754997420},
+    {0.00000000013, 2.05688873673, 77713.77146812050},
+    {0.00000000007, 4.41218854480, 161000.68573767410},
+    {0.00000000004, 5.33854414781, 6438.49624942560},
+    {0.00000000006, 3.81514213664, 149854.40013480789},
+    {0.00000000004, 4.26602478239, 6127.65545055720},
+};
+
+static const struct ln_vsop earth_radius_r5[RADIUS_R5] = {
+    {0.00000000086, 1.21805304895, 6283.07584999140},
+    {0.00000000012, 0.65572878044, 12566.15169998280},
+};
+
+
+/* Use in earth-sun function */
+double ln_calc_series(const struct ln_vsop *data, int terms, double t)
+{
+    double value = 0;
+    int i;
+
+    for (i = 0; i < terms; i++) {
+	value += data->A * cos(data->B + data->C * t);
+	data++;
+    }
+
+    return value;
+}
+
+/* Get Julian day from Gregorian year, month and day */
+double julian_int(int year, int month, int day)
+{
+    int a, b;
+
+    if (month < 3) {
+	year--;
+	month += 12;
+    }
+
+    /* check for Julian or Gregorian calendar (starts Oct 4th 1582) */
+    b = 0;
+    if (year > 1582 ||
+	(year == 1582 && (month > 10 || (month == 10 && day >= 4)))) {
+	a = year / 100;
+	b = 2 - a + (a / 4);
+    }
+
+    return ((int)(365.25 * (year + 4716)) + (int)(30.6001 * (month + 1)) +
+	    day + b - 1524.5);
+}
+
+/* Get Julian day form Gregorian string yyyy-mm-dd */
+double julian_char(char date[])
+{
+    int day, month, year;
+
+    year = atoi(date);
+    month = atoi(date + 5);
+    day = atoi(date + 8);
+
+    return julian_int(year, month, day);
+}
+
+/* Earth-Sun distance in astronomical units */
+double earth_sun(char *date)
+{
+    double t;
+    double R0, R1, R2, R3, R4, R5;
+
+    t = (julian_char(date) - 2451545.0) / 365250.0;
+
+    R0 = ln_calc_series(earth_radius_r0, RADIUS_R0, t);
+    R1 = ln_calc_series(earth_radius_r1, RADIUS_R1, t);
+    R2 = ln_calc_series(earth_radius_r2, RADIUS_R2, t);
+    R3 = ln_calc_series(earth_radius_r3, RADIUS_R3, t);
+    R4 = ln_calc_series(earth_radius_r4, RADIUS_R4, t);
+    R5 = ln_calc_series(earth_radius_r5, RADIUS_R5, t);
+
+    return (R0 + R1 * t + R2 * t * t + R3 * t * t * t + R4 * t * t * t * t +
+	    R5 * t * t * t * t * t);
+}
diff --git a/imagery/i.landsat.toar/earth_sun.h b/imagery/i.landsat.toar/earth_sun.h
new file mode 100644
index 0000000..d3df93e
--- /dev/null
+++ b/imagery/i.landsat.toar/earth_sun.h
@@ -0,0 +1,25 @@
+/*
+ *  Modified from LIBNOVA-0.12: see earth-sun.c
+ *
+ *  Copyright (C) 2000 - 2005 Liam Girdwood
+ *  Modified to GRASS (C) 2006 E. Jorge Tizado
+ */
+
+#ifndef _EARTH_SUN_H
+#define _EARTH_SUN_H
+
+struct ln_vsop
+{
+    double A;
+    double B;
+    double C;
+};
+
+/* Local prototypes */
+
+double ln_calc_series(const struct ln_vsop *data, int terms, double t);
+double julian_int(int year, int month, int day);
+double julian_char(char date[]);
+double earth_sun(char date[]);
+
+#endif
diff --git a/imagery/i.landsat.toar/landsat.c b/imagery/i.landsat.toar/landsat.c
new file mode 100644
index 0000000..219394a
--- /dev/null
+++ b/imagery/i.landsat.toar/landsat.c
@@ -0,0 +1,168 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <grass/gis.h>
+
+#include "landsat.h"
+
+#define PI  M_PI
+#define R2D 180./M_PI
+#define D2R M_PI/180.
+
+/****************************************************************************
+ * PURPOSE: Calibrated Digital Number to at-satellite Radiance
+ *****************************************************************************/
+double lsat_qcal2rad(double qcal, band_data * band)
+{
+    return (double)(qcal * band->gain + band->bias);
+}
+
+/****************************************************************************
+ * PURPOSE: Radiance of non-thermal band to at-satellite Reflectance
+ *****************************************************************************/
+double lsat_rad2ref(double rad, band_data * band)
+{
+    return (double)(rad / band->K1);
+}
+
+/****************************************************************************
+ * PURPOSE: Radiance of thermal band to at-satellite Temperature
+ *****************************************************************************/
+double lsat_rad2temp(double rad, band_data * band)
+{
+    return (double)(band->K2 / log((band->K1 / rad) + 1.0));
+}
+
+/****************************************************************************
+ * PURPOSE: Some band constants
+ *
+ *      zenith = 90 - sun_elevation
+ *      sin( sun_elevation ) = cos( sun_zenith )
+ *
+ *      lsat : satellite data
+ *         i : band number
+ *    method : level of atmospheric correction
+ *   percent : percent of solar irradiance in path radiance
+ *       dos : digital number of dark object for DOS
+  *****************************************************************************/
+
+#define abs(x)	(((x)>0)?(x):(-x))
+
+void lsat_bandctes(lsat_data * lsat, int i, char method,
+		   double percent, int dos, double rayleigh)
+{
+    double pi_d2, sin_e, cos_v, rad_sun;
+
+    /* TAUv  = at. transmittance surface-sensor */
+    /* TAUz  = at. transmittance sun-surface    */
+    /* Edown = diffuse sky spectral irradiance  */
+    double TAUv, TAUz, Edown;
+
+    pi_d2 = (double)(PI * lsat->dist_es * lsat->dist_es);
+    sin_e = (double)(sin(D2R * lsat->sun_elev));
+    cos_v = (double)(cos(D2R * (lsat->number < 4 ? 9.2 : 8.2)));
+
+    /** Global irradiance on the sensor.
+	Radiance to reflectance coefficient, only NO thermal bands.
+	K1 and K2 variables are also utilized as thermal constants
+    */
+    if (lsat->band[i].thermal == 0) {
+	switch (method) {
+	case DOS2:
+	    {
+		TAUv = 1.;
+		TAUz = (lsat->band[i].wavemax < 1.) ? sin_e : 1.;
+		Edown = 0.;
+		break;
+	    }
+	case DOS2b:
+	    {
+		TAUv = (lsat->band[i].wavemax < 1.) ? cos_v : 1.;
+		TAUz = (lsat->band[i].wavemax < 1.) ? sin_e : 1.;
+		Edown = 0.;
+		break;
+	    }
+	case DOS3:
+	    {
+		double t;
+
+		t = 2. / (lsat->band[i].wavemax + lsat->band[i].wavemin);
+		t = 0.008569 * t * t * t * t * (1 + 0.0113 * t * t +
+						0.000013 * t * t * t * t);
+		TAUv = exp(-t / cos_v);
+		TAUz = exp(-t / sin_e);
+		Edown = rayleigh;
+		break;
+	    }
+	case DOS4:
+	    {
+		double Ro =
+		    (lsat->band[i].lmax - lsat->band[i].lmin) * (dos -
+								 lsat->band
+								 [i].qcalmin)
+		    / (lsat->band[i].qcalmax - lsat->band[i].qcalmin) +
+		    lsat->band[i].lmin;
+		double Tv = 1.;
+		double Tz = 1.;
+		double Lp = 0.;
+
+		do {
+		    TAUz = Tz;
+		    TAUv = Tv;
+		    Lp = Ro -
+			percent * TAUv * (lsat->band[i].esun * sin_e * TAUz +
+					  PI * Lp) / pi_d2;
+		    Tz = 1 - (4 * pi_d2 * Lp) / (lsat->band[i].esun * sin_e);
+		    Tv = exp(sin_e * log(Tz) / cos_v);
+		    /* G_message("TAUv = %.5f (%.5f), TAUz = %.5f (%.5f) and Edown = %.5f\n", TAUv, Tv, TAUz, Tz, PI * Lp ); */
+		    /* } while( abs(TAUv - Tv) > 0.0000001 || abs(TAUz - Tz) > 0.0000001); */
+		} while (TAUv != Tv && TAUz != Tz);
+		TAUz = (Tz < 1. ? Tz : 1.);
+		TAUv = (Tv < 1. ? Tv : 1.);
+		Edown = (Lp < 0. ? 0. : PI * Lp);
+		break;
+	    }
+	default:		/* DOS1 and Without atmospheric-correction */
+	    TAUv = 1.;
+	    TAUz = 1.;
+	    Edown = 0.;
+	    break;
+	}
+	rad_sun = TAUv * (lsat->band[i].esun * sin_e * TAUz + Edown) / pi_d2;
+	if (method > DOS)
+	    G_verbose_message("... TAUv = %.5f, TAUz = %.5f, Edown = %.5f\n",
+			      TAUv, TAUz, Edown);
+
+	lsat->band[i].K1 = rad_sun;
+	lsat->band[i].K2 = 0.;
+    }
+
+    /** Digital number to radiance coefficients.
+	Without atmospheric calibration for thermal bands.
+    */
+    lsat->band[i].gain = ((lsat->band[i].lmax - lsat->band[i].lmin) /
+			  (lsat->band[i].qcalmax - lsat->band[i].qcalmin));
+
+    if (method == UNCORRECTED || lsat->band[i].thermal) {
+	/* L = G * (DN - Qmin) + Lmin
+	   -> bias = Lmin - G * Qmin    */
+	lsat->band[i].bias =
+	    (lsat->band[i].lmin - lsat->band[i].gain * lsat->band[i].qcalmin);
+    }
+    else {
+	if (method == CORRECTED) {
+	    /* L = G * (DN - Qmin) + Lmin - Lmin
+	       -> bias = - G * Qmin */
+	    lsat->band[i].bias =
+		-(lsat->band[i].gain * lsat->band[i].qcalmin);
+	    /* Another possibility is cut when rad < 0 */
+	}
+	else if (method > DOS) {
+	    /* L = Lsat - Lpath =
+	       G * DNsat + B - (G * dark + B - p * rad_sun) =
+	       G * DNsat - G * dark + p * rad_sun
+	       -> bias = p * rad_sun - G * dark */
+	    lsat->band[i].bias = percent * rad_sun - lsat->band[i].gain * dos;
+	}
+    }
+}
diff --git a/imagery/i.landsat.toar/landsat.h b/imagery/i.landsat.toar/landsat.h
new file mode 100644
index 0000000..d1f16be
--- /dev/null
+++ b/imagery/i.landsat.toar/landsat.h
@@ -0,0 +1,73 @@
+#ifndef _LANDSAT_H
+#define _LANDSAT_H
+
+#define UNCORRECTED     0
+#define CORRECTED       1
+
+#define DOS      		10
+#define DOS1			12
+#define DOS2			14
+#define DOS2b			15
+#define DOS3			16
+#define DOS4			18
+
+#define NOMETADATAFILE  0
+#define METADATAFILE    1
+
+/*****************************************************
+ * Landsat Structures
+ *
+ * Lmax and Lmin in  W / (m^2 * sr * µm) -> Radiance
+ * Esun in  W / (m^2 * µm)               -> Irradiance
+ ****************************************************/
+
+#define MAX_BANDS   11
+
+typedef struct
+{
+    int number;			/* Band number                   */
+    int code;			/* Band code                     */
+
+    double wavemax, wavemin;	/* Wavelength in µm              */
+
+    double esun;		/* Mean solar irradiance         */
+    double lmax, lmin;		/* Spectral radiance             */
+    double qcalmax, qcalmin;	/* Quantized calibrated pixel    */
+
+    char thermal;		/* Flag to thermal band          */
+    double gain, bias;		/* Gain and Bias of sensor       */
+    double K1, K2;		/* Thermal calibration or
+				   Rad2Ref constants             */
+
+} band_data;
+
+typedef struct
+{
+    int flag;
+    unsigned char number;	/* Landsat number                */
+
+    char creation[11];		/* Image production date         */
+    char date[11];		/* Image acquisition date        */
+
+    double dist_es;		/* Distance Earth-Sun            */
+    double sun_elev;		/* Sun elevation                 */
+    double sun_az;		/* Sun Azimuth                   */
+    double time;		/* Image Acquisition Time        */
+
+    char sensor[10];		/* Type of sensor: MSS, TM, ETM+, OLI/TIRS */
+    int bands;			/* Total number of bands         */
+    band_data band[MAX_BANDS];	/* Data for each band            */
+} lsat_data;
+
+
+/*****************************************************************************
+ * Landsat Equations Prototypes
+ *****************************************************************************/
+
+double lsat_qcal2rad(double, band_data *);
+double lsat_rad2ref(double, band_data *);
+double lsat_rad2temp(double, band_data *);
+
+void lsat_bandctes(lsat_data *, int, char, double, int, double);
+
+#endif
diff --git a/imagery/i.landsat.toar/landsat_met.c b/imagery/i.landsat.toar/landsat_met.c
new file mode 100644
index 0000000..1920de9
--- /dev/null
+++ b/imagery/i.landsat.toar/landsat_met.c
@@ -0,0 +1,379 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+#include "earth_sun.h"
+
+#define PI  M_PI
+#define D2R M_PI/180.
+
+#define MAX_STR         127
+#define METADATA_SIZE   65535	/* MTL.txt file size  65535 bytes */
+#define TM5_MET_SIZE    28700	/* .met file size 28686 bytes */
+
+
+inline void chrncpy(char *dest, char src[], int n)
+{
+    int i;
+
+    for (i = 0; i < n && src[i] != '\0' && src[i] != '\"'; i++)
+	dest[i] = src[i];
+    dest[i] = '\0';
+}
+
+void get_metformat(const char metadata[], char *key, char value[])
+{
+    int i = 0;
+    char *ptrmet = strstr(metadata, key);
+    char *ptr;
+
+    if (ptrmet != NULL) {
+	ptr = strstr(ptrmet, " VALUE ");
+	if (ptr != NULL) {
+	    while (*ptr++ != '=') ;
+	    while (*ptr <= ' ')
+		*ptr++;
+	    if (*ptr == '\"')
+		*ptr++;
+	    while (i < MAX_STR && *ptr != '\"' && *ptr >= ' ')
+		value[i++] = *ptr++;
+	}
+    }
+    value[i] = '\0';
+}
+
+void get_mtlformat(const char metadata[], char *key, char value[])
+{
+    int i = 0;
+    char *ptr = strstr(metadata, key);
+
+    if (ptr != NULL) {
+	while (*ptr++ != '=') ;
+	while (*ptr <= ' ')
+	    *ptr++;
+	if (*ptr == '\"')
+	    *ptr++;
+	while (i < MAX_STR && *ptr != '\"' && *ptr > ' ')
+	    value[i++] = *ptr++;
+    }
+    value[i] = '\0';
+}
+
+
+/****************************************************************************
+ * PURPOSE:     Read parameters from Landsat metadata files
+ *****************************************************************************/
+
+void lsat_metadata(char *metafile, lsat_data * lsat)
+{
+    FILE *f;
+    char mtldata[METADATA_SIZE];
+    char key[MAX_STR], value[MAX_STR];
+    void (*get_mtldata) (const char[], char *, char[]);
+    int i, j, ver_mtl;
+
+    if ((f = fopen(metafile, "r")) == NULL)
+	G_fatal_error(_("Metadata file <%s> not found"), metafile);
+
+    i = fread(mtldata, METADATA_SIZE, 1, f);
+
+    /* get version of the metadata file */
+    get_mtldata =
+	(strstr(mtldata, " VALUE ") != NULL) ? get_metformat : get_mtlformat;
+    ver_mtl = (strstr(mtldata, "QCALMAX_BAND") != NULL) ? 0 : 1;
+
+    /* Fill with product metadata */
+    get_mtldata(mtldata, "SPACECRAFT_ID", value);
+    if (value[0] == '\0') {
+	get_mtldata(mtldata, "PLATFORMSHORTNAME", value);
+    }
+
+    i = 0;
+    while (value[i] && (value[i] < '0' || value[i] > '9'))
+	i++;
+    lsat->number = atoi(value + i);
+
+    get_mtldata(mtldata, "SENSOR_ID", value);
+    if (value[0] == '\0') {
+	get_mtldata(mtldata, "SENSORSHORTNAME", value);
+    }
+    chrncpy(lsat->sensor, value, 8);
+
+    get_mtldata(mtldata, "DATE_ACQUIRED", value);
+    if (value[0] == '\0') {
+	get_mtldata(mtldata, "ACQUISITION_DATE", value);
+	if (value[0] == '\0') {
+	    get_mtldata(mtldata, "CALENDARDATE", value);
+	}
+    }
+    if (value[0] != '\0')
+	chrncpy(lsat->date, value, 10);
+    else
+	G_warning("Using adquisition date from the command line 'date'");
+
+    get_mtldata(mtldata, "FILE_DATE", value);
+    if (value[0] == '\0') {
+	get_mtldata(mtldata, "CREATION_TIME", value);
+	if (value[0] == '\0') {
+	    get_mtldata(mtldata, "PRODUCTIONDATETIME", value);
+	}
+    }
+    if (value[0] != '\0')
+	chrncpy(lsat->creation, value, 10);
+    else
+	G_warning
+	    ("Using production date from the command line 'product_date'");
+
+    get_mtldata(mtldata, "SUN_AZIMUTH", value);
+    lsat->sun_az = atof(value);
+    if (lsat->sun_az == 0.)
+        G_warning("Sun azimuth is %f", lsat->sun_az);
+
+    get_mtldata(mtldata, "SUN_ELEVATION", value);
+    if (value[0] == '\0') {
+	get_mtldata(mtldata, "SolarElevation", value);
+    }
+    lsat->sun_elev = atof(value);
+    if (lsat->sun_elev == 0.)
+	G_warning("Sun elevation is %f", lsat->sun_elev);
+
+    get_mtldata(mtldata, "SCENE_CENTER_TIME", value);
+    if (value[0] == '\0') {
+        get_mtldata(mtldata, "SCENE_CENTER_SCAN_TIME", value);
+    }
+    /* Remove trailing 'z'*/
+    value[strlen(value) - 1]='\0';
+    /* Cast from hh:mm:ss into hh.hhh*/
+    G_llres_scan(value, &lsat->time);
+    if (lsat->time == 0.)
+        G_warning("Time is %f", lsat->time);
+
+    /* Fill the data with the basic/default sensor parameters */
+    switch (lsat->number) {
+    case 1:
+	set_MSS1(lsat);
+	break;
+    case 2:
+	set_MSS2(lsat);
+	break;
+    case 3:
+	set_MSS3(lsat);
+	break;
+    case 4:
+	if (lsat->sensor[0] == 'M')
+	    set_MSS4(lsat);
+	else
+	    set_TM4(lsat);
+	break;
+    case 5:
+	if (lsat->sensor[0] == 'M')
+	    set_MSS5(lsat);
+	else
+	    set_TM5(lsat);
+	break;
+    case 7:
+	{
+	    char *fmt_gain[] = { "BAND%d_GAIN%d", " GAIN_BAND_%d_VCID_%d" };
+	    for (i = 1, j = 0; i < 9; i++) {
+		sprintf(key, fmt_gain[ver_mtl], i, 1);
+		if (i != 6)
+		    key[ver_mtl == 0 ? 10 : 12] = '\0';
+		get_mtldata(mtldata, key, value + j++);
+		if (i == 6) {
+		    sprintf(key, fmt_gain[ver_mtl], i, 2);
+		    get_mtldata(mtldata, key, value + j++);
+		}
+	    }
+	    value[j] = '\0';
+	    G_debug(1, "ETM+ gain = [%s]", value);
+	    set_ETM(lsat, value);
+	    break;
+	}
+    case 8:
+	set_LDCM(lsat);
+	break;
+
+    default:
+	G_warning("Unable to recognize satellite platform [%d]",
+		  lsat->number);
+	break;
+    }
+
+    /* Update the information from metadata file, if infile */
+    if (get_mtldata == get_mtlformat) {
+	if (ver_mtl == 0) {	/* now MTLold.txt */
+	    G_verbose_message("Metada file is MTL file: old format");
+	    for (i = 0; i < lsat->bands; i++) {
+		sprintf(key, "LMAX_BAND%d", lsat->band[i].code);
+		get_mtldata(mtldata, key, value);
+		lsat->band[i].lmax = atof(value);
+		sprintf(key, "LMIN_BAND%d", lsat->band[i].code);
+		get_mtldata(mtldata, key, value);
+		lsat->band[i].lmin = atof(value);
+		sprintf(key, "QCALMAX_BAND%d", lsat->band[i].code);
+		get_mtldata(mtldata, key, value);
+		lsat->band[i].qcalmax = atof(value);
+		sprintf(key, "QCALMIN_BAND%d", lsat->band[i].code);
+		get_mtldata(mtldata, key, value);
+		lsat->band[i].qcalmin = atof(value);
+	    }
+	}
+	else {			/* now MTL.txt */
+
+	    G_verbose_message("Metada file is MTL file: new format");
+	    if (strstr(mtldata, "RADIANCE_MAXIMUM_BAND") != NULL) {
+		G_verbose_message
+		    ("RADIANCE & QUANTIZE from data of the metadata file");
+		for (i = 0; i < lsat->bands; i++) {
+		    if (lsat->band[i].thermal && lsat->number == 7) {
+			sprintf(key, "RADIANCE_MAXIMUM_BAND_6_VCID_%d",
+				lsat->band[i].code - 60);
+			get_mtldata(mtldata, key, value);
+			lsat->band[i].lmax = atof(value);
+			sprintf(key, "RADIANCE_MINIMUM_BAND_6_VCID_%d",
+				lsat->band[i].code - 60);
+			get_mtldata(mtldata, key, value);
+			lsat->band[i].lmin = atof(value);
+			sprintf(key, "QUANTIZE_CAL_MAX_BAND_6_VCID_%d",
+				lsat->band[i].code - 60);
+			get_mtldata(mtldata, key, value);
+			lsat->band[i].qcalmax = atof(value);
+			sprintf(key, "QUANTIZE_CAL_MIN_BAND_6_VCID_%d",
+				lsat->band[i].code - 60);
+			get_mtldata(mtldata, key, value);
+			lsat->band[i].qcalmin = atof(value);
+		    }
+		    else {
+			sprintf(key, "RADIANCE_MAXIMUM_BAND_%d",
+				lsat->band[i].code);
+			get_mtldata(mtldata, key, value);
+			lsat->band[i].lmax = atof(value);
+			sprintf(key, "RADIANCE_MINIMUM_BAND_%d",
+				lsat->band[i].code);
+			get_mtldata(mtldata, key, value);
+			lsat->band[i].lmin = atof(value);
+			sprintf(key, "QUANTIZE_CAL_MAX_BAND_%d",
+				lsat->band[i].code);
+			get_mtldata(mtldata, key, value);
+			lsat->band[i].qcalmax = atof(value);
+			sprintf(key, "QUANTIZE_CAL_MIN_BAND_%d",
+				lsat->band[i].code);
+			get_mtldata(mtldata, key, value);
+			lsat->band[i].qcalmin = atof(value);
+		    }
+		}
+	    }
+	    else {
+		G_verbose_message
+		    ("RADIANCE & QUANTIZE from radiometric rescaling group of the metadata file");
+		/* from LDCM sample file: mode = 0; from LDCM-DFCB-004.pdf file: mode = 1 */
+		int mode =
+		    (strstr(mtldata, "RADIANCE_MULTIPLICATIVE_FACTOR_BAND") !=
+		     NULL) ? 0 : 1;
+		char *fmt_radmu[] =
+		    { "RADIANCE_MULTIPLICATIVE_FACTOR_BAND%d",
+	"RADIANCE_MULT_BAND_%d" };
+		char *fmt_radad[] =
+		    { "RADIANCE_ADDITIVE_FACTOR_BAND%d",
+	"RADIANCE_ADD_BAND_%d" };
+		char *fmt_k1cte[] =
+		    { "K1_CONSTANT_BAND%d", "K1_CONSTANT_BAND_%d" };
+		char *fmt_k2cte[] =
+		    { "K2_CONSTANT_BAND%d", "K2_CONSTANT_BAND_%d" };
+		char *fmt_refad[] =
+		    { "REFLECTANCE_ADDITIVE_FACTOR_BAND%d",
+	"REFLECTANCE_ADD_BAND_%d" };
+
+		for (i = 0; i < lsat->bands; i++) {
+		    sprintf(key, fmt_radmu[mode], lsat->band[i].code);
+		    get_mtldata(mtldata, key, value);
+		    lsat->band[i].gain = atof(value);
+		    sprintf(key, fmt_radad[mode], lsat->band[i].code);
+		    get_mtldata(mtldata, key, value);
+		    lsat->band[i].bias = atof(value);
+		    /* reverse to calculate the original values */
+		    lsat->band[i].qcalmax =
+			(lsat->number < 8 ? 255. : 65535.);
+		    lsat->band[i].qcalmin = 1.;
+		    lsat->band[i].lmin =
+			lsat->band[i].gain * lsat->band[i].qcalmin +
+			lsat->band[i].bias;
+		    lsat->band[i].lmax =
+			lsat->band[i].gain * lsat->band[i].qcalmax +
+			lsat->band[i].bias;
+		    /* ----- */
+		    if (lsat->number == 8) {
+			if (lsat->band[i].thermal) {
+			    sprintf(key, fmt_k1cte[mode], lsat->band[i].code);
+			    get_mtldata(mtldata, key, value);
+			    lsat->band[i].K1 = atof(value);
+			    sprintf(key, fmt_k2cte[mode], lsat->band[i].code);
+			    get_mtldata(mtldata, key, value);
+			    lsat->band[i].K2 = atof(value);
+			}
+			else {
+			    lsat->band[i].K1 = 0.;
+			    /* ESUN from metadafa file: bias/K2 seem better than gain/K1 */
+			    sprintf(key, fmt_refad[mode], lsat->band[i].code);
+			    get_mtldata(mtldata, key, value);
+			    lsat->band[i].K2 = atof(value);
+			    lsat->band[i].esun =
+				(double)(PI * lsat->dist_es * lsat->dist_es *
+					 lsat->band[i].bias) / (sin(D2R *
+								    lsat->
+								    sun_elev)
+								*
+								lsat->band[i].
+								K2);
+			}
+		    }
+		}
+	    }
+	    /* Other possible values in file */
+	    get_mtldata(mtldata, "EARTH_SUN_DISTANCE", value);
+	    if (value[0] != '\0') {
+		lsat->dist_es = atof(value);
+		G_verbose_message
+		    ("ESUN evaluate from REFLECTANCE_ADDITIVE_FACTOR_BAND of the metadata file");
+	    }
+	}
+    }
+    else {
+	G_verbose_message("Metada file is MET file");
+	G_verbose_message
+	    ("RADIANCE & QUANTIZE from band setting of the metadata file");
+	for (i = 0; i < lsat->bands; i++) {
+	    sprintf(key, "Band%dGainSetting", lsat->band[i].code);
+	    get_mtldata(mtldata, key, value);
+	    if (value[0] == '\0') {
+		G_warning(key);
+		continue;
+	    }
+	    lsat->band[i].gain = atof(value);
+	    sprintf(key, "Band%dBiasSetting", lsat->band[i].code);
+	    get_mtldata(mtldata, key, value);
+	    if (value[0] == '\0') {
+		G_warning(key);
+		continue;
+	    }
+	    lsat->band[i].bias = atof(value);
+
+	    lsat->band[i].qcalmax = 255.;
+	    lsat->band[i].qcalmin = 1.;
+	    lsat->band[i].lmin =
+		lsat->band[i].gain * lsat->band[i].qcalmin +
+		lsat->band[i].bias;
+	    lsat->band[i].lmax =
+		lsat->band[i].gain * lsat->band[i].qcalmax +
+		lsat->band[i].bias;
+	}
+    }
+
+    (void)fclose(f);
+    return;
+}
diff --git a/imagery/i.landsat.toar/landsat_set.c b/imagery/i.landsat.toar/landsat_set.c
new file mode 100644
index 0000000..ea64531
--- /dev/null
+++ b/imagery/i.landsat.toar/landsat_set.c
@@ -0,0 +1,593 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+#include "earth_sun.h"
+
+void sensor_MSS(lsat_data * lsat)
+{
+    int i;
+
+    /* green, red, near infrared, near infrared */
+    int band[] = { 1, 2, 3, 4 };
+    int code[] = { 4, 5, 6, 7 };	/* corrected for MSS4 and MSS5 to 1,2,3,4 */
+    double wmin[] = { 0.5, 0.6, 0.7, 0.8 };
+    double wmax[] = { 0.6, 0.7, 0.8, 1.1 };
+    /* original: 79x57, now all 60 m */
+
+    strcpy(lsat->sensor, "MSS");
+
+    lsat->bands = 4;
+    for (i = 0; i < lsat->bands; i++) {
+	lsat->band[i].number = *(band + i);
+	lsat->band[i].code = *(code + i);
+	lsat->band[i].wavemax = *(wmax + i);
+	lsat->band[i].wavemin = *(wmin + i);
+	lsat->band[i].qcalmax = 255.;
+	lsat->band[i].qcalmin = 0.;
+	lsat->band[i].thermal = 0;
+    }
+    return;
+}
+
+void sensor_TM(lsat_data * lsat)
+{
+    int i;
+
+    /* blue, green red, near infrared, shortwave IR, thermal IR, shortwave IR */
+    int band[] = { 1, 2, 3, 4, 5, 6, 7 };
+    double wmin[] = { 0.45, 0.52, 0.63, 0.76, 1.55, 10.40, 2.08 };
+    double wmax[] = { 0.52, 0.60, 0.69, 0.90, 1.75, 12.50, 2.35 };
+    /* 30, 30, 30, 30, 30, 120 original, 60 resamples before Feb 25, 2010 and 30 after, 30 */
+
+    if (!lsat->sensor)
+	strcpy(lsat->sensor, "TM");
+
+    lsat->bands = 7;
+    for (i = 0; i < lsat->bands; i++) {
+	lsat->band[i].number = *(band + i);
+	lsat->band[i].code = *(band + i);
+	lsat->band[i].wavemax = *(wmax + i);
+	lsat->band[i].wavemin = *(wmin + i);
+	lsat->band[i].qcalmax = 255.;
+	lsat->band[i].qcalmin = 0.;	/* Modified in set_TM5 by date */
+	lsat->band[i].thermal = (lsat->band[i].number == 6 ? 1 : 0);
+    }
+    return;
+}
+
+void sensor_ETM(lsat_data * lsat)
+{
+    int i;
+
+    /* blue, green, red, near infrared, shortwave IR, thermal IR, shortwave IR, panchromatic */
+    int band[] = { 1, 2, 3, 4, 5, 6, 6, 7, 8 };
+    int code[] = { 1, 2, 3, 4, 5, 61, 62, 7, 8 };
+    double wmin[] = { 0.450, 0.525, 0.630, 0.75, 1.55, 10.40, 10.40, 2.09, 0.52 };
+    double wmax[] = { 0.515, 0.605, 0.690, 0.90, 1.75, 12.50, 12.50, 2.35, 0.90 };
+    /* 30, 30, 30, 30, 30, 60 (after Feb. 25, 2010: 30), 30, 15 */
+
+    strcpy(lsat->sensor, "ETM+");
+
+    lsat->bands = 9;
+    for (i = 0; i < lsat->bands; i++) {
+	lsat->band[i].number = *(band + i);
+	lsat->band[i].code = *(code + i);
+	lsat->band[i].wavemax = *(wmax + i);
+	lsat->band[i].wavemin = *(wmin + i);
+	lsat->band[i].qcalmax = 255.;
+	lsat->band[i].qcalmin = 1.;
+	lsat->band[i].thermal = (lsat->band[i].number == 6 ? 1 : 0);
+    }
+    return;
+}
+
+void sensor_LDCM(lsat_data * lsat)
+{
+    int i;
+
+    /* coastal aerosol, blue, green, red, near infrared, shortwave IR (SWIR) 1, SWIR 2, panchromatic,
+     * cirrus, thermal infrared (TIR) 1, TIR 2 */
+    int band[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+    int code[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
+    double wmin[] = { 0.433, 0.450, 0.525, 0.630, 0.845, 1.560, 2.100, 0.500, 1.360, 10.3, 11.5 };
+    double wmax[] = { 0.453, 0.515, 0.600, 0.680, 0.885, 1.660, 2.300, 0.680, 1.390, 11.3, 12.5 };
+    /* 30, 30, 30, 30, 30, 30, 30, 15, 30, 100, 100 */
+
+    strcpy(lsat->sensor, "OLI/TIRS");
+
+    lsat->bands = 11;
+    for (i = 0; i < lsat->bands; i++) {
+	lsat->band[i].number = *(band + i);
+	lsat->band[i].code = *(code + i);
+	lsat->band[i].wavemax = *(wmax + i);
+	lsat->band[i].wavemin = *(wmin + i);
+	lsat->band[i].qcalmax = 255.;
+	lsat->band[i].qcalmin = 1.;
+	lsat->band[i].thermal = (lsat->band[i].number > 9 ? 1 : 0);
+    }
+    return;
+}
+
+/** **********************************************
+ ** Before access to these functions ...
+ ** store previously
+ ** >>> adquisition date,
+ ** >>> creation date, and
+ ** >>> sun_elev
+ ** **********************************************/
+
+/****************************************************************************
+ * PURPOSE:     Store values of Landsat-1 MSS
+ *              July 23, 1972 to January 6, 1978
+ *****************************************************************************/
+void set_MSS1(lsat_data * lsat)
+{
+    int i, j;
+
+    /** USGS Calibration Parameter Files 2012 */
+
+    /* Spectral radiances at detector */
+    double lmax[] = { 248., 200., 176., 153. };
+    double lmin[] = { 0., 0., 0., 0. };
+
+    /* Solar exoatmospheric spectral irradiances */
+    double esun[] = { 1824., 1570., 1249., 853.4 };
+
+    lsat->number = 1;
+    sensor_MSS(lsat);
+
+    lsat->dist_es = earth_sun(lsat->date);
+
+    for (i = 0; i < lsat->bands; i++) {
+	j = lsat->band[i].number - 1;
+	lsat->band[i].esun = *(esun + j);
+	lsat->band[i].lmax = *(lmax + j);
+	lsat->band[i].lmin = *(lmin + j);
+    }
+    G_debug(1, "Landsat-1 MSS");
+    return;
+}
+
+/****************************************************************************
+ * PURPOSE:     Store values of Landsat-2 MSS
+ *              January 22, 1975 to February 5, 1982
+ *****************************************************************************/
+void set_MSS2(lsat_data * lsat)
+{
+    int i, j;
+    double julian, *lmax, *lmin;
+
+    /** USGS Calibration Parameter Files 2012 */
+
+    /* Spectral radiances at detector */
+    double Lmax[][4] = {
+	{210., 156., 140., 138.},	/* before      July 16, 1975 */
+	{263., 176., 152., 130.}	/* on or after July 16, 1975 */
+    };
+    double Lmin[][4] = {
+	{10., 7., 7., 5.},
+	{8., 6., 6., 4.}
+    };
+
+    /* Solar exoatmospheric spectral irradiances */
+    double esun[] = { 1824., 1570., 1249., 853.4 };
+
+    julian = julian_char(lsat->creation);
+    if (julian < julian_char("1975-07-16"))
+	i = 0;
+    else
+	i = 1;
+
+    lmax = Lmax[i];
+    lmin = Lmin[i];
+
+    lsat->number = 2;
+    sensor_MSS(lsat);
+
+    lsat->dist_es = earth_sun(lsat->date);
+
+    for (i = 0; i < lsat->bands; i++) {
+	j = lsat->band[i].number - 1;
+	lsat->band[i].esun = *(esun + j);
+	lsat->band[i].lmax = *(lmax + j);
+	lsat->band[i].lmin = *(lmin + j);
+    }
+    G_debug(1, "Landsat-2 MSS");
+    return;
+}
+
+/****************************************************************************
+ * PURPOSE:     Store values of Landsat-3 MSS
+ *              March 5, 1978 to March 31, 1983
+ *
+ *              tiene una banda 8 thermal
+ *****************************************************************************/
+void set_MSS3(lsat_data * lsat)
+{
+    int i, j;
+    double julian, *lmax, *lmin;
+
+    /** USGS Calibration Parameter Files 2012 */
+
+    /* Spectral radiances at detector */
+    double Lmax[][4] = {
+	{220., 175., 145., 147.},	/* before      June 1, 1978 */
+	{259., 179., 149., 128.}	/* on or after June 1, 1978 */
+    };
+    double Lmin[][4] = {
+	{4., 3., 3., 1.},
+	{4., 3., 3., 1.}
+    };
+    /* Solar exoatmospheric spectral irradiances */
+    double esun[] = { 1824., 1570., 1249., 853.4 };
+
+    julian = julian_char(lsat->creation);
+    if (julian < julian_char("1978-06-01"))
+	i = 0;
+    else
+	i = 1;
+
+    lmax = Lmax[i];
+    lmin = Lmin[i];
+
+    lsat->number = 3;
+    sensor_MSS(lsat);
+
+    lsat->dist_es = earth_sun(lsat->date);
+
+    for (i = 0; i < lsat->bands; i++) {
+	j = lsat->band[i].number - 1;
+	lsat->band[i].esun = *(esun + j);
+	lsat->band[i].lmax = *(lmax + j);
+	lsat->band[i].lmin = *(lmin + j);
+    }
+    G_debug(1, "Landsat-3 MSS");
+    return;
+}
+
+/****************************************************************************
+ * PURPOSE:     Store values of Landsat-4 MSS/TM
+ *              July 16, 1982 to June 15, 2001
+ *****************************************************************************/
+void set_MSS4(lsat_data * lsat)
+{
+    int i, j;
+    double julian, *lmax, *lmin;
+
+    /** USGS Calibration Parameter Files 2012 */
+
+    /* Spectral radiances at detector */
+    double Lmax[][4] = {
+	{250., 180., 150., 133.},	/* before      August 26, 1982 */
+	{230., 180., 130., 133.},	/* between                     */
+	{238., 164., 142., 116.}	/* on or after April 1, 1983   */
+    };
+    double Lmin[][4] = {
+	{2., 4., 4., 3.},
+	{2., 4., 4., 3.},
+	{4., 4., 5., 4.}
+    };
+
+    /* Solar exoatmospheric spectral irradiances */
+    double esun[] = { 1824., 1570., 1249., 853.4 };
+
+    julian = julian_char(lsat->creation);
+    if (julian < julian_char("1982-08-26"))
+	i = 0;
+    else if (julian < julian_char("1983-03-31"))
+	i = 1;
+    else
+	i = 2;
+
+    lmax = Lmax[i];
+    lmin = Lmin[i];
+
+    lsat->number = 4;
+    sensor_MSS(lsat);
+
+    lsat->dist_es = earth_sun(lsat->date);
+
+    for (i = 0; i < lsat->bands; i++) {
+	j = lsat->band[i].number - 1;
+	lsat->band[i].esun = *(esun + j);
+	lsat->band[i].lmax = *(lmax + j);
+	lsat->band[i].lmin = *(lmin + j);
+    }
+    G_debug(1, "Landsat-4 MSS");
+    return;
+}
+
+void set_TM4(lsat_data * lsat)
+{
+    int i, j;
+    double julian, *lmax, *lmin;
+
+    /** USGS Calibration Parameter Files 2012 */
+
+    /* Spectral radiances at detector */
+    double Lmax[][7] = {
+	{158.42, 308.17, 234.63, 224.32, 32.42, 15.64, 17.00},	/* before August 1983      */
+	{142.86, 291.25, 225.00, 214.29, 30.00, 12.40, 15.93},	/* before January 15, 1984 */
+	{171.00, 336.00, 254.00, 221.00, 31.40, 15.303, 16.60}	/* after  Jaunary 15, 1984 */
+    };
+    double Lmin[][7] = {
+	{-1.52, -2.84, -1.17, -1.51, -0.37, 2.00, -0.15},
+	{0.00, 0.00, 0.00, 0.00, 0.00, 4.84, 0.00},
+	{-1.52, -2.84, -1.17, -1.51, -0.37, 1.2378, -0.15}
+    };
+
+    /* Solar exoatmospheric spectral irradiances */
+    double esun[] = { 1957., 1825., 1557., 1033., 214.9, 0., 80.72 };
+
+    /* Thermal band calibration constants: K1 = 671.62   K2 = 1284.30 */
+
+    julian = julian_char(lsat->creation);
+    if (julian < julian_char("1983-08-01"))
+	i = 0;
+    else if (julian < julian_char("1984-01-15"))
+	i = 1;
+    else
+	i = 2;
+
+    lmax = Lmax[i];
+    lmin = Lmin[i];
+
+    lsat->number = 4;
+    sensor_TM(lsat);
+
+    lsat->dist_es = earth_sun(lsat->date);
+
+    for (i = 0; i < lsat->bands; i++) {
+	j = lsat->band[i].number - 1;
+	lsat->band[i].esun = *(esun + j);
+	lsat->band[i].lmax = *(lmax + j);
+	lsat->band[i].lmin = *(lmin + j);
+	if (lsat->band[i].thermal) {
+	    lsat->band[i].K1 = 671.62;
+	    lsat->band[i].K2 = 1284.30;
+	}
+    }
+    G_debug(1, "Landsat-4 TM");
+    return;
+}
+
+
+/****************************************************************************
+ * PURPOSE:     Store values of Landsat-5 MSS/TM
+ *              March 1, 1984 to today
+ *****************************************************************************/
+void set_MSS5(lsat_data * lsat)
+{
+    int i, j;
+    double julian, *lmax, *lmin;
+
+    /** USGS Calibration Parameter Files 2012 */
+
+    /* Spectral radiances at detector */
+    double Lmax[][4] = {
+	{240., 170., 150., 127.},	/* before   April 6, 1984    */
+	{268., 179., 159., 123.},	/* betweeen                  */
+	{268., 179., 148., 123.}	/* after    November 9, 1984 */
+    };
+    double Lmin[][4] = {
+	{4., 3., 4., 2.},
+	{3., 3., 4., 3.},
+	{3., 3., 5., 3.}
+    };
+
+    /* Solar exoatmospheric spectral irradiances */
+    double esun[] = { 1824., 1570., 1249., 853.4 };
+
+    julian = julian_char(lsat->creation);
+    if (julian < julian_char("1984-04-06"))
+	i = 0;
+    else if (julian < julian_char("1984-11-08"))
+	i = 1;
+    else
+	i = 2;
+
+    lmax = Lmax[i];
+    lmin = Lmin[i];
+
+    lsat->number = 5;
+    sensor_MSS(lsat);
+
+    lsat->dist_es = earth_sun(lsat->date);
+
+    for (i = 0; i < lsat->bands; i++) {
+	j = lsat->band[i].number - 1;
+	lsat->band[i].esun = *(esun + j);
+	lsat->band[i].lmax = *(lmax + j);
+	lsat->band[i].lmin = *(lmin + j);
+    }
+    G_debug(1, "Landsat-5 MSS");
+    return;
+}
+
+void set_TM5(lsat_data * lsat)
+{
+    int i, j;
+    double julian, *lmax, *lmin, jbuf;
+
+    /** USGS Calibration Parameter Files 2012 */
+
+    /* Spectral radiances at detector */
+    double Lmax[][7] = {
+	{152.10, 296.81, 204.30, 206.20, 27.19, 15.303, 14.38},	/* before May 4, 2003 */
+	{193.00, 365.00, 264.00, 221.00, 30.20, 15.303, 16.50},	/* after May 4, 2003 */
+	{169.00, 333.00, 264.00, 221.00, 30.20, 15.303, 16.50}	/* after April 2, 2007 */
+    };
+    double Lmin[][7] = {
+	{-1.52, -2.84, -1.17, -1.51, -0.37, 1.2378, -0.15},
+	{-1.52, -2.84, -1.17, -1.51, -0.37, 1.2378, -0.15},
+	{-1.52, -2.84, -1.17, -1.51, -0.37, 1.2378, -0.15}
+    };
+
+    /* Solar exoatmospheric spectral irradiances */
+    double esun[] = { 1957., 1826., 1554., 1036., 215.0, 0., 80.67 };
+
+    /* Thermal band calibration constants: K1 = 607.76   K2 = 1260.56 */
+
+    julian = julian_char(lsat->creation);
+    if (julian < julian_char("2003-05-04"))
+	i = 0;
+    else if (julian < julian_char("2007-04-02"))
+	i = 1;
+    else
+	i = 2;
+
+    lmax = Lmax[i];
+    lmin = Lmin[i];
+    if (i == 2) {		/* in Chander, Markham and Barsi 2007 */
+	julian = julian_char(lsat->date);	/* Yes, here acquisition date */
+	if (julian >= julian_char("1992-01-01")) {
+	    lmax[0] = 193.0;
+	    lmax[1] = 365.0;
+	}
+    }
+
+    jbuf = julian_char("2004-04-04");
+    if (julian >= jbuf && !(lsat->flag & METADATAFILE)) {
+	G_warning
+	    ("Using QCalMin=1.0 as a NLAPS product processed after 04/04/2004");
+    }
+    lsat->number = 5;
+    sensor_TM(lsat);
+
+    lsat->dist_es = earth_sun(lsat->date);
+
+    for (i = 0; i < lsat->bands; i++) {
+	if (julian >= jbuf)
+	    lsat->band[i].qcalmin = 1.;
+	j = lsat->band[i].number - 1;
+	lsat->band[i].esun = *(esun + j);
+	lsat->band[i].lmax = *(lmax + j);
+	lsat->band[i].lmin = *(lmin + j);
+	if (lsat->band[i].thermal) {
+	    lsat->band[i].K1 = 607.76;
+	    lsat->band[i].K2 = 1260.56;
+	}
+    }
+    G_debug(1, "Landsat-5 TM");
+    return;
+}
+
+
+/****************************************************************************
+ * PURPOSE:     Store values of Landsat-7 ETM+
+ *              April 15, 1999 to May 31, 2003 (SLC failure)
+ *****************************************************************************/
+void set_ETM(lsat_data * lsat, char gain[])
+{
+    int i, k, j;
+    double julian, *lmax, *lmin;
+
+    /** USGS Calibration Parameter Files 2012 */
+
+    /* Spectral radiances at detector */
+    /* - LOW GAIN - */
+    double LmaxL[][8] = {
+	{297.5, 303.4, 235.5, 235.0, 47.70, 17.04, 16.60, 244.0},	/* before      July 1, 2000 */
+	{293.7, 300.9, 234.4, 241.1, 47.57, 17.04, 16.54, 243.1}	/* on or after July 1, 2000 */
+    };
+    double LminL[][8] = {
+	{-6.2, -6.0, -4.5, -4.5, -1.0, 0.0, -0.35, -5.0},
+	{-6.2, -6.4, -5.0, -5.1, -1.0, 0.0, -0.35, -4.7}
+    };
+    /* - HIGH GAIN - */
+    double LmaxH[][8] = {
+	{194.3, 202.4, 158.6, 157.5, 31.76, 12.65, 10.932, 158.4},
+	{191.6, 196.5, 152.9, 157.4, 31.06, 12.65, 10.80, 158.3}
+    };
+    double LminH[][8] = {
+	{-6.2, -6.0, -4.5, -4.5, -1.0, 3.2, -0.35, -5.0},
+	{-6.2, -6.4, -5.0, -5.1, -1.0, 3.2, -0.35, -4.7}
+    };
+
+    /* Solar exoatmospheric spectral irradiances */
+    double esun[] = { 1969., 1840., 1551., 1044., 225.7, 0., 82.07, 1368. };
+
+    /*  Thermal band calibration constants: K1 = 666.09   K2 = 1282.71 */
+
+    julian = julian_char(lsat->creation);
+    if (julian < julian_char("2000-07-01"))
+	k = 0;
+    else
+	k = 1;
+
+    lsat->number = 7;
+    sensor_ETM(lsat);
+
+    lsat->dist_es = earth_sun(lsat->date);
+
+    for (i = 0; i < lsat->bands; i++) {
+	j = lsat->band[i].number - 1;
+	if (gain[i] == 'H' || gain[i] == 'h') {
+	    lmax = LmaxH[k];
+	    lmin = LminH[k];
+	}
+	else {
+	    lmax = LmaxL[k];
+	    lmin = LminL[k];
+	}
+	lsat->band[i].esun = *(esun + j);
+	lsat->band[i].lmax = *(lmax + j);
+	lsat->band[i].lmin = *(lmin + j);
+	if (lsat->band[i].thermal) {
+	    lsat->band[i].K1 = 666.09;
+	    lsat->band[i].K2 = 1282.71;
+	}
+    }
+    G_debug(1, "Landsat-7 ETM+");
+    return;
+}
+
+/****************************************************************************
+ * PURPOSE:     Store values of Landsat-8 OLI/TIRS
+ *              February 14, 2013
+ *****************************************************************************/
+void set_LDCM(lsat_data * lsat)
+{
+    int i, j;
+    double *lmax, *lmin;
+
+    /* Spectral radiances at detector */
+    
+    /* uncorrected values */ 
+    double Lmax[][11] = {
+	{0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}
+    };
+    double Lmin[][11] = {
+	{0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}
+    };
+    /* Solar exoatmospheric spectral irradiances */
+    /* estimates */
+    double esun[] = { 2062., 21931., 1990., 1688., 1037., 268.6, 94.6, 1892., 399.0, 0., 0. };
+
+    lmax = Lmax[0];
+    lmin = Lmin[0];
+
+    lsat->number = 8;
+    sensor_LDCM(lsat);
+
+    lsat->dist_es = earth_sun(lsat->date);
+
+    for (i = 0; i < lsat->bands; i++) {
+	j = lsat->band[i].number - 1;
+	lsat->band[i].esun = *(esun + j);
+	lsat->band[i].lmax = *(lmax + j);
+	lsat->band[i].lmin = *(lmin + j);
+	if (lsat->band[i].thermal) {
+	    lsat->band[i].K1 = (lsat->band[i].number == 10 ? 666.09 : 697.56);
+	    lsat->band[i].K2 = 1282.71;
+	}
+    }
+    G_debug(1, "Landsat-8 OLI/TIRS");
+    return;
+}
diff --git a/imagery/i.landsat.toar/local_proto.h b/imagery/i.landsat.toar/local_proto.h
new file mode 100644
index 0000000..39f4289
--- /dev/null
+++ b/imagery/i.landsat.toar/local_proto.h
@@ -0,0 +1,22 @@
+#ifndef _LOCAL_PROTO_H
+#define _LOCAL_PROTO_H
+
+#include <string.h>
+#include "landsat.h"
+
+void lsat_metadata(char *, lsat_data *);
+
+void set_MSS1(lsat_data *);
+void set_MSS2(lsat_data *);
+void set_MSS3(lsat_data *);
+void set_MSS4(lsat_data *);
+void set_MSS5(lsat_data *);
+
+void set_TM4(lsat_data *);
+void set_TM5(lsat_data *);
+
+void set_ETM(lsat_data *, char[]);
+
+void set_LDCM(lsat_data *);
+
+#endif
diff --git a/imagery/i.landsat.toar/main.c b/imagery/i.landsat.toar/main.c
new file mode 100644
index 0000000..dc90193
--- /dev/null
+++ b/imagery/i.landsat.toar/main.c
@@ -0,0 +1,632 @@
+
+/****************************************************************************
+ *
+ * MODULE:       i.landsat.toar
+ *
+ * AUTHOR(S):    E. Jorge Tizado - ej.tizado at unileon.es
+ *               Hamish Bowman (small grassification cleanups)
+ *               Yann Chemin (v7 + L5TM _MTL.txt support) [removed after update]
+ *
+ * PURPOSE:      Calculate TOA Radiance or Reflectance and Kinetic Temperature
+ *               for Landsat 1/2/3/4/5 MS, 4/5 TM, 7 ETM+, and 8 OLI/TIRS
+ *
+ * COPYRIGHT:    (C) 2006-2013 by the GRASS Development Team
+ *
+ *               This program is free software under the GNU General
+ *               Public License (>=v2). Read the file COPYING that
+ *               comes with GRASS for details.
+ *
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+
+int main(int argc, char *argv[])
+{
+    struct History history;
+    struct GModule *module;
+
+    struct Cell_head cellhd;
+    char *mapset;
+
+    void *inrast, *outrast;
+    int infd, outfd;
+    void *ptr;
+    int nrows, ncols, row, col;
+
+    RASTER_MAP_TYPE in_data_type;
+
+    struct Option *input_prefix, *output_prefix, *metfn, *sensor, *adate,
+	*pdate, *elev, *bgain, *metho, *perc, *dark, *atmo;
+    char *inputname, *met, *outputname, *sensorname;
+    struct Flag *frad, *named;
+
+    lsat_data lsat;
+    char band_in[GNAME_MAX], band_out[GNAME_MAX];
+    int i, j, q, method, pixel, dn_dark[MAX_BANDS], dn_mode[MAX_BANDS];
+    double qcal, rad, ref, percent, ref_mode, rayleigh;
+
+    struct Colors colors;
+    struct FPRange range;
+    double min, max;
+    unsigned long hist[256], h_max;
+
+    /* initialize GIS environment */
+    G_gisinit(argv[0]);
+
+    /* initialize module */
+    module = G_define_module();
+    module->description =
+	_("Calculates top-of-atmosphere radiance or reflectance and temperature for Landsat MSS/TM/ETM+.");
+    module->keywords =
+	_("imagery, landsat, top-of-atmosphere reflectance, dos-type simple atmospheric correction");
+
+    /* It defines the different parameters */
+    input_prefix = G_define_option();
+    input_prefix->key = "input_prefix";
+    input_prefix->label = _("Base name of input raster bands");
+    input_prefix->description = _("Example: 'B.' for B.1, B.2, ...");
+    input_prefix->type = TYPE_STRING;
+    input_prefix->required = YES;
+
+    output_prefix = G_define_option();
+    output_prefix->key = "output_prefix";
+    output_prefix->label = _("Prefix for output raster maps");
+    output_prefix->description =
+	_("Example: 'B.toar.' generates B.toar.1, B.toar.2, ...");
+    output_prefix->type = TYPE_STRING;
+    output_prefix->required = YES;
+
+    metfn = G_define_standard_option(G_OPT_F_INPUT);
+    metfn->key = "metfile";
+    metfn->required = NO;
+    metfn->description = _("Name of Landsat metadata file (.met or MTL.txt)");
+    metfn->guisection = _("Metadata");
+
+    sensor = G_define_option();
+    sensor->key = "sensor";
+    sensor->type = TYPE_STRING;
+    sensor->label = _("Spacecraft sensor");
+    sensor->description =
+	_("Required only if 'metfile' not given (recommended for sanity)");
+    sensor->options = "mss1,mss2,mss3,mss4,mss5,tm4,tm5,tm7,ot8";
+    sensor->descriptions =
+	_("mss1;Landsat_1 MSS;"
+	  "mss2;Landsat_2 MSS;"
+	  "mss3;Landsat_3 MSS;"
+	  "mss4;Landsat_4 MSS;"
+	  "mss5;Landsat_5 MSS;"
+	  "tm4;Landsat_4 TM;"
+	  "tm5;Landsat_5 TM;"
+          "tm7;Landsat_7 ETM+;"
+          "ot8;Landsat_8 OLI/TIRS");
+    sensor->required = NO;	/* perhaps YES for clarity */
+    sensor->guisection = _("Metadata");
+
+    metho = G_define_option();
+    metho->key = "method";
+    metho->type = TYPE_STRING;
+    metho->required = NO;
+    metho->options = "uncorrected,corrected,dos1,dos2,dos2b,dos3,dos4";
+    metho->label = _("Atmospheric correction method");
+    metho->description = _("Atmospheric correction method");
+    metho->answer = "uncorrected";
+    metho->guisection = _("Metadata");
+
+    adate = G_define_option();
+    adate->key = "date";
+    adate->type = TYPE_STRING;
+    adate->required = NO;
+    adate->key_desc = "yyyy-mm-dd";
+    adate->label = _("Image acquisition date (yyyy-mm-dd)");
+    adate->description = _("Required only if 'metfile' not given");
+    adate->guisection = _("Metadata");
+
+    elev = G_define_option();
+    elev->key = "sun_elevation";
+    elev->type = TYPE_DOUBLE;
+    elev->required = NO;
+    elev->label = _("Sun elevation in degrees");
+    elev->description = _("Required only if 'metfile' not given");
+    elev->guisection = _("Metadata");
+
+    pdate = G_define_option();
+    pdate->key = "product_date";
+    pdate->type = TYPE_STRING;
+    pdate->required = NO;
+    pdate->key_desc = "yyyy-mm-dd";
+    pdate->label = _("Image creation date (yyyy-mm-dd)");
+    pdate->description = _("Required only if 'metfile' not given");
+    pdate->guisection = _("Metadata");
+
+    bgain = G_define_option();
+    bgain->key = "gain";
+    bgain->type = TYPE_STRING;
+    bgain->required = NO;
+    bgain->label = _("Gain (H/L) of all Landsat ETM+ bands (1-5,61,62,7,8)");
+    bgain->description = _("Required only if 'metfile' not given");
+    bgain->guisection = _("Settings");
+
+    perc = G_define_option();
+    perc->key = "percent";
+    perc->type = TYPE_DOUBLE;
+    perc->required = NO;
+    perc->label = _("Percent of solar radiance in path radiance");
+    perc->description = _("Required only if 'method' is any DOS");
+    perc->answer = "0.01";
+    perc->guisection = _("Settings");
+
+    dark = G_define_option();
+    dark->key = "pixel";
+    dark->type = TYPE_INTEGER;
+    dark->required = NO;
+    dark->label =
+	_("Minimum pixels to consider digital number as dark object");
+    dark->description = _("Required only if 'method' is any DOS");
+    dark->answer = "1000";
+    dark->guisection = _("Settings");
+
+    atmo = G_define_option();
+    atmo->key = "rayleigh";
+    atmo->type = TYPE_DOUBLE;
+    atmo->required = NO;
+    atmo->label = _("Rayleigh atmosphere (diffuse sky irradiance)");	/* scattering coefficient? */
+    atmo->description = _("Required only if 'method' is DOS3");
+    atmo->answer = "0.0";
+    atmo->guisection = _("Settings");
+
+    /* define the different flags */
+    frad = G_define_flag();
+    frad->key = 'r';
+    frad->description =
+	_("Output at-sensor radiance instead of reflectance for all bands");
+
+    named = G_define_flag();
+    named->key = 'n';
+    named->description =
+	_("Input raster maps use as extension the number of the band instead the code");
+
+    /* options and afters parser */
+    if (G_parser(argc, argv))
+	exit(EXIT_FAILURE);
+
+
+    /*****************************************
+     * ---------- START --------------------
+     * Stores options and flag to variables
+     *****************************************/
+    met = metfn->answer;
+    inputname = input_prefix->answer;
+    outputname = output_prefix->answer;
+    sensorname = sensor->answer ? sensor->answer : "";
+
+    G_zero(&lsat, sizeof(lsat));
+
+    if (adate->answer != NULL) {
+	strncpy(lsat.date, adate->answer, 11);
+	lsat.date[10] = '\0';
+	if (strlen(lsat.date) != 10)
+	    G_fatal_error(_("Illegal date format: [%s] (yyyy-mm-dd)"),
+			  lsat.date);
+    }
+
+    if (pdate->answer != NULL) {
+	strncpy(lsat.creation, pdate->answer, 11);
+	lsat.creation[10] = '\0';
+	if (strlen(lsat.creation) != 10)
+	    G_fatal_error(_("Illegal date format: [%s] (yyyy-mm-dd)"),
+			  lsat.creation);
+    }
+
+    lsat.sun_elev = elev->answer == NULL ? 0. : atof(elev->answer);
+
+    percent = atof(perc->answer);
+    pixel = atoi(dark->answer);
+    rayleigh = atof(atmo->answer);
+
+    /* Data from metadata file */
+    /* Unnecessary because G_zero filled, but for sanity */
+    lsat.flag = NOMETADATAFILE;
+    if (met != NULL) {
+	lsat.flag = METADATAFILE;
+	lsat_metadata(met, &lsat);
+	G_debug(1, "lsat.number = %d, lsat.sensor = [%s]", lsat.number,
+		lsat.sensor);
+
+	if (!lsat.sensor || lsat.number > 8 || lsat.number < 1)
+	    G_fatal_error(_("Failed to identify satellite"));
+
+	G_debug(1, "Landsat-%d %s with data set in met file [%s]",
+		lsat.number, lsat.sensor, met);
+
+	/* Overwrite solar elevation of metadata file */
+	if (elev->answer != NULL)
+	    lsat.sun_elev = atof(elev->answer);
+    }
+    /* Data from date and solar elevation */
+    else if (adate->answer == NULL || elev->answer == NULL) {
+	G_fatal_error(_("Lacking '%s' and/or '%s' for this satellite"),
+		      adate->key, elev->key);
+    }
+    else {
+	/* Need gain */
+	if (strcmp(sensorname, "tm7") == 0) {
+	    if (bgain->answer == NULL || strlen(bgain->answer) != 9)
+		G_fatal_error(_("Landsat-7 requires band gain with 9 (H/L) data"));
+	    set_ETM(&lsat, bgain->answer);
+	}
+	/* Not need gain */
+	else if (strcmp(sensorname, "ot8") == 0)
+	    set_LDCM(&lsat);
+	else if (strcmp(sensorname, "tm5") == 0)
+	    set_TM5(&lsat);
+	else if (strcmp(sensorname, "tm4") == 0)
+	    set_TM4(&lsat);
+	else if (strcmp(sensorname, "mss5") == 0)
+	    set_MSS5(&lsat);
+	else if (strcmp(sensorname, "mss4") == 0)
+	    set_MSS4(&lsat);
+	else if (strcmp(sensorname, "mss3") == 0)
+	    set_MSS3(&lsat);
+	else if (strcmp(sensorname, "mss2") == 0)
+	    set_MSS2(&lsat);
+	else if (strcmp(sensorname, "mss1") == 0)
+	    set_MSS1(&lsat);
+	else
+	    G_fatal_error(_("Unknown satellite type (defined by '%s')"),
+			  sensor->key);
+    }
+
+	/*****************************************
+	* ------------ PREPARATION --------------
+	*****************************************/
+    if (strcasecmp(metho->answer, "corrected") == 0)
+	method = CORRECTED;
+    else if (strcasecmp(metho->answer, "dos1") == 0)
+	method = DOS1;
+    else if (strcasecmp(metho->answer, "dos2") == 0)
+	method = DOS2;
+    else if (strcasecmp(metho->answer, "dos2b") == 0)
+	method = DOS2b;
+    else if (strcasecmp(metho->answer, "dos3") == 0)
+	method = DOS3;
+    else if (strcasecmp(metho->answer, "dos4") == 0)
+	method = DOS4;
+    else
+	method = UNCORRECTED;
+
+    /*
+       if (metho->answer[3] == 'r')            method = CORRECTED;
+       else if (metho->answer[3] == '1')       method = DOS1;
+       else if (metho->answer[3] == '2')       method = (metho->answer[4] == '\0') ? DOS2 : DOS2b;
+       else if (metho->answer[3] == '3')       method = DOS3;
+       else if (metho->answer[3] == '4')       method = DOS4;
+       else method = UNCORRECTED;
+     */
+
+    for (i = 0; i < lsat.bands; i++) {
+	dn_mode[i] = 0;
+	dn_dark[i] = (int)lsat.band[i].qcalmin;
+	/* Calculate dark pixel */
+	if (method > DOS && !lsat.band[i].thermal) {
+	    for (j = 0; j < 256; j++)
+		hist[j] = 0L;
+
+	    sprintf(band_in, "%s%d", inputname, lsat.band[i].code);
+	    mapset = G_find_cell2(band_in, "");
+	    if (mapset == NULL) {
+		G_warning(_("Raster map <%s> not found"), band_in);
+		continue;
+	    }
+	    if ((infd = G_open_cell_old(band_in, "")) < 0)
+		G_fatal_error(_("Unable to open raster map <%s>"), band_in);
+	    if (G_get_cellhd(band_in, mapset, &cellhd) < 0)
+		G_fatal_error(_("Unable to read header of raster map <%s>"),
+			      band_in);
+	    G_set_window(&cellhd);
+
+	    in_data_type = G_raster_map_type(band_in, mapset);
+	    inrast = G_allocate_raster_buf(in_data_type);
+
+	    nrows = G_window_rows();
+	    ncols = G_window_cols();
+
+	    G_message("Calculating dark pixel of <%s>... ", band_in);
+	    for (row = 0; row < nrows; row++) {
+		G_get_raster_row(infd, inrast, row, in_data_type);
+		for (col = 0; col < ncols; col++) {
+		    switch (in_data_type) {
+		    case CELL_TYPE:
+			ptr = (void *)((CELL *) inrast + col);
+			q = (int)*((CELL *) ptr);
+			break;
+		    case FCELL_TYPE:
+			ptr = (void *)((FCELL *) inrast + col);
+			q = (int)*((FCELL *) ptr);
+			break;
+		    case DCELL_TYPE:
+			ptr = (void *)((DCELL *) inrast + col);
+			q = (int)*((DCELL *) ptr);
+			break;
+		    }
+		    if (!G_is_null_value(ptr, in_data_type) &&
+			q >= lsat.band[i].qcalmin && q < 256)
+			hist[q]++;
+		}
+	    }
+	    /* DN of dark object */
+	    for (j = lsat.band[i].qcalmin; j < 256; j++) {
+		if (hist[j] >= (unsigned int)pixel) {
+		    dn_dark[i] = j;
+		    break;
+		}
+	    }
+	    /* Mode of DN */
+	    h_max = 0L;
+	    for (j = lsat.band[i].qcalmin; j < 241; j++) {	/* Exclude ptentially saturated < 240 */
+		/* G_debug(5, "%d-%ld", j, hist[j]); */
+		if (hist[j] > h_max) {
+		    h_max = hist[j];
+		    dn_mode[i] = j;
+		}
+	    }
+	    G_verbose_message("... DN = %.2d [%lu] : mode %.2d [%lu] %s",
+			      dn_dark[i], hist[dn_dark[i]],
+			      dn_mode[i], hist[dn_mode[i]],
+			      hist[255] >
+			      hist[dn_mode[i]] ? ", excluding DN > 241" : "");
+
+	    G_free(inrast);
+	    G_close_cell(infd);
+	}
+	/* Calculate transformation constants */
+	lsat_bandctes(&lsat, i, method, percent, dn_dark[i], rayleigh);
+    }
+
+    /* unnecessary or necessary with more checking as acquisition date,...
+       if (strlen(lsat.creation) == 0)
+       G_fatal_error(_("Unknown production date (defined by '%s')"), pdate->key);
+     */
+
+    if (G_verbose() > G_verbose_std()) {
+	fprintf(stderr, " LANDSAT: %d SENSOR: %s\n", lsat.number,
+		lsat.sensor);
+	fprintf(stderr, " ACQUISITION DATE %s [production date %s]\n",
+		lsat.date, lsat.creation);
+	fprintf(stderr, "   earth-sun distance    = %.8lf\n", lsat.dist_es);
+	fprintf(stderr, "   solar elevation angle = %.8lf\n", lsat.sun_elev);
+	fprintf(stderr, "   Atmospheric correction: %s\n",
+		(method == CORRECTED ? "CORRECTED"
+		 : (method == UNCORRECTED ? "UNCORRECTED" : metho->answer)));
+	if (method > DOS) {
+	    fprintf(stderr,
+		    "   percent of solar irradiance in path radiance = %.4lf\n",
+		    percent);
+	}
+	for (i = 0; i < lsat.bands; i++) {
+	    fprintf(stderr, "-------------------\n");
+	    fprintf(stderr, " BAND %d %s(code %d)\n",
+		    lsat.band[i].number,
+		    (lsat.band[i].thermal ? "thermal " : ""),
+		    lsat.band[i].code);
+	    fprintf(stderr,
+		    "   calibrated digital number (DN): %.1lf to %.1lf\n",
+		    lsat.band[i].qcalmin, lsat.band[i].qcalmax);
+	    fprintf(stderr, "   calibration constants (L): %.3lf to %.3lf\n",
+		    lsat.band[i].lmin, lsat.band[i].lmax);
+	    fprintf(stderr, "   at-%s radiance = %.8lf * DN + %.3lf\n",
+		    (method > DOS ? "surface" : "sensor"), lsat.band[i].gain,
+		    lsat.band[i].bias);
+	    if (lsat.band[i].thermal) {
+		fprintf(stderr,
+			"   at-sensor temperature = %.5lf / log[(%.5lf / radiance) + 1.0]\n",
+			lsat.band[i].K2, lsat.band[i].K1);
+	    }
+	    else {
+		fprintf(stderr,
+			"   mean solar exoatmospheric irradiance (ESUN): %.3lf\n",
+			lsat.band[i].esun);
+		fprintf(stderr, "   at-%s reflectance = radiance / %.5lf\n",
+			(method > DOS ? "surface" : "sensor"),
+			lsat.band[i].K1);
+		if (method > DOS) {
+		    fprintf(stderr,
+			    "   the darkness DN with a least %d pixels is %d\n",
+			    pixel, dn_dark[i]);
+		    fprintf(stderr, "   the DN mode is %d\n", dn_mode[i]);
+		}
+	    }
+	}
+	fprintf(stderr, "-------------------\n");
+	fflush(stderr);
+    }
+
+    /*****************************************
+    * ------------ CALCULUS -----------------
+    *****************************************/
+
+    G_message(_("Calculating..."));
+    for (i = 0; i < lsat.bands; i++) {
+	sprintf(band_in, "%s%d", inputname,
+		(named->answer ? lsat.band[i].number : lsat.band[i].code));
+	sprintf(band_out, "%s%d", outputname, lsat.band[i].code);
+
+	mapset = G_find_cell2(band_in, "");
+	if (mapset == NULL) {
+	    G_warning(_("Raster map <%s> not found"), band_in);
+	    continue;
+	}
+
+	if ((infd = G_open_cell_old(band_in, mapset)) < 0)
+	    G_fatal_error(_("Unable to open raster map <%s>"), band_in);
+	in_data_type = G_raster_map_type(band_in, mapset);
+	if (G_get_cellhd(band_in, mapset, &cellhd) < 0)
+	    G_fatal_error(_("Unable to read header of raster map <%s>"),
+			  band_in);
+
+	/* set same size as original band raster */
+	G_set_window(&cellhd);
+
+	/* controlling, if we can write the raster */
+	if (G_legal_filename(band_out) < 0)
+	    G_fatal_error(_("<%s> is an illegal file name"), band_out);
+
+	if ((outfd = G_open_raster_new(band_out, DCELL_TYPE)) < 0)
+	    G_fatal_error(_("Unable to create raster map <%s>"), band_out);
+
+	/* Allocate input and output buffer */
+	inrast = G_allocate_raster_buf(in_data_type);
+	outrast = G_allocate_raster_buf(DCELL_TYPE);
+
+	nrows = G_window_rows();
+	ncols = G_window_cols();
+	/* ================================================================= */
+	G_important_message(_("Writing %s of <%s> to <%s>..."),
+			    (frad->answer ? _("radiance")
+			     : (lsat.
+				band[i].thermal) ? _("temperature") :
+			     _("reflectance")), band_in, band_out);
+	for (row = 0; row < nrows; row++) {
+	    G_percent(row, nrows, 2);
+
+	    G_get_raster_row(infd, inrast, row, in_data_type);
+	    for (col = 0; col < ncols; col++) {
+		switch (in_data_type) {
+		case CELL_TYPE:
+		    ptr = (void *)((CELL *) inrast + col);
+		    qcal = (double)((CELL *) inrast)[col];
+		    break;
+		case FCELL_TYPE:
+		    ptr = (void *)((FCELL *) inrast + col);
+		    qcal = (double)((FCELL *) inrast)[col];
+		    break;
+		case DCELL_TYPE:
+		    ptr = (void *)((DCELL *) inrast + col);
+		    qcal = (double)((DCELL *) inrast)[col];
+		    break;
+		}
+		if (G_is_null_value(ptr, in_data_type) ||
+		    qcal < lsat.band[i].qcalmin) {
+		    G_set_d_null_value((DCELL *) outrast + col, 1);
+		}
+		else {
+		    rad = lsat_qcal2rad(qcal, &lsat.band[i]);
+		    if (frad->answer) {
+			ref = rad;
+		    }
+		    else {
+			if (lsat.band[i].thermal) {
+			    ref = lsat_rad2temp(rad, &lsat.band[i]);
+			}
+			else {
+			    ref = lsat_rad2ref(rad, &lsat.band[i]);
+			    if (ref < 0. && method > DOS)
+				ref = 0.;
+			}
+		    }
+		    ((DCELL *) outrast)[col] = ref;
+		}
+	    }
+	    G_put_raster_row(outfd, outrast, DCELL_TYPE);
+	}
+	G_percent(1, 1, 1);
+
+	ref_mode = 0.;
+	if (method > DOS && !lsat.band[i].thermal) {
+	    ref_mode = lsat_qcal2rad(dn_mode[i], &lsat.band[i]);
+	    ref_mode = lsat_rad2ref(ref_mode, &lsat.band[i]);
+	}
+
+	/* ================================================================= */
+
+	G_free(inrast);
+	G_close_cell(infd);
+	G_free(outrast);
+	G_close_cell(outfd);
+
+	/* needed ?
+	   if (out_type != CELL_TYPE)
+	   G_quantize_fp_map_range(band_out, G_mapset(), 0., 360., 0, 360);
+	 */
+	/* set grey255 colortable */
+	G_init_colors(&colors);
+	G_read_fp_range(band_out, G_mapset(), &range);
+	G_get_fp_range_min_max(&range, &min, &max);
+	G_make_grey_scale_fp_colors(&colors, min, max);
+	G_write_colors(band_out, G_mapset(), &colors);
+
+	/* Initialize the 'hist' structure with basic info */
+	G_short_history(band_out, "raster", &history);
+	sprintf(history.edhist[0], " %s of Landsat-%d %s (method %s)",
+		(frad->
+		 answer ? "Radiance" : (lsat.band[i].
+					thermal ? "Temperature" :
+					"Reflectance")), lsat.number,
+		lsat.sensor, metho->answer);
+	sprintf(history.edhist[1],
+		"----------------------------------------------------------------");
+	sprintf(history.edhist[2],
+		" Acquisition date ...................... %s", lsat.date);
+	sprintf(history.edhist[3],
+		" Production date ....................... %s\n",
+		lsat.creation);
+	sprintf(history.edhist[4],
+		" Earth-sun distance (d) ................ %.8lf",
+		lsat.dist_es);
+	sprintf(history.edhist[5],
+		" Digital number (DN) range ............. %.0lf to %.0lf",
+		lsat.band[i].qcalmin, lsat.band[i].qcalmax);
+	sprintf(history.edhist[6],
+		" Calibration constants (Lmin to Lmax) .. %+.3lf to %+.3lf",
+		lsat.band[i].lmin, lsat.band[i].lmax);
+	sprintf(history.edhist[7],
+		" DN to Radiance (gain and bias) ........ %+.5lf and %+.5lf",
+		lsat.band[i].gain, lsat.band[i].bias);
+	if (lsat.band[i].thermal) {
+	    sprintf(history.edhist[8],
+		    " Temperature (K1 and K2) ............... %.3lf and %.3lf",
+		    lsat.band[i].K1, lsat.band[i].K2);
+	    history.edlinecnt = 9;
+	}
+	else {
+	    sprintf(history.edhist[8],
+		    " Mean solar irradiance (ESUN) .......... %.3lf",
+		    lsat.band[i].esun);
+	    sprintf(history.edhist[9],
+		    " Reflectance = Radiance divided by ..... %.5lf",
+		    lsat.band[i].K1);
+	    history.edlinecnt = 10;
+	    if (method > DOS) {
+		sprintf(history.edhist[10], " ");
+		sprintf(history.edhist[11],
+			" Dark object (%4d pixels) DN = ........ %d", pixel,
+			dn_dark[i]);
+		sprintf(history.edhist[12],
+			" Mode in reflectance histogram ......... %.5lf",
+			ref_mode);
+		history.edlinecnt = 13;
+	    }
+	}
+	sprintf(history.edhist[history.edlinecnt],
+		"-----------------------------------------------------------------");
+	history.edlinecnt++;
+
+	G_command_history(&history);
+	G_write_history(band_out, &history);
+
+	if (lsat.band[i].thermal)
+	    G_write_raster_units(band_out, "Kelvin");
+	else if (frad->answer)
+	    G_write_raster_units(band_out, "W/(m^2 sr um)");
+	else
+	    G_write_raster_units(band_out, "unitless");
+
+	/* set raster timestamp from acq date? (see r.timestamp module) */
+    }
+
+    exit(EXIT_SUCCESS);
+}
diff --git a/imagery/i.modis.qc/Makefile b/imagery/i.modis.qc/Makefile
new file mode 100644
index 0000000..6124da7
--- /dev/null
+++ b/imagery/i.modis.qc/Makefile
@@ -0,0 +1,11 @@
+MODULE_TOPDIR = ../..
+
+PGM = i.modis.qc
+
+LIBES = $(RASTERLIB) $(GISLIB)
+DEPENDENCIES = $(RASTERDEP) $(GISDEP)
+
+include $(MODULE_TOPDIR)/include/Make/Module.make
+
+
+default: cmd
diff --git a/imagery/i.modis.qc/description.html b/imagery/i.modis.qc/description.html
new file mode 100644
index 0000000..d6d577e
--- /dev/null
+++ b/imagery/i.modis.qc/description.html
@@ -0,0 +1,277 @@
+<h2>DESCRIPTION</h2>
+
+<em>i.modis.qc</em> Extracts Requested Quality Assessment flags from the
+following MODIS products: MOD09A1, MOD09Q1, and MOD11A2.
+This does include MOD09A1 QA_state_500m layer (see Notes).
+
+<pre>
+<em>MOD09A1/Q1: MODLAND QA Bits. bits=[0-1]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: Corrected product produced at ideal quality -- all bands</li>
+ <li>[01]= class 1: Corrected product produced at less than ideal quality -- some or all bands</li>
+ <li>[10]= class 2: Corrected product NOT produced due to cloud effect -- all bands</li>
+ <li>[11]= class 3: Corrected product NOT produced due to other reasons -- some or all bands maybe be fill value (Note that a value of [11] overrides a value of [01])</li>
+</ul>
+
+<pre>
+<em>MOD09Q1: Cloud State. bits=[2-3] </em>
+</pre>
+<ul>
+ <li>[00]= class 0: Clear -- No clouds</li>
+ <li>[01]= class 1: Cloudy</li>
+ <li>[10]= class 2: Mixed</li>
+ <li>[11]= class 3: Not Set ; Assumed Clear</li>
+</ul>
+
+<pre>
+<em>MOD09Q1: Band-wise Data Quality 250m bits=[4-7][8-11]</em>
+<em>MOD09A1: Band-wise Data Quality 500m bits=[2-5][6-9][10-13][14-17][18-21][22-25][26-29]</em>
+</pre>
+<ul>
+ <li>[0000]= class 0: highest quality</li>
+ <li>[0111]= class 1: noisy detector</li>
+ <li>[1000]= class 2: dead detector; data interpolated in L1B</li>
+ <li>[1001]= class 3: solar zenith ge 86 degrees</li>
+ <li>[1010]= class 4: solar zenith ge 85 and lt 86 degrees</li>
+ <li>[1011]= class 5: missing input</li>
+ <li>[1100]= class 6: internal constant used in place of climatological data for at least one atmospheric constant</li>
+ <li>[1101]= class 7: correction out of bounds, pixel constrained to extreme allowable value</li>
+ <li>[1110]= class 8: L1B data faulty</li>
+ <li>[1111]= class 9: not processed due to deep ocean or cloud</li>
+ <li>Class 10-15: Combination of bits unused</li>
+</ul>
+
+<pre>
+<em>MOD09A1/Q1: Atmospheric correction bit=[12]/[30]</em>
+</pre>
+<ul>
+ <li>[0]= class 0: Not Corrected product</li>
+ <li>[1]= class 1: Corrected product</li>
+</ul>
+
+<pre>
+<em>MOD09A1/Q1: Adjacency correction bit=[13]/[31]</em>
+</pre>
+<ul>
+ <li>[0]= class 0: Not Corrected product</li>
+ <li>[1]= class 1: Corrected product</li>
+</ul>
+
+<pre>
+<em>MOD09Q1: Different orbit from 500m product, bit=[14]</em>
+</pre>
+<ul>
+ <li>[0]= class 0: same orbit as 500m</li>
+ <li>[1]= class 1: different orbit from 500m</li>
+</ul>
+
+<pre>
+<em>MOD11A2: Mandatory QA Flags bits=[0-1]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: LST produced, good quality, not necessary to examine more detailed QA</li>
+ <li>[01]= class 1: LST produced, other quality, recommend examination of more detailed QA</li>
+ <li>[10]= class 2: LST not produced due to cloud effects</li>
+ <li>[11]= class 3: LST not produced primarily due to reasons other than cloud</li>
+</ul>
+
+<pre>
+<em>MOD11A1: Data Quality Flag bits=[2-3]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: Good data quality of L1B in bands 31 and 32</li>
+ <li>[01]= class 1: Other quality data</li>
+ <li>[10]= class 2: TBD</li>
+ <li>[11]= class 3: TBD</li>
+</ul>
+
+<pre>
+<em>MOD11A1: Emis Error Flag bits=[4-5]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: Average emissivity error le 0.01</li>
+ <li>[01]= class 1: Average emissivity error le 0.02</li>
+ <li>[10]= class 2: Average emissivity error le 0.04</li>
+ <li>[11]= class 3: Average emissivity error gt 0.04</li>
+</ul>
+
+<pre>
+<em>MOD11A1: LST Error Flag bits=[6-7]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: Average LST error le 1</li>
+ <li>[01]= class 1: Average LST error le 2</li>
+ <li>[10]= class 2: Average LST error le 3</li> 
+ <li>[11]= class 3: Average LST error gt 3</li>
+</ul>
+<pre>
+
+<em>MOD11A2: Mandatory QA Flags bits=[0-1]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: LST produced, good quality, not necessary to examine more detailed QA</li>
+ <li>[01]= class 1: LST produced, other quality, recommend examination of more detailed QA</li>
+ <li>[10]= class 2: LST not produced due to cloud effects</li>
+ <li>[11]= class 3: LST not produced primarily due to reasons other than cloud</li>
+</ul>
+
+<pre>
+<em>MOD11A2: Data Quality Flag bits=[2-3]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: Good data quality of L1B in 7 TIR bands</li>
+ <li>[01]= class 1: Other quality data</li>
+ <li>[10]= class 2: TBD</li>
+ <li>[11]= class 3: TBD</li>
+</ul>
+
+<pre>
+<em>MOD11A2: Emis Error Flag bits=[4-5]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: Average emissivity error le 0.01</li>
+ <li>[01]= class 1: Average emissivity error le 0.02</li>
+ <li>[10]= class 2: Average emissivity error le 0.04</li>
+ <li>[11]= class 3: Average emissivity error gt 0.04</li>
+</ul>
+
+<pre>
+<em>MOD11A2: LST Error Flag bits=[6-7]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: Average LST error le 1</li>
+ <li>[01]= class 1: Average LST error le 2</li>
+ <li>[10]= class 2: Average LST error le 3</li> 
+ <li>[11]= class 3: Average LST error gt 3</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: Cloud State bits=[0-1]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: clear</li>
+ <li>[01]= class 1: cloudy</li>
+ <li>[10]= class 2: mixed</li>
+ <li>[11]= class 3: not set, assumed clear</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: Cloud shadow bits=[2]</em>
+</pre>
+<ul>
+ <li>[0]= class 0: yes</li>
+ <li>[1]= class 1: no</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: Land/Water Flag bits=[3-5]</em>
+</pre>
+<ul>
+ <li>[000]= class 0: Shallow ocean</li>
+ <li>[001]= class 1: Land</li>
+ <li>[010]= class 2: Ocean coastlines and lake shorelines</li>
+ <li>[011]= class 3: Shallow inland water</li>
+ <li>[100]= class 4: Ephemeral water</li>
+ <li>[101]= class 5: Deep inland water</li>
+ <li>[110]= class 6: Continental/moderate ocean</li>
+ <li>[111]= class 7: Deep ocean</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: Aerosol Quantity bits=[6-7]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: Climatology</li>
+ <li>[01]= class 1: Low</li>
+ <li>[10]= class 2: Average</li>
+ <li>[11]= class 3: High</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: Cirrus detected bits=[8-9]</em>
+</pre>
+<ul>
+ <li>[00]= class 0: None</li>
+ <li>[01]= class 1: Small</li>
+ <li>[10]= class 2: Average</li>
+ <li>[11]= class 3: High</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: Internal Cloud Algorithm Flag bits=[10]</em>
+</pre>
+<ul>
+ <li>[0]= class 0: Cloud</li>
+ <li>[1]= class 1: No cloud</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: Internal Fire Algorithm Flag bits=[11]</em>
+</pre>
+<ul>
+ <li>[0]= class 0: Fire</li>
+ <li>[1]= class 1: No fire</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: MOD35 snow/ice flag bits=[12]</em>
+</pre>
+<ul>
+ <li>[0]= class 0: Yes</li>
+ <li>[1]= class 1: No</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: Pixel adjacent to cloud bits=[13]</em>
+</pre>
+<ul>
+ <li>[0]= class 0: Yes</li>
+ <li>[1]= class 1: No</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: BRDF correction performed bits=[14]</em>
+</pre>
+<ul>
+ <li>[0]= class 0: Yes</li>
+ <li>[1]= class 1: No</li>
+</ul>
+
+<pre>
+<em>MOD09A1s: Internal Snow Mask bits=[15]</em>
+</pre>
+<ul>
+ <li>[0]= class 0: Snow</li>
+ <li>[1]= class 1: No snow</li>
+</ul>
+
+
+
+<h2>NOTES</h2>
+In MOD09A1: It seems that cloud related info is not filled properly in the
+standard QC (MOD09A1 in this module) since version 3, State-QA 500m images
+(MOD09A1s in this module) should be used (see Vermote et al., 2008).
+
+<h2>TODO</h2>
+Add one Day products.
+
+<h2>SEE ALSO</h2>
+
+<em>
+<a href="i.vi.html">i.vi</a>
+</em>
+
+<h2>REFERENCES</h2>
+
+<ul>
+<li> <a href="https://lpdaac.usgs.gov/products/modis_products_table">MODIS Products</a>
+<li> Vermote E.F., Kotchenova S.Y., Ray J.P. MODIS Surface Reflectance User's Guide. 
+ Version 1.2. June 2008. MODIS Land Surface Reflectance Science Computing Facility. <a href="http://modis-sr.ltdri.org">Homepage</a>
+</ul>
+
+<h2>AUTHOR</h2>
+Yann Chemin
+
+<p>
+<i>Last changed: $Date: 2013-01-22 22:18:02 -0800 (Tue, 22 Jan 2013) $</i>
diff --git a/imagery/i.modis.qc/main.c b/imagery/i.modis.qc/main.c
new file mode 100644
index 0000000..ca9a9fe
--- /dev/null
+++ b/imagery/i.modis.qc/main.c
@@ -0,0 +1,378 @@
+
+/****************************************************************************
+ *
+ * MODULE:       i.modis.qc
+ * AUTHOR(S):    Yann Chemin - yann.chemin at gmail.com
+ * PURPOSE:      Converts Quality Control indicators into human readable classes
+ * 		 for Modis surface reflectance products 250m/500m
+ * 		 (MOD09Q/MOD09A)
+ *
+ * COPYRIGHT:    (C) 2008 by the GRASS Development Team
+ *
+ *               This program is free software under the GNU General Public
+ *   	    	 License (>=v2). Read the file COPYING that comes with GRASS
+ *   	    	 for details.
+ * 
+ *****************************************************************************/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <grass/gis.h>
+#include <grass/glocale.h>
+
+    /* MOD09Q1 Products (250m, 8-Days) */ 
+CELL mod09Q1a(CELL pixel);
+CELL mod09Q1b(CELL pixel);
+CELL mod09Q1c(CELL pixel, int bandno);
+CELL mod09Q1d(CELL pixel);
+CELL mod09Q1e(CELL pixel);
+CELL mod09Q1f(CELL pixel);
+
+    /* MOD09A1 Products (500m, 8-Days) */ 
+CELL mod09A1a(CELL pixel);
+CELL mod09A1c(CELL pixel, int bandno);
+CELL mod09A1d(CELL pixel);
+CELL mod09A1e(CELL pixel);
+    /* MOD09A1 Products (500m, 8Days, State QA) */
+CELL mod09A1sa(CELL pixel);
+CELL mod09A1sb(CELL pixel);
+CELL mod09A1sc(CELL pixel);
+CELL mod09A1sd(CELL pixel);
+CELL mod09A1se(CELL pixel);
+CELL mod09A1sf(CELL pixel);
+CELL mod09A1sg(CELL pixel);
+CELL mod09A1sh(CELL pixel);
+CELL mod09A1si(CELL pixel);
+CELL mod09A1sj(CELL pixel);
+CELL mod09A1sk(CELL pixel);
+
+    /* MOD11A1 Products (1Km, daily) */ 
+CELL mod11A1a(CELL pixel);
+CELL mod11A1b(CELL pixel);
+CELL mod11A1c(CELL pixel);
+CELL mod11A1d(CELL pixel);
+
+    /* MOD11A2 Products (1Km, 8-Days) */ 
+CELL mod11A2a(CELL pixel);
+CELL mod11A2b(CELL pixel);
+CELL mod11A2c(CELL pixel);
+CELL mod11A2d(CELL pixel);
+
+int main(int argc, char *argv[]) 
+{
+    struct Cell_head cellhd;	/*region+header info */
+    int nrows, ncols;
+    int row, col;
+    char *qcflag;		/*Switch for particular index */
+    struct GModule *module;
+    struct Option *productname, *qcname, *input, *input_band, *output;
+    struct History history;	/*metadata */
+    struct Colors colors;	/*Color rules */
+
+    char *result;		/*output raster name */
+
+    /*File Descriptors */ 
+    int infd;
+    int outfd;
+    char *product;
+    char *qcchan, *mapset;
+    int bandno;
+    CELL *inrast;
+    CELL *outrast;
+    RASTER_MAP_TYPE data_type_output = CELL_TYPE;
+    CELL val1, val2;
+    
+    /************************************/ 
+    G_gisinit(argv[0]);
+    module = G_define_module();
+    module->keywords = _("QC, Quality Control, surface reflectance, Modis");
+    module->description =
+	_("Extracts quality control parameters from Modis QC layers.");
+
+    /* Define the different options */ 
+
+    input = G_define_standard_option(G_OPT_R_INPUT);
+    input->description =
+	_("Name of input surface reflectance QC layer [bit array]");
+
+    output = G_define_standard_option(G_OPT_R_OUTPUT);
+    output->key = "output";
+    output->description =
+	_("Name for output QC type classification layer");
+
+    productname = G_define_option();
+    productname->key = "productname";
+    productname->type = TYPE_STRING;
+    productname->required = YES;
+    productname->description = _("Name of MODIS product type");
+    productname->descriptions =_("mod09Q1;surf. refl. 250m 8-days;"
+				 "mod09A1;surf. refl. 500m 8-days;"
+				 "mod09A1s;surf. refl. 500m 8-days, State QA;"
+				 "mod11A1;LST 1Km daily (Day/Night);"
+				 "mod11A2;LST 1Km 8-days (Day/Night);");
+    productname->options = "mod09Q1,mod09A1,mod09A1s,mod11A1,mod11A2";
+    productname->answer = "mod09Q1";
+
+    qcname = G_define_option();
+    qcname->key = "qcname";
+    qcname->type = TYPE_STRING;
+    qcname->required = YES;
+    qcname->description = _("Name of QC type to extract");
+    qcname->descriptions = _("adjcorr;mod09: Adjacency Correction;"
+			     "atcorr;mod09: Atmospheric Correction;"
+			     "cloud;mod09: Cloud State;"
+			     "data_quality;mod09: Band-Wise Data Quality Flag;"
+			     "diff_orbit_from_500m;mod09: 250m Band is at Different Orbit than 500m;"
+			     "modland_qa_bits;mod09: MODIS Land General Quality Assessment;"
+			     "mandatory_qa_11A1;mod11A1: MODIS Land General Quality Assessment;"
+			     "data_quality_flag_11A1;mod11A1: Detailed Quality Indications;"
+			     "emis_error_11A1;mod11A1: Average Emissivity Error Classes;"
+			     "lst_error_11A1;mod11A1: Average LST Error Classes;"
+			     "data_quality_flag_11A2;mod11A2: Detailed Quality Indications;"
+			     "emis_error_11A2;mod11A2: Average Emissivity Error Classes;"
+			     "mandatory_qa_11A2;mod11A2: MODIS Land General Quality Assessment;"
+			     "lst_error_11A2;mod11A2: Average LST Error Classes;"
+			     "aerosol_quantity;mod09A1s: StateQA Internal Snow Mask;"
+			     "brdf_correction_performed;mod09A1s: StateQA Internal Snow Mask;"
+			     "cirrus_detected;mod09A1s: StateQA Internal Snow Mask;"
+			     "cloud_shadow;mod09A1s: StateQA Internal Snow Mask;"
+			     "cloud_state;mod09A1s: StateQA Internal Snow Mask;"
+			     "internal_clou_algorithm;mod09A1s: StateQA Internal Snow Mask;"
+			     "internal_fire_algorithm;mod09A1s: StateQA Internal Snow Mask;"
+			     "internal_snow_mask;mod09A1s: StateQA Internal Snow Mask;"
+			     "land_water;mod09A1s: StateQA Internal Snow Mask;"
+			     "mod35_snow_ice;mod09A1s: StateQA Internal Snow Mask;"
+			     "pixel_adjacent_to_cloud;mod09A1s: StateQA Internal Snow Mask;"
+			     );
+    qcname->options = "adjcorr,atcorr,cloud,data_quality,diff_orbit_from_500m,modland_qa_bits,mandatory_qa_11A1,data_quality_flag_11A1,emis_error_11A1,lst_error_11A1,data_quality_flag_11A2,emis_error_11A2,mandatory_qa_11A2,lst_error_11A2,aerosol_quantity,brdf_correction_performed,cirrus_detected,cloud_shadow,cloud_state,internal_clou_algorithm,internal_fire_algorithm,internal_snow_mask,land_water,mod35_snow_ice,pixel_adjacent_to_cloud";
+    qcname->answer = "modland_qa_bits";
+
+    input_band = G_define_option();
+    input_band->key = "band";
+    input_band->type = TYPE_STRING;
+    input_band->required = NO;
+    input_band->description =
+	_("Band number of Modis product (mod09Q1=[1,2],mod09A1=[1-7])");
+    input_band->descriptions =_("1;mod09Q1/A1 Band 1: Red;"
+                                "2;mod09Q1/A1 Band 2: NIR;"
+                                "3;mod09A1 Band 3: Blue;"
+                                "4;mod09A1 Band 4: Green;"
+                                "5;mod09A1 Band 5: SWIR 1;"
+                                "6;mod09A1 Band 6: SWIR 2;"
+                                "7;mod09A1 Band 7: SWIR 3;");
+    input_band->options = "1,2,3,4,5,6,7";
+    
+    /********************/ 
+    if (G_parser(argc, argv))
+	exit(EXIT_FAILURE);
+
+    product = productname->answer;
+    qcflag = qcname->answer;
+    qcchan = input->answer;
+    if (input_band->answer)
+	bandno = atoi(input_band->answer);
+
+    result = output->answer;
+
+    if ((!strcmp(qcflag, "cloud") && (strcmp(product, "mod09Q1"))) || 
+	(!strcmp(qcflag, "diff_orbit_from_500m") && (strcmp(product, "mod09Q1"))))
+	G_fatal_error(_("This flag is only available for MOD09Q1 @ 250m products"));
+
+    if (!strcmp(qcflag, "data_quality")) {
+	if (bandno < 1 || bandno > 7)
+	    G_fatal_error(_("Band number out of allowed range [1-7]"));
+	if (!strcmp(product, "mod09Q1") && bandno > 2)
+	    G_fatal_error(_("mod09Q1 product only has 2 bands"));
+    }
+    
+    if ((!strcmp(qcflag, "mandatory_qa") && (strcmp(product, "mod11A1"))) ||
+        (!strcmp(qcflag, "data_quality_flag") && (strcmp(product, "mod11A1"))) ||
+        (!strcmp(qcflag, "emis_error") && (strcmp(product, "mod11A1"))) ||
+        (!strcmp(qcflag, "lst_error") && (strcmp(product, "mod11A1"))))
+        G_fatal_error(_("This flag is only available for MOD11A1 @ 1Km products"));
+
+    if ((!strcmp(qcflag, "mandatory_qa") && (strcmp(product, "mod11A2"))) || 
+	(!strcmp(qcflag, "data_quality_flag") && (strcmp(product, "mod11A2"))) ||
+	(!strcmp(qcflag, "emis_error") && (strcmp(product, "mod11A2"))) ||
+	(!strcmp(qcflag, "lst_error") && (strcmp(product, "mod11A2"))))
+	G_fatal_error(_("This flag is only available for MOD11A2 @ 1Km products"));
+
+    if ((!strcmp(qcflag, "aerosol_quantity") && (strcmp(product, "mod09A1s"))) || 
+	(!strcmp(qcflag, "brdf_correction_performed") && (strcmp(product, "mod09A1s"))) ||
+	(!strcmp(qcflag, "cirrus_detected") && (strcmp(product, "mod09A1s"))) ||
+	(!strcmp(qcflag, "cloud_shadow") && (strcmp(product, "mod09A1s"))) ||
+	(!strcmp(qcflag, "cloud_state") && (strcmp(product, "mod09A1s"))) ||
+	(!strcmp(qcflag, "internal_cloud_algorithm") && (strcmp(product, "mod09A1s"))) ||
+	(!strcmp(qcflag, "internal_fire_algorithm") && (strcmp(product, "mod09A1s"))) ||
+	(!strcmp(qcflag, "internal_snow_mask") && (strcmp(product, "mod09A1s"))) ||
+	(!strcmp(qcflag, "land_water") && (strcmp(product, "mod09A1s"))) ||
+	(!strcmp(qcflag, "mod35_snow_ice") && (strcmp(product, "mod09A1s"))) ||
+	(!strcmp(qcflag, "pixel_adjacent_to_cloud") && (strcmp(product, "mod09A1s"))))
+	G_fatal_error(_("This flag is only available for MOD09A1s @ 500m products"));
+
+    mapset = G_find_cell2(qcchan, "");
+    if (mapset == NULL) {
+        G_fatal_error(_("Raster map <%s> not found"), qcchan);
+    }
+    infd = G_open_cell_old(qcchan, "");
+    if (infd < 0)
+        G_fatal_error(_("Unable to open raster map <%s>"), qcchan);
+
+    G_get_cellhd(qcchan, "", &cellhd);
+
+    inrast = G_allocate_raster_buf(CELL_TYPE);
+
+    G_debug(3, "number of rows %d", cellhd.rows);
+    nrows = G_window_rows();
+    ncols = G_window_cols();
+    outrast = G_allocate_raster_buf(data_type_output);
+
+    /* Create New raster files */ 
+    outfd = G_open_cell_new(result);
+    if (outfd < 0)
+        G_fatal_error(_("Unable to create raster map <%s>"), result);
+
+    /* Process pixels */ 
+    for (row = 0; row < nrows; row++)
+    {
+	CELL c;
+	G_percent(row, nrows, 2);
+	G_get_raster_row(infd, inrast, row, CELL_TYPE);
+
+	/*process the data */ 
+	for (col = 0; col < ncols; col++)
+	{
+	    c = inrast[col];
+	    if (G_is_c_null_value(&c))
+		G_set_c_null_value(&outrast[col], 1);
+            else if (!strcmp(product, "mod09A1"))
+            {
+	        if (!strcmp(qcflag, "modland_qa_bits")) 
+		/*calculate modland QA bits extraction  */ 
+		    c = mod09A1a(c);
+	        if (!strcmp(qcflag, "data_quality"))
+		/*calculate modland QA bits extraction  */ 
+		    c = mod09A1c(c, bandno);
+	        if (!strcmp(qcflag, "atcorr")) 
+		/*calculate atmospheric correction flag  */ 
+		    c = mod09A1d(c);
+	        if (!strcmp(qcflag, "adjcorr")) 
+		/*calculate adjacency correction flag  */ 
+		    c = mod09A1e(c);
+	    }
+            else if (!strcmp(product, "mod09Q1"))
+            {
+	        if (!strcmp(qcflag, "modland_qa_bits")) 
+		/*calculate modland QA bits extraction  */ 
+		    c = mod09Q1a(c);
+	        if (!strcmp(qcflag, "cloud"))
+		/*calculate cloud state  */ 
+		/* ONLY 250m product! */ 
+		    c = mod09Q1b(c);
+	        if (!strcmp(qcflag, "data_quality"))
+		/*calculate modland QA bits extraction  */ 
+		    c = mod09Q1c(c, bandno);
+	        if (!strcmp(qcflag, "atcorr")) 
+		/*calculate atmospheric correction flag  */ 
+		    c = mod09Q1d(c);
+	        if (!strcmp(qcflag, "adjcorr")) 
+		/*calculate adjacency correction flag  */ 
+		    c = mod09Q1e(c);
+	        if (!strcmp(qcflag, "diff_orbit_from_500m"))
+                /*calculate different orbit from 500m flag  */ 
+                    c = mod09Q1f(c);
+            }
+            else if (!strcmp(product, "mod11A1"))
+            {
+                if (!strcmp(qcflag, "mandatory_qa"))
+                /*calculate mod11A1 mandatory qa flags  */
+                    c = mod11A1a(c);
+                if (!strcmp(qcflag, "data_quality_flag"))
+                /*calculate mod11A1 data quality flag  */
+                    c = mod11A1b(c);
+                if (!strcmp(qcflag, "emis_error"))
+                /*calculate mod11A1 emissivity error flag  */
+                    c = mod11A1c(c);
+                if (!strcmp(qcflag, "lst_error"))
+                /*calculate mod11A1 lst error flag  */
+                    c = mod11A1d(c);
+            }
+            else if (!strcmp(product, "mod11A2"))
+            {
+                if (!strcmp(qcflag, "mandatory_qa")) 
+		/*calculate mod11A2 mandatory qa flags  */ 
+                    c = mod11A2a(c);
+	        if (!strcmp(qcflag, "data_quality_flag"))
+		/*calculate mod11A2 data quality flag  */ 
+                    c = mod11A2b(c);
+                if (!strcmp(qcflag, "emis_error")) 
+		/*calculate mod11A2 emissivity error flag  */ 
+                    c = mod11A2c(c);
+	        if (!strcmp(qcflag, "lst_error")) 
+		/*calculate mod11A2 lst error flag  */ 
+                    c = mod11A2d(c);
+            }
+            else if (!strcmp(product, "mod09A1s"))
+            {
+	        if (!strcmp(qcflag, "cloud_state")) 
+		/*calculate mod09A1s cloud state flag  */ 
+                    c = mod09A1sa(c);
+	        if (!strcmp(qcflag, "cloud_shadow")) 
+		/*calculate mod09A1s cloud shadow flag  */ 
+                    c = mod09A1sb(c);
+	        if (!strcmp(qcflag, "land_water")) 
+		/*calculate mod09A1s land/water flag  */ 
+                    c = mod09A1sc(c);
+	        if (!strcmp(qcflag, "aerosol_quantity")) 
+		/*calculate mod09A1s aerosol quantity flag  */ 
+                    c = mod09A1sd(c);
+	        if (!strcmp(qcflag, "cirrus_detected")) 
+		/*calculate mod09A1s cirrus detected flag  */ 
+                    c = mod09A1se(c);
+	        if (!strcmp(qcflag, "internal_cloud_algorithm")) 
+		/*calculate mod09A1s internal cloud algorithm flag  */ 
+                    c = mod09A1sf(c);
+	        if (!strcmp(qcflag, "internal_fire_algorithm")) 
+		/*calculate mod09A1s internal fire algorithm flag  */ 
+                    c = mod09A1sg(c);
+	        if (!strcmp(qcflag, "mod35_snow_ice")) 
+		/*calculate mod09A1s MOD35 snow/ice flag  */ 
+                    c = mod09A1sh(c);
+	        if (!strcmp(qcflag, "pixel_adjacent_to_cloud")) 
+		/*calculate mod09A1s pixel adjacent to cloud flag  */ 
+                    c = mod09A1si(c);
+	        if (!strcmp(qcflag, "brdf_correction_performed")) 
+		/*calculate mod09A1s BRDF correction performed flag  */ 
+                    c = mod09A1sj(c);
+	        if (!strcmp(qcflag, "internal_snow_mask")) 
+		/*calculate mod09A1s internal snow mask flag  */ 
+                    c = mod09A1sk(c);
+            }
+	    else
+                G_fatal_error(_("Unknown flag name, please check spelling"));
+
+	    outrast[col] = c;
+	}
+
+	G_put_raster_row(outfd, outrast, CELL_TYPE);
+    }
+
+    G_free(inrast);
+    G_close_cell(infd);
+    G_free(outrast);
+    G_close_cell(outfd);
+
+    /* Color from 0 to 10 in grey */ 
+    G_init_colors(&colors);
+    val1 = 0;
+    val2 = 10;
+    G_add_color_rule(&val1, 0, 0, 0, &val2, 255, 255, 255, &colors);
+    G_short_history(result, "raster", &history);
+    G_command_history(&history);
+    G_write_history(result, &history);
+    exit(EXIT_SUCCESS);
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1a.c b/imagery/i.modis.qc/mod09A1a.c
new file mode 100644
index 0000000..270bbb7
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1a.c
@@ -0,0 +1,22 @@
+/* MODLAND QA Bits 500m long int bits[0-1]
+ * 00 -> class 0: Corrected product produced at ideal quality -- all bands
+ * 01 -> class 1: Corrected product produced at less than idel quality -- some or all bands
+ * 10 -> class 2: Corrected product NOT produced due to cloud effect -- all bands
+ * 11 -> class 3: Corrected product NOT produced due to other reasons -- some or all bands mayb be fill value (Note that a value of [11] overrides a value of [01])
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1a(CELL pixel) 
+{
+    CELL qctemp;
+
+    /* Select bit 0 and 1 (right-side).
+     * hexadecimal "0x03" => binary "11" 
+     * this will set all other bits to null */
+    qctemp = pixel & 0x03;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1c.c b/imagery/i.modis.qc/mod09A1c.c
new file mode 100644
index 0000000..d25b5a5
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1c.c
@@ -0,0 +1,28 @@
+/* Band-wise Data Quality 500m long Int 
+ * bits[2-5][6-9][10-13][14-17][18-21][22-25][26-29]
+ * 0000 -> class 0: highest quality
+ * 0111 -> class 1: noisy detector
+ * 1000 -> class 2: dead detector; data interpolated in L1B
+ * 1001 -> class 3: solar zenith >= 86 degrees
+ * 1010 -> class 4: solar zenith >= 85 and < 86 degrees
+ * 1011 -> class 5: missing input
+ * 1100 -> class 6: internal constant used in place of climatological data for at least one atmospheric constant
+ * 1101 -> class 7: correction out of bounds, pixel constrained to extreme allowable value
+ * 1110 -> class 8: L1B data faulty
+ * 1111 -> class 9: not processed due to deep ocean or cloud
+ * Class 10-15: Combination of bits unused
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1c(CELL pixel, int bandno) 
+{
+    CELL qctemp;
+
+    pixel >>= 2 + (4 * (bandno - 1));	/* bitshift [] to [0-3] etc. */
+    qctemp = pixel & 0x0F;    
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1d.c b/imagery/i.modis.qc/mod09A1d.c
new file mode 100644
index 0000000..61a6497
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1d.c
@@ -0,0 +1,18 @@
+/* Atmospheric correction 500m long Int bit[30]
+ * 0 -> class 0: Not Corrected product
+ * 1 -> class 1: Corrected product
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1d(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 30;		/* bit no 30 becomes 0 */
+    qctemp = pixel & 0x01;    
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1e.c b/imagery/i.modis.qc/mod09A1e.c
new file mode 100644
index 0000000..318785b
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1e.c
@@ -0,0 +1,18 @@
+/* Adjacency correction 500m long Int bit[31]
+ * 0 -> class 0: Not Corrected product
+ * 1 -> class 1: Corrected product
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1e(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 31;		/* bit no 31 becomes 0 */
+    qctemp = pixel & 0x01; 
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1sa.c b/imagery/i.modis.qc/mod09A1sa.c
new file mode 100644
index 0000000..000d43a
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1sa.c
@@ -0,0 +1,22 @@
+/* Cloud State unsigned int bits[0-1]
+ * 00 -> class 0: clear
+ * 01 -> class 1: cloudy
+ * 10 -> class 2: mixed
+ * 11 -> class 3: not set, assumed clear
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1sa(CELL pixel) 
+{
+    CELL qctemp;
+
+    /* Select bit 0 and 1 (right-side).
+     * hexadecimal "0x03" => binary "11" 
+     * this will set all other bits to null */
+    qctemp = pixel & 0x03;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1sb.c b/imagery/i.modis.qc/mod09A1sb.c
new file mode 100644
index 0000000..71e4d0e
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1sb.c
@@ -0,0 +1,18 @@
+/* cloud shadow unsigned int bits[2]
+ * 0 -> class 0: yes
+ * 1 -> class 1: no
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1sb(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 2;
+    qctemp = pixel & 0x01;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1sc.c b/imagery/i.modis.qc/mod09A1sc.c
new file mode 100644
index 0000000..1da5b1a
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1sc.c
@@ -0,0 +1,24 @@
+/* LAND/WATER FLAG unsigned int bits[3-5]
+ * 000 -> class 0: Shallow ocean
+ * 001 -> class 1: Land
+ * 010 -> class 2: Ocean coastlines and lake shorelines
+ * 011 -> class 3: Shallow inland water
+ * 100 -> class 4: Ephemeral water
+ * 101 -> class 5: Deep inland water
+ * 110 -> class 6: Continental/moderate ocean
+ * 111 -> class 7: Deep ocean
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1sc(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 3;
+    qctemp = pixel & 0x07;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1sd.c b/imagery/i.modis.qc/mod09A1sd.c
new file mode 100644
index 0000000..678a135
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1sd.c
@@ -0,0 +1,20 @@
+/* AEROSOL QUANTITY unsigned int bits[6-7]
+ * 00 -> class 0: Climatology
+ * 01 -> class 1: Low
+ * 10 -> class 2: Average
+ * 11 -> class 3: High
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1sd(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 6;
+    qctemp = pixel & 0x03;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1se.c b/imagery/i.modis.qc/mod09A1se.c
new file mode 100644
index 0000000..d9083a5
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1se.c
@@ -0,0 +1,20 @@
+/* CIRRUS DETECTED unsigned int bits[8-9]
+ * 00 -> class 0: None
+ * 01 -> class 1: Small
+ * 10 -> class 2: Average
+ * 11 -> class 3: High
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1se(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 8;
+    qctemp = pixel & 0x03;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1sf.c b/imagery/i.modis.qc/mod09A1sf.c
new file mode 100644
index 0000000..d046d0a
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1sf.c
@@ -0,0 +1,18 @@
+/* Internal Cloud Algorithm Flag unsigned int bits[10]
+ * 0 -> class 0: Cloud 
+ * 1 -> class 1: No cloud
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1sf(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 10;
+    qctemp = pixel & 0x01;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1sg.c b/imagery/i.modis.qc/mod09A1sg.c
new file mode 100644
index 0000000..8982a5d
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1sg.c
@@ -0,0 +1,18 @@
+/* Internal Fire Algorithm Flag unsigned int bits[11]
+ * 0 -> class 0: Fire 
+ * 1 -> class 1: No fire
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1sg(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 11;
+    qctemp = pixel & 0x01;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1sh.c b/imagery/i.modis.qc/mod09A1sh.c
new file mode 100644
index 0000000..6b309f2
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1sh.c
@@ -0,0 +1,18 @@
+/* MOD35 snow/ice flag unsigned int bits [12]
+ * 0 -> class 0: Yes
+ * 1 -> class 1: No
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1sh(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 12;
+    qctemp = pixel & 0x01;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1si.c b/imagery/i.modis.qc/mod09A1si.c
new file mode 100644
index 0000000..08add0b
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1si.c
@@ -0,0 +1,18 @@
+/* Pixel adjacent to cloud unsigned int bits[13]
+ * 0 -> class 0: Yes
+ * 1 -> class 1: No
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1si(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 13;
+    qctemp = pixel & 0x01;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1sj.c b/imagery/i.modis.qc/mod09A1sj.c
new file mode 100644
index 0000000..fb800ed
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1sj.c
@@ -0,0 +1,18 @@
+/* BRDF correction performed unsigned int bits[14]
+ * 0 -> class 0: Yes
+ * 1 -> class 1: No
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1sj(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 14;
+    qctemp = pixel & 0x01;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09A1sk.c b/imagery/i.modis.qc/mod09A1sk.c
new file mode 100644
index 0000000..8a97e66
--- /dev/null
+++ b/imagery/i.modis.qc/mod09A1sk.c
@@ -0,0 +1,18 @@
+/* Internal Snow Mask unsigned int bits[15]
+ * 0 -> class 0: Snow
+ * 1 -> class 1: No snow
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09A1sk(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 15;
+    qctemp = pixel & 0x01;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09Q1a.c b/imagery/i.modis.qc/mod09Q1a.c
new file mode 100644
index 0000000..88ac985
--- /dev/null
+++ b/imagery/i.modis.qc/mod09Q1a.c
@@ -0,0 +1,18 @@
+/* MODLAND QA Bits 250m Unsigned Int bits[0-1]
+ * 00 -> class 0: Corrected product produced at ideal quality -- all bands
+ * 01 -> class 1: Corrected product produced at less than idel quality -- some or all bands
+ * 10 -> class 2: Corrected product NOT produced due to cloud effect -- all bands
+ * 11 -> class 3: Corrected product NOT produced due to other reasons -- some or all bands mayb be fill value (Note that a value of [11] overrides a value of [01])
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09Q1a (CELL pixel) 
+{
+    CELL qctemp;
+    qctemp = pixel & 0x03;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09Q1b.c b/imagery/i.modis.qc/mod09Q1b.c
new file mode 100644
index 0000000..26a0a99
--- /dev/null
+++ b/imagery/i.modis.qc/mod09Q1b.c
@@ -0,0 +1,20 @@
+/* Cloud State 250m Unsigned Int bits[2-3]
+ * 00 -> class 0: Clear -- No clouds
+ * 01 -> class 1: Cloudy
+ * 10 -> class 2: Mixed
+ * 11 -> class 3: Not Set ; Assumed Clear
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09Q1b(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 2;		/*bits [2-3] become [0-1] */
+    qctemp = pixel & 0x03;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09Q1c.c b/imagery/i.modis.qc/mod09Q1c.c
new file mode 100644
index 0000000..22b4ea1
--- /dev/null
+++ b/imagery/i.modis.qc/mod09Q1c.c
@@ -0,0 +1,27 @@
+/* Band-wise Data Quality 250m Unsigned Int bits[0-1]
+ * 0000 -> class 0: highest quality
+ * 0111 -> class 1: noisy detector
+ * 1000 -> class 2: dead detector; data interpolated in L1B
+ * 1001 -> class 3: solar zenith >= 86 degrees
+ * 1010 -> class 4: solar zenith >= 85 and < 86 degrees
+ * 1011 -> class 5: missing input
+ * 1100 -> class 6: internal constant used in place of climatological data for at least one atmospheric constant
+ * 1101 -> class 7: correction out of bounds, pixel constrained to extreme allowable value
+ * 1110 -> class 8: L1B data faulty
+ * 1111 -> class 9: not processed due to deep ocean or cloud
+ * Class 11-15: Combination of bits unused
+ */
+
+#include <grass/gis.h>
+
+CELL mod09Q1c(CELL pixel, int bandno) 
+{
+    CELL qctemp;
+
+    pixel >>= 4 + (4 * (bandno - 1));	/* bitshift [4-7] or [8-11] to [0-3] */
+    qctemp = pixel & 0x0F;
+
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09Q1d.c b/imagery/i.modis.qc/mod09Q1d.c
new file mode 100644
index 0000000..d6555cf
--- /dev/null
+++ b/imagery/i.modis.qc/mod09Q1d.c
@@ -0,0 +1,17 @@
+/* Atmospheric correction 250m Unsigned Int bit[12]
+ * 0 -> class 0: Not Corrected product
+ * 1 -> class 1: Corrected product
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09Q1d(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 12;		/* bit no 12 becomes 0 */
+    qctemp = pixel & 0x01;
+    
+    return qctemp;
+}
+
diff --git a/imagery/i.modis.qc/mod09Q1e.c b/imagery/i.modis.qc/mod09Q1e.c
new file mode 100644
index 0000000..08669e7
--- /dev/null
+++ b/imagery/i.modis.qc/mod09Q1e.c
@@ -0,0 +1,18 @@
+/* Adjacency correction 250m Unsigned Int bit[13]
+ * 0 -> class 0: Not Corrected product
+ * 1 -> class 1: Corrected product
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09Q1e(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 13;		/* bit no 13 becomes 0 */
+    qctemp = pixel & 0x01;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod09Q1f.c b/imagery/i.modis.qc/mod09Q1f.c
new file mode 100644
index 0000000..25d7f21
--- /dev/null
+++ b/imagery/i.modis.qc/mod09Q1f.c
@@ -0,0 +1,18 @@
+/* Different orbit from 500m product, 250m Unsigned Int bit[14]
+ * 0 -> class 0: same orbit as 500m
+ * 1 -> class 1: different orbit from 500m
+ */  
+
+#include <grass/gis.h>
+
+CELL mod09Q1f(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 14;		/* bit no 14 becomes 0 */
+    qctemp = pixel & 0x01;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod11A1a.c b/imagery/i.modis.qc/mod11A1a.c
new file mode 100644
index 0000000..ca0e6ef
--- /dev/null
+++ b/imagery/i.modis.qc/mod11A1a.c
@@ -0,0 +1,18 @@
+/* mod11A1 Mandatory QA Flags 1Km bits[0-1]
+ * 00 -> class 0: LST produced, good quality, not necessary to examine more detailed QA
+ * 01 -> class 1: LST produced, other quality, recommend examination of more detailed QA
+ * 10 -> class 2: LST not produced due to cloud effects
+ * 11 -> class 3: LST not produced primarily due to reasons other than cloud
+ */  
+
+#include <grass/gis.h>
+
+CELL mod11A1a (CELL pixel) 
+{
+    CELL qctemp;
+    qctemp = pixel & 0x03;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod11A1b.c b/imagery/i.modis.qc/mod11A1b.c
new file mode 100644
index 0000000..e4fe635
--- /dev/null
+++ b/imagery/i.modis.qc/mod11A1b.c
@@ -0,0 +1,20 @@
+/* mod11A1 Data Quality Flag bits[2-3]
+ * 00 -> class 0: Good data quality of L1B in bands 31 and 32
+ * 01 -> class 1: Other quality data
+ * 10 -> class 2: TBD
+ * 11 -> class 3: TBD
+ */  
+
+#include <grass/gis.h>
+
+CELL mod11A1b(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 2;		/*bits [2-3] become [0-1] */
+    qctemp = pixel & 0x03;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod11A1c.c b/imagery/i.modis.qc/mod11A1c.c
new file mode 100644
index 0000000..c28afba
--- /dev/null
+++ b/imagery/i.modis.qc/mod11A1c.c
@@ -0,0 +1,20 @@
+/* mod11A1 Emis Error Flag bits[4-5]
+ * 00 -> class 0: Average emissivity error <= 0.01
+ * 01 -> class 1: Average emissivity error <= 0.02
+ * 10 -> class 2: Average emissivity error <= 0.04
+ * 11 -> class 3: Average emissivity error > 0.04
+ */  
+
+#include <grass/gis.h>
+
+CELL mod11A1c(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 4;		/*bits [4-5] become [0-1] */
+    qctemp = pixel & 0x03;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod11A1d.c b/imagery/i.modis.qc/mod11A1d.c
new file mode 100644
index 0000000..e7af6fb
--- /dev/null
+++ b/imagery/i.modis.qc/mod11A1d.c
@@ -0,0 +1,20 @@
+/* mod11A1 LST Error Flag bits[6-7]
+ * 00 -> class 0: Average LST error <= 1
+ * 01 -> class 1: Average LST error <= 2K
+ * 10 -> class 2: Average LST error <= 3K
+ * 11 -> class 3: Average LST error > 3K
+ */  
+
+#include <grass/gis.h>
+
+CELL mod11A1d(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 6;		/*bits [6-7] become [0-1] */
+    qctemp = pixel & 0x03;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod11A2a.c b/imagery/i.modis.qc/mod11A2a.c
new file mode 100644
index 0000000..7df7ad8
--- /dev/null
+++ b/imagery/i.modis.qc/mod11A2a.c
@@ -0,0 +1,18 @@
+/* mod11A2 Mandatory QA Flags 1Km bits[0-1]
+ * 00 -> class 0: LST produced, good quality, not necessary to examine more detailed QA
+ * 01 -> class 1: LST produced, other quality, recommend examination of more detailed QA
+ * 10 -> class 2: LST not produced due to cloud effects
+ * 11 -> class 3: LST not produced primarily due to reasons other than cloud
+ */  
+
+#include <grass/gis.h>
+
+CELL mod11A2a (CELL pixel) 
+{
+    CELL qctemp;
+    qctemp = pixel & 0x03;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod11A2b.c b/imagery/i.modis.qc/mod11A2b.c
new file mode 100644
index 0000000..f772853
--- /dev/null
+++ b/imagery/i.modis.qc/mod11A2b.c
@@ -0,0 +1,20 @@
+/* mod11A2 Data Quality Flag bits[2-3]
+ * 00 -> class 0: Good data quality of L1B in 7 TIR bands
+ * 01 -> class 1: Other quality data
+ * 10 -> class 2: TBD
+ * 11 -> class 3: TBD
+ */  
+
+#include <grass/gis.h>
+
+CELL mod11A2b(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 2;		/*bits [2-3] become [0-1] */
+    qctemp = pixel & 0x03;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod11A2c.c b/imagery/i.modis.qc/mod11A2c.c
new file mode 100644
index 0000000..2eb8c18
--- /dev/null
+++ b/imagery/i.modis.qc/mod11A2c.c
@@ -0,0 +1,20 @@
+/* mod11A2 Emis Error Flag bits[4-5]
+ * 00 -> class 0: Average emissivity error <= 0.01
+ * 01 -> class 1: Average emissivity error <= 0.02
+ * 10 -> class 2: Average emissivity error <= 0.04
+ * 11 -> class 3: Average emissivity error > 0.04
+ */  
+
+#include <grass/gis.h>
+
+CELL mod11A2c(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 4;		/*bits [4-5] become [0-1] */
+    qctemp = pixel & 0x03;
+    
+    return qctemp;
+}
+
+
diff --git a/imagery/i.modis.qc/mod11A2d.c b/imagery/i.modis.qc/mod11A2d.c
new file mode 100644
index 0000000..87010c8
--- /dev/null
+++ b/imagery/i.modis.qc/mod11A2d.c
@@ -0,0 +1,20 @@
+/* mod11A2 LST Error Flag bits[6-7]
+ * 00 -> class 0: Average LST error <= 1
+ * 01 -> class 1: Average LST error <= 2
+ * 10 -> class 2: Average LST error <= 3 
+ * 11 -> class 3: Average LST error > 3
+ */  
+
+#include <grass/gis.h>
+
+CELL mod11A2d(CELL pixel) 
+{
+    CELL qctemp;
+
+    pixel >>= 6;		/*bits [6-7] become [0-1] */
+    qctemp = pixel & 0x03;
+    
+    return qctemp;
+}
+
+
diff --git a/lib/init/grass64_start.png b/lib/init/grass64_start.png
deleted file mode 100644
index 5e521b6..0000000
Binary files a/lib/init/grass64_start.png and /dev/null differ
diff --git a/lib/proj/README.txt b/lib/proj/README.txt
new file mode 100644
index 0000000..024d610
--- /dev/null
+++ b/lib/proj/README.txt
@@ -0,0 +1,6 @@
+Update procedure: GRASS GIS relies on GDAL/PROJ.
+
+The EPGS DB is transformed into suitable CSV data for GDAL/PROJ
+according to this procedure:
+http://svn.osgeo.org/metacrs/geotiff/trunk/libgeotiff/csv/README
+
diff --git a/lib/symbol/symbol/basic/arrow3 b/lib/symbol/symbol/basic/arrow3
new file mode 100644
index 0000000..a78ae7d
--- /dev/null
+++ b/lib/symbol/symbol/basic/arrow3
@@ -0,0 +1,16 @@
+VERSION 1.0
+BOX -0.75 -0.75 0.75 0.75
+POLYGON
+  RING
+    LINE
+      0 1
+      0.55 0
+      0.2 0
+      0.2 -1
+      -0.2 -1
+      -0.2 0
+      -0.55 0
+      0 1
+    END
+  END
+END
diff --git a/lib/symbol/symbol/basic/cross3 b/lib/symbol/symbol/basic/cross3
new file mode 100644
index 0000000..f2e304f
--- /dev/null
+++ b/lib/symbol/symbol/basic/cross3
@@ -0,0 +1,20 @@
+VERSION 1.0
+BOX -1.3 -1.3 1.3 1.3
+POLYGON
+  RING
+    LINE
+     -0.3 1.3
+     0.3 1.3
+     0.3 0.3
+     1.3 0.3
+     1.3 -0.3
+     0.3 -0.3
+     0.3 -1.3
+     -0.3 -1.3
+     -0.3 -0.3
+     -1.3 -0.3
+     -1.3 0.3
+     -0.3 0.3
+    END
+  END
+END
diff --git a/lib/symbol/symbol/extra/dim_arrow b/lib/symbol/symbol/extra/dim_arrow
new file mode 100644
index 0000000..c6fcf25
--- /dev/null
+++ b/lib/symbol/symbol/extra/dim_arrow
@@ -0,0 +1,25 @@
+VERSION 1.0
+BOX -0.5 -0.5 0.5 0.5
+STRING
+  LINE
+    0  1
+    0 -1
+  END
+END
+STRING
+  LINE
+    0 0
+    4 0
+  END
+END
+POLYGON
+  RING
+    LINE
+      0 0
+      1.5 0.55
+      1 0
+      1.5 -0.55
+      0 0
+    END
+  END
+END
diff --git a/lib/symbol/symbol/extra/n_arrow1b b/lib/symbol/symbol/extra/n_arrow1b
new file mode 100644
index 0000000..e2bc97a
--- /dev/null
+++ b/lib/symbol/symbol/extra/n_arrow1b
@@ -0,0 +1,37 @@
+VERSION 1.0
+BOX -1.5 -1.5 1.5 1.5
+STRING
+  ARC 0 -0.17705 3.2 360 0 C
+END
+POLYGON
+ COLOR NONE
+ RING
+  LINE
+  0 -1.5
+  0 3
+  1.5 -3
+  0 -1.5
+ END
+END
+POLYGON
+ COLOR NONE
+ FCOLOR 255 255 255
+ RING
+  LINE
+  0 -1.5
+  0 3
+  -1.5 -3
+  0 -1.5
+ END
+END
+POLYGON
+ FCOLOR NONE
+ RING
+  LINE
+  0 -1.5
+  -1.5 -3
+  0 3
+  1.5 -3
+  0 -1.5
+ END
+END
diff --git a/lib/symbol/symbol/extra/n_arrow4 b/lib/symbol/symbol/extra/n_arrow4
new file mode 100644
index 0000000..10e163d
--- /dev/null
+++ b/lib/symbol/symbol/extra/n_arrow4
@@ -0,0 +1,12 @@
+VERSION 1.0
+BOX -1 -1 1 1
+POLYGON
+  RING
+    ARC 0 0 5 90 260
+  END
+END
+POLYGON
+  RING
+    ARC 0 0 5 450 280 C
+  END
+END
diff --git a/lib/symbol/symbol/extra/n_arrow5 b/lib/symbol/symbol/extra/n_arrow5
new file mode 100644
index 0000000..c2748b8
--- /dev/null
+++ b/lib/symbol/symbol/extra/n_arrow5
@@ -0,0 +1,34 @@
+VERSION 1.0
+BOX -1 -1 1 1
+POLYGON
+  RING
+    ARC 0 0 5 90 170
+  END
+END
+POLYGON
+  RING
+    ARC 0 0 5 370 170 C
+  END
+END
+POLYGON
+  RING
+    ARC 0 0 5 450 370 C
+  END
+END
+POLYGON
+  FCOLOR 255 255 255
+  RING
+    LINE
+        3 -3
+        3 0.5
+	2 0.5
+	2 -2
+	-2 0.5
+	-3 0.5
+	-3 -3
+	-2 -3
+	-2 -0.5
+	2 -3
+    END
+  END
+END
diff --git a/lib/symbol/symbol/extra/n_arrow6 b/lib/symbol/symbol/extra/n_arrow6
new file mode 100644
index 0000000..8b4fbe1
--- /dev/null
+++ b/lib/symbol/symbol/extra/n_arrow6
@@ -0,0 +1,32 @@
+VERSION 1.0
+BOX -1 -1 1 1
+STRING
+  ARC 0 0 5 360 0 C
+END
+POLYGON
+  RING
+    LINE
+      0 5
+      4.3301 -2.5
+      0 -1
+      -4.3301 -2.5
+      0 5
+    END
+  END
+END
+POLYGON
+  RING
+    LINE
+        1.15 -4.25
+        1.15 -1.75
+        0.75 -1.75
+        0.75 -3.625
+        -0.75 -1.75
+        -1.15 -1.75
+        -1.15 -4.25
+        -0.75 -4.25
+        -0.75 -2.375
+        0.75 -4.25
+    END
+  END
+END
diff --git a/lib/symbol/symbol/extra/n_arrow7a b/lib/symbol/symbol/extra/n_arrow7a
new file mode 100644
index 0000000..f55b47a
--- /dev/null
+++ b/lib/symbol/symbol/extra/n_arrow7a
@@ -0,0 +1,25 @@
+VERSION 1.0
+BOX -1.5 -1.5 1.5 1.5
+POLYGON
+ RING
+  LINE
+  0 -2.25
+  -0.75 -2
+  0 7.5
+  0 -2.25
+ END
+END
+POLYGON
+ RING
+  LINE
+  0 7.5
+  0 -7.5
+ END
+END
+POLYGON
+ RING
+  LINE
+  -1.5 -5.25
+  1.5 -5.25
+ END
+END
diff --git a/lib/symbol/symbol/extra/n_arrow7b b/lib/symbol/symbol/extra/n_arrow7b
new file mode 100644
index 0000000..8689af3
--- /dev/null
+++ b/lib/symbol/symbol/extra/n_arrow7b
@@ -0,0 +1,25 @@
+VERSION 1.0
+BOX -1.5 -1.5 1.5 1.5
+POLYGON
+ RING
+  LINE
+  0 -1.25
+  -0.75 -2
+  0 7.5
+  0 -1.25
+ END
+END
+POLYGON
+ RING
+  LINE
+  0 7.5
+  0 -7.5
+ END
+END
+POLYGON
+ RING
+  LINE
+  -1.5 -5.25
+  1.5 -5.25
+ END
+END
diff --git a/lib/symbol/symbol/extra/n_arrow8a b/lib/symbol/symbol/extra/n_arrow8a
new file mode 100644
index 0000000..7a87965
--- /dev/null
+++ b/lib/symbol/symbol/extra/n_arrow8a
@@ -0,0 +1,79 @@
+VERSION 1.0
+BOX -1 -1 1 1
+STRING
+  ARC 0 0 5 360 0 C
+END
+POLYGON
+  COLOR NONE
+  RING
+    ARC 0 0 4.5 90 170
+  END
+END
+POLYGON
+  COLOR NONE
+  RING
+    ARC 0 0 4.5 450 370 C
+  END
+END
+
+POLYGON
+  COLOR NONE
+  RING
+    ARC 0 0 4.5 257.1604 200 C
+  END
+END
+POLYGON
+  COLOR NONE
+  RING
+    ARC 0 0 4.5 282.8396 340
+  END
+END
+
+POLYGON
+  COLOR NONE
+  RING
+    LINE
+      -1 1
+      -1 -4.3875
+      -4.2286 -1.5391
+      -1 1
+    END
+  END
+END
+POLYGON
+  COLOR NONE
+  RING
+    LINE
+      1 1
+      1 -4.3875
+      4.2286 -1.5391
+      1 1
+    END
+  END
+END
+
+# cleanup to avoid sliver visible after conversion to pdf
+POLYGON
+  COLOR NONE
+  RING
+    LINE
+      -1 -4.3875
+      -2.6143 -3.2
+      -4.2286 -1.5391
+      -2.6143 -2.7
+      -1 -4.3875
+    END
+  END
+END
+POLYGON
+  COLOR NONE
+  RING
+    LINE
+      1 -4.3875
+      2.6143 -3.2
+      4.2286 -1.5391
+      2.6143 -2.7
+      1 -4.3875
+    END
+  END
+END
diff --git a/lib/symbol/symbol/extra/n_arrow8b b/lib/symbol/symbol/extra/n_arrow8b
new file mode 100644
index 0000000..11e614f
--- /dev/null
+++ b/lib/symbol/symbol/extra/n_arrow8b
@@ -0,0 +1,80 @@
+VERSION 1.0
+BOX -1 -1 1 1
+
+STRING
+  ARC 0 0 5 360 0 C
+END
+POLYGON
+  COLOR NONE
+  RING
+    ARC 0 0 4.5 90 167.1604
+  END
+END
+POLYGON
+  COLOR NONE
+  RING
+    ARC 0 0 4.5 450 372.8396 C
+  END
+END
+
+POLYGON
+  COLOR NONE
+  RING
+    ARC 0 0 4.5 247.8039 167.1604 C
+  END
+END
+POLYGON
+  COLOR NONE
+  RING
+    ARC 0 0 4.5 292.1961 372.8396
+  END
+END
+
+POLYGON
+  COLOR NONE
+  RING
+    LINE
+      -1.7    1
+      -1.7   -4.1665
+      -4.3875 1
+      -1.7    1
+    END
+  END
+END
+POLYGON
+  COLOR NONE
+  RING
+    LINE
+      1.7    1
+      1.7   -4.1665
+      4.3975 1
+      1.7    1
+    END
+  END
+END
+
+# cleanup to avoid sliver visible after conversion to pdf
+POLYGON
+  COLOR NONE
+  RING
+    LINE
+      -1.7    -4.1665
+      -3.0488 -2.5
+      -4.3975  1
+      -3.0488 -0.9
+      -1.7    -4.1665
+    END
+  END
+END
+POLYGON
+  COLOR NONE
+  RING
+    LINE
+      1.7    -4.1665
+      3.0488 -2.5
+      4.3975  1
+      3.0488 -0.9
+      1.7    -4.1665
+    END
+  END
+END
diff --git a/lib/symbol/symbol/extra/n_arrow9 b/lib/symbol/symbol/extra/n_arrow9
new file mode 100644
index 0000000..2cd1ead
--- /dev/null
+++ b/lib/symbol/symbol/extra/n_arrow9
@@ -0,0 +1,14 @@
+VERSION 1.0
+BOX -1 -1 1 1
+
+POLYGON
+  RING
+    LINE
+      0 5
+      2.25 -2.5
+      0 -1.5
+      -2.25 -2.5
+      0 5
+    END
+  END
+END
diff --git a/lib/symbol/symbol/extra/simple_zia b/lib/symbol/symbol/extra/simple_zia
new file mode 100644
index 0000000..0e09718
--- /dev/null
+++ b/lib/symbol/symbol/extra/simple_zia
@@ -0,0 +1,31 @@
+VERSION 1.0
+BOX -1 -1 1 1
+POLYGON
+    RING
+    ARC 0 0 1 360 0 C
+  END
+END
+STRING
+  LINE
+    0 1
+    0 2
+  END
+END
+STRING
+  LINE
+    1 0
+    2 0
+  END
+END
+STRING
+  LINE
+    0 -1
+    0 -2
+  END
+END
+STRING
+  LINE
+    -1 0
+    -2 0
+  END
+END
diff --git a/locale/po/grasslibs_nl.po b/locale/po/grasslibs_nl.po
new file mode 100644
index 0000000..e4aeabc
--- /dev/null
+++ b/locale/po/grasslibs_nl.po
@@ -0,0 +1,4747 @@
+# translation of grasslibs_nl.po to Dutch
+# This file is distributed under the same license as the GRASS package.
+# Copyright (C) 2012 GRASS Development Team
+#
+# XXX, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: grasslibs_nl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-10 00:42+0200\n"
+"PO-Revision-Date: 2012-06-19 23:46+0200\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Dutch <grass-translations at lists.osgeo.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../lib/raster/rem_io.c:40
+#, c-format
+msgid "ERROR %s from graphics driver.\n"
+msgstr ""
+
+#: ../lib/raster/rem_io.c:167
+#, c-format
+msgid "Unable to allocate memory\n"
+msgstr ""
+
+#: ../lib/raster/rem_io.c:217
+#, c-format
+msgid "ERROR - eof from graphics monitor.\n"
+msgstr ""
+
+#: ../lib/raster/rem_io.c:237
+#, c-format
+msgid "Warning - no response from graphics monitor <%s>.\n"
+msgstr ""
+
+#: ../lib/raster/rem_io.c:239
+#, c-format
+msgid "Check to see if the mouse is still active.\n"
+msgstr ""
+
+#: ../lib/raster/rem_io.c:244
+#, c-format
+msgid "ERROR - no response from graphics monitor <%s>.\n"
+msgstr ""
+
+#: ../lib/raster/io_sock.c:63
+msgid "No graphics monitor has been selected for output."
+msgstr ""
+
+#: ../lib/raster/io_sock.c:64
+msgid "Please run \"d.mon\" to select a graphics monitor."
+msgstr ""
+
+#: ../lib/raster/io_sock.c:72
+#, c-format
+msgid "Failed to get socket name for monitor <%s>."
+msgstr ""
+
+#: ../lib/raster/io_sock.c:81
+#, c-format
+msgid "No socket to connect to for monitor <%s>."
+msgstr ""
+
+#: ../lib/raster/io_sock.c:98
+msgid "Socket is already in use or not accepting connections."
+msgstr ""
+
+#: ../lib/raster/io_sock.c:99
+msgid "Use d.mon to select a monitor"
+msgstr ""
+
+#: ../lib/raster/io_sock.c:105
+msgid "Trying to connect to something not a socket."
+msgstr ""
+
+#: ../lib/raster/io_sock.c:106
+msgid "Probably program error."
+msgstr ""
+
+#: ../lib/raster/io_sock.c:111
+msgid "Connect attempt timed out."
+msgstr ""
+
+#: ../lib/raster/io_sock.c:112
+msgid "Probably an error with the server."
+msgstr ""
+
+#: ../lib/raster/io_sock.c:120
+msgid "Connection failed."
+msgstr ""
+
+#: ../lib/ogsf/GVL2.c:248
+#, c-format
+msgid "Loading 3d raster map <%s>..."
+msgstr ""
+
+#: ../lib/ogsf/gk.c:322
+msgid "Need at least 3 keyframes for spline"
+msgstr ""
+
+#: ../lib/ogsf/gk.c:624
+msgid "Need at least 2 keyframes for interpolation"
+msgstr ""
+
+#: ../lib/ogsf/Gv3.c:57 ../lib/ogsf/Gp3.c:109 ../lib/vector/Vlib/map.c:327
+#: ../lib/vector/Vlib/legal_vname.c:118 ../lib/vector/Vlib/legal_vname.c:121
+#: ../lib/vector/Vlib/open.c:168
+#, c-format
+msgid "Vector map <%s> not found"
+msgstr ""
+
+#: ../lib/ogsf/Gv3.c:63 ../lib/ogsf/Gp3.c:115 ../lib/vector/Vlib/open.c:199
+#, c-format
+msgid "Unable to open vector map <%s>"
+msgstr ""
+
+#: ../lib/ogsf/Gv3.c:249
+#, c-format
+msgid "No features from vector map <%s> fall within current region"
+msgstr ""
+
+#: ../lib/ogsf/Gv3.c:254
+#, c-format
+msgid "Vector map <%s> loaded (%d features)"
+msgstr ""
+
+#: ../lib/ogsf/gvl_file.c:104
+msgid "Maximum number of datafiles exceeded"
+msgstr ""
+
+#: ../lib/ogsf/gvl_file.c:428 ../lib/ogsf/Gvl3.c:39
+#: ../lib/gpde/N_arrays_io.c:296
+#, c-format
+msgid "3D raster map <%s> not found"
+msgstr ""
+
+#: ../lib/ogsf/gvl_file.c:437 ../lib/gpde/N_arrays_io.c:304
+#, c-format
+msgid "Unable to open 3D raster map <%s>"
+msgstr ""
+
+#: ../lib/ogsf/gvl_file.c:443
+#, c-format
+msgid "Unable to read range of 3D raster map <%s>"
+msgstr ""
+
+#: ../lib/ogsf/gvl_file.c:471
+#, c-format
+msgid "Unable to close 3D raster map <%s>"
+msgstr ""
+
+#: ../lib/ogsf/Gp3.c:54 ../lib/ogsf/Gs3.c:126 ../lib/ogsf/Gs3.c:201
+#: ../lib/ogsf/Gs3.c:286 ../lib/ogsf/Gs3.c:359 ../lib/ogsf/Gs3.c:475
+#: ../lib/ogsf/Gs3.c:572 ../lib/ogsf/Gs3.c:639 ../lib/ogsf/Gs3.c:696
+#: ../lib/ogsf/Gs3.c:767 ../lib/ogsf/Gs3.c:837 ../lib/ogsf/gsd_legend.c:238
+#: ../lib/gpde/N_arrays_io.c:56 ../lib/gis/legal_name.c:94
+#: ../lib/gis/legal_name.c:97 ../lib/gis/opencell.c:1011
+#, c-format
+msgid "Raster map <%s> not found"
+msgstr ""
+
+#: ../lib/ogsf/Gp3.c:145 ../lib/vector/Vlib/map.c:68
+#: ../lib/vector/Vlib/map.c:84
+#, c-format
+msgid "Unable to read vector map <%s>"
+msgstr ""
+
+#: ../lib/ogsf/Gp3.c:206
+#, c-format
+msgid "No points from vector map <%s> fall within current region"
+msgstr ""
+
+#: ../lib/ogsf/Gp3.c:211
+#, c-format
+msgid "Vector map <%s> loaded (%d points)"
+msgstr ""
+
+#: ../lib/ogsf/trans.c:180
+msgid "Out of matrix stack space"
+msgstr ""
+
+#: ../lib/ogsf/trans.c:200
+msgid "Tried to pop an empty stack"
+msgstr ""
+
+#: ../lib/ogsf/GK2.c:219 ../lib/ogsf/gsd_img_ppm.c:53
+#: ../lib/ogsf/gsd_img_ppm.c:96 ../lib/ogsf/gsd_img_tif.c:64
+#, c-format
+msgid "Unable to open file <%s> for writing"
+msgstr ""
+
+#: ../lib/ogsf/GK2.c:275 ../lib/ogsf/GK2.c:288
+msgid "Check no. of frames requested and keyframes marked"
+msgstr ""
+
+#: ../lib/ogsf/gsds.c:109
+msgid "Maximum number of datasets exceeded"
+msgstr ""
+
+#: ../lib/ogsf/gsdrape.c:207
+msgid "Unable to process vector map - out of memory"
+msgstr ""
+
+#: ../lib/ogsf/gsd_label.c:58
+msgid "Max. number of labels reached!"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:73
+msgid "Unable to allocate stream"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:176
+msgid "Video codec not found"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:186
+msgid "Unable to open codec"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:205
+msgid "Unable to allocate picture"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:216
+msgid "Unable to allocate temporary picture"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:283
+msgid "Error while writing video frame"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:329
+#, c-format
+msgid "Opening MPEG stream <%s>..."
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:341
+msgid "Unable to deduce output format from file extension: using MPEG"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:349
+msgid "Unable to find suitable output format"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:356 ../lib/rst/interp_float/interp2d.c:119
+#: ../lib/rst/interp_float/interp2d.c:125
+#: ../lib/rst/interp_float/segmen2d.c:175
+#: ../lib/rst/interp_float/segmen2d.c:181
+#: ../lib/rst/interp_float/segmen2d.c:187
+#: ../lib/rst/interp_float/segmen2d.c:197 ../lib/vector/neta/spanningtree.c:99
+#: ../lib/vector/neta/flow.c:64 ../lib/vector/neta/flow.c:178
+#: ../lib/vector/neta/timetables.c:69 ../lib/vector/neta/timetables.c:168
+#: ../lib/vector/neta/timetables.c:178 ../lib/vector/neta/timetables.c:191
+#: ../lib/vector/neta/timetables.c:278 ../lib/vector/neta/timetables.c:413
+#: ../lib/vector/neta/timetables.c:425 ../lib/vector/neta/path.c:134
+#: ../lib/vector/neta/bridge.c:59 ../lib/vector/neta/centrality.c:63
+#: ../lib/vector/neta/centrality.c:145 ../lib/vector/neta/allpairs.c:50
+#: ../lib/vector/neta/articulation_point.c:60
+#: ../lib/vector/neta/components.c:46 ../lib/vector/neta/components.c:113
+#: ../lib/vector/Vlib/line.c:62
+msgid "Out of memory"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:380
+msgid "Invalid output format parameters"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:402
+#, c-format
+msgid "Unable to open <%s>"
+msgstr ""
+
+#: ../lib/ogsf/gsd_img_mpeg.c:415
+msgid "OGSF library has not been built with MPEG output support"
+msgstr ""
+
+#: ../lib/ogsf/gsd_prim.c:146
+#, c-format
+msgid "Color Material: %d"
+msgstr ""
+
+#: ../lib/ogsf/gsd_prim.c:630
+#, c-format
+msgid ""
+"gsd_rot(): %c is an invalid axis specification. Rotation ignored. Please "
+"advise GRASS developers of this error"
+msgstr ""
+
+#: ../lib/ogsf/GS2.c:1207
+#, c-format
+msgid "no category info"
+msgstr ""
+
+#: ../lib/ogsf/GS2.c:1226
+#, c-format
+msgid "no data"
+msgstr ""
+
+#: ../lib/ogsf/GS2.c:1651
+#, c-format
+msgid "Raster map <%s> is outside of current region. Load failed."
+msgstr ""
+
+#: ../lib/ogsf/GS2.c:1729 ../lib/ogsf/GS2.c:1735 ../lib/ogsf/GS2.c:1743
+#: ../lib/ogsf/GS2.c:1752 ../lib/ogsf/GS2.c:1760 ../lib/ogsf/GS2.c:1770
+#: ../lib/ogsf/GS2.c:1818
+msgid "GS_load_att_map(): Out of memory. Unable to load map"
+msgstr ""
+
+#: ../lib/ogsf/GS2.c:1846
+msgid "Loading failed"
+msgstr ""
+
+#: ../lib/ogsf/GS2.c:1850
+msgid "Error finding range"
+msgstr ""
+
+#: ../lib/ogsf/Gs3.c:133 ../lib/ogsf/Gs3.c:208 ../lib/ogsf/Gs3.c:366
+#: ../lib/ogsf/Gs3.c:482 ../lib/ogsf/Gs3.c:587
+msgid "Unable to allocate memory for a null buffer"
+msgstr ""
+
+#: ../lib/ogsf/Gs3.c:137 ../lib/ogsf/Gs3.c:212 ../lib/ogsf/Gs3.c:370
+#: ../lib/ogsf/Gs3.c:486 ../lib/ogsf/Gs3.c:577 ../lib/gpde/N_arrays_io.c:68
+#, c-format
+msgid "Unable to open raster map <%s>"
+msgstr ""
+
+#: ../lib/ogsf/Gs3.c:140 ../lib/ogsf/Gs3.c:215 ../lib/ogsf/Gs3.c:378
+#: ../lib/ogsf/Gs3.c:494 ../lib/ogsf/Gs3.c:590
+#, c-format
+msgid "Loading raster map <%s>..."
+msgstr ""
+
+#: ../lib/ogsf/Gs3.c:647
+#, c-format
+msgid "Color table range doesn't match data (mincol=%d, maxcol=%d"
+msgstr ""
+
+#: ../lib/ogsf/Gs3.c:709 ../lib/ogsf/Gs3.c:781
+#, c-format
+msgid "Translating colors from raster map <%s>..."
+msgstr ""
+
+#: ../lib/ogsf/Gs3.c:1020
+msgid "View not saved by this program,there may be some inconsistancies"
+msgstr ""
+
+#: ../lib/ogsf/gs_bm.c:124
+msgid "Bitmap mismatch"
+msgstr ""
+
+#: ../lib/ogsf/gsd_surf.c:1742
+msgid "Cut-plane points mis-match between surfaces. Check resolution(s)."
+msgstr ""
+
+#: ../lib/ogsf/gsd_legend.c:245
+#, c-format
+msgid "Unable to read color file of raster map <%s>"
+msgstr ""
+
+#: ../lib/ogsf/gsd_legend.c:251
+#, c-format
+msgid "Unable to read category file of raster map <%s>"
+msgstr ""
+
+#: ../lib/ogsf/gsd_legend.c:268
+#, c-format
+msgid "Unable to read fp range of raster map <%s>"
+msgstr ""
+
+#: ../lib/ogsf/gsd_legend.c:280
+#, c-format
+msgid "Unable to read range of raster map <%s>"
+msgstr ""
+
+#: ../lib/ogsf/gsd_legend.c:294
+msgid "Range request error for legend"
+msgstr ""
+
+#: ../lib/ogsf/gsd_legend.c:384
+msgid "Unable to show discrete FP range (use list"
+msgstr ""
+
+#: ../lib/ogsf/gsd_legend.c:500
+msgid "Too many categories to show as discrete!"
+msgstr ""
+
+#: ../lib/ogsf/gsd_legend.c:502
+msgid "Try using smaller font!"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:97
+#, c-format
+msgid "Reading raster map <%s> into memory"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:104
+msgid "Could not get raster row"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:162 ../lib/gpde/N_arrays_io.c:244
+msgid "Unable to close input map"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:191
+msgid "N_array_2d * array is empty"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:203
+#, c-format
+msgid "Unable to create raster map <%s>"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:212
+#, c-format
+msgid "Write 2d array to raster map <%s>"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:228 ../lib/gpde/N_arrays_io.c:233
+#: ../lib/gpde/N_arrays_io.c:238
+#, c-format
+msgid "Unable to write raster row %i"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:332
+#, c-format
+msgid "Read g3d map <%s> into the memory"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:387 ../lib/gpde/N_arrays_io.c:487
+msgid "Error closing g3d file"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:446
+#, c-format
+msgid "Error opening g3d map <%s>"
+msgstr ""
+
+#: ../lib/gpde/N_arrays_io.c:448
+#, c-format
+msgid "Write 3d array to g3d map <%s>"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_classic_iter.c:57
+#: ../lib/gpde/N_solvers_classic_iter.c:94 ../lib/gpde/N_solvers.c:55
+#: ../lib/gpde/N_solvers.c:93 ../lib/gpde/N_solvers.c:160
+#: ../lib/gpde/N_solvers_krylov.c:78 ../lib/gpde/N_solvers_krylov.c:255
+#: ../lib/gpde/N_solvers_krylov.c:423 ../lib/gpde/N_solvers_krylov.c:832
+msgid "The linear equation system is not quadratic"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_classic_iter.c:152
+#, c-format
+msgid "sparse Jacobi -- iteration %5i error %g\n"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_classic_iter.c:154
+#, c-format
+msgid "sparse SOR -- iteration %5i error %g\n"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_classic_iter.c:197
+#, c-format
+msgid "Jacobi -- iteration %5i error %g\n"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_classic_iter.c:235
+#, c-format
+msgid "SOR -- iteration %5i error %g\n"
+msgstr ""
+
+#: ../lib/gpde/test/test_main.c:49
+msgid "Choose the unit tests to run"
+msgstr ""
+
+#: ../lib/gpde/test/test_main.c:56
+msgid "Choose the integration tests to run"
+msgstr ""
+
+#: ../lib/gpde/test/test_main.c:61
+msgid "Run all unit tests"
+msgstr ""
+
+#: ../lib/gpde/test/test_main.c:65
+msgid "Run all integration tests"
+msgstr ""
+
+#: ../lib/gpde/test/test_main.c:69
+msgid "Run all unit and integration tests"
+msgstr ""
+
+#: ../lib/gpde/test/test_main.c:85
+msgid "test, gpde"
+msgstr ""
+
+#: ../lib/gpde/test/test_main.c:87
+msgid "Performs unit and integration tests for gpde library"
+msgstr ""
+
+#: ../lib/gpde/test/test_gwflow.c:43
+msgid ""
+"\n"
+"++ Running gwflow integration tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_gwflow.c:45
+msgid "\t 1. testing 2d gwflow"
+msgstr ""
+
+#: ../lib/gpde/test/test_gwflow.c:48
+msgid "\t 2. testing 3d gwflow"
+msgstr ""
+
+#: ../lib/gpde/test/test_gwflow.c:52
+msgid ""
+"\n"
+"-- gwflow integration tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_gwflow.c:54
+msgid ""
+"\n"
+"-- gwflow integration tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_arrays.c:48
+msgid ""
+"\n"
+"++ Running array unit tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_arrays.c:50
+msgid "\t 1. testing 2d arrays"
+msgstr ""
+
+#: ../lib/gpde/test/test_arrays.c:53
+msgid "\t 2. testing 3d arrays"
+msgstr ""
+
+#: ../lib/gpde/test/test_arrays.c:57
+msgid ""
+"\n"
+"-- Array unit tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_arrays.c:59
+msgid ""
+"\n"
+"-- Array unit tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_tools.c:34
+msgid ""
+"\n"
+"++ Running math tool unit tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_tools.c:39
+msgid ""
+"\n"
+"-- math tool unit tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_tools.c:41
+msgid ""
+"\n"
+"-- math tool unit tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_assemble.c:42
+msgid ""
+"\n"
+"++ Running assembling unit tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_assemble.c:44
+msgid "\t 1. testing 2d assembling"
+msgstr ""
+
+#: ../lib/gpde/test/test_assemble.c:47
+msgid "\t 2. testing 3d assembling"
+msgstr ""
+
+#: ../lib/gpde/test/test_assemble.c:51
+msgid ""
+"\n"
+"-- Assembling unit tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_assemble.c:53
+msgid ""
+"\n"
+"-- Assembling unit tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_heat.c:33
+msgid ""
+"\n"
+"++ Running heat flow integration tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_heat.c:35
+msgid "\t 1. testing 2d heat flow"
+msgstr ""
+
+#: ../lib/gpde/test/test_heat.c:37
+msgid "\t 2. testing 3d heat flow"
+msgstr ""
+
+#: ../lib/gpde/test/test_heat.c:40
+msgid ""
+"\n"
+"-- heat flow integration tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_heat.c:42
+msgid ""
+"\n"
+"-- heat flow integration tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_geom.c:36
+msgid ""
+"\n"
+"++ Running geom_data unit tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_geom.c:41
+msgid ""
+"\n"
+"-- geom_data unit tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_geom.c:43
+msgid ""
+"\n"
+"-- geom_data unit tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_gradient.c:42
+msgid ""
+"\n"
+"++ Running gradient unit tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_gradient.c:44
+msgid "\t 1. testing 2d gradient"
+msgstr ""
+
+#: ../lib/gpde/test/test_gradient.c:47
+msgid "\t 2. testing 3d gradient"
+msgstr ""
+
+#: ../lib/gpde/test/test_gradient.c:51
+msgid ""
+"\n"
+"-- Gradient unit tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_gradient.c:53
+msgid ""
+"\n"
+"-- Gradient unit tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_solvers.c:37
+msgid ""
+"\n"
+"++ Running solver unit tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_solvers.c:42
+msgid ""
+"\n"
+"-- Solver unit tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_solvers.c:44
+msgid ""
+"\n"
+"-- Solver unit tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_solute_transport.c:43
+msgid ""
+"\n"
+"++ Running solute_transport integration tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_solute_transport.c:45
+msgid "\t 1. testing 2d solute_transport"
+msgstr ""
+
+#: ../lib/gpde/test/test_solute_transport.c:48
+msgid "\t 2. testing 3d solute_transport"
+msgstr ""
+
+#: ../lib/gpde/test/test_solute_transport.c:52
+msgid ""
+"\n"
+"-- solute_transport integration tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_solute_transport.c:54
+msgid ""
+"\n"
+"-- solute_transport integration tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_les.c:34
+msgid ""
+"\n"
+"++ Running les creation unit tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_les.c:39
+msgid ""
+"\n"
+"-- les creation unit tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_les.c:41
+msgid ""
+"\n"
+"-- les creation unit tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_les.c:95
+msgid "\t * testing les creation in parallel\n"
+msgstr ""
+
+#: ../lib/gpde/test/test_les.c:126
+msgid "\t * testing les creation in serial\n"
+msgstr ""
+
+#: ../lib/gpde/N_parse_options.c:59
+msgid ""
+"The type of solver which should solve the symmetric linear equation system"
+msgstr ""
+
+#: ../lib/gpde/N_parse_options.c:71
+msgid "The type of solver which should solve the linear equation system"
+msgstr ""
+
+#: ../lib/gpde/N_parse_options.c:80
+msgid "Maximum number of iteration used to solver the linear equation system"
+msgstr ""
+
+#: ../lib/gpde/N_parse_options.c:89
+msgid ""
+"Error break criteria for iterative solvers (jacobi, sor, cg or bicgstab)"
+msgstr ""
+
+#: ../lib/gpde/N_parse_options.c:98
+msgid ""
+"The relaxation parameter used by the jacobi and sor solver for speedup or "
+"stabilizing"
+msgstr ""
+
+#: ../lib/gpde/N_parse_options.c:106
+msgid "The calculation time in seconds"
+msgstr ""
+
+#: ../lib/gpde/N_solvers.c:50
+msgid "The gauss elimination solver does not work with sparse matrices"
+msgstr ""
+
+#: ../lib/gpde/N_solvers.c:60
+msgid "Starting direct gauss elimination solver"
+msgstr ""
+
+#: ../lib/gpde/N_solvers.c:88
+msgid "The lu solver does not work with sparse matrices"
+msgstr ""
+
+#: ../lib/gpde/N_solvers.c:98
+msgid "Starting direct lu decomposition solver"
+msgstr ""
+
+#: ../lib/gpde/N_solvers.c:155
+msgid "The cholesky solver does not work with sparse matrices"
+msgstr ""
+
+#: ../lib/gpde/N_solvers.c:166 ../lib/gpde/N_solvers_krylov.c:84
+#: ../lib/gpde/N_solvers_krylov.c:261
+msgid "Matrix is not symmetric!"
+msgstr ""
+
+#: ../lib/gpde/N_solvers.c:170
+msgid "Starting cholesky decomposition solver"
+msgstr ""
+
+#: ../lib/gpde/N_solvers.c:173 ../lib/gpde/N_solvers_krylov.c:190
+#: ../lib/gpde/N_solvers_krylov.c:357 ../lib/gpde/N_solvers_krylov.c:481
+msgid "Unable to solve the linear equation system"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_krylov.c:198
+#, c-format
+msgid "Sparse PCG -- iteration %i error  %g\n"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_krylov.c:200
+#, c-format
+msgid "PCG -- iteration %i error  %g\n"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_krylov.c:365
+#, c-format
+msgid "Sparse CG -- iteration %i error  %g\n"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_krylov.c:367
+#, c-format
+msgid "CG -- iteration %i error  %g\n"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_krylov.c:530
+#, c-format
+msgid "Sparse BiCGStab -- iteration %i error  %g\n"
+msgstr ""
+
+#: ../lib/gpde/N_solvers_krylov.c:533
+#, c-format
+msgid "BiCGStab -- iteration %i error  %g\n"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:150
+#, c-format
+msgid "Invalid zone %s specified"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:230
+msgid "Unable to initialise PROJ.4 with the following parameter list:"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:238
+#, c-format
+msgid "The error message: %s"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:296
+msgid "Option input overflowed option table"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:327
+#, c-format
+msgid "Unable to initialize pj cause: %s"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:403
+msgid "Input Projection Parameters"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:406
+msgid "Input Unit Factor"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:416
+msgid "Output Projection Parameters"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:419
+msgid "Output Unit Factor"
+msgstr ""
+
+#: ../lib/proj/datum.c:250
+msgid "Unable to open temporary file"
+msgstr ""
+
+#: ../lib/proj/datum.c:344 ../lib/gis/get_projname.c:52
+#: ../lib/gis/get_datum_name.c:58 ../lib/gis/get_ell_name.c:45
+#, c-format
+msgid "Hit RETURN to cancel request\n"
+msgstr ""
+
+#: ../lib/proj/datum.c:418 ../lib/proj/datum.c:498
+#, c-format
+msgid "Unable to open datum table file <%s>"
+msgstr ""
+
+#: ../lib/proj/datum.c:431 ../lib/proj/datum.c:512
+#, c-format
+msgid "Error in datum table file <%s>, line %d"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:75
+#, c-format
+msgid "Invalid ellipsoid <%s> in file"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:98
+msgid "No secondary ellipsoid descriptor (rf, es or b) in file"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:102
+msgid "Invalid ellipsoid descriptors (a, rf, es or b) in file"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:115
+msgid "No ellipsoid info given in file"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:215 ../lib/gis/get_ellipse.c:283
+#, c-format
+msgid "Unable to open ellipsoid table file <%s>"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:268 ../lib/gis/get_ellipse.c:338
+#, c-format
+msgid "Line%s of ellipsoid table file <%s> is invalid"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:269 ../lib/gis/get_ellipse.c:336
+#, c-format
+msgid "Lines%s of ellipsoid table file <%s> are invalid"
+msgstr ""
+
+#: ../lib/proj/convert.c:110
+msgid "Unable parse GRASS PROJ_INFO file"
+msgstr ""
+
+#: ../lib/proj/convert.c:115
+msgid "Unable get PROJ.4-style parameter string"
+msgstr ""
+
+#: ../lib/proj/convert.c:127
+#, c-format
+msgid ""
+"OGR can't parse PROJ.4-style parameter string: %s (OGR Error code was %d)"
+msgstr ""
+
+#: ../lib/proj/convert.c:133
+#, c-format
+msgid "OGR can't get WKT-style parameter string (OGR Error code was %d)"
+msgstr ""
+
+#: ../lib/proj/convert.c:390
+msgid "No projection name! Projection parameters likely to be meaningless."
+msgstr ""
+
+#: ../lib/proj/convert.c:426
+#, c-format
+msgid "Datum <%s> not recognised by GRASS and no parameters found"
+msgstr ""
+
+#: ../lib/proj/convert.c:442
+#, c-format
+msgid ""
+"Datum <%s> apparently recognised by GRASS but no parameters found. You may "
+"want to look into this."
+msgstr ""
+
+#: ../lib/proj/convert.c:446
+#, c-format
+msgid ""
+"Invalid transformation number %d; valid range is 1 to %d. Leaving datum "
+"transform parameters unspecified."
+msgstr ""
+
+#: ../lib/proj/do_proj.c:106 ../lib/proj/do_proj.c:180
+#, c-format
+msgid "pj_transform() failed: %s"
+msgstr ""
+
+#: ../lib/nviz/position.c:56
+msgid "Unable to set focus"
+msgstr ""
+
+#: ../lib/nviz/render.c:105
+msgid "Bad server connection"
+msgstr ""
+
+#: ../lib/nviz/render.c:114
+msgid "Unable to create rendering context"
+msgstr ""
+
+#: ../lib/nviz/nviz.c:126
+#, c-format
+msgid "Invalid color (%s), using \"white\" as default"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:59
+msgid "Maximum surfaces loaded!"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:88
+msgid "Maximum vector line maps loaded!"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:97 ../lib/nviz/map_obj.c:128
+#, c-format
+msgid "Error loading vector map <%s>"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:116
+msgid "Maximum vector point maps loaded!"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:143
+msgid "Maximum volumes loaded!"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:152
+#, c-format
+msgid "Error loading 3d raster map <%s>"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:160
+msgid "Nviz_new_map_obj(): unsupported data type"
+msgstr ""
+
+#: ../lib/nviz/lights.c:171
+msgid "Unable to define new light"
+msgstr ""
+
+#: ../lib/sites/sites.c:97
+#, c-format
+msgid "Attributes for category %d not found"
+msgstr ""
+
+#: ../lib/sites/sites.c:136
+msgid "Category must be integer"
+msgstr ""
+
+#: ../lib/sites/sites.c:210
+msgid "Memory error in writing timestamp"
+msgstr ""
+
+#: ../lib/sites/sites.c:212
+msgid "Illegal TimeStamp string"
+msgstr ""
+
+#: ../lib/sites/sites.c:241
+msgid "Memory error in allocating timestamp"
+msgstr ""
+
+#: ../lib/sites/sites.c:348 ../lib/sites/sites.c:478
+msgid ""
+"Dev note: Adapted sites library used for vector points. (module should be "
+"updated to GRASS 6 vector library)"
+msgstr ""
+
+#: ../lib/sites/sites.c:372 ../lib/db/dbmi_client/copy_tab.c:105
+#: ../lib/db/dbmi_client/copy_tab.c:126 ../lib/db/dbmi_client/db.c:46
+#: ../lib/db/dbmi_client/delete_tab.c:49 ../lib/rst/interp_float/vinput2d.c:88
+#: ../lib/vector/neta/timetables.c:133 ../lib/vector/neta/utils.c:116
+#: ../lib/vector/Vlib/map.c:271 ../lib/vector/Vlib/map.c:405
+#: ../lib/vector/Vlib/map.c:621 ../lib/vector/Vlib/array.c:284
+#: ../lib/vector/Vlib/net.c:186 ../lib/vector/Vlib/net.c:356
+#, c-format
+msgid "Unable to open database <%s> by driver <%s>"
+msgstr ""
+
+#: ../lib/sites/sites.c:381 ../lib/db/dbmi_client/table.c:110
+#: ../lib/db/dbmi_client/copy_tab.c:199 ../lib/db/dbmi_client/copy_tab.c:276
+#, c-format
+msgid "Unable to open select cursor: '%s'"
+msgstr ""
+
+#: ../lib/sites/sites.c:397
+msgid "Cannot fetch row"
+msgstr ""
+
+#: ../lib/sites/sites.c:579
+msgid "G_oldsite_new_struct: invalid # dims or fields"
+msgstr ""
+
+#: ../lib/sites/sites.c:1249
+#, c-format
+msgid "Cannot open database %s by driver %s"
+msgstr ""
+
+#: ../lib/sites/sites.c:1257
+msgid "Cannot select attributes"
+msgstr ""
+
+#: ../lib/db/dbmi_base/legal_dbname.c:25
+#, c-format
+msgid "Illegal table map name <%s>. May not contain '.' or 'NULL'.\n"
+msgstr ""
+
+#: ../lib/db/dbmi_base/legal_dbname.c:33
+#, c-format
+msgid "Illegal table map name <%s>. Must start with a letter.\n"
+msgstr ""
+
+#: ../lib/db/dbmi_base/legal_dbname.c:43
+#, c-format
+msgid "Illegal table map name <%s>. Character <%c> not allowed.\n"
+msgstr ""
+
+#: ../lib/db/dbmi_base/login.c:98
+msgid "Login file corrupted"
+msgstr ""
+
+#: ../lib/db/dbmi_base/default_name.c:127
+msgid "Programmer error"
+msgstr ""
+
+#: ../lib/db/dbmi_client/table.c:46
+#, c-format
+msgid "Unable open database <%s> by driver <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:100 ../lib/db/dbmi_client/copy_tab.c:120
+#: ../lib/db/dbmi_client/db.c:41
+#, c-format
+msgid "Unable to start driver <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:144
+#, c-format
+msgid "Unable to get list tables in database <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:157
+#, c-format
+msgid "Table <%s> already exists in database <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:231
+#, c-format
+msgid "Column <%s> is not integer"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:248 ../lib/rst/interp_float/vinput2d.c:94
+#: ../lib/rst/interp_float/vinput2d.c:108
+#, c-format
+msgid "Column <%s> not found"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:251
+#, c-format
+msgid "Unable to create table <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:295
+#, c-format
+msgid "Unable to fetch data from table <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:351
+#, c-format
+msgid "Unknown column type (column <%s>)"
+msgstr ""
+
+#: ../lib/db/dbmi_client/column.c:114
+#, c-format
+msgid "Unable to describe table <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/select.c:119 ../lib/db/dbmi_client/select.c:221
+#: ../lib/db/dbmi_client/select.c:288
+msgid "Missing column name"
+msgstr ""
+
+#: ../lib/db/dbmi_client/select.c:216 ../lib/db/dbmi_client/select.c:283
+msgid "Missing key column name"
+msgstr ""
+
+#: ../lib/db/dbmi_client/select.c:317
+#, c-format
+msgid "Unable select records from table <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/select.c:333
+msgid "Key column type is not integer"
+msgstr ""
+
+#: ../lib/db/dbmi_client/delete_tab.c:44
+#, c-format
+msgid "Unable to open driver <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/delete_tab.c:62
+#, c-format
+msgid "Unable to drop table: '%s'"
+msgstr ""
+
+#: ../lib/cairodriver/Draw_bitmap.c:47
+msgid "Cairo_draw_bitmap: Failed to create source"
+msgstr ""
+
+#: ../lib/init/lock.c:38
+#, c-format
+msgid "Usage: %s file pid"
+msgstr ""
+
+#: ../lib/init/lock.c:42
+msgid "Concurrent mapset locking is not supported on Windows"
+msgstr ""
+
+#: ../lib/init/lock.c:60
+#, c-format
+msgid "Unable to write lockfile %s (disk full? Permissions?)"
+msgstr ""
+
+#: ../lib/display/tran_colr.c:129 ../lib/display/tran_colr.c:131
+#, c-format
+msgid "[%s]: No such color"
+msgstr ""
+
+#: ../lib/symbol/read.c:211
+#, c-format
+msgid "Cannot read symbol line coordinates: %s"
+msgstr ""
+
+#: ../lib/symbol/read.c:259
+#, c-format
+msgid ""
+"Incorrect symbol name: '%s' (should be: group/name or group/name at mapset)"
+msgstr ""
+
+#: ../lib/symbol/read.c:283
+#, c-format
+msgid "Cannot find/open symbol: '%s'"
+msgstr ""
+
+#: ../lib/symbol/read.c:388 ../lib/symbol/read.c:406 ../lib/symbol/read.c:416
+#: ../lib/symbol/read.c:434
+#, c-format
+msgid "Incorrect symbol color: '%s', using default."
+msgstr ""
+
+#: ../lib/driver/main.c:90
+#, c-format
+msgid "Graphics driver [%s] started"
+msgstr ""
+
+#: ../lib/driver/parse_ftcap.c:32
+#, c-format
+msgid "%s: Unable to read font definition file; use the default"
+msgstr ""
+
+#: ../lib/driver/parse_ftcap.c:38
+#, c-format
+msgid "%s: No font definition file"
+msgstr ""
+
+#: ../lib/driver/command.c:508
+#, c-format
+msgid "Unknown command: %d last: %d"
+msgstr ""
+
+#: ../lib/driver/command.c:547
+msgid "Monitor: get_command: Premature EOF"
+msgstr ""
+
+#: ../lib/vask/V_support.c:60
+#, c-format
+msgid "Unable to open file %s"
+msgstr ""
+
+#: ../lib/gmath/del2g.c:50
+msgid "    taking FFT of image..."
+msgstr ""
+
+#: ../lib/gmath/del2g.c:56
+msgid "    computing del**2 g..."
+msgstr ""
+
+#: ../lib/gmath/del2g.c:59
+msgid "    taking FFT of del**2 g..."
+msgstr ""
+
+#: ../lib/gmath/del2g.c:63
+msgid "    multiplying transforms..."
+msgstr ""
+
+#: ../lib/gmath/del2g.c:66
+msgid "    taking inverse FFT..."
+msgstr ""
+
+#: ../lib/gmath/la.c:60 ../lib/gmath/la.c:116
+msgid "Matrix dimensions out of range"
+msgstr ""
+
+#: ../lib/gmath/la.c:149
+msgid "Matrix is not initialised fully."
+msgstr ""
+
+#: ../lib/gmath/la.c:154
+msgid "Unable to allocate space for matrix copy"
+msgstr ""
+
+#: ../lib/gmath/la.c:243
+msgid "First scalar multiplier must be non-zero"
+msgstr ""
+
+#: ../lib/gmath/la.c:249 ../lib/gmath/la.c:257 ../lib/gmath/la.c:322
+msgid "One or both input matrices uninitialised"
+msgstr ""
+
+#: ../lib/gmath/la.c:262 ../lib/gmath/la.c:327
+msgid "Matrix order does not match"
+msgstr ""
+
+#: ../lib/gmath/la.c:268
+msgid "Unable to allocate space for matrix sum"
+msgstr ""
+
+#: ../lib/gmath/la.c:332
+msgid "Unable to allocate space for matrix product"
+msgstr ""
+
+#: ../lib/gmath/la.c:444
+msgid "Input: one or both data matrices uninitialised"
+msgstr ""
+
+#: ../lib/gmath/la.c:449
+msgid "Principal matrix is not properly dimensioned"
+msgstr ""
+
+#: ../lib/gmath/la.c:454
+msgid "Input: you must have at least one array to solve"
+msgstr ""
+
+#: ../lib/gmath/la.c:460
+msgid "Could not allocate space for solution matrix"
+msgstr ""
+
+#: ../lib/gmath/la.c:466 ../lib/gmath/la.c:474
+msgid "Could not allocate space for working matrix"
+msgstr ""
+
+#: ../lib/gmath/la.c:527
+msgid "Matrix (or submatrix is singular). Solution undetermined"
+msgstr ""
+
+#: ../lib/gmath/la.c:531
+msgid "Problem in LA routine."
+msgstr ""
+
+#: ../lib/gmath/la.c:538
+msgid "Procedure not yet available for selected matrix type"
+msgstr ""
+
+#: ../lib/gmath/la.c:572
+msgid "Matrix is not square. Cannot determine inverse"
+msgstr ""
+
+#: ../lib/gmath/la.c:577
+msgid "Unable to allocate space for matrix"
+msgstr ""
+
+#: ../lib/gmath/la.c:594
+msgid "Matrix is singular"
+msgstr ""
+
+#: ../lib/gmath/la.c:599
+msgid "Problem in LA procedure."
+msgstr ""
+
+#: ../lib/gmath/la.c:687
+msgid "Element array has not been allocated"
+msgstr ""
+
+#: ../lib/gmath/la.c:692
+msgid "Specified element is outside array bounds"
+msgstr ""
+
+#: ../lib/gmath/la.c:746
+msgid "Specified matrix column index is outside range"
+msgstr ""
+
+#: ../lib/gmath/la.c:751 ../lib/gmath/la.c:792 ../lib/gmath/la.c:1105
+#: ../lib/gmath/la.c:1157 ../lib/gmath/la.c:1232
+msgid "Matrix is not initialised"
+msgstr ""
+
+#: ../lib/gmath/la.c:756 ../lib/gmath/la.c:797
+msgid "Could not allocate space for vector structure"
+msgstr ""
+
+#: ../lib/gmath/la.c:787
+msgid "Specified matrix row index is outside range"
+msgstr ""
+
+#: ../lib/gmath/la.c:827
+msgid "Specified row index is outside range"
+msgstr ""
+
+#: ../lib/gmath/la.c:832
+msgid "Specified column index is outside range"
+msgstr ""
+
+#: ../lib/gmath/la.c:852
+msgid "Unknown vector type."
+msgstr ""
+
+#: ../lib/gmath/la.c:977
+msgid "Output vector is uninitialized"
+msgstr ""
+
+#: ../lib/gmath/la.c:982
+msgid "Vectors are not of the same type"
+msgstr ""
+
+#: ../lib/gmath/la.c:987
+msgid "Output vector is of incorrect type"
+msgstr ""
+
+#: ../lib/gmath/la.c:992
+msgid "Matrices not allowed"
+msgstr ""
+
+#: ../lib/gmath/la.c:998
+msgid "Vectors have differing dimensions"
+msgstr ""
+
+#: ../lib/gmath/la.c:1004
+msgid "Output vector has incorrect dimension"
+msgstr ""
+
+#: ../lib/gmath/la.c:1050
+msgid "Vector dimensions out of range"
+msgstr ""
+
+#: ../lib/gmath/la.c:1055
+msgid "Row/column out of range"
+msgstr ""
+
+#: ../lib/gmath/la.c:1270
+msgid "Vector structure is not initialised"
+msgstr ""
+
+#: ../lib/gmath/la.c:1391 ../lib/gmath/la.c:1399 ../lib/gmath/la.c:1404
+msgid "Input format error"
+msgstr ""
+
+#: ../lib/g3d/g3dhistory.c:42 ../lib/gis/history.c:132
+#, c-format
+msgid "can't get history information for [%s] in mapset [%s]"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:20
+msgid "G3d_openCellOldNoHeader: error in G3d_maskOpenOld"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:26
+msgid "G3d_openCellOldNoHeader: error in G3d_malloc"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:45
+msgid "G3d_openCellOldNoHeader: error in G_open_old"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:99
+msgid "G3d_openCellOld: error in G3d_openCellOldNoHeader"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:104
+msgid "G3d_openCellOld: can't rewind file"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:116
+msgid "G3d_openCellOld: error in G3d_readHeader"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:124
+msgid "G3d_openCellOld: projection does not match window projection"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:128
+msgid "G3d_openCellOld: zone does not match window zone"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:140 ../lib/g3d/g3dopen.c:157
+msgid "G3d_openCellOld: can't read header"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:146
+msgid "G3d_openCellOld: index does not fit into long"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:150
+msgid "G3d_openCellOld: error in G3d_malloc"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:176
+msgid "G3d_openCellOld: error in G3d_fillHeader"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:223
+msgid "G3d_openCellNew: error in G3d_maskOpenOld"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:232
+msgid "G3d_openCellNew: error in G3d_malloc"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:245
+msgid "G3d_openCellNew: could not open file"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:290 ../lib/g3d/g3dopen.c:295
+msgid "G3d_openCellNew: can't write header"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:318
+msgid "G3d_openCellNew: error in G3d_fillHeader"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:52
+msgid "Data type used in the output file"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:61
+msgid "Precision used in the output file (default, max, or 0 to 52)"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:71
+msgid "The compression method used in the output file"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:81
+msgid "The dimensions of the tiles used in the output file"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:116
+msgid "G3d_getStandard3dParams: precision value invalid"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:149
+msgid "G3d_getStandard3dParams: tile dimension value invalid"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:173
+msgid "Window replacing the default"
+msgstr ""
+
+#: ../lib/gis/debug.c:74
+#, c-format
+msgid "Cannot open debug file '%s'"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:31
+#, c-format
+msgid "%s not found"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:34
+#, c-format
+msgid "ERROR in reading %s"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:38 ../lib/gis/get_datum_name.c:69
+#: ../lib/gis/get_ell_name.c:31
+msgid "Cannot open temp file"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:49
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Please specify projection name\n"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:51
+#, c-format
+msgid "Enter 'list' for the list of available projections\n"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:74
+#, c-format
+msgid ""
+"\n"
+"invalid projection\n"
+msgstr ""
+
+#: ../lib/gis/proj2.c:46
+msgid "Latitude-Longitude"
+msgstr ""
+
+#: ../lib/gis/proj2.c:48
+msgid "Other Projection"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:110
+msgid "syntax error"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:112
+msgid "R/G/B not in range 0-255"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:114
+msgid "invalid color name"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:116
+msgid "percentage not in range 0-100"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:118
+msgid "invalid value"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:120
+msgid "unknown error"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:151
+#, c-format
+msgid "bad rule (%s): [%s]"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:265
+#, c-format
+msgid "Unable to load color rules <%s>"
+msgstr ""
+
+#: ../lib/gis/seek.c:52 ../lib/gis/seek.c:58
+msgid "Unable to seek"
+msgstr ""
+
+#: ../lib/gis/seek.c:56
+msgid "Seek offset out of range"
+msgstr ""
+
+#: ../lib/gis/color_read.c:116
+#, c-format
+msgid "color support for [%s] in mapset [%s] %s"
+msgstr ""
+
+#: ../lib/gis/put_title.c:29
+#, c-format
+msgid "category information for [%s] in [%s] missing or invalid"
+msgstr ""
+
+#: ../lib/gis/put_title.c:39
+#, c-format
+msgid "G_put_title - can't create a temp file"
+msgstr ""
+
+#: ../lib/gis/put_title.c:56
+#, c-format
+msgid "category information for [%s] in [%s] invalid"
+msgstr ""
+
+#: ../lib/gis/put_title.c:64
+#, c-format
+msgid "G_put_title - can't reopen temp file"
+msgstr ""
+
+#: ../lib/gis/put_title.c:72
+#, c-format
+msgid "can't write category information for [%s] in [%s]"
+msgstr ""
+
+#: ../lib/gis/get_row.c:46 ../lib/gis/get_row.c:1049
+#, c-format
+msgid "Reading raster map <%s@%s> request for row %d is outside region"
+msgstr ""
+
+#: ../lib/gis/get_row.c:324
+#, c-format
+msgid "cell_values_float: xdr_float failed for index %d"
+msgstr ""
+
+#: ../lib/gis/get_row.c:365
+#, c-format
+msgid "cell_values_double: xdr_double failed for index %d"
+msgstr ""
+
+#: ../lib/gis/get_row.c:621
+#, c-format
+msgid "Error reading compressed map <%s@%s>, row %d"
+msgstr ""
+
+#: ../lib/gis/get_row.c:624
+#, c-format
+msgid "Error reading map <%s@%s>, row %d"
+msgstr ""
+
+#: ../lib/gis/get_row.c:1031 ../lib/gis/get_row.c:1036
+#, c-format
+msgid "Error reading null row %d"
+msgstr ""
+
+#: ../lib/gis/get_row.c:1115
+msgid "Unable to realloc buffer"
+msgstr ""
+
+#: ../lib/gis/gisinit.c:54 ../lib/gis/gisinit.c:90
+msgid ""
+"Incompatible library version for module. You need to rebuild GRASS or "
+"untangle multiple installations."
+msgstr ""
+
+#: ../lib/gis/gisinit.c:63
+#, c-format
+msgid "MAPSET %s - permission denied"
+msgstr ""
+
+#: ../lib/gis/gisinit.c:66
+#, c-format
+msgid "MAPSET %s not found at %s"
+msgstr ""
+
+#: ../lib/gis/gisinit.c:110
+msgid "System not initialized. Programmer forgot to call G_gisinit()."
+msgstr ""
+
+#: ../lib/gis/mapset_msc.c:60
+#, c-format
+msgid "Unable to make mapset element %s (%s): %s"
+msgstr ""
+
+#: ../lib/gis/mapset_msc.c:64
+#, c-format
+msgid "Unable to access mapset element %s (%s): %s"
+msgstr ""
+
+#: ../lib/gis/reclass.c:145
+#, c-format
+msgid "Too many reclass categories for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/reclass.c:148
+#, c-format
+msgid "Illegal reclass format in header file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/reclass.c:238
+msgid "Illegal reclass request"
+msgstr ""
+
+#: ../lib/gis/reclass.c:243
+msgid "Illegal reclass type"
+msgstr ""
+
+#: ../lib/gis/reclass.c:249
+#, c-format
+msgid "Unable to create header file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/reclass.c:297
+#, c-format
+msgid "Unable to create dependency file in [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/put_cellhd.c:26
+#, c-format
+msgid "Unable to create header file for [%s]"
+msgstr ""
+
+#: ../lib/gis/ls.c:96
+#, c-format
+msgid "Unable to open directory %s"
+msgstr ""
+
+#: ../lib/gis/datum.c:160
+#, c-format
+msgid "unable to open datum table file: %s"
+msgstr ""
+
+#: ../lib/gis/datum.c:181
+#, c-format
+msgid "error in datum table file, line %d"
+msgstr ""
+
+#: ../lib/gis/ask.c:341
+msgid "to cancel request"
+msgstr ""
+
+#: ../lib/gis/ask.c:390
+#, c-format
+msgid "Enter a new %s file name"
+msgstr ""
+
+#: ../lib/gis/ask.c:396
+#, c-format
+msgid "Enter the name of an existing %s file"
+msgstr ""
+
+#: ../lib/gis/ask.c:401
+#, c-format
+msgid "Enter %s file name"
+msgstr ""
+
+#: ../lib/gis/ask.c:421
+#, c-format
+msgid "Enter 'list' for a list of existing %s files\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:424
+#, c-format
+msgid "Enter 'list -f' for "
+msgstr ""
+
+#: ../lib/gis/ask.c:426
+#, c-format
+msgid "a list %s"
+msgstr ""
+
+#: ../lib/gis/ask.c:428
+#, c-format
+msgid "an extended list"
+msgstr ""
+
+#: ../lib/gis/ask.c:432
+#, c-format
+msgid "Hit RETURN %s\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:452 ../lib/gis/ask.c:557 ../lib/gis/ask.c:577
+#, c-format
+msgid ""
+"\n"
+"** %s - not found **\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:459 ../lib/gis/ask.c:544
+#, c-format
+msgid ""
+"\n"
+"** %s exists. ok to overwrite? "
+msgstr ""
+
+#: ../lib/gis/ask.c:506
+#, c-format
+msgid ""
+"\n"
+"**<%s> illegal name **\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:518
+#, c-format
+msgid ""
+"\n"
+"** %s - illegal request **\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:533
+#, c-format
+msgid ""
+"\n"
+"** %s - exists, select another name **\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:561
+msgid "ask: can't happen"
+msgstr ""
+
+#: ../lib/gis/cats.c:381
+#, c-format
+msgid "category support for [%s] in mapset [%s] %s"
+msgstr ""
+
+#: ../lib/gis/cats.c:417
+#, c-format
+msgid "category support for vector map [%s] in mapset [%s] %s"
+msgstr ""
+
+#: ../lib/gis/quant_rw.c:206
+#, c-format
+msgid "Cannot write quant rules: map %s is integer"
+msgstr ""
+
+#: ../lib/gis/quant_rw.c:215
+#, c-format
+msgid "Cannot write quant rules for map %s"
+msgstr ""
+
+#: ../lib/gis/unix_socks.c:102
+msgid "Unable to get GIS_LOCK environment variable value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:47 ../lib/gis/adj_cellhd.c:199
+msgid "Illegal n-s resolution value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:51 ../lib/gis/adj_cellhd.c:205
+msgid "Illegal row value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:55 ../lib/gis/adj_cellhd.c:211
+msgid "Illegal e-w resolution value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:59 ../lib/gis/adj_cellhd.c:217
+msgid "Illegal col value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:79 ../lib/gis/adj_cellhd.c:247
+#, c-format
+msgid "Fixing subtle input data rounding error of north boundary (%g>%g)"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:84 ../lib/gis/adj_cellhd.c:252
+msgid "Illegal latitude for North"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:90 ../lib/gis/adj_cellhd.c:258
+#, c-format
+msgid "Fixing subtle input data rounding error of south boundary (%g>%g)"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:95 ../lib/gis/adj_cellhd.c:263
+msgid "Illegal latitude for South"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:107 ../lib/gis/adj_cellhd.c:275
+#, c-format
+msgid "Fixing subtle input data rounding error of west boundary (%g>%g)"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:118 ../lib/gis/adj_cellhd.c:286
+#, c-format
+msgid "Fixing subtle input data rounding error of east boundary (%g>%g)"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:131 ../lib/gis/adj_cellhd.c:299
+msgid "North must be north of South"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:133 ../lib/gis/adj_cellhd.c:301
+msgid "North must be larger than South"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:136 ../lib/gis/adj_cellhd.c:304
+msgid "East must be larger than West"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:155 ../lib/gis/adj_cellhd.c:348
+msgid "Invalid coordinates"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:201
+msgid "Illegal n-s3 resolution value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:207
+msgid "Illegal row3 value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:213
+msgid "Illegal e-w3 resolution value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:219
+msgid "Illegal col3 value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:223
+msgid "Illegal t-b3 resolution value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:227
+msgid "Illegal depths value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:306
+msgid "Top must be larger than Bottom"
+msgstr ""
+
+#: ../lib/gis/set_window.c:76
+msgid ""
+"G_set_window(): projection/zone differs from that of currently open raster "
+"maps"
+msgstr ""
+
+#: ../lib/gis/home.c:39
+msgid "unable to determine user's home directory"
+msgstr ""
+
+#: ../lib/gis/null_val.c:91
+msgid "EmbedGivenNulls: wrong data type!"
+msgstr ""
+
+#: ../lib/gis/null_val.c:112
+msgid "Null values have not been initialized. "
+msgstr ""
+
+#: ../lib/gis/null_val.c:113
+msgid "G_gisinit() must be called first. "
+msgstr ""
+
+#: ../lib/gis/null_val.c:114
+msgid "Please advise GRASS developers of this error.\n"
+msgstr ""
+
+#: ../lib/gis/null_val.c:223
+msgid "G_set_null_value: wrong data type!"
+msgstr ""
+
+#: ../lib/gis/proj3.c:64 ../lib/vector/Vlib/header.c:512
+msgid "Unknown projection"
+msgstr ""
+
+#: ../lib/gis/view.c:177
+#, c-format
+msgid "Unable to open %s for writing"
+msgstr ""
+
+#: ../lib/gis/view.c:263 ../lib/gis/view.c:480
+#, c-format
+msgid "Unable to open %s for reading"
+msgstr ""
+
+#: ../lib/gis/view.c:466
+#, c-format
+msgid "GRASS window when view was saved:\n"
+msgstr ""
+
+#: ../lib/gis/view.c:546
+#, c-format
+msgid " Window saved in \"%s\" is completely outside of current GRASS window."
+msgstr ""
+
+#: ../lib/gis/view.c:550
+#, c-format
+msgid ""
+" Only %d%% of window saved in \"%s\" overlaps with current GRASS window."
+msgstr ""
+
+#: ../lib/gis/error.c:257
+msgid "WARNING: "
+msgstr ""
+
+#: ../lib/gis/error.c:258
+msgid "ERROR: "
+msgstr ""
+
+#: ../lib/gis/legal_name.c:39
+#, c-format
+msgid "Illegal filename.  Cannot be '.' or 'NULL'\n"
+msgstr ""
+
+#: ../lib/gis/legal_name.c:47
+#, c-format
+msgid "Illegal filename. Character <%c> not allowed.\n"
+msgstr ""
+
+#: ../lib/gis/legal_name.c:77 ../lib/gis/legal_name.c:81
+#, c-format
+msgid "Output raster map name <%s> is not valid map name"
+msgstr ""
+
+#: ../lib/gis/legal_name.c:118 ../lib/gis/legal_name.c:122
+#, c-format
+msgid "Output raster map <%s> is used as input"
+msgstr ""
+
+#: ../lib/gis/mask_info.c:40
+#, c-format
+msgid "<%s> in mapset <%s>"
+msgstr ""
+
+#: ../lib/gis/mask_info.c:43
+msgid "none"
+msgstr ""
+
+#: ../lib/gis/mask_info.c:46
+msgid "not known"
+msgstr ""
+
+#: ../lib/gis/spawn.c:385
+#, c-format
+msgid "CreateProcess() failed: error = %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:416
+#, c-format
+msgid "G_spawn: unable to redirect descriptor %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:424 ../lib/gis/spawn.c:609
+#, c-format
+msgid "G_spawn: unable to open file %s"
+msgstr ""
+
+#: ../lib/gis/spawn.c:493 ../lib/gis/spawn.c:679
+msgid "Unable to execute command"
+msgstr ""
+
+#: ../lib/gis/spawn.c:518 ../lib/gis/spawn.c:526
+#, c-format
+msgid "G_spawn: unable to restore signal %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:557
+#, c-format
+msgid "G_spawn: unable to reset signal %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:566
+#, c-format
+msgid "G_spawn: unable to ignore signal %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:577
+#, c-format
+msgid "G_spawn: unable to block signal %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:585
+#, c-format
+msgid "G_spawn: unable to unblock signal %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:614 ../lib/gis/spawn.c:623
+#, c-format
+msgid "G_spawn: unable to duplicate descriptor %d to %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:656
+msgid "Unable to create a new process"
+msgstr ""
+
+#: ../lib/gis/spawn.c:671
+#, c-format
+msgid "Unable to change directory to %s"
+msgstr ""
+
+#: ../lib/gis/system.c:85
+msgid "Can not create a new process!"
+msgstr ""
+
+#: ../lib/gis/alloc.c:42 ../lib/gis/alloc.c:82 ../lib/gis/alloc.c:125
+#, c-format
+msgid "Current region rows: %d, cols: %d"
+msgstr ""
+
+#: ../lib/gis/alloc.c:45
+#, c-format
+msgid "G_malloc: unable to allocate %lu bytes of memory at %s:%d"
+msgstr ""
+
+#: ../lib/gis/alloc.c:85
+#, c-format
+msgid "G_calloc: unable to allocate %lu * %lu bytes of memory at %s:%d"
+msgstr ""
+
+#: ../lib/gis/alloc.c:128
+#, c-format
+msgid "G_realloc: unable to allocate %lu bytes of memory at %s:%d"
+msgstr ""
+
+#: ../lib/gis/sample.c:71
+msgid "Unknown interpolation type"
+msgstr ""
+
+#: ../lib/gis/sample.c:284
+msgid "\"no data\" label found; setting to zero"
+msgstr ""
+
+#: ../lib/gis/sample.c:299
+msgid "Problem reading raster map"
+msgstr ""
+
+#: ../lib/gis/done_msg.c:38
+#, c-format
+msgid "%s complete. %s"
+msgstr ""
+
+#: ../lib/gis/env.c:242
+msgid "GISRC - variable not set"
+msgstr ""
+
+#: ../lib/gis/env.c:274
+#, c-format
+msgid "G_getenv(): Variable %s not set"
+msgstr ""
+
+#: ../lib/gis/env.c:300
+#, c-format
+msgid "%s not set"
+msgstr ""
+
+#: ../lib/gis/put_row.c:215
+#, c-format
+msgid "G_put_map_row: %s is not integer! Use G_put_[f/d]_raster_row()!"
+msgstr ""
+
+#: ../lib/gis/put_row.c:251
+#, c-format
+msgid "%s: map [%s] not open for write - request ignored"
+msgstr ""
+
+#: ../lib/gis/put_row.c:259
+#, c-format
+msgid "%s: map [%s] not open for random write - request ignored"
+msgstr ""
+
+#: ../lib/gis/put_row.c:266
+#, c-format
+msgid "%s: map [%s] not open for sequential write - request ignored"
+msgstr ""
+
+#: ../lib/gis/put_row.c:270
+#, c-format
+msgid "%s: unopened file descriptor - request ignored"
+msgstr ""
+
+#: ../lib/gis/put_row.c:310
+#, c-format
+msgid "map [%s] - unable to write row %d"
+msgstr ""
+
+#: ../lib/gis/put_row.c:393
+#, c-format
+msgid "xdr_float failed for index %d of row %d"
+msgstr ""
+
+#: ../lib/gis/put_row.c:419
+#, c-format
+msgid "xdr_double failed for index %d of row %d"
+msgstr ""
+
+#: ../lib/gis/put_row.c:754
+#, c-format
+msgid "unable to find a temporary null file %s"
+msgstr ""
+
+#: ../lib/gis/put_row.c:776 ../lib/gis/put_row.c:781
+#, c-format
+msgid "error writing null row %d"
+msgstr ""
+
+#: ../lib/gis/range.c:192
+#, c-format
+msgid "can't read f_range file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/range.c:308
+#, c-format
+msgid "can't read range file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/range.c:359 ../lib/gis/range.c:412
+#, c-format
+msgid "can't write range file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/list.c:114
+#, c-format
+msgid "no %s files available in current mapset\n"
+msgstr ""
+
+#: ../lib/gis/list.c:117
+#, c-format
+msgid "no %s files available in mapset <%s>\n"
+msgstr ""
+
+#: ../lib/gis/list.c:132
+#, c-format
+msgid "hit RETURN to continue -->"
+msgstr ""
+
+#: ../lib/gis/list.c:183
+#, c-format
+msgid "%s files available in mapset <%s>:\n"
+msgstr ""
+
+#: ../lib/gis/list.c:254
+msgid "G_list: Unknown element type"
+msgstr ""
+
+#: ../lib/gis/mapset.c:39
+msgid "MAPSET is not set"
+msgstr ""
+
+#: ../lib/gis/mapset.c:57
+#, c-format
+msgid "MAPSET %s not found"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:40
+#, c-format
+msgid " The raster map %s@%s is empty"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:49
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Color table needed for file [%s] in mapset [%s].\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:52
+#, c-format
+msgid ""
+"\n"
+"Please identify the type desired:\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:53
+#, c-format
+msgid "    1:  Random colors\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:54
+#, c-format
+msgid "    2:  Red, green, and blue color ramps\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:55
+#, c-format
+msgid "    3:  Color wave\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:56
+#, c-format
+msgid "    4:  Gray scale\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:57
+#, c-format
+msgid "    5:  Aspect\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:58
+#, c-format
+msgid "    6:  Rainbow colors\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:59
+#, c-format
+msgid "    7:  Red through yellow to green\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:60
+#, c-format
+msgid "    8:  Green through yellow to red\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:61
+#, c-format
+msgid "RETURN  quit\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:91
+#, c-format
+msgid ""
+"\n"
+"%s invalid; Try again > "
+msgstr ""
+
+#: ../lib/gis/history.c:180
+#, c-format
+msgid "can't write history information for [%s]"
+msgstr ""
+
+#: ../lib/gis/history.c:263
+msgid "Not enough room in history file to record command line."
+msgstr ""
+
+#: ../lib/gis/history.c:285
+msgid "Not enough room in history file for command line (truncated)."
+msgstr ""
+
+#: ../lib/gis/opencell.c:105
+#, c-format
+msgid "Unable to open raster map <%s@%s>"
+msgstr ""
+
+#: ../lib/gis/opencell.c:171
+#, c-format
+msgid "Unable to find <%s@%s>"
+msgstr ""
+
+#: ../lib/gis/opencell.c:188
+#, c-format
+msgid ""
+"Unable to open raster map <%s@%s> since it is a reclass of raster map <%s@"
+"%s> which does not exist"
+msgstr ""
+
+#: ../lib/gis/opencell.c:212
+#, c-format
+msgid "Raster map <%s@%s>: format field in header file invalid"
+msgstr ""
+
+#: ../lib/gis/opencell.c:219
+#, c-format
+msgid ""
+"Raster map <%s@%s> is in different projection than current region. Found "
+"raster map <%s@%s>, should be <%s>."
+msgstr ""
+
+#: ../lib/gis/opencell.c:226
+#, c-format
+msgid "Raster map <%s@%s> is in different zone (%d) than current region (%d)"
+msgstr ""
+
+#: ../lib/gis/opencell.c:233
+#, c-format
+msgid "Raster map <%s@%s>: bytes per cell (%d) too large"
+msgstr ""
+
+#: ../lib/gis/opencell.c:262
+#, c-format
+msgid "map <%s@%s> is a GDAL link but GRASS is compiled without GDAL support"
+msgstr ""
+
+#: ../lib/gis/opencell.c:642
+#, c-format
+msgid "Raster map <%s> is not in the current mapset (%s)"
+msgstr ""
+
+#: ../lib/gis/opencell.c:649
+#, c-format
+msgid "<%s> is an illegal file name"
+msgstr ""
+
+#: ../lib/gis/opencell.c:655
+#, c-format
+msgid "<%s>: bad mapset"
+msgstr ""
+
+#: ../lib/gis/opencell.c:666 ../lib/gis/opencell.c:767
+msgid "G__open_raster_new(): no temp files available"
+msgstr ""
+
+#: ../lib/gis/opencell.c:736
+msgid ""
+"Unable to write embedded null values for raster map open for random access"
+msgstr ""
+
+#: ../lib/gis/opencell.c:941
+msgid "G_set_fp_type(): can only be called with FCELL_TYPE or DCELL_TYPE"
+msgstr ""
+
+#: ../lib/gis/opencell.c:976 ../lib/gis/opencell.c:1064
+#, c-format
+msgid "Unable to find '%s' in '%s'"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1009
+#, c-format
+msgid "Raster map <%s> not found in mapset <%s>"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1070
+#, c-format
+msgid "Unable to find '%s'"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1075
+#, c-format
+msgid "Unable to open '%s'"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1085
+#, c-format
+msgid "Invalid type: field '%s' in file '%s'"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1099
+#, c-format
+msgid "Raster map <%s> is not xdr: byte_order: %s"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1179
+msgid ""
+"G_set_quant_rules() can be called only for raster maps opened for reading"
+msgstr ""
+
+#: ../lib/gis/auto_mask.c:64
+msgid "Unable to open automatic MASK file"
+msgstr ""
+
+#: ../lib/gis/raster_metadata.c:111
+#, c-format
+msgid "Can't read %s for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/raster_metadata.c:144
+#, c-format
+msgid "Can't create %s metadata file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/find_file.c:74
+#, c-format
+msgid "'%s/%s' was found in more mapsets (also found in <%s>)"
+msgstr ""
+
+#: ../lib/gis/find_file.c:82
+#, c-format
+msgid "Using <%s@%s>"
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:71 ../lib/gis/get_cellhd.c:100
+#, c-format
+msgid "Unable to read header file for raster map <%s@%s>."
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:74
+#, c-format
+msgid " It is a reclass of raster map <%s@%s> "
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:78
+#, c-format
+msgid "which is missing."
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:80
+#, c-format
+msgid "whose header file can't be opened."
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:88
+#, c-format
+msgid "Unable to open header file for raster map <%s@%s>"
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:105
+#, c-format
+msgid " It is a reclass of raster map <%s@%s> whose header file is invalid."
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:109
+#, c-format
+msgid " Invalid format."
+msgstr ""
+
+#: ../lib/gis/gishelp.c:45
+#, c-format
+msgid "one moment...\n"
+msgstr ""
+
+#: ../lib/gis/gishelp.c:49
+#, c-format
+msgid "No help available for command [%s]\n"
+msgstr ""
+
+#: ../lib/gis/closecell.c:228
+#, c-format
+msgid ""
+"closecell: can't move %s\n"
+"to null file %s"
+msgstr ""
+
+#: ../lib/gis/closecell.c:250
+#, c-format
+msgid "Error writing floating point format file for map %s"
+msgstr ""
+
+#: ../lib/gis/closecell.c:300
+#, c-format
+msgid ""
+"closecell: can't move %s\n"
+"to cell file %s"
+msgstr ""
+
+#: ../lib/gis/closecell.c:355
+msgid "unable to write quant file!"
+msgstr ""
+
+#: ../lib/gis/closecell.c:406
+msgid "unable to write f_format file for CELL maps"
+msgstr ""
+
+#: ../lib/gis/get_datum_name.c:53
+#, c-format
+msgid ""
+"\n"
+"Please specify datum name\n"
+msgstr ""
+
+#: ../lib/gis/get_datum_name.c:55
+#, c-format
+msgid "Enter 'list' for the list of available datums\n"
+msgstr ""
+
+#: ../lib/gis/get_datum_name.c:57
+#, c-format
+msgid "or 'custom' if you wish to enter custom parameters\n"
+msgstr ""
+
+#: ../lib/gis/get_datum_name.c:97
+#, c-format
+msgid ""
+"\n"
+"invalid datum\n"
+msgstr ""
+
+#: ../lib/gis/location.c:44
+#, c-format
+msgid "LOCATION << %s >> not available"
+msgstr ""
+
+#: ../lib/gis/open_misc.c:45
+#, c-format
+msgid "G__open_misc(read): mapset <%s> doesn't match xmapset <%s>"
+msgstr ""
+
+#: ../lib/gis/open_misc.c:67
+#, c-format
+msgid "G__open_misc(write): xmapset <%s> != G_mapset() <%s>"
+msgstr ""
+
+#: ../lib/gis/get_ellipse.c:85
+#, c-format
+msgid "Unable to open file %s in <%s>"
+msgstr ""
+
+#: ../lib/gis/get_ellipse.c:358 ../lib/gis/get_ellipse.c:384
+#, c-format
+msgid "Invalid a: field '%s' in file %s in <%s>"
+msgstr ""
+
+#: ../lib/gis/get_ellipse.c:371
+#, c-format
+msgid "Invalid ellipsoid '%s' in file %s in <%s>"
+msgstr ""
+
+#: ../lib/gis/get_ellipse.c:388
+#, c-format
+msgid "Invalid es: field '%s' in file %s in <%s>"
+msgstr ""
+
+#: ../lib/gis/get_ellipse.c:402
+#, c-format
+msgid "No ellipsoid info given in file %s in <%s>"
+msgstr ""
+
+#: ../lib/gis/parser.c:340
+msgid "WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../lib/gis/parser.c:341
+msgid "Example: income < 1000 and inhab >= 10000"
+msgstr ""
+
+#: ../lib/gis/parser.c:349
+msgid "Table name"
+msgstr ""
+
+#: ../lib/gis/parser.c:358
+msgid "Driver name"
+msgstr ""
+
+#: ../lib/gis/parser.c:367
+msgid "Database name"
+msgstr ""
+
+#: ../lib/gis/parser.c:376
+msgid "Name of attribute column"
+msgstr ""
+
+#: ../lib/gis/parser.c:385
+msgid "Name of attribute column(s)"
+msgstr ""
+
+#: ../lib/gis/parser.c:396
+msgid "Name of input imagery group"
+msgstr ""
+
+#: ../lib/gis/parser.c:404
+msgid "Name of input imagery subgroup"
+msgstr ""
+
+#: ../lib/gis/parser.c:414 ../lib/gis/parser.c:439
+msgid "Name of input raster map"
+msgstr ""
+
+#: ../lib/gis/parser.c:423 ../lib/gis/parser.c:448
+msgid "Name of input raster map(s)"
+msgstr ""
+
+#: ../lib/gis/parser.c:431
+msgid "Name for output raster map"
+msgstr ""
+
+#: ../lib/gis/parser.c:456
+msgid "Name of base raster map"
+msgstr ""
+
+#: ../lib/gis/parser.c:464
+msgid "Name of cover raster map"
+msgstr ""
+
+#: ../lib/gis/parser.c:472
+msgid "Name of elevation raster map"
+msgstr ""
+
+#: ../lib/gis/parser.c:481
+msgid "Name of elevation raster map(s)"
+msgstr ""
+
+#: ../lib/gis/parser.c:491 ../lib/gis/parser.c:516
+msgid "Name of input raster3d map"
+msgstr ""
+
+#: ../lib/gis/parser.c:500 ../lib/gis/parser.c:525
+msgid "Name of input raster3d map(s)"
+msgstr ""
+
+#: ../lib/gis/parser.c:508
+msgid "Name for output raster3d map"
+msgstr ""
+
+#: ../lib/gis/parser.c:535 ../lib/gis/parser.c:560
+msgid "Name of input vector map"
+msgstr ""
+
+#: ../lib/gis/parser.c:544 ../lib/gis/parser.c:569
+msgid "Name of input vector map(s)"
+msgstr ""
+
+#: ../lib/gis/parser.c:552
+msgid "Name for output vector map"
+msgstr ""
+
+#: ../lib/gis/parser.c:578 ../lib/gis/parser.c:587
+msgid "Feature type"
+msgstr ""
+
+#: ../lib/gis/parser.c:594
+msgid "Layer number"
+msgstr ""
+
+#: ../lib/gis/parser.c:596
+msgid ""
+"A single vector map can be connected to multiple database tables. This "
+"number determines which table to use."
+msgstr ""
+
+#: ../lib/gis/parser.c:605
+msgid "Category value"
+msgstr ""
+
+#: ../lib/gis/parser.c:612
+msgid "Category values"
+msgstr ""
+
+#: ../lib/gis/parser.c:613 ../lib/gis/parser.c:627
+msgid "Example: 1,3,7-9,13"
+msgstr ""
+
+#: ../lib/gis/parser.c:619
+msgid "Feature id"
+msgstr ""
+
+#: ../lib/gis/parser.c:626
+msgid "Feature ids"
+msgstr ""
+
+#: ../lib/gis/parser.c:637
+msgid "Name of input file"
+msgstr ""
+
+#: ../lib/gis/parser.c:645
+msgid "Name for output file"
+msgstr ""
+
+#: ../lib/gis/parser.c:653
+msgid "Field separator"
+msgstr ""
+
+#: ../lib/gis/parser.c:654
+msgid "Special characters: newline, space, comma, tab"
+msgstr ""
+
+#: ../lib/gis/parser.c:665
+msgid "Color"
+msgstr ""
+
+#: ../lib/gis/parser.c:666
+msgid "Either a standard color name or R:G:B triplet"
+msgstr ""
+
+#: ../lib/gis/parser.c:675
+msgid "Background color"
+msgstr ""
+
+#: ../lib/gis/parser.c:677
+msgid "Either a standard GRASS color, R:G:B triplet, or \"none\""
+msgstr ""
+
+#: ../lib/gis/parser.c:818
+#, c-format
+msgid "BUG in descriptions, option '%s' in <%s> does not exist"
+msgstr ""
+
+#: ../lib/gis/parser.c:926
+msgid "Use either --quiet or --verbose flag, not both. Assuming --verbose."
+msgstr ""
+
+#: ../lib/gis/parser.c:940
+msgid "Use either --quiet or --verbose flag, not both. Assuming --quiet."
+msgstr ""
+
+#: ../lib/gis/parser.c:971
+#, c-format
+msgid "Sorry <%s> is not a valid option\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1075
+#, c-format
+msgid ""
+"\n"
+"Description:\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1082
+#, c-format
+msgid ""
+"\n"
+"Keywords:\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1086
+#, c-format
+msgid ""
+"\n"
+"Usage:\n"
+" "
+msgstr ""
+
+#: ../lib/gis/parser.c:1154
+#, c-format
+msgid ""
+"\n"
+"Flags:\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1177 ../lib/gis/parser.c:1501 ../lib/gis/parser.c:1661
+#: ../lib/gis/parser.c:1949
+msgid "Allow output files to overwrite existing files"
+msgstr ""
+
+#: ../lib/gis/parser.c:1179 ../lib/gis/parser.c:1509 ../lib/gis/parser.c:1665
+msgid "Verbose module output"
+msgstr ""
+
+#: ../lib/gis/parser.c:1180 ../lib/gis/parser.c:1516 ../lib/gis/parser.c:1668
+msgid "Quiet module output"
+msgstr ""
+
+#: ../lib/gis/parser.c:1185
+#, c-format
+msgid ""
+"\n"
+"Parameters:\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1208
+#, c-format
+msgid "  %*s   default: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1552
+msgid "NAME"
+msgstr ""
+
+#: ../lib/gis/parser.c:1565
+msgid "KEYWORDS"
+msgstr ""
+
+#: ../lib/gis/parser.c:1570
+msgid "SYNOPSIS"
+msgstr ""
+
+#: ../lib/gis/parser.c:1638
+msgid "Flags"
+msgstr ""
+
+#: ../lib/gis/parser.c:1676
+msgid "Parameters"
+msgstr ""
+
+#: ../lib/gis/parser.c:1716
+msgid "Options"
+msgstr ""
+
+#: ../lib/gis/parser.c:1722
+msgid "Default"
+msgstr ""
+
+#: ../lib/gis/parser.c:1951
+msgid "Allow overwrite"
+msgstr ""
+
+#: ../lib/gis/parser.c:1959
+msgid "Run with minimal output messages"
+msgstr ""
+
+#: ../lib/gis/parser.c:1961
+msgid "Run quietly"
+msgstr ""
+
+#: ../lib/gis/parser.c:1994
+msgid "Unable to spawn the 'wish' program"
+msgstr ""
+
+#: ../lib/gis/parser.c:2013
+msgid "Unable to determine program name"
+msgstr ""
+
+#: ../lib/gis/parser.c:2070
+#, c-format
+msgid "  %*s   options: "
+msgstr ""
+
+#: ../lib/gis/parser.c:2115 ../lib/gis/parser.c:2130
+#, c-format
+msgid "Sorry, <%c> is not a valid flag\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2196
+#, c-format
+msgid "Sorry, <%s=> is ambiguous\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2202
+#, c-format
+msgid "Sorry, <%s> is not a valid parameter\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2209
+#, c-format
+msgid "Option <%s> does not accept multiple answers\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2287
+#, c-format
+msgid ""
+"\n"
+"ERROR: illegal range syntax for parameter <%s>\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2288
+#, c-format
+msgid "       Presented as: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2292
+#, c-format
+msgid ""
+"\n"
+"ERROR: value <%s> out of range for parameter <%s>\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2294
+#, c-format
+msgid "       Legal range: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2297
+#, c-format
+msgid ""
+"\n"
+"ERROR: Missing value for parameter <%s>\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2445
+#, c-format
+msgid ""
+"ERROR: Required parameter <%s> not set:\n"
+"\t(%s)\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2540
+#, c-format
+msgid ""
+"\n"
+"ERROR: option <%s> must be provided in multiples of %d\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2542
+#, c-format
+msgid "       You provided %d items:\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2598
+#, c-format
+msgid "ERROR: option <%s>: <%s> exists.\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2653
+#, c-format
+msgid ""
+"\n"
+"FLAG: Set the following flag?\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2667
+#, c-format
+msgid ""
+"\n"
+"OPTION:   %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2668
+#, c-format
+msgid "     key: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2670
+#, c-format
+msgid "  format: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2672
+#, c-format
+msgid " default: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2673
+#, c-format
+msgid "required: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2675
+#, c-format
+msgid "multiple: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2677
+#, c-format
+msgid " options: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2690
+#, c-format
+msgid "enter option > "
+msgstr ""
+
+#: ../lib/gis/parser.c:2707 ../lib/gis/parser.c:2717
+msgid "   Try again? "
+msgstr ""
+
+#: ../lib/gis/parser.c:2715
+#, c-format
+msgid "Sorry, %s is not accepted.\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2725
+#, c-format
+msgid ""
+"\n"
+"You have chosen:\n"
+"  %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2726
+msgid "Is this correct? "
+msgstr ""
+
+#: ../lib/gis/parser.c:2791
+msgid "to accept the default"
+msgstr ""
+
+#: ../lib/gis/get_ell_name.c:42
+#, c-format
+msgid ""
+"\n"
+"Please specify ellipsoid name\n"
+msgstr ""
+
+#: ../lib/gis/get_ell_name.c:44
+#, c-format
+msgid "Enter 'list' for the list of available ellipsoids\n"
+msgstr ""
+
+#: ../lib/gis/get_ell_name.c:67
+#, c-format
+msgid ""
+"\n"
+"invalid ellipsoid\n"
+msgstr ""
+
+#: ../lib/gis/quant_io.c:89
+#, c-format
+msgid "The floating data range for %s@%s is empty"
+msgstr ""
+
+#: ../lib/gis/quant_io.c:99
+#, c-format
+msgid "The integer data range for %s@%s is empty"
+msgstr ""
+
+#: ../lib/gis/quant_io.c:168
+#, c-format
+msgid "quantization file [%s] in mapset [%s] %s"
+msgstr ""
+
+#: ../lib/gis/get_window.c:67 ../lib/gis/get_window.c:85
+#, c-format
+msgid ""
+"region for current mapset %s\n"
+"run \"g.region\""
+msgstr ""
+
+#: ../lib/gis/get_window.c:120
+#, c-format
+msgid "default region %s"
+msgstr ""
+
+#: ../lib/gis/get_window.c:141
+msgid "is not set"
+msgstr ""
+
+#: ../lib/gis/get_window.c:150
+#, c-format
+msgid ""
+"is invalid\n"
+"%s"
+msgstr ""
+
+#: ../lib/gis/format.c:157
+#, c-format
+msgid "Fail of initial read of compressed file [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:143
+msgid "duplicate projection field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:153
+msgid "duplicate zone field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:163
+msgid "projection field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:165
+msgid "zone field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:187
+msgid "duplicate north field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:195
+msgid "duplicate south field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:203
+msgid "duplicate east field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:211
+msgid "duplicate west field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:219
+msgid "duplicate top field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:227
+msgid "duplicate bottom field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:235
+msgid "duplicate e-w resolution field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:245
+msgid "duplicate 3D e-w resolution field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:255
+msgid "duplicate n-s resolution field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:265
+msgid "duplicate 3D n-s resolution field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:275
+msgid "duplicate t-b resolution field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:285
+msgid "duplicate rows field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:295
+msgid "duplicate 3D rows field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:305
+msgid "duplicate cols field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:315
+msgid "duplicate 3D cols field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:325
+msgid "duplicate depths field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:335
+msgid "duplicate format field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:343
+msgid "duplicate compressed field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:354
+msgid "north field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:356
+msgid "south field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:358
+msgid "west field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:360
+msgid "east field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:362
+msgid "cols field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:364
+msgid "rows field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:375
+msgid "ewres3 field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:377
+msgid "nsres3 field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:379
+msgid "cols3 field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:381
+msgid "rows3 field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:438
+#, c-format
+msgid "line %d: <%s>"
+msgstr ""
+
+#: ../lib/gis/timestamp.c:282
+#, c-format
+msgid "Can't create timestamp file for %s map %s in mapset %s"
+msgstr ""
+
+#: ../lib/gis/timestamp.c:291
+#, c-format
+msgid "Invalid timestamp specified for %s map %s in mapset %s"
+msgstr ""
+
+#: ../lib/gis/timestamp.c:313
+#, c-format
+msgid "Can't open timestamp file for %s map %s in mapset %s"
+msgstr ""
+
+#: ../lib/gis/timestamp.c:322
+#, c-format
+msgid "Invalid timestamp file for %s map %s in mapset %s"
+msgstr ""
+
+#: ../lib/gis/get_projinfo.c:33 ../lib/gis/get_projinfo.c:60
+#, c-format
+msgid "<%s> file not found for location <%s>"
+msgstr ""
+
+#: ../lib/gis/get_projinfo.c:39 ../lib/gis/get_projinfo.c:66
+#, c-format
+msgid "ERROR in reading <%s> file for location <%s>"
+msgstr ""
+
+#: ../lib/gis/gdal.c:66
+#, c-format
+msgid "Unable to locate symbol <%s>"
+msgstr ""
+
+#: ../lib/gis/gdal.c:114
+msgid "Unable to load GDAL library"
+msgstr ""
+
+#: ../lib/gis/histogram.c:57
+#, c-format
+msgid "Histogram for [%s in %s] missing (run r.support)"
+msgstr ""
+
+#: ../lib/gis/histogram.c:65
+#, c-format
+msgid "Can't read histogram for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/histogram.c:74 ../lib/gis/histogram.c:84
+#, c-format
+msgid "Invalid histogram file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/histogram.c:356
+#, c-format
+msgid "can't create histogram for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/myname.c:50
+msgid "This location has no description."
+msgstr ""
+
+#: ../lib/gis/ask_cell.c:54 ../lib/gis/ask_cell.c:72 ../lib/gis/ask_cell.c:91
+#: ../lib/gis/ask_cell.c:96
+msgid "with titles"
+msgstr ""
+
+#: ../lib/gis/ask_cell.c:110
+msgid "(no title)"
+msgstr ""
+
+#: ../lib/gis/open.c:62
+#, c-format
+msgid "G__open(read): mapset <%s> doesn't match xmapset <%s>"
+msgstr ""
+
+#: ../lib/gis/open.c:84
+#, c-format
+msgid "G__open(write): xmapset <%s> != G_mapset() <%s>"
+msgstr ""
+
+#: ../lib/gis/distance.c:160
+#, c-format
+msgid ""
+"G_distance_point_to_line_segment: shouldn't happen: code=%d P=(%f,%f) S=(%f,"
+"%f)(%f,%f)"
+msgstr ""
+
+#: ../lib/arraystats/class.c:21
+msgid "Discont algorithm currently not available because of bugs"
+msgstr ""
+
+#: ../lib/arraystats/class.c:23
+#, c-format
+msgid "%s: Unknown algorithm"
+msgstr ""
+
+#: ../lib/arraystats/class.c:26
+#, c-format
+msgid "%s: Error in classification algorithm"
+msgstr ""
+
+#: ../lib/arraystats/class.c:221
+#, c-format
+msgid ""
+"There are classbreaks outside the range min-max. Number of classes reduced "
+"to %i, but using probabilities for %i classes."
+msgstr ""
+
+#: ../lib/rst/interp_float/interp2d.c:212
+#, c-format
+msgid ""
+"Overshoot - increase in tension suggested. Overshoot occures at (%d,%d) "
+"cell. Z-value %f, zmin %f, zmax %f."
+msgstr ""
+
+#: ../lib/rst/interp_float/segmen2d.c:111
+msgid ""
+"Taking too long to find points for interpolation - please change the region "
+"to area where your points are. Continuing calculations..."
+msgstr ""
+
+#: ../lib/rst/interp_float/input2d.c:47
+#, c-format
+msgid "Mask raster map <%s> not found"
+msgstr ""
+
+#: ../lib/rst/interp_float/input2d.c:69
+msgid "Bitmap mask created"
+msgstr ""
+
+#: ../lib/rst/interp_float/output2d.c:125
+#, c-format
+msgid "First change your cols number to nsizc %d %d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:73
+#, c-format
+msgid "Vector map <%s> is not 3D"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:76
+msgid "Loading data from attribute table ..."
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:79 ../lib/vector/Vlib/map.c:243
+#: ../lib/vector/Vlib/map.c:364 ../lib/vector/Vlib/map.c:470
+#: ../lib/vector/Vlib/map.c:588 ../lib/vector/Vlib/map.c:686
+#: ../lib/vector/Vlib/array.c:278 ../lib/vector/Vlib/net.c:180
+#: ../lib/vector/Vlib/net.c:351
+#, c-format
+msgid "Database connection not defined for layer %d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:97
+#: ../lib/rst/interp_float/vinput2d.c:110
+#, c-format
+msgid "Data type of column <%s> must be numeric"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:121
+msgid "Reading features from vector map ..."
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:153
+#: ../lib/rst/interp_float/vinput2d.c:270
+#, c-format
+msgid "Database record for cat %d not found"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:171
+#: ../lib/rst/interp_float/vinput2d.c:288
+msgid "Negative value of smoothing detected: sm must be >= 0"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:233
+msgid "Reading nodes from vector map ..."
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:314
+msgid "Strip exists with insufficient data"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:328
+#, c-format
+msgid "There are points outside specified 2D/3D region - %d points ignored"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:331
+#, c-format
+msgid "Ignoring %d points (too dense)"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:335
+#, c-format
+msgid ""
+"%d points given for interpolation (after thinning) is less than given NPMIN="
+"%d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:340
+msgid "Zero points in the given region"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:345
+#, c-format
+msgid ""
+"Segmentation parameters set to invalid values: npmin= %d, segmax= %d for "
+"smooth connection of segments, npmin > segmax (see manual)"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:351
+#, c-format
+msgid ""
+"There are less than %d points for interpolation. No segmentation is "
+"necessary, to run the program faster set segmax=%d (see manual)"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:355
+#, c-format
+msgid "Number of points from vector map %d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:356
+#, c-format
+msgid "Number of points outside of 2D/3D region %d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:358
+#, c-format
+msgid "Number of points being used %d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:391
+msgid "Some points outside of region (ignored)"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:397
+msgid "Unable to allocate memory"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:405
+#, c-format
+msgid "Unable to insert %f,%f,%f a = %d"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:23
+#, c-format
+msgid "Unable to create file [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:36 ../lib/imagery/fopen.c:57
+#, c-format
+msgid "Unable to open file [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:49
+#, c-format
+msgid "Unable to find file [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:79
+#, c-format
+msgid "Unable to create file [%s] for subgroup [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:101 ../lib/imagery/fopen.c:127
+#, c-format
+msgid "Unable to open file [%s] for subgroup [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:116
+#, c-format
+msgid "Unable to find file [%s] for subgroup [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/target.c:38
+#, c-format
+msgid "Unable to read target file for group [%s]"
+msgstr ""
+
+#: ../lib/imagery/list_subgp.c:36
+#, c-format
+msgid "subgroup <%s> of group <%s> is empty\n"
+msgstr ""
+
+#: ../lib/imagery/list_subgp.c:48
+#, c-format
+msgid "subgroup <%s> of group <%s> references the following raster maps\n"
+msgstr ""
+
+#: ../lib/imagery/sigsetfile.c:41
+#, c-format
+msgid ""
+"Unable to create signature file <%s> for subgroup <%s> of group <%s> - <%s> "
+"is not current mapset"
+msgstr ""
+
+#: ../lib/imagery/sigsetfile.c:57
+#, c-format
+msgid "Unable to create signature file <%s> for subgroup <%s> of group <%s>"
+msgstr ""
+
+#: ../lib/imagery/sigsetfile.c:86
+#, c-format
+msgid "Unable to open signature file <%s> for subgroup <%s> of group <%s@%s>"
+msgstr ""
+
+#: ../lib/imagery/points.c:124
+#, c-format
+msgid "Unable to open control point file for group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/points.c:132
+#, c-format
+msgid "Bad format in control point file for group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/points.c:159
+#, c-format
+msgid "Unable to create control point file for group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/list_gp.c:34
+#, c-format
+msgid "group <%s> is empty\n"
+msgstr ""
+
+#: ../lib/imagery/list_gp.c:44
+#, c-format
+msgid "group <%s> references the following raster maps\n"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_node.c:217
+#, c-format
+msgid ""
+"Attempt to read line angle for the line which is not connected to the node: "
+"node %d, line %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:288
+msgid "Unable read topology for nodes"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:293
+#, c-format
+msgid "Unable to read topology for node %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:298
+msgid "Unable read topology for lines"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:303
+#, c-format
+msgid "Unable to read topology for line %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:308
+msgid "Unable to read topo for areas"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:313
+#, c-format
+msgid "Unable read topology for area %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:318
+msgid "Unable to read topology for isles"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:323
+#, c-format
+msgid "Unable to read topology for isle %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:345 ../lib/vector/diglib/plus.c:371
+msgid "Unable to write head to plus file"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:350
+msgid "Unable to write nodes to plus file"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:355
+msgid "Unable to write lines to plus file"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:360
+msgid "Unable to write areas to plus file"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:365
+msgid "Unable to write isles to plus file"
+msgstr ""
+
+#: ../lib/vector/diglib/spindex.c:248
+#, c-format
+msgid "Unable to delete node %d from spatial index"
+msgstr ""
+
+#: ../lib/vector/diglib/spindex.c:288
+#, c-format
+msgid "Unable to delete line %d from spatial index"
+msgstr ""
+
+#: ../lib/vector/diglib/spindex.c:314
+msgid "Attempt to delete sidx for dead area"
+msgstr ""
+
+#: ../lib/vector/diglib/spindex.c:327
+#, c-format
+msgid "Unable to delete area %d from spatial index"
+msgstr ""
+
+#: ../lib/vector/diglib/spindex.c:362
+#, c-format
+msgid "Unable to delete isle %d from spatial index"
+msgstr ""
+
+#: ../lib/vector/diglib/file.c:157
+msgid "Writing to file loaded to memory not supported"
+msgstr ""
+
+#: ../lib/vector/diglib/file.c:200
+msgid "Unable to load file to memory, file not open"
+msgstr ""
+
+#: ../lib/vector/diglib/file.c:215
+msgid "Vector memory mode not supported, using 'AUTO'"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:207 ../lib/vector/diglib/plus_area.c:675
+#: ../lib/vector/diglib/plus_area.c:683
+#, c-format
+msgid "Line %d already has area/isle %d to left"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:217
+#, c-format
+msgid "Line %d already has area/isle %d to right"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:299
+msgid "Attempt to delete isle from dead area"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:316
+#, c-format
+msgid "Attempt to delete not registered isle %d from area %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:354
+msgid "Attempt to delete dead area"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:394
+#, c-format
+msgid "Dead centroid %d registered for area (bug in the vector library)"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:418
+#, c-format
+msgid "Attempt to delete area %d info from dead isle %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:773
+#, c-format
+msgid "Attempt to delete isle %d info from dead area %d"
+msgstr ""
+
+#: ../lib/vector/neta/spanningtree.c:104
+msgid "Computing minimum spanning tree..."
+msgstr ""
+
+#: ../lib/vector/neta/flow.c:309 ../lib/vector/Vlib/net.c:433
+#: ../lib/vector/Vlib/graph.c:110
+msgid "GngFlatten error"
+msgstr ""
+
+#: ../lib/vector/neta/timetables.c:46 ../lib/vector/neta/timetables.c:203
+#: ../lib/vector/neta/timetables.c:244 ../lib/vector/neta/timetables.c:286
+#, c-format
+msgid "Unable to open select cursor: %s"
+msgstr ""
+
+#: ../lib/vector/neta/utils.c:219 ../lib/vector/neta/utils.c:232
+#, c-format
+msgid "'%s' must be > 0 for '%s'"
+msgstr ""
+
+#: ../lib/vector/neta/utils.c:221
+msgid "'where' and 'cats' parameters were supplied, cat will be ignored"
+msgstr ""
+
+#: ../lib/vector/neta/utils.c:225
+msgid "Unable to load data from database"
+msgstr ""
+
+#: ../lib/vector/neta/utils.c:236
+msgid "Problem loading category values"
+msgstr ""
+
+#: ../lib/vector/neta/allpairs.c:53
+msgid "Computing all pairs shortest paths..."
+msgstr ""
+
+#: ../lib/vector/Vlib/snap.c:148
+msgid "Snap vertices Pass 1: select points"
+msgstr ""
+
+#: ../lib/vector/Vlib/snap.c:202
+msgid "Snap vertices Pass 2: assign anchor vertices"
+msgstr ""
+
+#: ../lib/vector/Vlib/snap.c:271
+msgid "Snap vertices Pass 3: snap to assigned points"
+msgstr ""
+
+#: ../lib/vector/Vlib/snap.c:451
+#, c-format
+msgid "Snapped vertices: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/snap.c:452
+#, c-format
+msgid "New vertices: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/intersect.c:127
+msgid "3D not supported by Vect_segment_intersection()"
+msgstr ""
+
+#: ../lib/vector/Vlib/intersect.c:313
+msgid "Vect_segment_intersection() ERROR (collinear vertical segments)"
+msgstr ""
+
+#: ../lib/vector/Vlib/intersect.c:407
+msgid "Vect_segment_intersection() ERROR (collinear non vertical segments)"
+msgstr ""
+
+#: ../lib/vector/Vlib/intersect.c:1059 ../lib/vector/Vlib/intersect.c:1065
+#: ../lib/vector/Vlib/intersect.c:1067 ../lib/vector/Vlib/intersect.c:1115
+#: ../lib/vector/Vlib/intersect.c:1124 ../lib/vector/Vlib/intersect.c:1145
+#: ../lib/vector/Vlib/intersect.c:1162
+msgid "Error while adding point to array. Out of memory"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:55
+msgid "input vector map is not open"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:178 ../lib/vector/Vlib/map.c:314
+#: ../lib/vector/Vlib/open.c:540
+#, c-format
+msgid "Vector map name is not SQL compliant"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:182
+#, c-format
+msgid "Unable to find vector map <%s> in <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:189 ../lib/vector/Vlib/map.c:318
+#: ../lib/vector/Vlib/open.c:547
+#, c-format
+msgid "Vector map <%s> already exists and will be overwritten"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:193 ../lib/vector/Vlib/open.c:552
+#, c-format
+msgid "Unable to delete vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:213 ../lib/vector/Vlib/map.c:331
+#, c-format
+msgid "Unable to copy vector map <%s> to <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:260 ../lib/vector/Vlib/map.c:381
+#: ../lib/vector/Vlib/map.c:613 ../lib/vector/Vlib/map.c:720
+#, c-format
+msgid "Unable to copy table <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:276 ../lib/vector/Vlib/map.c:410
+#: ../lib/vector/Vlib/map.c:626
+#, c-format
+msgid "Unable to create index for table <%s>, key <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:395 ../lib/vector/Vlib/map.c:490
+#, c-format
+msgid "Unable to delete table <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:444
+#, c-format
+msgid "Invalid vector map name <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:458
+#, c-format
+msgid "Unable to open header file for vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:480
+#, c-format
+msgid "Unable to find table <%s> linked to vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:497
+#, c-format
+msgid "Table <%s> linked to vector map <%s> does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:511
+#, c-format
+msgid "Unable to open directory '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:525
+#, c-format
+msgid "Unable to delete file '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:542
+#, c-format
+msgid "Unable to rename directory '%s' to '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:550
+#, c-format
+msgid "Unable to remove directory '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:604 ../lib/vector/Vlib/map.c:705
+#, c-format
+msgid "Unable to add database link for vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/read_nat.c:136 ../lib/vector/Vlib/geos.c:66
+#: ../lib/vector/Vlib/geos.c:256
+msgid "Attempt to read dead line"
+msgstr ""
+
+#: ../lib/vector/Vlib/array.c:99
+#, c-format
+msgid "%d errors in category string."
+msgstr ""
+
+#: ../lib/vector/Vlib/array.c:145 ../lib/vector/Vlib/array.c:269
+msgid "Mixed area and other type requested for vector array"
+msgstr ""
+
+#: ../lib/vector/Vlib/array.c:155 ../lib/vector/Vlib/array.c:178
+#: ../lib/vector/Vlib/array.c:306 ../lib/vector/Vlib/array.c:339
+msgid "Not enough space in vector array"
+msgstr ""
+
+#: ../lib/vector/Vlib/array.c:294
+#, c-format
+msgid "Unable to select record from table <%s> (key %s, where %s)"
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:48
+#, c-format
+msgid "Illegal vector map name <%s>. May not contain '.' or 'NULL'."
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:55
+#, c-format
+msgid "Illegal vector map name <%s>. Must start with a letter."
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:63
+#, c-format
+msgid "Illegal vector map name <%s>. Character '%c' not allowed."
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:70
+#, c-format
+msgid ""
+"Illegal vector map name <%s>. SQL keyword cannot be used as vector map name."
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:101 ../lib/vector/Vlib/legal_vname.c:105
+#, c-format
+msgid "Output vector map name <%s> is not valid map name"
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:142 ../lib/vector/Vlib/legal_vname.c:146
+#, c-format
+msgid "Output vector map <%s> is used as input"
+msgstr ""
+
+#: ../lib/vector/Vlib/write_nat.c:50 ../lib/vector/Vlib/write_nat.c:83
+#, c-format
+msgid "%s: Area %d does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/write_nat.c:640
+msgid "Attempt to delete dead feature"
+msgstr ""
+
+#: ../lib/vector/Vlib/write_nat.c:885
+msgid "Attempt to restore alive feature"
+msgstr ""
+
+#: ../lib/vector/Vlib/merge_lines.c:233
+#, c-format
+msgid "%d boundaries merged"
+msgstr ""
+
+#: ../lib/vector/Vlib/merge_lines.c:234
+#, c-format
+msgid "%d new boundaries"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:122
+msgid "Building graph..."
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:164
+msgid "Unable to build network graph"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:170
+msgid "Forward costs column not specified"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:177
+msgid "Arc field < 1"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:191 ../lib/vector/Vlib/net.c:208
+#: ../lib/vector/Vlib/net.c:361
+#, c-format
+msgid "Column <%s> not found in table <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:197 ../lib/vector/Vlib/net.c:214
+#: ../lib/vector/Vlib/net.c:367
+#, c-format
+msgid "Data type of column <%s> not supported (must be numeric)"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:227
+msgid "Registering arcs..."
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:255
+#, c-format
+msgid ""
+"Database record for line %d (cat = %d, forward/both direction(s)) not found "
+"(forward/both direction(s) of line skipped)"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:274
+#, c-format
+msgid ""
+"Database record for line %d (cat = %d, backword direction) not found"
+"(direction of line skipped)"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:323
+msgid "Cannot add network arc"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:347
+msgid "Setting node costs..."
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:403
+#, c-format
+msgid "Database record for node %d (cat = %d) not found (cost set to 0)"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:430
+msgid "Flattening the graph..."
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:439
+msgid "Graph was built"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:522 ../lib/vector/Vlib/graph.c:231
+#, c-format
+msgid "dglShortestPath error: %s"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:603
+msgid "Wrong line direction in Vect_net_get_line_cost()"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:93
+msgid "Layer number must be 1 or greater"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:98
+msgid "Unable to add database link, map is not opened in WRITE mode"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:104
+msgid "Unable to add database link"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:110 ../lib/vector/Vlib/field.c:155
+msgid "Unable to write database links"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:223
+#, c-format
+msgid "Layer number %d or name <%s> already exists"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:302
+#, c-format
+msgid ""
+"Default driver / database set to:\n"
+"driver: %s\n"
+"database: %s"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:309
+msgid "Default driver is not set"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:312
+msgid "Default database is not set"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:371
+#, c-format
+msgid "Requested dblink %d, maximum link number %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:512
+msgid "Unable to open OGR DBMI driver"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:551
+msgid ""
+"All FID tests failed. Neither 'FID' nor 'ogc_fid' nor 'ogr_fid' nor 'gid' "
+"available in OGR DB table"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:606
+#, c-format
+msgid "Don't know how to read links for format %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:639
+#, c-format
+msgid "Error in rule on row %d in %s"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:709
+#, c-format
+msgid "Unable to open vector database definition file '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:804
+msgid "Bug: attempt to update map which is not in current mapset"
+msgstr ""
+
+#: ../lib/vector/Vlib/graph.c:143
+msgid "Unable to add network arc"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:93
+msgid "Unable to add area (map closed, topo saved)"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:102
+msgid "Unable to add isle (map closed, topo saved)"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:112
+msgid "Area of size = 0.0 ignored"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:148
+msgid "Request to find area outside nonexistent isle"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:516
+msgid "Registering primitives..."
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:525
+msgid "Unable to read vector map"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:569
+#, c-format
+msgid "%d primitives registered"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:570
+#, c-format
+msgid "%d vertices registered"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:581
+msgid "Building areas..."
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:604
+#, c-format
+msgid "%d areas built"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:605
+#, c-format
+msgid "%d isles built"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:614
+msgid "Attaching islands..."
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:629
+msgid "Attaching centroids..."
+msgstr ""
+
+#: ../lib/vector/Vlib/open_nat.c:145
+#, c-format
+msgid ""
+"Coor files of vector map <%s@%s> is larger than it should be (%ld bytes "
+"excess)"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_nat.c:149
+#, c-format
+msgid ""
+"Coor files of vector <%s@%s> is shorter than it should be (%ld bytes "
+"missing)."
+msgstr ""
+
+#: ../lib/vector/Vlib/cats.c:47
+msgid "Vect_new_cats_struct(): Out of memory"
+msgstr ""
+
+#: ../lib/vector/Vlib/cats.c:131
+#, c-format
+msgid "Too many categories (%d), unable to set cat %d (layer %d)"
+msgstr ""
+
+#: ../lib/vector/Vlib/cats.c:410
+#, c-format
+msgid "Unable to convert category string '%s' (from '%s') to category range"
+msgstr ""
+
+#: ../lib/vector/Vlib/remove_areas.c:96
+msgid "Area is composed of dead boundary"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:97
+msgid "not implemented"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:109
+#, c-format
+msgid "Unable to delete item %d from spatial index"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:127
+msgid ""
+"Unable to build spatial index from topology, vector map is not opened at "
+"topo level 2"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:168
+msgid "BUG (Vect_build_sidx_from_topo): node does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:180
+msgid "BUG (Vect_build_sidx_from_topo): line does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:199
+msgid "BUG (Vect_build_sidx_from_topo): area does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:218
+msgid "BUG (Vect_build_sidx_from_topo): isle does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/read_ogr.c:120 ../lib/vector/Vlib/read_ogr.c:306
+#: ../lib/vector/Vlib/build_ogr.c:309
+#, c-format
+msgid "OGR feature type %d not supported"
+msgstr ""
+
+#: ../lib/vector/Vlib/read_ogr.c:178
+msgid "OGR feature without ID"
+msgstr ""
+
+#: ../lib/vector/Vlib/read_ogr.c:378 ../lib/vector/Vlib/read_ogr.c:386
+#, c-format
+msgid "Unable to get feature geometry, FID %ld"
+msgstr ""
+
+#: ../lib/vector/Vlib/line.c:201 ../lib/vector/Vlib/line.c:233
+msgid "Index out of range in"
+msgstr ""
+
+#: ../lib/vector/Vlib/line.c:529
+msgid "Segment outside line, no segment created"
+msgstr ""
+
+#: ../lib/vector/Vlib/rewind.c:35 ../lib/vector/Vlib/read.c:30
+#: ../lib/vector/Vlib/close.c:38 ../lib/vector/Vlib/write.c:53
+#: ../lib/vector/Vlib/write.c:59 ../lib/vector/Vlib/open.c:40
+#: ../lib/vector/Vlib/build.c:31
+msgid "Requested format is not compiled in this version"
+msgstr ""
+
+#: ../lib/vector/Vlib/read.c:99 ../lib/vector/Vlib/geos.c:53
+msgid "vector map is not opened"
+msgstr ""
+
+#: ../lib/vector/Vlib/read.c:102
+#, c-format
+msgid ""
+"Vect_read_line(): feature id %d is not reasonable (max features in vector "
+"map <%s>: %d)"
+msgstr ""
+
+#: ../lib/vector/Vlib/area.c:53
+msgid "Attempt to read points of nonexistent area"
+msgstr ""
+
+#: ../lib/vector/Vlib/area.c:125
+#, c-format
+msgid "Unable to read line %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/area.c:164 ../lib/vector/Vlib/area.c:193
+#: ../lib/vector/Vlib/area.c:257 ../lib/vector/Vlib/area.c:286
+#, c-format
+msgid "Attempt to read topo for dead area (%d)"
+msgstr ""
+
+#: ../lib/vector/Vlib/area.c:313
+#, c-format
+msgid "Attempt to read topo for dead isle (%d)"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:56
+#, c-format
+msgid ""
+"Vect_read_line_geos(): feature id %d is not reasonable (max features in "
+"vector map <%s>: %d)"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:61
+msgid "only native format supported"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:91
+#, c-format
+msgid "Vect_read_area_geos(): unable to read area id %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:105
+#, c-format
+msgid "Vect_read_area_geos(): unable to read isle id %d of area id %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:203
+#, c-format
+msgid "Unable to read line offset %ld"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:410
+#, c-format
+msgid "Attempt to read points of nonexistent area id %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:470
+#, c-format
+msgid "Unable to read feature id %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/level_two.c:234 ../lib/vector/Vlib/level_two.c:259
+#: ../lib/vector/Vlib/level_two.c:283 ../lib/vector/Vlib/level_two.c:302
+#: ../lib/vector/Vlib/level_two.c:320 ../lib/vector/Vlib/level_two.c:339
+#, c-format
+msgid "Vector map <%s> is not open on level >= 2"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:272
+#, c-format
+msgid "Unable to calculate centroid for area %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:333
+msgid "Partial build for OGR is not supported"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:342
+msgid ""
+"Random read is not supported by OGR for this layer, cannot build support"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:349
+msgid "Feature: "
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:361
+#, c-format
+msgid "Feature %d without geometry ignored"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:368
+msgid "OGR feature without ID ignored"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:31
+msgid "Category index is not up to date"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:61 ../lib/vector/Vlib/cindex.c:125
+#: ../lib/vector/Vlib/cindex.c:143 ../lib/vector/Vlib/cindex.c:166
+msgid "Invalid layer index (index >= number of layers)"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:107
+msgid "Invalid layer index (index < 0 or index >= number of layers)"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:232
+msgid "Layer or category index out of range"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:283
+msgid "Layer index out of range"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:461
+#, c-format
+msgid "Unable to open cidx file <%s> for write"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:469
+#, c-format
+msgid "Error writing out category index file <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:512
+#, c-format
+msgid "Unable to open category index file for vector map <%s@%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/close.c:134
+#, c-format
+msgid "Unable to close vector <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/overlay.c:74
+msgid "unknown operator"
+msgstr ""
+
+#: ../lib/vector/Vlib/overlay.c:123
+msgid "Overlay: line/boundary types not supported by AND operator"
+msgstr ""
+
+#: ../lib/vector/Vlib/overlay.c:126
+msgid "Overlay: area x area types not supported by AND operator"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:54
+msgid "OGR format cannot be updated"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:66
+#, c-format
+msgid "Unable to open OGR data source '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:86
+#, c-format
+msgid "Unable to open layer <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:139
+#, c-format
+msgid "Unable to open fidx file for vector map <%s@%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:157
+#, c-format
+msgid ""
+"Feature index format version %d.%d is not supported by this release. Try to "
+"rebuild topology or upgrade GRASS."
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:162
+#, c-format
+msgid ""
+"Your GRASS version does not fully support feature index format %d.%d of the "
+"vector. Consider to rebuild topology or upgrade GRASS."
+msgstr ""
+
+#: ../lib/vector/Vlib/level.c:38
+msgid "Map structure was never initialized"
+msgstr ""
+
+#: ../lib/vector/Vlib/level.c:40
+msgid "Map structure has been closed"
+msgstr ""
+
+#: ../lib/vector/Vlib/break_lines.c:374
+#, c-format
+msgid "Intersections: %5d"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:364
+msgid "Line is not looped"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:598 ../lib/vector/Vlib/buffer2.c:609
+msgid "Next edge was visited but it is not the first one !!! breaking loop"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:657
+msgid "side != 0 feature not implemented"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:899 ../lib/vector/Vlib/buffer2.c:946
+msgid "zero area size"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:905 ../lib/vector/Vlib/buffer2.c:952
+msgid "Line was not closed"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:918 ../lib/vector/Vlib/buffer2.c:969
+msgid "Vect_get_point_in_poly() failed"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:27 ../lib/vector/Vlib/write.c:33
+#: ../lib/vector/Vlib/write.c:39 ../lib/vector/Vlib/write.c:46
+msgid "for this format/level not supported"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:135
+msgid "Unable to write feature, vector map is not opened"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:148
+msgid "Unable to write feature (negative offset)"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:181
+msgid "Unable to rewrite feature, vector map is not opened"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:194
+#, c-format
+msgid "Unable to rewrite feature %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:219
+#, c-format
+msgid ""
+"Unable to delete feature %d, vector map <%s> is not opened on topology level"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:225
+#, c-format
+msgid ""
+"Unable to delete feature %d, vector map <%s> is not opened in 'write' mode"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:239
+#, c-format
+msgid "Unable to delete feature %d from vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:265
+#, c-format
+msgid ""
+"Unable to restore feature %d, vector map <%s> is not opened on topology level"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:271
+#, c-format
+msgid ""
+"Unable to restore feature %d, vector map <%s> is not opened in 'write' mode"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:285
+#, c-format
+msgid "Unable to restore feature %d from vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/header.c:95 ../lib/vector/Vlib/header.c:143
+#, c-format
+msgid "Unable to open header file of vector <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/header.c:151
+#, c-format
+msgid "Corrupted row in head: %s"
+msgstr ""
+
+#: ../lib/vector/Vlib/header.c:189
+#, c-format
+msgid "Unknown keyword %s in vector head"
+msgstr ""
+
+#: ../lib/vector/Vlib/poly.c:235
+msgid "Unable to find point in polygon"
+msgstr ""
+
+#: ../lib/vector/Vlib/poly.c:649
+msgid "conditions failed"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:100
+#, c-format
+msgid "Programmer requested unknown open level %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:179
+msgid ""
+"Vector map which is not in the current mapset cannot be opened for update"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:211 ../lib/vector/Vlib/open.c:279
+#: ../lib/vector/Vlib/open.c:299
+#, c-format
+msgid ""
+"Unable to open vector map <%s> on level %d. Try to rebuild vector topology "
+"by v.build."
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:214
+msgid "Unable to read head file"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:236
+#, c-format
+msgid "Unable to open topology file for vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:262
+#, c-format
+msgid "Unable to open category index file for vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:353 ../lib/vector/Vlib/open.c:576
+#, c-format
+msgid "Unable to open history file for vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:531
+#, c-format
+msgid "%s is not in the current mapset (%s)"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:566
+#, c-format
+msgid "Unable to create vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:622
+#, c-format
+msgid "Unable to stat file <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:731
+msgid "Size of 'coor' file differs from value saved in topology file"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:742
+#, c-format
+msgid "Please rebuild topology for vector map <%s@%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:123
+#, c-format
+msgid "Building topology for vector map <%s>..."
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:141
+msgid "Topology was built"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:153
+#, c-format
+msgid "Number of nodes: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:154
+#, c-format
+msgid "Number of primitives: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:155
+#, c-format
+msgid "Number of points: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:156
+#, c-format
+msgid "Number of lines: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:157
+#, c-format
+msgid "Number of boundaries: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:158
+#, c-format
+msgid "Number of centroids: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:161
+#, c-format
+msgid "Number of faces: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:164
+#, c-format
+msgid "Number of kernels: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:205
+#, c-format
+msgid "Number of areas: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:206
+#, c-format
+msgid "Number of isles: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:209
+#, c-format
+msgid "Number of incorrect boundaries: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:213
+#, c-format
+msgid "Number of centroids outside area: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:217
+#, c-format
+msgid "Number of duplicate centroids: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:221
+#, c-format
+msgid "Number of areas without centroid: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:226
+msgid "Number of areas: -"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:227
+msgid "Number of isles: -"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:256
+#, c-format
+msgid "Unable to open topo file for write <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:264
+msgid "Error writing out topo file"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:407
+#, c-format
+msgid "Unable open spatial index file for write <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:415
+msgid "Error writing out spatial index file"
+msgstr ""
+
+#: ../lib/vector/vedit/cats.c:63
+#, c-format
+msgid "Unable to set category %d for (feature id %d)"
+msgstr ""
+
+#: ../lib/vector/vedit/select.c:232
+msgid "Unknown query tool"
+msgstr ""
diff --git a/locale/po/grasslibs_ro.po b/locale/po/grasslibs_ro.po
new file mode 100644
index 0000000..d2140f2
--- /dev/null
+++ b/locale/po/grasslibs_ro.po
@@ -0,0 +1,4816 @@
+# translation of grasslibs_ro.po into Romanian
+# This file is distributed under the same license as the GRASS package.
+# Copyright (C) 2013 GRASS Development Team
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: grasslibs_ro\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-10 00:42+0200\n"
+"PO-Revision-Date: 2013-06-20 17:00+0200\n"
+"Last-Translator: Mihai Moise\n"
+"Language-Team: GRASS Translation Team <grass-translations at lists.osgeo.org>\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: ../lib/raster/rem_io.c:40
+#, c-format
+msgid "ERROR %s from graphics driver.\n"
+msgstr "EROARE %s la placa grafică.\n"
+
+#: ../lib/raster/rem_io.c:167
+#, c-format
+msgid "Unable to allocate memory\n"
+msgstr "Nu s-a putut aloca memoria\n"
+
+#: ../lib/raster/rem_io.c:217
+#, c-format
+msgid "ERROR - eof from graphics monitor.\n"
+msgstr ""
+
+#: ../lib/raster/rem_io.c:237
+#, c-format
+msgid "Warning - no response from graphics monitor <%s>.\n"
+msgstr "Atenție - niciun răspuns de la monitor<%s>.\n"
+
+#: ../lib/raster/rem_io.c:239
+#, c-format
+msgid "Check to see if the mouse is still active.\n"
+msgstr "Verifică dacă mouse-ul este încă activ.\n"
+
+#: ../lib/raster/rem_io.c:244
+#, c-format
+msgid "ERROR - no response from graphics monitor <%s>.\n"
+msgstr "EROARE - niciun răspuns de la monitor<%s>.\n"
+
+#: ../lib/raster/io_sock.c:63
+msgid "No graphics monitor has been selected for output."
+msgstr "Niciun monitor nu a fost ales pentru ieșire."
+
+#: ../lib/raster/io_sock.c:64
+msgid "Please run \"d.mon\" to select a graphics monitor."
+msgstr "Rulează \"d.mon\"  pentru a selecta monitorul."
+
+#: ../lib/raster/io_sock.c:72
+#, c-format
+msgid "Failed to get socket name for monitor <%s>."
+msgstr "Nu s-a putut găsi numele de socket pentru monitor <%s>."
+
+#: ../lib/raster/io_sock.c:81
+#, c-format
+msgid "No socket to connect to for monitor <%s>."
+msgstr "Niciun socket pentru conectarea monitorului <%s>."
+
+#: ../lib/raster/io_sock.c:98
+msgid "Socket is already in use or not accepting connections."
+msgstr "Socket-ul este deja în folosință sau nu acceptă conexiuni."
+
+#: ../lib/raster/io_sock.c:99
+msgid "Use d.mon to select a monitor"
+msgstr "Folosește d.mon pentru a aselecta un monitor"
+
+#: ../lib/raster/io_sock.c:105
+msgid "Trying to connect to something not a socket."
+msgstr ""
+
+#: ../lib/raster/io_sock.c:106
+msgid "Probably program error."
+msgstr "Probabil o eroare de program."
+
+#: ../lib/raster/io_sock.c:111
+msgid "Connect attempt timed out."
+msgstr "Încercarea de conectare a depășit timpul maxim acceptat."
+
+#: ../lib/raster/io_sock.c:112
+msgid "Probably an error with the server."
+msgstr "Probabil o eroare cu serverul."
+
+#: ../lib/raster/io_sock.c:120
+msgid "Connection failed."
+msgstr "Conexiune eșuată."
+
+#: ../lib/ogsf/GVL2.c:248
+#, c-format
+msgid "Loading 3d raster map <%s>..."
+msgstr "Încărcare raster 3d <%s>..."
+
+#: ../lib/ogsf/gk.c:322
+msgid "Need at least 3 keyframes for spline"
+msgstr "Sunt necesare cel puțin 3 cadre principale pentru spline"
+
+#: ../lib/ogsf/gk.c:624
+msgid "Need at least 2 keyframes for interpolation"
+msgstr "Sunt necesare cel puțin două cadre principale pentru interpolare"
+
+#: ../lib/ogsf/Gv3.c:57 ../lib/ogsf/Gp3.c:109 ../lib/vector/Vlib/map.c:327
+#: ../lib/vector/Vlib/legal_vname.c:118 ../lib/vector/Vlib/legal_vname.c:121
+#: ../lib/vector/Vlib/open.c:168
+#, c-format
+msgid "Vector map <%s> not found"
+msgstr "Harta vectorială <%s> nu a fost găsită"
+
+#: ../lib/ogsf/Gv3.c:63 ../lib/ogsf/Gp3.c:115 ../lib/vector/Vlib/open.c:199
+#, c-format
+msgid "Unable to open vector map <%s>"
+msgstr "Nu s-a putut dechide harta vectorială <%s>"
+
+#: ../lib/ogsf/Gv3.c:249
+#, c-format
+msgid "No features from vector map <%s> fall within current region"
+msgstr ""
+"Niciun atribut din harta vectorială <%s> nu se suprapune peste actuala "
+"regiune"
+
+#: ../lib/ogsf/Gv3.c:254
+#, c-format
+msgid "Vector map <%s> loaded (%d features)"
+msgstr "Harta vectorială <%s> înărcată (%d atribute)"
+
+#: ../lib/ogsf/gvl_file.c:104
+msgid "Maximum number of datafiles exceeded"
+msgstr "Numărul maxim de fișiere de date depășit"
+
+#: ../lib/ogsf/gvl_file.c:428 ../lib/ogsf/Gvl3.c:39
+#: ../lib/gpde/N_arrays_io.c:296
+#, c-format
+msgid "3D raster map <%s> not found"
+msgstr "rasterul 3D <%s> nu a fost găsit"
+
+#: ../lib/ogsf/gvl_file.c:437 ../lib/gpde/N_arrays_io.c:304
+#, c-format
+msgid "Unable to open 3D raster map <%s>"
+msgstr "Nu s-a putut deschide rasterul 3D <%s> "
+
+#: ../lib/ogsf/gvl_file.c:443
+#, c-format
+msgid "Unable to read range of 3D raster map <%s>"
+msgstr "Nu s-a putut citi intervalul rasterului 3D <%s>"
+
+#: ../lib/ogsf/gvl_file.c:471
+#, c-format
+msgid "Unable to close 3D raster map <%s>"
+msgstr "Nu s-a putut închide rasterul 3D <%s>"
+
+#: ../lib/ogsf/Gp3.c:54 ../lib/ogsf/Gs3.c:126 ../lib/ogsf/Gs3.c:201
+#: ../lib/ogsf/Gs3.c:286 ../lib/ogsf/Gs3.c:359 ../lib/ogsf/Gs3.c:475
+#: ../lib/ogsf/Gs3.c:572 ../lib/ogsf/Gs3.c:639 ../lib/ogsf/Gs3.c:696
+#: ../lib/ogsf/Gs3.c:767 ../lib/ogsf/Gs3.c:837 ../lib/ogsf/gsd_legend.c:238
+#: ../lib/gpde/N_arrays_io.c:56 ../lib/gis/legal_name.c:94
+#: ../lib/gis/legal_name.c:97 ../lib/gis/opencell.c:1011
+#, c-format
+msgid "Raster map <%s> not found"
+msgstr "Harta raster <%s> nu este găsită"
+
+#: ../lib/ogsf/Gp3.c:145 ../lib/vector/Vlib/map.c:68
+#: ../lib/vector/Vlib/map.c:84
+#, c-format
+msgid "Unable to read vector map <%s>"
+msgstr "Un s-a putut citi harta vectorială <%s>"
+
+#: ../lib/ogsf/Gp3.c:206
+#, c-format
+msgid "No points from vector map <%s> fall within current region"
+msgstr ""
+"Niciun punct din harta vectorială <%s> nu se suprapune peste actuala regiune"
+
+#: ../lib/ogsf/Gp3.c:211
+#, c-format
+msgid "Vector map <%s> loaded (%d points)"
+msgstr "Harta vectorială <%s> încărcată (<%d> puncte)"
+
+#: ../lib/ogsf/trans.c:180
+msgid "Out of matrix stack space"
+msgstr "Nu mai este spațiu de stivuire în matrice "
+
+#: ../lib/ogsf/trans.c:200
+msgid "Tried to pop an empty stack"
+msgstr "S-a încercat suplimentarea unei stive goale"
+
+#: ../lib/ogsf/GK2.c:219 ../lib/ogsf/gsd_img_ppm.c:53
+#: ../lib/ogsf/gsd_img_ppm.c:96 ../lib/ogsf/gsd_img_tif.c:64
+#, c-format
+msgid "Unable to open file <%s> for writing"
+msgstr "Nu s-a putut deschide fișierul <%s> pentru scriere"
+
+#: ../lib/ogsf/GK2.c:275 ../lib/ogsf/GK2.c:288
+msgid "Check no. of frames requested and keyframes marked"
+msgstr "Verifică numărul cerut de cadre și cadrele principale marcate"
+
+#: ../lib/ogsf/gsds.c:109
+msgid "Maximum number of datasets exceeded"
+msgstr "Numărul maxim de seturi de date depășit"
+
+#: ../lib/ogsf/gsdrape.c:207
+msgid "Unable to process vector map - out of memory"
+msgstr "Nu s-a putut procesa harta vectorială - nu mai este memorie"
+
+#: ../lib/ogsf/gsd_label.c:58
+msgid "Max. number of labels reached!"
+msgstr "Numărul maxim de etichete atins!"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:73
+msgid "Unable to allocate stream"
+msgstr "Nu s-a putut aloca fluxul"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:176
+msgid "Video codec not found"
+msgstr "Codec-ul video nu a fost găsit"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:186
+msgid "Unable to open codec"
+msgstr "Nu s-a putut deschide codecul"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:205
+msgid "Unable to allocate picture"
+msgstr "Nu s-a putut aloca imaginea"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:216
+msgid "Unable to allocate temporary picture"
+msgstr "Nu s-a putut aloca imaginea temporară"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:283
+msgid "Error while writing video frame"
+msgstr "Eroare în timpul scrierii unui cadru video"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:329
+#, c-format
+msgid "Opening MPEG stream <%s>..."
+msgstr "Deschidere flux MPEG <%s>"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:341
+msgid "Unable to deduce output format from file extension: using MPEG"
+msgstr ""
+"Nu s-a putut deduce formatul de ieșire din extensia fișierului: folosind MPEG"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:349
+msgid "Unable to find suitable output format"
+msgstr "Nu s-a putut găsi un format de ieșire potrivit"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:356 ../lib/rst/interp_float/interp2d.c:119
+#: ../lib/rst/interp_float/interp2d.c:125
+#: ../lib/rst/interp_float/segmen2d.c:175
+#: ../lib/rst/interp_float/segmen2d.c:181
+#: ../lib/rst/interp_float/segmen2d.c:187
+#: ../lib/rst/interp_float/segmen2d.c:197 ../lib/vector/neta/spanningtree.c:99
+#: ../lib/vector/neta/flow.c:64 ../lib/vector/neta/flow.c:178
+#: ../lib/vector/neta/timetables.c:69 ../lib/vector/neta/timetables.c:168
+#: ../lib/vector/neta/timetables.c:178 ../lib/vector/neta/timetables.c:191
+#: ../lib/vector/neta/timetables.c:278 ../lib/vector/neta/timetables.c:413
+#: ../lib/vector/neta/timetables.c:425 ../lib/vector/neta/path.c:134
+#: ../lib/vector/neta/bridge.c:59 ../lib/vector/neta/centrality.c:63
+#: ../lib/vector/neta/centrality.c:145 ../lib/vector/neta/allpairs.c:50
+#: ../lib/vector/neta/articulation_point.c:60
+#: ../lib/vector/neta/components.c:46 ../lib/vector/neta/components.c:113
+#: ../lib/vector/Vlib/line.c:62
+msgid "Out of memory"
+msgstr "Nu mai este memorie"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:380
+msgid "Invalid output format parameters"
+msgstr "Parametri formatului de ieșire invalizi"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:402
+#, c-format
+msgid "Unable to open <%s>"
+msgstr "Nu s-a putut deschide <%s>"
+
+#: ../lib/ogsf/gsd_img_mpeg.c:415
+msgid "OGSF library has not been built with MPEG output support"
+msgstr "Librăria OGSF nu a fost construită cu suport de ieșire MPEG"
+
+#: ../lib/ogsf/gsd_prim.c:146
+#, c-format
+msgid "Color Material: %d"
+msgstr "Material color: %d"
+
+#: ../lib/ogsf/gsd_prim.c:630
+#, c-format
+msgid ""
+"gsd_rot(): %c is an invalid axis specification. Rotation ignored. Please "
+"advise GRASS developers of this error"
+msgstr ""
+"gsd_rot(): %c este o specificare de axă invalidă. Rotația ignorată. Adresați-"
+"vă dezvoltatorilor GRASS pentru această eroare"
+
+#: ../lib/ogsf/GS2.c:1207
+#, c-format
+msgid "no category info"
+msgstr "nicio informație asupra categoriei"
+
+#: ../lib/ogsf/GS2.c:1226
+#, c-format
+msgid "no data"
+msgstr "nicio dată"
+
+#: ../lib/ogsf/GS2.c:1651
+#, c-format
+msgid "Raster map <%s> is outside of current region. Load failed."
+msgstr "Rasterul <%s> este în afara actualei regiuni. Încărcarea a eșuat."
+
+#: ../lib/ogsf/GS2.c:1729 ../lib/ogsf/GS2.c:1735 ../lib/ogsf/GS2.c:1743
+#: ../lib/ogsf/GS2.c:1752 ../lib/ogsf/GS2.c:1760 ../lib/ogsf/GS2.c:1770
+#: ../lib/ogsf/GS2.c:1818
+msgid "GS_load_att_map(): Out of memory. Unable to load map"
+msgstr "GS_load_att_map(): Nu mai este memorie. Nu s-a putut încărca harta"
+
+#: ../lib/ogsf/GS2.c:1846
+msgid "Loading failed"
+msgstr "Încărcare eșuată"
+
+#: ../lib/ogsf/GS2.c:1850
+msgid "Error finding range"
+msgstr "Eroare în găsirea intervalului"
+
+#: ../lib/ogsf/Gs3.c:133 ../lib/ogsf/Gs3.c:208 ../lib/ogsf/Gs3.c:366
+#: ../lib/ogsf/Gs3.c:482 ../lib/ogsf/Gs3.c:587
+msgid "Unable to allocate memory for a null buffer"
+msgstr "Nu s-a putut aloca memorie pentru un buffer nul"
+
+#: ../lib/ogsf/Gs3.c:137 ../lib/ogsf/Gs3.c:212 ../lib/ogsf/Gs3.c:370
+#: ../lib/ogsf/Gs3.c:486 ../lib/ogsf/Gs3.c:577 ../lib/gpde/N_arrays_io.c:68
+#, c-format
+msgid "Unable to open raster map <%s>"
+msgstr "Nu s-a putut deschide rasterul <%s>"
+
+#: ../lib/ogsf/Gs3.c:140 ../lib/ogsf/Gs3.c:215 ../lib/ogsf/Gs3.c:378
+#: ../lib/ogsf/Gs3.c:494 ../lib/ogsf/Gs3.c:590
+#, c-format
+msgid "Loading raster map <%s>..."
+msgstr "Încărcare raster <%s>"
+
+#: ../lib/ogsf/Gs3.c:647
+#, c-format
+msgid "Color table range doesn't match data (mincol=%d, maxcol=%d"
+msgstr ""
+
+#: ../lib/ogsf/Gs3.c:709 ../lib/ogsf/Gs3.c:781
+#, c-format
+msgid "Translating colors from raster map <%s>..."
+msgstr "Traducere culori pentru rasterul <%s>..."
+
+#: ../lib/ogsf/Gs3.c:1020
+msgid "View not saved by this program,there may be some inconsistancies"
+msgstr ""
+"Vizualizare nesalvată de program, ar putea exista anumite inconsecvențe"
+
+#: ../lib/ogsf/gs_bm.c:124
+msgid "Bitmap mismatch"
+msgstr "Nepotrivire bitmap"
+
+#: ../lib/ogsf/gsd_surf.c:1742
+msgid "Cut-plane points mis-match between surfaces. Check resolution(s)."
+msgstr ""
+
+#: ../lib/ogsf/gsd_legend.c:245
+#, c-format
+msgid "Unable to read color file of raster map <%s>"
+msgstr "Nu s-a putut citit fișierul foto al rasterului <%s>"
+
+#: ../lib/ogsf/gsd_legend.c:251
+#, c-format
+msgid "Unable to read category file of raster map <%s>"
+msgstr "Nu s-a putut citit fișierul categorie al rasterului <%s>"
+
+#: ../lib/ogsf/gsd_legend.c:268
+#, c-format
+msgid "Unable to read fp range of raster map <%s>"
+msgstr "Nu s-a putut citi intervalul fp pentru rasterul <%s>"
+
+#: ../lib/ogsf/gsd_legend.c:280
+#, c-format
+msgid "Unable to read range of raster map <%s>"
+msgstr "Nu s-a putut citi intervalul pentru rasterul <%s> "
+
+#: ../lib/ogsf/gsd_legend.c:294
+msgid "Range request error for legend"
+msgstr ""
+
+#: ../lib/ogsf/gsd_legend.c:384
+msgid "Unable to show discrete FP range (use list"
+msgstr "Nu s-a putut afișa intervalul FP discret (folosiți lista"
+
+#: ../lib/ogsf/gsd_legend.c:500
+msgid "Too many categories to show as discrete!"
+msgstr "Prea multe categorii de afișsat ca discrete!"
+
+#: ../lib/ogsf/gsd_legend.c:502
+msgid "Try using smaller font!"
+msgstr "Încercați să folosiți un font mai mic!"
+
+#: ../lib/gpde/N_arrays_io.c:97
+#, c-format
+msgid "Reading raster map <%s> into memory"
+msgstr "Citirea rasterului <%s> în memorie"
+
+#: ../lib/gpde/N_arrays_io.c:104
+msgid "Could not get raster row"
+msgstr "Nu s-a putut obține rândul raster"
+
+#: ../lib/gpde/N_arrays_io.c:162 ../lib/gpde/N_arrays_io.c:244
+msgid "Unable to close input map"
+msgstr "Nu s-a putut închide harta de intrare"
+
+#: ../lib/gpde/N_arrays_io.c:191
+msgid "N_array_2d * array is empty"
+msgstr "Șirul n_array_2d* este gol"
+
+#: ../lib/gpde/N_arrays_io.c:203
+#, c-format
+msgid "Unable to create raster map <%s>"
+msgstr "Nu s-a putut crea rasterul <%s>"
+
+#: ../lib/gpde/N_arrays_io.c:212
+#, fuzzy, c-format
+msgid "Write 2d array to raster map <%s>"
+msgstr "Scrie șirul 2d în raster"
+
+#: ../lib/gpde/N_arrays_io.c:228 ../lib/gpde/N_arrays_io.c:233
+#: ../lib/gpde/N_arrays_io.c:238
+#, c-format
+msgid "Unable to write raster row %i"
+msgstr "Nu s-a putut scrie rândul %i din raster"
+
+#: ../lib/gpde/N_arrays_io.c:332
+#, c-format
+msgid "Read g3d map <%s> into the memory"
+msgstr "Citește harta g3d <%s> în memorie"
+
+#: ../lib/gpde/N_arrays_io.c:387 ../lib/gpde/N_arrays_io.c:487
+msgid "Error closing g3d file"
+msgstr "Eroare în închidere fișierului g3d"
+
+#: ../lib/gpde/N_arrays_io.c:446
+#, c-format
+msgid "Error opening g3d map <%s>"
+msgstr "Eroare în dechiderea hărții g3d <%s>"
+
+#: ../lib/gpde/N_arrays_io.c:448
+#, c-format
+msgid "Write 3d array to g3d map <%s>"
+msgstr "Scrie șirul 3d la harta g3d <%s>"
+
+#: ../lib/gpde/N_solvers_classic_iter.c:57
+#: ../lib/gpde/N_solvers_classic_iter.c:94 ../lib/gpde/N_solvers.c:55
+#: ../lib/gpde/N_solvers.c:93 ../lib/gpde/N_solvers.c:160
+#: ../lib/gpde/N_solvers_krylov.c:78 ../lib/gpde/N_solvers_krylov.c:255
+#: ../lib/gpde/N_solvers_krylov.c:423 ../lib/gpde/N_solvers_krylov.c:832
+msgid "The linear equation system is not quadratic"
+msgstr "Sistemul de ecuații liniare nu este pătratic"
+
+#: ../lib/gpde/N_solvers_classic_iter.c:152
+#, c-format
+msgid "sparse Jacobi -- iteration %5i error %g\n"
+msgstr "sparse Jacobi -- la repetarea %5i eroarea %g\n"
+
+#: ../lib/gpde/N_solvers_classic_iter.c:154
+#, c-format
+msgid "sparse SOR -- iteration %5i error %g\n"
+msgstr "sparse SOR-- la repetarea %5i eroarea %g\n"
+
+#: ../lib/gpde/N_solvers_classic_iter.c:197
+#, c-format
+msgid "Jacobi -- iteration %5i error %g\n"
+msgstr "Jacobi -- la repetarea %5i eroarea %g\n"
+
+#: ../lib/gpde/N_solvers_classic_iter.c:235
+#, c-format
+msgid "SOR -- iteration %5i error %g\n"
+msgstr "SOR-- la repetarea %5i eroarea %g\n"
+
+#: ../lib/gpde/test/test_main.c:49
+msgid "Choose the unit tests to run"
+msgstr "Alege testele unității pentru a rula"
+
+#: ../lib/gpde/test/test_main.c:56
+msgid "Choose the integration tests to run"
+msgstr "Alege testele de integrare pentru a rula"
+
+#: ../lib/gpde/test/test_main.c:61
+msgid "Run all unit tests"
+msgstr "Rulează toate testele unității "
+
+#: ../lib/gpde/test/test_main.c:65
+msgid "Run all integration tests"
+msgstr "Rulează toate testele de integrare"
+
+#: ../lib/gpde/test/test_main.c:69
+#, fuzzy
+msgid "Run all unit and integration tests"
+msgstr "Rulează toate testele de unitate și integrare"
+
+#: ../lib/gpde/test/test_main.c:85
+msgid "test, gpde"
+msgstr ""
+
+#: ../lib/gpde/test/test_main.c:87
+#, fuzzy
+msgid "Performs unit and integration tests for gpde library"
+msgstr "Prestează teste de unitate și integrare pentru librăria gpde"
+
+#: ../lib/gpde/test/test_gwflow.c:43
+msgid ""
+"\n"
+"++ Running gwflow integration tests ++"
+msgstr ""
+"\n"
+"++ Testele de influx gwflow în curs de rulare ++"
+
+#: ../lib/gpde/test/test_gwflow.c:45
+msgid "\t 1. testing 2d gwflow"
+msgstr "\t 1. se testează 2d gwflow"
+
+#: ../lib/gpde/test/test_gwflow.c:48
+msgid "\t 2. testing 3d gwflow"
+msgstr "\t 1. se testează 3d gwflow"
+
+#: ../lib/gpde/test/test_gwflow.c:52
+msgid ""
+"\n"
+"-- gwflow integration tests failure --"
+msgstr ""
+"\n"
+"-- eșec în testele integrării gwflow --"
+
+#: ../lib/gpde/test/test_gwflow.c:54
+msgid ""
+"\n"
+"-- gwflow integration tests finished successfully --"
+msgstr ""
+"\n"
+"-- testele de integrare gwflow terminate cu succes--"
+
+#: ../lib/gpde/test/test_arrays.c:48
+msgid ""
+"\n"
+"++ Running array unit tests ++"
+msgstr ""
+"\n"
+"++ Testele unității de șiruri în curs de rulare ++"
+
+#: ../lib/gpde/test/test_arrays.c:50
+msgid "\t 1. testing 2d arrays"
+msgstr "\t 1. șirurile 2d în curs de testare"
+
+#: ../lib/gpde/test/test_arrays.c:53
+msgid "\t 2. testing 3d arrays"
+msgstr "\t 1. șirurile 3d în curs de testare"
+
+#: ../lib/gpde/test/test_arrays.c:57
+msgid ""
+"\n"
+"-- Array unit tests failure --"
+msgstr ""
+"\n"
+"-- Testele unitatății de șiruri a eșuat--"
+
+#: ../lib/gpde/test/test_arrays.c:59
+msgid ""
+"\n"
+"-- Array unit tests finished successfully --"
+msgstr ""
+"\n"
+"-- Testele unității de șiruri încheiate cu succes --"
+
+#: ../lib/gpde/test/test_tools.c:34
+msgid ""
+"\n"
+"++ Running math tool unit tests ++"
+msgstr ""
+"\n"
+"++Testele unității instrumentelor matematice în curs de rulare++"
+
+#: ../lib/gpde/test/test_tools.c:39
+msgid ""
+"\n"
+"-- math tool unit tests failure --"
+msgstr ""
+"\n"
+"-- testele unității instrumentelor matematice au eșuat--"
+
+#: ../lib/gpde/test/test_tools.c:41
+msgid ""
+"\n"
+"-- math tool unit tests finished successfully --"
+msgstr ""
+"\n"
+"-- testele unității instrumentelor matematice au fost încheiate cu succes--"
+
+#: ../lib/gpde/test/test_assemble.c:42
+msgid ""
+"\n"
+"++ Running assembling unit tests ++"
+msgstr ""
+"\n"
+"++ Asamblarea testelor unității în curs de rulare ++"
+
+#: ../lib/gpde/test/test_assemble.c:44
+msgid "\t 1. testing 2d assembling"
+msgstr "\t 1. testarea asamblării 2d în curs de testare"
+
+#: ../lib/gpde/test/test_assemble.c:47
+msgid "\t 2. testing 3d assembling"
+msgstr "\t 1. testarea asamblării 3d în curs de testare"
+
+#: ../lib/gpde/test/test_assemble.c:51
+msgid ""
+"\n"
+"-- Assembling unit tests failure --"
+msgstr ""
+"\n"
+"-- în curs de asamblare a eșuării testelor unitatății--"
+
+#: ../lib/gpde/test/test_assemble.c:53
+msgid ""
+"\n"
+"-- Assembling unit tests finished successfully --"
+msgstr ""
+"\n"
+"-- Asamablarea testelor unității încheiată cu succes--"
+
+#: ../lib/gpde/test/test_heat.c:33
+msgid ""
+"\n"
+"++ Running heat flow integration tests ++"
+msgstr ""
+"\n"
+"++ Rularea testelor de integrare a fluxulului de căldură în rulare ++"
+
+#: ../lib/gpde/test/test_heat.c:35
+msgid "\t 1. testing 2d heat flow"
+msgstr "\t 1. se testează fluxul 2d de căldură"
+
+#: ../lib/gpde/test/test_heat.c:37
+msgid "\t 2. testing 3d heat flow"
+msgstr "\t 1. se testează fluxul 3d de căldură "
+
+#: ../lib/gpde/test/test_heat.c:40
+msgid ""
+"\n"
+"-- heat flow integration tests failure --"
+msgstr ""
+"\n"
+"-- eșec în testare integrării fluxului de căldură --"
+
+#: ../lib/gpde/test/test_heat.c:42
+msgid ""
+"\n"
+"-- heat flow integration tests finished successfully --"
+msgstr ""
+"\n"
+"-- testarea integrării fluxului de căldură încheiată cu succes--"
+
+#: ../lib/gpde/test/test_geom.c:36
+msgid ""
+"\n"
+"++ Running geom_data unit tests ++"
+msgstr ""
+"\n"
+"++ unitatea geom_data în curs de rulare++"
+
+#: ../lib/gpde/test/test_geom.c:41
+msgid ""
+"\n"
+"-- geom_data unit tests failure --"
+msgstr ""
+"\n"
+"-- eșec în testele unității geom_data  --"
+
+#: ../lib/gpde/test/test_geom.c:43
+msgid ""
+"\n"
+"-- geom_data unit tests finished successfully --"
+msgstr ""
+"\n"
+"-- testele unității geom_data au fost finalizate cu succes --"
+
+#: ../lib/gpde/test/test_gradient.c:42
+msgid ""
+"\n"
+"++ Running gradient unit tests ++"
+msgstr ""
+"\n"
+"++ În curs de rulare a testelor unității ++"
+
+#: ../lib/gpde/test/test_gradient.c:44
+msgid "\t 1. testing 2d gradient"
+msgstr "\t 1. în curs de testare a gradientului 2d"
+
+#: ../lib/gpde/test/test_gradient.c:47
+msgid "\t 2. testing 3d gradient"
+msgstr "\t 2. în curs de testare a gradientului 3d"
+
+#: ../lib/gpde/test/test_gradient.c:51
+msgid ""
+"\n"
+"-- Gradient unit tests failure --"
+msgstr ""
+"\n"
+"-- Eșec în testele unității gradientului --"
+
+#: ../lib/gpde/test/test_gradient.c:53
+msgid ""
+"\n"
+"-- Gradient unit tests finished successfully --"
+msgstr ""
+"\n"
+"-- Testele unității gradientului au fost încheiate cu succes--"
+
+#: ../lib/gpde/test/test_solvers.c:37
+msgid ""
+"\n"
+"++ Running solver unit tests ++"
+msgstr ""
+"\n"
+"++ Testele unității solver în curs de rulare++"
+
+#: ../lib/gpde/test/test_solvers.c:42
+msgid ""
+"\n"
+"-- Solver unit tests failure --"
+msgstr ""
+"\n"
+"-- Eșec în testarea unității solver --"
+
+#: ../lib/gpde/test/test_solvers.c:44
+msgid ""
+"\n"
+"-- Solver unit tests finished successfully --"
+msgstr ""
+"\n"
+"-- Testele unității solver au fost finalizate cu succes --"
+
+#: ../lib/gpde/test/test_solute_transport.c:43
+msgid ""
+"\n"
+"++ Running solute_transport integration tests ++"
+msgstr ""
+"\n"
+"++ Testele integrării solute_transport în curs de rulare ++"
+
+#: ../lib/gpde/test/test_solute_transport.c:45
+msgid "\t 1. testing 2d solute_transport"
+msgstr "\t 1. 2d solute_transport în curs de testare"
+
+#: ../lib/gpde/test/test_solute_transport.c:48
+msgid "\t 2. testing 3d solute_transport"
+msgstr "\t 2. 3d solute_transport în curs de testare"
+
+#: ../lib/gpde/test/test_solute_transport.c:52
+msgid ""
+"\n"
+"-- solute_transport integration tests failure --"
+msgstr ""
+"\n"
+"-- eșec în testatea integrării solute_transport --"
+
+#: ../lib/gpde/test/test_solute_transport.c:54
+msgid ""
+"\n"
+"-- solute_transport integration tests finished successfully --"
+msgstr ""
+"\n"
+"-- testatea integrării solute_transport a fost finalizată cu succes --"
+
+#: ../lib/gpde/test/test_les.c:34
+msgid ""
+"\n"
+"++ Running les creation unit tests ++"
+msgstr ""
+
+#: ../lib/gpde/test/test_les.c:39
+msgid ""
+"\n"
+"-- les creation unit tests failure --"
+msgstr ""
+
+#: ../lib/gpde/test/test_les.c:41
+msgid ""
+"\n"
+"-- les creation unit tests finished successfully --"
+msgstr ""
+
+#: ../lib/gpde/test/test_les.c:95
+msgid "\t * testing les creation in parallel\n"
+msgstr ""
+
+#: ../lib/gpde/test/test_les.c:126
+msgid "\t * testing les creation in serial\n"
+msgstr ""
+
+#: ../lib/gpde/N_parse_options.c:59
+msgid ""
+"The type of solver which should solve the symmetric linear equation system"
+msgstr ""
+"Tipul de solver care ar trebui să rezolve sisteme de ecuații liniare "
+"simetrice"
+
+#: ../lib/gpde/N_parse_options.c:71
+msgid "The type of solver which should solve the linear equation system"
+msgstr "Tipul de solver care ar trebui să rezolve sistemul de ecuații liniare"
+
+#: ../lib/gpde/N_parse_options.c:80
+msgid "Maximum number of iteration used to solver the linear equation system"
+msgstr ""
+"Numărul maxim de repetări utilizat pentru a rezolva sistemul de ecuații "
+"liniare"
+
+#: ../lib/gpde/N_parse_options.c:89
+msgid ""
+"Error break criteria for iterative solvers (jacobi, sor, cg or bicgstab)"
+msgstr ""
+
+#: ../lib/gpde/N_parse_options.c:98
+msgid ""
+"The relaxation parameter used by the jacobi and sor solver for speedup or "
+"stabilizing"
+msgstr ""
+"Parametrul de relaxare folosit de solverele jacobi și sor pentru accelerație "
+"sau stabilizare"
+
+#: ../lib/gpde/N_parse_options.c:106
+msgid "The calculation time in seconds"
+msgstr "Timpul de calculare în secunde"
+
+#: ../lib/gpde/N_solvers.c:50
+msgid "The gauss elimination solver does not work with sparse matrices"
+msgstr "Solverul de eliminare gauss nu funcționează cu matricea sparse"
+
+#: ../lib/gpde/N_solvers.c:60
+msgid "Starting direct gauss elimination solver"
+msgstr "Solverul de eliminare gauss directă în curs de pornire"
+
+#: ../lib/gpde/N_solvers.c:88
+msgid "The lu solver does not work with sparse matrices"
+msgstr "Solverul lu nu funcționează cu matrice sparse"
+
+#: ../lib/gpde/N_solvers.c:98
+msgid "Starting direct lu decomposition solver"
+msgstr "Solverul de descompunere directă lu în curs de pornire"
+
+#: ../lib/gpde/N_solvers.c:155
+msgid "The cholesky solver does not work with sparse matrices"
+msgstr "Solverul cholesky nu funcționează cu matricea sparse"
+
+#: ../lib/gpde/N_solvers.c:166 ../lib/gpde/N_solvers_krylov.c:84
+#: ../lib/gpde/N_solvers_krylov.c:261
+msgid "Matrix is not symmetric!"
+msgstr "Matricea nu este simetrică!"
+
+#: ../lib/gpde/N_solvers.c:170
+msgid "Starting cholesky decomposition solver"
+msgstr "Solverul de descompunere cholesky în curs de pornire"
+
+#: ../lib/gpde/N_solvers.c:173 ../lib/gpde/N_solvers_krylov.c:190
+#: ../lib/gpde/N_solvers_krylov.c:357 ../lib/gpde/N_solvers_krylov.c:481
+msgid "Unable to solve the linear equation system"
+msgstr "Nu s-a putut rezolva sistemul de ecuații liniare"
+
+#: ../lib/gpde/N_solvers_krylov.c:198
+#, c-format
+msgid "Sparse PCG -- iteration %i error  %g\n"
+msgstr "Sparse PCG -- la repetarea %i eroarea  %g\n"
+
+#: ../lib/gpde/N_solvers_krylov.c:200
+#, c-format
+msgid "PCG -- iteration %i error  %g\n"
+msgstr "PCG -- la repetarea %i eroarea  %g\n"
+
+#: ../lib/gpde/N_solvers_krylov.c:365
+#, c-format
+msgid "Sparse CG -- iteration %i error  %g\n"
+msgstr "Sparse CG -- la repetarea %i eroarea  %g\n"
+
+#: ../lib/gpde/N_solvers_krylov.c:367
+#, c-format
+msgid "CG -- iteration %i error  %g\n"
+msgstr "CG -- la repetarea %i eroarea  %g\n"
+
+#: ../lib/gpde/N_solvers_krylov.c:530
+#, c-format
+msgid "Sparse BiCGStab -- iteration %i error  %g\n"
+msgstr "Sparse BiCGStab -- la repetarea %i erorea  %g\n"
+
+#: ../lib/gpde/N_solvers_krylov.c:533
+#, c-format
+msgid "BiCGStab -- iteration %i error  %g\n"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:150
+#, c-format
+msgid "Invalid zone %s specified"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:230
+msgid "Unable to initialise PROJ.4 with the following parameter list:"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:238
+#, c-format
+msgid "The error message: %s"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:296
+msgid "Option input overflowed option table"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:327
+#, c-format
+msgid "Unable to initialize pj cause: %s"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:403
+msgid "Input Projection Parameters"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:406
+msgid "Input Unit Factor"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:416
+msgid "Output Projection Parameters"
+msgstr ""
+
+#: ../lib/proj/get_proj.c:419
+msgid "Output Unit Factor"
+msgstr ""
+
+#: ../lib/proj/datum.c:250
+msgid "Unable to open temporary file"
+msgstr ""
+
+#: ../lib/proj/datum.c:344 ../lib/gis/get_projname.c:52
+#: ../lib/gis/get_datum_name.c:58 ../lib/gis/get_ell_name.c:45
+#, c-format
+msgid "Hit RETURN to cancel request\n"
+msgstr ""
+
+#: ../lib/proj/datum.c:418 ../lib/proj/datum.c:498
+#, c-format
+msgid "Unable to open datum table file <%s>"
+msgstr ""
+
+#: ../lib/proj/datum.c:431 ../lib/proj/datum.c:512
+#, c-format
+msgid "Error in datum table file <%s>, line %d"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:75
+#, c-format
+msgid "Invalid ellipsoid <%s> in file"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:98
+msgid "No secondary ellipsoid descriptor (rf, es or b) in file"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:102
+msgid "Invalid ellipsoid descriptors (a, rf, es or b) in file"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:115
+msgid "No ellipsoid info given in file"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:215 ../lib/gis/get_ellipse.c:283
+#, c-format
+msgid "Unable to open ellipsoid table file <%s>"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:268 ../lib/gis/get_ellipse.c:338
+#, c-format
+msgid "Line%s of ellipsoid table file <%s> is invalid"
+msgstr ""
+
+#: ../lib/proj/ellipse.c:269 ../lib/gis/get_ellipse.c:336
+#, c-format
+msgid "Lines%s of ellipsoid table file <%s> are invalid"
+msgstr ""
+
+#: ../lib/proj/convert.c:110
+msgid "Unable parse GRASS PROJ_INFO file"
+msgstr ""
+
+#: ../lib/proj/convert.c:115
+msgid "Unable get PROJ.4-style parameter string"
+msgstr ""
+
+#: ../lib/proj/convert.c:127
+#, c-format
+msgid ""
+"OGR can't parse PROJ.4-style parameter string: %s (OGR Error code was %d)"
+msgstr ""
+
+#: ../lib/proj/convert.c:133
+#, c-format
+msgid "OGR can't get WKT-style parameter string (OGR Error code was %d)"
+msgstr ""
+
+#: ../lib/proj/convert.c:390
+msgid "No projection name! Projection parameters likely to be meaningless."
+msgstr ""
+
+#: ../lib/proj/convert.c:426
+#, c-format
+msgid "Datum <%s> not recognised by GRASS and no parameters found"
+msgstr ""
+
+#: ../lib/proj/convert.c:442
+#, c-format
+msgid ""
+"Datum <%s> apparently recognised by GRASS but no parameters found. You may "
+"want to look into this."
+msgstr ""
+
+#: ../lib/proj/convert.c:446
+#, c-format
+msgid ""
+"Invalid transformation number %d; valid range is 1 to %d. Leaving datum "
+"transform parameters unspecified."
+msgstr ""
+
+#: ../lib/proj/do_proj.c:106 ../lib/proj/do_proj.c:180
+#, c-format
+msgid "pj_transform() failed: %s"
+msgstr ""
+
+#: ../lib/nviz/position.c:56
+msgid "Unable to set focus"
+msgstr ""
+
+#: ../lib/nviz/render.c:105
+msgid "Bad server connection"
+msgstr ""
+
+#: ../lib/nviz/render.c:114
+msgid "Unable to create rendering context"
+msgstr ""
+
+#: ../lib/nviz/nviz.c:126
+#, c-format
+msgid "Invalid color (%s), using \"white\" as default"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:59
+msgid "Maximum surfaces loaded!"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:88
+msgid "Maximum vector line maps loaded!"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:97 ../lib/nviz/map_obj.c:128
+#, c-format
+msgid "Error loading vector map <%s>"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:116
+msgid "Maximum vector point maps loaded!"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:143
+msgid "Maximum volumes loaded!"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:152
+#, c-format
+msgid "Error loading 3d raster map <%s>"
+msgstr ""
+
+#: ../lib/nviz/map_obj.c:160
+msgid "Nviz_new_map_obj(): unsupported data type"
+msgstr ""
+
+#: ../lib/nviz/lights.c:171
+msgid "Unable to define new light"
+msgstr ""
+
+#: ../lib/sites/sites.c:97
+#, c-format
+msgid "Attributes for category %d not found"
+msgstr ""
+
+#: ../lib/sites/sites.c:136
+msgid "Category must be integer"
+msgstr ""
+
+#: ../lib/sites/sites.c:210
+msgid "Memory error in writing timestamp"
+msgstr ""
+
+#: ../lib/sites/sites.c:212
+msgid "Illegal TimeStamp string"
+msgstr ""
+
+#: ../lib/sites/sites.c:241
+msgid "Memory error in allocating timestamp"
+msgstr ""
+
+#: ../lib/sites/sites.c:348 ../lib/sites/sites.c:478
+msgid ""
+"Dev note: Adapted sites library used for vector points. (module should be "
+"updated to GRASS 6 vector library)"
+msgstr ""
+
+#: ../lib/sites/sites.c:372 ../lib/db/dbmi_client/copy_tab.c:105
+#: ../lib/db/dbmi_client/copy_tab.c:126 ../lib/db/dbmi_client/db.c:46
+#: ../lib/db/dbmi_client/delete_tab.c:49 ../lib/rst/interp_float/vinput2d.c:88
+#: ../lib/vector/neta/timetables.c:133 ../lib/vector/neta/utils.c:116
+#: ../lib/vector/Vlib/map.c:271 ../lib/vector/Vlib/map.c:405
+#: ../lib/vector/Vlib/map.c:621 ../lib/vector/Vlib/array.c:284
+#: ../lib/vector/Vlib/net.c:186 ../lib/vector/Vlib/net.c:356
+#, c-format
+msgid "Unable to open database <%s> by driver <%s>"
+msgstr ""
+
+#: ../lib/sites/sites.c:381 ../lib/db/dbmi_client/table.c:110
+#: ../lib/db/dbmi_client/copy_tab.c:199 ../lib/db/dbmi_client/copy_tab.c:276
+#, c-format
+msgid "Unable to open select cursor: '%s'"
+msgstr ""
+
+#: ../lib/sites/sites.c:397
+msgid "Cannot fetch row"
+msgstr ""
+
+#: ../lib/sites/sites.c:579
+msgid "G_oldsite_new_struct: invalid # dims or fields"
+msgstr ""
+
+#: ../lib/sites/sites.c:1249
+#, c-format
+msgid "Cannot open database %s by driver %s"
+msgstr ""
+
+#: ../lib/sites/sites.c:1257
+msgid "Cannot select attributes"
+msgstr ""
+
+#: ../lib/db/dbmi_base/legal_dbname.c:25
+#, c-format
+msgid "Illegal table map name <%s>. May not contain '.' or 'NULL'.\n"
+msgstr ""
+
+#: ../lib/db/dbmi_base/legal_dbname.c:33
+#, c-format
+msgid "Illegal table map name <%s>. Must start with a letter.\n"
+msgstr ""
+
+#: ../lib/db/dbmi_base/legal_dbname.c:43
+#, c-format
+msgid "Illegal table map name <%s>. Character <%c> not allowed.\n"
+msgstr ""
+
+#: ../lib/db/dbmi_base/login.c:98
+msgid "Login file corrupted"
+msgstr ""
+
+#: ../lib/db/dbmi_base/default_name.c:127
+msgid "Programmer error"
+msgstr ""
+
+#: ../lib/db/dbmi_client/table.c:46
+#, c-format
+msgid "Unable open database <%s> by driver <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:100 ../lib/db/dbmi_client/copy_tab.c:120
+#: ../lib/db/dbmi_client/db.c:41
+#, c-format
+msgid "Unable to start driver <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:144
+#, c-format
+msgid "Unable to get list tables in database <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:157
+#, c-format
+msgid "Table <%s> already exists in database <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:231
+#, c-format
+msgid "Column <%s> is not integer"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:248 ../lib/rst/interp_float/vinput2d.c:94
+#: ../lib/rst/interp_float/vinput2d.c:108
+#, c-format
+msgid "Column <%s> not found"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:251
+#, c-format
+msgid "Unable to create table <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:295
+#, c-format
+msgid "Unable to fetch data from table <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/copy_tab.c:351
+#, c-format
+msgid "Unknown column type (column <%s>)"
+msgstr ""
+
+#: ../lib/db/dbmi_client/column.c:114
+#, c-format
+msgid "Unable to describe table <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/select.c:119 ../lib/db/dbmi_client/select.c:221
+#: ../lib/db/dbmi_client/select.c:288
+msgid "Missing column name"
+msgstr ""
+
+#: ../lib/db/dbmi_client/select.c:216 ../lib/db/dbmi_client/select.c:283
+msgid "Missing key column name"
+msgstr ""
+
+#: ../lib/db/dbmi_client/select.c:317
+#, c-format
+msgid "Unable select records from table <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/select.c:333
+msgid "Key column type is not integer"
+msgstr ""
+
+#: ../lib/db/dbmi_client/delete_tab.c:44
+#, c-format
+msgid "Unable to open driver <%s>"
+msgstr ""
+
+#: ../lib/db/dbmi_client/delete_tab.c:62
+#, c-format
+msgid "Unable to drop table: '%s'"
+msgstr ""
+
+#: ../lib/cairodriver/Draw_bitmap.c:47
+msgid "Cairo_draw_bitmap: Failed to create source"
+msgstr ""
+
+#: ../lib/init/lock.c:38
+#, c-format
+msgid "Usage: %s file pid"
+msgstr ""
+
+#: ../lib/init/lock.c:42
+msgid "Concurrent mapset locking is not supported on Windows"
+msgstr ""
+
+#: ../lib/init/lock.c:60
+#, c-format
+msgid "Unable to write lockfile %s (disk full? Permissions?)"
+msgstr ""
+
+#: ../lib/display/tran_colr.c:129 ../lib/display/tran_colr.c:131
+#, c-format
+msgid "[%s]: No such color"
+msgstr ""
+
+#: ../lib/symbol/read.c:211
+#, c-format
+msgid "Cannot read symbol line coordinates: %s"
+msgstr ""
+
+#: ../lib/symbol/read.c:259
+#, c-format
+msgid ""
+"Incorrect symbol name: '%s' (should be: group/name or group/name at mapset)"
+msgstr ""
+
+#: ../lib/symbol/read.c:283
+#, c-format
+msgid "Cannot find/open symbol: '%s'"
+msgstr ""
+
+#: ../lib/symbol/read.c:388 ../lib/symbol/read.c:406 ../lib/symbol/read.c:416
+#: ../lib/symbol/read.c:434
+#, c-format
+msgid "Incorrect symbol color: '%s', using default."
+msgstr ""
+
+#: ../lib/driver/main.c:90
+#, c-format
+msgid "Graphics driver [%s] started"
+msgstr ""
+
+#: ../lib/driver/parse_ftcap.c:32
+#, c-format
+msgid "%s: Unable to read font definition file; use the default"
+msgstr ""
+
+#: ../lib/driver/parse_ftcap.c:38
+#, c-format
+msgid "%s: No font definition file"
+msgstr ""
+
+#: ../lib/driver/command.c:508
+#, c-format
+msgid "Unknown command: %d last: %d"
+msgstr ""
+
+#: ../lib/driver/command.c:547
+msgid "Monitor: get_command: Premature EOF"
+msgstr ""
+
+#: ../lib/vask/V_support.c:60
+#, c-format
+msgid "Unable to open file %s"
+msgstr ""
+
+#: ../lib/gmath/del2g.c:50
+msgid "    taking FFT of image..."
+msgstr ""
+
+#: ../lib/gmath/del2g.c:56
+msgid "    computing del**2 g..."
+msgstr ""
+
+#: ../lib/gmath/del2g.c:59
+msgid "    taking FFT of del**2 g..."
+msgstr ""
+
+#: ../lib/gmath/del2g.c:63
+msgid "    multiplying transforms..."
+msgstr ""
+
+#: ../lib/gmath/del2g.c:66
+msgid "    taking inverse FFT..."
+msgstr ""
+
+#: ../lib/gmath/la.c:60 ../lib/gmath/la.c:116
+msgid "Matrix dimensions out of range"
+msgstr ""
+
+#: ../lib/gmath/la.c:149
+msgid "Matrix is not initialised fully."
+msgstr ""
+
+#: ../lib/gmath/la.c:154
+msgid "Unable to allocate space for matrix copy"
+msgstr ""
+
+#: ../lib/gmath/la.c:243
+msgid "First scalar multiplier must be non-zero"
+msgstr ""
+
+#: ../lib/gmath/la.c:249 ../lib/gmath/la.c:257 ../lib/gmath/la.c:322
+msgid "One or both input matrices uninitialised"
+msgstr ""
+
+#: ../lib/gmath/la.c:262 ../lib/gmath/la.c:327
+msgid "Matrix order does not match"
+msgstr ""
+
+#: ../lib/gmath/la.c:268
+msgid "Unable to allocate space for matrix sum"
+msgstr ""
+
+#: ../lib/gmath/la.c:332
+msgid "Unable to allocate space for matrix product"
+msgstr ""
+
+#: ../lib/gmath/la.c:444
+msgid "Input: one or both data matrices uninitialised"
+msgstr ""
+
+#: ../lib/gmath/la.c:449
+msgid "Principal matrix is not properly dimensioned"
+msgstr ""
+
+#: ../lib/gmath/la.c:454
+msgid "Input: you must have at least one array to solve"
+msgstr ""
+
+#: ../lib/gmath/la.c:460
+msgid "Could not allocate space for solution matrix"
+msgstr ""
+
+#: ../lib/gmath/la.c:466 ../lib/gmath/la.c:474
+msgid "Could not allocate space for working matrix"
+msgstr ""
+
+#: ../lib/gmath/la.c:527
+msgid "Matrix (or submatrix is singular). Solution undetermined"
+msgstr ""
+
+#: ../lib/gmath/la.c:531
+msgid "Problem in LA routine."
+msgstr ""
+
+#: ../lib/gmath/la.c:538
+msgid "Procedure not yet available for selected matrix type"
+msgstr ""
+
+#: ../lib/gmath/la.c:572
+msgid "Matrix is not square. Cannot determine inverse"
+msgstr ""
+
+#: ../lib/gmath/la.c:577
+msgid "Unable to allocate space for matrix"
+msgstr ""
+
+#: ../lib/gmath/la.c:594
+msgid "Matrix is singular"
+msgstr ""
+
+#: ../lib/gmath/la.c:599
+msgid "Problem in LA procedure."
+msgstr ""
+
+#: ../lib/gmath/la.c:687
+msgid "Element array has not been allocated"
+msgstr ""
+
+#: ../lib/gmath/la.c:692
+msgid "Specified element is outside array bounds"
+msgstr ""
+
+#: ../lib/gmath/la.c:746
+msgid "Specified matrix column index is outside range"
+msgstr ""
+
+#: ../lib/gmath/la.c:751 ../lib/gmath/la.c:792 ../lib/gmath/la.c:1105
+#: ../lib/gmath/la.c:1157 ../lib/gmath/la.c:1232
+msgid "Matrix is not initialised"
+msgstr ""
+
+#: ../lib/gmath/la.c:756 ../lib/gmath/la.c:797
+msgid "Could not allocate space for vector structure"
+msgstr ""
+
+#: ../lib/gmath/la.c:787
+msgid "Specified matrix row index is outside range"
+msgstr ""
+
+#: ../lib/gmath/la.c:827
+msgid "Specified row index is outside range"
+msgstr ""
+
+#: ../lib/gmath/la.c:832
+msgid "Specified column index is outside range"
+msgstr ""
+
+#: ../lib/gmath/la.c:852
+msgid "Unknown vector type."
+msgstr ""
+
+#: ../lib/gmath/la.c:977
+msgid "Output vector is uninitialized"
+msgstr ""
+
+#: ../lib/gmath/la.c:982
+msgid "Vectors are not of the same type"
+msgstr ""
+
+#: ../lib/gmath/la.c:987
+msgid "Output vector is of incorrect type"
+msgstr ""
+
+#: ../lib/gmath/la.c:992
+msgid "Matrices not allowed"
+msgstr ""
+
+#: ../lib/gmath/la.c:998
+msgid "Vectors have differing dimensions"
+msgstr ""
+
+#: ../lib/gmath/la.c:1004
+msgid "Output vector has incorrect dimension"
+msgstr ""
+
+#: ../lib/gmath/la.c:1050
+msgid "Vector dimensions out of range"
+msgstr ""
+
+#: ../lib/gmath/la.c:1055
+msgid "Row/column out of range"
+msgstr ""
+
+#: ../lib/gmath/la.c:1270
+msgid "Vector structure is not initialised"
+msgstr ""
+
+#: ../lib/gmath/la.c:1391 ../lib/gmath/la.c:1399 ../lib/gmath/la.c:1404
+msgid "Input format error"
+msgstr ""
+
+#: ../lib/g3d/g3dhistory.c:42 ../lib/gis/history.c:132
+#, c-format
+msgid "can't get history information for [%s] in mapset [%s]"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:20
+msgid "G3d_openCellOldNoHeader: error in G3d_maskOpenOld"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:26
+msgid "G3d_openCellOldNoHeader: error in G3d_malloc"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:45
+msgid "G3d_openCellOldNoHeader: error in G_open_old"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:99
+msgid "G3d_openCellOld: error in G3d_openCellOldNoHeader"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:104
+msgid "G3d_openCellOld: can't rewind file"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:116
+msgid "G3d_openCellOld: error in G3d_readHeader"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:124
+msgid "G3d_openCellOld: projection does not match window projection"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:128
+msgid "G3d_openCellOld: zone does not match window zone"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:140 ../lib/g3d/g3dopen.c:157
+msgid "G3d_openCellOld: can't read header"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:146
+msgid "G3d_openCellOld: index does not fit into long"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:150
+msgid "G3d_openCellOld: error in G3d_malloc"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:176
+msgid "G3d_openCellOld: error in G3d_fillHeader"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:223
+msgid "G3d_openCellNew: error in G3d_maskOpenOld"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:232
+msgid "G3d_openCellNew: error in G3d_malloc"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:245
+msgid "G3d_openCellNew: could not open file"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:290 ../lib/g3d/g3dopen.c:295
+msgid "G3d_openCellNew: can't write header"
+msgstr ""
+
+#: ../lib/g3d/g3dopen.c:318
+msgid "G3d_openCellNew: error in G3d_fillHeader"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:52
+msgid "Data type used in the output file"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:61
+msgid "Precision used in the output file (default, max, or 0 to 52)"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:71
+msgid "The compression method used in the output file"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:81
+msgid "The dimensions of the tiles used in the output file"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:116
+msgid "G3d_getStandard3dParams: precision value invalid"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:149
+msgid "G3d_getStandard3dParams: tile dimension value invalid"
+msgstr ""
+
+#: ../lib/g3d/g3dparam.c:173
+msgid "Window replacing the default"
+msgstr ""
+
+#: ../lib/gis/debug.c:74
+#, c-format
+msgid "Cannot open debug file '%s'"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:31
+#, c-format
+msgid "%s not found"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:34
+#, c-format
+msgid "ERROR in reading %s"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:38 ../lib/gis/get_datum_name.c:69
+#: ../lib/gis/get_ell_name.c:31
+msgid "Cannot open temp file"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:49
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Please specify projection name\n"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:51
+#, c-format
+msgid "Enter 'list' for the list of available projections\n"
+msgstr ""
+
+#: ../lib/gis/get_projname.c:74
+#, c-format
+msgid ""
+"\n"
+"invalid projection\n"
+msgstr ""
+
+#: ../lib/gis/proj2.c:46
+msgid "Latitude-Longitude"
+msgstr ""
+
+#: ../lib/gis/proj2.c:48
+msgid "Other Projection"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:110
+msgid "syntax error"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:112
+msgid "R/G/B not in range 0-255"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:114
+msgid "invalid color name"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:116
+msgid "percentage not in range 0-100"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:118
+msgid "invalid value"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:120
+msgid "unknown error"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:151
+#, c-format
+msgid "bad rule (%s): [%s]"
+msgstr ""
+
+#: ../lib/gis/color_rules.c:265
+#, c-format
+msgid "Unable to load color rules <%s>"
+msgstr ""
+
+#: ../lib/gis/seek.c:52 ../lib/gis/seek.c:58
+msgid "Unable to seek"
+msgstr ""
+
+#: ../lib/gis/seek.c:56
+msgid "Seek offset out of range"
+msgstr ""
+
+#: ../lib/gis/color_read.c:116
+#, c-format
+msgid "color support for [%s] in mapset [%s] %s"
+msgstr ""
+
+#: ../lib/gis/put_title.c:29
+#, c-format
+msgid "category information for [%s] in [%s] missing or invalid"
+msgstr ""
+
+#: ../lib/gis/put_title.c:39
+#, c-format
+msgid "G_put_title - can't create a temp file"
+msgstr ""
+
+#: ../lib/gis/put_title.c:56
+#, c-format
+msgid "category information for [%s] in [%s] invalid"
+msgstr ""
+
+#: ../lib/gis/put_title.c:64
+#, c-format
+msgid "G_put_title - can't reopen temp file"
+msgstr ""
+
+#: ../lib/gis/put_title.c:72
+#, c-format
+msgid "can't write category information for [%s] in [%s]"
+msgstr ""
+
+#: ../lib/gis/get_row.c:46 ../lib/gis/get_row.c:1049
+#, c-format
+msgid "Reading raster map <%s@%s> request for row %d is outside region"
+msgstr ""
+
+#: ../lib/gis/get_row.c:324
+#, c-format
+msgid "cell_values_float: xdr_float failed for index %d"
+msgstr ""
+
+#: ../lib/gis/get_row.c:365
+#, c-format
+msgid "cell_values_double: xdr_double failed for index %d"
+msgstr ""
+
+#: ../lib/gis/get_row.c:621
+#, c-format
+msgid "Error reading compressed map <%s@%s>, row %d"
+msgstr ""
+
+#: ../lib/gis/get_row.c:624
+#, c-format
+msgid "Error reading map <%s@%s>, row %d"
+msgstr ""
+
+#: ../lib/gis/get_row.c:1031 ../lib/gis/get_row.c:1036
+#, c-format
+msgid "Error reading null row %d"
+msgstr ""
+
+#: ../lib/gis/get_row.c:1115
+msgid "Unable to realloc buffer"
+msgstr ""
+
+#: ../lib/gis/gisinit.c:54 ../lib/gis/gisinit.c:90
+msgid ""
+"Incompatible library version for module. You need to rebuild GRASS or "
+"untangle multiple installations."
+msgstr ""
+
+#: ../lib/gis/gisinit.c:63
+#, c-format
+msgid "MAPSET %s - permission denied"
+msgstr ""
+
+#: ../lib/gis/gisinit.c:66
+#, c-format
+msgid "MAPSET %s not found at %s"
+msgstr ""
+
+#: ../lib/gis/gisinit.c:110
+msgid "System not initialized. Programmer forgot to call G_gisinit()."
+msgstr ""
+
+#: ../lib/gis/mapset_msc.c:60
+#, c-format
+msgid "Unable to make mapset element %s (%s): %s"
+msgstr ""
+
+#: ../lib/gis/mapset_msc.c:64
+#, c-format
+msgid "Unable to access mapset element %s (%s): %s"
+msgstr ""
+
+#: ../lib/gis/reclass.c:145
+#, c-format
+msgid "Too many reclass categories for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/reclass.c:148
+#, c-format
+msgid "Illegal reclass format in header file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/reclass.c:238
+msgid "Illegal reclass request"
+msgstr ""
+
+#: ../lib/gis/reclass.c:243
+msgid "Illegal reclass type"
+msgstr ""
+
+#: ../lib/gis/reclass.c:249
+#, c-format
+msgid "Unable to create header file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/reclass.c:297
+#, c-format
+msgid "Unable to create dependency file in [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/put_cellhd.c:26
+#, c-format
+msgid "Unable to create header file for [%s]"
+msgstr ""
+
+#: ../lib/gis/ls.c:96
+#, c-format
+msgid "Unable to open directory %s"
+msgstr ""
+
+#: ../lib/gis/datum.c:160
+#, c-format
+msgid "unable to open datum table file: %s"
+msgstr ""
+
+#: ../lib/gis/datum.c:181
+#, c-format
+msgid "error in datum table file, line %d"
+msgstr ""
+
+#: ../lib/gis/ask.c:341
+msgid "to cancel request"
+msgstr ""
+
+#: ../lib/gis/ask.c:390
+#, c-format
+msgid "Enter a new %s file name"
+msgstr ""
+
+#: ../lib/gis/ask.c:396
+#, c-format
+msgid "Enter the name of an existing %s file"
+msgstr ""
+
+#: ../lib/gis/ask.c:401
+#, c-format
+msgid "Enter %s file name"
+msgstr ""
+
+#: ../lib/gis/ask.c:421
+#, c-format
+msgid "Enter 'list' for a list of existing %s files\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:424
+#, c-format
+msgid "Enter 'list -f' for "
+msgstr ""
+
+#: ../lib/gis/ask.c:426
+#, c-format
+msgid "a list %s"
+msgstr ""
+
+#: ../lib/gis/ask.c:428
+#, c-format
+msgid "an extended list"
+msgstr ""
+
+#: ../lib/gis/ask.c:432
+#, c-format
+msgid "Hit RETURN %s\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:452 ../lib/gis/ask.c:557 ../lib/gis/ask.c:577
+#, c-format
+msgid ""
+"\n"
+"** %s - not found **\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:459 ../lib/gis/ask.c:544
+#, c-format
+msgid ""
+"\n"
+"** %s exists. ok to overwrite? "
+msgstr ""
+
+#: ../lib/gis/ask.c:506
+#, c-format
+msgid ""
+"\n"
+"**<%s> illegal name **\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:518
+#, c-format
+msgid ""
+"\n"
+"** %s - illegal request **\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:533
+#, c-format
+msgid ""
+"\n"
+"** %s - exists, select another name **\n"
+msgstr ""
+
+#: ../lib/gis/ask.c:561
+msgid "ask: can't happen"
+msgstr ""
+
+#: ../lib/gis/cats.c:381
+#, c-format
+msgid "category support for [%s] in mapset [%s] %s"
+msgstr ""
+
+#: ../lib/gis/cats.c:417
+#, c-format
+msgid "category support for vector map [%s] in mapset [%s] %s"
+msgstr ""
+
+#: ../lib/gis/quant_rw.c:206
+#, c-format
+msgid "Cannot write quant rules: map %s is integer"
+msgstr ""
+
+#: ../lib/gis/quant_rw.c:215
+#, c-format
+msgid "Cannot write quant rules for map %s"
+msgstr ""
+
+#: ../lib/gis/unix_socks.c:102
+msgid "Unable to get GIS_LOCK environment variable value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:47 ../lib/gis/adj_cellhd.c:199
+msgid "Illegal n-s resolution value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:51 ../lib/gis/adj_cellhd.c:205
+msgid "Illegal row value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:55 ../lib/gis/adj_cellhd.c:211
+msgid "Illegal e-w resolution value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:59 ../lib/gis/adj_cellhd.c:217
+msgid "Illegal col value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:79 ../lib/gis/adj_cellhd.c:247
+#, c-format
+msgid "Fixing subtle input data rounding error of north boundary (%g>%g)"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:84 ../lib/gis/adj_cellhd.c:252
+msgid "Illegal latitude for North"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:90 ../lib/gis/adj_cellhd.c:258
+#, c-format
+msgid "Fixing subtle input data rounding error of south boundary (%g>%g)"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:95 ../lib/gis/adj_cellhd.c:263
+msgid "Illegal latitude for South"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:107 ../lib/gis/adj_cellhd.c:275
+#, c-format
+msgid "Fixing subtle input data rounding error of west boundary (%g>%g)"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:118 ../lib/gis/adj_cellhd.c:286
+#, c-format
+msgid "Fixing subtle input data rounding error of east boundary (%g>%g)"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:131 ../lib/gis/adj_cellhd.c:299
+msgid "North must be north of South"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:133 ../lib/gis/adj_cellhd.c:301
+msgid "North must be larger than South"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:136 ../lib/gis/adj_cellhd.c:304
+msgid "East must be larger than West"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:155 ../lib/gis/adj_cellhd.c:348
+msgid "Invalid coordinates"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:201
+msgid "Illegal n-s3 resolution value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:207
+msgid "Illegal row3 value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:213
+msgid "Illegal e-w3 resolution value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:219
+msgid "Illegal col3 value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:223
+msgid "Illegal t-b3 resolution value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:227
+msgid "Illegal depths value"
+msgstr ""
+
+#: ../lib/gis/adj_cellhd.c:306
+msgid "Top must be larger than Bottom"
+msgstr ""
+
+#: ../lib/gis/set_window.c:76
+msgid ""
+"G_set_window(): projection/zone differs from that of currently open raster "
+"maps"
+msgstr ""
+
+#: ../lib/gis/home.c:39
+msgid "unable to determine user's home directory"
+msgstr ""
+
+#: ../lib/gis/null_val.c:91
+msgid "EmbedGivenNulls: wrong data type!"
+msgstr ""
+
+#: ../lib/gis/null_val.c:112
+msgid "Null values have not been initialized. "
+msgstr ""
+
+#: ../lib/gis/null_val.c:113
+msgid "G_gisinit() must be called first. "
+msgstr ""
+
+#: ../lib/gis/null_val.c:114
+msgid "Please advise GRASS developers of this error.\n"
+msgstr ""
+
+#: ../lib/gis/null_val.c:223
+msgid "G_set_null_value: wrong data type!"
+msgstr ""
+
+#: ../lib/gis/proj3.c:64 ../lib/vector/Vlib/header.c:512
+msgid "Unknown projection"
+msgstr ""
+
+#: ../lib/gis/view.c:177
+#, c-format
+msgid "Unable to open %s for writing"
+msgstr ""
+
+#: ../lib/gis/view.c:263 ../lib/gis/view.c:480
+#, c-format
+msgid "Unable to open %s for reading"
+msgstr ""
+
+#: ../lib/gis/view.c:466
+#, c-format
+msgid "GRASS window when view was saved:\n"
+msgstr ""
+
+#: ../lib/gis/view.c:546
+#, c-format
+msgid " Window saved in \"%s\" is completely outside of current GRASS window."
+msgstr ""
+
+#: ../lib/gis/view.c:550
+#, c-format
+msgid ""
+" Only %d%% of window saved in \"%s\" overlaps with current GRASS window."
+msgstr ""
+
+#: ../lib/gis/error.c:257
+msgid "WARNING: "
+msgstr ""
+
+#: ../lib/gis/error.c:258
+msgid "ERROR: "
+msgstr ""
+
+#: ../lib/gis/legal_name.c:39
+#, c-format
+msgid "Illegal filename.  Cannot be '.' or 'NULL'\n"
+msgstr ""
+
+#: ../lib/gis/legal_name.c:47
+#, c-format
+msgid "Illegal filename. Character <%c> not allowed.\n"
+msgstr ""
+
+#: ../lib/gis/legal_name.c:77 ../lib/gis/legal_name.c:81
+#, c-format
+msgid "Output raster map name <%s> is not valid map name"
+msgstr ""
+
+#: ../lib/gis/legal_name.c:118 ../lib/gis/legal_name.c:122
+#, c-format
+msgid "Output raster map <%s> is used as input"
+msgstr ""
+
+#: ../lib/gis/mask_info.c:40
+#, c-format
+msgid "<%s> in mapset <%s>"
+msgstr ""
+
+#: ../lib/gis/mask_info.c:43
+msgid "none"
+msgstr ""
+
+#: ../lib/gis/mask_info.c:46
+msgid "not known"
+msgstr ""
+
+#: ../lib/gis/spawn.c:385
+#, c-format
+msgid "CreateProcess() failed: error = %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:416
+#, c-format
+msgid "G_spawn: unable to redirect descriptor %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:424 ../lib/gis/spawn.c:609
+#, c-format
+msgid "G_spawn: unable to open file %s"
+msgstr ""
+
+#: ../lib/gis/spawn.c:493 ../lib/gis/spawn.c:679
+msgid "Unable to execute command"
+msgstr ""
+
+#: ../lib/gis/spawn.c:518 ../lib/gis/spawn.c:526
+#, c-format
+msgid "G_spawn: unable to restore signal %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:557
+#, c-format
+msgid "G_spawn: unable to reset signal %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:566
+#, c-format
+msgid "G_spawn: unable to ignore signal %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:577
+#, c-format
+msgid "G_spawn: unable to block signal %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:585
+#, c-format
+msgid "G_spawn: unable to unblock signal %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:614 ../lib/gis/spawn.c:623
+#, c-format
+msgid "G_spawn: unable to duplicate descriptor %d to %d"
+msgstr ""
+
+#: ../lib/gis/spawn.c:656
+msgid "Unable to create a new process"
+msgstr ""
+
+#: ../lib/gis/spawn.c:671
+#, c-format
+msgid "Unable to change directory to %s"
+msgstr ""
+
+#: ../lib/gis/system.c:85
+msgid "Can not create a new process!"
+msgstr ""
+
+#: ../lib/gis/alloc.c:42 ../lib/gis/alloc.c:82 ../lib/gis/alloc.c:125
+#, c-format
+msgid "Current region rows: %d, cols: %d"
+msgstr ""
+
+#: ../lib/gis/alloc.c:45
+#, c-format
+msgid "G_malloc: unable to allocate %lu bytes of memory at %s:%d"
+msgstr ""
+
+#: ../lib/gis/alloc.c:85
+#, c-format
+msgid "G_calloc: unable to allocate %lu * %lu bytes of memory at %s:%d"
+msgstr ""
+
+#: ../lib/gis/alloc.c:128
+#, c-format
+msgid "G_realloc: unable to allocate %lu bytes of memory at %s:%d"
+msgstr ""
+
+#: ../lib/gis/sample.c:71
+msgid "Unknown interpolation type"
+msgstr ""
+
+#: ../lib/gis/sample.c:284
+msgid "\"no data\" label found; setting to zero"
+msgstr ""
+
+#: ../lib/gis/sample.c:299
+msgid "Problem reading raster map"
+msgstr ""
+
+#: ../lib/gis/done_msg.c:38
+#, c-format
+msgid "%s complete. %s"
+msgstr ""
+
+#: ../lib/gis/env.c:242
+msgid "GISRC - variable not set"
+msgstr ""
+
+#: ../lib/gis/env.c:274
+#, c-format
+msgid "G_getenv(): Variable %s not set"
+msgstr ""
+
+#: ../lib/gis/env.c:300
+#, c-format
+msgid "%s not set"
+msgstr ""
+
+#: ../lib/gis/put_row.c:215
+#, c-format
+msgid "G_put_map_row: %s is not integer! Use G_put_[f/d]_raster_row()!"
+msgstr ""
+
+#: ../lib/gis/put_row.c:251
+#, c-format
+msgid "%s: map [%s] not open for write - request ignored"
+msgstr ""
+
+#: ../lib/gis/put_row.c:259
+#, c-format
+msgid "%s: map [%s] not open for random write - request ignored"
+msgstr ""
+
+#: ../lib/gis/put_row.c:266
+#, c-format
+msgid "%s: map [%s] not open for sequential write - request ignored"
+msgstr ""
+
+#: ../lib/gis/put_row.c:270
+#, c-format
+msgid "%s: unopened file descriptor - request ignored"
+msgstr ""
+
+#: ../lib/gis/put_row.c:310
+#, c-format
+msgid "map [%s] - unable to write row %d"
+msgstr ""
+
+#: ../lib/gis/put_row.c:393
+#, c-format
+msgid "xdr_float failed for index %d of row %d"
+msgstr ""
+
+#: ../lib/gis/put_row.c:419
+#, c-format
+msgid "xdr_double failed for index %d of row %d"
+msgstr ""
+
+#: ../lib/gis/put_row.c:754
+#, c-format
+msgid "unable to find a temporary null file %s"
+msgstr ""
+
+#: ../lib/gis/put_row.c:776 ../lib/gis/put_row.c:781
+#, c-format
+msgid "error writing null row %d"
+msgstr ""
+
+#: ../lib/gis/range.c:192
+#, c-format
+msgid "can't read f_range file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/range.c:308
+#, c-format
+msgid "can't read range file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/range.c:359 ../lib/gis/range.c:412
+#, c-format
+msgid "can't write range file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/list.c:114
+#, c-format
+msgid "no %s files available in current mapset\n"
+msgstr ""
+
+#: ../lib/gis/list.c:117
+#, c-format
+msgid "no %s files available in mapset <%s>\n"
+msgstr ""
+
+#: ../lib/gis/list.c:132
+#, c-format
+msgid "hit RETURN to continue -->"
+msgstr ""
+
+#: ../lib/gis/list.c:183
+#, c-format
+msgid "%s files available in mapset <%s>:\n"
+msgstr ""
+
+#: ../lib/gis/list.c:254
+msgid "G_list: Unknown element type"
+msgstr ""
+
+#: ../lib/gis/mapset.c:39
+msgid "MAPSET is not set"
+msgstr ""
+
+#: ../lib/gis/mapset.c:57
+#, c-format
+msgid "MAPSET %s not found"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:40
+#, c-format
+msgid " The raster map %s@%s is empty"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:49
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Color table needed for file [%s] in mapset [%s].\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:52
+#, c-format
+msgid ""
+"\n"
+"Please identify the type desired:\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:53
+#, c-format
+msgid "    1:  Random colors\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:54
+#, c-format
+msgid "    2:  Red, green, and blue color ramps\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:55
+#, c-format
+msgid "    3:  Color wave\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:56
+#, c-format
+msgid "    4:  Gray scale\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:57
+#, c-format
+msgid "    5:  Aspect\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:58
+#, c-format
+msgid "    6:  Rainbow colors\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:59
+#, c-format
+msgid "    7:  Red through yellow to green\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:60
+#, c-format
+msgid "    8:  Green through yellow to red\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:61
+#, c-format
+msgid "RETURN  quit\n"
+msgstr ""
+
+#: ../lib/gis/make_colr.c:91
+#, c-format
+msgid ""
+"\n"
+"%s invalid; Try again > "
+msgstr ""
+
+#: ../lib/gis/history.c:180
+#, c-format
+msgid "can't write history information for [%s]"
+msgstr ""
+
+#: ../lib/gis/history.c:263
+msgid "Not enough room in history file to record command line."
+msgstr ""
+
+#: ../lib/gis/history.c:285
+msgid "Not enough room in history file for command line (truncated)."
+msgstr ""
+
+#: ../lib/gis/opencell.c:105
+#, c-format
+msgid "Unable to open raster map <%s@%s>"
+msgstr ""
+
+#: ../lib/gis/opencell.c:171
+#, c-format
+msgid "Unable to find <%s@%s>"
+msgstr ""
+
+#: ../lib/gis/opencell.c:188
+#, c-format
+msgid ""
+"Unable to open raster map <%s@%s> since it is a reclass of raster map <%s@"
+"%s> which does not exist"
+msgstr ""
+
+#: ../lib/gis/opencell.c:212
+#, c-format
+msgid "Raster map <%s@%s>: format field in header file invalid"
+msgstr ""
+
+#: ../lib/gis/opencell.c:219
+#, c-format
+msgid ""
+"Raster map <%s@%s> is in different projection than current region. Found "
+"raster map <%s@%s>, should be <%s>."
+msgstr ""
+
+#: ../lib/gis/opencell.c:226
+#, c-format
+msgid "Raster map <%s@%s> is in different zone (%d) than current region (%d)"
+msgstr ""
+
+#: ../lib/gis/opencell.c:233
+#, c-format
+msgid "Raster map <%s@%s>: bytes per cell (%d) too large"
+msgstr ""
+
+#: ../lib/gis/opencell.c:262
+#, c-format
+msgid "map <%s@%s> is a GDAL link but GRASS is compiled without GDAL support"
+msgstr ""
+
+#: ../lib/gis/opencell.c:642
+#, c-format
+msgid "Raster map <%s> is not in the current mapset (%s)"
+msgstr ""
+
+#: ../lib/gis/opencell.c:649
+#, c-format
+msgid "<%s> is an illegal file name"
+msgstr ""
+
+#: ../lib/gis/opencell.c:655
+#, c-format
+msgid "<%s>: bad mapset"
+msgstr ""
+
+#: ../lib/gis/opencell.c:666 ../lib/gis/opencell.c:767
+msgid "G__open_raster_new(): no temp files available"
+msgstr ""
+
+#: ../lib/gis/opencell.c:736
+msgid ""
+"Unable to write embedded null values for raster map open for random access"
+msgstr ""
+
+#: ../lib/gis/opencell.c:941
+msgid "G_set_fp_type(): can only be called with FCELL_TYPE or DCELL_TYPE"
+msgstr ""
+
+#: ../lib/gis/opencell.c:976 ../lib/gis/opencell.c:1064
+#, c-format
+msgid "Unable to find '%s' in '%s'"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1009
+#, c-format
+msgid "Raster map <%s> not found in mapset <%s>"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1070
+#, c-format
+msgid "Unable to find '%s'"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1075
+#, c-format
+msgid "Unable to open '%s'"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1085
+#, c-format
+msgid "Invalid type: field '%s' in file '%s'"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1099
+#, c-format
+msgid "Raster map <%s> is not xdr: byte_order: %s"
+msgstr ""
+
+#: ../lib/gis/opencell.c:1179
+msgid ""
+"G_set_quant_rules() can be called only for raster maps opened for reading"
+msgstr ""
+
+#: ../lib/gis/auto_mask.c:64
+msgid "Unable to open automatic MASK file"
+msgstr ""
+
+#: ../lib/gis/raster_metadata.c:111
+#, c-format
+msgid "Can't read %s for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/raster_metadata.c:144
+#, c-format
+msgid "Can't create %s metadata file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/find_file.c:74
+#, c-format
+msgid "'%s/%s' was found in more mapsets (also found in <%s>)"
+msgstr ""
+
+#: ../lib/gis/find_file.c:82
+#, c-format
+msgid "Using <%s@%s>"
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:71 ../lib/gis/get_cellhd.c:100
+#, c-format
+msgid "Unable to read header file for raster map <%s@%s>."
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:74
+#, c-format
+msgid " It is a reclass of raster map <%s@%s> "
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:78
+#, c-format
+msgid "which is missing."
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:80
+#, c-format
+msgid "whose header file can't be opened."
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:88
+#, c-format
+msgid "Unable to open header file for raster map <%s@%s>"
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:105
+#, c-format
+msgid " It is a reclass of raster map <%s@%s> whose header file is invalid."
+msgstr ""
+
+#: ../lib/gis/get_cellhd.c:109
+#, c-format
+msgid " Invalid format."
+msgstr ""
+
+#: ../lib/gis/gishelp.c:45
+#, c-format
+msgid "one moment...\n"
+msgstr ""
+
+#: ../lib/gis/gishelp.c:49
+#, c-format
+msgid "No help available for command [%s]\n"
+msgstr ""
+
+#: ../lib/gis/closecell.c:228
+#, c-format
+msgid ""
+"closecell: can't move %s\n"
+"to null file %s"
+msgstr ""
+
+#: ../lib/gis/closecell.c:250
+#, c-format
+msgid "Error writing floating point format file for map %s"
+msgstr ""
+
+#: ../lib/gis/closecell.c:300
+#, c-format
+msgid ""
+"closecell: can't move %s\n"
+"to cell file %s"
+msgstr ""
+
+#: ../lib/gis/closecell.c:355
+msgid "unable to write quant file!"
+msgstr ""
+
+#: ../lib/gis/closecell.c:406
+msgid "unable to write f_format file for CELL maps"
+msgstr ""
+
+#: ../lib/gis/get_datum_name.c:53
+#, c-format
+msgid ""
+"\n"
+"Please specify datum name\n"
+msgstr ""
+
+#: ../lib/gis/get_datum_name.c:55
+#, c-format
+msgid "Enter 'list' for the list of available datums\n"
+msgstr ""
+
+#: ../lib/gis/get_datum_name.c:57
+#, c-format
+msgid "or 'custom' if you wish to enter custom parameters\n"
+msgstr ""
+
+#: ../lib/gis/get_datum_name.c:97
+#, c-format
+msgid ""
+"\n"
+"invalid datum\n"
+msgstr ""
+
+#: ../lib/gis/location.c:44
+#, c-format
+msgid "LOCATION << %s >> not available"
+msgstr ""
+
+#: ../lib/gis/open_misc.c:45
+#, c-format
+msgid "G__open_misc(read): mapset <%s> doesn't match xmapset <%s>"
+msgstr ""
+
+#: ../lib/gis/open_misc.c:67
+#, c-format
+msgid "G__open_misc(write): xmapset <%s> != G_mapset() <%s>"
+msgstr ""
+
+#: ../lib/gis/get_ellipse.c:85
+#, c-format
+msgid "Unable to open file %s in <%s>"
+msgstr ""
+
+#: ../lib/gis/get_ellipse.c:358 ../lib/gis/get_ellipse.c:384
+#, c-format
+msgid "Invalid a: field '%s' in file %s in <%s>"
+msgstr ""
+
+#: ../lib/gis/get_ellipse.c:371
+#, c-format
+msgid "Invalid ellipsoid '%s' in file %s in <%s>"
+msgstr ""
+
+#: ../lib/gis/get_ellipse.c:388
+#, c-format
+msgid "Invalid es: field '%s' in file %s in <%s>"
+msgstr ""
+
+#: ../lib/gis/get_ellipse.c:402
+#, c-format
+msgid "No ellipsoid info given in file %s in <%s>"
+msgstr ""
+
+#: ../lib/gis/parser.c:340
+msgid "WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../lib/gis/parser.c:341
+msgid "Example: income < 1000 and inhab >= 10000"
+msgstr ""
+
+#: ../lib/gis/parser.c:349
+msgid "Table name"
+msgstr "Numele tabelului"
+
+#: ../lib/gis/parser.c:358
+msgid "Driver name"
+msgstr ""
+
+#: ../lib/gis/parser.c:367
+msgid "Database name"
+msgstr ""
+
+#: ../lib/gis/parser.c:376
+msgid "Name of attribute column"
+msgstr ""
+
+#: ../lib/gis/parser.c:385
+msgid "Name of attribute column(s)"
+msgstr ""
+
+#: ../lib/gis/parser.c:396
+msgid "Name of input imagery group"
+msgstr ""
+
+#: ../lib/gis/parser.c:404
+msgid "Name of input imagery subgroup"
+msgstr ""
+
+#: ../lib/gis/parser.c:414 ../lib/gis/parser.c:439
+msgid "Name of input raster map"
+msgstr ""
+
+#: ../lib/gis/parser.c:423 ../lib/gis/parser.c:448
+msgid "Name of input raster map(s)"
+msgstr ""
+
+#: ../lib/gis/parser.c:431
+msgid "Name for output raster map"
+msgstr ""
+
+#: ../lib/gis/parser.c:456
+msgid "Name of base raster map"
+msgstr ""
+
+#: ../lib/gis/parser.c:464
+msgid "Name of cover raster map"
+msgstr ""
+
+#: ../lib/gis/parser.c:472
+msgid "Name of elevation raster map"
+msgstr ""
+
+#: ../lib/gis/parser.c:481
+msgid "Name of elevation raster map(s)"
+msgstr ""
+
+#: ../lib/gis/parser.c:491 ../lib/gis/parser.c:516
+msgid "Name of input raster3d map"
+msgstr ""
+
+#: ../lib/gis/parser.c:500 ../lib/gis/parser.c:525
+msgid "Name of input raster3d map(s)"
+msgstr ""
+
+#: ../lib/gis/parser.c:508
+msgid "Name for output raster3d map"
+msgstr ""
+
+#: ../lib/gis/parser.c:535 ../lib/gis/parser.c:560
+msgid "Name of input vector map"
+msgstr "Nume pentru harta vectorială de intrare"
+
+#: ../lib/gis/parser.c:544 ../lib/gis/parser.c:569
+msgid "Name of input vector map(s)"
+msgstr ""
+
+#: ../lib/gis/parser.c:552
+msgid "Name for output vector map"
+msgstr "Nume pentru harta vectorială de ieșire"
+
+#: ../lib/gis/parser.c:578 ../lib/gis/parser.c:587
+msgid "Feature type"
+msgstr "Tipul trăsăturii"
+
+#: ../lib/gis/parser.c:594
+msgid "Layer number"
+msgstr ""
+
+#: ../lib/gis/parser.c:596
+msgid ""
+"A single vector map can be connected to multiple database tables. This "
+"number determines which table to use."
+msgstr ""
+
+#: ../lib/gis/parser.c:605
+msgid "Category value"
+msgstr ""
+
+#: ../lib/gis/parser.c:612
+msgid "Category values"
+msgstr ""
+
+#: ../lib/gis/parser.c:613 ../lib/gis/parser.c:627
+msgid "Example: 1,3,7-9,13"
+msgstr ""
+
+#: ../lib/gis/parser.c:619
+msgid "Feature id"
+msgstr "Id trăsătură"
+
+#: ../lib/gis/parser.c:626
+msgid "Feature ids"
+msgstr ""
+
+#: ../lib/gis/parser.c:637
+msgid "Name of input file"
+msgstr ""
+
+#: ../lib/gis/parser.c:645
+msgid "Name for output file"
+msgstr ""
+
+#: ../lib/gis/parser.c:653
+msgid "Field separator"
+msgstr ""
+
+#: ../lib/gis/parser.c:654
+msgid "Special characters: newline, space, comma, tab"
+msgstr ""
+
+#: ../lib/gis/parser.c:665
+msgid "Color"
+msgstr "Culoare"
+
+#: ../lib/gis/parser.c:666
+msgid "Either a standard color name or R:G:B triplet"
+msgstr ""
+
+#: ../lib/gis/parser.c:675
+msgid "Background color"
+msgstr ""
+
+#: ../lib/gis/parser.c:677
+msgid "Either a standard GRASS color, R:G:B triplet, or \"none\""
+msgstr ""
+
+#: ../lib/gis/parser.c:818
+#, c-format
+msgid "BUG in descriptions, option '%s' in <%s> does not exist"
+msgstr ""
+
+#: ../lib/gis/parser.c:926
+msgid "Use either --quiet or --verbose flag, not both. Assuming --verbose."
+msgstr ""
+
+#: ../lib/gis/parser.c:940
+msgid "Use either --quiet or --verbose flag, not both. Assuming --quiet."
+msgstr ""
+
+#: ../lib/gis/parser.c:971
+#, c-format
+msgid "Sorry <%s> is not a valid option\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1075
+#, c-format
+msgid ""
+"\n"
+"Description:\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1082
+#, c-format
+msgid ""
+"\n"
+"Keywords:\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1086
+#, c-format
+msgid ""
+"\n"
+"Usage:\n"
+" "
+msgstr ""
+
+#: ../lib/gis/parser.c:1154
+#, c-format
+msgid ""
+"\n"
+"Flags:\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1177 ../lib/gis/parser.c:1501 ../lib/gis/parser.c:1661
+#: ../lib/gis/parser.c:1949
+msgid "Allow output files to overwrite existing files"
+msgstr "Permiteți fișierele de ieșire pentru a suprascrie fișierele existente"
+
+#: ../lib/gis/parser.c:1179 ../lib/gis/parser.c:1509 ../lib/gis/parser.c:1665
+msgid "Verbose module output"
+msgstr ""
+
+#: ../lib/gis/parser.c:1180 ../lib/gis/parser.c:1516 ../lib/gis/parser.c:1668
+msgid "Quiet module output"
+msgstr ""
+
+#: ../lib/gis/parser.c:1185
+#, c-format
+msgid ""
+"\n"
+"Parameters:\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1208
+#, c-format
+msgid "  %*s   default: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:1552
+msgid "NAME"
+msgstr ""
+
+#: ../lib/gis/parser.c:1565
+msgid "KEYWORDS"
+msgstr ""
+
+#: ../lib/gis/parser.c:1570
+msgid "SYNOPSIS"
+msgstr ""
+
+#: ../lib/gis/parser.c:1638
+msgid "Flags"
+msgstr ""
+
+#: ../lib/gis/parser.c:1676
+msgid "Parameters"
+msgstr "Parametrii"
+
+#: ../lib/gis/parser.c:1716
+msgid "Options"
+msgstr "Opțiuni"
+
+#: ../lib/gis/parser.c:1722
+msgid "Default"
+msgstr ""
+
+#: ../lib/gis/parser.c:1951
+msgid "Allow overwrite"
+msgstr ""
+
+#: ../lib/gis/parser.c:1959
+msgid "Run with minimal output messages"
+msgstr ""
+
+#: ../lib/gis/parser.c:1961
+msgid "Run quietly"
+msgstr ""
+
+#: ../lib/gis/parser.c:1994
+msgid "Unable to spawn the 'wish' program"
+msgstr ""
+
+#: ../lib/gis/parser.c:2013
+msgid "Unable to determine program name"
+msgstr ""
+
+#: ../lib/gis/parser.c:2070
+#, c-format
+msgid "  %*s   options: "
+msgstr ""
+
+#: ../lib/gis/parser.c:2115 ../lib/gis/parser.c:2130
+#, c-format
+msgid "Sorry, <%c> is not a valid flag\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2196
+#, c-format
+msgid "Sorry, <%s=> is ambiguous\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2202
+#, c-format
+msgid "Sorry, <%s> is not a valid parameter\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2209
+#, c-format
+msgid "Option <%s> does not accept multiple answers\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2287
+#, c-format
+msgid ""
+"\n"
+"ERROR: illegal range syntax for parameter <%s>\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2288
+#, c-format
+msgid "       Presented as: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2292
+#, c-format
+msgid ""
+"\n"
+"ERROR: value <%s> out of range for parameter <%s>\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2294
+#, c-format
+msgid "       Legal range: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2297
+#, c-format
+msgid ""
+"\n"
+"ERROR: Missing value for parameter <%s>\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2445
+#, c-format
+msgid ""
+"ERROR: Required parameter <%s> not set:\n"
+"\t(%s)\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2540
+#, c-format
+msgid ""
+"\n"
+"ERROR: option <%s> must be provided in multiples of %d\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2542
+#, c-format
+msgid "       You provided %d items:\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2598
+#, c-format
+msgid "ERROR: option <%s>: <%s> exists.\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2653
+#, c-format
+msgid ""
+"\n"
+"FLAG: Set the following flag?\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2667
+#, c-format
+msgid ""
+"\n"
+"OPTION:   %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2668
+#, c-format
+msgid "     key: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2670
+#, c-format
+msgid "  format: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2672
+#, c-format
+msgid " default: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2673
+#, c-format
+msgid "required: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2675
+#, c-format
+msgid "multiple: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2677
+#, c-format
+msgid " options: %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2690
+#, c-format
+msgid "enter option > "
+msgstr ""
+
+#: ../lib/gis/parser.c:2707 ../lib/gis/parser.c:2717
+msgid "   Try again? "
+msgstr ""
+
+#: ../lib/gis/parser.c:2715
+#, c-format
+msgid "Sorry, %s is not accepted.\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2725
+#, c-format
+msgid ""
+"\n"
+"You have chosen:\n"
+"  %s\n"
+msgstr ""
+
+#: ../lib/gis/parser.c:2726
+msgid "Is this correct? "
+msgstr ""
+
+#: ../lib/gis/parser.c:2791
+msgid "to accept the default"
+msgstr ""
+
+#: ../lib/gis/get_ell_name.c:42
+#, c-format
+msgid ""
+"\n"
+"Please specify ellipsoid name\n"
+msgstr ""
+
+#: ../lib/gis/get_ell_name.c:44
+#, c-format
+msgid "Enter 'list' for the list of available ellipsoids\n"
+msgstr ""
+
+#: ../lib/gis/get_ell_name.c:67
+#, c-format
+msgid ""
+"\n"
+"invalid ellipsoid\n"
+msgstr ""
+
+#: ../lib/gis/quant_io.c:89
+#, c-format
+msgid "The floating data range for %s@%s is empty"
+msgstr ""
+
+#: ../lib/gis/quant_io.c:99
+#, c-format
+msgid "The integer data range for %s@%s is empty"
+msgstr ""
+
+#: ../lib/gis/quant_io.c:168
+#, c-format
+msgid "quantization file [%s] in mapset [%s] %s"
+msgstr ""
+
+#: ../lib/gis/get_window.c:67 ../lib/gis/get_window.c:85
+#, c-format
+msgid ""
+"region for current mapset %s\n"
+"run \"g.region\""
+msgstr ""
+
+#: ../lib/gis/get_window.c:120
+#, c-format
+msgid "default region %s"
+msgstr ""
+
+#: ../lib/gis/get_window.c:141
+msgid "is not set"
+msgstr ""
+
+#: ../lib/gis/get_window.c:150
+#, c-format
+msgid ""
+"is invalid\n"
+"%s"
+msgstr ""
+
+#: ../lib/gis/format.c:157
+#, c-format
+msgid "Fail of initial read of compressed file [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:143
+msgid "duplicate projection field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:153
+msgid "duplicate zone field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:163
+msgid "projection field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:165
+msgid "zone field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:187
+msgid "duplicate north field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:195
+msgid "duplicate south field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:203
+msgid "duplicate east field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:211
+msgid "duplicate west field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:219
+msgid "duplicate top field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:227
+msgid "duplicate bottom field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:235
+msgid "duplicate e-w resolution field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:245
+msgid "duplicate 3D e-w resolution field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:255
+msgid "duplicate n-s resolution field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:265
+msgid "duplicate 3D n-s resolution field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:275
+msgid "duplicate t-b resolution field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:285
+msgid "duplicate rows field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:295
+msgid "duplicate 3D rows field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:305
+msgid "duplicate cols field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:315
+msgid "duplicate 3D cols field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:325
+msgid "duplicate depths field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:335
+msgid "duplicate format field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:343
+msgid "duplicate compressed field"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:354
+msgid "north field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:356
+msgid "south field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:358
+msgid "west field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:360
+msgid "east field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:362
+msgid "cols field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:364
+msgid "rows field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:375
+msgid "ewres3 field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:377
+msgid "nsres3 field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:379
+msgid "cols3 field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:381
+msgid "rows3 field missing"
+msgstr ""
+
+#: ../lib/gis/rd_cellhd.c:438
+#, c-format
+msgid "line %d: <%s>"
+msgstr ""
+
+#: ../lib/gis/timestamp.c:282
+#, c-format
+msgid "Can't create timestamp file for %s map %s in mapset %s"
+msgstr ""
+
+#: ../lib/gis/timestamp.c:291
+#, c-format
+msgid "Invalid timestamp specified for %s map %s in mapset %s"
+msgstr ""
+
+#: ../lib/gis/timestamp.c:313
+#, c-format
+msgid "Can't open timestamp file for %s map %s in mapset %s"
+msgstr ""
+
+#: ../lib/gis/timestamp.c:322
+#, c-format
+msgid "Invalid timestamp file for %s map %s in mapset %s"
+msgstr ""
+
+#: ../lib/gis/get_projinfo.c:33 ../lib/gis/get_projinfo.c:60
+#, c-format
+msgid "<%s> file not found for location <%s>"
+msgstr ""
+
+#: ../lib/gis/get_projinfo.c:39 ../lib/gis/get_projinfo.c:66
+#, c-format
+msgid "ERROR in reading <%s> file for location <%s>"
+msgstr ""
+
+#: ../lib/gis/gdal.c:66
+#, c-format
+msgid "Unable to locate symbol <%s>"
+msgstr ""
+
+#: ../lib/gis/gdal.c:114
+msgid "Unable to load GDAL library"
+msgstr ""
+
+#: ../lib/gis/histogram.c:57
+#, c-format
+msgid "Histogram for [%s in %s] missing (run r.support)"
+msgstr ""
+
+#: ../lib/gis/histogram.c:65
+#, c-format
+msgid "Can't read histogram for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/histogram.c:74 ../lib/gis/histogram.c:84
+#, c-format
+msgid "Invalid histogram file for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/histogram.c:356
+#, c-format
+msgid "can't create histogram for [%s in %s]"
+msgstr ""
+
+#: ../lib/gis/myname.c:50
+msgid "This location has no description."
+msgstr ""
+
+#: ../lib/gis/ask_cell.c:54 ../lib/gis/ask_cell.c:72 ../lib/gis/ask_cell.c:91
+#: ../lib/gis/ask_cell.c:96
+msgid "with titles"
+msgstr ""
+
+#: ../lib/gis/ask_cell.c:110
+msgid "(no title)"
+msgstr ""
+
+#: ../lib/gis/open.c:62
+#, c-format
+msgid "G__open(read): mapset <%s> doesn't match xmapset <%s>"
+msgstr ""
+
+#: ../lib/gis/open.c:84
+#, c-format
+msgid "G__open(write): xmapset <%s> != G_mapset() <%s>"
+msgstr ""
+
+#: ../lib/gis/distance.c:160
+#, c-format
+msgid ""
+"G_distance_point_to_line_segment: shouldn't happen: code=%d P=(%f,%f) S=(%f,"
+"%f)(%f,%f)"
+msgstr ""
+
+#: ../lib/arraystats/class.c:21
+msgid "Discont algorithm currently not available because of bugs"
+msgstr ""
+
+#: ../lib/arraystats/class.c:23
+#, c-format
+msgid "%s: Unknown algorithm"
+msgstr ""
+
+#: ../lib/arraystats/class.c:26
+#, c-format
+msgid "%s: Error in classification algorithm"
+msgstr ""
+
+#: ../lib/arraystats/class.c:221
+#, c-format
+msgid ""
+"There are classbreaks outside the range min-max. Number of classes reduced "
+"to %i, but using probabilities for %i classes."
+msgstr ""
+
+#: ../lib/rst/interp_float/interp2d.c:212
+#, c-format
+msgid ""
+"Overshoot - increase in tension suggested. Overshoot occures at (%d,%d) "
+"cell. Z-value %f, zmin %f, zmax %f."
+msgstr ""
+
+#: ../lib/rst/interp_float/segmen2d.c:111
+msgid ""
+"Taking too long to find points for interpolation - please change the region "
+"to area where your points are. Continuing calculations..."
+msgstr ""
+
+#: ../lib/rst/interp_float/input2d.c:47
+#, c-format
+msgid "Mask raster map <%s> not found"
+msgstr ""
+
+#: ../lib/rst/interp_float/input2d.c:69
+msgid "Bitmap mask created"
+msgstr ""
+
+#: ../lib/rst/interp_float/output2d.c:125
+#, c-format
+msgid "First change your cols number to nsizc %d %d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:73
+#, c-format
+msgid "Vector map <%s> is not 3D"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:76
+msgid "Loading data from attribute table ..."
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:79 ../lib/vector/Vlib/map.c:243
+#: ../lib/vector/Vlib/map.c:364 ../lib/vector/Vlib/map.c:470
+#: ../lib/vector/Vlib/map.c:588 ../lib/vector/Vlib/map.c:686
+#: ../lib/vector/Vlib/array.c:278 ../lib/vector/Vlib/net.c:180
+#: ../lib/vector/Vlib/net.c:351
+#, c-format
+msgid "Database connection not defined for layer %d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:97
+#: ../lib/rst/interp_float/vinput2d.c:110
+#, c-format
+msgid "Data type of column <%s> must be numeric"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:121
+msgid "Reading features from vector map ..."
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:153
+#: ../lib/rst/interp_float/vinput2d.c:270
+#, c-format
+msgid "Database record for cat %d not found"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:171
+#: ../lib/rst/interp_float/vinput2d.c:288
+msgid "Negative value of smoothing detected: sm must be >= 0"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:233
+msgid "Reading nodes from vector map ..."
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:314
+msgid "Strip exists with insufficient data"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:328
+#, c-format
+msgid "There are points outside specified 2D/3D region - %d points ignored"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:331
+#, c-format
+msgid "Ignoring %d points (too dense)"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:335
+#, c-format
+msgid ""
+"%d points given for interpolation (after thinning) is less than given NPMIN="
+"%d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:340
+msgid "Zero points in the given region"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:345
+#, c-format
+msgid ""
+"Segmentation parameters set to invalid values: npmin= %d, segmax= %d for "
+"smooth connection of segments, npmin > segmax (see manual)"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:351
+#, c-format
+msgid ""
+"There are less than %d points for interpolation. No segmentation is "
+"necessary, to run the program faster set segmax=%d (see manual)"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:355
+#, c-format
+msgid "Number of points from vector map %d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:356
+#, c-format
+msgid "Number of points outside of 2D/3D region %d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:358
+#, c-format
+msgid "Number of points being used %d"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:391
+msgid "Some points outside of region (ignored)"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:397
+msgid "Unable to allocate memory"
+msgstr ""
+
+#: ../lib/rst/interp_float/vinput2d.c:405
+#, c-format
+msgid "Unable to insert %f,%f,%f a = %d"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:23
+#, c-format
+msgid "Unable to create file [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:36 ../lib/imagery/fopen.c:57
+#, c-format
+msgid "Unable to open file [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:49
+#, c-format
+msgid "Unable to find file [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:79
+#, c-format
+msgid "Unable to create file [%s] for subgroup [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:101 ../lib/imagery/fopen.c:127
+#, c-format
+msgid "Unable to open file [%s] for subgroup [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/fopen.c:116
+#, c-format
+msgid "Unable to find file [%s] for subgroup [%s] of group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/target.c:38
+#, c-format
+msgid "Unable to read target file for group [%s]"
+msgstr ""
+
+#: ../lib/imagery/list_subgp.c:36
+#, c-format
+msgid "subgroup <%s> of group <%s> is empty\n"
+msgstr ""
+
+#: ../lib/imagery/list_subgp.c:48
+#, c-format
+msgid "subgroup <%s> of group <%s> references the following raster maps\n"
+msgstr ""
+
+#: ../lib/imagery/sigsetfile.c:41
+#, c-format
+msgid ""
+"Unable to create signature file <%s> for subgroup <%s> of group <%s> - <%s> "
+"is not current mapset"
+msgstr ""
+
+#: ../lib/imagery/sigsetfile.c:57
+#, c-format
+msgid "Unable to create signature file <%s> for subgroup <%s> of group <%s>"
+msgstr ""
+
+#: ../lib/imagery/sigsetfile.c:86
+#, c-format
+msgid "Unable to open signature file <%s> for subgroup <%s> of group <%s@%s>"
+msgstr ""
+
+#: ../lib/imagery/points.c:124
+#, c-format
+msgid "Unable to open control point file for group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/points.c:132
+#, c-format
+msgid "Bad format in control point file for group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/points.c:159
+#, c-format
+msgid "Unable to create control point file for group [%s in %s]"
+msgstr ""
+
+#: ../lib/imagery/list_gp.c:34
+#, c-format
+msgid "group <%s> is empty\n"
+msgstr ""
+
+#: ../lib/imagery/list_gp.c:44
+#, c-format
+msgid "group <%s> references the following raster maps\n"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_node.c:217
+#, c-format
+msgid ""
+"Attempt to read line angle for the line which is not connected to the node: "
+"node %d, line %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:288
+msgid "Unable read topology for nodes"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:293
+#, c-format
+msgid "Unable to read topology for node %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:298
+msgid "Unable read topology for lines"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:303
+#, c-format
+msgid "Unable to read topology for line %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:308
+msgid "Unable to read topo for areas"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:313
+#, c-format
+msgid "Unable read topology for area %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:318
+msgid "Unable to read topology for isles"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:323
+#, c-format
+msgid "Unable to read topology for isle %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:345 ../lib/vector/diglib/plus.c:371
+msgid "Unable to write head to plus file"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:350
+msgid "Unable to write nodes to plus file"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:355
+msgid "Unable to write lines to plus file"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:360
+msgid "Unable to write areas to plus file"
+msgstr ""
+
+#: ../lib/vector/diglib/plus.c:365
+msgid "Unable to write isles to plus file"
+msgstr ""
+
+#: ../lib/vector/diglib/spindex.c:248
+#, c-format
+msgid "Unable to delete node %d from spatial index"
+msgstr ""
+
+#: ../lib/vector/diglib/spindex.c:288
+#, c-format
+msgid "Unable to delete line %d from spatial index"
+msgstr ""
+
+#: ../lib/vector/diglib/spindex.c:314
+msgid "Attempt to delete sidx for dead area"
+msgstr ""
+
+#: ../lib/vector/diglib/spindex.c:327
+#, c-format
+msgid "Unable to delete area %d from spatial index"
+msgstr ""
+
+#: ../lib/vector/diglib/spindex.c:362
+#, c-format
+msgid "Unable to delete isle %d from spatial index"
+msgstr ""
+
+#: ../lib/vector/diglib/file.c:157
+msgid "Writing to file loaded to memory not supported"
+msgstr ""
+
+#: ../lib/vector/diglib/file.c:200
+msgid "Unable to load file to memory, file not open"
+msgstr ""
+
+#: ../lib/vector/diglib/file.c:215
+msgid "Vector memory mode not supported, using 'AUTO'"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:207 ../lib/vector/diglib/plus_area.c:675
+#: ../lib/vector/diglib/plus_area.c:683
+#, c-format
+msgid "Line %d already has area/isle %d to left"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:217
+#, c-format
+msgid "Line %d already has area/isle %d to right"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:299
+msgid "Attempt to delete isle from dead area"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:316
+#, c-format
+msgid "Attempt to delete not registered isle %d from area %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:354
+msgid "Attempt to delete dead area"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:394
+#, c-format
+msgid "Dead centroid %d registered for area (bug in the vector library)"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:418
+#, c-format
+msgid "Attempt to delete area %d info from dead isle %d"
+msgstr ""
+
+#: ../lib/vector/diglib/plus_area.c:773
+#, c-format
+msgid "Attempt to delete isle %d info from dead area %d"
+msgstr ""
+
+#: ../lib/vector/neta/spanningtree.c:104
+msgid "Computing minimum spanning tree..."
+msgstr ""
+
+#: ../lib/vector/neta/flow.c:309 ../lib/vector/Vlib/net.c:433
+#: ../lib/vector/Vlib/graph.c:110
+msgid "GngFlatten error"
+msgstr ""
+
+#: ../lib/vector/neta/timetables.c:46 ../lib/vector/neta/timetables.c:203
+#: ../lib/vector/neta/timetables.c:244 ../lib/vector/neta/timetables.c:286
+#, c-format
+msgid "Unable to open select cursor: %s"
+msgstr ""
+
+#: ../lib/vector/neta/utils.c:219 ../lib/vector/neta/utils.c:232
+#, c-format
+msgid "'%s' must be > 0 for '%s'"
+msgstr ""
+
+#: ../lib/vector/neta/utils.c:221
+msgid "'where' and 'cats' parameters were supplied, cat will be ignored"
+msgstr ""
+
+#: ../lib/vector/neta/utils.c:225
+msgid "Unable to load data from database"
+msgstr ""
+
+#: ../lib/vector/neta/utils.c:236
+msgid "Problem loading category values"
+msgstr ""
+
+#: ../lib/vector/neta/allpairs.c:53
+msgid "Computing all pairs shortest paths..."
+msgstr ""
+
+#: ../lib/vector/Vlib/snap.c:148
+msgid "Snap vertices Pass 1: select points"
+msgstr ""
+
+#: ../lib/vector/Vlib/snap.c:202
+msgid "Snap vertices Pass 2: assign anchor vertices"
+msgstr ""
+
+#: ../lib/vector/Vlib/snap.c:271
+msgid "Snap vertices Pass 3: snap to assigned points"
+msgstr ""
+
+#: ../lib/vector/Vlib/snap.c:451
+#, c-format
+msgid "Snapped vertices: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/snap.c:452
+#, c-format
+msgid "New vertices: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/intersect.c:127
+msgid "3D not supported by Vect_segment_intersection()"
+msgstr ""
+
+#: ../lib/vector/Vlib/intersect.c:313
+msgid "Vect_segment_intersection() ERROR (collinear vertical segments)"
+msgstr ""
+
+#: ../lib/vector/Vlib/intersect.c:407
+msgid "Vect_segment_intersection() ERROR (collinear non vertical segments)"
+msgstr ""
+
+#: ../lib/vector/Vlib/intersect.c:1059 ../lib/vector/Vlib/intersect.c:1065
+#: ../lib/vector/Vlib/intersect.c:1067 ../lib/vector/Vlib/intersect.c:1115
+#: ../lib/vector/Vlib/intersect.c:1124 ../lib/vector/Vlib/intersect.c:1145
+#: ../lib/vector/Vlib/intersect.c:1162
+msgid "Error while adding point to array. Out of memory"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:55
+msgid "input vector map is not open"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:178 ../lib/vector/Vlib/map.c:314
+#: ../lib/vector/Vlib/open.c:540
+#, c-format
+msgid "Vector map name is not SQL compliant"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:182
+#, c-format
+msgid "Unable to find vector map <%s> in <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:189 ../lib/vector/Vlib/map.c:318
+#: ../lib/vector/Vlib/open.c:547
+#, c-format
+msgid "Vector map <%s> already exists and will be overwritten"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:193 ../lib/vector/Vlib/open.c:552
+#, c-format
+msgid "Unable to delete vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:213 ../lib/vector/Vlib/map.c:331
+#, c-format
+msgid "Unable to copy vector map <%s> to <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:260 ../lib/vector/Vlib/map.c:381
+#: ../lib/vector/Vlib/map.c:613 ../lib/vector/Vlib/map.c:720
+#, c-format
+msgid "Unable to copy table <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:276 ../lib/vector/Vlib/map.c:410
+#: ../lib/vector/Vlib/map.c:626
+#, c-format
+msgid "Unable to create index for table <%s>, key <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:395 ../lib/vector/Vlib/map.c:490
+#, c-format
+msgid "Unable to delete table <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:444
+#, c-format
+msgid "Invalid vector map name <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:458
+#, c-format
+msgid "Unable to open header file for vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:480
+#, c-format
+msgid "Unable to find table <%s> linked to vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:497
+#, c-format
+msgid "Table <%s> linked to vector map <%s> does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:511
+#, c-format
+msgid "Unable to open directory '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:525
+#, c-format
+msgid "Unable to delete file '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:542
+#, c-format
+msgid "Unable to rename directory '%s' to '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:550
+#, c-format
+msgid "Unable to remove directory '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/map.c:604 ../lib/vector/Vlib/map.c:705
+#, c-format
+msgid "Unable to add database link for vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/read_nat.c:136 ../lib/vector/Vlib/geos.c:66
+#: ../lib/vector/Vlib/geos.c:256
+msgid "Attempt to read dead line"
+msgstr ""
+
+#: ../lib/vector/Vlib/array.c:99
+#, c-format
+msgid "%d errors in category string."
+msgstr ""
+
+#: ../lib/vector/Vlib/array.c:145 ../lib/vector/Vlib/array.c:269
+msgid "Mixed area and other type requested for vector array"
+msgstr ""
+
+#: ../lib/vector/Vlib/array.c:155 ../lib/vector/Vlib/array.c:178
+#: ../lib/vector/Vlib/array.c:306 ../lib/vector/Vlib/array.c:339
+msgid "Not enough space in vector array"
+msgstr ""
+
+#: ../lib/vector/Vlib/array.c:294
+#, c-format
+msgid "Unable to select record from table <%s> (key %s, where %s)"
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:48
+#, c-format
+msgid "Illegal vector map name <%s>. May not contain '.' or 'NULL'."
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:55
+#, c-format
+msgid "Illegal vector map name <%s>. Must start with a letter."
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:63
+#, c-format
+msgid "Illegal vector map name <%s>. Character '%c' not allowed."
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:70
+#, c-format
+msgid ""
+"Illegal vector map name <%s>. SQL keyword cannot be used as vector map name."
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:101 ../lib/vector/Vlib/legal_vname.c:105
+#, c-format
+msgid "Output vector map name <%s> is not valid map name"
+msgstr ""
+
+#: ../lib/vector/Vlib/legal_vname.c:142 ../lib/vector/Vlib/legal_vname.c:146
+#, c-format
+msgid "Output vector map <%s> is used as input"
+msgstr ""
+
+#: ../lib/vector/Vlib/write_nat.c:50 ../lib/vector/Vlib/write_nat.c:83
+#, c-format
+msgid "%s: Area %d does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/write_nat.c:640
+msgid "Attempt to delete dead feature"
+msgstr ""
+
+#: ../lib/vector/Vlib/write_nat.c:885
+msgid "Attempt to restore alive feature"
+msgstr ""
+
+#: ../lib/vector/Vlib/merge_lines.c:233
+#, c-format
+msgid "%d boundaries merged"
+msgstr ""
+
+#: ../lib/vector/Vlib/merge_lines.c:234
+#, c-format
+msgid "%d new boundaries"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:122
+msgid "Building graph..."
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:164
+msgid "Unable to build network graph"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:170
+msgid "Forward costs column not specified"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:177
+msgid "Arc field < 1"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:191 ../lib/vector/Vlib/net.c:208
+#: ../lib/vector/Vlib/net.c:361
+#, c-format
+msgid "Column <%s> not found in table <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:197 ../lib/vector/Vlib/net.c:214
+#: ../lib/vector/Vlib/net.c:367
+#, c-format
+msgid "Data type of column <%s> not supported (must be numeric)"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:227
+msgid "Registering arcs..."
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:255
+#, c-format
+msgid ""
+"Database record for line %d (cat = %d, forward/both direction(s)) not found "
+"(forward/both direction(s) of line skipped)"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:274
+#, c-format
+msgid ""
+"Database record for line %d (cat = %d, backword direction) not found"
+"(direction of line skipped)"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:323
+msgid "Cannot add network arc"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:347
+msgid "Setting node costs..."
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:403
+#, c-format
+msgid "Database record for node %d (cat = %d) not found (cost set to 0)"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:430
+msgid "Flattening the graph..."
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:439
+msgid "Graph was built"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:522 ../lib/vector/Vlib/graph.c:231
+#, c-format
+msgid "dglShortestPath error: %s"
+msgstr ""
+
+#: ../lib/vector/Vlib/net.c:603
+msgid "Wrong line direction in Vect_net_get_line_cost()"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:93
+msgid "Layer number must be 1 or greater"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:98
+msgid "Unable to add database link, map is not opened in WRITE mode"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:104
+msgid "Unable to add database link"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:110 ../lib/vector/Vlib/field.c:155
+msgid "Unable to write database links"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:223
+#, c-format
+msgid "Layer number %d or name <%s> already exists"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:302
+#, c-format
+msgid ""
+"Default driver / database set to:\n"
+"driver: %s\n"
+"database: %s"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:309
+msgid "Default driver is not set"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:312
+msgid "Default database is not set"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:371
+#, c-format
+msgid "Requested dblink %d, maximum link number %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:512
+msgid "Unable to open OGR DBMI driver"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:551
+msgid ""
+"All FID tests failed. Neither 'FID' nor 'ogc_fid' nor 'ogr_fid' nor 'gid' "
+"available in OGR DB table"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:606
+#, c-format
+msgid "Don't know how to read links for format %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:639
+#, c-format
+msgid "Error in rule on row %d in %s"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:709
+#, c-format
+msgid "Unable to open vector database definition file '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/field.c:804
+msgid "Bug: attempt to update map which is not in current mapset"
+msgstr ""
+
+#: ../lib/vector/Vlib/graph.c:143
+msgid "Unable to add network arc"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:93
+msgid "Unable to add area (map closed, topo saved)"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:102
+msgid "Unable to add isle (map closed, topo saved)"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:112
+msgid "Area of size = 0.0 ignored"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:148
+msgid "Request to find area outside nonexistent isle"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:516
+msgid "Registering primitives..."
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:525
+msgid "Unable to read vector map"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:569
+#, c-format
+msgid "%d primitives registered"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:570
+#, c-format
+msgid "%d vertices registered"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:581
+msgid "Building areas..."
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:604
+#, c-format
+msgid "%d areas built"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:605
+#, c-format
+msgid "%d isles built"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:614
+msgid "Attaching islands..."
+msgstr ""
+
+#: ../lib/vector/Vlib/build_nat.c:629
+msgid "Attaching centroids..."
+msgstr ""
+
+#: ../lib/vector/Vlib/open_nat.c:145
+#, c-format
+msgid ""
+"Coor files of vector map <%s@%s> is larger than it should be (%ld bytes "
+"excess)"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_nat.c:149
+#, c-format
+msgid ""
+"Coor files of vector <%s@%s> is shorter than it should be (%ld bytes "
+"missing)."
+msgstr ""
+
+#: ../lib/vector/Vlib/cats.c:47
+msgid "Vect_new_cats_struct(): Out of memory"
+msgstr ""
+
+#: ../lib/vector/Vlib/cats.c:131
+#, c-format
+msgid "Too many categories (%d), unable to set cat %d (layer %d)"
+msgstr ""
+
+#: ../lib/vector/Vlib/cats.c:410
+#, c-format
+msgid "Unable to convert category string '%s' (from '%s') to category range"
+msgstr ""
+
+#: ../lib/vector/Vlib/remove_areas.c:96
+msgid "Area is composed of dead boundary"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:97
+msgid "not implemented"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:109
+#, c-format
+msgid "Unable to delete item %d from spatial index"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:127
+msgid ""
+"Unable to build spatial index from topology, vector map is not opened at "
+"topo level 2"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:168
+msgid "BUG (Vect_build_sidx_from_topo): node does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:180
+msgid "BUG (Vect_build_sidx_from_topo): line does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:199
+msgid "BUG (Vect_build_sidx_from_topo): area does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/sindex.c:218
+msgid "BUG (Vect_build_sidx_from_topo): isle does not exist"
+msgstr ""
+
+#: ../lib/vector/Vlib/read_ogr.c:120 ../lib/vector/Vlib/read_ogr.c:306
+#: ../lib/vector/Vlib/build_ogr.c:309
+#, c-format
+msgid "OGR feature type %d not supported"
+msgstr ""
+
+#: ../lib/vector/Vlib/read_ogr.c:178
+msgid "OGR feature without ID"
+msgstr ""
+
+#: ../lib/vector/Vlib/read_ogr.c:378 ../lib/vector/Vlib/read_ogr.c:386
+#, c-format
+msgid "Unable to get feature geometry, FID %ld"
+msgstr ""
+
+#: ../lib/vector/Vlib/line.c:201 ../lib/vector/Vlib/line.c:233
+msgid "Index out of range in"
+msgstr ""
+
+#: ../lib/vector/Vlib/line.c:529
+msgid "Segment outside line, no segment created"
+msgstr ""
+
+#: ../lib/vector/Vlib/rewind.c:35 ../lib/vector/Vlib/read.c:30
+#: ../lib/vector/Vlib/close.c:38 ../lib/vector/Vlib/write.c:53
+#: ../lib/vector/Vlib/write.c:59 ../lib/vector/Vlib/open.c:40
+#: ../lib/vector/Vlib/build.c:31
+msgid "Requested format is not compiled in this version"
+msgstr ""
+
+#: ../lib/vector/Vlib/read.c:99 ../lib/vector/Vlib/geos.c:53
+msgid "vector map is not opened"
+msgstr ""
+
+#: ../lib/vector/Vlib/read.c:102
+#, c-format
+msgid ""
+"Vect_read_line(): feature id %d is not reasonable (max features in vector "
+"map <%s>: %d)"
+msgstr ""
+
+#: ../lib/vector/Vlib/area.c:53
+msgid "Attempt to read points of nonexistent area"
+msgstr ""
+
+#: ../lib/vector/Vlib/area.c:125
+#, c-format
+msgid "Unable to read line %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/area.c:164 ../lib/vector/Vlib/area.c:193
+#: ../lib/vector/Vlib/area.c:257 ../lib/vector/Vlib/area.c:286
+#, c-format
+msgid "Attempt to read topo for dead area (%d)"
+msgstr ""
+
+#: ../lib/vector/Vlib/area.c:313
+#, c-format
+msgid "Attempt to read topo for dead isle (%d)"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:56
+#, c-format
+msgid ""
+"Vect_read_line_geos(): feature id %d is not reasonable (max features in "
+"vector map <%s>: %d)"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:61
+msgid "only native format supported"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:91
+#, c-format
+msgid "Vect_read_area_geos(): unable to read area id %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:105
+#, c-format
+msgid "Vect_read_area_geos(): unable to read isle id %d of area id %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:203
+#, c-format
+msgid "Unable to read line offset %ld"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:410
+#, c-format
+msgid "Attempt to read points of nonexistent area id %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/geos.c:470
+#, c-format
+msgid "Unable to read feature id %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/level_two.c:234 ../lib/vector/Vlib/level_two.c:259
+#: ../lib/vector/Vlib/level_two.c:283 ../lib/vector/Vlib/level_two.c:302
+#: ../lib/vector/Vlib/level_two.c:320 ../lib/vector/Vlib/level_two.c:339
+#, c-format
+msgid "Vector map <%s> is not open on level >= 2"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:272
+#, c-format
+msgid "Unable to calculate centroid for area %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:333
+msgid "Partial build for OGR is not supported"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:342
+msgid ""
+"Random read is not supported by OGR for this layer, cannot build support"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:349
+msgid "Feature: "
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:361
+#, c-format
+msgid "Feature %d without geometry ignored"
+msgstr ""
+
+#: ../lib/vector/Vlib/build_ogr.c:368
+msgid "OGR feature without ID ignored"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:31
+msgid "Category index is not up to date"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:61 ../lib/vector/Vlib/cindex.c:125
+#: ../lib/vector/Vlib/cindex.c:143 ../lib/vector/Vlib/cindex.c:166
+msgid "Invalid layer index (index >= number of layers)"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:107
+msgid "Invalid layer index (index < 0 or index >= number of layers)"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:232
+msgid "Layer or category index out of range"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:283
+msgid "Layer index out of range"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:461
+#, c-format
+msgid "Unable to open cidx file <%s> for write"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:469
+#, c-format
+msgid "Error writing out category index file <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/cindex.c:512
+#, c-format
+msgid "Unable to open category index file for vector map <%s@%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/close.c:134
+#, c-format
+msgid "Unable to close vector <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/overlay.c:74
+msgid "unknown operator"
+msgstr ""
+
+#: ../lib/vector/Vlib/overlay.c:123
+msgid "Overlay: line/boundary types not supported by AND operator"
+msgstr ""
+
+#: ../lib/vector/Vlib/overlay.c:126
+msgid "Overlay: area x area types not supported by AND operator"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:54
+msgid "OGR format cannot be updated"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:66
+#, c-format
+msgid "Unable to open OGR data source '%s'"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:86
+#, c-format
+msgid "Unable to open layer <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:139
+#, c-format
+msgid "Unable to open fidx file for vector map <%s@%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:157
+#, c-format
+msgid ""
+"Feature index format version %d.%d is not supported by this release. Try to "
+"rebuild topology or upgrade GRASS."
+msgstr ""
+
+#: ../lib/vector/Vlib/open_ogr.c:162
+#, c-format
+msgid ""
+"Your GRASS version does not fully support feature index format %d.%d of the "
+"vector. Consider to rebuild topology or upgrade GRASS."
+msgstr ""
+
+#: ../lib/vector/Vlib/level.c:38
+msgid "Map structure was never initialized"
+msgstr ""
+
+#: ../lib/vector/Vlib/level.c:40
+msgid "Map structure has been closed"
+msgstr ""
+
+#: ../lib/vector/Vlib/break_lines.c:374
+#, c-format
+msgid "Intersections: %5d"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:364
+msgid "Line is not looped"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:598 ../lib/vector/Vlib/buffer2.c:609
+msgid "Next edge was visited but it is not the first one !!! breaking loop"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:657
+msgid "side != 0 feature not implemented"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:899 ../lib/vector/Vlib/buffer2.c:946
+msgid "zero area size"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:905 ../lib/vector/Vlib/buffer2.c:952
+msgid "Line was not closed"
+msgstr ""
+
+#: ../lib/vector/Vlib/buffer2.c:918 ../lib/vector/Vlib/buffer2.c:969
+msgid "Vect_get_point_in_poly() failed"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:27 ../lib/vector/Vlib/write.c:33
+#: ../lib/vector/Vlib/write.c:39 ../lib/vector/Vlib/write.c:46
+msgid "for this format/level not supported"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:135
+msgid "Unable to write feature, vector map is not opened"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:148
+msgid "Unable to write feature (negative offset)"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:181
+msgid "Unable to rewrite feature, vector map is not opened"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:194
+#, c-format
+msgid "Unable to rewrite feature %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:219
+#, c-format
+msgid ""
+"Unable to delete feature %d, vector map <%s> is not opened on topology level"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:225
+#, c-format
+msgid ""
+"Unable to delete feature %d, vector map <%s> is not opened in 'write' mode"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:239
+#, c-format
+msgid "Unable to delete feature %d from vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:265
+#, c-format
+msgid ""
+"Unable to restore feature %d, vector map <%s> is not opened on topology level"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:271
+#, c-format
+msgid ""
+"Unable to restore feature %d, vector map <%s> is not opened in 'write' mode"
+msgstr ""
+
+#: ../lib/vector/Vlib/write.c:285
+#, c-format
+msgid "Unable to restore feature %d from vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/header.c:95 ../lib/vector/Vlib/header.c:143
+#, c-format
+msgid "Unable to open header file of vector <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/header.c:151
+#, c-format
+msgid "Corrupted row in head: %s"
+msgstr ""
+
+#: ../lib/vector/Vlib/header.c:189
+#, c-format
+msgid "Unknown keyword %s in vector head"
+msgstr ""
+
+#: ../lib/vector/Vlib/poly.c:235
+msgid "Unable to find point in polygon"
+msgstr ""
+
+#: ../lib/vector/Vlib/poly.c:649
+msgid "conditions failed"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:100
+#, c-format
+msgid "Programmer requested unknown open level %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:179
+msgid ""
+"Vector map which is not in the current mapset cannot be opened for update"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:211 ../lib/vector/Vlib/open.c:279
+#: ../lib/vector/Vlib/open.c:299
+#, c-format
+msgid ""
+"Unable to open vector map <%s> on level %d. Try to rebuild vector topology "
+"by v.build."
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:214
+msgid "Unable to read head file"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:236
+#, c-format
+msgid "Unable to open topology file for vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:262
+#, c-format
+msgid "Unable to open category index file for vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:353 ../lib/vector/Vlib/open.c:576
+#, c-format
+msgid "Unable to open history file for vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:531
+#, c-format
+msgid "%s is not in the current mapset (%s)"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:566
+#, c-format
+msgid "Unable to create vector map <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:622
+#, c-format
+msgid "Unable to stat file <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:731
+msgid "Size of 'coor' file differs from value saved in topology file"
+msgstr ""
+
+#: ../lib/vector/Vlib/open.c:742
+#, c-format
+msgid "Please rebuild topology for vector map <%s@%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:123
+#, c-format
+msgid "Building topology for vector map <%s>..."
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:141
+msgid "Topology was built"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:153
+#, c-format
+msgid "Number of nodes: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:154
+#, c-format
+msgid "Number of primitives: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:155
+#, c-format
+msgid "Number of points: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:156
+#, c-format
+msgid "Number of lines: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:157
+#, c-format
+msgid "Number of boundaries: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:158
+#, c-format
+msgid "Number of centroids: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:161
+#, c-format
+msgid "Number of faces: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:164
+#, c-format
+msgid "Number of kernels: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:205
+#, c-format
+msgid "Number of areas: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:206
+#, c-format
+msgid "Number of isles: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:209
+#, c-format
+msgid "Number of incorrect boundaries: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:213
+#, c-format
+msgid "Number of centroids outside area: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:217
+#, c-format
+msgid "Number of duplicate centroids: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:221
+#, c-format
+msgid "Number of areas without centroid: %d"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:226
+msgid "Number of areas: -"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:227
+msgid "Number of isles: -"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:256
+#, c-format
+msgid "Unable to open topo file for write <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:264
+msgid "Error writing out topo file"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:407
+#, c-format
+msgid "Unable open spatial index file for write <%s>"
+msgstr ""
+
+#: ../lib/vector/Vlib/build.c:415
+msgid "Error writing out spatial index file"
+msgstr ""
+
+#: ../lib/vector/vedit/cats.c:63
+#, c-format
+msgid "Unable to set category %d for (feature id %d)"
+msgstr ""
+
+#: ../lib/vector/vedit/select.c:232
+msgid "Unknown query tool"
+msgstr ""
diff --git a/locale/po/grassmods_nl.po b/locale/po/grassmods_nl.po
new file mode 100644
index 0000000..fd11ac6
--- /dev/null
+++ b/locale/po/grassmods_nl.po
@@ -0,0 +1,32350 @@
+# translation of grassmods_nl.po to Dutch
+# This file is distributed under the same license as the GRASS package.
+# Copyright (C) 2012 GRASS Development Team
+#
+# XXX, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: grassmods_nl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-10 00:42+0200\n"
+"PO-Revision-Date: 2012-06-19 23:46+0200\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Dutch <grass-translations at lists.osgeo.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../raster/r.out.pov/main.c:121 ../raster/r.out.ppm3/main.c:57
+#: ../raster/r.out.arc/main.c:60 ../raster/r.out.ppm/main.c:54
+#: ../raster/r.out.vtk/main.c:148 ../raster/r.out.ascii/main.c:59
+#: ../raster/r.out.gridatb/main.c:44 ../raster/r.out.gdal/main.c:128
+#: ../raster/r.out.mat/main.c:64 ../raster/r.out.tiff/r.out.tiff.c:99
+#: ../raster/r.out.mpeg/main.c:384 ../raster/r.out.bin/main.c:279
+#: ../locale/scriptstrings/r.out.xyz_to_translate.c:2
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:2
+msgid "raster, export"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:123
+msgid "Converts a raster map layer into a height-field file for POVRAY."
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:131 ../raster/r.out.ascii/main.c:70
+msgid "Name of an existing raster map"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:138
+msgid "Name of output povray file (TGA height field file)"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:145
+msgid "Height-field type (0=actual heights 1=normalized)"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:151
+msgid "Elevation bias"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:157 ../raster/r.param.scale/interface.c:114
+msgid "Vertical scaling factor"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:174 ../raster/r.clump/main.c:87
+#: ../raster/r.cost/main.c:340 ../raster/r.cats/main.c:125
+#: ../raster/r.cats/main.c:146 ../raster/r.transect/main.c:119
+#: ../raster/r.mfilter.fp/main.c:126 ../raster/r.support/front/front.c:224
+#: ../raster/r.support/modcolr/modcolr.c:46 ../raster/r.composite/main.c:155
+#: ../raster/r.coin/main.c:127 ../raster/r.coin/main.c:130
+#: ../raster/r.coin/inter.c:40 ../raster/r.coin/inter.c:44
+#: ../raster/r.series/main.c:212 ../raster/r.out.ppm3/main.c:120
+#: ../raster/r.null/null.c:119 ../raster/wildfire/r.ros/main.c:322
+#: ../raster/wildfire/r.ros/main.c:335 ../raster/wildfire/r.ros/main.c:340
+#: ../raster/wildfire/r.ros/main.c:345 ../raster/wildfire/r.ros/main.c:350
+#: ../raster/wildfire/r.ros/main.c:368 ../raster/wildfire/r.ros/main.c:372
+#: ../raster/wildfire/r.ros/main.c:391 ../raster/wildfire/r.ros/main.c:395
+#: ../raster/wildfire/r.ros/main.c:408 ../raster/wildfire/r.spread/main.c:356
+#: ../raster/wildfire/r.spread/main.c:359
+#: ../raster/wildfire/r.spread/main.c:362
+#: ../raster/wildfire/r.spread/main.c:365
+#: ../raster/wildfire/r.spread/main.c:369
+#: ../raster/wildfire/r.spread/main.c:372
+#: ../raster/wildfire/r.spread/main.c:375 ../raster/r.support.stats/main.c:49
+#: ../raster/r.out.arc/main.c:112 ../raster/r.colors/main.c:306
+#: ../raster/r.colors/main.c:387 ../raster/r.out.ppm/main.c:116
+#: ../raster/r.stats/main.c:270 ../raster/r.statistics/main.c:79
+#: ../raster/r.statistics/main.c:85 ../raster/r.drain/main.c:189
+#: ../raster/r.drain/main.c:218 ../raster/r.info/main.c:118
+#: ../raster/r.param.scale/interface.c:172 ../raster/r.buffer/main.c:127
+#: ../raster/r.covar/main.c:95 ../raster/r.mfilter/main.c:121
+#: ../raster/r.out.vtk/main.c:47 ../raster/r.out.vtk/main.c:60
+#: ../raster/simwe/simlib/input.c:178 ../raster/simwe/simlib/input.c:184
+#: ../raster/simwe/simlib/input.c:189 ../raster/simwe/simlib/input.c:198
+#: ../raster/simwe/simlib/input.c:206 ../raster/simwe/simlib/input.c:212
+#: ../raster/simwe/simlib/input.c:218 ../raster/simwe/simlib/input.c:225
+#: ../raster/simwe/simlib/input.c:232 ../raster/simwe/simlib/input.c:239
+#: ../raster/simwe/simlib/input.c:246 ../raster/r.region/main.c:166
+#: ../raster/r.region/main.c:225 ../raster/r.region/main.c:348
+#: ../raster/r.mapcalc/map.c:377 ../raster/r.sun2/main.c:811
+#: ../raster/r.sun2/main.c:826 ../raster/r.sun2/main.c:843
+#: ../raster/r.sun2/main.c:857 ../raster/r.sun2/main.c:869
+#: ../raster/r.sun2/main.c:881 ../raster/r.sun2/main.c:892
+#: ../raster/r.sun2/main.c:904 ../raster/r.sun2/main.c:916
+#: ../raster/r.out.ascii/main.c:146 ../raster/r.lake/main.c:254
+#: ../raster/r.lake/main.c:265 ../raster/r.surf.idw/main.c:108
+#: ../raster/r.water.outlet/legal.c:23 ../raster/r.report/parse.c:243
+#: ../raster/r.sum/main.c:62 ../raster/r.distance/parse.c:79
+#: ../raster/r.distance/parse.c:86 ../raster/r.out.gridatb/check_ready.c:12
+#: ../raster/r.random/main.c:119 ../raster/r.random/main.c:124
+#: ../raster/r.topidx/check_ready.c:11 ../raster/r.basins.fill/main.c:82
+#: ../raster/r.basins.fill/main.c:94 ../raster/r.to.vect/main.c:114
+#: ../raster/r.grow2/main.c:187 ../raster/r.regression.line/main.c:86
+#: ../raster/r.regression.line/main.c:95 ../raster/r.out.mat/main.c:103
+#: ../raster/r.fill.dir/main.c:172 ../raster/r.walk/main.c:546
+#: ../raster/r.walk/main.c:549 ../raster/r.his/main.c:127
+#: ../raster/r.his/main.c:164 ../raster/r.his/main.c:189
+#: ../raster/r.thin/io.c:96 ../raster/r.surf.idw2/read_cell.c:19
+#: ../raster/r.resamp.rst/main.c:397 ../raster/r.resamp.rst/main.c:423
+#: ../raster/r.carve/main.c:178 ../raster/r.resamp.stats/main.c:296
+#: ../raster/r.cross/main.c:125 ../raster/r.texture/main.c:228
+#: ../raster/r.average/main.c:72 ../raster/r.average/main.c:75
+#: ../raster/r.to.rast3elev/main.c:114 ../raster/r.to.rast3elev/main.c:129
+#: ../raster/r.horizon/main.c:550 ../raster/r.median/main.c:75
+#: ../raster/r.colors.out/main.c:88 ../raster/r.profile/main.c:142
+#: ../raster/r.slope.aspect/main.c:360 ../raster/r.resamp.interp/main.c:103
+#: ../raster/r.contour/main.c:158 ../raster/r.bilinear/main.c:81
+#: ../raster/r.out.png/r.out.png.c:214 ../raster/r.out.tiff/r.out.tiff.c:166
+#: ../raster/r.resample/main.c:97 ../raster/r.kappa/stats.c:30
+#: ../raster/r.kappa/stats.c:35 ../raster/r.kappa/main.c:153
+#: ../raster/r.out.mpeg/main.c:217 ../raster/r.recode/main.c:81
+#: ../raster/r.neighbors/main.c:193 ../raster/r.patch/main.c:113
+#: ../raster/r.univar2/r.univar_main.c:216 ../raster/r.bitpattern/main.c:101
+#: ../raster/r.reclass/main.c:78 ../raster/r.surf.area/main.c:118
+#: ../raster/r.flow/io.c:65 ../raster/r.los/main.c:162
+#: ../raster/r.los/main.c:168 ../general/g.mremove/do_remove.c:50
+#: ../general/g.region/main.c:480 ../general/g.region/main.c:823
+#: ../general/g.region/main.c:831 ../doc/raster/r.example/main.c:111
+#: ../misc/m.nviz.image/surface.c:51 ../misc/m.nviz.image/surface.c:108
+#: ../display/d.legend/main.c:247 ../display/d.rgb/main.c:95
+#: ../display/d.colortable/main.c:102 ../display/d.profile/main.c:94
+#: ../display/d.what.rast/main.c:155 ../display/d.what.rast/opencell.c:13
+#: ../display/d.rast.arrow/arrow.c:195 ../display/d.rast.arrow/arrow.c:237
+#: ../display/d.rast.arrow/arrow.c:372 ../display/d.extend/main.c:60
+#: ../display/d.histogram/main.c:162 ../display/d.rast.num/number.c:153
+#: ../display/d.his/main.c:137 ../display/d.his/main.c:174
+#: ../display/d.his/main.c:199 ../display/d.nviz/main.c:185
+#: ../display/d.title/main.c:105 ../display/d.zoom/main.c:208
+#: ../display/d.rast/main.c:111 ../ps/ps.map/outl_io.c:68
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:197
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:227
+#: ../imagery/i.landsat.acca/main.c:58 ../imagery/i.landsat.acca/tools.c:127
+#: ../imagery/i.landsat.acca/algorithm.c:387 ../imagery/i.class/main.c:127
+#: ../imagery/i.modis.qc/main.c:217 ../imagery/i.his.rgb/openfiles.c:31
+#: ../imagery/i.his.rgb/openfiles.c:36 ../imagery/i.his.rgb/openfiles.c:41
+#: ../imagery/i.gensigset/parse.c:42 ../imagery/i.zc/main.c:111
+#: ../imagery/i.group/main.c:201 ../imagery/i.group/main.c:240
+#: ../imagery/i.fft/fftmain.c:108 ../imagery/i.gensig/parse.c:36
+#: ../imagery/i.pca/main.c:138 ../imagery/i.topo.corr/main.c:34
+#: ../imagery/i.rgb.his/openfiles.c:14 ../imagery/i.rgb.his/openfiles.c:16
+#: ../imagery/i.rgb.his/openfiles.c:18 ../imagery/i.landsat.toar/main.c:322
+#: ../imagery/i.landsat.toar/main.c:460 ../imagery/i.ifft/ifftmain.c:95
+#: ../imagery/i.ifft/ifftmain.c:105 ../visualization/xganim/main.c:366
+#: ../vector/v.extrude/main.c:180 ../vector/v.sample/main.c:158
+#: ../vector/v.vol.rst/main.c:606 ../vector/v.drape/main.c:245
+#: ../vector/v.what.rast/main.c:139
+#, c-format
+msgid "Raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:178 ../raster/r.clump/main.c:94
+#: ../raster/r.cost/main.c:370 ../raster/r.cost/main.c:675
+#: ../raster/r.cats/main.c:150 ../raster/r.support/front/front.c:227
+#: ../raster/r.composite/main.c:159 ../raster/r.grow.distance/main.c:209
+#: ../raster/r.out.ppm3/main.c:124 ../raster/r.null/null.c:324
+#: ../raster/r.sunmask/main.c:448 ../raster/wildfire/r.ros/main.c:475
+#: ../raster/wildfire/r.ros/main.c:483 ../raster/wildfire/r.ros/main.c:491
+#: ../raster/wildfire/r.ros/main.c:499 ../raster/wildfire/r.ros/main.c:507
+#: ../raster/wildfire/r.ros/main.c:515 ../raster/wildfire/r.ros/main.c:523
+#: ../raster/wildfire/r.ros/main.c:532 ../raster/wildfire/r.ros/main.c:540
+#: ../raster/wildfire/r.ros/main.c:549 ../raster/wildfire/r.spread/main.c:411
+#: ../raster/wildfire/r.spread/main.c:415
+#: ../raster/wildfire/r.spread/main.c:419
+#: ../raster/wildfire/r.spread/main.c:425
+#: ../raster/wildfire/r.spread/main.c:430
+#: ../raster/wildfire/r.spread/main.c:434
+#: ../raster/wildfire/r.spread/main.c:503 ../raster/r.out.arc/main.c:116
+#: ../raster/r.colors/stats.c:33 ../raster/r.out.ppm/main.c:120
+#: ../raster/r.random.cells/indep.c:134 ../raster/r.random.cells/init.c:68
+#: ../raster/r.buffer/read_map.c:42 ../raster/r.buffer/write_map.c:45
+#: ../raster/r.covar/main.c:98 ../raster/r.out.vtk/main.c:222
+#: ../raster/r.out.vtk/main.c:288 ../raster/r.out.vtk/main.c:317
+#: ../raster/r.out.vtk/main.c:364 ../raster/r.mapcalc/map3.c:510
+#: ../raster/r.out.ascii/main.c:151 ../raster/r.random.surface/main.c:54
+#: ../raster/r.random.surface/init.c:134 ../raster/r.lake/main.c:258
+#: ../raster/r.lake/main.c:269 ../raster/r.quantile/main.c:311
+#: ../raster/r.surf.idw/main.c:135 ../raster/r.sum/main.c:65
+#: ../raster/r.out.gdal/export_band.c:48
+#: ../raster/r.out.gdal/export_band.c:246 ../raster/r.random/count.c:24
+#: ../raster/r.random/count.c:30 ../raster/r.random/random.c:41
+#: ../raster/r.random/random.c:45 ../raster/r.to.vect/main.c:117
+#: ../raster/r.grow2/main.c:203 ../raster/r.regression.line/main.c:90
+#: ../raster/r.regression.line/main.c:99 ../raster/r.out.mat/main.c:108
+#: ../raster/r.walk/main.c:573 ../raster/r.walk/main.c:576
+#: ../raster/r.walk/main.c:922 ../raster/r.his/main.c:131
+#: ../raster/r.his/main.c:154 ../raster/r.his/main.c:179
+#: ../raster/r.thin/io.c:100 ../raster/r.to.rast3/main.c:366
+#: ../raster/r.surf.idw2/read_cell.c:34 ../raster/r.resamp.rst/main.c:402
+#: ../raster/r.resamp.rst/main.c:434 ../raster/r.carve/main.c:181
+#: ../raster/r.resamp.stats/main.c:329 ../raster/r.cross/main.c:129
+#: ../raster/r.texture/main.c:234 ../raster/r.to.rast3elev/main.c:160
+#: ../raster/r.profile/main.c:144 ../raster/r.resamp.interp/main.c:138
+#: ../raster/r.contour/main.c:162 ../raster/r.bilinear/main.c:94
+#: ../raster/r.out.png/r.out.png.c:217 ../raster/r.out.tiff/r.out.tiff.c:188
+#: ../raster/r.recode/recode.c:48 ../raster/r.univar2/r.univar_main.c:221
+#: ../raster/r.bitpattern/main.c:108 ../raster/r.surf.area/main.c:121
+#: ../raster/r.los/main.c:198 ../raster/r.los/main.c:209
+#: ../doc/raster/r.example/main.c:122 ../display/d.rgb/main.c:99
+#: ../display/d.profile/What.c:23 ../display/d.profile/ExtractProf.c:93
+#: ../display/d.what.rast/opencell.c:24 ../display/d.rast.arrow/arrow.c:380
+#: ../display/d.rast.num/number.c:157 ../display/d.rast.edit/cell.c:92
+#: ../display/d.his/main.c:141 ../display/d.his/main.c:164
+#: ../display/d.nviz/main.c:187 ../display/d.rast/display.c:79
+#: ../imagery/i.landsat.acca/main.c:61 ../imagery/i.landsat.acca/tools.c:130
+#: ../imagery/i.landsat.acca/algorithm.c:389
+#: ../imagery/i.cluster/open_files.c:56 ../imagery/i.modis.qc/main.c:221
+#: ../imagery/i.maxlik/open.c:41 ../imagery/i.his.rgb/openfiles.c:33
+#: ../imagery/i.his.rgb/openfiles.c:38 ../imagery/i.his.rgb/openfiles.c:43
+#: ../imagery/i.smap/shapiro/opencell.c:16
+#: ../imagery/i.gensigset/opencell.c:13 ../imagery/i.gensig/opencell.c:12
+#: ../imagery/i.pca/main.c:141 ../imagery/i.rgb.his/openfiles.c:21
+#: ../imagery/i.rgb.his/openfiles.c:23 ../imagery/i.rgb.his/openfiles.c:25
+#: ../imagery/i.landsat.toar/main.c:326 ../imagery/i.landsat.toar/main.c:465
+#: ../visualization/xganim/main.c:370 ../vector/v.extrude/main.c:184
+#: ../vector/v.sample/main.c:161 ../vector/v.vol.rst/main.c:609
+#: ../vector/v.drape/main.c:250 ../vector/v.what.rast/main.c:142
+#: ../vector/v.to.rast/support.c:265 ../vector/v.to.rast/support.c:511
+#, c-format
+msgid "Unable to open raster map <%s>"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:183
+#, c-format
+msgid "Invalid output filename <%s>"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:186 ../raster/r.out.mat/main.c:115
+#: ../raster/r.colors.out/main.c:101 ../raster/r.out.png/r.out.png.c:233
+#, c-format
+msgid "Unable to open output file <%s>"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:193
+#, c-format
+msgid "Raster map is too big! Exceeds %d columns or %d rows"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:214
+msgid "Negative elevation values in input"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:47
+msgid "raster, export, VRML"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:49
+msgid "Export a raster map to the Virtual Reality Modeling Language (VRML)"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:56
+msgid "Name of elevation map"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:63
+msgid "Name of color file"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:70 ../misc/m.nviz.image/args.c:494
+msgid "Vertical exaggeration"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:77
+msgid "Name for new VRML file"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:163
+#, c-format
+msgid "Opening %s for writing... "
+msgstr ""
+
+#: ../raster/r.out.vrml/put_grid.c:37
+msgid "Writing vertices..."
+msgstr ""
+
+#: ../raster/r.out.vrml/put_grid.c:82
+msgid "Writing color file..."
+msgstr ""
+
+#: ../raster/r.clump/main.c:49 ../raster/r.reclass/main.c:49
+msgid "raster, statistics, reclass"
+msgstr ""
+
+#: ../raster/r.clump/main.c:51
+msgid ""
+"Recategorizes data in a raster map by grouping cells that form physically "
+"discrete areas into unique categories."
+msgstr ""
+
+#: ../raster/r.clump/main.c:63 ../raster/r.recode/main.c:60
+msgid "Title for output raster map"
+msgstr ""
+
+#: ../raster/r.clump/main.c:68 ../raster/r.series/main.c:170
+#: ../raster/r.out.ppm3/main.c:90 ../raster/r.colors/main.c:249
+#: ../raster/r.out.ppm/main.c:69 ../raster/r.buffer/main.c:101
+#: ../raster/r.covar/main.c:67 ../raster/r.distance/parse.c:64
+#: ../raster/r.carve/main.c:116 ../raster/r.cross/main.c:100
+#: ../raster/r.compress/main.c:82 ../raster/r.contour/main.c:135
+#: ../raster/r.out.png/r.out.png.c:136 ../raster/r.neighbors/main.c:171
+#: ../raster/r.describe/main.c:107 ../imagery/i.maxlik/main.c:95
+#: ../imagery/i.smap/shapiro/parse.c:43
+msgid "Run quietly"
+msgstr ""
+
+#: ../raster/r.clump/main.c:77 ../raster/r.series/main.c:188
+#: ../raster/r.out.ppm3/main.c:102 ../raster/r.colors/main.c:258
+#: ../raster/r.buffer/main.c:110 ../raster/r.covar/main.c:75
+#: ../raster/r.random.surface/init.c:109 ../raster/r.distance/parse.c:72
+#: ../raster/r.to.vect/main.c:100 ../raster/r.rescale.eq/main.c:107
+#: ../raster/r.carve/main.c:126 ../raster/r.rescale/main.c:103
+#: ../raster/r.cross/main.c:107 ../raster/r.texture/main.c:221
+#: ../raster/r.compress/main.c:90 ../raster/r.slope.aspect/main.c:301
+#: ../raster/r.out.png/r.out.png.c:159 ../raster/r.resample/main.c:90
+#: ../raster/r.neighbors/main.c:292 ../raster/r.patch/main.c:87
+#: ../raster/r.describe/main.c:115 ../vector/v.mkgrid/main.c:141
+#: ../vector/v.qcount/main.c:117
+msgid ""
+"The '-q' flag is superseded and will be removed in future. Please use '--"
+"quiet' instead."
+msgstr ""
+
+#: ../raster/r.clump/main.c:90 ../raster/r.mode/main.c:94
+#: ../raster/r.cost/main.c:352 ../raster/r.cost/main.c:356
+#: ../raster/r.watershed/shed/com_line.c:231
+#: ../raster/r.watershed/shed/com_line.c:266
+#: ../raster/wildfire/r.spread/main.c:380
+#: ../raster/wildfire/r.spread/main.c:389
+#: ../raster/wildfire/r.spread/main.c:399 ../raster/r.in.ascii/main.c:203
+#: ../raster/r.drain/main.c:206 ../raster/r.buffer/main.c:130
+#: ../raster/r.surf.idw/main.c:112 ../raster/r.water.outlet/legal.c:10
+#: ../raster/r.random/main.c:147 ../raster/r.random/main.c:152
+#: ../raster/r.in.gdal/main.c:225 ../raster/r.in.mat/main.c:388
+#: ../raster/r.surf.gauss/main.c:77 ../raster/r.walk/main.c:554
+#: ../raster/r.walk/main.c:558 ../raster/r.surf.idw2/main.c:83
+#: ../raster/r.texture/main.c:231 ../raster/r.average/main.c:78
+#: ../raster/r.to.rast3elev/main.c:472 ../raster/r.median/main.c:77
+#: ../raster/r.slope.aspect/opennew.c:11 ../raster/r.recode/main.c:84
+#: ../raster/r.neighbors/main.c:197 ../raster/r.surf.fractal/interface.c:79
+#: ../raster/r.bitpattern/main.c:104 ../raster/r.reclass/main.c:81
+#: ../raster/r.los/main.c:173 ../general/manage/cmd/rename.c:84
+#: ../general/manage/cmd/copy.c:88 ../doc/raster/r.example/main.c:114
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:91
+#: ../imagery/i.landsat.acca/main.c:189 ../imagery/i.zc/main.c:119
+#: ../imagery/i.fft/fftmain.c:121 ../imagery/i.fft/fftmain.c:124
+#: ../imagery/i.landsat.toar/main.c:476 ../imagery/i.ifft/ifftmain.c:116
+#: ../vector/v.kernel/main.c:323 ../vector/v.surf.idw/main.c:137
+#: ../vector/v.to.rast3/main.c:69 ../vector/v.edit/main.c:87
+#: ../vector/v.in.ogr/main.c:337
+#, c-format
+msgid "<%s> is an illegal file name"
+msgstr ""
+
+#: ../raster/r.clump/main.c:98 ../raster/r.in.arc/main.c:154
+#: ../raster/r.composite/main.c:192 ../raster/r.in.xyz/main.c:498
+#: ../raster/r.series/main.c:250 ../raster/r.null/null.c:329
+#: ../raster/r.sunmask/main.c:450 ../raster/r.in.ascii/main.c:206
+#: ../raster/r.buffer/write_map.c:40 ../raster/r.mapcalc/map.c:507
+#: ../raster/r.mapcalc/map3.c:580 ../raster/r.sun2/main.c:1164
+#: ../raster/r.sun2/main.c:1171 ../raster/r.sun2/main.c:1178
+#: ../raster/r.sun2/main.c:1185 ../raster/r.sun2/main.c:1192
+#: ../raster/r.sun2/main.c:1199 ../raster/r.random.surface/save.c:23
+#: ../raster/r.lake/main.c:229 ../raster/r.lake/main.c:318
+#: ../raster/r.surf.idw/main.c:147 ../raster/r.random/random.c:55
+#: ../raster/r.basins.fill/main.c:106 ../raster/r.in.gdal/main.c:774
+#: ../raster/r.in.gdal/main.c:779 ../raster/r.in.gdal/main.c:796
+#: ../raster/r.circle/dist.c:127 ../raster/r.grow2/main.c:209
+#: ../raster/r.in.mat/main.c:430 ../raster/r.thin/io.c:168
+#: ../raster/r.surf.idw2/main.c:111 ../raster/r.carve/main.c:189
+#: ../raster/r.resamp.stats/main.c:341 ../raster/r.cross/main.c:145
+#: ../raster/r.texture/main.c:309 ../raster/r.li/r.li.daemon/daemon.c:132
+#: ../raster/r.slope.aspect/opennew.c:19 ../raster/r.resamp.interp/main.c:148
+#: ../raster/r.bilinear/main.c:104 ../raster/r.patch/main.c:144
+#: ../raster/r.surf.fractal/write_rast.c:58 ../raster/r.bitpattern/main.c:125
+#: ../raster/r.surf.random/randsurf.c:28 ../raster/r.surf.random/randsurf.c:32
+#: ../raster/r.flow/io.c:173 ../raster/r.flow/io.c:208
+#: ../raster/r.los/main.c:203 ../doc/raster/r.example/main.c:141
+#: ../raster3d/r3.to.rast/main.c:183 ../imagery/i.landsat.acca/tools.c:140
+#: ../imagery/i.landsat.acca/algorithm.c:234
+#: ../imagery/i.landsat.acca/algorithm.c:397 ../imagery/i.modis.qc/main.c:235
+#: ../imagery/i.maxlik/open.c:74 ../imagery/i.his.rgb/openfiles.c:15
+#: ../imagery/i.his.rgb/openfiles.c:17 ../imagery/i.his.rgb/openfiles.c:19
+#: ../imagery/i.smap/shapiro/opencell.c:30 ../imagery/i.topo.corr/main.c:58
+#: ../imagery/i.rgb.his/openfiles.c:29 ../imagery/i.rgb.his/openfiles.c:31
+#: ../imagery/i.rgb.his/openfiles.c:33 ../imagery/i.landsat.toar/main.c:479
+#: ../imagery/i.ifft/ifftmain.c:219 ../vector/v.kernel/main.c:328
+#: ../vector/v.surf.idw/main.c:264 ../vector/lidar/v.surf.bspline/main.c:317
+#: ../vector/v.to.rast/vect2rast.c:125 ../vector/v.to.rast/vect2rast.c:129
+#: ../vector/v.neighbors/main.c:96
+#, c-format
+msgid "Unable to create raster map <%s>"
+msgstr ""
+
+#: ../raster/r.clump/main.c:120
+#, c-format
+msgid "%d clumps."
+msgstr ""
+
+#: ../raster/r.clump/clump.c:98
+#, c-format
+msgid "Pass %d..."
+msgstr ""
+
+#: ../raster/r.clump/clump.c:101
+#, c-format
+msgid "Unable to read raster map row %d "
+msgstr ""
+
+#: ../raster/r.clump/clump.c:238
+#, c-format
+msgid "Failed writing raster map row %d"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:59 ../raster/r.in.gridatb/main.c:41
+#: ../raster/r.in.poly/main.c:29 ../raster/r.in.gdal/main.c:79
+#: ../raster/r.in.mat/main.c:92 ../raster/r.external/main.c:520
+#: ../raster/r.in.bin/main.c:234
+#: ../locale/scriptstrings/r.in.srtm_to_translate.c:2
+msgid "raster, import"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:61
+msgid ""
+"Converts an ESRI ARC/INFO ascii raster file (GRID) into a (binary) raster "
+"map layer."
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:69
+msgid "ARC/INFO ASCII raster file (GRID) to be imported"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:80 ../raster/r.in.xyz/main.c:185
+msgid "Storage type for resultant raster map"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:87 ../raster/r.in.poly/main.c:44
+#: ../raster/r.in.ascii/main.c:85 ../raster/r.in.gdal/main.c:121
+#: ../raster/r.external/main.c:550 ../raster/r.in.bin/main.c:277
+msgid "Title for resultant raster map"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:94 ../raster/r.in.ascii/main.c:92
+msgid "Multiplier for ASCII data"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:114 ../raster/r.in.ascii/main.c:128
+#: ../raster/r.in.ascii/main.c:155 ../raster/r.resamp.rst/main.c:616
+#: ../raster/r.resamp.rst/main.c:628 ../raster/r.resamp.rst/main.c:641
+#: ../raster/r.resamp.rst/main.c:655 ../raster/r.resamp.rst/main.c:668
+#: ../raster/r.resamp.rst/main.c:681 ../general/g.setproj/get_stp.c:162
+#: ../general/g.setproj/get_stp.c:165 ../general/g.setproj/get_stp.c:282
+#: ../general/g.setproj/get_stp.c:286 ../display/d.text/main.c:193
+#: ../display/d.text.new/main.c:417 ../display/d.title/main.c:119
+#: ../vector/v.in.ascii/in.c:248 ../vector/v.surf.rst/main.c:646
+#: ../vector/v.surf.rst/main.c:655 ../vector/v.surf.rst/main.c:664
+#: ../vector/v.surf.rst/main.c:674 ../vector/v.surf.rst/main.c:683
+#: ../vector/v.surf.rst/main.c:692
+#, c-format
+msgid "Unable to open temporary file <%s>"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:124 ../raster/r.in.xyz/main.c:470
+#: ../raster/r.in.mat/main.c:144 ../display/d.linegraph/linegraph.c:193
+#: ../display/d.linegraph/linegraph.c:204 ../vector/v.net.path/path.c:49
+#: ../vector/v.segment/main.c:92 ../vector/v.lrs/v.lrs.segment/main.c:131
+#, c-format
+msgid "Unable to open input file <%s>"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:127 ../raster/r.in.ascii/main.c:185
+msgid "Can't get cell header"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:132 ../raster/r.in.ascii/main.c:190
+#: ../raster/r.out.tiff/r.out.tiff.c:173 ../vector/v.digit/driver.c:82
+msgid "Can't set window"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:135 ../raster/r.in.ascii/main.c:193
+#: ../raster/r.horizon/main.c:623
+#, c-format
+msgid "OOPS: rows changed from %d to %d"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:138 ../raster/r.in.ascii/main.c:196
+#: ../raster/r.horizon/main.c:627
+#, c-format
+msgid "OOPS: cols changed from %d to %d"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:161 ../raster/r.in.ascii/main.c:212
+#, c-format
+msgid "Data conversion failed at row %d, col %d"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:228
+msgid "Failed to copy file"
+msgstr ""
+
+#: ../raster/r.in.arc/gethead.c:88
+msgid "Illegal line in header"
+msgstr ""
+
+#: ../raster/r.in.arc/gethead.c:160 ../raster/r.in.ascii/gethead.c:251
+#, c-format
+msgid "Duplicate \"%s\" field in header"
+msgstr ""
+
+#: ../raster/r.in.arc/gethead.c:165
+#, c-format
+msgid "Illegal \"%s\" value in header: \"%s\""
+msgstr ""
+
+#: ../raster/r.in.arc/gethead.c:173 ../raster/r.in.ascii/gethead.c:264
+#, c-format
+msgid "\"%s\" field missing from header"
+msgstr ""
+
+#: ../raster/r.mode/main.c:50 ../raster/r.coin/main.c:66
+#: ../raster/r.support.stats/main.c:39 ../raster/r.stats/main.c:103
+#: ../raster/r.statistics/main.c:42 ../raster/r.covar/main.c:53
+#: ../raster/r.quantile/main.c:254 ../raster/r.report/main.c:64
+#: ../raster/r.sum/main.c:46 ../raster/r.surf.gauss/main.c:46
+#: ../raster/r.regression.line/main.c:42 ../raster/r.cross/main.c:75
+#: ../raster/r.texture/main.c:74 ../raster/r.average/main.c:51
+#: ../raster/r.median/main.c:46 ../raster/r.kappa/main.c:67
+#: ../raster/r.neighbors/main.c:108 ../raster/r.univar2/r.univar_main.c:97
+#: ../raster/r.surf.area/main.c:86
+#: ../locale/scriptstrings/r.univar.sh_to_translate.c:2
+msgid "raster, statistics"
+msgstr ""
+
+#: ../raster/r.mode/main.c:52
+msgid ""
+"Finds the mode of values in a cover map within areas assigned the same "
+"category value in a user-specified base map."
+msgstr ""
+
+#: ../raster/r.mode/main.c:58
+msgid "Base map to be reclassified"
+msgstr ""
+
+#: ../raster/r.mode/main.c:65
+msgid "Coverage map"
+msgstr ""
+
+#: ../raster/r.mode/main.c:72
+msgid "Output map"
+msgstr ""
+
+#: ../raster/r.mode/main.c:86
+#, c-format
+msgid "%s: base raster map not found"
+msgstr ""
+
+#: ../raster/r.mode/main.c:91
+#, c-format
+msgid "%s: cover raster map not found"
+msgstr ""
+
+#: ../raster/r.mode/main.c:97
+#, c-format
+msgid "%s: base map and output map must be different"
+msgstr ""
+
+#: ../raster/r.mode/main.c:101
+#, c-format
+msgid "%s: Unable to read category labels"
+msgstr ""
+
+#: ../raster/r.mode/read_stats.c:14
+msgid "reading r.stats output"
+msgstr ""
+
+#: ../raster/r.cost/main.c:128 ../raster/r.walk/main.c:177
+msgid "raster, cost surface, cumulative costs"
+msgstr ""
+
+#: ../raster/r.cost/main.c:130
+msgid ""
+"Creates a raster map showing the cumulative cost of moving between different "
+"geographic locations on an input raster map whose cell category values "
+"represent cost."
+msgstr ""
+
+#: ../raster/r.cost/main.c:137
+msgid "Name of raster map containing grid cell cost information"
+msgstr ""
+
+#: ../raster/r.cost/main.c:147 ../raster/r.walk/main.c:214
+msgid "Name of output raster map to contain movement directions"
+msgstr ""
+
+#: ../raster/r.cost/main.c:152
+msgid "Name of starting vector points map"
+msgstr ""
+
+#: ../raster/r.cost/main.c:153 ../raster/r.cost/main.c:165
+#: ../raster/r.cost/main.c:174 ../raster/r.cost/main.c:224
+#: ../raster/r.drain/main.c:140 ../raster/r.drain/main.c:146
+msgid "Start"
+msgstr ""
+
+#: ../raster/r.cost/main.c:158
+msgid "Name of stop vector points map"
+msgstr ""
+
+#: ../raster/r.cost/main.c:159 ../raster/r.cost/main.c:183
+msgid "Stop"
+msgstr ""
+
+#: ../raster/r.cost/main.c:164
+msgid "Name of starting raster points map"
+msgstr ""
+
+#: ../raster/r.cost/main.c:173
+msgid "Map grid coordinates of a starting point (E,N)"
+msgstr ""
+
+#: ../raster/r.cost/main.c:182
+msgid "Map grid coordinates of a stopping point (E,N)"
+msgstr ""
+
+#: ../raster/r.cost/main.c:192
+msgid "Optional maximum cumulative cost"
+msgstr ""
+
+#: ../raster/r.cost/main.c:201 ../raster/r.walk/main.c:260
+msgid "Cost assigned to null cells. By default, null cells are excluded"
+msgstr ""
+
+#: ../raster/r.cost/main.c:210 ../raster/r.in.xyz/main.c:235
+#: ../raster/r.walk/main.c:268
+msgid "Percent of map to keep in memory"
+msgstr ""
+
+#: ../raster/r.cost/main.c:215 ../raster/r.walk/main.c:310
+msgid "Use the 'Knight's move'; slower, but more accurate"
+msgstr ""
+
+#: ../raster/r.cost/main.c:219
+msgid "Keep null values in output raster map"
+msgstr ""
+
+#: ../raster/r.cost/main.c:223 ../raster/r.walk/main.c:318
+msgid "Start with values in raster map"
+msgstr ""
+
+#: ../raster/r.cost/main.c:229 ../raster/wildfire/r.ros/main.c:301
+#: ../raster/wildfire/r.spreadpath/main.c:110 ../display/d.vect/main.c:314
+msgid "Run verbosely"
+msgstr ""
+
+#: ../raster/r.cost/main.c:238 ../raster/wildfire/r.ros/main.c:314
+#: ../raster/wildfire/r.spread/main.c:255 ../raster/r.in.mat/main.c:125
+#: ../raster/r.out.mat/main.c:90 ../raster/r.out.tiff/r.out.tiff.c:144
+#: ../display/d.vect/main.c:367 ../display/d.mon/pgms/release.c:36
+#: ../visualization/nviz/src/nviz_init.c:157
+msgid ""
+"The '-v' flag is superseded and will be removed in future. Please use '--"
+"verbose' instead."
+msgstr ""
+
+#: ../raster/r.cost/main.c:256 ../raster/wildfire/r.spread/main.c:338
+#: ../raster/r.water.outlet/main.c:85 ../raster/r.walk/main.c:339
+msgid "Unable to read current window parameters"
+msgstr ""
+
+#: ../raster/r.cost/main.c:290
+msgid "Must specify exactly one of start_points, start_rast or coordinate"
+msgstr ""
+
+#: ../raster/r.cost/main.c:295 ../raster/r.cost/main.c:614
+#: ../raster/r.cost/main.c:720
+msgid "No start points"
+msgstr ""
+
+#: ../raster/r.cost/main.c:302 ../raster/r.walk/main.c:368
+#, c-format
+msgid "Inappropriate maximum cost: %d"
+msgstr ""
+
+#: ../raster/r.cost/main.c:306 ../raster/r.walk/main.c:372
+#, c-format
+msgid "Inappropriate percent memory: %d"
+msgstr ""
+
+#: ../raster/r.cost/main.c:319 ../raster/r.drain/main.c:284
+#: ../raster/r.region/main.c:237 ../raster/r.carve/main.c:172
+#: ../general/g.mremove/do_remove.c:34 ../general/g.region/main.c:548
+#: ../doc/vector/v.example/main.c:73 ../misc/m.nviz.image/vector.c:81
+#: ../display/d.path/main.c:193 ../display/d.thematic.area/main.c:211
+#: ../display/d.vect/main.c:451 ../display/d.extend/main.c:97
+#: ../display/d.what.vect/main.c:148 ../display/d.extract/main.c:98
+#: ../display/d.vect.chart/main.c:246 ../display/d.zoom/main.c:245
+#: ../vector/v.kernel/main.c:275 ../vector/v.extrude/main.c:144
+#: ../vector/v.label/main.c:270 ../vector/v.delaunay2/main.c:117
+#: ../vector/v.out.dxf/main.c:69 ../vector/v.transform/main.c:307
+#: ../vector/v.surf.rst/main.c:565 ../vector/v.info/main.c:103
+#: ../vector/v.category/main.c:226 ../vector/v.out.ogr/main.c:196
+#: ../vector/v.out.svg/main.c:141 ../vector/v.sample/main.c:152
+#: ../vector/v.type/main.c:202 ../vector/v.net/main.c:143
+#: ../vector/v.net/main.c:158 ../vector/v.convert/old2new.c:26
+#: ../vector/v.convert/att.c:30 ../vector/v.buffer2/main.c:311
+#: ../vector/v.net.salesman/main.c:171 ../vector/v.build.polylines/main.c:145
+#: ../vector/v.net.path/main.c:131 ../vector/v.out.pov/main.c:94
+#: ../vector/v.to.points/main.c:244 ../vector/v.label.sa/labels.c:60
+#: ../vector/v.clean/main.c:241 ../vector/v.db.select/main.c:132
+#: ../vector/v.voronoi/vo_main.c:158 ../vector/v.voronoi/dt_main.c:77
+#: ../vector/v.vect.stats/main.c:252 ../vector/v.vect.stats/main.c:259
+#: ../vector/v.univar/main.c:161 ../vector/v.class/main.c:95
+#: ../vector/v.drape/main.c:261 ../vector/v.buffer/main.c:365
+#: ../vector/v.extract/main.c:193 ../vector/v.segment/main.c:99
+#: ../vector/v.hull/main.c:300 ../vector/v.distance/main.c:303
+#: ../vector/v.qcount/main.c:128 ../vector/v.to.db/parse.c:128
+#: ../vector/v.overlay/main.c:225 ../vector/v.what/main.c:151
+#: ../vector/v.normal/main.c:128 ../vector/v.edit/main.c:146
+#: ../vector/v.net.alloc/main.c:143 ../vector/v.net.steiner/main.c:428
+#: ../vector/v.net.iso/main.c:181 ../vector/v.what.rast/main.c:120
+#: ../vector/v.kcv/main.c:132 ../vector/v.select/main.c:103
+#: ../vector/lidar/v.lidar.growing/main.c:129
+#: ../vector/lidar/v.surf.bspline/main.c:219
+#: ../vector/lidar/v.surf.bspline/main.c:273
+#: ../vector/lidar/v.lidar.edgedetection/main.c:217
+#: ../vector/lidar/v.lidar.correction/main.c:182
+#: ../vector/lidar/v.outlier/main.c:156
+#: ../vector/v.lrs/v.lrs.segment/main.c:138
+#: ../vector/v.lrs/v.lrs.create/main.c:250
+#: ../vector/v.lrs/v.lrs.create/main.c:257
+#: ../vector/v.lrs/v.lrs.where/main.c:127
+#: ../vector/v.lrs/v.lrs.where/main.c:135
+#: ../vector/v.lrs/v.lrs.label/main.c:286 ../vector/v.reclass/main.c:108
+#: ../vector/v.to.rast/vect2rast.c:37 ../vector/v.db.connect/main.c:140
+#: ../vector/v.perturb/main.c:154 ../vector/v.generalize/main.c:290
+#, c-format
+msgid "Vector map <%s> not found"
+msgstr ""
+
+#: ../raster/r.cost/main.c:324
+msgid "Assigning negative cost to null cell. Null cells excluded."
+msgstr ""
+
+#: ../raster/r.cost/main.c:402 ../raster/r.walk/main.c:682
+msgid "Creating some temporary files..."
+msgstr ""
+
+#: ../raster/r.cost/main.c:435 ../raster/r.cost/main.c:687
+#: ../raster/r.series/main.c:214 ../raster/r.grow.distance/main.c:259
+#: ../raster/r.colors/stats.c:41 ../raster/r.colors/stats.c:107
+#: ../raster/r.surf.idw/main.c:685 ../raster/r.surf.idw2/read_cell.c:38
+#, c-format
+msgid "Reading raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.cost/main.c:447 ../raster/r.cost/main.c:691
+#: ../raster/r.cost/main.c:1039 ../raster/r.cost/main.c:1072
+#: ../raster/r.cost/main.c:1105 ../raster/r.null/null.c:340
+#: ../raster/r.sunmask/main.c:481 ../raster/r.colors/stats.c:46
+#: ../raster/r.colors/stats.c:113 ../raster/r.out.ppm/main.c:188
+#: ../raster/r.buffer/read_map.c:63 ../raster/r.buffer/write_map.c:61
+#: ../raster/r.lake/main.c:288 ../raster/r.lake/main.c:293
+#: ../raster/r.out.gdal/export_band.c:90
+#: ../raster/r.out.gdal/export_band.c:121
+#: ../raster/r.out.gdal/export_band.c:152
+#: ../raster/r.out.gdal/export_band.c:397
+#: ../raster/r.out.gdal/export_band.c:430
+#: ../raster/r.out.gdal/export_band.c:463 ../raster/r.topidx/file_io.c:77
+#: ../raster/r.walk/main.c:737 ../raster/r.walk/main.c:796
+#: ../raster/r.walk/main.c:940 ../raster/r.walk/main.c:1514
+#: ../raster/r.walk/main.c:1549 ../raster/r.walk/main.c:1584
+#: ../raster/r.profile/read_rast.c:45 ../raster/r.profile/read_rast.c:73
+#: ../raster/r.profile/read_rast.c:101 ../raster/r.patch/main.c:156
+#: ../raster/r.patch/main.c:163 ../raster/r.bitpattern/main.c:135
+#: ../raster/r.los/main.c:264 ../raster/r.los/main.c:272
+#: ../doc/raster/r.example/main.c:154 ../imagery/i.landsat.acca/tools.c:155
+#: ../imagery/i.landsat.acca/tools.c:159 ../imagery/i.landsat.acca/tools.c:163
+#: ../imagery/i.landsat.acca/algorithm.c:252
+#: ../imagery/i.landsat.acca/algorithm.c:411
+#: ../imagery/i.landsat.acca/algorithm.c:414
+#: ../imagery/i.gensigset/get_train.c:36 ../imagery/i.gensig/get_train.c:32
+#: ../vector/v.what.rast/main.c:276 ../vector/v.what.rast/main.c:281
+#: ../vector/v.to.rast/support.c:523
+#, c-format
+msgid "Unable to read raster map <%s> row %d"
+msgstr ""
+
+#: ../raster/r.cost/main.c:461 ../raster/r.cost/main.c:479
+#: ../raster/r.cost/main.c:498
+#, c-format
+msgid ""
+"Negative cell value found at row %d, col %d. Setting negative value to "
+"null_cost value"
+msgstr ""
+
+#: ../raster/r.cost/main.c:517
+msgid "Initializing output..."
+msgstr ""
+
+#: ../raster/r.cost/main.c:540 ../raster/r.walk/main.c:880
+msgid "Initializing directional output "
+msgstr ""
+
+#: ../raster/r.cost/main.c:581 ../raster/r.drain/main.c:290
+msgid "Failed to guess site file format"
+msgstr ""
+
+#: ../raster/r.cost/main.c:631
+msgid "Failed to guess site file format\n"
+msgstr ""
+
+#: ../raster/r.cost/main.c:685 ../raster/r.texture/h_measure.c:770
+#: ../imagery/i.smap/bouman/interp.c:69
+msgid "Unable to allocate memory"
+msgstr ""
+
+#: ../raster/r.cost/main.c:735 ../raster/r.walk/main.c:982
+msgid "Specified starting location outside database window"
+msgstr ""
+
+#: ../raster/r.cost/main.c:751
+msgid "Finding cost path..."
+msgstr ""
+
+#: ../raster/r.cost/main.c:1001
+msgid "No data"
+msgstr ""
+
+#: ../raster/r.cost/main.c:1005 ../raster/r.walk/main.c:1475
+msgid "Error, ct == pres_cell"
+msgstr ""
+
+#: ../raster/r.cost/main.c:1025 ../raster/r.composite/main.c:199
+#: ../raster/r.random.cells/indep.c:137 ../raster/r.drain/main.c:466
+#: ../raster/r.drain/main.c:519 ../raster/r.random.surface/save.c:100
+#: ../imagery/i.smap/shapiro/write_img.c:12
+#, c-format
+msgid "Writing raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.cost/main.c:1133 ../raster/r.walk/main.c:1611
+#, c-format
+msgid "Writing movement direction file %s..."
+msgstr ""
+
+#: ../raster/r.cost/main.c:1187
+#, c-format
+msgid "Peak cost value: %f."
+msgstr ""
+
+#: ../raster/r.cost/main.c:1209 ../raster/r.walk/main.c:1697
+#, c-format
+msgid "Illegal x coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.cost/main.c:1211 ../raster/r.walk/main.c:1699
+#, c-format
+msgid "Illegal y coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.cost/main.c:1215 ../raster/r.walk/main.c:1703
+#, c-format
+msgid "Warning, ignoring point outside window: %.4f,%.4f"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:58
+#, c-format
+msgid "NULL value computed (row %d, col %d)"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:146
+#, c-format
+msgid "Unable to find row %d, col %d: %f"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:185
+msgid "Illegal delete request"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:403
+msgid "Bad start cell"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:417
+#, c-format
+msgid "%s %f-%f lower cost higher or equal"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:423
+#, c-format
+msgid "%s lower above pointer wrong"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:430
+#, c-format
+msgid "%s %f-%f higher cost lower"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:436
+#, c-format
+msgid "%s higher above pointer wrong"
+msgstr ""
+
+#: ../raster/r.cats/cats.c:35
+#, c-format
+msgid "Cannot read header of raster map <%s> in <%s>"
+msgstr ""
+
+#: ../raster/r.cats/cats.c:43
+#, c-format
+msgid "Cannot open cell file of raster map <%s> in <%s>"
+msgstr ""
+
+#: ../raster/r.cats/cats.c:51
+#, c-format
+msgid "Reading <%s> in <%s>"
+msgstr ""
+
+#: ../raster/r.cats/main.c:51
+msgid "raster, category"
+msgstr ""
+
+#: ../raster/r.cats/main.c:53
+msgid ""
+"Manages category values and labels associated with user-specified raster map "
+"layers."
+msgstr ""
+
+#: ../raster/r.cats/main.c:66
+msgid "Comma separated value list"
+msgstr ""
+
+#: ../raster/r.cats/main.c:67
+msgid "Example: 1.4,3.8,13"
+msgstr ""
+
+#: ../raster/r.cats/main.c:72 ../raster/r.stats/main.c:119
+#: ../raster/r.distance/parse.c:50 ../db/base/select.c:214
+#: ../locale/scriptstrings/r.tileset_to_translate.c:13
+#: ../vector/v.db.select/main.c:64 ../vector/v.vect.stats/main.c:201
+msgid "Output field separator"
+msgstr ""
+
+#: ../raster/r.cats/main.c:78 ../raster/r.support/front/front.c:114
+msgid "Raster map from which to copy category table"
+msgstr ""
+
+#: ../raster/r.cats/main.c:84
+msgid "File containing category label rules (or \"-\" to read from stdin)"
+msgstr ""
+
+#: ../raster/r.cats/main.c:91
+msgid "Default label or format string for dynamic labeling"
+msgstr ""
+
+#: ../raster/r.cats/main.c:93
+msgid "Used when no explicit label exists for the category"
+msgstr ""
+
+#: ../raster/r.cats/main.c:101
+msgid "Dynamic label coefficients"
+msgstr ""
+
+#: ../raster/r.cats/main.c:103
+msgid "Two pairs of category multiplier and offsets, for $1 and $2"
+msgstr ""
+
+#: ../raster/r.cats/main.c:136 ../raster/r.support/front/front.c:125
+#, c-format
+msgid "Raster map <%s> not found in current mapset"
+msgstr ""
+
+#: ../raster/r.cats/main.c:155 ../raster/r.cats/main.c:213
+#: ../raster/r.support/front/front.c:230 ../raster/r.statistics/main.c:91
+#: ../raster/r.mapcalc/map.c:92 ../raster/r.mapcalc/map3.c:186
+#: ../raster/r.report/parse.c:264 ../display/d.title/main.c:112
+#, c-format
+msgid "Unable to read category file of raster map <%s@%s>"
+msgstr ""
+
+#: ../raster/r.cats/main.c:159
+#, c-format
+msgid "Category table for <%s> set from <%s>"
+msgstr ""
+
+#: ../raster/r.cats/main.c:177 ../raster/r.out.ppm3/main.c:149
+#: ../raster/r.out.arc/main.c:133 ../raster/r.out.ascii/main.c:172
+#: ../raster/r.profile/main.c:157 ../raster/r.recode/main.c:93
+#: ../general/g.pnmcomp/main.c:241 ../general/g.pnmcomp/main.c:258
+#: ../general/g.transform/main.c:281 ../display/d.nviz/main.c:204
+#: ../vector/v.out.ascii/out.c:169 ../vector/v.out.vtk/main.c:176
+#, c-format
+msgid "Unable to open file <%s>"
+msgstr ""
+
+#: ../raster/r.cats/main.c:197 ../raster/r.cats/main.c:243
+#, c-format
+msgid "Cannot create category file for <%s>"
+msgstr ""
+
+#: ../raster/r.cats/main.c:252
+#, c-format
+msgid "Unable to read category file of raster map <%s> in <%s>"
+msgstr ""
+
+#: ../raster/r.cats/main.c:268
+msgid "The map is floating point! Ignoring cats list, using vals list"
+msgstr ""
+
+#: ../raster/r.cats/main.c:285
+msgid "vals argument is required for floating point map!"
+msgstr ""
+
+#: ../raster/r.transect/main.c:54
+msgid "raster, transect"
+msgstr ""
+
+#: ../raster/r.transect/main.c:56
+msgid ""
+"Outputs raster map layer values lying along user defined transect line(s)."
+msgstr ""
+
+#: ../raster/r.transect/main.c:60
+msgid "Raster map to be queried"
+msgstr ""
+
+#: ../raster/r.transect/main.c:76
+msgid "Transect definition"
+msgstr ""
+
+#: ../raster/r.transect/main.c:85 ../raster/r.what/main.c:117
+#: ../raster3d/r3.out.ascii/main.c:98
+msgid "Char string to represent no data cell"
+msgstr ""
+
+#: ../raster/r.transect/main.c:97 ../raster/r.profile/main.c:97
+msgid "Output easting and northing in first two columns of four column output"
+msgstr ""
+
+#: ../raster/r.transect/main.c:155
+#, c-format
+msgid "End coordinate: %.15g, %.15g"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getrow.c:12 ../raster/r.mfilter/getrow.c:12
+#, c-format
+msgid "Cannot read raster row %d"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getrow.c:23 ../raster/r.mfilter/getrow.c:23
+msgid "Error reading temporary file"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:27 ../raster/r.mfilter/getfilt.c:26
+#, c-format
+msgid "Cannot open filter file '%s'"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:47 ../raster/r.mfilter/getfilt.c:46
+msgid "Illegal filter matrix size specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:50 ../raster/r.mfilter/getfilt.c:49
+msgid "Even filter matrix size specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:72 ../raster/r.mfilter/getfilt.c:71
+msgid "Illegal filter matrix"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:80 ../raster/r.mfilter.fp/getfilt.c:107
+#: ../raster/r.mfilter.fp/getfilt.c:124 ../raster/r.mfilter/getfilt.c:79
+#: ../raster/r.mfilter/getfilt.c:105 ../raster/r.mfilter/getfilt.c:122
+msgid "Filter file format error"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:83 ../raster/r.mfilter/getfilt.c:82
+msgid "Duplicate filter divisor specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:101 ../raster/r.mfilter/getfilt.c:99
+msgid "Illegal divisor matrix"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:110 ../raster/r.mfilter/getfilt.c:108
+msgid "Duplicate filter type specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:117 ../raster/r.mfilter/getfilt.c:115
+msgid "Illegal filter type specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:127 ../raster/r.mfilter/getfilt.c:125
+msgid "Duplicate filter start specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:135 ../raster/r.mfilter/getfilt.c:133
+#, c-format
+msgid "Filter start %s ignored, using UL"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:157 ../raster/r.mfilter/getfilt.c:155
+msgid "Illegal filter file format"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/perform.c:38 ../raster/r.param.scale/open_files.c:26
+#: ../raster/r.mfilter/perform.c:38 ../raster/r.topidx/file_io.c:17
+#: ../imagery/i.cca/main.c:185
+#, c-format
+msgid "Cannot open raster map <%s>"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/perform.c:43 ../raster/r.mfilter.fp/perform.c:54
+#: ../raster/r.mfilter/perform.c:43 ../raster/r.mfilter/perform.c:54
+msgid "Unable to create temporary file"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/perform.c:84 ../raster/r.param.scale/open_files.c:32
+#: ../raster/r.param.scale/open_files.c:36 ../raster/r.mfilter/perform.c:84
+#: ../raster/r.topidx/file_io.c:96 ../raster/r.reclass/reclass.c:235
+#: ../imagery/i.cca/main.c:191
+#, c-format
+msgid "Cannot create raster map <%s>"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/perform.c:87 ../raster/r.mfilter/perform.c:87
+#, c-format
+msgid "Writing raster map <%s>"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:58 ../raster/r.mfilter/main.c:51
+#: ../raster/r.bitpattern/main.c:62
+msgid "raster, map algebra"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:59
+msgid "Raster map matrix filter."
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:70
+msgid "Name of filter file"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:78 ../raster/r.mfilter/main.c:71
+msgid "Number of times to repeat the filter"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:84 ../raster/r.mfilter/main.c:78
+msgid "Output raster map title"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:91 ../raster/r.mfilter/main.c:85
+#: ../raster/r.report/parse.c:95 ../raster/r.rescale.eq/main.c:98
+#: ../raster/r.grow2/main.c:167 ../raster/r.texture/main.c:111
+#: ../raster/r.slope.aspect/main.c:263 ../raster/r.resample/main.c:79
+#: ../raster/r.kappa/main.c:102 ../raster/r.patch/main.c:72
+#: ../raster/r.bitpattern/main.c:87 ../doc/raster/r.example/main.c:96
+#: ../imagery/i.cluster/main.c:163 ../vector/v.sample/main.c:129
+#: ../vector/v.kcv/main.c:106 ../vector/v.perturb/main.c:117
+msgid "Quiet"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:101
+msgid "Apply filter only to null data values"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:109 ../raster/r.out.ppm/main.c:81
+#: ../raster/r.mfilter/main.c:104 ../raster/r.kappa/main.c:125
+msgid ""
+"The '-q' flag is superseded and will be removed in future. Please use '--"
+"quiet' instead"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:138 ../raster/r.mfilter/main.c:133
+msgid "Raster map too small for the size of the filter"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:70
+#, c-format
+msgid "Edit header for [%s]\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:73
+#, c-format
+msgid "[%s] cannot be found!"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:76
+msgid "For what layer shall the header file be edited? "
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:86
+#, c-format
+msgid "[%s] is a reclass of [%s] - cannot edit header! Run support on [%s]."
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:90
+#, c-format
+msgid "[%s] is a reclass of [%s in %s] - cannot edit header!"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:96
+#, c-format
+msgid "Cannot open raster map [%s]!"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:101
+#, c-format
+msgid "Raster file [%s] is empty."
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:103
+#, c-format
+msgid "Error reading raster map [%s]."
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:191
+#, c-format
+msgid "cellhd compression: %d\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:192
+#, c-format
+msgid "3.0 compression %sindicated\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:194
+#, c-format
+msgid "Pre 3.0 compression %sindicated\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:201
+#, c-format
+msgid "[%s] appears to be compressed. Is it? "
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:207
+msgid "Please indicate the type of compression:\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:208
+msgid "  1. Pre 3.0 compression\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:209
+msgid "  2. 3.0 compression\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:245
+#, c-format
+msgid "The header for [%s] says the file is not compressed. "
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:247
+msgid "The file appears to be compressed.\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:248
+#: ../raster/r.support/modhead/modhead.c:257
+msgid "Most likely the header is wrong, but I want you to decide.\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:254
+#, c-format
+msgid "The header for [%s] says the file is compressed. "
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:256
+msgid "The file does NOT appear to be compressed.\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:271
+#, c-format
+msgid ""
+"Header indicates %d row%s in the raster map, but the actual file format "
+"indicates %d row%s"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:303
+#, c-format
+msgid "Unable to write header for [%s]."
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:305
+#, c-format
+msgid "Header for raster map [%s] updated."
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:24
+#, c-format
+msgid "Please enter the following information for [%s]:"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:29
+msgid "        Number of rows"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:30
+msgid "        Number of cols"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:32
+msgid "        Number of bytes per cell"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:33
+msgid "        Floating point map"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:51
+#, c-format
+msgid "rows * cols * bytes per cell must be same as file size (%lu)"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:55
+msgid "If you need help figuring them out, just hit ESC"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:76
+msgid "** Negative values not allowed!"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:79
+msgid "** Positive values only please!"
+msgstr ""
+
+#: ../raster/r.support/modhead/hitreturn.c:12
+msgid ""
+"\n"
+"hit RETURN to continue -->"
+msgstr ""
+
+#: ../raster/r.support/modhist/modhist.c:38
+msgid "Which raster map needs an updated history? "
+msgstr ""
+
+#: ../raster/r.support/modhist/modhist.c:47
+#, c-format
+msgid "Raster file [%s] not found. Exiting."
+msgstr ""
+
+#: ../raster/r.support/modhist/modhist.c:52
+#, c-format
+msgid "History file for [%s] updated."
+msgstr ""
+
+#: ../raster/r.support/modhist/modhist.c:54
+#, c-format
+msgid "History file for [%s] not updated."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:54 ../raster/r.info/main.c:69
+#: ../raster/r.region/main.c:54 ../raster/r.describe/main.c:59
+msgid "raster, metadata"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:55
+msgid "Allows creation and/or modification of raster map layer support files."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:65
+msgid "Text to use for map title"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:73
+msgid "Text to append to the next line of the map's metadata file"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:79
+msgid "Text to use for map data units"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:85
+msgid "Text to use for map vertical datum"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:92
+msgid "Text to use for data source, line 1"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:99
+msgid "Text to use for data source, line 2"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:107
+msgid "Text to use for data description or keyword(s)"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:143
+msgid "Not enough room in history file"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:234
+#, c-format
+msgid "cats table for [%s] set to %s"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:248
+#, c-format
+msgid "Edit header for [%s]? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:250
+#, c-format
+msgid ""
+"\n"
+"NOTE: [%s] is a reclass of [%s in %s]"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:264
+msgid "Canceling from edit header."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:271
+#, c-format
+msgid "Edit the category file for [%s]? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:281
+#, c-format
+msgid "Create/Update the color table for [%s]? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:292
+#, c-format
+msgid "Edit the history file for [%s]? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:302
+#, c-format
+msgid ""
+"\n"
+"The null file for [%s] may indicate that some cells contain\n"
+" no data. If the null file for [%s] doesn't exist, zero cells in\n"
+" it are treated by GRASS application programs as no data."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:308
+#, c-format
+msgid ""
+"\n"
+"Do you want to create/reset the null file for [%s] so that null cell values "
+"are considered valid data? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:317 ../raster/r.support/front/front.c:354
+#, c-format
+msgid "[%s] is a reclass of another map. Exiting."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:329
+#, c-format
+msgid "Writing new null file for [%s]... "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:334
+#, c-format
+msgid "Error writing null row [%d]."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:346
+#, c-format
+msgid ""
+"\n"
+"Do you want to delete the null file for [%s]\n"
+"(all zero cells will then be considered no data)? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:360
+#, c-format
+msgid "Removing null file for [%s]...\n"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:367 ../display/d.what.vect/main.c:172
+msgid "Done."
+msgstr ""
+
+#: ../raster/r.support/front/check.c:29
+#, c-format
+msgid "Update the statistics (histogram, range) for [%s]? "
+msgstr ""
+
+#: ../raster/r.support/front/check.c:35
+#, c-format
+msgid ""
+"\n"
+"  Updating statistics for [%s]"
+msgstr ""
+
+#: ../raster/r.support/front/check.c:77
+#, c-format
+msgid ""
+"   Updating the number of categories for [%s]\n"
+"\n"
+msgstr ""
+
+#: ../raster/r.support/front/hitreturn.c:15
+msgid ""
+"\n"
+"Hit RETURN to continue -->"
+msgstr ""
+
+#: ../raster/r.support/modcats/modcats.c:46
+msgid "Which vector map needs updated categories?"
+msgstr ""
+
+#: ../raster/r.support/modcats/modcats.c:49
+msgid "Which raster map needs updated categories?"
+msgstr ""
+
+#: ../raster/r.support/modcats/modcats.c:53
+#: ../raster/r.support/modcats/modcats.c:62
+#, c-format
+msgid "%s map <%s> not found"
+msgstr ""
+
+#: ../raster/r.support/modcats/modcats.c:74
+#: ../raster/r.support/modcats/modcats.c:81
+#, c-format
+msgid "Category file for <%s> not updated"
+msgstr ""
+
+#: ../raster/r.support/modcats/modcats.c:92
+#, c-format
+msgid "Category file for <%s> updated"
+msgstr ""
+
+#: ../raster/r.support/modcolr/modcolr.c:38
+msgid "Which raster map needs a color table"
+msgstr ""
+
+#: ../raster/r.support/modcolr/modcolr.c:54
+#, c-format
+msgid "Color table for <%s> updated"
+msgstr ""
+
+#: ../raster/r.watershed/seg/main.c:84 ../raster/r.watershed/seg/main.c:95
+#: ../raster/r.watershed/ram/main.c:79 ../raster/r.watershed/ram/main.c:95
+#, c-format
+msgid "SECTION %d: Closing Maps."
+msgstr ""
+
+#: ../raster/r.watershed/seg/main.c:93 ../raster/r.watershed/ram/main.c:93
+#, c-format
+msgid "SECTION %d: Watershed determination."
+msgstr ""
+
+#: ../raster/r.watershed/seg/usage.c:9 ../raster/r.watershed/ram/usage.c:9
+#, c-format
+msgid ""
+"USAGE for basin delineation:\n"
+"%s -4 el=elevation_map t=swale_threshold [ov=overland_flow_map] "
+"[dr=drain_direction_map] [de=depression_map] [ac=accumulation_map] "
+"[di=display_map] ba=watershed_basin_map [se=stream_segment_map]\n"
+"\n"
+"USAGE for ARMSED FILE creation:\n"
+"%s [-4] el=elevation_map t=swale_threshold [ov=overland_flow_map] "
+"[dr=drain_direction_map] [de=depression_map] [ac=accumulation_map] "
+"[di=display_map] [ba=watershed_basin_map] [se=stream_segment_map] "
+"ha=half_basin_map ar=ARMSED_file_name\n"
+"\n"
+"USAGE for slope length determination:\n"
+"%s [-4] el=elevation_map t=swale_threshold [dr=drain_direction_map] "
+"[de=depression_map] [ac=accumulation_map] [di=display_map] "
+"[ms=max_slope_length] [ob=overland_blocking_map] [S=slope_steepness_map] "
+"LS=length_slope_map [r=rill_erosion_map] [sd=slope_deposition value or map]"
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:114
+#, c-format
+msgid "SECTION 1 beginning: Initiating Variables. %d sections total."
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:150
+msgid ""
+"Maximum memory to be used was smaller than 3 MB, set to default = 300 MB."
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:191
+#: ../raster/r.watershed/ram/init_vars.c:150
+msgid "unable to open elevation map layer"
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:278
+#: ../raster/r.watershed/ram/init_vars.c:241
+msgid "unable to open depression map layer"
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:307
+#: ../raster/r.watershed/ram/init_vars.c:258
+msgid "unable to open blocking map layer"
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:366
+#: ../raster/r.watershed/ram/init_vars.c:303
+#, c-format
+msgid "SECTION 1b (of %1d): Determining Offmap Flow."
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_astar.c:30
+#: ../raster/r.watershed/ram/do_astar.c:26
+msgid "SECTION 2: A * Search."
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_astar.c:161
+#: ../raster/r.watershed/ram/do_astar.c:160
+msgid "heapsize too large"
+msgstr ""
+
+#: ../raster/r.watershed/seg/sg_factor.c:12
+#: ../raster/r.watershed/ram/sg_factor.c:13
+msgid "SECTION 4: RUSLE LS and/or S factor determination."
+msgstr ""
+
+#: ../raster/r.watershed/seg/close_maps.c:28
+#: ../raster/r.watershed/ram/close_maps.c:30
+#: ../raster/r.watershed/ram/close_maps.c:165
+msgid "unable to open new accum map layer."
+msgstr ""
+
+#: ../raster/r.watershed/seg/close_maps.c:44
+#: ../raster/r.watershed/ram/close_maps.c:66
+#: ../raster/r.watershed/ram/close_maps.c:153
+#: ../raster/r.watershed/ram/close_maps.c:186
+#: ../raster/r.watershed/ram/close_maps.c:211
+#: ../raster/r.watershed/ram/close_maps.c:231
+#: ../raster/r.watershed/ram/close_maps.c:251
+msgid "Close failed."
+msgstr ""
+
+#: ../raster/r.watershed/seg/close_maps.c:52
+msgid "unable to open flow accumulation map layer"
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_cum.c:17 ../raster/r.watershed/ram/do_cum.c:16
+msgid "SECTION 3: Accumulating Surface Flow with SFD."
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_cum.c:121
+#: ../raster/r.watershed/ram/do_cum.c:117
+msgid "SECTION 3: Accumulating Surface Flow with MFD."
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_cum.c:326
+#: ../raster/r.watershed/ram/do_cum.c:312
+#, c-format
+msgid "MFD: cumulative proportion of flow distribution not 1.0 but %f"
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_cum.c:385
+#: ../raster/r.watershed/ram/do_cum.c:367
+#, c-format
+msgid "MFD: A * path already processed when distributing flow: %d of %d cells"
+msgstr ""
+
+#: ../raster/r.watershed/ram/init_vars.c:103
+#, c-format
+msgid "SECTION 1a (of %1d): Initiating Memory."
+msgstr ""
+
+#: ../raster/r.watershed/ram/init_vars.c:218
+msgid "unable to open runoff map layer"
+msgstr ""
+
+#: ../raster/r.watershed/ram/init_vars.c:275
+msgid "unable to open rill map layer"
+msgstr ""
+
+#: ../raster/r.watershed/ram/close_maps.c:142
+msgid "unable to open new aspect map layer."
+msgstr ""
+
+#: ../raster/r.watershed/ram/close_maps.c:201
+msgid "unable to open new LS factor map layer."
+msgstr ""
+
+#: ../raster/r.watershed/ram/close_maps.c:219
+msgid "unable to open new slope length map layer."
+msgstr ""
+
+#: ../raster/r.watershed/ram/close_maps.c:241
+msgid "unable to open new S factor map layer."
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:8
+#, c-format
+msgid "%s provides a text-based user-interface to the %s program."
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:10
+#, c-format
+msgid "%s also allows the user to prepare a report of map layers for each"
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:12
+#, c-format
+msgid "watershed basin determined in %s.\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:14
+#, c-format
+msgid "%s will help the user determine which options to use for the"
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:16
+#, c-format
+msgid "%s program.  %s will then ask for map layers that will be"
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:18
+#, c-format
+msgid "divided by basin. %s will then run %s and create the report."
+msgstr ""
+
+#: ../raster/r.watershed/shed/valid.c:24
+msgid "accum file missing in valid_basins()"
+msgstr ""
+
+#: ../raster/r.watershed/shed/valid.c:28
+msgid "unable to open accum file in valid_basins()"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:12
+msgid ""
+"\n"
+"\n"
+"Please indicate which map layers you wish to use in the lumped"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:13
+msgid "parameter hydrologic/soil erosion model.  Continue inputing cell map"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:14
+msgid "layers, one at a time, until all desired map layers are in."
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:15
+#, c-format
+msgid "You can have %s include a list of categories in each."
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:17
+#, c-format
+msgid ""
+"\n"
+"Hit <return> at the map prompt to continue with %s"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:36
+#, c-format
+msgid ""
+"\n"
+"The output from %s will be divided into watershed"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:38
+msgid "basins.  There are two possible methods of tabulating the information:"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:39
+msgid "1) by only including data pertaining to the basin itself, or 2) using"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:40
+msgid "data from the basin, and all basins upstream of it."
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:43
+msgid ""
+"\n"
+"Would you like the data organized:"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:44
+msgid ""
+"1) Basin only\n"
+"2) Upstream only\n"
+"3) Both\n"
+"OR 0) to cancel program"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:45
+#, c-format
+msgid ""
+"\n"
+"Your choice: "
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:69
+#: ../raster/r.watershed/shed/basin_maps.c:73
+#, c-format
+msgid ""
+"\n"
+"OK, %s should start running now using the following form:\n"
+"%s"
+msgstr ""
+
+#: ../raster/r.watershed/shed/main.c:41
+msgid "Slow version of water analysis program starting now"
+msgstr ""
+
+#: ../raster/r.watershed/shed/main.c:46 ../raster/r.watershed/shed/main.c:55
+#, c-format
+msgid "<<%s>> command line failed"
+msgstr ""
+
+#: ../raster/r.watershed/shed/main.c:72
+msgid "unable to open output file"
+msgstr ""
+
+#: ../raster/r.watershed/shed/read.c:23
+msgid "unable to open basin/half basin map"
+msgstr ""
+
+#: ../raster/r.watershed/shed/file_in.c:15
+msgid "unable to open ARMSED file"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:23
+msgid ""
+"\n"
+"This set of questions will organize the command line for the"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:24
+#, c-format
+msgid "%s program to run properly for your application."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:26
+#, c-format
+msgid "The first question is whether you want %s to run"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:28
+#, c-format
+msgid "in its fast mode or its slow mode.  If you run %s"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:30
+msgid "in the fast mode, the computer will finish about 10 times faster"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:31
+msgid "than in the slow mode, but will not allow other programs to run"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:32
+msgid "at the same time.  The fast mode also places all of the data into"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:33
+msgid "RAM, which limits the size of window that can be run.  The slow"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:34
+msgid "mode uses disk space in the same hard disk partition as where GRASS is"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:35
+msgid "stored.  Thus, if the program does not work in the slow mode, you will"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:36
+msgid "need to remove unnecessary files from that partition.  The slow mode"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:37
+#, c-format
+msgid "will allow other processes to run concurrently with %s.\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:69
+#: ../raster/r.watershed/shed/com_line.c:182
+msgid ""
+"\n"
+"If you hit <return> by itself for the next question, this"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:70
+#: ../raster/r.watershed/shed/com_line.c:183
+msgid "program will terminate."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:81
+#, c-format
+msgid ""
+"\n"
+"One of the options for %s is a `depression map'.  A"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:83
+msgid ""
+"depression map indicates all the locations in the current map window where"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:84
+msgid ""
+"water accumulates and does not leave by the edge of the map. Lakes without"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:85
+msgid ""
+"outlet streams and sinkholes are examples of `depressions'.  If you wish to"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:86
+msgid "have a depression map, prepare a map where non-zero values indicate the"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:87
+msgid "locations where depressions occur.\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:88
+msgid ""
+"Hit <return> by itself for the next question if there is no depression map."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:99
+#, c-format
+msgid ""
+"\n"
+"The %s program will divide the elevation map into a number of"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:101
+msgid ""
+"watershed basins.  The number of watershed basins is indirectly determined"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:102
+msgid ""
+"by the `basin threshold' value.  The basin threshold is the area necessary "
+"for"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:103
+#, c-format
+msgid "%s to define a unique watershed basin.  This area only applies to"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:105
+msgid ""
+"`exterior drainage basins'.  An exterior drainage basin does not have any"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:106
+msgid ""
+"drainage basins flowing into it.  Interior drainage basin size is determined"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:107
+msgid ""
+"by the surface flow going into stream segments between stream interceptions."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:108
+#, c-format
+msgid "Thus interior drainage basins can be of any size.  The %s program"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:110
+msgid "also allows the user to relate basin size to potential overland flow"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:111
+msgid ""
+"(i.e., areas with low infiltration capacities will need smaller areas to"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:112
+msgid ""
+"develop stream channels than neighboring areas with high infiltration rates)."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:113
+msgid ""
+"The user can create a map layer with potential overland flow values, and"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:114
+#, c-format
+msgid "%s will accumulate those values instead of area.\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:116
+msgid "What unit of measure will you use for the basin threshold:"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:119
+msgid " 1) acres,          2) meters sq., 3) miles sq., 4) hectares,"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:120
+msgid " 5) kilometers sq., 6) map cells,  7) overland flow units"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:121
+#, c-format
+msgid "Choose 1-7 or 0 to exit this program: "
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:131
+msgid ""
+"\n"
+"How large an area (or how many overland flow units) must a drainage basin"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:132
+#, c-format
+msgid "be for it to be an exterior drainage basin: "
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:201
+#, c-format
+msgid ""
+"\n"
+"%s must create a map layer of watershed basins"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:203
+#: ../raster/r.watershed/shed/com_line.c:224
+#, c-format
+msgid "before %s can run properly."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:222
+#, c-format
+msgid ""
+"\n"
+"%s must create a file of watershed basin relationships"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:228
+#: ../raster/r.watershed/shed/com_line.c:263
+#, c-format
+msgid ""
+"\n"
+"Please name this file:"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:257
+#, c-format
+msgid ""
+"\n"
+"%s will generate a lot of output.  Indicate a file"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:259
+#, c-format
+msgid "name for %s to send the output to."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:277
+#, c-format
+msgid ""
+"\n"
+"The accumulation map from %s must be present for"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:279
+#, c-format
+msgid "%s to work properly."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:290
+#, c-format
+msgid ""
+"\n"
+"%s can produce several maps not necessary for"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:292
+#, c-format
+msgid "%s to function (stream channels, overland flow aspect, and"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:294
+#, c-format
+msgid "a display version of the accumulation map).  %s also has the"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:296
+msgid ""
+"ability to generate several variables in the Revised Universal Soil Loss"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:297
+msgid "Equation (Rusle): Slope Length (LS), and Slope Steepness (S).\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:348
+msgid ""
+"\n"
+"The Slope Length factor (LS) and Slope Steepness (S) are influenced by"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:349
+#, c-format
+msgid "disturbed land.  %s reflects this with an optional map layer or value"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:351
+msgid ""
+"where the value indicates the percent of disturbed (barren) land in that "
+"cell."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:352
+msgid "Type <return> if you do not have a disturbed land map layer."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:364
+msgid ""
+"\n"
+"Type the value indicating the percent of disturbed land.  This value will"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:365
+msgid "be used for every cell in the current region."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:368
+#, c-format
+msgid ""
+"\n"
+"Input value here [0-100]: "
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:379
+msgid ""
+"\n"
+"Overland surface flow only occurs for a set distance before swales form."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:380
+#, c-format
+msgid "Because of digital terrain model limitations, %s cannot pick up"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:382
+#, c-format
+msgid "these swales.  %s allows for an input (warning: kludge factor)"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:384
+msgid ""
+"that prevents the surface flow distance from getting too long.  Normally,"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:385
+msgid "maximum slope length is around 600 feet (about 183 meters)."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:400
+msgid ""
+"\n"
+"Roads, ditches, changes in ground cover, and other factors will stop"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:401
+msgid ""
+"slope length.  You may input a raster map indicating the locations of these"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:402
+msgid "blocking factors.\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:403
+msgid ""
+"Hit <return> by itself for the next question if there is no blocking map."
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:56 ../raster/r.drain/main.c:108
+#: ../raster/r.gwflow/main.c:189 ../raster/r.lake/main.c:150
+#: ../raster/r.water.outlet/main.c:47 ../raster/r.topidx/main.c:37
+#: ../raster/r.basins.fill/main.c:53 ../raster/r.topmodel/main.c:55
+#: ../raster/r.fill.dir/main.c:84 ../raster/r.carve/main.c:77
+#: ../raster/r.flow/calc.c:411
+msgid "raster, hydrology"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:57
+msgid "Watershed basin analysis program."
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:61
+msgid "Input map: elevation on which entire analysis is based"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:62 ../raster/r.watershed/front/main.c:68
+#: ../raster/r.watershed/front/main.c:74 ../raster/r.watershed/front/main.c:83
+#: ../raster/r.watershed/front/main.c:90
+#: ../raster/r.watershed/front/main.c:151
+#: ../raster/r.watershed/front/main.c:159 ../raster/r.sun2/main.c:245
+#: ../raster/r.sun2/main.c:254 ../raster/r.sun2/main.c:263
+#: ../raster/r.sun2/main.c:272 ../raster/r.sun2/main.c:280
+#: ../raster/r.sun2/main.c:289 ../raster/r.sun2/main.c:299
+#: ../raster/r.sun2/main.c:309 ../raster/r.sun2/main.c:319
+#: ../raster/r.sun2/main.c:329 ../raster/r.sun2/main.c:338
+#: ../raster/r.sun2/main.c:347 ../raster/r.sun2/main.c:356
+#: ../raster/r.sun2/main.c:364 ../raster/r.sun2/main.c:372
+#: ../raster/r.horizon/main.c:226 ../raster/r.horizon/main.c:235
+#: ../raster/r.horizon/main.c:243 ../raster/r.horizon/main.c:251
+#: ../raster/r.horizon/main.c:259 ../raster/r.horizon/main.c:267
+#: ../raster/r.horizon/main.c:275 ../raster/r.horizon/main.c:283
+#: ../raster/r.horizon/main.c:291 ../raster/r.sun/main.c:207
+#: ../raster/r.sun/main.c:216 ../raster/r.sun/main.c:226
+#: ../raster/r.sun/main.c:235 ../raster/r.sun/main.c:243
+#: ../raster/r.sun/main.c:255 ../raster/r.sun/main.c:263
+#: ../raster/r.sun/main.c:275 ../raster/r.sun/main.c:282
+#: ../raster/r.sun/main.c:294 ../raster/r.sun/main.c:303
+msgid "Input_options"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:66
+msgid "Input map: locations of real depressions"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:72
+msgid "Input map: amount of overland flow per cell"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:79
+msgid "Input map or value: percent of disturbed land, for USLE"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:88
+msgid "Input map: terrain blocking overland surface flow, for USLE"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:95
+msgid "Output map: number of cells that drain through each cell"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:97
+#: ../raster/r.watershed/front/main.c:103
+#: ../raster/r.watershed/front/main.c:110
+#: ../raster/r.watershed/front/main.c:116
+#: ../raster/r.watershed/front/main.c:123
+#: ../raster/r.watershed/front/main.c:130
+#: ../raster/r.watershed/front/main.c:137
+#: ../raster/r.watershed/front/main.c:143 ../raster/r.sun2/main.c:381
+#: ../raster/r.sun2/main.c:390 ../raster/r.sun2/main.c:399
+#: ../raster/r.sun2/main.c:408 ../raster/r.sun2/main.c:417
+#: ../raster/r.sun2/main.c:426 ../raster/r.resamp.rst/main.c:183
+#: ../raster/r.resamp.rst/main.c:191 ../raster/r.resamp.rst/main.c:199
+#: ../raster/r.resamp.rst/main.c:207 ../raster/r.resamp.rst/main.c:215
+#: ../raster/r.resamp.rst/main.c:223 ../raster/r.resamp.rst/main.c:287
+#: ../raster/r.horizon/main.c:300 ../raster/r.horizon/main.c:310
+#: ../raster/r.horizon/main.c:318 ../raster/r.sun/main.c:312
+#: ../raster/r.sun/main.c:321 ../raster/r.sun/main.c:330
+#: ../raster/r.sun/main.c:339 ../raster/r.sun/main.c:348
+#: ../vector/v.vol.rst/main.c:362 ../vector/v.vol.rst/main.c:379
+#: ../vector/v.vol.rst/main.c:389 ../vector/v.vol.rst/main.c:398
+#: ../vector/v.vol.rst/main.c:407 ../vector/v.vol.rst/main.c:416
+#: ../vector/v.vol.rst/main.c:425
+msgid "Output_options"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:101
+msgid "Output map: drainage direction"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:108
+msgid "Output map: unique label for each watershed basin"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:114
+msgid "Output map: stream segments"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:121
+msgid "Output map: each half-basin is given a unique value"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:128
+msgid "Output map: useful for visual display of results"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:135
+msgid "Output map: slope length and steepness (LS) factor for USLE"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:141
+msgid "Output map: slope steepness (S) factor for USLE"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:148
+msgid "Input value: minimum size of exterior watershed basin"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:156
+msgid "Input value: maximum length of surface flow, for USLE"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:166
+msgid "Convergence factor for MFD (1-10)"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:168
+msgid "1 = most diverging flow, 10 = most converging flow. Recommended: 5"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:175
+msgid "Maximum memory to be used with -m flag (in MB)"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:179
+msgid "Enable MFD flow (default is SFD (D8))"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:181
+msgid "SFD: single flow direction, MFD: multiple flow direction"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:186
+msgid "Allow only horizontal and vertical flow of water"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:191
+msgid "Enable disk swap memory option: Operation is slow"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:193
+msgid ""
+"Only needed if memory requirements exceed available RAM; see manual on how "
+"to calculate memory requirements"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:198
+msgid "Use positive flow accumulation even for likely underestimates"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:200
+msgid "See manual for a detailed description of flow accumulation output"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:217
+msgid "Sorry, you must choose an output map."
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:233
+msgid ""
+"Sorry, if any of the following options are set:\n"
+"    basin, stream, half.basin, length.slope, or slope.steepness\n"
+"    you MUST provide a value for the basin threshold parameter."
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:388
+#, c-format
+msgid "Subprocess failed with exit code %d"
+msgstr ""
+
+#: ../raster/r.composite/main.c:72
+msgid "raster, composite"
+msgstr ""
+
+#: ../raster/r.composite/main.c:74
+msgid ""
+"Combines red, green and blue raster maps into a single composite raster map."
+msgstr ""
+
+#: ../raster/r.composite/main.c:88 ../raster/r.out.ppm3/main.c:65
+#, c-format
+msgid "Name of raster map to be used for <%s>"
+msgstr ""
+
+#: ../raster/r.composite/main.c:100
+msgid "Number of levels to be used for each component"
+msgstr ""
+
+#: ../raster/r.composite/main.c:101 ../raster/r.composite/main.c:119
+msgid "Levels"
+msgstr ""
+
+#: ../raster/r.composite/main.c:116
+#, c-format
+msgid "Number of levels to be used for <%s>"
+msgstr ""
+
+#: ../raster/r.composite/main.c:126
+msgid "Dither"
+msgstr ""
+
+#: ../raster/r.composite/main.c:130
+msgid "Use closest color"
+msgstr ""
+
+#: ../raster/r.composite/main.c:167 ../raster/r.lake/main.c:407
+#, c-format
+msgid "Unable to read color file of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.composite/main.c:210
+#, c-format
+msgid "Error reading raster map <%s>"
+msgstr ""
+
+#: ../raster/r.composite/main.c:258 ../doc/raster/r.example/main.c:181
+#, c-format
+msgid "Failed writing raster map <%s>"
+msgstr ""
+
+#: ../raster/r.composite/main.c:273 ../raster/r.in.gdal/main.c:1013
+#: ../raster/r.circle/dist.c:155 ../raster/r.recode/main.c:112
+#: ../raster/r.surf.fractal/main.c:39
+#, c-format
+msgid "Raster map <%s> created."
+msgstr ""
+
+#: ../raster/r.composite/main.c:297
+msgid "Creating color table for output raster map..."
+msgstr ""
+
+#: ../raster/r.coin/main.c:68
+msgid ""
+"Tabulates the mutual occurrence (coincidence) of categories for two raster "
+"map layers."
+msgstr ""
+
+#: ../raster/r.coin/main.c:76
+msgid "Name of first raster map"
+msgstr ""
+
+#: ../raster/r.coin/main.c:83
+msgid "Name of second raster map"
+msgstr ""
+
+#: ../raster/r.coin/main.c:89
+msgid "Unit of measure"
+msgstr ""
+
+#: ../raster/r.coin/main.c:91
+msgid ""
+"c(ells), p(ercent), x(percent of category [column]), y(percent of category "
+"[row]), a(cres), h(ectares), k(square kilometers), m(square miles)"
+msgstr ""
+
+#: ../raster/r.coin/main.c:98
+msgid "Wide report, 132 columns (default: 80)"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:34
+msgid "GIS Coincidence Tabulation Facility\n"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:35
+msgid ""
+"This utility will allow you to compare the coincidence of two map layers\n"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:52
+msgid "The report can be made in one of 8 units."
+msgstr ""
+
+#: ../raster/r.coin/inter.c:53
+msgid "Please choose a unit by entering one of the following letter codes:"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:55
+msgid "     'c': cells"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:56
+msgid "     'p': percent cover of region"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:57
+#, c-format
+msgid "     'x': percent of '%s' category (column)"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:58
+#, c-format
+msgid "     'y': percent of '%s' category (row)"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:59
+msgid "     'a': acres"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:60
+msgid "     'h': hectares"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:61
+msgid "     'k': square kilometers"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:62
+msgid "     'm': square miles\n"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:63
+msgid "     'Q': quit"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:95
+#, c-format
+msgid "Do you wish to save this report in a file? (y/n) [n] "
+msgstr ""
+
+#: ../raster/r.coin/inter.c:103
+#, c-format
+msgid ""
+"Enter the file name or path\n"
+"> "
+msgstr ""
+
+#: ../raster/r.coin/inter.c:108
+#, c-format
+msgid "'%s' being saved\n"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:117
+#, c-format
+msgid ""
+"Do you wish to print this report (requires Unix lpr command)? (y/n) [n] "
+msgstr ""
+
+#: ../raster/r.coin/inter.c:126
+#, c-format
+msgid ""
+"Do you wish it printed in 80 or 132 columns?\n"
+"> "
+msgstr ""
+
+#: ../raster/r.coin/inter.c:142
+#, c-format
+msgid ""
+"Do you wish to run this report with a different unit of measure? (y/n) [y] "
+msgstr ""
+
+#: ../raster/r.coin/print_coin.c:44
+#, c-format
+msgid "Preparing report ..."
+msgstr ""
+
+#: ../raster/r.coin/make_coin.c:44
+#, c-format
+msgid "Tabulating Coincidence between '%s' and '%s'"
+msgstr ""
+
+#: ../raster/r.coin/make_coin.c:54
+msgid "Unable to create any tempfiles"
+msgstr ""
+
+#: ../raster/r.coin/make_coin.c:58
+msgid "Unable to run r.stats"
+msgstr ""
+
+#: ../raster/r.coin/make_coin.c:67
+msgid "Unexpected output from r.stats"
+msgstr ""
+
+#: ../raster/r.coin/make_coin.c:78
+msgid "Unable to open tempfile"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:159
+msgid "raster, import, LIDAR"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:161
+msgid ""
+"Create a raster map from an assemblage of many coordinates using univariate "
+"statistics."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:165
+msgid "ASCII file containing input data (or \"-\" to read from stdin)"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:173
+msgid "Statistic to use for raster values"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:177 ../raster/r.in.xyz/main.c:243
+#: ../raster/r.in.xyz/main.c:252
+msgid "Statistic"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:188 ../raster/r.in.xyz/main.c:197
+#: ../raster/r.in.xyz/main.c:205 ../raster/r.in.xyz/main.c:213
+#: ../raster/simwe/r.sim.sediment/main.c:119
+#: ../raster/simwe/r.sim.sediment/main.c:124
+#: ../raster/simwe/r.sim.sediment/main.c:129
+#: ../raster/simwe/r.sim.sediment/main.c:134
+#: ../raster/simwe/r.sim.sediment/main.c:140
+#: ../raster/simwe/r.sim.sediment/main.c:146
+#: ../raster/simwe/r.sim.sediment/main.c:152
+#: ../raster/simwe/r.sim.sediment/main.c:158
+#: ../raster/simwe/r.sim.sediment/main.c:166
+#: ../raster/simwe/r.sim.water/main.c:126
+#: ../raster/simwe/r.sim.water/main.c:131
+#: ../raster/simwe/r.sim.water/main.c:136
+#: ../raster/simwe/r.sim.water/main.c:143
+#: ../raster/simwe/r.sim.water/main.c:152
+#: ../raster/simwe/r.sim.water/main.c:159
+#: ../raster/simwe/r.sim.water/main.c:168
+#: ../raster/simwe/r.sim.water/main.c:174
+#: ../raster/simwe/r.sim.water/main.c:182
+#: ../raster/simwe/r.sim.water/main.c:189 ../vector/v.out.ogr/main.c:108
+#: ../vector/v.out.ogr/main.c:128 ../vector/v.edit/args.c:103
+#: ../vector/v.edit/args.c:212
+msgid "Input"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:196
+msgid "Column number of x coordinates in input file (first column is 1)"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:204
+msgid "Column number of y coordinates in input file"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:212
+msgid "Column number of data values in input file"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:220
+msgid "Filter range for z data (min,max)"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:227
+msgid "Scale to apply to z data"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:242
+msgid "pth percentile of the values"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:251
+msgid ""
+"Discard <trim> percent of the smallest and <trim> percent of the largest "
+"observations"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:256
+msgid "Scan data file for extent then exit"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:261
+msgid "In scan mode, print using shell script style"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:265
+msgid "Ignore broken lines"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:291
+msgid "Please specify a reasonable column number."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:302
+msgid "Invalid zrange"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:389
+msgid "Unable to calculate percentile without the pth option specified!"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:401
+msgid "Unable to calculate trimmed mean without the trim option specified!"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:477
+msgid ""
+"If input is not from a file it is only possible to perform a single pass."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:483
+msgid "zrange will not be taken into account during scan"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:521
+msgid "Reading data ..."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:528 ../raster/r.in.poly/poly2rast.c:56
+#, c-format
+msgid "Pass #%d (of %d) ..."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:599 ../raster/r.in.xyz/main.c:607
+#: ../raster/r.in.xyz/main.c:1103 ../raster/r.in.xyz/main.c:1111
+#, c-format
+msgid ""
+"Not enough data columns. Incorrect delimiter or column number? Found the "
+"following character(s) in row %lu:\n"
+"[%s]"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:603 ../raster/r.in.xyz/main.c:1107
+msgid "Line ignored as requested"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:622 ../raster/r.in.xyz/main.c:1141
+#, c-format
+msgid "Bad y-coordinate line %lu column %d. <%s>"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:629 ../raster/r.in.xyz/main.c:1126
+#, c-format
+msgid "Bad x-coordinate line %lu column %d. <%s>"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:636 ../raster/r.in.xyz/main.c:1156
+#, c-format
+msgid "Bad z-coordinate line %lu column %d. <%s>"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:718
+msgid "Writing to map ..."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:1014
+#, c-format
+msgid "Writing map, row %d"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:1061
+#, c-format
+msgid "%lu points found in region."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:1088
+msgid "Scanning data ..."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:1176
+#, c-format
+msgid "Range:     min         max\n"
+msgstr ""
+
+#: ../raster/r.series/main.c:101 ../raster/r.resamp.stats/main.c:290
+#, c-format
+msgid "Unknown method <%s>"
+msgstr ""
+
+#: ../raster/r.series/main.c:133
+msgid "raster, series"
+msgstr ""
+
+#: ../raster/r.series/main.c:135
+msgid ""
+"Makes each output cell value a function of the values assigned to the "
+"corresponding cells in the input raster map layers."
+msgstr ""
+
+#: ../raster/r.series/main.c:149
+msgid "Aggregate operation"
+msgstr ""
+
+#: ../raster/r.series/main.c:156
+msgid "Quantile to calculate for method=quantile"
+msgstr ""
+
+#: ../raster/r.series/main.c:164
+msgid "Threshold to calculate for method=threshold"
+msgstr ""
+
+#: ../raster/r.series/main.c:176
+msgid "Ignore values outside this range"
+msgstr ""
+
+#: ../raster/r.series/main.c:180 ../raster/r.resamp.stats/main.c:277
+msgid "Propagate NULLs"
+msgstr ""
+
+#: ../raster/r.series/main.c:202 ../imagery/i.group/main.c:102
+msgid "No input raster map(s) specified"
+msgstr ""
+
+#: ../raster/r.series/main.c:217 ../raster/r.neighbors/main.c:216
+#: ../ps/ps.map/outl_io.c:72
+#, c-format
+msgid "Unable to open raster map <%s> in mapset <%s>"
+msgstr ""
+
+#: ../raster/r.series/main.c:228
+msgid "output= and method= must have the same number of values"
+msgstr ""
+
+#: ../raster/r.series/main.c:261 ../raster/r.slope.aspect/main.c:568
+#: ../raster/r.patch/main.c:152
+msgid "Percent complete..."
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:148 ../raster/r.circle/dist.c:51
+#: ../raster/r.grow2/main.c:128 ../raster/r.digit/main.c:45
+#: ../raster/r.patch/main.c:53
+msgid "raster, geometry"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:150
+msgid "Generates a raster map layer of distance to features in input layer."
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:157
+msgid "Name for distance output map"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:162
+msgid "Name for value output map"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:168 ../raster/r.grow2/main.c:148
+msgid "Metric"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:174
+msgid "Output distances in meters instead of map units"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:184
+msgid "At least one of distance= and value= must be given"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:199
+msgid "metric=geodesic is only valid for lat/lon"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:205 ../raster/r.grow2/main.c:199
+#, c-format
+msgid "Unknown metric: [%s]."
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:220
+#, c-format
+msgid "Unable to create distance map <%s>"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:226
+#, c-format
+msgid "Unable to create value map <%s>"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:232
+#, c-format
+msgid "Unable to create temporary file <%s>"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:307
+msgid "Writing output raster maps..."
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:364 ../raster/r.colors/main.c:390
+#: ../raster/r.colors.out/main.c:91
+#, c-format
+msgid "Unable to read color table for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.out.ppm3/main.c:59
+msgid ""
+"Converts 3 GRASS raster layers (R,G,B) to a PPM image file at the pixel "
+"resolution of the CURRENTLY DEFINED REGION."
+msgstr ""
+
+#: ../raster/r.out.ppm3/main.c:85
+msgid "Name for new PPM file. (use out=- for stdout)"
+msgstr ""
+
+#: ../raster/r.out.ppm3/main.c:94
+msgid "Add comments to describe the region"
+msgstr ""
+
+#: ../raster/r.out.ppm3/main.c:109 ../raster/r.out.ppm/main.c:110
+#, c-format
+msgid "rows = %d, cols = %d"
+msgstr ""
+
+#: ../raster/r.out.ppm3/main.c:131 ../raster/r.his/main.c:142
+#: ../raster/r.his/main.c:161 ../raster/r.his/main.c:186
+#: ../display/d.legend/main.c:250 ../display/d.rgb/main.c:105
+#: ../display/d.histogram/main.c:165 ../display/d.rast.num/number.c:278
+#: ../display/d.rast.edit/cell.c:51 ../display/d.his/main.c:152
+#: ../display/d.his/main.c:171 ../display/d.his/main.c:196
+#: ../display/d.rast/display.c:21
+#, c-format
+msgid "Color file for <%s> not available"
+msgstr ""
+
+#: ../raster/r.out.ppm3/main.c:176
+msgid "Converting ... "
+msgstr ""
+
+#: ../raster/r.null/null.c:58
+msgid "raster, null data"
+msgstr ""
+
+#: ../raster/r.null/null.c:59
+msgid "Manages NULL-values of given raster map."
+msgstr ""
+
+#: ../raster/r.null/null.c:62
+msgid "Name of raster map for which to edit null file"
+msgstr ""
+
+#: ../raster/r.null/null.c:70 ../raster3d/base/r3.null.main.c:66
+msgid "List of cell values to be set to NULL"
+msgstr ""
+
+#: ../raster/r.null/null.c:71 ../raster/r.null/null.c:79
+#: ../general/g.proj/main.c:190
+msgid "Modify"
+msgstr ""
+
+#: ../raster/r.null/null.c:78 ../raster3d/base/r3.null.main.c:73
+msgid "The value to replace the null value by"
+msgstr ""
+
+#: ../raster/r.null/null.c:83
+msgid "Only do the work if the map is floating-point"
+msgstr ""
+
+#: ../raster/r.null/null.c:84 ../raster/r.null/null.c:89
+#: ../raster/r.null/null.c:95
+msgid "Check"
+msgstr ""
+
+#: ../raster/r.null/null.c:88
+msgid "Only do the work if the map is integer"
+msgstr ""
+
+#: ../raster/r.null/null.c:94
+msgid "Only do the work if the map doesn't have a NULL-value bitmap file"
+msgstr ""
+
+#: ../raster/r.null/null.c:100
+msgid "Create NULL-value bitmap file validating all data cells"
+msgstr ""
+
+#: ../raster/r.null/null.c:104
+msgid "Remove NULL-value bitmap file"
+msgstr ""
+
+#: ../raster/r.null/null.c:105
+#: ../locale/scriptstrings/r.mask_to_translate.c:11
+msgid "Remove"
+msgstr ""
+
+#: ../raster/r.null/null.c:123
+#, c-format
+msgid ""
+"Raster map <%s> is a reclass of map <%s@%s>. Consider to generate a copy "
+"with r.mapcalc. Exiting."
+msgstr ""
+
+#: ../raster/r.null/null.c:129
+#, c-format
+msgid "Raster map <%s> is not in your mapset <%s>"
+msgstr ""
+
+#: ../raster/r.null/null.c:136
+#, c-format
+msgid "%s is illegal entry for null"
+msgstr ""
+
+#: ../raster/r.null/null.c:143
+#, c-format
+msgid "Raster map <%s> already has a null bitmap file"
+msgstr ""
+
+#: ../raster/r.null/null.c:147
+#, c-format
+msgid "<%s> is integer raster map (CELL)"
+msgstr ""
+
+#: ../raster/r.null/null.c:151
+#, c-format
+msgid "<%s> is integer raster map (CELL). Using null=%d."
+msgstr ""
+
+#: ../raster/r.null/null.c:157
+#, c-format
+msgid "<%s> is floating pointing raster map"
+msgstr ""
+
+#: ../raster/r.null/null.c:163 ../raster/r.topidx/file_io.c:21
+#: ../raster/r.texture/main.c:240 ../raster/r.out.tiff/r.out.tiff.c:169
+#: ../raster/r.bitpattern/main.c:114 ../imagery/i.rectify/main.c:294
+#: ../imagery/i.rectify/main.c:300 ../imagery/i.landsat.toar/main.c:328
+#: ../imagery/i.landsat.toar/main.c:468
+#, c-format
+msgid "Unable to read header of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.null/null.c:175
+#, c-format
+msgid "Writing new null file for raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.null/null.c:182
+#, c-format
+msgid "Error writing null row %d"
+msgstr ""
+
+#: ../raster/r.null/null.c:187 ../raster/r.null/null.c:200
+#, c-format
+msgid "Raster map <%s> modified."
+msgstr ""
+
+#: ../raster/r.null/null.c:194
+#, c-format
+msgid "Removing null file for raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.null/null.c:264
+#, c-format
+msgid "%s: %s: illegal value spec"
+msgstr ""
+
+#: ../raster/r.null/null.c:266 ../raster3d/base/mask_functions.c:100
+#, c-format
+msgid "%s: illegal value spec"
+msgstr ""
+
+#: ../raster/r.null/null.c:333
+#, c-format
+msgid "Writing new data for raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.null/null.c:348 ../raster/r.buffer/write_map.c:78
+#: ../raster/r.texture/main.c:356 ../raster/r.texture/main.c:360
+#: ../raster/r.texture/main.c:367 ../raster/r.proj/main.c:445
+#: ../raster/r.proj.seg/main.c:513 ../raster/r.los/main.c:380
+#: ../imagery/i.landsat.acca/tools.c:291
+#: ../imagery/i.landsat.acca/algorithm.c:362
+#, c-format
+msgid "Failed writing raster map <%s> row %d"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:115 ../raster/r.horizon/main.c:177
+msgid "raster, sun position"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:116
+msgid ""
+"Calculates cast shadow areas from sun position and elevation raster map."
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:117
+msgid ""
+"Either exact sun position (A) is specified, or date/time to calculate the "
+"sun position (B) by r.sunmask itself."
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:131
+msgid "Altitude of the sun above horizon, degrees (A)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:132 ../raster/r.sunmask/main.c:141
+#: ../raster/r.sunmask/main.c:208 ../raster/r.sunmask/main.c:218
+msgid "Position"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:140
+msgid "Azimuth of the sun from the north, degrees (A)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:147
+msgid "Year (B)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:149 ../raster/r.sunmask/main.c:157
+#: ../raster/r.sunmask/main.c:165 ../raster/r.sunmask/main.c:173
+#: ../raster/r.sunmask/main.c:181 ../raster/r.sunmask/main.c:189
+#: ../raster/r.sunmask/main.c:198
+msgid "Time"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:155
+msgid "Month (B)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:163
+msgid "Day (B)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:171
+msgid "Hour (B)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:179
+msgid "Minutes (B)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:187
+msgid "Seconds (B)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:196
+msgid "Timezone"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:197
+msgid "East positive, offset from GMT, also use to adjust daylight savings"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:206
+msgid "Easting coordinate (point of interest)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:207 ../raster/r.sunmask/main.c:217
+msgid "Default: map center"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:216
+msgid "Northing coordinate (point of interest)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:222
+msgid "Don't ignore zero elevation"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:227
+msgid "Verbose output (also print out sun position etc.)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:231
+msgid "Calculate sun position only and exit"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:232 ../raster/r.sunmask/main.c:238
+#: ../raster/r.stats/main.c:147 ../raster/r.stats/main.c:152
+#: ../raster/r.stats/main.c:157 ../raster/r.stats/main.c:163
+#: ../raster/r.stats/main.c:168 ../raster/r.stats/main.c:173
+#: ../raster/r.stats/main.c:178 ../raster/r.stats/main.c:183
+#: ../raster/r.out.gdal/main.c:133 ../raster/r.in.gdal/main.c:145
+#: ../raster/r.external/main.c:571 ../general/g.proj/main.c:77
+#: ../general/g.proj/main.c:83 ../general/g.proj/main.c:89
+#: ../general/g.proj/main.c:95 ../general/g.proj/main.c:101
+#: ../general/g.proj/main.c:112 ../general/g.proj/main.c:117
+#: ../general/g.mlist/main.c:140 ../general/g.mlist/main.c:145
+#: ../general/g.mlist/main.c:150 ../general/g.mlist/main.c:155
+#: ../general/g.mapsets/main.c:98 ../general/g.mapsets/main.c:103
+#: ../general/g.mapset/main.c:87 ../general/g.region/main.c:92
+#: ../general/g.region/main.c:98 ../general/g.region/main.c:103
+#: ../general/g.region/main.c:109 ../general/g.region/main.c:115
+#: ../general/g.region/main.c:121 ../general/g.region/main.c:127
+#: ../general/g.region/main.c:135 ../general/g.region/main.c:140
+#: ../general/g.region/main.c:146 ../general/g.region/main.c:151
+#: ../db/base/connect.c:52
+#: ../locale/scriptstrings/g.extension_to_translate.c:9
+#: ../imagery/i.group/main.c:77 ../imagery/i.group/main.c:83
+#: ../vector/v.info/main.c:75 ../vector/v.info/main.c:81
+#: ../vector/v.info/main.c:86 ../vector/v.info/main.c:91
+#: ../vector/v.info/main.c:96 ../vector/v.to.db/parse.c:104
+#: ../vector/v.to.db/parse.c:109 ../vector/v.to.db/parse.c:115
+#: ../vector/v.db.connect/main.c:81 ../vector/v.db.connect/main.c:86
+#: ../vector/v.db.connect/main.c:94 ../vector/v.db.connect/main.c:110
+msgid "Print"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:237
+msgid "Print the sun position output in shell script style"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:251
+#, c-format
+msgid "Using map center coordinates: %f %f"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:258
+msgid "Empty east coordinate specified"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:260
+msgid "Empty north coordinate specified"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:279
+msgid "Either define sun position or location/date/time parameters"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:282
+msgid ""
+"Neither sun position nor east/north, date/time/timezone definition are "
+"complete"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:286
+#, c-format
+msgid "Calculating sun position... (using solpos (V. %s) from NREL)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:291
+msgid ""
+"Using user defined sun azimuth, altitude settings (ignoring eventual other "
+"values)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:397
+msgid "Please correct settings"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:411
+#, c-format
+msgid "Time (%02i:%02i:%02i) is before sunrise (%02d:%02d:%02d)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:415
+#, c-format
+msgid "Time (%02i:%02i:%02i) is before sunrise"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:418 ../raster/r.sunmask/main.c:428
+msgid "Nothing to calculate. Please verify settings."
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:422
+#, c-format
+msgid "Time (%02i:%02i:%02i) is after sunset (%02d:%02d:%02d)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:426
+#, c-format
+msgid "Time (%02i:%02i:%02i) is after sunset"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:437
+msgid "You already know the sun position"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:442
+#, c-format
+msgid "Option <%s> required"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:459
+#, c-format
+msgid "Unable to open range file for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:475
+msgid "Calculating shadows from DEM..."
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:66
+msgid ""
+"Unable to calculate sun position in un-projected locations. Specify "
+"sunposition directly."
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:88
+#, c-format
+msgid ""
+"Specified point %f, %f outside of current region, is that intended? Anyway, "
+"it will be used."
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:98
+msgid "Unable to get projection info of current location"
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:101
+msgid "Unable to get projection units of current location"
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:104
+msgid "Unable to get projection key values of current location"
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:127 ../raster/r.proj.seg/main.c:353
+#: ../raster/r.proj.seg/main.c:355 ../general/g.region/printwindow.c:281
+#: ../general/g.region/printwindow.c:289 ../general/g.region/printwindow.c:297
+#: ../general/g.region/printwindow.c:305 ../general/g.region/printwindow.c:534
+#: ../general/g.region/printwindow.c:542 ../general/g.region/printwindow.c:550
+#: ../general/g.region/printwindow.c:558 ../general/g.region/printwindow.c:676
+#: ../general/g.region/printwindow.c:684 ../general/g.region/printwindow.c:692
+#: ../general/g.region/printwindow.c:700
+msgid "Error in pj_do_proj (projection of input coordinate pair)"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:949
+#, c-format
+msgid "S_decode ==> Please fix the year: %d [1950-2050]"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:952
+#, c-format
+msgid "S_decode ==> Please fix the month: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:954
+#, c-format
+msgid "S_decode ==> Please fix the day-of-month: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:957
+#, c-format
+msgid "S_decode ==> Please fix the day-of-year: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:960
+#, c-format
+msgid "S_decode ==> Please fix the hour: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:962
+#, c-format
+msgid "S_decode ==> Please fix the minute: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:964
+#, c-format
+msgid "S_decode ==> Please fix the second: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:966
+#, c-format
+msgid "S_decode ==> Please fix the time zone: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:969
+#, c-format
+msgid "S_decode ==> Please fix the interval: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:972
+#, c-format
+msgid "S_decode ==> Please fix the latitude: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:975
+#, c-format
+msgid "S_decode ==> Please fix the longitude: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:978
+#, c-format
+msgid "S_decode ==> Please fix the temperature: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:981
+#, c-format
+msgid "S_decode ==> Please fix the pressure: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:983
+#, c-format
+msgid "S_decode ==> Please fix the tilt: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:985
+#, c-format
+msgid "S_decode ==> Please fix the aspect: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:987
+#, c-format
+msgid "S_decode ==> Please fix the shadowband width: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:990
+#, c-format
+msgid "S_decode ==> Please fix the shadowband radius: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:993
+#, c-format
+msgid "S_decode ==> Please fix the shadowband sky factor: %f"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:212 ../raster/wildfire/r.spread/main.c:101
+#: ../raster/wildfire/r.spreadpath/main.c:72
+msgid "raster, fire"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:214
+msgid ""
+"Generates three, or four raster map layers showing 1) the base "
+"(perpendicular) rate of spread (ROS), 2) the maximum (forward) ROS, 3) the "
+"direction of the maximum ROS, and optionally 4) the maximum potential "
+"spotting distance."
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:224
+msgid "Name of raster map containing fuel MODELs"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:231
+msgid "Name of raster map containing the 1-HOUR fuel MOISTURE (%)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:238
+msgid "Name of raster map containing the 10-HOUR fuel MOISTURE (%)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:245
+msgid "Name of raster map containing the 100-HOUR fuel MOISTURE (%)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:253
+msgid "Name of raster map containing LIVE fuel MOISTURE (%)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:260
+msgid "Name of raster map containing midflame wind VELOCITYs (ft/min)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:267
+msgid "Name of raster map containing wind DIRECTIONs (degree)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:274
+msgid "Name of raster map containing SLOPE (degree)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:281
+msgid "Name of raster map containing ASPECT (degree, anti-clockwise from E)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:288
+msgid "Name of raster map containing ELEVATION (m) (required w/ -s)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:296
+msgid "Name of raster map to contain results (several new layers)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:305
+msgid "Also produce maximum SPOTTING distance"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:424 ../raster/wildfire/r.ros/main.c:428
+#: ../raster/wildfire/r.ros/main.c:432 ../raster/wildfire/r.ros/main.c:439
+#: ../raster/wildfire/r.spread/main.c:384
+#: ../raster/wildfire/r.spread/main.c:393
+#: ../raster/wildfire/r.spread/main.c:403
+#, c-format
+msgid "Raster map <%s> already exists in mapset <%s>, select another name"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:640
+msgid "Percent Completed ... "
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:103
+msgid ""
+"Simulates elliptically anisotropic spread on a graphics window and generates "
+"a raster map of the cumulative time of spread, given raster maps containing "
+"the rates of spread (ROS), the ROS directions and the spread origins."
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:108
+msgid ""
+"It optionally produces raster maps to contain backlink UTM coordinates for "
+"tracing spread paths."
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:116
+#: ../raster/wildfire/r.spread/main.c:125
+#: ../raster/wildfire/r.spread/main.c:134
+#: ../raster/wildfire/r.spread/main.c:143
+#: ../raster/wildfire/r.spread/main.c:151
+#: ../raster/wildfire/r.spread/main.c:159
+#: ../raster/wildfire/r.spread/main.c:167
+msgid "Input_maps"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:118
+msgid "Name of raster map containing MAX rate of spread (ROS) (cm/min)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:127
+msgid "Name of raster map containing DIRections of max ROS (degree)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:136
+msgid "Name of raster map containing BASE ROS (cm/min)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:145
+msgid "Name of raster map containing STARTing sources"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:153
+msgid ""
+"Name of raster map containing max SPOTting DISTance (m) (required w/ -s)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:161
+msgid ""
+"Name of raster map containing midflame Wind SPEED (ft/min) (required w/ -s)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:169
+msgid ""
+"Name of raster map containing fine Fuel MOISture of the cell receiving a "
+"spotting firebrand (%) (required w/ -s)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:177
+msgid "Basic sampling window SIZE needed to meet certain accuracy (3)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:184
+msgid "Sampling DENSity for additional COMPutin (range: 0.0 - 1.0 (0.5))"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:191
+msgid "INITial TIME for current simulation (0) (min)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:198
+msgid "Simulating time duration LAG (fill the region) (min)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:205
+msgid "Name of raster map as a display backdrop"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:212
+#: ../raster/wildfire/r.spread/main.c:220
+#: ../raster/wildfire/r.spread/main.c:228
+msgid "Output_maps"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:214
+msgid "Name of raster map to contain OUTPUT spread time (min)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:222
+msgid "Name of raster map to contain X_BACK coordinates"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:230
+msgid "Name of raster map to contain Y_BACK coordinates"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:235
+msgid "Run VERBOSELY"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:239
+msgid "DISPLAY 'live' spread process on screen"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:243
+msgid "For wildfires: consider SPOTTING effect"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:463
+msgid "Reading inputs..."
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:514 ../raster/r.sum/main.c:74
+#: ../raster/r.walk/main.c:722 ../raster/r.walk/main.c:784
+#, c-format
+msgid "Reading %s..."
+msgstr ""
+
+#: ../raster/wildfire/r.spreadpath/main.c:74
+msgid ""
+"Recursively traces the least cost path backwards to cells from which the "
+"cumulative cost was determined."
+msgstr ""
+
+#: ../raster/wildfire/r.spreadpath/main.c:83
+msgid "Name of raster map containing back-path easting information"
+msgstr ""
+
+#: ../raster/wildfire/r.spreadpath/main.c:91
+msgid "Name of raster map containing back-path northing information"
+msgstr ""
+
+#: ../raster/wildfire/r.spreadpath/main.c:99
+msgid "The map E and N grid coordinates of starting points"
+msgstr ""
+
+#: ../raster/wildfire/r.spreadpath/main.c:106
+msgid "Name of spread path raster map"
+msgstr ""
+
+#: ../raster/r.in.gridatb/main.c:43
+msgid "Imports GRIDATB.FOR map file (TOPMODEL) into GRASS raster map"
+msgstr ""
+
+#: ../raster/r.in.gridatb/main.c:47 ../raster/r.out.gridatb/main.c:57
+msgid "GRIDATB i/o map file"
+msgstr ""
+
+#: ../raster/r.in.gridatb/main.c:53
+#: ../locale/scriptstrings/i.in.spotvgt_to_translate.c:5
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:9
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:18
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:6
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:4
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:4
+#: ../imagery/i.ifft/ifftmain.c:83
+msgid "Name for output raster map"
+msgstr ""
+
+#: ../raster/r.in.gridatb/main.c:67
+#, c-format
+msgid "File not found: %s"
+msgstr ""
+
+#: ../raster/r.in.gridatb/file_io.c:33
+msgid "Setting window header failed"
+msgstr ""
+
+#: ../raster/r.in.gridatb/file_io.c:36 ../raster/r.out.gridatb/file_io.c:41
+msgid "Rows changed"
+msgstr ""
+
+#: ../raster/r.in.gridatb/file_io.c:39 ../raster/r.out.gridatb/file_io.c:44
+msgid "Cols changed"
+msgstr ""
+
+#: ../raster/r.in.poly/poly2rast.c:36
+#, c-format
+msgid "Can't create raster map <%s>"
+msgstr ""
+
+#: ../raster/r.in.poly/poly2rast.c:78 ../raster/r.carve/raster.c:32
+#: ../vector/v.to.rast/vect2rast.c:182
+msgid "Writing raster map..."
+msgstr ""
+
+#: ../raster/r.in.poly/main.c:31
+msgid "Creates raster maps from ASCII polygon/line/point data files."
+msgstr ""
+
+#: ../raster/r.in.poly/main.c:35
+msgid "Name of input file; or \"-\" to read from stdin"
+msgstr ""
+
+#: ../raster/r.in.poly/main.c:50 ../vector/v.to.rast/main.c:100
+msgid "Number of rows to hold in memory"
+msgstr ""
+
+#: ../raster/r.in.poly/main.c:59
+msgid "Minimum number of rows to hold in memory is 1"
+msgstr ""
+
+#: ../raster/r.in.poly/get_item.c:75
+#, c-format
+msgid "Illegal coordinate <%s, %s>, skipping."
+msgstr ""
+
+#: ../raster/r.in.poly/get_item.c:80
+#, c-format
+msgid "Illegal north coordinate <%s>, skipping."
+msgstr ""
+
+#: ../raster/r.in.poly/get_item.c:85
+#, c-format
+msgid "Illegal east coordinate <%s>, skipping."
+msgstr ""
+
+#: ../raster/r.what.color/main.c:88 ../raster/r.what/main.c:91
+msgid "raster, querying"
+msgstr ""
+
+#: ../raster/r.what.color/main.c:89
+msgid "Queries colors for a raster map layer."
+msgstr ""
+
+#: ../raster/r.what.color/main.c:97
+msgid "Name of existing raster map to query colors"
+msgstr ""
+
+#: ../raster/r.what.color/main.c:104
+msgid "Values to query colors for"
+msgstr ""
+
+#: ../raster/r.what.color/main.c:111
+msgid "Output format (printf-style)"
+msgstr ""
+
+#: ../raster/r.what.color/main.c:115
+msgid "Read values from stdin"
+msgstr ""
+
+#: ../raster/r.what.color/main.c:121
+msgid "Either \"-i\" or \"value=\" must be given"
+msgstr ""
+
+#: ../raster/r.support.stats/main.c:38
+msgid "Update raster map statistics"
+msgstr ""
+
+#: ../raster/r.support.stats/main.c:53
+#, c-format
+msgid "Statistics for <%s> updated"
+msgstr ""
+
+#: ../raster/r.support.stats/check.c:42
+#, c-format
+msgid "Updating statistics for [%s]..."
+msgstr ""
+
+#: ../raster/r.support.stats/check.c:55
+msgid "Updating histogram range..."
+msgstr ""
+
+#: ../raster/r.support.stats/check.c:87
+#, c-format
+msgid "Updating the number of categories for [%s]..."
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:62
+msgid "Converts a raster map layer into an ESRI ARCGRID file."
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:69
+msgid "Name for output ARC-GRID map (use out=- for stdout)"
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:76
+msgid "Number of decimal places"
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:80 ../raster/r.out.ascii/main.c:104
+#: ../raster3d/r3.out.ascii/main.c:103
+msgid "Suppress printing of header information"
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:86
+msgid "List one entry per line instead of full row"
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:92
+msgid "Use cell center reference in header instead of cell corner"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:42
+#, c-format
+msgid "Enter rules, \"end\" when done, \"help\" if you need it.\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:51
+#, c-format
+msgid "fp: Data range is %s to %s\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:55 ../raster/r.reclass/main.c:113
+#, c-format
+msgid "Data range is %ld to %ld\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:66
+#, c-format
+msgid ""
+"Your color rules do not cover the whole range of data!\n"
+" (rules %f to %f but data %f to %f)"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:106 ../raster/r.reclass/parse.c:40
+#, c-format
+msgid "Enter a rule in one of these formats:\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:107
+#, c-format
+msgid " val color\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:108
+#, c-format
+msgid " n%% color\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:109
+#, c-format
+msgid " nv color\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:110
+#, c-format
+msgid " default color\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:111
+#, c-format
+msgid "color can be one of:\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:113
+#, c-format
+msgid "or an R:G:B triplet, e.g.: 0:127:255\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:134
+#, c-format
+msgid "bad rule (%s); rule not added"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:136
+#, c-format
+msgid "bad rule (%s): [%s]"
+msgstr ""
+
+#: ../raster/r.colors/stats.c:79
+msgid "Unable to use logarithmic scaling if range includes zero"
+msgstr ""
+
+#: ../raster/r.colors/main.c:175
+#: ../locale/scriptstrings/r.colors.stddev_to_translate.c:2
+msgid "raster, color table"
+msgstr ""
+
+#: ../raster/r.colors/main.c:177
+msgid "Creates/modifies the color table associated with a raster map layer."
+msgstr ""
+
+#: ../raster/r.colors/main.c:181 ../raster/r.out.gdal/main.c:148
+#: ../raster/r.out.gdal/main.c:184 ../raster/r.in.gdal/main.c:90
+#: ../raster/r.in.gdal/main.c:94 ../raster/r.external/main.c:527
+#: ../raster/r.external/main.c:537 ../raster/r.recode/main.c:54
+#: ../display/d.rast.num/number.c:91 ../ps/ps.map/main.c:140
+#: ../vector/v.in.ascii/in.c:57 ../vector/v.select/args.c:50
+#: ../vector/v.in.ogr/main.c:119 ../vector/v.in.ogr/main.c:123
+msgid "Required"
+msgstr ""
+
+#: ../raster/r.colors/main.c:191
+#: ../locale/scriptstrings/v.colors_to_translate.c:9
+msgid "Type of color table"
+msgstr ""
+
+#: ../raster/r.colors/main.c:193 ../raster/r.colors/main.c:207
+#: ../raster/r.colors/main.c:225 ../raster/r.colors/main.c:230
+#: ../raster/r.colors/main.c:235 ../raster/r.colors/main.c:240
+#: ../locale/scriptstrings/v.colors_to_translate.c:7
+#: ../locale/scriptstrings/v.colors_to_translate.c:10
+#: ../locale/scriptstrings/v.colors_to_translate.c:12
+#: ../locale/scriptstrings/v.colors_to_translate.c:14
+#: ../locale/scriptstrings/v.colors_to_translate.c:17
+#: ../display/d.vect/main.c:123 ../display/d.vect/main.c:133
+#: ../display/d.vect/main.c:140 ../display/d.vect/main.c:151
+#: ../display/d.vect/main.c:319 ../display/d.vect/main.c:325
+#: ../display/d.vect/main.c:345 ../display/d.rast.num/number.c:101
+#: ../display/d.rast.num/number.c:111 ../display/d.rast.num/number.c:125
+#: ../vector/v.label/main.c:153 ../vector/v.label/main.c:177
+#: ../vector/v.label/main.c:190 ../vector/v.label/main.c:196
+#: ../vector/v.label/main.c:206 ../vector/v.label.sa/main.c:149
+#: ../vector/v.label.sa/main.c:159 ../vector/v.label.sa/main.c:166
+#: ../vector/v.label.sa/main.c:176 ../vector/v.label.sa/main.c:186
+#: ../vector/v.label.sa/main.c:196 ../vector/v.label.sa/main.c:203
+msgid "Colors"
+msgstr ""
+
+#: ../raster/r.colors/main.c:201
+#: ../locale/scriptstrings/v.colors_to_translate.c:11
+msgid "Raster map name from which to copy color table"
+msgstr ""
+
+#: ../raster/r.colors/main.c:206
+msgid "Path to rules file (\"-\" to read rules from stdin)"
+msgstr ""
+
+#: ../raster/r.colors/main.c:211
+msgid "Remove existing color table"
+msgstr ""
+
+#: ../raster/r.colors/main.c:216
+msgid "Only write new color table if one doesn't already exist"
+msgstr ""
+
+#: ../raster/r.colors/main.c:220
+msgid "List available rules then exit"
+msgstr ""
+
+#: ../raster/r.colors/main.c:224
+#: ../locale/scriptstrings/v.colors_to_translate.c:16
+msgid "Invert colors"
+msgstr ""
+
+#: ../raster/r.colors/main.c:229
+msgid "Logarithmic scaling"
+msgstr ""
+
+#: ../raster/r.colors/main.c:234
+msgid "Logarithmic-absolute scaling"
+msgstr ""
+
+#: ../raster/r.colors/main.c:239
+msgid "Histogram equalization"
+msgstr ""
+
+#: ../raster/r.colors/main.c:244
+msgid "Enter rules interactively"
+msgstr ""
+
+#: ../raster/r.colors/main.c:278
+msgid "No raster map specified"
+msgstr ""
+
+#: ../raster/r.colors/main.c:281
+msgid ""
+"One of \"-i\" or \"-r\" or options \"color\", \"rast\" or \"rules\" must be "
+"specified!"
+msgstr ""
+
+#: ../raster/r.colors/main.c:284
+msgid ""
+"Interactive mode is incompatible with \"color\", \"rules\", and \"raster\" "
+"options"
+msgstr ""
+
+#: ../raster/r.colors/main.c:291
+msgid "\"color\", \"rules\", and \"raster\" options are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.colors/main.c:302
+msgid "-g and -a flags are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.colors/main.c:312
+#, c-format
+msgid "Unable to remove color table of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.colors/main.c:314
+#, c-format
+msgid "Color table of raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.colors/main.c:324
+msgid "Color table exists. Exiting."
+msgstr ""
+
+#: ../raster/r.colors/main.c:344
+msgid "Color table 'random' is not supported for floating point raster map"
+msgstr ""
+
+#: ../raster/r.colors/main.c:349
+msgid "Color table 'grey.eq' is not supported for floating point raster map"
+msgstr ""
+
+#: ../raster/r.colors/main.c:356
+msgid "Color table 'grey.log' is not supported for floating point raster map"
+msgstr ""
+
+#: ../raster/r.colors/main.c:369
+#, c-format
+msgid "Unknown color request '%s'"
+msgstr ""
+
+#: ../raster/r.colors/main.c:380
+#, c-format
+msgid "Unable to load rules file <%s>"
+msgstr ""
+
+#: ../raster/r.colors/main.c:427
+#, c-format
+msgid "Color table for raster map <%s> set to '%s'"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:68
+msgid "raster, import, conversion"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:70
+msgid "Converts ASCII raster file to binary raster map layer."
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:74
+msgid ""
+"ASCII raster file to be imported. If not given reads from standard input"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:100
+msgid "String representing NULL value data cell"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:104
+msgid "Integer values are imported"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:108
+msgid "Floating point values are imported"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:112
+msgid "Double floating point values are imported"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:117
+msgid "SURFER (Golden Software) ASCII file will be imported"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:135
+#, c-format
+msgid "Wrong entry for multiplier: %s"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:158
+msgid "Unable to read input from stdin"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:165
+#, c-format
+msgid "Unable to read input from <%s>"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:285
+msgid "Unable to write to file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:34
+msgid "input file is not a Surfer ascii grid file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:40
+msgid "error reading the column and row dimension from the Surfer grid file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:46
+msgid "error reading the X range from the Surfer grid file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:52
+msgid "error reading the Y range from the Surfer grid file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:58
+msgid "error reading the Z range from the Surfer grid file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:105
+msgid "error getting file position"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:164
+msgid "illegal type field: using type int"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:169
+msgid "ignoring type filed in header, type is set on command line"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:176
+msgid "illegal multiplier field: using 1.0"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:181
+msgid "ignoring multiplier filed in header, multiplier is set on command line"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:189
+msgid "ignoring null filed in header, null string is set on command line"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:218
+msgid "error in ascii data format"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:256
+#, c-format
+msgid "Illegal \"%s\" value in header: %s"
+msgstr ""
+
+#: ../raster/r.out.ppm/main.c:56
+msgid ""
+"Converts a GRASS raster map to a PPM image file at the pixel resolution of "
+"the currently defined region."
+msgstr ""
+
+#: ../raster/r.out.ppm/main.c:64
+msgid "Name for new PPM file (use '-' for stdout)"
+msgstr ""
+
+#: ../raster/r.out.ppm/main.c:73
+msgid "Output greyscale instead of color"
+msgstr ""
+
+#: ../raster/r.out.ppm/main.c:138
+#, c-format
+msgid "Unable to open file <%s> for write"
+msgstr ""
+
+#: ../raster/r.out.ppm/main.c:167
+msgid "Converting..."
+msgstr ""
+
+#: ../raster/r.out.ppm/main.c:250
+#, c-format
+msgid "File <%s> created"
+msgstr ""
+
+#: ../raster/r.random.cells/random.c:51
+#, c-format
+msgid "RAN1: j == %d shouldn't happen"
+msgstr ""
+
+#: ../raster/r.random.cells/main.c:35
+msgid "raster, random, cell"
+msgstr ""
+
+#: ../raster/r.random.cells/main.c:37
+msgid "Generates random cell values with spatial dependence."
+msgstr ""
+
+#: ../raster/r.random.cells/init.c:34
+msgid "Maximum distance of spatial correlation (value(s) >= 0.0)"
+msgstr ""
+
+#: ../raster/r.random.cells/init.c:41
+msgid "Random seed (SEED_MIN >= value >= SEED_MAX) (default [random])"
+msgstr ""
+
+#: ../raster/r.random.cells/init.c:96
+msgid "Distance must be >= 0.0"
+msgstr ""
+
+#: ../raster/r.random.cells/init.c:115 ../raster/r.random.surface/main.c:57
+#, c-format
+msgid "Generating raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.random.cells/init.c:156 ../raster/r.random.surface/init.c:425
+#: ../imagery/i.topo.corr/main.c:52
+#, c-format
+msgid "<%s> is an illegal name"
+msgstr ""
+
+#: ../raster/r.stats/main.c:105
+msgid "Generates area statistics for raster map layers."
+msgstr ""
+
+#: ../raster/r.stats/main.c:114 ../raster/r.univar2/r3.univar_main.c:43
+#: ../raster/r.univar2/r.univar_main.c:42 ../db/base/select.c:233
+#: ../locale/scriptstrings/r.out.xyz_to_translate.c:4
+#: ../vector/v.db.select/main.c:84
+msgid "Name for output file (if omitted or \"-\" output to stdout)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:127 ../raster/r.describe/main.c:72
+msgid "String representing no data cell value"
+msgstr ""
+
+#: ../raster/r.stats/main.c:136 ../raster/r.report/parse.c:91
+msgid "Number of fp subranges to collect stats from"
+msgstr ""
+
+#: ../raster/r.stats/main.c:142
+msgid "One cell (range) per line"
+msgstr ""
+
+#: ../raster/r.stats/main.c:146
+msgid "Print averaged values instead of intervals"
+msgstr ""
+
+#: ../raster/r.stats/main.c:151
+msgid "Print area totals"
+msgstr ""
+
+#: ../raster/r.stats/main.c:156
+msgid "Print cell counts"
+msgstr ""
+
+#: ../raster/r.stats/main.c:162
+msgid "Print APPROXIMATE percents (total percent may not be 100%)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:167
+msgid "Print category labels"
+msgstr ""
+
+#: ../raster/r.stats/main.c:172
+msgid "Print grid coordinates (east and north)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:177
+msgid "Print x and y (column and row)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:182
+msgid "Print raw indexes of fp ranges (fp maps only)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:187 ../raster/r.describe/main.c:94
+msgid "Suppress reporting of any NULLs"
+msgstr ""
+
+#: ../raster/r.stats/main.c:192
+msgid "Suppress reporting of NULLs when all values are NULL"
+msgstr ""
+
+#: ../raster/r.stats/main.c:196 ../raster/r.report/parse.c:122
+msgid "Report for cats fp ranges (fp maps only)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:200 ../raster/r.report/parse.c:127
+msgid "Read fp map as integer (use map's quant rules)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:208 ../raster/r.regression.line/main.c:75
+#: ../raster/r.univar2/r3.univar_main.c:123
+#: ../raster/r.univar2/r.univar_main.c:110 ../db/base/select.c:130
+#: ../vector/v.db.select/main.c:111
+#, c-format
+msgid "Unable to open file <%s> for writing"
+msgstr ""
+
+#: ../raster/r.stats/main.c:214
+#, c-format
+msgid "'%s' must be greater than zero; using %s=255"
+msgstr ""
+
+#: ../raster/r.stats/main.c:261
+msgid "Raster map not found"
+msgstr ""
+
+#: ../raster/r.stats/main.c:284
+#, c-format
+msgid ""
+"Raster map <%s> is reading as integer map! Flag '-%c' and/or '%s' option "
+"will be ignored."
+msgstr ""
+
+#: ../raster/r.stats/main.c:301
+#, c-format
+msgid ""
+"Cats for raster map <%s> are either missing or have no explicit labels. "
+"Using %s=%d."
+msgstr ""
+
+#: ../raster/r.stats/main.c:308
+#, c-format
+msgid ""
+"Flag '-%c' was given, using cats fp ranges of raster map <%s>, ignoring '%s' "
+"option"
+msgstr ""
+
+#: ../raster/r.stats/main.c:315 ../raster/r.contour/main.c:165
+#: ../raster/r.recode/read_rules.c:19
+#, c-format
+msgid "Unable to read fp range of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.stats/main.c:342
+#, c-format
+msgid "Unable to read range for map <%s>"
+msgstr ""
+
+#: ../raster/r.stats/cell_stats.c:51
+#, c-format
+msgid "Unable to read raster <map %d of %d> row %d"
+msgstr ""
+
+#: ../raster/r.statistics/o_skew.c:97
+msgid "o_skew: No data in array"
+msgstr ""
+
+#: ../raster/r.statistics/o_average.c:33 ../raster/r.statistics/o_distrib.c:31
+#: ../raster/r.statistics/o_sum.c:35
+#, c-format
+msgid "%s: running %s command"
+msgstr ""
+
+#: ../raster/r.statistics/o_average.c:41 ../raster/r.statistics/o_distrib.c:39
+#: ../raster/r.statistics/o_sum.c:43 ../raster/r.average/main.c:102
+#, c-format
+msgid "%s: unable to open temporary file"
+msgstr ""
+
+#: ../raster/r.statistics/o_kurt.c:96
+msgid "o_kurto: No data in array"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:44
+msgid "Calculates category or object oriented statistics."
+msgstr ""
+
+#: ../raster/r.statistics/main.c:62
+msgid "Method of object-based statistic"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:67
+msgid "Resultant raster map (not used with 'distribution')"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:73 ../raster/r.average/main.c:66
+msgid "Cover values extracted from the category labels of the cover map"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:82 ../raster/r.statistics/main.c:88
+msgid "This module currently only works for integer (CELL) maps"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:100 ../raster/r.proj/main.c:210
+#: ../raster/r.neighbors/main.c:226 ../raster/r.proj.seg/main.c:238
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:149
+#: ../imagery/i.rectify/main.c:156 ../vector/v.vect.stats/main.c:276
+#, c-format
+msgid "<%s=%s> unknown %s"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:110
+#, c-format
+msgid "Output map <%s> ignored"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:177
+msgid "Not yet implemented!"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:187
+#, c-format
+msgid "An output raster map needs to be defined with method '%s'"
+msgstr ""
+
+#: ../raster/r.statistics/o_var.c:100 ../raster/r.statistics/o_sdev.c:100
+msgid "o_var: No data in array"
+msgstr ""
+
+#: ../raster/r.statistics/o_adev.c:97
+msgid "o_adev: No data in array"
+msgstr ""
+
+#: ../raster/r.statistics/read_stats.c:20 ../raster/r.median/read_stats.c:14
+msgid "Reading r.stats output"
+msgstr ""
+
+#: ../raster/r.drain/main.c:110
+msgid "Traces a flow through an elevation model on a raster map."
+msgstr ""
+
+#: ../raster/r.drain/main.c:120
+msgid "Name of movement direction map associated with the cost surface"
+msgstr ""
+
+#: ../raster/r.drain/main.c:131
+msgid ""
+"Output drain vector map (recommended for cost surface made using knight's "
+"move)"
+msgstr ""
+
+#: ../raster/r.drain/main.c:139
+msgid "Map coordinates of starting point(s) (E,N)"
+msgstr ""
+
+#: ../raster/r.drain/main.c:145
+msgid "Name of vector map(s) containing starting point(s)"
+msgstr ""
+
+#: ../raster/r.drain/main.c:150
+msgid "Copy input cell values on output"
+msgstr ""
+
+#: ../raster/r.drain/main.c:154
+msgid "Accumulate input values along the path"
+msgstr ""
+
+#: ../raster/r.drain/main.c:158
+msgid "Count cell numbers along the path"
+msgstr ""
+
+#: ../raster/r.drain/main.c:163
+msgid ""
+"The input surface is a cost surface (if checked, a direction surface must "
+"also be specified"
+msgstr ""
+
+#: ../raster/r.drain/main.c:175
+msgid "Directional drain selected... checking for direction raster"
+msgstr ""
+
+#: ../raster/r.drain/main.c:178
+msgid "Surface/Hydrology drain selected"
+msgstr ""
+
+#: ../raster/r.drain/main.c:184
+msgid ""
+"Direction raster not specified, if direction flag is on, a direction raster "
+"must be given"
+msgstr ""
+
+#: ../raster/r.drain/main.c:191
+#, c-format
+msgid "Direction raster found <%s>"
+msgstr ""
+
+#: ../raster/r.drain/main.c:198
+#, c-format
+msgid "Direction map <%s> should not be specified for Surface/Hydrology drains"
+msgstr ""
+
+#: ../raster/r.drain/main.c:204
+msgid "Outputting a vector path"
+msgstr ""
+
+#: ../raster/r.drain/main.c:209 ../raster/r.flow/io.c:176
+#: ../doc/vector/v.example/main.c:96 ../vector/v.in.dxf/main.c:168
+#: ../vector/v.net.connectivity/main.c:121 ../vector/v.delaunay2/main.c:126
+#: ../vector/v.net.bridge/main.c:86 ../vector/v.net.distance/main.c:146
+#: ../vector/v.buffer2/main.c:320 ../vector/v.net.path/main.c:139
+#: ../vector/v.voronoi/vo_main.c:165 ../vector/v.voronoi/dt_main.c:92
+#: ../vector/v.voronoi/dt_main.c:98 ../vector/v.net.allpairs/main.c:116
+#: ../vector/v.drape/main.c:339 ../vector/v.drape/main.c:380
+#: ../vector/v.mkgrid/main.c:223 ../vector/v.hull/main.c:334
+#: ../vector/v.net.visibility/main.c:87 ../vector/v.to.3d/main.c:88
+#: ../vector/v.net.flow/main.c:138 ../vector/v.net.flow/main.c:144
+#: ../vector/v.edit/main.c:106 ../vector/v.net.spanningtree/main.c:87
+#: ../vector/lidar/v.surf.bspline/main.c:293
+#: ../vector/lidar/v.lidar.edgedetection/main.c:245
+#: ../vector/lidar/v.lidar.correction/main.c:209
+#: ../vector/lidar/v.lidar.correction/main.c:215
+#: ../vector/lidar/v.outlier/main.c:205 ../vector/lidar/v.outlier/main.c:210
+#: ../vector/lidar/v.outlier/main.c:216 ../vector/v.net.timetable/main.c:323
+#: ../vector/v.net.components/main.c:114 ../vector/v.net.centrality/main.c:194
+#: ../vector/v.generalize/main.c:302
+#, c-format
+msgid "Unable to create vector map <%s>"
+msgstr ""
+
+#: ../raster/r.drain/main.c:227
+msgid "Specify just one of the -c, -a and -n flags"
+msgstr ""
+
+#: ../raster/r.drain/main.c:250
+msgid "Metrics allocation"
+msgstr ""
+
+#: ../raster/r.drain/main.c:261
+#, c-format
+msgid "Starting point %d is outside the current region"
+msgstr ""
+
+#: ../raster/r.drain/main.c:269 ../raster/r.drain/main.c:310
+msgid "Too many start points"
+msgstr ""
+
+#: ../raster/r.drain/main.c:316
+#, c-format
+msgid "Starting vector map <%s> contains no points in the current region"
+msgstr ""
+
+#: ../raster/r.drain/main.c:322
+msgid "No start/stop point(s) specified"
+msgstr ""
+
+#: ../raster/r.drain/main.c:397
+msgid "Calculating flow directions..."
+msgstr ""
+
+#: ../raster/r.drain/main.c:684
+#, c-format
+msgid "direction read: %lf, neighbour found: %i"
+msgstr ""
+
+#: ../raster/r.info/main.c:71
+msgid "Output basic information about a raster map layer."
+msgstr ""
+
+#: ../raster/r.info/main.c:77 ../raster3d/base/r3.info.main.c:91
+msgid "Print range only"
+msgstr ""
+
+#: ../raster/r.info/main.c:82
+msgid "Print raster map resolution (NS-res, EW-res) only"
+msgstr ""
+
+#: ../raster/r.info/main.c:86
+msgid "Print raster map type only"
+msgstr ""
+
+#: ../raster/r.info/main.c:90 ../vector/v.info/main.c:85
+msgid "Print map region only"
+msgstr ""
+
+#: ../raster/r.info/main.c:94
+msgid "Print raster history instead of info"
+msgstr ""
+
+#: ../raster/r.info/main.c:98
+msgid "Print raster map data units only"
+msgstr ""
+
+#: ../raster/r.info/main.c:102
+msgid "Print raster map vertical datum only"
+msgstr ""
+
+#: ../raster/r.info/main.c:106 ../vector/v.info/main.c:90
+msgid "Print map title only"
+msgstr ""
+
+#: ../raster/r.info/main.c:111
+msgid "Print raster map timestamp (day.month.year hour:minute:seconds) only"
+msgstr ""
+
+#: ../raster/r.info/main.c:142
+msgid "Unable to read range file"
+msgstr ""
+
+#: ../raster/r.info/main.c:307 ../raster/r.info/main.c:433
+#: ../raster3d/base/r3.info.main.c:158 ../raster3d/base/r3.info.main.c:166
+#: ../raster3d/base/r3.info.main.c:172 ../raster3d/base/r3.info.main.c:177
+#: ../raster3d/base/r3.info.main.c:184 ../raster3d/base/r3.info.main.c:195
+#: ../raster3d/base/r3.info.main.c:201 ../raster3d/base/r3.info.main.c:217
+#: ../raster3d/base/r3.info.main.c:224 ../raster3d/base/r3.info.main.c:231
+#: ../raster3d/base/r3.info.main.c:236 ../raster3d/base/r3.info.main.c:241
+#: ../raster3d/base/r3.info.main.c:248 ../raster3d/base/r3.info.main.c:255
+#: ../raster3d/base/r3.info.main.c:265 ../raster3d/base/r3.info.main.c:275
+#: ../raster3d/base/r3.info.main.c:285 ../raster3d/base/r3.info.main.c:298
+#: ../raster3d/base/r3.info.main.c:308 ../raster3d/base/r3.info.main.c:313
+#: ../raster3d/base/r3.info.main.c:321 ../raster3d/base/r3.info.main.c:334
+msgid "Cannot allocate memory for string"
+msgstr ""
+
+#: ../raster/r.param.scale/process.c:73
+msgid "E-W and N-S grid resolutions are different. Taking average."
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:54
+msgid "raster, geomorphology"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:55
+msgid "Extracts terrain parameters from a DEM."
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:56
+msgid ""
+"Uses a multi-scale approach by taking fitting quadratic parameters to any "
+"size window (via least squares)."
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:74
+msgid "Output raster layer containing morphometric parameter"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:78
+msgid "Slope tolerance that defines a 'flat' surface (degrees)"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:85
+msgid "Curvature tolerance that defines 'planar' surface"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:90
+#, c-format
+msgid "Size of processing window (odd number only, max: %i)"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:100
+msgid "Morphometric parameter in 'size' window to calculate"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:108
+msgid "Exponent for distance weighting (0.0-4.0)"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:120
+msgid "Constrain model through central window cell"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:163
+msgid "Morphometric parameter not recognised. Assuming 'Elevation'"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:190
+msgid "Inappropriate window size (too big or even)"
+msgstr ""
+
+#: ../raster/r.param.scale/main.c:45
+msgid "Lat/Long location is not supported"
+msgstr ""
+
+#: ../raster/r.param.scale/write_cats.c:47
+#, c-format
+msgid "Cannot write category file for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.buffer/parse_dist.c:54
+#, c-format
+msgid "%s: %s - illegal distance specification"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:69
+msgid "raster, buffer"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:71
+msgid ""
+"Creates a raster map layer showing buffer zones surrounding cells that "
+"contain non-NULL category values."
+msgstr ""
+
+#: ../raster/r.buffer/main.c:83
+msgid "Distance zone(s)"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:90
+msgid "Units of distance"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:96
+msgid "Ignore zero (0) data cells instead of NULL cells"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:149
+msgid "Parse distances error"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:168
+#, c-format
+msgid "Pass %d (of %d)"
+msgstr ""
+
+#: ../raster/r.buffer/execute.c:34
+msgid "Finding buffer zones..."
+msgstr ""
+
+#: ../raster/r.buffer/read_map.c:53
+#, c-format
+msgid "Reading input raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.buffer/write_map.c:48
+#, c-format
+msgid "Writing output raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.covar/main.c:55
+msgid ""
+"Outputs a covariance/correlation matrix for user-specified raster map layer"
+"(s)."
+msgstr ""
+
+#: ../raster/r.covar/main.c:62
+msgid "Print correlation matrix"
+msgstr ""
+
+#: ../raster/r.covar/main.c:104
+#, c-format
+msgid "%s: complete ... "
+msgstr ""
+
+#: ../raster/r.covar/main.c:129 ../imagery/i.pca/main.c:146
+msgid "No non-null values"
+msgstr ""
+
+#: ../raster/r.mfilter/main.c:52
+msgid "Performs raster map matrix filter."
+msgstr ""
+
+#: ../raster/r.mfilter/main.c:63
+msgid "Path to filter file"
+msgstr ""
+
+#: ../raster/r.mfilter/main.c:72 ../raster/r.mfilter/main.c:96
+msgid "Filter"
+msgstr ""
+
+#: ../raster/r.mfilter/main.c:95
+msgid "Apply filter only to zero data values"
+msgstr ""
+
+#: ../raster/r.volume/main.c:57
+msgid "raster, volume"
+msgstr ""
+
+#: ../raster/r.volume/main.c:59
+msgid ""
+"Calculates the volume of data \"clumps\", and (optionally) produces a GRASS "
+"vector points map containing the calculated centroids of these clumps."
+msgstr ""
+
+#: ../raster/r.volume/main.c:69
+msgid "Existing raster map representing data that will be summed within clumps"
+msgstr ""
+
+#: ../raster/r.volume/main.c:77
+msgid "Existing raster map, preferably the output of r.clump"
+msgstr ""
+
+#: ../raster/r.volume/main.c:84
+msgid "Vector points map to contain clump centroids"
+msgstr ""
+
+#: ../raster/r.volume/main.c:88
+msgid "Generate unformatted report"
+msgstr ""
+
+#: ../raster/r.volume/main.c:117
+msgid "No data map specified"
+msgstr ""
+
+#: ../raster/r.volume/main.c:128
+msgid "No clump map specified and MASK not set."
+msgstr ""
+
+#: ../raster/r.volume/main.c:133
+msgid "Unable to find data map"
+msgstr ""
+
+#: ../raster/r.volume/main.c:141
+msgid "Unable to find clump map"
+msgstr ""
+
+#: ../raster/r.volume/main.c:149
+msgid "Unable to open centroids vector points map"
+msgstr ""
+
+#: ../raster/r.volume/main.c:171
+msgid "Data or Clump file not open"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:79
+#, c-format
+msgid "RGB raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:86
+msgid "Cannot create RGB data, please provide three maps [r,g,b]"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:102
+#, c-format
+msgid "Vector cell map <%s> not found"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:109
+msgid "Cannot create vector data, please provide three maps [x,y,z]"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:149
+msgid "Converts raster maps into the VTK-Ascii format"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:215 ../raster/r.out.vtk/main.c:280
+#: ../raster/r.out.vtk/main.c:307 ../raster/r.out.vtk/main.c:353
+#, c-format
+msgid "Open Raster file %s"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:324
+msgid "Writing VTK ImageData\n"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:334
+msgid "Wrong RGB maps. Maps should have the same type! RGB output not added!"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:371
+msgid "Writing VTK Vector Data\n"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:381
+msgid ""
+"Wrong vector maps. Maps should have the same type! Vector output not added!"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:393
+msgid "Error closing VTK-ASCII file"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:74
+msgid "write_vtk_normal_header: Writing VTK-Header"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:107
+msgid "write_vtk_structured_elevation_header: Writing VTK-Header"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:123
+msgid "write_vtk_polygonal_elevation_header: Writing VTK-Header"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:138
+msgid "write_vtk_celldata_header: Writing VTK-DataHeader"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:147
+msgid "writeVTKPointHeader: Writing VTK-DataHeader"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:168
+msgid "write_vtk_structured_coordinates: Writing Coordinates"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:184 ../raster/r.out.vtk/writeascii.c:245
+#: ../raster/r.out.vtk/writeascii.c:357 ../raster/r.out.vtk/writeascii.c:404
+#: ../raster/r.out.vtk/writeascii.c:408 ../raster/r.out.vtk/writeascii.c:412
+#: ../raster/r.out.vtk/writeascii.c:471 ../raster/r.out.vtk/writeascii.c:475
+#: ../raster/r.out.vtk/writeascii.c:479
+#, c-format
+msgid "Unable to read row %i\n"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:227
+msgid "write_vtk_polygonal_coordinates: Writing VTK Polygonal data"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:339
+msgid "write_vtk_data: Writing VTK-Data"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:392
+msgid "write_vtk_rgb_image_data: Writing VTK-ImageData"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:429
+msgid "Wrong map values! Values should in between 0 and 255!\n"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:459
+msgid "write_vtk_vector_data: Writing VTK-vector data"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:38 ../raster3d/r3.out.vtk/parameters.c:34
+msgid "Name for VTK-ASCII output file"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:46
+msgid "Elevation raster map"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:52
+msgid "Value to represent no data cell"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:60
+msgid "Elevation (if no elevation map is specified)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:66
+msgid ""
+"Create VTK point data instead of VTK cell data (if no elevation map is given)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:76
+msgid ""
+"Three (r,g,b) raster maps to create rgb values [redmap,greenmap,bluemap]"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:86
+msgid "Three (x,y,z) raster maps to create vector values [xmap,ymap,zmap]"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:93 ../raster3d/r3.out.vtk/parameters.c:99
+#: ../vector/v.out.vtk/main.c:75
+msgid "Scale factor for elevation"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:105 ../raster/r.out.ascii/main.c:85
+#: ../display/d.rast.num/number.c:120 ../raster3d/r3.out.vtk/parameters.c:112
+#: ../vector/v.out.ascii/out.c:76 ../vector/v.out.vtk/main.c:69
+msgid "Number of significant digits (floating point only)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:111
+msgid "Use structured grid for elevation (not recommended)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:117
+msgid "Use polydata-trianglestrips for elevation grid creation"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:123
+msgid ""
+"Use polydata-vertices for elevation grid creation (to use with vtkDelauny2D)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:129
+msgid "Scale factor effects the origin (if no elevation map is given)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:135
+#: ../raster3d/r3.out.vtk/parameters.c:128 ../vector/v.out.vtk/main.c:88
+msgid "Correct the coordinates to fit the VTK-OpenGL precision"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:55
+msgid "The initial piezometric head in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:60
+msgid "Boundary condition status, 0-inactive, 1-active, 2-dirichlet"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:65
+msgid "X-part of the hydraulic conductivity tensor in [m/s]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:70
+msgid "Y-part of the hydraulic conductivity tensor in [m/s]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:75
+msgid "Water sources and sinks in [m^3/s]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:79
+msgid "Specific yield in [1/m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:84
+msgid "Recharge"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:86
+msgid "Recharge map e.g: 6*10^-9 per cell in [m^3/s*m^2]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:90
+msgid "Top surface of the aquifer in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:94
+msgid "Bottom surface of the aquifer in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:98
+msgid "The map storing the numerical result [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:104
+msgid ""
+"Calculate the groundwater filter velocity vector field [m/s]\n"
+"and write the x, and y components to maps named name_[xy]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:113
+msgid "The type of groundwater flow"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:120
+msgid "The height of the river bed in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:127
+msgid "Water level (head) of the river with leakage connection in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:134
+msgid "The leakage coefficient of the river bed in [1/s]."
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:140
+msgid "The height of the drainage bed in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:147
+msgid "The leakage coefficient of the drainage bed in [1/s]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:159
+msgid "Use a sparse matrix, only available with iterative solvers"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:191
+msgid ""
+"Numerical calculation program for transient, confined and unconfined "
+"groundwater flow in two dimensions."
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:201 ../raster/r.topidx/main.c:53
+#, c-format
+msgid "Lat/Long location is not supported by %s. Please reproject map first."
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:216
+msgid "Please provide river_head, river_leak and river_bed maps"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:228
+msgid "Please provide drain_head and drain_leak maps"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:240 ../raster3d/r3.gwflow/main.c:189
+msgid "The direct LU solver do not work with sparse matrices"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:242 ../raster3d/r3.gwflow/main.c:191
+msgid "The direct Gauss solver do not work with sparse matrices"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:244
+msgid "The direct cholesky solver do not work with sparse matrices"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:350 ../raster/r.to.rast3/main.c:236
+#: ../raster/r.li/r.li.daemon/list.c:49 ../raster3d/r3.to.rast/main.c:299
+#: ../imagery/i.ask/popup.c:174 ../imagery/i.smap/bouman/multialloc.c:115
+#: ../vector/v.net.connectivity/main.c:165
+#: ../vector/v.net.connectivity/main.c:181 ../vector/v.in.ascii/a2b.c:172
+#: ../vector/v.surf.rst/main.c:887 ../vector/v.net.distance/main.c:168
+#: ../vector/v.mapcalc/list.c:54 ../vector/v.mapcalc/list.c:501
+#: ../vector/v.net.allpairs/main.c:174 ../vector/v.mkgrid/write_grid.c:131
+#: ../vector/v.net.flow/main.c:214 ../vector/v.edit/a2b.c:198
+#: ../vector/v.net.timetable/main.c:353 ../vector/v.net.timetable/main.c:363
+#: ../vector/v.net.components/main.c:127 ../vector/v.net.centrality/main.c:265
+#: ../vector/v.net.centrality/main.c:270 ../vector/v.net.centrality/main.c:276
+#: ../vector/v.net.centrality/main.c:282 ../vector/v.net.centrality/main.c:288
+#: ../vector/v.generalize/smoothing.c:95
+#: ../vector/v.generalize/smoothing.c:152
+#: ../vector/v.generalize/smoothing.c:253
+#: ../vector/v.generalize/smoothing.c:377
+#: ../vector/v.generalize/smoothing.c:406
+#: ../vector/v.generalize/smoothing.c:410
+#: ../vector/v.generalize/smoothing.c:414
+#: ../vector/v.generalize/smoothing.c:418
+#: ../vector/v.generalize/smoothing.c:422
+#: ../vector/v.generalize/smoothing.c:426
+#: ../vector/v.generalize/smoothing.c:430 ../vector/v.generalize/matrix.c:145
+#: ../vector/v.generalize/simplification.c:33
+#: ../vector/v.generalize/simplification.c:40
+#: ../vector/v.generalize/simplification.c:309
+#: ../vector/v.generalize/simplification.c:317
+#: ../vector/v.generalize/simplification.c:341
+#: ../vector/v.generalize/network.c:94 ../vector/v.generalize/network.c:129
+#: ../vector/v.generalize/point.c:121
+msgid "Out of memory"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:360
+#, c-format
+msgid "Calculation of unconfined groundwater flow loop %i\n"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:383
+#, c-format
+msgid "Maximum difference between this and last increment: %g"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:529 ../raster3d/r3.gwflow/main.c:294
+msgid "Unable to create and solve the linear equation system"
+msgstr ""
+
+#: ../raster/r.quant/read_rules.c:49
+msgid "Old data range is empty"
+msgstr ""
+
+#: ../raster/r.quant/read_rules.c:55
+#, c-format
+msgid "Old data range is %s to %s"
+msgstr ""
+
+#: ../raster/r.quant/read_rules.c:58
+msgid "Old integer data range is empty"
+msgstr ""
+
+#: ../raster/r.quant/read_rules.c:60
+#, c-format
+msgid "Old integer data range is %d to %d"
+msgstr ""
+
+#: ../raster/r.quant/main.c:41
+msgid "raster, quantization"
+msgstr ""
+
+#: ../raster/r.quant/main.c:43
+msgid "Produces the quantization file for a floating-point map."
+msgstr ""
+
+#: ../raster/r.quant/main.c:51
+msgid "Base map to take quant rules from"
+msgstr ""
+
+#: ../raster/r.quant/main.c:59
+msgid "Raster map(s) to be quantized"
+msgstr ""
+
+#: ../raster/r.quant/main.c:64
+msgid "Floating point range: dmin,dmax"
+msgstr ""
+
+#: ../raster/r.quant/main.c:72
+msgid "Integer range: min,max"
+msgstr ""
+
+#: ../raster/r.quant/main.c:79
+msgid "Truncate floating point data"
+msgstr ""
+
+#: ../raster/r.quant/main.c:83
+msgid "Round floating point data"
+msgstr ""
+
+#: ../raster/r.quant/main.c:111
+msgid "Truncating..."
+msgstr ""
+
+#: ../raster/r.quant/main.c:116
+msgid "Rounding..."
+msgstr ""
+
+#: ../raster/r.quant/main.c:144
+#, c-format
+msgid "Setting quant rules for input map(s) to (%f %f) -> (%d,%d)"
+msgstr ""
+
+#: ../raster/r.quant/main.c:154
+msgid "No rules specified. Quant table(s) not changed."
+msgstr ""
+
+#: ../raster/r.quant/main.c:164
+#, c-format
+msgid "Quant table not changed for %s"
+msgstr ""
+
+#: ../raster/r.quant/main.c:166
+#, c-format
+msgid "New quant table created for %s"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:111
+msgid "raster, sediment flow, erosion, deposition"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:113
+msgid ""
+"Sediment transport and erosion/deposition simulation using path sampling "
+"method (SIMWE)."
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:118
+#: ../raster/simwe/r.sim.water/main.c:125
+msgid "Name of the elevation raster map [m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:123
+msgid "Name of the water depth raster map [m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:128
+#: ../raster/simwe/r.sim.water/main.c:130
+msgid "Name of the x-derivatives raster map [m/m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:133
+#: ../raster/simwe/r.sim.water/main.c:135
+msgid "Name of the y-derivatives raster map [m/m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:139
+msgid "Name of the detachment capacity coefficient raster map [s/m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:145
+msgid "Name of the transport capacity coefficient raster map [s]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:151
+msgid "Name of the critical shear stress raster map [Pa]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:157
+#: ../raster/simwe/r.sim.water/main.c:173
+msgid "Name of the Mannings n raster map"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:165
+msgid "Name of the Mannings n value"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:180
+msgid "Output transport capacity raster map [kg/ms]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:181
+#: ../raster/simwe/r.sim.sediment/main.c:188
+#: ../raster/simwe/r.sim.sediment/main.c:195
+#: ../raster/simwe/r.sim.sediment/main.c:201
+#: ../raster/simwe/r.sim.sediment/main.c:208
+#: ../raster/simwe/r.sim.water/main.c:204
+#: ../raster/simwe/r.sim.water/main.c:210
+#: ../raster/simwe/r.sim.water/main.c:216
+msgid "Output"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:187
+msgid "Output transp.limited erosion-deposition raster map [kg/m2s]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:194
+msgid "Output sediment concentration raster map [particle/m3]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:200
+msgid "Output sediment flux raster map [kg/ms]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:207
+msgid "Output erosion-deposition raster map [kg/m2s]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:214
+msgid "Number of walkers"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:215
+#: ../raster/simwe/r.sim.sediment/main.c:223
+#: ../raster/simwe/r.sim.sediment/main.c:232
+#: ../raster/simwe/r.sim.sediment/main.c:250
+#: ../raster/simwe/r.sim.water/main.c:233
+#: ../raster/simwe/r.sim.water/main.c:241
+#: ../raster/simwe/r.sim.water/main.c:250
+#: ../raster/simwe/r.sim.water/main.c:268
+#: ../raster/simwe/r.sim.water/main.c:277
+#: ../raster/simwe/r.sim.water/main.c:285
+#: ../raster/simwe/r.sim.water/main.c:294 ../vector/v.surf.rst/main.c:199
+#: ../vector/v.surf.rst/main.c:204 ../vector/v.surf.rst/main.c:293
+#: ../vector/v.surf.rst/main.c:301 ../vector/v.surf.rst/main.c:309
+#: ../vector/v.surf.rst/main.c:316 ../vector/v.surf.rst/main.c:324
+#: ../vector/v.surf.rst/main.c:332 ../vector/v.surf.rst/main.c:341
+#: ../vector/v.surf.rst/main.c:350 ../vector/v.surf.rst/main.c:359
+#: ../vector/v.surf.rst/main.c:368 ../vector/v.surf.rst/main.c:376
+#: ../vector/v.surf.rst/main.c:383
+msgid "Parameters"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:222
+#: ../raster/simwe/r.sim.water/main.c:240
+msgid "Time used for iterations [minutes]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:231
+#: ../raster/simwe/r.sim.water/main.c:249
+msgid "Time interval for creating output maps [minutes]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:249
+#: ../raster/simwe/r.sim.water/main.c:267
+msgid "Water diffusion constant"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:331
+#: ../raster/simwe/r.sim.water/main.c:444
+msgid "More than 100 files are going to be created !!!!!"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:337
+#: ../raster/simwe/r.sim.water/main.c:450
+#, c-format
+msgid "default nwalk=%d, rwalk=%f"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:346
+#: ../raster/simwe/r.sim.water/main.c:460
+#, c-format
+msgid "Using metric conversion factor %f, step=%f"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:355
+msgid "You are not outputting any raster or site files"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:358
+#: ../raster/simwe/r.sim.water/main.c:480 ../vector/v.surf.rst/main.c:717
+#: ../vector/v.surf.rst/main.c:769
+msgid "Input failed"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:417
+#: ../raster/simwe/r.sim.water/main.c:527
+msgid "Cannot write raster maps"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:118
+msgid "raster, flow, hydrology"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:120
+msgid "Overland flow hydrologic simulation using path sampling method (SIMWE)."
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:142
+msgid "Name of the rainfall excess rate (rain-infilt) raster map [mm/hr]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:151
+msgid "Rainfall excess rate unique value [mm/hr]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:158
+msgid "Name of the runoff infiltration rate raster map [mm/hr]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:167
+msgid "Runoff infiltration rate unique value [mm/hr]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:181
+msgid "Mannings n unique value"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:188
+msgid "Name of the flow controls raster map (permeability ratio 0-1)"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:203
+msgid "Output water depth raster map [m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:209
+msgid "Output water discharge raster map [m3/s]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:215
+msgid "Output simulation error raster map [m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:232
+msgid "Number of walkers, default is twice the no. of cells"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:276
+msgid ""
+"Threshold water depth [m] (diffusion increases after this water depth is "
+"reached)"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:284
+msgid "Diffusion increase constant"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:293
+msgid "Weighting factor for water flow velocity vector"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:298
+msgid "Time-series output"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:477
+msgid "You are not outputting any raster maps"
+msgstr ""
+
+#: ../raster/simwe/simlib/hydro.c:211
+#, c-format
+msgid "nwalk (%d) > maxw (%d)!"
+msgstr ""
+
+#: ../raster/simwe/simlib/hydro.c:431
+msgid "Unable to write raster maps"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:409
+#, c-format
+msgid ""
+"Raster map <%s> not found, and manin_val undefined, choose one to be allowed "
+"to process"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:541
+msgid "Zero value in Mannings n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:592
+msgid "Infiltration exceeds the rainfall rate everywhere! No overland flow."
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:616
+#, c-format
+msgid ""
+"Min elevation \t= %.2f m\n"
+"Max elevation \t= %.2f m\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:618
+#, c-format
+msgid "Mean Source Rate (rainf. excess or sediment) \t= %f m/s or kg/m2s \n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:620
+#, c-format
+msgid "Mean flow velocity \t= %f m/s\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:621
+#, c-format
+msgid "Mean Mannings \t= %f\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:625
+#, c-format
+msgid "Number of iterations \t= %d cells\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:626
+#, c-format
+msgid "Time step \t= %.2f s\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:628
+#, c-format
+msgid ""
+"Sigmax \t= %f\n"
+"Max velocity \t= %f m/s\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:630
+#, c-format
+msgid "Time step used \t= %.2f s\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:682
+msgid "Unable to write et file"
+msgstr ""
+
+#: ../raster/r.region/main.c:56
+msgid "Sets the boundary definitions for a raster map."
+msgstr ""
+
+#: ../raster/r.region/main.c:66
+msgid "Set from current region"
+msgstr ""
+
+#: ../raster/r.region/main.c:70 ../general/g.region/main.c:80
+msgid "Set from default region"
+msgstr ""
+
+#: ../raster/r.region/main.c:81
+msgid "Raster map to change"
+msgstr ""
+
+#: ../raster/r.region/main.c:89
+msgid "Set region from named region"
+msgstr ""
+
+#: ../raster/r.region/main.c:96 ../general/g.region/main.c:181
+msgid "Set region to match this raster map"
+msgstr ""
+
+#: ../raster/r.region/main.c:102 ../general/g.region/main.c:197
+msgid "Set region to match this vector map"
+msgstr ""
+
+#: ../raster/r.region/main.c:110 ../general/g.region/main.c:206
+msgid "Set region to match this 3dview file"
+msgstr ""
+
+#: ../raster/r.region/main.c:120 ../general/g.region/main.c:216
+msgid "Value for the northern edge"
+msgstr ""
+
+#: ../raster/r.region/main.c:130 ../general/g.region/main.c:226
+msgid "Value for the southern edge"
+msgstr ""
+
+#: ../raster/r.region/main.c:140 ../general/g.region/main.c:236
+msgid "Value for the eastern edge"
+msgstr ""
+
+#: ../raster/r.region/main.c:150 ../general/g.region/main.c:246
+msgid "Value for the western edge"
+msgstr ""
+
+#: ../raster/r.region/main.c:157
+msgid "Raster map to align to"
+msgstr ""
+
+#: ../raster/r.region/main.c:168 ../raster/r.region/main.c:227
+#: ../raster/r.region/main.c:350 ../general/g.region/main.c:482
+#: ../general/g.region/main.c:833 ../display/d.title/main.c:108
+#, c-format
+msgid "Unable to read header of raster map <%s@%s>"
+msgstr ""
+
+#: ../raster/r.region/main.c:182 ../general/g.region/main.c:423
+#, c-format
+msgid "Region <%s> not found"
+msgstr ""
+
+#: ../raster/r.region/main.c:184 ../general/g.region/main.c:425
+#, c-format
+msgid "Unable to read region <%s> in <%s>"
+msgstr ""
+
+#: ../raster/r.region/main.c:195 ../general/g.region/main.c:437
+#, c-format
+msgid "3dview file <%s> not found"
+msgstr ""
+
+#: ../raster/r.region/main.c:201 ../general/g.region/main.c:442
+#, c-format
+msgid "Unable to open 3dview file <%s> in <%s>"
+msgstr ""
+
+#: ../raster/r.region/main.c:206 ../general/g.region/main.c:448
+#, c-format
+msgid "Unable to read 3dview file <%s> in <%s>"
+msgstr ""
+
+#: ../raster/r.region/main.c:209 ../general/g.region/main.c:451
+#, c-format
+msgid "Old 3dview file. Region <%s> not found in <%s>"
+msgstr ""
+
+#: ../raster/r.region/main.c:241
+#, c-format
+msgid "Unable to open vector map <%s> in <%s>"
+msgstr ""
+
+#: ../raster/r.region/main.c:360 ../general/g.region/adjust.c:11
+#, c-format
+msgid "Invalid region: %s"
+msgstr ""
+
+#: ../raster/r.region/main.c:368
+msgid "Unable to update boundaries"
+msgstr ""
+
+#: ../raster/r.timestamp/main.c:35
+msgid "raster, metadata, timestamp"
+msgstr ""
+
+#: ../raster/r.timestamp/main.c:36
+msgid "Modifies a timestamp for a raster map."
+msgstr ""
+
+#: ../raster/r.timestamp/main.c:37
+msgid "Print/add/remove a timestamp for a raster map."
+msgstr ""
+
+#: ../raster/r.timestamp/main.c:46
+msgid "Datetime, datetime1/datetime2, or 'none' to remove"
+msgstr ""
+
+#: ../raster/r.timestamp/main.c:47
+msgid "Format: '15 jan 1994' (absolute) or '2 years' (relative)"
+msgstr ""
+
+#: ../raster/r.timestamp/main.c:82
+msgid "Invalid timestamp"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:83 ../raster/r.mapcalc/map3.c:177
+#, c-format
+msgid "Unable to read color file for raster map <%s@%s>"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:96 ../raster/r.mapcalc/map3.c:190
+#, c-format
+msgid "Unable to create btree for raster map <%s@%s>"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:141 ../raster/r.mapcalc/map.c:353
+#: ../raster/r.mapcalc/map.c:394 ../raster/r.mapcalc/map.c:484
+#: ../raster/r.mapcalc/map3.c:235 ../raster/r.mapcalc/map3.c:417
+#: ../raster/r.mapcalc/map3.c:461 ../raster/r.mapcalc/map3.c:552
+#: ../raster/r.mapcalc/expression.c:356
+#, c-format
+msgid "Invalid map modifier: '%c'"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:234 ../raster/r.surf.idw/main.c:690
+#: ../raster/r.proj/readcell.c:27 ../raster/r.out.png/r.out.png.c:321
+#: ../imagery/i.cluster/main.c:290 ../imagery/i.maxlik/main.c:117
+#: ../imagery/i.smap/bouman/read_block.c:16
+#: ../imagery/i.gensigset/read_data.c:27
+#: ../imagery/i.gensigset/read_train.c:10 ../imagery/i.gensig/covariance.c:34
+#: ../imagery/i.gensig/read_train.c:10
+#, c-format
+msgid "Unable to read raster map row %d"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:249
+msgid "Rowio_setup failed"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:280 ../raster/r.mapcalc/map3.c:348
+#: ../raster/r.mapcalc/evaluate.c:91 ../raster/r.mapcalc/evaluate.c:206
+#, c-format
+msgid "Unknown type: %d"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:292
+msgid "Rowio_get failed"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:309 ../raster/r.mapcalc/map3.c:367
+#, c-format
+msgid "Unable to close raster map <%s@%s>"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:442 ../imagery/i.topo.corr/main.c:38
+#, c-format
+msgid "Unable to open raster map <%s@%s>"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:515
+msgid "Failed writing raster map row"
+msgstr ""
+
+#: ../raster/r.mapcalc/map.c:521 ../raster3d/base/r3.null.main.c:188
+msgid "Unable to close raster map"
+msgstr ""
+
+#: ../raster/r.mapcalc/map3.c:124 ../raster/r.mapcalc/map3.c:138
+#: ../raster/r.mapcalc/map3.c:152 ../raster/r.out.bin/main.c:53
+#: ../raster/r.out.bin/main.c:62 ../raster/r.out.bin/main.c:461
+msgid "Error writing data"
+msgstr ""
+
+#: ../raster/r.mapcalc/map3.c:605
+msgid "Unable to close output raster map"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:204
+#, c-format
+msgid "Undefined variable '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:219
+#, c-format
+msgid "Invalid map <%s>"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:261
+#, c-format
+msgid "Undefined function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:266
+#, c-format
+msgid "Too few arguments (%d) to function %s()"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:270
+#, c-format
+msgid "Too many arguments (%d) to function %s()"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:274
+#, c-format
+msgid "Incorrect argument types to function %s()"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:277
+#, c-format
+msgid "Internal error for function %s()"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:452
+#, c-format
+msgid "Illegal number of arguments (%d) for operator '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:492
+#, c-format
+msgid "Format_expression_prec: unknown type: %d"
+msgstr ""
+
+#: ../raster/r.mapcalc/main.c:112
+msgid ""
+"r.mapcalc - Raster map layer data calculator\n"
+"\n"
+"usage: r.mapcalc '<map>=<expression>'\n"
+"\n"
+"r.mapcalc performs arithmetic on raster map layers.\n"
+"\n"
+"New raster map layers can be created which are arithmetic expressions\n"
+"involving existing raster map layers, integer or floating point constants,\n"
+"and functions.\n"
+" \n"
+"For more information use 'g.manual r.mapcalc'\n"
+msgstr ""
+
+#: ../raster/r.mapcalc/main.c:142
+msgid "Floating point error(s) occured in the calculation"
+msgstr ""
+
+#: ../raster/r.mapcalc/main.c:147
+msgid "Overflow occured in the calculation"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:120
+#, c-format
+msgid "Invalid type: %d"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:151
+#, c-format
+msgid "Too few arguments for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:155
+#, c-format
+msgid "Too many arguments for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:159
+#, c-format
+msgid "Invalid argument type for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:163
+#, c-format
+msgid "Invalid return type for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:167
+#, c-format
+msgid "Unknown type for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:170
+#, c-format
+msgid "Number of arguments for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:174
+#, c-format
+msgid "Unknown error for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/function.c:93
+#, c-format
+msgid "Known functions:"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:227 ../raster/r.sun/main.c:173
+msgid "raster, sun energy"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:228 ../raster/r.sun/main.c:174
+msgid "Solar irradiance and irradiation model."
+msgstr ""
+
+#: ../raster/r.sun2/main.c:230 ../raster/r.sun/main.c:176
+msgid ""
+"Computes direct (beam), diffuse and reflected solar irradiation raster maps "
+"for given day, latitude, surface and atmospheric conditions. Solar "
+"parameters (e.g. sunrise, sunset times, declination, extraterrestrial "
+"irradiance, daylight length) are saved in the map history file. "
+"Alternatively, a local time can be specified to compute solar incidence "
+"angle and/or irradiance raster maps. The shadowing effect of the topography "
+"is optionally incorporated."
+msgstr ""
+
+#: ../raster/r.sun2/main.c:244 ../raster/r.horizon/main.c:225
+#: ../raster/r.sun/main.c:206
+msgid "Name of the input elevation raster map [meters]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:253 ../raster/r.sun/main.c:215
+msgid ""
+"Name of the input aspect map (terrain aspect or azimuth of the solar panel) "
+"[decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:262
+msgid "A single value of the orientation (aspect), 270 is south"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:271 ../raster/r.sun/main.c:225
+msgid ""
+"Name of the input slope raster map (terrain slope or solar panel "
+"inclination) [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:279
+msgid "A single value of inclination (slope)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:288 ../raster/r.sun/main.c:234
+msgid ""
+"Name of the Linke atmospheric turbidity coefficient input raster map [-]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:298 ../raster/r.sun/main.c:245
+msgid "A single value of the Linke atmospheric turbidity coefficient [-]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:308 ../raster/r.sun/main.c:254
+msgid "Name of the ground albedo coefficient input raster map [-]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:318 ../raster/r.sun/main.c:265
+msgid "A single value of the ground albedo coefficient [-]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:328
+msgid "Name of input raster map containing latitudes [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:337
+msgid "Name of input raster map containing longitudes [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:346
+msgid ""
+"Name of real-sky beam radiation coefficient (thick cloud) input raster map "
+"[0-1]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:355
+msgid ""
+"Name of real-sky diffuse radiation coefficient (haze) input raster map [0-1]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:363
+msgid "The horizon information input map prefix"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:371 ../raster/r.horizon/main.c:242
+msgid "Angle step size for multidirectional horizon [degrees]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:380 ../raster/r.sun/main.c:311
+msgid "Output incidence angle raster map (mode 1 only)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:389 ../raster/r.sun/main.c:320
+msgid ""
+"Output beam irradiance [W.m-2] (mode 1) or irradiation raster map [Wh.m-2."
+"day-1] (mode 2)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:398 ../raster/r.sun/main.c:329
+msgid "Output insolation time raster map [h] (mode 2 only)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:407 ../raster/r.sun/main.c:338
+msgid ""
+"Output diffuse irradiance [W.m-2] (mode 1) or irradiation raster map [Wh.m-2."
+"day-1] (mode 2)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:416 ../raster/r.sun/main.c:347
+msgid ""
+"Output ground reflected irradiance [W.m-2] (mode 1) or irradiation raster "
+"map [Wh.m-2.day-1] (mode 2)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:425
+msgid ""
+"Output global (total) irradiance/irradiation [W.m-2] (mode 1) or irradiance/"
+"irradiation raster map [Wh.m-2.day-1] (mode 2)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:432 ../raster/r.sun/main.c:354
+msgid "No. of day of the year (1-365)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:441 ../raster/r.sun/main.c:362
+msgid "Time step when computing all-day radiation sums [decimal hours]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:448 ../raster/r.sun/main.c:369
+msgid "Declination value (overriding the internally computed value) [radians]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:456 ../raster/r.sun/main.c:377
+msgid "Local (solar) time (to be set for mode 1 only) [decimal hours]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:479 ../raster/r.horizon/main.c:317
+msgid "Sampling distance step coefficient (0.5-1.5)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:487
+msgid "Read the input files in this number of chunks"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:494
+msgid "Civil time zone value, if none, the time will be local solar time"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:502 ../vector/v.buffer2/main.c:218
+#: ../vector/v.generalize/main.c:209
+msgid "This does nothing. It is retained for backwards compatibility"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:503 ../vector/v.buffer2/main.c:216
+#: ../vector/v.buffer2/main.c:228 ../vector/v.build.polylines/main.c:134
+#: ../vector/v.generalize/main.c:210
+msgid "Unused"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:509 ../raster/r.sun/main.c:382
+msgid "Incorporate the shadowing effect of terrain"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:514
+msgid "Use the low-memory version of the program"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:561
+msgid "You must give the longitude raster if you use civil time"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:564
+msgid "Error reading civil time zone value"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:567
+msgid "Invalid civil time zone value"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:592 ../raster/r.sun/main.c:408
+msgid "insol_time and incidout are incompatible options"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:597
+msgid "Error reading time step size"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:599
+msgid "Invalid time step size"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:603
+msgid "Error reading horizon step size"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:607
+msgid "The horizon step size must be greater than 0."
+msgstr ""
+
+#: ../raster/r.sun2/main.c:610
+msgid ""
+"If you use the horizon option you must also set the 'horizonstep' parameter."
+msgstr ""
+
+#: ../raster/r.sun2/main.c:616
+msgid "Time and insol_time are incompatible options"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:618
+msgid ""
+"Mode 1: instantaneous solar incidence angle & irradiance using a set local "
+"time"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:623 ../raster/r.sun/main.c:422
+msgid "incidout requires time parameter to be set"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:625 ../raster/r.sun/main.c:423
+msgid "Mode 2: integrated daily irradiation for a given day of the year"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:671
+msgid "If you use -s and no horizon rasters, numpartitions must be =1"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:683
+msgid ""
+"If you want to save memory and to use shadows, you must use pre-calculated "
+"horizons."
+msgstr ""
+
+#: ../raster/r.sun2/main.c:728 ../general/g.region/printwindow.c:247
+#: ../general/g.region/printwindow.c:503 ../general/g.region/printwindow.c:622
+#: ../display/d.where/main.c:93
+msgid "Can't get projection info of current location"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:732 ../raster/r.horizon/main.c:482
+#: ../raster/r.sun/main.c:475 ../general/g.region/printwindow.c:250
+#: ../general/g.region/printwindow.c:506 ../general/g.region/printwindow.c:625
+#: ../display/d.where/main.c:96
+msgid "Can't get projection units of current location"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:736 ../raster/r.horizon/main.c:486
+#: ../raster/r.sun/main.c:479 ../general/g.region/printwindow.c:253
+#: ../general/g.region/printwindow.c:509 ../general/g.region/printwindow.c:628
+#: ../display/d.grid/plot.c:319 ../display/d.where/main.c:99
+#: ../ps/ps.map/do_geogrid.c:272
+msgid "Can't get projection key values of current location"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:746 ../raster/r.horizon/main.c:496
+#: ../raster/r.sun/main.c:489 ../display/d.grid/plot.c:326
+#: ../display/d.grid/plot.c:353 ../display/d.where/main.c:106
+#: ../display/d.where/main.c:132 ../ps/ps.map/do_geogrid.c:278
+msgid "Unable to set up lat/long projection parameters"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:750
+msgid "latin and longin raster maps have no effect when in a Lat/Lon location"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:755
+msgid "Both latin and longin raster maps must be given, or neither"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:949
+#, c-format
+msgid "Horizon file no. %d <%s> not found"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:61
+msgid "Converts a raster map layer into an ASCII text file."
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:78
+msgid "Name for output ASCII grid map (use out=- for stdout)"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:92
+msgid ""
+"Number of values printed before wrapping a line (only SURFER or MODFLOW "
+"format)"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:100
+msgid "String to represent null cell (GRASS grid only)"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:108
+msgid "Write SURFER (Golden Software) ASCII grid"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:112
+msgid "Write MODFLOW (USGS) ASCII array"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:116
+msgid "Force output of integer values"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:123
+msgid "Failed to interpret dp as an integer"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:125 ../raster3d/r3.out.vtk/main.c:391
+msgid "dp has to be from 0 to 20"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:131
+msgid "Failed to interpret width as an integer"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:137
+msgid "Both -s and -h doesn't make sense"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:140
+msgid "Use -M or -s, not both"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:181
+#, c-format
+msgid "Unable to read fp range for <%s>"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:197
+#, c-format
+msgid "Read failed at row %d"
+msgstr ""
+
+#: ../raster/r.random.surface/save.c:219 ../imagery/i.pca/support.c:27
+#, c-format
+msgid "Unable to write color table for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.random.surface/main.c:43
+msgid "raster, random, surface"
+msgstr ""
+
+#: ../raster/r.random.surface/main.c:45
+msgid "Generates random surface(s) with spatial dependence."
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:40
+msgid "Name for output raster map(s)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:58
+msgid "Maximum distance of spatial correlation (value >= 0.0)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:67
+msgid "Distance decay exponent (value > 0.0)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:76
+msgid "Distance filter remains flat before beginning exponent"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:84
+msgid "Random seed (SEED_MIN >= value >= SEED_MAX) (default: random)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:91
+msgid "Maximum cell value of distribution"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:96
+msgid "Uniformly distributed cell values"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:101
+msgid "No (quiet) description during run"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:163
+#, c-format
+msgid "High (%d) must be greater than 1"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:173
+#, c-format
+msgid "Rastar map <%s> repeated, maps must be unique"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:183
+msgid "Output raster map required"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:205
+#, c-format
+msgid "Seed (%d) larger than maximum (%d)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:208 ../raster/r.random.surface/init.c:217
+#, c-format
+msgid " seed is set to %d"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:213
+#, c-format
+msgid "Seed (%d) smaller than minimum (%d)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:256
+#, c-format
+msgid "Distance value (%d): %lf must be >= 0.0"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:285
+#, c-format
+msgid "Exponent value (%lf) must be > 0.0"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:309
+#, c-format
+msgid "Flat value (%lf) must be less than distance value (%lf)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:330
+msgid "Must have a distance value for each filter"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:362
+msgid "Must have a exponent value for each filter"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:379
+msgid "Must have a weight value for each filter"
+msgstr ""
+
+#: ../raster/r.lake/main.c:79
+#, c-format
+msgid "Failed writing output raster map row %d"
+msgstr ""
+
+#: ../raster/r.lake/main.c:151
+msgid "Fills lake at given point to given level."
+msgstr ""
+
+#: ../raster/r.lake/main.c:156
+msgid "Name of terrain raster map (DEM)"
+msgstr ""
+
+#: ../raster/r.lake/main.c:163
+msgid "Water level"
+msgstr ""
+
+#: ../raster/r.lake/main.c:170
+msgid "Name for output raster map with lake"
+msgstr ""
+
+#: ../raster/r.lake/main.c:177
+msgid "Seed point coordinates"
+msgstr ""
+
+#: ../raster/r.lake/main.c:187
+msgid "Name of raster map with given starting point(s) (at least 1 cell > 0)"
+msgstr ""
+
+#: ../raster/r.lake/main.c:195
+msgid "Use negative depth values for lake raster map"
+msgstr ""
+
+#: ../raster/r.lake/main.c:200
+msgid "Overwrite seed map with result (lake) map"
+msgstr ""
+
+#: ../raster/r.lake/main.c:206
+msgid "Both seed map and coordinates cannot be specified"
+msgstr ""
+
+#: ../raster/r.lake/main.c:209
+msgid "Seed map or seed coordinates must be set!"
+msgstr ""
+
+#: ../raster/r.lake/main.c:212
+msgid "Seed coordinates and output map lake= must be set!"
+msgstr ""
+
+#: ../raster/r.lake/main.c:215
+msgid "Both lake and overwrite cannot be specified"
+msgstr ""
+
+#: ../raster/r.lake/main.c:218
+msgid "Output lake map or overwrite flag must be set!"
+msgstr ""
+
+#: ../raster/r.lake/main.c:248
+msgid "Seed point outside the current region"
+msgstr ""
+
+#: ../raster/r.lake/main.c:277
+msgid "G_malloc: out of memory"
+msgstr ""
+
+#: ../raster/r.lake/main.c:303
+msgid ""
+"Given water level at seed point is below earth surface. Increase water level "
+"or move seed point."
+msgstr ""
+
+#: ../raster/r.lake/main.c:386
+#, c-format
+msgid "Lake depth from %f to %f"
+msgstr ""
+
+#: ../raster/r.lake/main.c:387
+#, c-format
+msgid "Lake area %f square meters"
+msgstr ""
+
+#: ../raster/r.lake/main.c:388
+#, c-format
+msgid "Lake volume %f cubic meters"
+msgstr ""
+
+#: ../raster/r.lake/main.c:389
+msgid "Volume is correct only if lake depth (terrain raster map) is in meters"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:62
+msgid "Computing histogram"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:96
+msgid "Computing bins"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:133
+msgid "Binning data"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:178
+msgid "Sorting bins"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:188
+msgid "Computing quantiles"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:255
+msgid "Compute quantiles using two passes."
+msgstr ""
+
+#: ../raster/r.quantile/main.c:263
+msgid "Number of quantiles"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:271
+msgid "List of percentiles"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:277
+msgid "Number of bins to use"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:282
+msgid "Generate recode rules based on quantile-defined intervals."
+msgstr ""
+
+#: ../raster/r.surf.idw/main.c:69 ../raster/r.surf.idw2/main.c:60
+#: ../raster/r.surf.contour/main.c:52
+msgid "raster, interpolation"
+msgstr ""
+
+#: ../raster/r.surf.idw/main.c:71
+msgid "Surface interpolation utility for raster map."
+msgstr ""
+
+#: ../raster/r.surf.idw/main.c:81 ../raster/r.surf.idw2/main.c:72
+#: ../vector/v.surf.idw/main.c:113
+msgid "Number of interpolation points"
+msgstr ""
+
+#: ../raster/r.surf.idw/main.c:86
+msgid "Output is the interpolation error"
+msgstr ""
+
+#: ../raster/r.surf.idw/main.c:92
+#, c-format
+msgid "Illegal value for '%s' (%s)"
+msgstr ""
+
+#: ../raster/r.surf.idw/main.c:233
+#, c-format
+msgid "Interpolating raster map <%s> (%d rows)... "
+msgstr ""
+
+#: ../raster/r.surf.idw/main.c:241
+msgid "Cannot read row"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:48
+msgid "Watershed basin creation program."
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:55 ../raster/r.random/main.c:57
+#: ../raster/r.out.bin/main.c:289
+#: ../locale/scriptstrings/r.colors.stddev_to_translate.c:3
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:3
+#: ../locale/scriptstrings/r.out.xyz_to_translate.c:3
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:3
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:5
+#: ../imagery/i.zc/main.c:69
+msgid "Name of input raster map"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:62 ../raster/r.walk/main.c:206
+msgid "Name of raster map to contain results"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:70
+msgid "The map E grid coordinates"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:78
+msgid "The map N grid coordinates"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:92
+#, c-format
+msgid "Illegal east coordinate <%s>\n"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:97
+#, c-format
+msgid "Illegal north coordinate <%s>\n"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:104
+#, c-format
+msgid ""
+"Warning, ignoring point outside window: \n"
+"    %.4f,%.4f\n"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:121
+msgid "Unable to open drainage pointer map"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:146
+msgid "Unable to open new basin map"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:159
+msgid "Unable to close new basin map layer"
+msgstr ""
+
+#: ../raster/r.report/stats.c:65
+#, c-format
+msgid "Unable to open result file <%s>"
+msgstr ""
+
+#: ../raster/r.report/stats.c:99 ../raster/r.kappa/stats.c:13
+msgid "Problem reading r.stats output"
+msgstr ""
+
+#: ../raster/r.report/main.c:65
+msgid "Reports statistics for raster map layers."
+msgstr ""
+
+#: ../raster/r.report/label.c:13
+msgid "Page width is too small"
+msgstr ""
+
+#: ../raster/r.report/parse.c:37
+msgid "Raster map(s) to report on"
+msgstr ""
+
+#: ../raster/r.report/parse.c:44 ../vector/v.to.db/parse.c:85
+msgid "Units"
+msgstr ""
+
+#: ../raster/r.report/parse.c:46
+msgid ""
+"mi;miles;me;meters;k;kilometers;a;acres;h;hectares;c;cell counts;p;percent "
+"cover"
+msgstr ""
+
+#: ../raster/r.report/parse.c:56
+msgid "Character representing no data cell value"
+msgstr ""
+
+#: ../raster/r.report/parse.c:57 ../raster/r.report/parse.c:66
+#: ../raster/r.report/parse.c:75 ../raster/r.report/parse.c:100
+#: ../raster/r.report/parse.c:105 ../raster/r.report/parse.c:110
+msgid "Formatting"
+msgstr ""
+
+#: ../raster/r.report/parse.c:63
+#, c-format
+msgid "Page length (default: %d lines)"
+msgstr ""
+
+#: ../raster/r.report/parse.c:72
+#, c-format
+msgid "Page width (default: %d characters)"
+msgstr ""
+
+#: ../raster/r.report/parse.c:82
+msgid "Name of an output file to hold the report"
+msgstr ""
+
+#: ../raster/r.report/parse.c:99
+msgid "Suppress page headers"
+msgstr ""
+
+#: ../raster/r.report/parse.c:104
+msgid "Use formfeeds between pages"
+msgstr ""
+
+#: ../raster/r.report/parse.c:109
+msgid "Scientific format"
+msgstr ""
+
+#: ../raster/r.report/parse.c:114
+msgid "Filter out all no data cells"
+msgstr ""
+
+#: ../raster/r.report/parse.c:118
+msgid "Filter out cells where all maps have no data"
+msgstr ""
+
+#: ../raster/r.report/parse.c:170
+msgid "nsteps has to be > 0; using nsteps=255"
+msgstr ""
+
+#: ../raster/r.report/parse.c:177
+msgid "Illegal page length"
+msgstr ""
+
+#: ../raster/r.report/parse.c:184
+msgid "Illegal page width"
+msgstr ""
+
+#: ../raster/r.report/parse.c:223
+#, c-format
+msgid "Only %d unit%s allowed"
+msgstr ""
+
+#: ../raster/r.report/parse.c:256
+#, c-format
+msgid "Unable to read fp range for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.le/r.le.patch/main.c:47 ../raster/r.le/r.le.trace/main.c:57
+#: ../raster/r.le/r.le.setup/main.c:61 ../raster/r.le/r.le.pixel/main.c:45
+#: ../raster/r.li/r.li.mpa/mpa.c:38 ../raster/r.li/r.li.patchdensity/main.c:34
+#: ../raster/r.li/r.li.patchnum/main.c:35 ../raster/r.li/r.li.shape/main.c:33
+#: ../raster/r.li/r.li.padsd/padsd.c:36
+#: ../raster/r.li/r.li.edgedensity/edgedensity.c:38
+#: ../raster/r.li/r.li.padcv/padcv.c:38 ../raster/r.li/r.li.mps/mps.c:40
+#: ../raster/r.li/r.li.padrange/padrange.c:38
+#: ../raster/r.li/r.li.cwed/cwed.c:45
+msgid "raster, landscape structure analysis, patch index"
+msgstr ""
+
+#: ../raster/r.le/r.le.patch/main.c:49
+msgid ""
+"Calculates attribute, patch size, core (interior) size, shape, fractal "
+"dimension, and perimeter measures for sets of patches in a landscape."
+msgstr ""
+
+#: ../raster/r.le/r.le.trace/main.c:59
+msgid ""
+"Displays the boundary of each r.le patch and shows how the boundary is "
+"traced, displays the attribute, size, perimeter and shape indices for each "
+"patch and saves the data in an output file."
+msgstr ""
+
+#: ../raster/r.le/r.le.setup/main.c:63
+msgid ""
+"Interactive tool used to setup the sampling and analysis framework that will "
+"be used by the other r.le programs."
+msgstr ""
+
+#: ../raster/r.le/r.le.setup/main.c:67
+msgid "Raster map to use to setup sampling"
+msgstr ""
+
+#: ../raster/r.le/r.le.setup/main.c:71
+msgid "Vector map to overlay"
+msgstr ""
+
+#: ../raster/r.le/r.le.setup/sample.c:1050
+msgid "Cannot read vector"
+msgstr ""
+
+#: ../raster/r.le/r.le.pixel/main.c:47
+msgid ""
+"Contains a set of measures for attributes, diversity, texture, "
+"juxtaposition, and edge."
+msgstr ""
+
+#: ../raster/r.sum/main.c:47
+msgid "Sums up the raster cell values."
+msgstr ""
+
+#: ../raster/r.sum/main.c:54
+msgid "Name of incidence or density file."
+msgstr ""
+
+#: ../raster/r.distance/report.c:41
+msgid "Processing..."
+msgstr ""
+
+#: ../raster/r.distance/main.c:38
+msgid "raster, distance"
+msgstr ""
+
+#: ../raster/r.distance/main.c:40
+msgid "Locates the closest points between objects in two raster maps."
+msgstr ""
+
+#: ../raster/r.distance/edges.c:42
+#, c-format
+msgid "Reading map %s ..."
+msgstr ""
+
+#: ../raster/r.distance/parse.c:41
+msgid "Maps for computing inter-class distances"
+msgstr ""
+
+#: ../raster/r.distance/parse.c:54
+msgid "Include category labels in the output"
+msgstr ""
+
+#: ../raster/r.distance/parse.c:59
+msgid "Report zero distance if rasters are overlapping"
+msgstr ""
+
+#: ../raster/r.distance/distance.c:99
+#, c-format
+msgid "Reading maps  <%s,%s> while finding 0 distance ..."
+msgstr ""
+
+#: ../raster/r.out.gridatb/main.c:46
+msgid "Exports GRASS raster map to GRIDATB.FOR map file (TOPMODEL)"
+msgstr ""
+
+#: ../raster/r.out.gridatb/main.c:50
+msgid "Input map"
+msgstr ""
+
+#: ../raster/r.out.gridatb/main.c:63
+msgid "Overwrite output map file"
+msgstr ""
+
+#: ../raster/r.out.gridatb/file_io.c:38
+msgid "Setting window header"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:65
+#: ../raster/r.out.gdal/export_band.c:373
+msgid "Unable to allocate buffer for reading raster map"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:186
+#, c-format
+msgid ""
+"Input raster map contains cells with NULL-value (no-data). The value %d will "
+"be used to represent no-data values in the input map. You can specify a "
+"nodata value with the %s option."
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:191
+#, c-format
+msgid ""
+"Input raster map contains cells with NULL-value (no-data). The value %f will "
+"be used to represent no-data values in the input map. You can specify a "
+"nodata value with the %s option."
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:201
+#, c-format
+msgid ""
+"The default nodata value is present in rasterband <%s> and would lead to "
+"data loss. Please specify a custom nodata value with the %s parameter."
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:208
+#, c-format
+msgid ""
+"The user given nodata value %g is present in rasterband <%s> and would lead "
+"to data loss. Please specify a different nodata value with the %s parameter."
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:254
+msgid "Unable to get raster band"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:414
+#: ../raster/r.out.gdal/export_band.c:447
+#: ../raster/r.out.gdal/export_band.c:480
+msgid "Unable to write GDAL raster file"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:498
+#: ../raster/r.out.gdal/export_band.c:510
+#: ../raster/r.out.gdal/export_band.c:523
+#: ../raster/r.out.gdal/export_band.c:536
+#: ../raster/r.out.gdal/export_band.c:548
+#: ../raster/r.out.gdal/export_band.c:561
+#: ../raster/r.out.gdal/export_band.c:575 ../raster/r.out.gdal/main.c:631
+#: ../raster/r.out.gdal/main.c:643 ../raster/r.out.gdal/main.c:656
+#: ../raster/r.out.gdal/main.c:669 ../raster/r.out.gdal/main.c:681
+#: ../raster/r.out.gdal/main.c:694
+msgid "Selected GDAL datatype does not cover data range."
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:499
+#: ../raster/r.out.gdal/export_band.c:511
+#: ../raster/r.out.gdal/export_band.c:524
+#: ../raster/r.out.gdal/export_band.c:537 ../raster/r.out.gdal/main.c:632
+#: ../raster/r.out.gdal/main.c:644 ../raster/r.out.gdal/main.c:657
+#: ../raster/r.out.gdal/main.c:670
+#, c-format
+msgid "GDAL datatype: %s, range: %d - %d"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:502
+#: ../raster/r.out.gdal/export_band.c:514
+#: ../raster/r.out.gdal/export_band.c:527
+#: ../raster/r.out.gdal/export_band.c:540
+#: ../raster/r.out.gdal/export_band.c:552
+#: ../raster/r.out.gdal/export_band.c:565
+#: ../raster/r.out.gdal/export_band.c:579
+#, c-format
+msgid "Raster map <%s> range: %g - %g"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:549 ../raster/r.out.gdal/main.c:682
+#, c-format
+msgid "GDAL datatype: %s, range: %u - %u"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:562
+#: ../raster/r.out.gdal/export_band.c:576 ../raster/r.out.gdal/main.c:695
+#, c-format
+msgid "GDAL datatype: %s, range: %g - %g"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:49
+#, c-format
+msgid "Supported formats:\n"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:127
+msgid "Exports GRASS raster maps into GDAL supported formats."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:132
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:3
+msgid "List supported output formats"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:137
+msgid "Do not write GDAL standard colortable"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:138
+msgid "Only applicable to Byte or UInt16 data types."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:142
+msgid "Force raster export despite any warnings of data loss"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:143
+msgid "Overrides nodata safety check."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:147
+msgid "Name of raster map (or group) to export"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:154
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:6
+msgid "GIS format to write (case sensitive, see also -l flag)"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:175
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:7
+msgid "File type"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:183
+msgid "Name for output raster file"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:190
+msgid "Creation option(s) to pass to the output format driver"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:192
+#: ../locale/scriptstrings/d.out.file_to_translate.c:21
+msgid "In the form of \"NAME=VALUE\", separate multiple entries with a comma."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:199
+msgid "Metadata key(s) and value(s) to include"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:201
+msgid ""
+"In the form of \"META-TAG=VALUE\", separate multiple entries with a comma. "
+"Not supported by all output format drivers."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:210
+msgid "Assign a specified nodata value to output bands"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:230 ../raster/r.in.gdal/main.c:219
+#: ../raster/r.proj/main.c:264 ../raster/r.proj.seg/main.c:299
+#: ../vector/v.proj/main.c:181 ../vector/v.select/main.c:90
+#: ../vector/v.in.ogr/main.c:277 ../vector/v.in.ogr/main.c:333
+#, c-format
+msgid "Required parameter <%s> not set"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:243
+#, c-format
+msgid "Raster map or group <%s> not found"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:247
+#, c-format
+msgid "No raster maps in group <%s>"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:261
+#, c-format
+msgid "Unable to get <%s> driver"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:267
+#, c-format
+msgid ""
+"Driver <%s> does not support direct writing. Using MEM driver for "
+"intermediate dataset."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:272
+msgid "Unable to get in-memory raster driver"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:276
+#, c-format
+msgid "Driver <%s> does not support creating rasters"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:352
+#, c-format
+msgid "Could not read data range of raster <%s>"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:409
+#, c-format
+msgid "Exporting to GDAL data type: %s"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:424
+msgid "Raster export would result in complete data loss, aborting."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:435
+#, c-format
+msgid ""
+"Precision loss: Raster map <%s> of type %s to be exported as %s. This can be "
+"avoided by using %s."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:446
+#, c-format
+msgid ""
+"Precision loss: The range of <%s> can not be accurately preserved with GDAL "
+"datatype Float32. This can be avoided by exporting to Int32 or Float64."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:454
+#, c-format
+msgid ""
+"Precision loss: Float32 can not preserve the DCELL precision of raster <%s>. "
+"This can be avoided by using Float64"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:482 ../raster/r.out.gdal/main.c:511
+#: ../raster/r.out.gdal/main.c:515
+msgid "Raster export aborted."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:492
+msgid "Checking GDAL data type and nodata value"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:495
+#, c-format
+msgid "Checking options for raster map <%s> (band %d)..."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:509
+msgid "Forcing raster export."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:536
+msgid "Output file name not specified"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:542
+msgid "Unable to create dataset using memory raster driver"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:551
+#, c-format
+msgid "Unable to create <%s> dataset using <%s> driver"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:566
+msgid "Unable to set geo transform"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:574
+msgid "Unable to set projection"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:580
+msgid "Exporting to GDAL raster"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:583
+#, c-format
+msgid "Exporting raster map <%s> (band %d)..."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:596
+#, c-format
+msgid "Unable to export raster map <%s>"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:608
+#, c-format
+msgid "Unable to create raster map <%s> using driver <%s>"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:635 ../raster/r.out.gdal/main.c:647
+#: ../raster/r.out.gdal/main.c:660 ../raster/r.out.gdal/main.c:673
+#: ../raster/r.out.gdal/main.c:685
+#, c-format
+msgid "Range to be exported: %f - %f"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:698
+#, c-format
+msgid "Range to be exported: %g - %g"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:722 ../raster/r.out.gdal/main.c:735
+#: ../raster/r.out.gdal/main.c:749 ../raster/r.out.gdal/main.c:762
+#: ../raster/r.out.gdal/main.c:777
+#, c-format
+msgid ""
+"Mismatch between metadata nodata value and actual nodata value in exported "
+"raster: specified nodata value %f gets converted to %d by selected GDAL "
+"datatype."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:725 ../raster/r.out.gdal/main.c:752
+#: ../raster/r.out.gdal/main.c:780
+#, c-format
+msgid "GDAL datatype: %s, valid range: %d - %d"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:738 ../raster/r.out.gdal/main.c:765
+#, c-format
+msgid "GDAL datatype: %s, valid range: %u - %u"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:791
+#, c-format
+msgid ""
+"Mismatch between metadata nodata value and actual nodata value in exported "
+"raster: specified nodata value %g gets converted to %g by selected GDAL "
+"datatype."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:794
+#, c-format
+msgid "GDAL datatype: %s, valid range: %g - %g"
+msgstr ""
+
+#: ../raster/r.random/count.c:74
+msgid "Collecting Stats..."
+msgstr ""
+
+#: ../raster/r.random/count.c:78
+#, c-format
+msgid "Cannot read raster row [%d]"
+msgstr ""
+
+#: ../raster/r.random/count.c:82
+#, c-format
+msgid "Cannot read cover raster row [%d]"
+msgstr ""
+
+#: ../raster/r.random/count.c:131
+msgid "Programmer error in get_stats/switch"
+msgstr ""
+
+#: ../raster/r.random/random.c:74 ../raster/r.to.vect/main.c:159
+#: ../raster/r.contour/main.c:185 ../doc/vector/v.example/main.c:128
+#: ../display/d.thematic.area/plot1.c:202 ../display/d.vect/area.c:60
+#: ../display/d.vect/plot1.c:211 ../display/d.vect/attr.c:45
+#: ../display/d.vect.chart/plot.c:44 ../ps/ps.map/catval.c:54
+#: ../ps/ps.map/catval.c:116 ../ps/ps.map/catval.c:182
+#: ../vector/v.in.dxf/write_vect.c:198 ../vector/v.extrude/main.c:168
+#: ../vector/v.label/main.c:282 ../vector/v.transform/trans_digit.c:64
+#: ../vector/v.in.ascii/in.c:317 ../vector/v.surf.rst/main.c:607
+#: ../vector/v.info/main.c:217 ../vector/v.out.ogr/main.c:634
+#: ../vector/v.out.ascii/b2a.c:52 ../vector/v.out.svg/main.c:162
+#: ../vector/v.sample/main.c:207 ../vector/v.net.distance/main.c:196
+#: ../vector/v.vol.rst/main.c:590 ../vector/v.vol.rst/user1.c:97
+#: ../vector/v.buffer2/main.c:334 ../vector/v.patch/main.c:132
+#: ../vector/v.patch/main.c:162 ../vector/v.patch/main.c:274
+#: ../vector/v.patch/main.c:332 ../vector/v.in.sites/main.c:163
+#: ../vector/v.net.path/path.c:96 ../vector/v.to.points/main.c:285
+#: ../vector/v.label.sa/labels.c:83 ../vector/v.db.select/main.c:155
+#: ../vector/v.db.select/main.c:286 ../vector/v.surf.idw/read_sites.c:39
+#: ../vector/v.net.allpairs/main.c:141 ../vector/v.drape/main.c:293
+#: ../vector/v.buffer/main.c:387 ../vector/v.mkgrid/main.c:237
+#: ../vector/v.extract/main.c:291 ../vector/v.out.vtk/writeVTK.c:640
+#: ../vector/v.to.rast3/main.c:86 ../vector/v.distance/main.c:364
+#: ../vector/v.distance/main.c:401 ../vector/v.to.db/query.c:89
+#: ../vector/v.to.db/update.c:46 ../vector/v.in.dwg/main.c:194
+#: ../vector/v.to.3d/trans3.c:54 ../vector/v.to.3d/trans2.c:52
+#: ../vector/v.overlay/main.c:202 ../vector/v.overlay/main.c:353
+#: ../vector/v.net.flow/main.c:157 ../vector/v.normal/main.c:141
+#: ../vector/v.edit/select.c:521 ../vector/v.what.rast/main.c:133
+#: ../vector/v.kcv/main.c:181 ../vector/v.in.db/main.c:119
+#: ../vector/lidar/v.surf.bspline/main.c:335
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:128
+#: ../vector/v.lrs/v.lrs.create/main.c:287
+#: ../vector/v.lrs/v.lrs.create/main.c:295 ../vector/v.reclass/main.c:127
+#: ../vector/v.to.rast/vect2rast.c:56 ../vector/v.to.rast/support.c:129
+#: ../vector/v.to.rast/support.c:293 ../vector/v.to.rast/support.c:443
+#: ../vector/v.db.connect/main.c:218 ../vector/v.db.connect/main.c:326
+#: ../vector/v.net.timetable/main.c:93 ../vector/v.net.components/main.c:137
+#: ../vector/v.net.centrality/main.c:220 ../vector/v.random/main.c:168
+#, c-format
+msgid "Unable to open database <%s> by driver <%s>"
+msgstr ""
+
+#: ../raster/r.random/random.c:100
+msgid "Cannot create new table"
+msgstr ""
+
+#: ../raster/r.random/random.c:110
+#, c-format
+msgid "Writing raster map <%s> and vector map <%s> ..."
+msgstr ""
+
+#: ../raster/r.random/random.c:113
+#, c-format
+msgid "Writing raster map <%s> ..."
+msgstr ""
+
+#: ../raster/r.random/random.c:115
+#, c-format
+msgid "Writing vector map <%s> ..."
+msgstr ""
+
+#: ../raster/r.random/random.c:129
+#, c-format
+msgid "Cannot read raster row [%d] from raster map <%s>"
+msgstr ""
+
+#: ../raster/r.random/random.c:135
+#, c-format
+msgid "Cannot read raster row [%d] from cover raster map <%s>"
+msgstr ""
+
+#: ../raster/r.random/random.c:194 ../vector/v.digit/attr.c:157
+#: ../vector/v.net.distance/main.c:256 ../vector/v.net.path/path.c:309
+#: ../vector/v.net.allpairs/main.c:241 ../vector/v.net.flow/main.c:244
+#: ../vector/v.net.timetable/main.c:134 ../vector/v.net.timetable/main.c:156
+#: ../vector/v.net.components/main.c:38 ../vector/v.net.centrality/main.c:69
+#, c-format
+msgid "Cannot insert new record: %s"
+msgstr ""
+
+#: ../raster/r.random/random.c:246
+#, c-format
+msgid "Only [%ld] random points created"
+msgstr ""
+
+#: ../raster/r.random/main.c:51 ../raster/r.surf.random/main.c:44
+msgid "raster, random"
+msgstr ""
+
+#: ../raster/r.random/main.c:53
+msgid ""
+"Creates a raster map layer and vector point map containing randomly located "
+"points."
+msgstr ""
+
+#: ../raster/r.random/main.c:62 ../raster/r.median/main.c:58
+msgid "Name of cover raster map"
+msgstr ""
+
+#: ../raster/r.random/main.c:69
+msgid "The number of points to allocate"
+msgstr ""
+
+#: ../raster/r.random/main.c:81
+msgid "Generate points also for NULL category"
+msgstr ""
+
+#: ../raster/r.random/main.c:86
+msgid "Report information about input raster and exit"
+msgstr ""
+
+#: ../raster/r.random/main.c:90
+msgid "Generate vector points as 3D points"
+msgstr ""
+
+#: ../raster/r.random/main.c:94 ../vector/v.in.ascii/in.c:161
+msgid "Do not build topology in points mode"
+msgstr ""
+
+#: ../raster/r.random/main.c:95
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:18
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:20
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:23
+#: ../vector/v.transform/main.c:116 ../vector/v.in.ascii/in.c:84
+#: ../vector/v.in.ascii/in.c:91 ../vector/v.in.ascii/in.c:103
+#: ../vector/v.in.ascii/in.c:113 ../vector/v.in.ascii/in.c:123
+#: ../vector/v.in.ascii/in.c:133 ../vector/v.in.ascii/in.c:157
+#: ../vector/v.in.ascii/in.c:162 ../vector/v.in.ascii/in.c:168
+#: ../vector/v.out.ascii/out.c:67 ../vector/v.out.ascii/out.c:77
+#: ../vector/v.out.ascii/out.c:84 ../vector/v.out.ascii/out.c:97
+msgid "Points"
+msgstr ""
+
+#: ../raster/r.random/main.c:142
+#, c-format
+msgid "Note: one (or both) of %s and %s must be specified"
+msgstr ""
+
+#: ../raster/r.random/main.c:160
+#, c-format
+msgid "<%s=%s> invalid percentage"
+msgstr ""
+
+#: ../raster/r.random/main.c:167
+#, c-format
+msgid "<%s=%s> invalid number of points"
+msgstr ""
+
+#: ../raster/r.random/main.c:180
+#, c-format
+msgid "There aren't [%ld] cells in the current region"
+msgstr ""
+
+#: ../raster/r.random/main.c:183
+#, c-format
+msgid "There aren't [%ld] non-NULL cells in the current region"
+msgstr ""
+
+#: ../raster/r.random/main.c:188
+msgid "There are no valid locations in the current region"
+msgstr ""
+
+#: ../raster/r.topidx/main.c:39
+msgid "Creates topographic index map from elevation raster map."
+msgstr ""
+
+#: ../raster/r.topidx/main.c:42
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:3
+msgid "Input elevation map"
+msgstr ""
+
+#: ../raster/r.topidx/main.c:46
+msgid "Output topographic index map"
+msgstr ""
+
+#: ../raster/r.topidx/file_io.c:37
+#, c-format
+msgid ""
+"The current region resolution [%s x %s] is finer than the input map's "
+"resolution [%s x %s]. The current region resolution must be identical to, or "
+"coarser than, the input map's resolution."
+msgstr ""
+
+#: ../raster/r.topidx/file_io.c:44
+msgid "Reading elevation map..."
+msgstr ""
+
+#: ../raster/r.topidx/file_io.c:98
+msgid "Writing topographic index map..."
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:55
+msgid "Generates watershed subbasins raster map."
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:59
+msgid "Name of input coded stream network raster map"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:63
+msgid "Name of input thinned ridge network raster map"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:72
+msgid "Number of passes through the dataset"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:99 ../raster/r.in.gdal/main.c:233
+#, c-format
+msgid "Raster map <%s> already exists"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:131
+msgid "Forward sweep complete"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:148
+msgid "Reverse sweep complete"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:155 ../raster/r.cross/main.c:194
+#: ../raster/r.resample/main.c:152
+#, c-format
+msgid "Creating support files for <%s>..."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:81
+msgid "Import GDAL supported raster file into a binary raster map layer."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:87
+msgid "Raster file to be imported"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:100
+msgid "Band to select (default is all bands)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:106 ../raster/r.proj.seg/main.c:194
+msgid "Cache size (MiB)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:113
+msgid "Name of location to read projection from for GCPs transformation"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:122 ../raster/r.external/main.c:551
+#: ../imagery/i.landsat.toar/main.c:88 ../imagery/i.landsat.toar/main.c:108
+#: ../imagery/i.landsat.toar/main.c:118 ../imagery/i.landsat.toar/main.c:127
+#: ../imagery/i.landsat.toar/main.c:135 ../imagery/i.landsat.toar/main.c:144
+msgid "Metadata"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:128 ../vector/v.in.ogr/main.c:186
+msgid "Name for new location to create"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:134 ../raster/r.external/main.c:556
+msgid "Override projection (use location's projection)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:138 ../raster/r.external/main.c:560
+#: ../vector/v.in.ogr/main.c:234
+msgid "Extend region extents based on new dataset"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:140 ../raster/r.external/main.c:562
+#: ../vector/v.in.ogr/main.c:236
+msgid "Also updates the default region if in the PERMANENT mapset"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:144 ../raster/r.external/main.c:570
+#: ../vector/v.in.ogr/main.c:205
+msgid "List supported formats and exit"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:150
+msgid "Force Lat/Lon maps to fit into geographic coordinates (90N,S; 180E,W)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:155
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:11
+msgid "Keep band numbers instead of using band color names"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:176
+msgid "You have to specify a target location different from output location"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:180
+msgid "The '-l' flag only works in Lat/Lon locations"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:198
+msgid "Available GDAL Drivers:"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:222 ../raster/r.external/main.c:601
+msgid "Name for output raster map not specified"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:230
+#, c-format
+msgid "Raster map <%s> already exists and will be overwritten"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:250
+msgid ""
+"The polynomial rectification used in i.rectify does not work well with NOAA/"
+"AVHRR data. Try using gdalwarp with thin plate spline rectification instead. "
+"(-tps)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:266
+msgid ""
+"Input raster map is flipped or rotated - cannot import. You may use "
+"'gdalwarp' to transform the map to North-up."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:308
+msgid ""
+"Map bounds have been constrained to geographic coordinates. You will almost "
+"certainly want to check map bounds and resolution with r.info and reset them "
+"with r.region before going any further."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:328
+msgid ""
+"Unable to convert input map projection to GRASS format; cannot create new "
+"location."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:334 ../general/g.proj/create.c:15
+#, c-format
+msgid "Location <%s> created"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:341 ../raster/r.external/main.c:83
+msgid ""
+"Unable to convert input raster map projection information to GRASS format "
+"for checking"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:357 ../raster/r.external/main.c:99
+#: ../vector/v.in.ogr/main.c:518
+msgid "Over-riding projection check"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:367 ../raster/r.external/main.c:107
+#: ../vector/v.in.ogr/main.c:527
+msgid ""
+"Projection of dataset does not appear to match current location.\n"
+"\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:372 ../raster/r.external/main.c:112
+msgid "Location PROJ_INFO is:\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:383 ../raster/r.external/main.c:123
+msgid "Dataset PROJ_INFO is:\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:419 ../raster/r.external/main.c:150
+#: ../vector/v.in.ogr/main.c:543 ../vector/v.in.ogr/main.c:550
+msgid "Import dataset PROJ_INFO is:\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:441
+msgid ""
+"\n"
+"You can use the -o flag to r.in.gdal to override this check and use the "
+"location definition for the dataset.\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:444 ../raster/r.external/main.c:175
+msgid ""
+"Consider generating a new location from the input dataset using the "
+"'location' parameter.\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:449 ../raster/r.external/main.c:180
+#: ../vector/v.in.ogr/main.c:601
+msgid "Projection of input dataset and current location appear to match"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:455 ../raster/r.external/main.c:630
+msgid "Proceeding with import..."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:481 ../raster/r.external/main.c:645
+#, c-format
+msgid "Selected band (%d) does not exist"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:560
+#, c-format
+msgid "Copying %d GCPS in points file for <%s>"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:565
+msgid "GCPs have the following OpenGIS WKT Coordinate System:"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:572
+msgid "Re-projecting GCPs table:"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:573
+#, c-format
+msgid "* Input projection for GCP table: %s"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:575
+#, c-format
+msgid "* Output projection for GCP table: %s"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:592
+#, c-format
+msgid "Error in pj_do_proj (can't re-projection GCP %i)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:633 ../raster/r.external/main.c:264
+#: ../vector/v.in.ogr/main.c:1263
+msgid "Default region for this location updated"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:636 ../raster/r.external/main.c:267
+#: ../vector/v.in.ogr/main.c:1266
+msgid "Region for the current mapset updated"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:664
+msgid "Unable to translate projection key values of input GCPs"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:680
+msgid "Unable to get projection info of target location"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:682
+msgid "Unable to get projection units of target location"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:684
+msgid "Unable to get projection key values of target location"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:687
+#: ../imagery/i.ortho.photo/i.photo.rectify/target.c:31
+#: ../imagery/i.rectify/target.c:32
+#, c-format
+msgid "Mapset <%s> in target location <%s> - "
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:689 ../raster/r.proj/main.c:245
+#: ../raster/r.proj.seg/main.c:280
+#: ../imagery/i.ortho.photo/i.photo.rectify/target.c:32
+#: ../imagery/i.rectify/target.c:33
+msgid "permission denied"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:690 ../raster/r.proj/main.c:246
+#: ../raster/r.proj.seg/main.c:281
+#: ../imagery/i.ortho.photo/i.photo.rectify/target.c:32
+#: ../imagery/i.rectify/target.c:33
+msgid "not found"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:989
+#, c-format
+msgid "Setting grey color table for <%s> (8bit, full range)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:1002
+#, c-format
+msgid "Setting grey color table for <%s> (16bit, image range)"
+msgstr ""
+
+#: ../raster/r.to.vect/lines_io.c:76
+msgid "write_line:  found half a loop!"
+msgstr ""
+
+#: ../raster/r.to.vect/lines_io.c:128
+#, c-format
+msgid ""
+"write_line: line terminated unexpectedly\n"
+"  previous (%d) point %p (%d,%d,%d) %p %p"
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:69
+msgid "Extracting lines..."
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:493
+msgid ""
+"Raster map is not thinned properly.\n"
+"Please run r.thin."
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:567
+msgid "join_lines: p front pointer not NULL!"
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:573
+msgid "join_lines: q front pointer not NULL!"
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:591
+msgid "extend line:  p is NULL"
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:617
+msgid "extend_lines: p front pointer not NULL!"
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:624
+msgid "extend_lines: q back pointer not NULL!"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:51
+msgid "raster, conversion, vectorization"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:52
+msgid "Converts a raster map into a vector map layer."
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:65
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:6
+#: ../vector/v.net.bridge/main.c:63 ../vector/v.vect.stats/main.c:145
+#: ../vector/v.to.db/parse.c:36
+msgid "Feature type"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:69
+msgid "Smooth corners of area features"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:74
+msgid "Use raster values as categories instead of unique sequence (CELL only)"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:75 ../raster/r.to.vect/main.c:82
+#: ../vector/v.digit/line.c:86 ../vector/v.digit/attr.c:539
+#: ../vector/v.digit/attr.c:575 ../vector/v.transform/main.c:185
+#: ../vector/v.transform/main.c:196 ../vector/v.to.rast/main.c:72
+#: ../vector/v.to.rast/main.c:78 ../vector/v.to.rast/main.c:84
+#: ../vector/v.in.ogr/main.c:196 ../vector/v.in.ogr/main.c:219
+#: ../vector/v.in.ogr/main.c:242
+msgid "Attributes"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:80
+msgid ""
+"Write raster values as z coordinate. Table is not created. Currently "
+"supported only for points."
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:87
+msgid "Do not build vector topology (use with care for massive point export)"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:92
+msgid "Quiet - Do not show progress"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:110
+msgid "z flag is supported only for points"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:124
+msgid ""
+"Raster is not CELL, '-v' flag ignored, raster values will be written to the "
+"table."
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:195 ../vector/v.in.dxf/write_vect.c:218
+#: ../vector/v.in.ascii/in.c:386 ../vector/v.in.sites/main.c:170
+#: ../vector/v.mkgrid/main.c:255 ../vector/v.lrs/v.lrs.create/main.c:326
+#: ../vector/v.random/main.c:193
+#, c-format
+msgid "Unable to create table: %s"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:199 ../vector/v.mkgrid/main.c:259
+#: ../vector/v.overlay/main.c:530
+msgid "Unable to create index"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:204 ../raster/r.contour/main.c:206
+#: ../vector/v.in.dxf/write_vect.c:223 ../vector/v.in.ascii/in.c:395
+#: ../vector/v.sample/main.c:223 ../vector/v.convert/att.c:90
+#: ../vector/v.in.sites/main.c:179 ../vector/v.to.points/main.c:306
+#: ../vector/v.mkgrid/main.c:263 ../vector/v.distance/main.c:840
+#: ../vector/v.in.dwg/main.c:228 ../vector/v.overlay/main.c:535
+#: ../vector/v.reclass/main.c:302 ../vector/v.in.ogr/main.c:807
+#: ../vector/v.random/main.c:204
+#, c-format
+msgid "Unable to grant privileges on table <%s>"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:274
+#, c-format
+msgid "Unable to insert into table: %s"
+msgstr ""
+
+#: ../raster/r.to.vect/areas_io.c:105
+#, c-format
+msgid ""
+"Line terminated unexpectedly\n"
+"previous (%d) point %p (%d,%d,%d) %p %p"
+msgstr ""
+
+#: ../raster/r.to.vect/areas_io.c:371 ../raster/r.to.vect/util.c:156
+#: ../vector/v.in.ogr/main.c:939 ../vector/v.random/main.c:300
+#, c-format
+msgid "Cannot insert new row: %s"
+msgstr ""
+
+#: ../raster/r.to.vect/areas.c:119
+msgid "Extracting areas..."
+msgstr ""
+
+#: ../raster/r.to.vect/points.c:35
+msgid "Extracting points..."
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:57
+msgid "Simulates TOPMODEL which is a physically based hydrologic model."
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:63
+msgid "(i)   Basin map created by r.water.outlet (MASK)"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:70
+msgid "(i)   Elevation map"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:77
+msgid "(o)   Depressionless elevation map"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:85
+msgid "(o)   Direction map for depressionless elevation map"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:92
+msgid "(o/i) Basin elevation map (MASK applied)"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:100
+msgid "(o)   Topographic index ln(a/tanB) map (MASK applied)"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:108
+msgid "(i)   Number of topographic index classes"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:116
+msgid "(o/i) Topographic index statistics file"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:122
+msgid "(i)   TOPMODEL Parameters file"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:129
+msgid "(i)   Rainfall and potential evapotranspiration data file"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:135
+msgid "(o)   Output file"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:141
+msgid "(i)   OPTIONAL Observed flow file"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:148
+msgid "(i)   OPTIONAL Output for given time step"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:155
+msgid "(i)   OPTIONAL Output for given topographic index class"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:163
+msgid "Input data given for (o/i)"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:53
+msgid "Creates a raster map containing concentric rings around a given point."
+msgstr ""
+
+#: ../raster/r.circle/dist.c:63
+msgid "The coordinate of the center (east,north)"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:69
+msgid "Minimum radius for ring/circle map (in meters)"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:75
+msgid "Maximum radius for ring/circle map (in meters)"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:81
+msgid "Data value multiplier"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:85
+msgid "Generate binary raster map"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:108
+msgid "Please specify a radius in which min < max"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:116
+msgid "Please specify min and/or max radius when using the binary flag"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:52 ../raster/r.rescale/main.c:50
+msgid "raster, rescale"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:54
+msgid ""
+"Rescales histogram equalized the range of category values in a raster map "
+"layer."
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:64 ../raster/r.rescale/main.c:61
+msgid "The name of the raster map to be rescaled"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:72 ../raster/r.rescale/main.c:69
+msgid "The input data range to be rescaled (default: full range of input map)"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:79 ../raster/r.rescale/main.c:76
+msgid "The resulting raster map name"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:86 ../raster/r.rescale/main.c:83
+msgid "The output data range"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:93 ../raster/r.rescale/main.c:90
+msgid "Title for new raster map"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:146
+#, c-format
+msgid "Rescale %s[%d,%d] to %s[%d,%d]"
+msgstr ""
+
+#: ../raster/r.rescale.eq/get_stats.c:19 ../raster/r.rescale/get_range.c:25
+#, c-format
+msgid "Reading %s ..."
+msgstr ""
+
+#: ../raster/r.grow2/main.c:130
+msgid "Generates a raster map layer with contiguous areas grown by one cell."
+msgstr ""
+
+#: ../raster/r.grow2/main.c:141
+msgid "Radius of buffer in raster cells"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:157
+msgid "Value to write for input cells which are non-NULL (-1 => NULL)"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:163
+msgid "Value to write for \"grown\" cells"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:212 ../raster/r.average/main.c:82
+#, c-format
+msgid "Error reading category file for <%s>"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:217
+#, c-format
+msgid "Error in reading color file for <%s>"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:301
+#, c-format
+msgid "Error writing category file for <%s>"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:305
+#, c-format
+msgid "Error writing color file for <%s>"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:94
+msgid "Imports a binary MAT-File(v4) to a GRASS raster."
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:103
+msgid "Name of an existing MAT-File(v4)"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:110
+msgid "Name for the output raster map (override)"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:115 ../raster/r.out.mat/main.c:81
+#: ../raster/r.out.tiff/r.out.tiff.c:136
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:3
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:3
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:3
+msgid "Verbose mode"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:168
+msgid "Reading MAT-File..."
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:194
+msgid "Array contains no data"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:199
+msgid "Array contains imaginary data"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:205
+msgid "Invalid array name"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:225
+msgid "Invalid 'map_name' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:235
+msgid "Error reading 'map_name' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:246
+msgid "Invalid 'map_northern_edge' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:255
+msgid "Invalid 'map_southern_edge' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:264
+msgid "Invalid 'map_eastern_edge' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:273
+msgid "Invalid 'map_western_edge' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:281
+msgid "Invalid 'map_title' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:291
+msgid "Error reading 'map_title' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:304
+msgid "Invalid 'map_data' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:330 ../raster/r.in.mat/main.c:468
+#: ../raster/r.in.mat/main.c:550
+msgid "Please contact the GRASS development team"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:335
+#, c-format
+msgid "Skipping unknown array '%s'"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:363
+#, c-format
+msgid "No 'map_data' array found in <%s>"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:370
+#, c-format
+msgid "Setting map name to <%s> which overrides <%s>"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:377
+#, c-format
+msgid "Setting map name to <%s>"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:381
+msgid "No 'map_name' array found; using <MatFile>"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:394
+msgid "Missing bound"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:398
+msgid "Using default bounds"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:414
+#, c-format
+msgid "Map <%s> bounds set to:"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:415 ../raster/r.out.mat/main.c:198
+#, c-format
+msgid "northern edge=%f"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:416 ../raster/r.out.mat/main.c:199
+#, c-format
+msgid "southern edge=%f"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:417 ../raster/r.out.mat/main.c:200
+#, c-format
+msgid "eastern edge=%f"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:418 ../raster/r.out.mat/main.c:201
+#, c-format
+msgid "western edge=%f"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:419 ../raster/r.out.mat/main.c:202
+#, c-format
+msgid "nsres=%f"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:420 ../raster/r.out.mat/main.c:203
+#, c-format
+msgid "ewres=%f"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:421 ../raster/r.out.mat/main.c:204
+#, c-format
+msgid "rows=%d"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:422 ../raster/r.out.mat/main.c:205
+#, c-format
+msgid "cols=%d"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:433
+msgid "Writing new raster map..."
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:491
+#, c-format
+msgid "Writing raster map, row %d"
+msgstr ""
+
+#: ../raster/r.surf.gauss/main.c:48
+msgid ""
+"GRASS module to produce a raster map layer of gaussian deviates whose mean "
+"and standard deviation can be expressed by the user. It uses a gaussian "
+"random number generator."
+msgstr ""
+
+#: ../raster/r.surf.gauss/main.c:55
+msgid "Name of the output random surface"
+msgstr ""
+
+#: ../raster/r.surf.gauss/main.c:59
+msgid "Distribution mean"
+msgstr ""
+
+#: ../raster/r.surf.gauss/main.c:65
+msgid "Standard deviation"
+msgstr ""
+
+#: ../raster/r.regression.line/main.c:44
+msgid "Calculates linear regression from two raster maps: y = a + b*x."
+msgstr ""
+
+#: ../raster/r.regression.line/main.c:49
+msgid "Map for x coefficient"
+msgstr ""
+
+#: ../raster/r.regression.line/main.c:53
+msgid "Map for y coefficient"
+msgstr ""
+
+#: ../raster/r.regression.line/main.c:59
+msgid ""
+"ASCII file for storing regression coefficients (output to screen if file not "
+"specified)."
+msgstr ""
+
+#: ../raster/r.regression.line/main.c:63 ../general/g.region/main.c:150
+#: ../locale/scriptstrings/i.oif_to_translate.c:9
+msgid "Print in shell script style"
+msgstr ""
+
+#: ../raster/r.regression.line/main.c:67
+msgid "Slower but accurate (applies to FP maps only"
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:65
+msgid "Exports a GRASS raster to a binary MAT-File."
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:76
+msgid "Name for the output binary MAT-File"
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:137
+#, c-format
+msgid "Exporting <%s>"
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:197
+msgid "Using the Current Region settings:"
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:272
+msgid "Exporting raster as integer values"
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:277
+msgid "Exporting raster as floating point values"
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:282
+msgid "Exporting raster as double FP values"
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:325
+msgid "Reading in map ... "
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:339
+msgid "Writing out map..."
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:399
+#, c-format
+msgid "%ld bytes written to '%s'"
+msgstr ""
+
+#: ../raster/r.fill.dir/wtrshed.c:94
+#, c-format
+msgid "wtrshed pass %d"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:86
+msgid ""
+"Filters and generates a depressionless elevation map and a flow direction "
+"map from a given elevation raster map."
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:91
+msgid "Name of existing raster map containing elevation surface"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:98
+msgid "Output elevation raster map after filling"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:105
+msgid "Output direction raster map"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:112
+msgid "Output raster map of problem areas"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:119
+msgid "Output aspect direction format (agnps, answers, or grass)"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:127
+msgid "Find unresolved areas only"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:212
+msgid "Reading map..."
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:220
+msgid "Filling sinks..."
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:224
+msgid "Determining flow directions for ambiguous cases..."
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:237
+msgid "Repeat to get the final directions..."
+msgstr ""
+
+#: ../raster/r.fill.dir/resolve.c:135
+#, c-format
+msgid "Downward pass %d"
+msgstr ""
+
+#: ../raster/r.fill.dir/resolve.c:172
+#, c-format
+msgid "Upward pass %d"
+msgstr ""
+
+#: ../raster/r.fill.dir/dopolys.c:83
+#, c-format
+msgid "Found %d unresolved areas"
+msgstr ""
+
+#: ../raster/r.walk/main.c:179
+msgid ""
+"Outputs a raster map layer showing the anisotropic cumulative cost of moving "
+"between different geographic locations on an input elevation raster map "
+"layer whose cell category values represent elevation combined with an input "
+"raster map layer whose cell values represent friction cost."
+msgstr ""
+
+#: ../raster/r.walk/main.c:191
+msgid "Name of elevation input raster map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:199
+msgid "Name of input raster map containing friction costs"
+msgstr ""
+
+#: ../raster/r.walk/main.c:221
+msgid "Starting points vector map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:228
+msgid "Stop points vector map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:236
+msgid "The map E and N grid coordinates of a starting point (E,N)"
+msgstr ""
+
+#: ../raster/r.walk/main.c:244
+msgid "The map E and N grid coordinates of a stopping point (E,N)"
+msgstr ""
+
+#: ../raster/r.walk/main.c:252
+msgid "An optional maximum cumulative cost"
+msgstr ""
+
+#: ../raster/r.walk/main.c:277
+msgid "Number of the segment to create (segment library)"
+msgstr ""
+
+#: ../raster/r.walk/main.c:287
+msgid "Coefficients for walking energy formula parameters a,b,c,d"
+msgstr ""
+
+#: ../raster/r.walk/main.c:296
+msgid "Lambda coefficients for combining walking energy and friction cost"
+msgstr ""
+
+#: ../raster/r.walk/main.c:305
+msgid "Slope factor determines travel energy cost per height step"
+msgstr ""
+
+#: ../raster/r.walk/main.c:314
+msgid "Keep null values in output map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:377
+#, c-format
+msgid "Missing required value: got %d instead of 4"
+msgstr ""
+
+#: ../raster/r.walk/main.c:381
+#, c-format
+msgid "Walking costs are a=%lf b=%lf c=%lf d=%lf"
+msgstr ""
+
+#: ../raster/r.walk/main.c:386 ../raster/r.walk/main.c:394
+#: ../raster/r.walk/main.c:401
+#, c-format
+msgid "Missing required value: %d"
+msgstr ""
+
+#: ../raster/r.walk/main.c:389
+#, c-format
+msgid "Lambda is %lf"
+msgstr ""
+
+#: ../raster/r.walk/main.c:397
+#, c-format
+msgid "Slope_factor is %lf"
+msgstr ""
+
+#: ../raster/r.walk/main.c:404
+#, c-format
+msgid "Nseg is %d"
+msgstr ""
+
+#: ../raster/r.walk/main.c:410
+msgid "Null cells excluded from cost evaluation."
+msgstr ""
+
+#: ../raster/r.walk/main.c:414
+msgid "Input null cell will be retained into output map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:426
+#, c-format
+msgid "Unable to find starting vector <%s> "
+msgstr ""
+
+#: ../raster/r.walk/main.c:473
+#, c-format
+msgid "Unable to find stop vector <%s>"
+msgstr ""
+
+#: ../raster/r.walk/main.c:512
+msgid "Warning: assigning negative cost to null cell. Null cells excluded."
+msgstr ""
+
+#: ../raster/r.walk/main.c:584 ../raster/r.walk/main.c:586
+#, c-format
+msgid "Unable to read %s"
+msgstr ""
+
+#: ../raster/r.walk/main.c:591
+msgid "Map with different projection"
+msgstr ""
+
+#: ../raster/r.walk/main.c:603
+msgid "DTM_Source map is: Integer cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:606
+msgid "DTM_Source map is: Floating point (float) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:609
+msgid "DTM_Source map is: Floating point (double) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:612 ../raster/r.walk/main.c:627
+#: ../raster/r.walk/main.c:664
+#, c-format
+msgid " %d rows, %d cols"
+msgstr ""
+
+#: ../raster/r.walk/main.c:618
+msgid "COST_Source map is: Integer cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:621
+msgid "COST_Source map is: Floating point (float) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:624
+msgid "COST_Source map is: Floating point (double) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:655
+msgid "Output map is: Integer cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:658
+msgid "Output map is: Floating point (float) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:661
+msgid "Output map is: Floating point (double) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:666
+#, c-format
+msgid " EW resolution %s (%lf)"
+msgstr ""
+
+#: ../raster/r.walk/main.c:668
+#, c-format
+msgid " NS resolution %s (%lf)"
+msgstr ""
+
+#: ../raster/r.walk/main.c:852
+msgid "Initializing output "
+msgstr ""
+
+#: ../raster/r.walk/main.c:860 ../raster/r.walk/main.c:889
+msgid "Unable to allocate memory for segment fbuff == NULL"
+msgstr ""
+
+#: ../raster/r.walk/main.c:917
+#, c-format
+msgid "Raster output map <%s> not found (no start_points given)"
+msgstr ""
+
+#: ../raster/r.walk/main.c:932
+#, c-format
+msgid "Memory allocation error on reading start points from raster map %s"
+msgstr ""
+
+#: ../raster/r.walk/main.c:935
+#, c-format
+msgid "Reading %s... "
+msgstr ""
+
+#: ../raster/r.walk/main.c:999
+msgid "Finding cost path"
+msgstr ""
+
+#: ../raster/r.walk/main.c:1471
+msgid "End of map!"
+msgstr ""
+
+#: ../raster/r.walk/main.c:1497
+#, c-format
+msgid "Writing output raster map %s... "
+msgstr ""
+
+#: ../raster/r.walk/main.c:1501
+msgid "Will copy input map null values into output map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:1508
+msgid ""
+"Integer cell type.\n"
+"Writing..."
+msgstr ""
+
+#: ../raster/r.walk/main.c:1543
+msgid ""
+"Float cell type.\n"
+"Writing..."
+msgstr ""
+
+#: ../raster/r.walk/main.c:1578
+msgid ""
+"Double cell type.\n"
+"Writing..."
+msgstr ""
+
+#: ../raster/r.walk/main.c:1628
+#, c-format
+msgid "Peak cost value: %f"
+msgstr ""
+
+#: ../raster/r.his/main.c:63
+msgid "raster, color transformation"
+msgstr ""
+
+#: ../raster/r.his/main.c:65
+msgid ""
+"Generates red, green and blue raster map layers combining hue, intensity and "
+"saturation (HIS) values from user-specified input raster map layers."
+msgstr ""
+
+#: ../raster/r.his/main.c:74 ../display/d.his/main.c:76
+msgid "Name of layer to be used for HUE"
+msgstr ""
+
+#: ../raster/r.his/main.c:81 ../display/d.his/main.c:83
+msgid "Name of layer to be used for INTENSITY"
+msgstr ""
+
+#: ../raster/r.his/main.c:88 ../display/d.his/main.c:90
+msgid "Name of layer to be used for SATURATION"
+msgstr ""
+
+#: ../raster/r.his/main.c:95
+msgid "Name of output layer to be used for RED"
+msgstr ""
+
+#: ../raster/r.his/main.c:102
+msgid "Name of output layer to be used for GREEN"
+msgstr ""
+
+#: ../raster/r.his/main.c:109
+msgid "Name of output layer to be used for BLUE"
+msgstr ""
+
+#: ../raster/r.his/main.c:113 ../display/d.his/main.c:101
+msgid "Respect NULL values while drawing"
+msgstr ""
+
+#: ../raster/r.his/main.c:243
+msgid "Error reading 'hue' map"
+msgstr ""
+
+#: ../raster/r.his/main.c:247
+msgid "Error reading 'intensity' map"
+msgstr ""
+
+#: ../raster/r.his/main.c:251
+msgid "Error reading 'saturation' map"
+msgstr ""
+
+#: ../raster/r.thin/io.c:105
+#, c-format
+msgid "File %s -- %d rows X %d columns"
+msgstr ""
+
+#: ../raster/r.thin/io.c:115
+#, c-format
+msgid "%s: Unable to create temporary file <%s> -- errno = %d"
+msgstr ""
+
+#: ../raster/r.thin/io.c:124 ../raster/r.thin/io.c:136
+#: ../raster/r.thin/io.c:147
+#, c-format
+msgid "%s: Error writing temporary file"
+msgstr ""
+
+#: ../raster/r.thin/io.c:131
+#, c-format
+msgid "%s: Error reading from raster map <%s> in mapset <%s>"
+msgstr ""
+
+#: ../raster/r.thin/io.c:173
+#, c-format
+msgid "Output file %d rows X %d columns"
+msgstr ""
+
+#: ../raster/r.thin/io.c:174
+#, c-format
+msgid "Window %d rows X %d columns"
+msgstr ""
+
+#: ../raster/r.thin/main.c:55
+msgid "raster, thin"
+msgstr ""
+
+#: ../raster/r.thin/main.c:57
+msgid "Thins non-zero cells that denote linear features in a raster map."
+msgstr ""
+
+#: ../raster/r.thin/main.c:69
+msgid "Maximal number of iterations"
+msgstr ""
+
+#: ../raster/r.thin/thin_lines.c:67
+#, c-format
+msgid "%s: Unable to find bounding box for lines"
+msgstr ""
+
+#: ../raster/r.thin/thin_lines.c:70
+#, c-format
+msgid "Bounding box:  l = %d, r = %d, t = %d, b = %d"
+msgstr ""
+
+#: ../raster/r.thin/thin_lines.c:119
+#, c-format
+msgid "Pass number %d"
+msgstr ""
+
+#: ../raster/r.thin/thin_lines.c:170
+#, c-format
+msgid "Deleted %d  pixels "
+msgstr ""
+
+#: ../raster/r.thin/thin_lines.c:174
+msgid "Thinning completed successfully."
+msgstr ""
+
+#: ../raster/r.thin/thin_lines.c:176
+msgid "Thinning not completed, consider to increase 'iterations' parameter."
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:58 ../raster/r.to.rast3elev/main.c:183
+msgid "Could not close the map"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:77
+msgid "2d raster maps which represent the slices"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:83
+msgid "Use 3D raster mask (if exists) with output map"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:117
+msgid "Could not get raster row"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:194
+msgid "raster, volume, conversion"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:196
+msgid "Converts 2D raster map slices to one 3D raster volume map."
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:208
+msgid "No output map"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:222 ../raster/r.to.rast3elev/main.c:462
+msgid ""
+"The 2D and 3D region settings are different. I will use the 3D region "
+"settings to adjust the 2D region."
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:239 ../raster3d/r3.cross.rast/main.c:349
+#: ../raster3d/r3.to.rast/main.c:302
+msgid "Illegal output file name"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:260
+msgid "Cell file not found"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:268
+#, c-format
+msgid "Open raster map %s - one time for each depth (%d/%d)"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:281
+msgid "Input maps have to be from the same type. CELL, FCELL or DCELL!"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:285 ../raster/r.to.rast3elev/main.c:498
+msgid "Creating 3D raster map"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:309 ../raster/r.to.rast3elev/main.c:483
+msgid "Error opening 3d raster map"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:341 ../raster/r.to.rast3elev/main.c:546
+msgid "Error closing 3d raster map"
+msgstr ""
+
+#: ../raster/r.to.rast3/main.c:378 ../raster/r.to.rast3elev/main.c:171
+msgid "Unable to close input map"
+msgstr ""
+
+#: ../raster/r.surf.idw2/main.c:61
+msgid "Surface generation program."
+msgstr ""
+
+#: ../raster/r.surf.idw2/main.c:80
+msgid ""
+"Lat/long databases not supported by r.surf.idw2. Use r.surf.idw instead!"
+msgstr ""
+
+#: ../raster/r.surf.idw2/main.c:87 ../vector/v.surf.idw/main.c:141
+#, c-format
+msgid "%s=%s - illegal number of interpolation points"
+msgstr ""
+
+#: ../raster/r.surf.idw2/main.c:96
+#, c-format
+msgid "%s: no data points found"
+msgstr ""
+
+#: ../raster/r.surf.idw2/main.c:114
+#, c-format
+msgid "Interpolating raster map <%s>... %d rows... "
+msgstr ""
+
+#: ../raster/r.surf.idw2/main.c:123
+msgid "Cannot get row"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:156 ../raster/r.resamp.stats/main.c:259
+#: ../raster/r.resamp.interp/main.c:72 ../raster/r.bilinear/main.c:42
+#: ../raster/r.resample/main.c:54
+msgid "raster, resample"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:158
+msgid ""
+"Reinterpolates and optionally computes topographic analysis from input "
+"raster map to a new raster map (possibly with different resolution) using "
+"regularized spline with tension and smoothing."
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:169
+msgid "Desired east-west resolution"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:175
+msgid "Desired north-south resolution"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:182
+msgid "Output z-file (elevation) map"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:190
+msgid "Output slope map (or fx)"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:198
+msgid "Output aspect map (or fy)"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:206
+msgid "Output profile curvature map (or fxx)"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:214
+msgid "Output tangential curvature map (or fyy)"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:222
+msgid "Output mean curvature map (or fxy)"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:230
+msgid "Name of raster map containing smoothing"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:231 ../raster/r.resamp.rst/main.c:239
+#: ../raster/r.resamp.rst/main.c:247 ../raster/r.resamp.rst/main.c:255
+#: ../raster/r.resamp.rst/main.c:263 ../raster/r.slope.aspect/main.c:181
+#: ../raster/r.slope.aspect/main.c:191 ../raster/r.slope.aspect/main.c:249
+#: ../raster/r.slope.aspect/main.c:258 ../raster/r.slope.aspect/main.c:269
+#: ../raster/r.in.bin/main.c:251 ../raster/r.in.bin/main.c:256
+#: ../raster/r.in.bin/main.c:285 ../raster/r.in.bin/main.c:346
+#: ../general/g.mapset/main.c:58 ../general/g.mapset/main.c:66
+#: ../general/g.mapset/main.c:76 ../db/base/connect.c:62
+#: ../db/base/connect.c:66 ../db/base/connect.c:77 ../db/base/connect.c:87
+#: ../imagery/i.cluster/main.c:105 ../imagery/i.cluster/main.c:121
+#: ../imagery/i.cluster/main.c:129 ../imagery/i.cluster/main.c:138
+#: ../imagery/i.cluster/main.c:146 ../imagery/i.cluster/main.c:154
+#: ../imagery/i.landsat.toar/main.c:152 ../imagery/i.landsat.toar/main.c:161
+#: ../imagery/i.landsat.toar/main.c:171 ../imagery/i.landsat.toar/main.c:180
+#: ../vector/v.vol.rst/main.c:261 ../vector/v.vol.rst/main.c:269
+#: ../vector/v.vol.rst/main.c:277 ../vector/v.vol.rst/main.c:310
+#: ../vector/v.vol.rst/main.c:319 ../vector/v.vol.rst/main.c:328
+#: ../vector/v.vol.rst/main.c:337 ../vector/v.vol.rst/main.c:346
+#: ../vector/v.vol.rst/main.c:354 ../vector/v.surf.idw/main.c:115
+#: ../vector/v.surf.idw/main.c:123 ../vector/v.surf.idw/main.c:131
+#: ../vector/lidar/v.surf.bspline/main.c:120
+#: ../vector/lidar/v.surf.bspline/main.c:129
+#: ../vector/lidar/v.surf.bspline/main.c:138
+#: ../vector/lidar/v.surf.bspline/main.c:146
+#: ../vector/lidar/v.surf.bspline/main.c:153
+#: ../vector/lidar/v.surf.bspline/main.c:160
+#: ../vector/lidar/v.lidar.edgedetection/main.c:99
+#: ../vector/lidar/v.lidar.edgedetection/main.c:108
+#: ../vector/lidar/v.lidar.edgedetection/main.c:117
+#: ../vector/lidar/v.lidar.edgedetection/main.c:126
+#: ../vector/lidar/v.lidar.edgedetection/main.c:135
+#: ../vector/lidar/v.lidar.edgedetection/main.c:143
+#: ../vector/lidar/v.lidar.edgedetection/main.c:152
+#: ../vector/v.db.connect/main.c:60 ../vector/v.db.connect/main.c:65
+msgid "Settings"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:238
+msgid "Name of raster map to be used as mask"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:246
+msgid "Rows/columns overlap for segmentation"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:254
+msgid "Multiplier for z-values"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:262
+msgid "Spline tension value"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:269
+msgid "Anisotropy angle (in degrees)"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:270 ../raster/r.resamp.rst/main.c:277
+msgid "Anisotropy"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:276 ../vector/v.surf.rst/main.c:382
+msgid "Anisotropy scaling factor"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:281
+msgid "Use dnorm independent tension"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:286 ../vector/v.surf.rst/main.c:209
+msgid "Output partial derivatives instead of topographic parameters"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:293 ../general/g.setproj/main.c:107
+msgid "Retrieving and setting region failed"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:321
+msgid "Cannot read ew_res value"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:324
+msgid "Cannot read ns_res value"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:327
+msgid "Invalid value for tension"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:330
+msgid "Invalid value for zmult"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:333
+msgid "Invalid value for overlap"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:337
+msgid "Invalid value for theta"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:341
+msgid "Invalid value for scalex"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:343
+msgid "When using anisotropy both theta and scalex must be specified"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:366 ../vector/v.surf.rst/main.c:520
+msgid "Not enough memory for az"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:371 ../vector/v.surf.rst/main.c:525
+msgid "Not enough memory for adx"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:375 ../vector/v.surf.rst/main.c:529
+msgid "Not enough memory for ady"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:380 ../vector/v.surf.rst/main.c:534
+msgid "Not enough memory for adxx"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:384 ../vector/v.surf.rst/main.c:538
+msgid "Not enough memory for adyy"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:388 ../vector/v.surf.rst/main.c:542
+msgid "Not enough memory for adxy"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:405 ../raster/r.resamp.rst/main.c:428
+#: ../raster/r.los/main.c:177 ../raster/r.los/main.c:182
+#, c-format
+msgid "[%s]: Cannot read map header"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:408
+#, c-format
+msgid "[%s]: Map is the wrong resolution"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:416
+msgid "Smoothing values can not be negative or NULL"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:431
+msgid "Input map resolution differs from current region resolution!"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:451
+msgid "Processing all selected output files will require"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:452
+#, c-format
+msgid "%d bytes of disk space for temp files."
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:477
+#, c-format
+msgid "Cannot get row %d (error = %d)"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:487
+msgid "Maximum value of a raster map is NULL."
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:515
+msgid "Temporarily changing the region to desired resolution ..."
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:521
+msgid "Changing back to the original region ..."
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:523
+msgid "Cannot set region to back to the initial region !!!"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:527 ../raster/r.resample/main.c:137
+#: ../vector/v.surf.rst/main.c:622 ../vector/v.surf.rst/main.c:773
+msgid "Percent complete: "
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:539
+#, c-format
+msgid "dnorm in mainc after grid before out1= %f"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:556
+#, c-format
+msgid "dnorm in mainc after grid before out2= %f"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:607 ../vector/v.surf.rst/main.c:638
+msgid "Not enough memory for zero_array_cell"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:622 ../raster/r.resamp.rst/main.c:635
+#: ../raster/r.resamp.rst/main.c:648 ../raster/r.resamp.rst/main.c:662
+#: ../raster/r.resamp.rst/main.c:675 ../raster/r.resamp.rst/main.c:688
+#: ../vector/v.surf.rst/main.c:650 ../vector/v.surf.rst/main.c:659
+#: ../vector/v.surf.rst/main.c:668 ../vector/v.surf.rst/main.c:678
+#: ../vector/v.surf.rst/main.c:687 ../vector/v.surf.rst/main.c:696
+msgid "Not enough disk space -- cannot write files"
+msgstr ""
+
+#: ../raster/r.carve/main.c:78
+msgid ""
+"Takes vector stream data, transforms it to raster and subtracts depth from "
+"the output DEM."
+msgstr ""
+
+#: ../raster/r.carve/main.c:83
+msgid "Name of input raster elevation map"
+msgstr ""
+
+#: ../raster/r.carve/main.c:88
+msgid "Name of vector input map containing stream(s)"
+msgstr ""
+
+#: ../raster/r.carve/main.c:96
+msgid "Name for output vector map for adjusted stream points"
+msgstr ""
+
+#: ../raster/r.carve/main.c:101
+msgid "Stream width (in meters). Default is raster cell width"
+msgstr ""
+
+#: ../raster/r.carve/main.c:107
+msgid "Additional stream depth (in meters)"
+msgstr ""
+
+#: ../raster/r.carve/main.c:111
+msgid "No flat areas allowed in flow direction"
+msgstr ""
+
+#: ../raster/r.carve/main.c:148
+#, c-format
+msgid "Invalid width value '%s' - using default."
+msgstr ""
+
+#: ../raster/r.carve/main.c:162
+#, c-format
+msgid "Invalid depth value '%s' - using default."
+msgstr ""
+
+#: ../raster/r.carve/main.c:231
+msgid "lat/lon projection not supported at this time."
+msgstr ""
+
+#: ../raster/r.carve/enforce_ds.c:81
+msgid "Processing lines... "
+msgstr ""
+
+#: ../raster/r.carve/enforce_ds.c:173
+msgid ""
+"Vect runs out of region and re-enters - this case is not yet implemented."
+msgstr ""
+
+#: ../raster/r.carve/lobf.c:74
+msgid "trying to divide by zero...no unique solution for system...skipping..."
+msgstr ""
+
+#: ../raster/r.carve/raster.c:12 ../raster/r.texture/main.c:261
+#: ../raster/r.out.tiff/r.out.tiff.c:283 ../imagery/i.zc/main.c:167
+msgid "Reading raster map..."
+msgstr ""
+
+#: ../raster/r.rescale/main.c:52
+msgid "Rescales the range of category values in a raster map layer."
+msgstr ""
+
+#: ../raster/r.rescale/main.c:95
+msgid "Quietly"
+msgstr ""
+
+#: ../raster/r.rescale/main.c:141
+#, c-format
+msgid "Rescale %s[%ld,%ld] to %s[%ld,%ld]"
+msgstr ""
+
+#: ../raster/r.resamp.stats/main.c:261
+msgid "Resamples raster map layers to a coarser grid using aggregation."
+msgstr ""
+
+#: ../raster/r.resamp.stats/main.c:271
+msgid "Aggregation method"
+msgstr ""
+
+#: ../raster/r.resamp.stats/main.c:281
+msgid "Weight according to area (slower)"
+msgstr ""
+
+#: ../raster/r.resamp.stats/main.c:374 ../raster/r.resamp.interp/main.c:320
+#, c-format
+msgid "Unable to read color table for %s"
+msgstr ""
+
+#: ../raster/r.resamp.stats/main.c:378 ../raster/r.resamp.interp/main.c:323
+#, c-format
+msgid "Unable to write color table for %s"
+msgstr ""
+
+#: ../raster/r.cross/main.c:77
+msgid ""
+"Creates a cross product of the category values from multiple raster map "
+"layers."
+msgstr ""
+
+#: ../raster/r.cross/main.c:86
+#, c-format
+msgid "Names of 2-%d input raster maps"
+msgstr ""
+
+#: ../raster/r.cross/main.c:95
+msgid "Non-zero data only"
+msgstr ""
+
+#: ../raster/r.cross/main.c:122
+#, c-format
+msgid "More than %d files not allowed"
+msgstr ""
+
+#: ../raster/r.cross/main.c:140
+msgid "Must specify 2 or more input maps"
+msgstr ""
+
+#: ../raster/r.cross/main.c:161
+#, c-format
+msgid "%s: STEP 2 ..."
+msgstr ""
+
+#: ../raster/r.cross/main.c:204
+#, c-format
+msgid "%ld categories"
+msgstr ""
+
+#: ../raster/r.cross/renumber.c:32
+#, c-format
+msgid "%s: STEP 3 ... "
+msgstr ""
+
+#: ../raster/r.cross/cross.c:52
+#, c-format
+msgid "%s: STEP 1 ... "
+msgstr ""
+
+#: ../raster/r.texture/main.c:76
+msgid "Generate images with textural features from a raster map."
+msgstr ""
+
+#: ../raster/r.texture/main.c:87
+msgid "Prefix for output raster map(s)"
+msgstr ""
+
+#: ../raster/r.texture/main.c:94
+msgid "The size of sliding window (odd and >= 3)"
+msgstr ""
+
+#: ../raster/r.texture/main.c:104
+msgid "The distance between two samples (>= 1)"
+msgstr ""
+
+#: ../raster/r.texture/main.c:122
+msgid "Angular Second Moment"
+msgstr ""
+
+#: ../raster/r.texture/main.c:123 ../raster/r.texture/main.c:128
+#: ../raster/r.texture/main.c:133 ../raster/r.texture/main.c:138
+#: ../raster/r.texture/main.c:143 ../raster/r.texture/main.c:148
+#: ../raster/r.texture/main.c:153 ../raster/r.texture/main.c:158
+#: ../raster/r.texture/main.c:163 ../raster/r.texture/main.c:168
+#: ../raster/r.texture/main.c:173 ../raster/r.texture/main.c:178
+#: ../raster/r.texture/main.c:183 ../raster/r.texture/main.c:188
+msgid "Features"
+msgstr ""
+
+#: ../raster/r.texture/main.c:127
+msgid "Contrast"
+msgstr ""
+
+#: ../raster/r.texture/main.c:132
+msgid "Correlation"
+msgstr ""
+
+#: ../raster/r.texture/main.c:137
+msgid "Variance"
+msgstr ""
+
+#: ../raster/r.texture/main.c:142
+msgid "Inverse Diff Moment"
+msgstr ""
+
+#: ../raster/r.texture/main.c:147
+msgid "Sum Average"
+msgstr ""
+
+#: ../raster/r.texture/main.c:152
+msgid "Sum Variance"
+msgstr ""
+
+#: ../raster/r.texture/main.c:157
+msgid "Sum Entropy"
+msgstr ""
+
+#: ../raster/r.texture/main.c:162
+msgid "Entropy"
+msgstr ""
+
+#: ../raster/r.texture/main.c:167
+msgid "Difference Variance"
+msgstr ""
+
+#: ../raster/r.texture/main.c:172
+msgid "Difference Entropy"
+msgstr ""
+
+#: ../raster/r.texture/main.c:177
+msgid "Measure of Correlation-1"
+msgstr ""
+
+#: ../raster/r.texture/main.c:182
+msgid "Measure of Correlation-2"
+msgstr ""
+
+#: ../raster/r.texture/main.c:187
+msgid "Max Correlation Coeff"
+msgstr ""
+
+#: ../raster/r.texture/main.c:216
+msgid "Nothing to compute. Use at least one of the flags."
+msgstr ""
+
+#: ../raster/r.texture/main.c:373
+#, c-format
+msgid "Calculated measure #%d <%s> (56 measures available)"
+msgstr ""
+
+#: ../raster/r.texture/h_measure.c:84
+msgid ""
+"Negative or no data pixel found. This module is not yet able to process no "
+"data holes in a map, please fill with r.fillnulls or other algorithms"
+msgstr ""
+
+#: ../raster/r.texture/h_measure.c:88
+#, c-format
+msgid ""
+"Too many categories (found: %i, max: %i). Try to rescale or reclassify the "
+"map"
+msgstr ""
+
+#: ../raster/r.texture/h_measure.c:937
+#, c-format
+msgid "Too many iterations to required to find %s - giving up"
+msgstr ""
+
+#: ../raster/r.average/main.c:53
+msgid ""
+"Finds the average of values in a cover map within areas assigned the same "
+"category value in a user-specified base map."
+msgstr ""
+
+#: ../raster/r.average/main.c:93
+#, c-format
+msgid "%s: ERROR running %s command"
+msgstr ""
+
+#: ../raster/r.li/r.li.mpa/mpa.c:37
+msgid "Calculates mean pixel attribute index on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.mpa/mpa.c:45 ../raster/r.li/r.li.renyi/renyi.c:54
+#: ../raster/r.li/r.li.patchdensity/main.c:42
+#: ../raster/r.li/r.li.patchnum/main.c:43
+#: ../raster/r.li/r.li.richness/richness.c:47
+#: ../raster/r.li/r.li.shape/main.c:41 ../raster/r.li/r.li.padsd/padsd.c:42
+#: ../raster/r.li/r.li.edgedensity/edgedensity.c:46
+#: ../raster/r.li/r.li.pielou/pielou.c:67 ../raster/r.li/r.li.padcv/padcv.c:44
+#: ../raster/r.li/r.li.shannon/shannon.c:46 ../raster/r.li/r.li.mps/mps.c:47
+#: ../raster/r.li/r.li.simpson/simpson.c:47
+#: ../raster/r.li/r.li.dominance/dominance.c:46
+#: ../raster/r.li/r.li.padrange/padrange.c:44
+#: ../raster/r.li/r.li.cwed/cwed.c:53
+msgid "Configuration file"
+msgstr ""
+
+#: ../raster/r.li/r.li.renyi/renyi.c:44
+msgid "Calculates Renyi's diversity index on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.renyi/renyi.c:46 ../raster/r.li/r.li.pielou/pielou.c:59
+#: ../raster/r.li/r.li.shannon/shannon.c:38
+#: ../raster/r.li/r.li.simpson/simpson.c:39
+#: ../raster/r.li/r.li.dominance/dominance.c:38
+msgid "raster, landscape structure analysis, diversity index"
+msgstr ""
+
+#: ../raster/r.li/r.li.renyi/renyi.c:62
+msgid "Alpha value is the order of the generalized entropy"
+msgstr ""
+
+#: ../raster/r.li/r.li.patchdensity/main.c:33
+msgid ""
+"Calculates patch density index on a raster map, using a 4 neighbour algorithm"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/worker.c:66
+#, c-format
+msgid "CHILD[pid = %i] cannot open raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/worker.c:104
+#: ../raster/r.li/r.li.daemon/worker.c:111
+#, c-format
+msgid "CHILD[pid = %i] cannot open receive channel"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/worker.c:140
+#: ../raster/r.li/r.li.daemon/worker.c:150
+#, c-format
+msgid "CHILD[pid = %i]: unable to open <%s> mask ... continuing without!"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:82
+msgid "Error in pipe creation"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:90
+#, c-format
+msgid "Error opening channel %i"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:137
+msgid "Cannot create random access file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:145
+#, c-format
+msgid "Cannot create %s/.r.li/ directory"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:149
+#, c-format
+msgid "Cannot create %s/.r.li/output/ directory"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:247
+#: ../raster/r.li/r.li.daemon/daemon.c:270
+#, c-format
+msgid "r.li.worker (pid %i) exited with abnormal status: %i"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:250
+#: ../raster/r.li/r.li.daemon/daemon.c:273
+#, c-format
+msgid "r.li.worker (pid %i) terminated successfully"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:255
+#, c-format
+msgid "Cannot close %s file (PIPE)"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:257
+#, c-format
+msgid "Cannot delete %s file (PIPE)"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:278
+#, c-format
+msgid "Cannot close %s file (PIPE2)"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:280
+#, c-format
+msgid "Cannot delete %s file (PIPE2)"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:299
+msgid "Cannot close receive channel file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:302
+#, c-format
+msgid "Cannot delete %s file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:321
+#, c-format
+msgid "Cannot find configuration file <%s>"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:328
+#: ../raster/r.li/r.li.daemon/daemon.c:332
+msgid "Cannot read setup file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:336
+msgid "Unable to parse configuration file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:346
+msgid "Cannot read raster header file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:489
+msgid "Irregular maskedoverlay areas definition"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:492
+#, c-format
+msgid "The configuration file can be used only with \t\t\t%s rasterfile"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:499
+msgid "Illegal configuration file (sample area)"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:533
+msgid "Too many units to place"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:602
+msgid "Too many strats for raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:636
+msgid "Illegal areas disposition"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:705
+msgid "Cannot make lseek"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/ipc.c:48
+#, c-format
+msgid ""
+"\t\t\t\tAREA MESSAGE: \n"
+" \t\t\t\taid = %i \n"
+" \t\t\t\tx = %i \n"
+" \t\t\t\ty = %i \n"
+" \t\t\t\trl = %i \n"
+" \t\t\t\tcl = %i \n"
+" "
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/ipc.c:57
+#, c-format
+msgid ""
+" \t\t\t\tMASKEDAREA MESSAGE: \n"
+" \t\t\t\taid = %i \n"
+" \t\t\t\tx = %i \n"
+" \t\t\t\ty = %i \n"
+" \t\t\t\trl = %i \n"
+" \t\t\t\tcl = %i \n"
+" \t\t\t\tmask = %s \n"
+" "
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/ipc.c:68
+#, c-format
+msgid ""
+" \t\t\t\tDONE MESSAGE: \n"
+" \t\t\t\taid = %i \n"
+" \t\t\t\tpid = %i \n"
+" \t\t\t\tresult = %f \n"
+" "
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/ipc.c:75
+#, c-format
+msgid ""
+" \t\t\t\tERROR MESSAGE: \n"
+" \t\t\t\taid = %i \n"
+" \t\t\t\tpid = %i \n"
+" "
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/ipc.c:81
+#, c-format
+msgid ""
+" \t\t\t\tTERM MESSAGE: \n"
+" \t\t\t\tpid = %i \n"
+" "
+msgstr ""
+
+#: ../raster/r.li/r.li.patchnum/main.c:34
+msgid ""
+"Calculates patch number index on a raster map, using a 4 neighbour algorithm."
+msgstr ""
+
+#: ../raster/r.li/r.li.richness/richness.c:37
+#: ../raster/r.li/r.li.dominance/dominance.c:36
+msgid "Calculates dominance's diversity index on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.richness/richness.c:39
+msgid "raster, landscape structure analysis, dominance index"
+msgstr ""
+
+#: ../raster/r.li/r.li.shape/main.c:32
+msgid "Calculates shape index on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.padsd/padsd.c:35
+msgid "Calculates standard deviation of patch area a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.edgedensity/edgedensity.c:37
+msgid ""
+"Calculates edge density index on a raster map, using a 4 neighbour algorithm"
+msgstr ""
+
+#: ../raster/r.li/r.li.pielou/pielou.c:57
+msgid "Calculates Pielou's diversity index on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.padcv/padcv.c:37
+msgid "Calculates coefficient of variation of patch area on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.shannon/shannon.c:36
+msgid "Calculates Shannon's diversity index on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.mps/mps.c:39
+msgid ""
+"Calculates mean patch size index on a raster map, using a 4 neighbour "
+"algorithm"
+msgstr ""
+
+#: ../raster/r.li/r.li.simpson/simpson.c:37
+msgid "Calculates Simpson's diversity index on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.padrange/padrange.c:37
+msgid "Calculates range of patch area size on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.cwed/cwed.c:44
+msgid "Calculates contrast weighted edge density index on a raster map"
+msgstr ""
+
+#: ../raster/r.what/main.c:93
+msgid "Queries raster map layers on their category values and category labels."
+msgstr ""
+
+#: ../raster/r.what/main.c:101
+msgid "Name of existing raster map(s) to query"
+msgstr ""
+
+#: ../raster/r.what/main.c:108
+msgid "Size of point cache"
+msgstr ""
+
+#: ../raster/r.what/main.c:110 ../raster/r.what/main.c:148
+#: ../display/d.legend/main.c:104 ../display/d.legend/main.c:113
+#: ../display/d.legend/main.c:121 ../display/d.legend/main.c:142
+#: ../display/d.legend/main.c:151 ../display/d.legend/main.c:161
+#: ../display/d.legend/main.c:166 ../display/d.legend/main.c:171
+#: ../display/d.legend/main.c:176 ../display/d.legend/main.c:181
+#: ../vector/v.buffer/main.c:279 ../vector/v.buffer/main.c:287
+#: ../vector/v.buffer/main.c:294 ../vector/v.buffer/main.c:304
+msgid "Advanced"
+msgstr ""
+
+#: ../raster/r.what/main.c:127 ../vector/v.what/main.c:69
+msgid "Coordinates for query"
+msgstr ""
+
+#: ../raster/r.what/main.c:131
+msgid "Output header row"
+msgstr ""
+
+#: ../raster/r.what/main.c:135
+msgid "Show the category labels of the grid cell(s)"
+msgstr ""
+
+#: ../raster/r.what/main.c:139
+msgid "Output color values as RRR:GGG:BBB"
+msgstr ""
+
+#: ../raster/r.what/main.c:143
+msgid "Output integer category values, not cell values"
+msgstr ""
+
+#: ../raster/r.what/main.c:147
+msgid "Turn on cache reporting"
+msgstr ""
+
+#: ../raster/r.what/main.c:194
+#, c-format
+msgid "%s: can only do up to %d raster maps, sorry\n"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:138
+msgid "The number of input and elevation maps is not equal"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:211
+msgid "The value to fill the upper cells, default is null"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:218
+msgid "The value to fill the lower cells, default is null"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:223
+msgid "Use the input map values to fill the upper cells"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:228
+msgid "Use the input map values to fill the lower cells"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:232 ../raster3d/r3.cross.rast/main.c:110
+#: ../raster3d/r3.out.ascii/main.c:107 ../raster3d/r3.to.rast/main.c:90
+msgid "Use 3D raster mask (if exists) with input map"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:276
+msgid "Could not get raster row from input map"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:278
+msgid "Could not get raster row from elev map"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:326 ../raster/r.to.rast3elev/main.c:360
+msgid "Error writing 3D raster double data"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:400
+msgid "raster, raster3d, voxel, conversion"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:402
+msgid "Creates a 3D volume map based on 2D elevation and value raster maps."
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:433
+msgid "The upper value is not valid"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:444
+msgid "The lower value is not valid"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:179
+msgid "Horizon angle computation from a digital elevation model."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:181
+msgid ""
+"Computes horizon angle height from a digital elevation model. The module has "
+"two different modes of operation:  1. Computes the entire horizon around a "
+"single point whose coordinates are given with the 'coord' option. The "
+"horizon height (in radians). 2. Computes one or more raster maps of the "
+"horizon height in a single direction.  The input for this is the angle (in "
+"degrees), which is measured  counterclockwise with east=0, north=90 etc. The "
+"output is the horizon height in radians."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:234
+msgid "Direction in which you want to know the horizon height"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:250
+msgid ""
+"For horizon rasters, read from the DEM an extra buffer around the present "
+"region"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:258
+msgid ""
+"For horizon rasters, read from the DEM an extra buffer eastward the present "
+"region"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:266
+msgid ""
+"For horizon rasters, read from the DEM an extra buffer westward the present "
+"region"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:274
+msgid ""
+"For horizon rasters, read from the DEM an extra buffer northward the present "
+"region"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:282
+msgid ""
+"For horizon rasters, read from the DEM an extra buffer southward the present "
+"region"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:290
+msgid "The maximum distance to consider when finding the horizon height"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:299
+msgid "Prefix of the horizon raster output maps"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:309
+msgid "Coordinate for which you want to calculate the horizon"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:324
+msgid "Write output in degrees (default is radians)"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:361
+msgid "You didn't specify a direction value or step size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:367
+msgid "You didn't specify a horizon raster name. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:378
+msgid "You didn't specify an angle step size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:392
+msgid "Could not read bufferzone size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:398
+msgid "Could not read east bufferzone size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:404
+msgid "Could not read west bufferzone size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:411
+msgid "Could not read south bufferzone size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:420
+msgid "Could not read north bufferzone size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:426
+msgid "Could not read maximum distance. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:479 ../raster/r.sun/main.c:472
+msgid ""
+"Can't get projection info of current location: please set latitude via 'lat' "
+"or 'latin' option!"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:618 ../raster/r.sun/main.c:734
+#: ../raster/r.sun/main.c:741 ../raster/r.sun/main.c:748
+#: ../raster/r.sun/main.c:755 ../raster/r.sun/main.c:762
+#, c-format
+msgid "Unable to create raster map %s"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:815 ../raster/r.horizon/main.c:833
+#: ../raster/r.sun/main.c:1345 ../display/d.grid/plot.c:203
+#: ../display/d.grid/plot.c:209 ../display/d.grid/plot.c:259
+#: ../display/d.grid/plot.c:265 ../display/d.grid/plot.c:404
+#: ../display/d.grid/plot.c:420 ../display/d.grid/plot.c:437
+#: ../display/d.grid/plot.c:454 ../ps/ps.map/do_geogrid.c:87
+#: ../ps/ps.map/do_geogrid.c:92 ../ps/ps.map/do_geogrid.c:116
+#: ../ps/ps.map/do_geogrid.c:121 ../ps/ps.map/do_geogrid.c:191
+#: ../ps/ps.map/do_geogrid.c:230 ../ps/ps.map/do_geogrid.c:306
+#: ../ps/ps.map/do_geogrid.c:322 ../ps/ps.map/do_geogrid.c:339
+#: ../ps/ps.map/do_geogrid.c:356 ../ps/ps.map/do_geogrid.c:412
+#: ../ps/ps.map/do_geogrid.c:418 ../ps/ps.map/do_geogrid.c:422
+#: ../ps/ps.map/do_geogrid.c:430 ../ps/ps.map/do_geogrid.c:434
+msgid "Error in pj_do_proj"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:1134
+#, c-format
+msgid "Calculating map %01d of %01d (angle %lf, raster map <%s>)"
+msgstr ""
+
+#: ../raster/r.median/main.c:48
+msgid ""
+"Finds the median of values in a cover map within areas assigned the same "
+"category value in a user-specified base map."
+msgstr ""
+
+#: ../raster/r.median/main.c:54
+msgid "Name of base raster map"
+msgstr ""
+
+#: ../raster/r.median/main.c:71
+#, c-format
+msgid "Base raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.median/main.c:79
+#, c-format
+msgid "Base map and output map <%s> must be different"
+msgstr ""
+
+#: ../raster/r.median/main.c:82
+#, c-format
+msgid "Unable to read category labels of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.compress/main.c:64
+msgid "raster, map management"
+msgstr ""
+
+#: ../raster/r.compress/main.c:65
+msgid "Compresses and decompresses raster maps."
+msgstr ""
+
+#: ../raster/r.compress/main.c:73 ../display/d.what.rast/main.c:81
+msgid "Name of existing raster map(s)"
+msgstr ""
+
+#: ../raster/r.compress/main.c:77
+msgid "Uncompress the map"
+msgstr ""
+
+#: ../raster/r.compress/main.c:117
+#, c-format
+msgid "[%s] not found"
+msgstr ""
+
+#: ../raster/r.compress/main.c:123
+#, c-format
+msgid "[%s] is a reclass file of map <%s> in mapset <%s> - can't uncompress"
+msgstr ""
+
+#: ../raster/r.compress/main.c:125
+#, c-format
+msgid "[%s] is a reclass file of map <%s> in mapset <%s> - can't compress"
+msgstr ""
+
+#: ../raster/r.compress/main.c:130
+#, c-format
+msgid "[%s] is a GDAL-linked map - can't (un)compress"
+msgstr ""
+
+#: ../raster/r.compress/main.c:172
+#, c-format
+msgid "DONE: uncompressed file is %lu bytes smaller"
+msgstr ""
+
+#: ../raster/r.compress/main.c:173
+#, c-format
+msgid "DONE: compressed file is %lu bytes smaller"
+msgstr ""
+
+#: ../raster/r.compress/main.c:177
+#, c-format
+msgid "DONE: uncompressed file is %lu bytes bigger"
+msgstr ""
+
+#: ../raster/r.compress/main.c:178
+#, c-format
+msgid "DONE: compressed file is %lu bytes bigger"
+msgstr ""
+
+#: ../raster/r.compress/main.c:200
+#, c-format
+msgid "[%s] already uncompressed"
+msgstr ""
+
+#: ../raster/r.compress/main.c:204
+#, c-format
+msgid "[%s] already compressed"
+msgstr ""
+
+#: ../raster/r.compress/main.c:208
+#, c-format
+msgid ""
+"\n"
+"%sCOMPRESS [%s]"
+msgstr ""
+
+#: ../raster/r.colors.out/main.c:63
+msgid "raster, export, color table"
+msgstr ""
+
+#: ../raster/r.colors.out/main.c:65
+msgid "Exports the color table associated with a raster map layer."
+msgstr ""
+
+#: ../raster/r.colors.out/main.c:71
+msgid "Path to output rules file"
+msgstr ""
+
+#: ../raster/r.colors.out/main.c:72
+msgid "\"-\" to write to stdout"
+msgstr ""
+
+#: ../raster/r.colors.out/main.c:77
+msgid "Output values as percentages"
+msgstr ""
+
+#: ../raster/r.proj/bordwalk.c:182 ../raster/r.proj.seg/bordwalk.c:182
+msgid "Input raster map is outside current region"
+msgstr ""
+
+#: ../raster/r.proj/main.c:130 ../raster/r.proj.seg/main.c:139
+msgid "raster, projection, transformation"
+msgstr ""
+
+#: ../raster/r.proj/main.c:132 ../raster/r.proj.seg/main.c:141
+msgid "Re-projects a raster map from one location to the current location."
+msgstr ""
+
+#: ../raster/r.proj/main.c:135 ../raster/r.proj.seg/main.c:144
+msgid "Name of input raster map to re-project"
+msgstr ""
+
+#: ../raster/r.proj/main.c:137 ../raster/r.proj/main.c:154
+#: ../raster/r.proj/main.c:163 ../raster/r.proj.seg/main.c:146
+#: ../raster/r.proj.seg/main.c:163 ../raster/r.proj.seg/main.c:172
+#: ../vector/v.proj/main.c:70 ../vector/v.proj/main.c:87
+#: ../vector/v.proj/main.c:96 ../vector/v.net.flow/main.c:87
+#: ../vector/v.net.flow/main.c:92 ../vector/v.net.flow/main.c:98
+msgid "Source"
+msgstr ""
+
+#: ../raster/r.proj/main.c:143 ../raster/r.proj.seg/main.c:152
+msgid "Location containing input raster map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:151 ../raster/r.proj.seg/main.c:160
+msgid "Mapset containing input raster map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:160 ../raster/r.proj.seg/main.c:169
+#: ../vector/v.proj/main.c:93
+msgid "Path to GRASS database of input location"
+msgstr ""
+
+#: ../raster/r.proj/main.c:167 ../raster/r.proj.seg/main.c:176
+msgid "Name for output raster map (default: input)"
+msgstr ""
+
+#: ../raster/r.proj/main.c:168 ../raster/r.proj/main.c:179
+#: ../raster/r.proj/main.c:186 ../raster/r.proj.seg/main.c:177
+#: ../raster/r.proj.seg/main.c:188 ../raster/r.proj.seg/main.c:201
+#: ../raster/r.proj.seg/main.c:215 ../raster/r.proj.seg/main.c:221
+#: ../vector/v.proj/main.c:101 ../vector/v.proj/main.c:113
+msgid "Target"
+msgstr ""
+
+#: ../raster/r.proj/main.c:178 ../raster/r.proj.seg/main.c:187
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:124
+#: ../imagery/i.rectify/main.c:136
+msgid "Interpolation method to use"
+msgstr ""
+
+#: ../raster/r.proj/main.c:185 ../raster/r.proj.seg/main.c:200
+msgid "Resolution of output map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:190 ../raster/r.proj.seg/main.c:205
+msgid "List raster maps in input location and exit"
+msgstr ""
+
+#: ../raster/r.proj/main.c:194 ../raster/r.proj.seg/main.c:209
+msgid "Do not perform region cropping optimization"
+msgstr ""
+
+#: ../raster/r.proj/main.c:217 ../raster/r.proj.seg/main.c:245
+#: ../vector/v.proj/main.c:132
+#, c-format
+msgid "option <%s>: <%s> exists."
+msgstr ""
+
+#: ../raster/r.proj/main.c:222 ../raster/r.proj.seg/main.c:251
+#: ../vector/v.proj/main.c:149
+msgid "Input and output locations can not be the same"
+msgstr ""
+
+#: ../raster/r.proj/main.c:228 ../raster/r.proj.seg/main.c:263
+msgid "Unable to get projection info of output raster map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:231 ../raster/r.proj.seg/main.c:266
+msgid "Unable to get projection units of output raster map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:234 ../raster/r.proj.seg/main.c:269
+msgid "Unable to get projection key values of output raster map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:243 ../raster/r.proj.seg/main.c:278
+#, c-format
+msgid "Mapset <%s> in input location <%s> - %s"
+msgstr ""
+
+#: ../raster/r.proj/main.c:252 ../raster/r.proj.seg/main.c:287
+#: ../vector/v.proj/main.c:169
+#, c-format
+msgid "Checking location <%s> mapset <%s>"
+msgstr ""
+
+#: ../raster/r.proj/main.c:267 ../raster/r.proj.seg/main.c:302
+#, c-format
+msgid "Raster map <%s> in location <%s> in mapset <%s> not found"
+msgstr ""
+
+#: ../raster/r.proj/main.c:275 ../raster/r.proj.seg/main.c:310
+msgid "Unable to get projection info of input map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:278 ../raster/r.proj.seg/main.c:313
+msgid "Unable to get projection units of input map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:281 ../raster/r.proj.seg/main.c:316
+msgid "Unable to get projection key values of input map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:296 ../raster/r.proj.seg/main.c:330
+msgid "Unable to work with unprojected data (xy location)"
+msgstr ""
+
+#: ../raster/r.proj/main.c:370 ../raster/r.proj.seg/main.c:438
+msgid "Input:"
+msgstr ""
+
+#: ../raster/r.proj/main.c:371 ../raster/r.proj/main.c:382
+#: ../raster/r.proj.seg/main.c:439 ../raster/r.proj.seg/main.c:450
+#, c-format
+msgid "Cols: %d (%d)"
+msgstr ""
+
+#: ../raster/r.proj/main.c:372 ../raster/r.proj/main.c:383
+#: ../raster/r.proj.seg/main.c:440 ../raster/r.proj.seg/main.c:451
+#, c-format
+msgid "Rows: %d (%d)"
+msgstr ""
+
+#: ../raster/r.proj/main.c:373 ../raster/r.proj/main.c:384
+#: ../raster/r.proj.seg/main.c:441 ../raster/r.proj.seg/main.c:452
+#, c-format
+msgid "North: %f (%f)"
+msgstr ""
+
+#: ../raster/r.proj/main.c:374 ../raster/r.proj/main.c:385
+#: ../raster/r.proj.seg/main.c:442 ../raster/r.proj.seg/main.c:453
+#, c-format
+msgid "South: %f (%f)"
+msgstr ""
+
+#: ../raster/r.proj/main.c:375 ../raster/r.proj/main.c:386
+#: ../raster/r.proj.seg/main.c:443 ../raster/r.proj.seg/main.c:454
+#, c-format
+msgid "West: %f (%f)"
+msgstr ""
+
+#: ../raster/r.proj/main.c:376 ../raster/r.proj/main.c:387
+#: ../raster/r.proj.seg/main.c:444 ../raster/r.proj.seg/main.c:455
+#, c-format
+msgid "East: %f (%f)"
+msgstr ""
+
+#: ../raster/r.proj/main.c:377 ../raster/r.proj/main.c:388
+#: ../raster/r.proj.seg/main.c:445 ../raster/r.proj.seg/main.c:456
+#, c-format
+msgid "EW-res: %f"
+msgstr ""
+
+#: ../raster/r.proj/main.c:378 ../raster/r.proj/main.c:389
+#: ../raster/r.proj.seg/main.c:446 ../raster/r.proj.seg/main.c:457
+#, c-format
+msgid "NS-res: %f"
+msgstr ""
+
+#: ../raster/r.proj/main.c:381 ../raster/r.proj.seg/main.c:449
+msgid "Output:"
+msgstr ""
+
+#: ../raster/r.proj/main.c:417 ../raster/r.proj.seg/main.c:485
+msgid "Projecting..."
+msgstr ""
+
+#: ../raster/r.proj/readcell.c:22 ../raster/r.proj.seg/readcell.c:63
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:70
+#: ../imagery/i.rectify/readcell.c:61
+msgid "Allocating memory and reading input map..."
+msgstr ""
+
+#: ../raster/r.sun/main.c:274
+msgid "Name of the latitudes input raster map [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun/main.c:284
+msgid "A single value of latitude [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun/main.c:293
+msgid "Name of real-sky beam radiation coefficient raster map [-]"
+msgstr ""
+
+#: ../raster/r.sun/main.c:302
+msgid "Name of real-sky diffuse radiation coefficient raster map [-]"
+msgstr ""
+
+#: ../raster/r.sun/main.c:416
+msgid "time and insol_time are incompatible options"
+msgstr ""
+
+#: ../raster/r.sun/main.c:417
+msgid ""
+"Mode 1: instantaneous solar incidence angle & irradiance given a set local "
+"time"
+msgstr ""
+
+#: ../raster/r.sun/main.c:527
+#, c-format
+msgid "elevin raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:530
+#, c-format
+msgid "aspin raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:533
+#, c-format
+msgid "slopein raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:546
+#, c-format
+msgid "linkein raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:558
+#, c-format
+msgid "albedo raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:570
+#, c-format
+msgid "latin raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:582
+#, c-format
+msgid "coefbh raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:594
+#, c-format
+msgid "coefdh raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:770
+#, c-format
+msgid "rows changed from %d to %d"
+msgstr ""
+
+#: ../raster/r.sun/main.c:773
+#, c-format
+msgid "cols changed from %d to %d"
+msgstr ""
+
+#: ../raster/r.profile/main.c:53
+msgid "raster, profile"
+msgstr ""
+
+#: ../raster/r.profile/main.c:55
+msgid "Outputs the raster map layer values lying on user-defined line(s)."
+msgstr ""
+
+#: ../raster/r.profile/main.c:66
+msgid "Name of file for output (use output=- for stdout)"
+msgstr ""
+
+#: ../raster/r.profile/main.c:74
+msgid "Profile coordinate pairs"
+msgstr ""
+
+#: ../raster/r.profile/main.c:81
+msgid "Resolution along profile (default = current region resolution)"
+msgstr ""
+
+#: ../raster/r.profile/main.c:88
+msgid "Character to represent no data cell"
+msgstr ""
+
+#: ../raster/r.profile/main.c:92
+msgid "Interactively select End-Points"
+msgstr ""
+
+#: ../raster/r.profile/main.c:102
+msgid "Output RRR:GGG:BBB color values for each profile point"
+msgstr ""
+
+#: ../raster/r.profile/main.c:121
+#, c-format
+msgid "Illegal resolution! [%g]"
+msgstr ""
+
+#: ../raster/r.profile/main.c:130
+#, c-format
+msgid "Using resolution [%g]"
+msgstr ""
+
+#: ../raster/r.profile/main.c:176
+msgid "Output Format:"
+msgstr ""
+
+#: ../raster/r.profile/main.c:179
+#, c-format
+msgid "[Easting] [Northing] [Along Track Dist.(m)] [Elevation]"
+msgstr ""
+
+#: ../raster/r.profile/main.c:181
+#, c-format
+msgid "[Along Track Dist.(m)] [Elevation]"
+msgstr ""
+
+#: ../raster/r.profile/main.c:183
+msgid " [RGB Color]"
+msgstr ""
+
+#: ../raster/r.profile/main.c:193
+#, c-format
+msgid "Invalid coordinates %s %s"
+msgstr ""
+
+#: ../raster/r.profile/main.c:209
+#, c-format
+msgid "Use mouse to select Start Point\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:214
+#, c-format
+msgid ""
+"\n"
+"Use mouse to draw profile line\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:215
+#, c-format
+msgid "Buttons:\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:216
+#, c-format
+msgid "Left:   Mark next point\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:217
+#, c-format
+msgid "Middle: Mark next point\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:218
+#, c-format
+msgid ""
+"Right:  Finish profile and exit\n"
+"\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:305
+#, c-format
+msgid "Approx. transect length [%f] m"
+msgstr ""
+
+#: ../raster/r.profile/main.c:308
+msgid "Endpoint coordinates are outside of current region settings"
+msgstr ""
+
+#: ../raster/r.profile/input.c:29 ../raster/r.profile/input.c:46
+#: ../raster/r.profile/input.c:59
+msgid "One coordinate pair per line, please"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:155
+msgid "raster, terrain"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:156
+msgid ""
+"Generates raster maps of slope, aspect, curvatures and partial derivatives "
+"from a elevation raster map."
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:158
+msgid "Aspect is calculated counterclockwise from east."
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:165
+msgid "Name for output slope raster map"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:166 ../raster/r.slope.aspect/main.c:172
+#: ../raster/r.slope.aspect/main.c:198 ../raster/r.slope.aspect/main.c:205
+#: ../raster/r.slope.aspect/main.c:212 ../raster/r.slope.aspect/main.c:219
+#: ../raster/r.slope.aspect/main.c:226 ../raster/r.slope.aspect/main.c:233
+#: ../raster/r.slope.aspect/main.c:240 ../vector/v.surf.rst/main.c:210
+#: ../vector/v.surf.rst/main.c:228 ../vector/v.surf.rst/main.c:234
+#: ../vector/v.surf.rst/main.c:240 ../vector/v.surf.rst/main.c:246
+#: ../vector/v.surf.rst/main.c:252 ../vector/v.surf.rst/main.c:258
+#: ../vector/v.surf.rst/main.c:266 ../vector/v.surf.rst/main.c:273
+#: ../vector/v.surf.rst/main.c:280 ../vector/v.surf.rst/main.c:287
+msgid "Outputs"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:171
+msgid "Name for output aspect raster map"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:180
+msgid "Format for reporting the slope"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:190
+msgid "Type of output aspect and slope maps"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:197
+msgid "Name for output profile curvature raster map"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:204
+msgid "Name for output tangential curvature raster map"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:211
+msgid ""
+"Name for output first order partial derivative dx (E-W slope) raster map"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:218
+msgid ""
+"Name for output first order partial derivative dy (N-S slope) raster map"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:225
+msgid "Name for output second order partial derivative dxx raster map"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:232
+msgid "Name for output second order partial derivative dyy raster map"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:239
+msgid "Name for output second order partial derivative dxy raster map"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:245
+msgid "Multiplicative factor to convert elevation units to meters"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:254
+msgid "Minimum slope val. (in percent) for which aspect is computed"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:268
+msgid "Do not align the current region to the elevation layer"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:329
+#, c-format
+msgid "%s=%s - must be a positive number"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:335
+#, c-format
+msgid "%s=%s - must be a non-negative number"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:350
+#, c-format
+msgid ""
+"You must specify at least one of the parameters: <%s>, <%s>, <%s>, <%s>, <"
+"%s>, <%s>, <%s>, <%s> or <%s>"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:380
+#, c-format
+msgid "Wrong raster type: %s"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:410
+#: ../imagery/i.ortho.photo/i.photo.rectify/angle.c:67
+#, c-format
+msgid "Converting units to meters, factor=%.6f"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:992
+#, c-format
+msgid "Elevation products for mapset <%s> in <%s>"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1011
+#, c-format
+msgid "Min computed aspect %.4f, max computed aspect %.4f"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1077
+#, c-format
+msgid "Aspect raster map <%s> complete"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1119
+#, c-format
+msgid "Min computed slope %.4f, max computed slope %.4f"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1174
+#, c-format
+msgid "Slope raster map <%s> complete"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1249
+#, c-format
+msgid "Profile curve raster map <%s> complete"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1279
+#, c-format
+msgid "Tangential curve raster map <%s> complete"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1307
+#, c-format
+msgid "E-W slope raster map <%s> complete"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1335
+#, c-format
+msgid "N-S slope raster map <%s> complete"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1363
+#, c-format
+msgid "Dxx raster map <%s> complete"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1391
+#, c-format
+msgid "Dyy raster map <%s> complete"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1419
+#, c-format
+msgid "Dxy raster map <%s> complete"
+msgstr ""
+
+#: ../raster/r.resamp.interp/main.c:74
+msgid "Resamples raster map layers to a finer grid using interpolation."
+msgstr ""
+
+#: ../raster/r.resamp.interp/main.c:83
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:7
+msgid "Interpolation method"
+msgstr ""
+
+#: ../raster/r.resamp.interp/main.c:97 ../imagery/i.topo.corr/main.c:197
+#, c-format
+msgid "Invalid method: %s"
+msgstr ""
+
+#: ../raster/r.contour/main.c:91
+msgid "raster, DEM, contours, vector"
+msgstr ""
+
+#: ../raster/r.contour/main.c:92
+msgid "Produces a vector map of specified contours from a raster map."
+msgstr ""
+
+#: ../raster/r.contour/main.c:104
+msgid "List of contour levels"
+msgstr ""
+
+#: ../raster/r.contour/main.c:110
+msgid "Minimum contour level"
+msgstr ""
+
+#: ../raster/r.contour/main.c:116
+msgid "Maximum contour level"
+msgstr ""
+
+#: ../raster/r.contour/main.c:122
+msgid "Increment between contour levels"
+msgstr ""
+
+#: ../raster/r.contour/main.c:130
+msgid "Minimum number of points for a contour line (0 -> no limit)"
+msgstr ""
+
+#: ../raster/r.contour/main.c:138
+msgid "Suppress single crossing error messages"
+msgstr ""
+
+#: ../raster/r.contour/main.c:147
+msgid ""
+"The '-q' and '-n' flag is superseded and will be removed in future. Please "
+"use '--quiet' instead."
+msgstr ""
+
+#: ../raster/r.contour/main.c:152
+msgid "Neither \"levels\" nor \"step\" parameter specified."
+msgstr ""
+
+#: ../raster/r.contour/main.c:196 ../vector/v.surf.rst/main.c:613
+#: ../vector/v.net.distance/main.c:208 ../vector/v.convert/att.c:80
+#: ../vector/v.net.path/path.c:109 ../vector/v.to.points/main.c:295
+#: ../vector/v.net.allpairs/main.c:153 ../vector/v.distance/main.c:835
+#: ../vector/v.in.dwg/main.c:219 ../vector/v.overlay/main.c:525
+#: ../vector/v.net.flow/main.c:168 ../vector/v.net.timetable/main.c:103
+#: ../vector/v.in.ogr/main.c:796 ../vector/v.net.components/main.c:147
+#: ../vector/v.net.centrality/main.c:240
+#, c-format
+msgid "Unable to create table: '%s'"
+msgstr ""
+
+#: ../raster/r.contour/main.c:201 ../vector/v.in.dxf/write_vect.c:225
+#: ../vector/v.in.ascii/in.c:505 ../vector/v.convert/att.c:85
+#: ../vector/v.in.sites/main.c:174 ../vector/v.to.points/main.c:300
+#: ../vector/v.in.dwg/main.c:223 ../vector/v.reclass/main.c:297
+#: ../vector/v.in.ogr/main.c:801
+#, c-format
+msgid "Unable to create index for table <%s>, key <%s>"
+msgstr ""
+
+#: ../raster/r.contour/main.c:224 ../vector/v.convert/att.c:110
+#: ../vector/v.to.points/main.c:63 ../vector/v.overlay/line_area.c:218
+#: ../vector/v.overlay/area_area.c:345
+#, c-format
+msgid "Unable to insert new record: '%s'"
+msgstr ""
+
+#: ../raster/r.contour/main.c:244 ../vector/v.generalize/displacement.c:79
+msgid "Reading data..."
+msgstr ""
+
+#: ../raster/r.contour/main.c:270
+#, c-format
+msgid "Range of data: min=%f, max=%f"
+msgstr ""
+
+#: ../raster/r.contour/main.c:272
+msgid "Range of data: empty"
+msgstr ""
+
+#: ../raster/r.contour/main.c:299 ../raster/r.contour/main.c:303
+msgid "This step value is not allowed"
+msgstr ""
+
+#: ../raster/r.contour/main.c:327
+#, c-format
+msgid "Range of levels: min = %f, max = %f"
+msgstr ""
+
+#: ../raster/r.contour/main.c:356
+msgid "Displacing data..."
+msgstr ""
+
+#: ../raster/r.contour/cont.c:81
+#, c-format
+msgid "Writing vector contours (total levels %d)..."
+msgstr ""
+
+#: ../raster/r.contour/cont.c:211
+#, c-format
+msgid "%d crossings founds"
+msgstr ""
+
+#: ../raster/r.contour/cont.c:262
+msgid "Illegal edge number"
+msgstr ""
+
+#: ../raster/r.contour/cont.c:370
+msgid "Edge number out of range"
+msgstr ""
+
+#: ../raster/r.bilinear/main.c:44
+msgid "Bilinear interpolation utility for raster map layers."
+msgstr ""
+
+#: ../raster/r.bilinear/main.c:54 ../raster/r.bilinear/main.c:61
+msgid ""
+"Specific input value to be assigned to the north and/or south poles for "
+"longitude-latitude grids"
+msgstr ""
+
+#: ../raster/r.bilinear/main.c:67
+msgid "This module is deprecated. Please use 'r.resamp.interp' instead."
+msgstr ""
+
+#: ../raster/r.digit/digitize.c:49
+msgid "Quit without creating a map?? "
+msgstr ""
+
+#: ../raster/r.digit/main.c:47
+msgid ""
+"Interactive tool used to draw and save vector features on a graphics monitor "
+"using a pointing device (mouse) and save to a raster map."
+msgstr ""
+
+#: ../raster/r.digit/main.c:56 ../vector/v.digit/main.c:120
+msgid "Display commands to be used for canvas backdrop (separated by ';')"
+msgstr ""
+
+#: ../raster/r.digit/main.c:79
+msgid "No graphics device selected!"
+msgstr ""
+
+#: ../raster/r.digit/main.c:98
+msgid "No map created"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:31
+#, c-format
+msgid "Please choose one of the following\n"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:32
+#, c-format
+msgid "   A define an area\n"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:33
+#, c-format
+msgid "   C define a circle\n"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:34
+#, c-format
+msgid "   L define a line\n"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:35
+#, c-format
+msgid "   X exit (and create map)\n"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:36
+#, c-format
+msgid "   Q quit (without creating map)\n"
+msgstr ""
+
+#: ../raster/r.digit/get_label.c:31
+#, c-format
+msgid "Enter the category number for this %s: "
+msgstr ""
+
+#: ../raster/r.digit/get_label.c:46
+#, c-format
+msgid "Enter a label for category %ld [%s] "
+msgstr ""
+
+#: ../raster/r.digit/get_label.c:68
+msgid "Look ok? "
+msgstr ""
+
+#: ../raster/r.surf.contour/main.c:54
+msgid "Surface generation program from rasterized contours."
+msgstr ""
+
+#: ../raster/r.surf.contour/main.c:61
+msgid "Name of existing raster map containing contours"
+msgstr ""
+
+#: ../raster/r.surf.contour/main.c:68
+msgid "Output elevation raster map"
+msgstr ""
+
+#: ../raster/r.surf.contour/main.c:72
+msgid "Unused; retained for compatibility purposes, will be removed in future"
+msgstr ""
+
+#: ../raster/r.surf.contour/main.c:77
+msgid ""
+"Invoke slow, but memory frugal operation (generally not needed, will be "
+"removed in future)"
+msgstr ""
+
+#: ../raster/r.external/main.c:54
+#, c-format
+msgid "Supported Formats:\n"
+msgstr ""
+
+#: ../raster/r.external/main.c:172
+msgid ""
+"\n"
+"You can use the -o flag to r.external to override this check and use the "
+"location definition for the dataset.\n"
+msgstr ""
+
+#: ../raster/r.external/main.c:202
+msgid ""
+"Input raster map is rotated - cannot import. You may use 'gdalwarp' to "
+"transform the map to North-up."
+msgstr ""
+
+#: ../raster/r.external/main.c:310
+msgid "Complex types not supported"
+msgstr ""
+
+#: ../raster/r.external/main.c:325
+#, c-format
+msgid "Copying color table for %s"
+msgstr ""
+
+#: ../raster/r.external/main.c:343
+#, c-format
+msgid "Setting grey color table for <%s> (full 8bit range)"
+msgstr ""
+
+#: ../raster/r.external/main.c:349
+#, c-format
+msgid "Setting grey color table for <%s> (data range)"
+msgstr ""
+
+#: ../raster/r.external/main.c:363
+#, c-format
+msgid "Unable to create cell/%s file"
+msgstr ""
+
+#: ../raster/r.external/main.c:372
+#, c-format
+msgid "Unable to create fcell/%s file"
+msgstr ""
+
+#: ../raster/r.external/main.c:404
+#, c-format
+msgid "Unable to create cell_misc/%s/gdal file"
+msgstr ""
+
+#: ../raster/r.external/main.c:407
+#, c-format
+msgid "Error writing cell_misc/%s/gdal file"
+msgstr ""
+
+#: ../raster/r.external/main.c:432
+#, c-format
+msgid "Unable to create cell_misc/%s/f_format file"
+msgstr ""
+
+#: ../raster/r.external/main.c:435
+#, c-format
+msgid "Error writing cell_misc/%s/f_format file"
+msgstr ""
+
+#: ../raster/r.external/main.c:450
+msgid "Unable to write quant file"
+msgstr ""
+
+#: ../raster/r.external/main.c:483
+#, c-format
+msgid "Creating support files for %s"
+msgstr ""
+
+#: ../raster/r.external/main.c:496
+#, c-format
+msgid "Link to raster map <%s> created"
+msgstr ""
+
+#: ../raster/r.external/main.c:522
+msgid "Link GDAL supported raster file to a binary raster map layer."
+msgstr ""
+
+#: ../raster/r.external/main.c:525
+msgid "Raster file to be linked"
+msgstr ""
+
+#: ../raster/r.external/main.c:531
+msgid "Name of non-file GDAL data source"
+msgstr ""
+
+#: ../raster/r.external/main.c:543
+msgid "Band to select (default: all)"
+msgstr ""
+
+#: ../raster/r.external/main.c:566
+msgid "Require exact range"
+msgstr ""
+
+#: ../raster/r.external/main.c:595
+msgid "Name for input source not specified"
+msgstr ""
+
+#: ../raster/r.external/main.c:598
+msgid "input= and source= are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.external/main.c:623
+msgid "Unable to set window"
+msgstr ""
+
+#: ../raster/r.external/main.c:634
+#, c-format
+msgid "Imagery group <%s> already exists and will be overwritten."
+msgstr ""
+
+#: ../raster/r.external/main.c:677
+#, c-format
+msgid "Imagery group <%s> created"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:110
+msgid "raster, export, png"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:112
+msgid "Export GRASS raster as non-georeferenced PNG image."
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:119
+msgid "Name for new PNG file (use out=- for stdout)"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:127
+msgid "Compression level of PNG file"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:128
+msgid "(0 = none, 1 = fastest, 9 = best)"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:140
+msgid "Make NULL cells transparent"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:144
+msgid "Output world file"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:196 ../display/d.graph/do_graph.c:112
+#: ../display/d.graph/do_graph.c:393 ../display/d.graph/do_graph.c:408
+#: ../display/d.graph/main.c:103 ../display/d.text/main.c:147
+#: ../display/d.paint.labels/color.c:66 ../display/d.text.freetype/main.c:842
+#: ../display/d.rast/display.c:32
+#, c-format
+msgid "[%s]: No such color"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:285
+#, c-format
+msgid "Converting <%s>..."
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:300 ../raster/r.univar2/r.univar_main.c:183
+#, c-format
+msgid "Raster <%s> type mismatch"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:452
+msgid "Writing world file"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:455 ../raster/r.out.tiff/r.out.tiff.c:417
+msgid "Got null file name"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:457 ../raster/r.out.tiff/r.out.tiff.c:419
+msgid "Got null region struct"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:459
+msgid "Unable to open world file for writing"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:101
+msgid ""
+"Exports a GRASS raster map to a 8/24bit TIFF image file at the pixel "
+"resolution of the currently defined region."
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:111
+msgid "Name for new TIFF file"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:118
+msgid "TIFF file compression"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:123
+msgid "TIFF Palette output (8bit instead of 24bit)."
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:127
+msgid "Output TIFF world file"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:131
+msgid "Output Tiled TIFF"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:177
+#, c-format
+msgid ""
+"Raster map <%s> in mapset <%s> is a floating point map. Decimal values will "
+"be rounded to integer!"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:183
+msgid ""
+"Color map for palette must have less than 256 colors for the available range "
+"of data"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:198
+#, c-format
+msgid "Unable to open TIFF file <%s>"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:414
+msgid "Writing TIFF World file"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:422
+msgid "Unable to open TIFF world file for writing"
+msgstr ""
+
+#: ../raster/r.resample/main.c:56
+msgid "GRASS raster map layer data resampling capability."
+msgstr ""
+
+#: ../raster/r.resample/main.c:65
+msgid "Name of an input layer"
+msgstr ""
+
+#: ../raster/r.resample/main.c:72
+msgid "Name of an output layer"
+msgstr ""
+
+#: ../raster/r.resample/main.c:165
+msgid "Creating new cats file..."
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:49 ../raster/r.in.bin/main.c:58
+#: ../raster/r.in.bin/main.c:510
+msgid "Error reading data"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:236
+msgid "Import a binary raster file into a GRASS raster map."
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:241
+msgid "Import as floating-point data (default: integer)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:246
+msgid "Import as double-precision floating-point data (default: integer)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:250
+msgid "Signed data (two's complement)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:255
+msgid "Byte Swap the Data During Import"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:260
+msgid "Get region info from GMT style header"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:261 ../raster/r.in.bin/main.c:301
+#: ../raster/r.in.bin/main.c:309 ../raster/r.in.bin/main.c:317
+#: ../raster/r.in.bin/main.c:325 ../raster/r.in.bin/main.c:332
+#: ../raster/r.in.bin/main.c:339 ../general/g.region/main.c:158
+#: ../general/g.region/main.c:218 ../general/g.region/main.c:228
+#: ../general/g.region/main.c:238 ../general/g.region/main.c:248
+#: ../general/g.region/main.c:257 ../general/g.region/main.c:266
+#: ../general/g.region/main.c:344 ../general/g.region/main.c:355
+msgid "Bounds"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:267
+msgid "Binary raster file to be imported"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:284 ../raster/r.out.bin/main.c:310
+msgid "Number of bytes per cell"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:292 ../raster/r.out.bin/main.c:317
+msgid "Output byte order"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:300
+msgid "Northern limit of geographic region (outer edge)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:308
+msgid "Southern limit of geographic region (outer edge)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:316
+msgid "Eastern limit of geographic region (outer edge)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:324
+msgid "Western limit of geographic region (outer edge)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:331
+msgid "Number of rows"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:338
+msgid "Number of columns"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:345
+msgid "Set Value to NULL"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:366
+msgid "order= and -b are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:381
+msgid "-f and -d are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:385
+#, c-format
+msgid "-f incompatible with bytes=%d; must be 4 or 8"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:393
+#, c-format
+msgid "-d incompatible with bytes=%d; must be 8"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:400
+msgid "bytes= required for integer data"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:404
+msgid "Integer input doesn't support size=8 in this build"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:408
+msgid "bytes= must be 1, 2, 4 or 8"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:421
+msgid "Either -h or rows= and cols= must be given"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:426
+msgid "Either all or none of north=, south=, east= and west= must be given"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:433 ../display/d.grid/main.c:201
+#, c-format
+msgid "Illegal north coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:435
+#, c-format
+msgid "Illegal south coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:437 ../display/d.grid/main.c:195
+#, c-format
+msgid "Illegal east coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:439
+#, c-format
+msgid "Illegal west coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:445
+#, c-format
+msgid "Unable to open <%s>"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:464
+#, c-format
+msgid ""
+"East-West (ewres: %f) and North-South (nwres: %f) resolution differ "
+"significantly. Did you assign east= and west= correctly?"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:487
+msgid "File Size %"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:489
+msgid "Bytes do not match file size"
+msgstr ""
+
+#: ../raster/r.kappa/calc_kappa.c:32
+#, c-format
+msgid "Cannot open file <%s> to write kappa and relevant parameters"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:69
+msgid ""
+"Calculate error matrix and kappa parameter for accuracy assessment of "
+"classification result."
+msgstr ""
+
+#: ../raster/r.kappa/main.c:75
+msgid "Name of raster map containing classification result"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:80
+msgid "Name of raster map containing reference classes"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:85
+msgid "Name for output file containing error matrix and kappa"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:91
+msgid "Title for error matrix and kappa"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:96
+msgid "Wide report"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:97
+msgid "132 columns (default: 80)"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:106
+msgid "No header in the report"
+msgstr ""
+
+#: ../raster/r.kappa/prt_hdr.c:17
+#, c-format
+msgid "Cannot open file <%s> to write header"
+msgstr ""
+
+#: ../raster/r.kappa/prt_mat.c:39
+#, c-format
+msgid "Cannot open file <%s> to write cats and counts (error matrix)"
+msgstr ""
+
+#: ../raster/r.kappa/prt_label.c:16
+#, c-format
+msgid "Can't open file <%s> to write label"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:88
+msgid "Either mpeg_encode or ppmtompeg must be installed"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:213
+msgid "Reading file"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:282 ../raster/r.out.mpeg/main.c:312
+msgid "mpeg_encode ERROR"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:346 ../visualization/xganim/main.c:544
+msgid "Error reading wildcard"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:385
+msgid "Raster File Series to MPEG Conversion."
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:396 ../visualization/xganim/main.c:600
+#, c-format
+msgid "Raster file(s) for View%d"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:406
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:8
+msgid "Name for output file"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:416
+msgid "Quality factor (1 = highest quality, lowest compression)"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:420
+msgid "Quiet - suppress progress report"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:425
+msgid ""
+"Convert on the fly, use less disk space\n"
+"\t(requires r.out.ppm with stdout option)"
+msgstr ""
+
+#: ../raster/r.out.mpeg/write.c:81 ../raster/r.out.mpeg/write.c:178
+msgid "Size mismatch error!"
+msgstr ""
+
+#: ../raster/r.out.mpeg/write.c:139 ../raster/r.out.mpeg/write.c:181
+msgid "Unable to open output file"
+msgstr ""
+
+#: ../raster/r.out.mpeg/write.c:215
+msgid "Unable to create temporary files."
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:24
+#, c-format
+msgid "Data range of raster map <%s> is empty"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:31
+#, c-format
+msgid "Data range of raster map <%s> is %s to %s (entire map)"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:36
+#, c-format
+msgid "Unable to read range of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:41
+#, c-format
+msgid "Integer data range of raster map <%s> is empty"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:44
+#, c-format
+msgid "Integer data range of raster mao <%s> is %d to %d"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:63
+msgid "Enter the rule or 'help' for the format description"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:87
+msgid "Enter a rule in one of these formats:"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:89
+msgid "old_low:old_high:new_low:new_high"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:90
+msgid "old_low:old_high:new_val      (i.e. new_high == new_low)"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:91
+msgid "*:old_val:new_val             (interval [inf, old_val])"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:92
+msgid "old_val:*:new_val             (interval [old_val, inf])"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:94
+msgid "When finished type \"end\"."
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:134
+#, c-format
+msgid "'%s' is not a valid rule"
+msgstr ""
+
+#: ../raster/r.recode/main.c:41
+msgid "raster, recode category"
+msgstr ""
+
+#: ../raster/r.recode/main.c:42
+msgid "Recodes categorical raster maps."
+msgstr ""
+
+#: ../raster/r.recode/main.c:45
+msgid "Name of raster map to be recoded"
+msgstr ""
+
+#: ../raster/r.recode/main.c:52
+msgid "File containing recode rules"
+msgstr ""
+
+#: ../raster/r.recode/main.c:53
+msgid "\"-\" to read from stdin"
+msgstr ""
+
+#: ../raster/r.recode/main.c:64
+msgid "Align the current region to the input raster map"
+msgstr ""
+
+#: ../raster/r.recode/main.c:68
+msgid "Force output to 'double' raster map type (DCELL)"
+msgstr ""
+
+#: ../raster/r.recode/main.c:87 ../raster/r.reclass/main.c:85
+msgid "Input map can NOT be the same as output map"
+msgstr ""
+
+#: ../raster/r.recode/main.c:99
+#, c-format
+msgid "No rules specified. Raster map <%s> not created."
+msgstr ""
+
+#: ../raster/r.recode/main.c:102 ../raster/r.reclass/main.c:144
+msgid "No rules specified"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:110
+msgid ""
+"Makes each cell category value a function of the category values assigned to "
+"the cells around it, and stores new cell values in an output raster map "
+"layer."
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:133
+msgid "Neighborhood operation"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:134 ../raster/r.neighbors/main.c:142
+#: ../raster/r.neighbors/main.c:176
+msgid "Neighborhood"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:140
+msgid "Neighborhood size"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:149
+msgid "Title of the output raster map"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:156
+msgid "File containing weights"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:162
+msgid "Sigma (in cells) for Gaussian filter"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:166
+msgid "Do not align output with the input"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:175
+msgid "Use circular neighborhood"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:183
+msgid "Neighborhood size must be positive"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:185
+msgid "Neighborhood size must be odd"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:189
+msgid "weight= and -c are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:201
+msgid "weight= and gauss= are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:255
+#, c-format
+msgid "Method %s not compatible with Gaussian filter"
+msgstr ""
+
+#: ../raster/r.neighbors/readweights.c:18
+#, c-format
+msgid "Unable to open weights file %s"
+msgstr ""
+
+#: ../raster/r.neighbors/readweights.c:23
+#, c-format
+msgid "Error reading weights file %s"
+msgstr ""
+
+#: ../raster/r.patch/main.c:55
+msgid ""
+"Creates a composite raster map layer by using known category values from one "
+"(or more) map layer(s) to fill in areas of \"no data\" in another map layer."
+msgstr ""
+
+#: ../raster/r.patch/main.c:62
+msgid "Name of raster maps to be patched together"
+msgstr ""
+
+#: ../raster/r.patch/main.c:65
+msgid "Name for resultant raster map"
+msgstr ""
+
+#: ../raster/r.patch/main.c:77
+msgid "Use zero (0) for transparency instead of NULL"
+msgstr ""
+
+#: ../raster/r.patch/main.c:102
+msgid "The minimum number of input raster maps is two"
+msgstr ""
+
+#: ../raster/r.patch/main.c:139
+msgid "One or more input raster maps not found"
+msgstr ""
+
+#: ../raster/r.patch/main.c:181
+#, c-format
+msgid "Creating support files for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:38
+msgid "3D Raster map used for zoning, must be of type CELL"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:53
+#: ../raster/r.univar2/r.univar_main.c:52
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:9
+#: ../vector/v.univar/main.c:124
+msgid "Percentile to calculate (requires extended statistics flag)"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:56
+#: ../raster/r.univar2/r.univar_main.c:55
+msgid "Special characters: space, comma, tab"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:61
+#: ../raster/r.univar2/r.univar_main.c:60 ../vector/v.univar/main.c:128
+#: ../vector/v.what/main.c:89
+msgid "Print the stats in shell script style"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:65
+#: ../raster/r.univar2/r.univar_main.c:64
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:4
+#: ../vector/v.univar/main.c:132
+msgid "Calculate extended statistics"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:69
+#: ../raster/r.univar2/r.univar_main.c:68
+msgid "Table output format instead of standard output format"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:100 ../raster3d/r3.stats/main.c:568
+msgid "raster3d, voxel, statistics"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:102
+msgid ""
+"Calculates univariate statistics from the non-null 3d cells of a raster3d "
+"map."
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:147
+#: ../raster/r.univar2/r3.univar_main.c:186
+#: ../general/g.mremove/do_remove.c:55 ../general/g.region/main.c:508
+#: ../raster3d/base/r3.mask.main.c:78 ../raster3d/base/r3.null.main.c:106
+#: ../raster3d/r3.cross.rast/main.c:284 ../raster3d/r3.stats/main.c:611
+#: ../raster3d/r3.out.vtk/main.c:143 ../raster3d/r3.out.vtk/main.c:153
+#: ../raster3d/r3.out.v5d/main.c:307 ../raster3d/r3.out.ascii/main.c:259
+#: ../raster3d/r3.to.rast/main.c:228
+#, c-format
+msgid "3D raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:154
+#: ../raster/r.univar2/r3.univar_main.c:193 ../raster3d/base/r3.mask.main.c:84
+#: ../raster3d/base/r3.info.main.c:128 ../raster3d/base/r3.null.main.c:113
+#: ../raster3d/r3.cross.rast/main.c:318 ../raster3d/r3.stats/main.c:618
+#: ../raster3d/r3.out.vtk/main.c:209 ../raster3d/r3.out.vtk/main.c:293
+#: ../raster3d/r3.out.vtk/main.c:517 ../raster3d/r3.out.v5d/main.c:312
+#: ../raster3d/r3.out.ascii/main.c:268
+#, c-format
+msgid "Unable to open 3D raster map <%s>"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:163
+msgid "Unable to load 3D raster range"
+msgstr ""
+
+#: ../raster/r.univar2/r.univar_main.c:37
+msgid "Raster map used for zoning, must be of type CELL"
+msgstr ""
+
+#: ../raster/r.univar2/r.univar_main.c:99
+msgid ""
+"Calculates univariate statistics from the non-null cells of a raster map."
+msgstr ""
+
+#: ../raster/r.univar2/r.univar_main.c:274
+#: ../raster/r.univar2/r.univar_main.c:277
+#, c-format
+msgid "Reading row %d"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:139
+#, c-format
+msgid "Header File = %s"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:144 ../raster/r.out.bin/main.c:228
+#: ../raster/r.out.bin/main.c:407
+#, c-format
+msgid "Unable to create file <%s>"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:223
+#, c-format
+msgid "World File = %s"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:280
+msgid "Exports a GRASS raster map to a binary array."
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:296
+msgid "Name for output binary map (use output=- for stdout)"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:303
+msgid "Value to write out for null"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:322
+msgid "Generate integer output"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:326
+msgid "Generate floating-point output"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:330
+msgid "Export array with GMT compatible header"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:334
+msgid "Generate BIL world and header files"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:338
+msgid "Byte swap output"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:344
+msgid "Invalid value for null (integers only)"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:366
+msgid "order= and -s are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:375
+msgid "-i and -f are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:394
+msgid "Floating-point output requires bytes=4 or bytes=8"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:398
+msgid "Integer output doesn't support bytes=8 in this build"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:412
+msgid "GMT grid doesn't support 64-bit integers"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:418
+msgid "Creating BIL support files..."
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:435
+#, c-format
+msgid "Exporting raster as floating values (bytes=%d)"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:437
+msgid "Writing GMT float format ID=1"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:440
+#, c-format
+msgid "Exporting raster as integer values (bytes=%d)"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:442
+msgid "Writing GMT integer format ID=2"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:445
+msgid "Using the current region settings..."
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:446
+#, c-format
+msgid "north=%f"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:447
+#, c-format
+msgid "south=%f"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:448
+#, c-format
+msgid "east=%f"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:449
+#, c-format
+msgid "west=%f"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:450
+#, c-format
+msgid "r=%d"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:451
+#, c-format
+msgid "c=%d"
+msgstr ""
+
+#: ../raster/r.proj.seg/main.c:214
+msgid "Print input map's bounds in the current projection and exit"
+msgstr ""
+
+#: ../raster/r.proj.seg/main.c:220
+msgid ""
+"Print input map's bounds in the current projection and exit (shell style)"
+msgstr ""
+
+#: ../raster/r.proj.seg/main.c:253
+msgid "Input and output locations are the same"
+msgstr ""
+
+#: ../raster/r.proj.seg/main.c:349
+#, c-format
+msgid "Input map <%s@%s> in location <%s>:"
+msgstr ""
+
+#: ../raster/r.proj.seg/readcell.c:57
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:62
+#: ../imagery/i.rectify/readcell.c:55
+msgid "Unable to open temporary file"
+msgstr ""
+
+#: ../raster/r.proj.seg/readcell.c:81
+msgid "Error reading input"
+msgstr ""
+
+#: ../raster/r.proj.seg/readcell.c:90 ../raster/r.proj.seg/readcell.c:129
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:98
+#: ../imagery/i.rectify/readcell.c:87 ../imagery/i.rectify/readcell.c:126
+msgid "Error writing segment file"
+msgstr ""
+
+#: ../raster/r.proj.seg/readcell.c:117
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:128
+#: ../imagery/i.rectify/readcell.c:114
+msgid "Internal error: cache miss on fully-cached map"
+msgstr ""
+
+#: ../raster/r.proj.seg/readcell.c:126
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:137
+#: ../imagery/i.rectify/readcell.c:123
+msgid "Error seeking on segment file"
+msgstr ""
+
+#: ../raster/r.surf.fractal/process.c:53
+msgid "Unable to allocate data buffer. Check current region with g.region."
+msgstr ""
+
+#: ../raster/r.surf.fractal/spec_syn.c:61
+msgid "Preliminary surface calculations..."
+msgstr ""
+
+#: ../raster/r.surf.fractal/spec_syn.c:120
+#, c-format
+msgid "Calculating surface %d (of %d)..."
+msgstr ""
+
+#: ../raster/r.surf.fractal/interface.c:36
+msgid "raster, DEM, fractal"
+msgstr ""
+
+#: ../raster/r.surf.fractal/interface.c:38
+msgid "Creates a fractal surface of a given fractal dimension."
+msgstr ""
+
+#: ../raster/r.surf.fractal/interface.c:49
+msgid "Fractal dimension of surface (2 < D < 3)"
+msgstr ""
+
+#: ../raster/r.surf.fractal/interface.c:56
+msgid "Number of intermediate images to produce"
+msgstr ""
+
+#: ../raster/r.surf.fractal/interface.c:88
+#, c-format
+msgid "Fractal dimension of %.2lf must be between 2 and 3."
+msgstr ""
+
+#: ../raster/r.bitpattern/main.c:63
+msgid "Compares bit patterns with a raster map."
+msgstr ""
+
+#: ../raster/r.bitpattern/main.c:75
+msgid "Bit pattern position(s)"
+msgstr ""
+
+#: ../raster/r.bitpattern/main.c:81
+msgid "Bit pattern value"
+msgstr ""
+
+#: ../raster/r.bitpattern/main.c:151
+#, c-format
+msgid "Unable to write to <%s>"
+msgstr ""
+
+#: ../raster/r.reclass/reclass.c:49 ../raster/r.reclass/reclass.c:109
+msgid "Too many categories"
+msgstr ""
+
+#: ../raster/r.reclass/reclass.c:214
+#, c-format
+msgid "Cannot read header file of <%s@%s>"
+msgstr ""
+
+#: ../raster/r.reclass/reclass.c:229
+#, c-format
+msgid "Cannot create reclass file of <%s>"
+msgstr ""
+
+#: ../raster/r.reclass/reclass.c:242
+#, c-format
+msgid "Cannot create category file of <%s>"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:51
+msgid ""
+"Creates a new map layer whose category values are based upon a "
+"reclassification of the categories in an existing raster map layer."
+msgstr ""
+
+#: ../raster/r.reclass/main.c:56
+msgid "Raster map to be reclassified"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:63
+msgid "File containing reclass rules"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:71
+msgid "Title for the resulting raster map"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:91
+#, c-format
+msgid "Cannot open rules file <%s>"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:105
+#, c-format
+msgid "Enter rule(s), \"end\" when done, \"help\" if you need it\n"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:107
+#, c-format
+msgid "Data range is %.7g to %.7g\n"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:110
+#, c-format
+msgid "Data range is %.15g to %.15g\n"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:121
+#, c-format
+msgid "Illegal reclass rule -"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:122
+#, c-format
+msgid " ignored\n"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:125
+msgid " - invalid reclass rule"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:141
+#, c-format
+msgid "No rules specified. Raster map <%s> not created"
+msgstr ""
+
+#: ../raster/r.reclass/parse.c:41
+msgid "poor quality"
+msgstr ""
+
+#: ../raster/r.reclass/parse.c:43
+msgid "medium quality"
+msgstr ""
+
+#: ../raster/r.reclass/parse.c:58
+msgid "Can't have null on the left-hand side of the rule"
+msgstr ""
+
+#: ../raster/r.reclass/parse.c:87 ../raster/r.reclass/parse.c:99
+msgid "Can't have null on the right-hand side of the rule"
+msgstr ""
+
+#: ../raster/r.reclass/parse.c:195
+#, c-format
+msgid "%f rounded up to %d\n"
+msgstr ""
+
+#: ../raster/r.surf.random/main.c:46
+msgid ""
+"Produces a raster map of uniform random deviates whose range can be "
+"expressed by the user."
+msgstr ""
+
+#: ../raster/r.surf.random/main.c:53
+msgid "Minimum random value"
+msgstr ""
+
+#: ../raster/r.surf.random/main.c:59
+msgid "Maximum random value"
+msgstr ""
+
+#: ../raster/r.surf.random/main.c:65
+msgid "Create an integer raster map"
+msgstr ""
+
+#: ../raster/r.surf.random/main.c:79
+#, c-format
+msgid "Raster map <%s> generated."
+msgstr ""
+
+#: ../raster/r.surf.area/main.c:87
+msgid "Surface area estimation for rasters."
+msgstr ""
+
+#: ../raster/r.surf.area/main.c:95
+msgid "Raster file for surface"
+msgstr ""
+
+#: ../raster/r.surf.area/main.c:102
+msgid "Vertical scale"
+msgstr ""
+
+#: ../raster/r.flow/io.c:68
+#, c-format
+msgid "Unable to get header for %s"
+msgstr ""
+
+#: ../raster/r.flow/io.c:85
+msgid "Reading input files: elevation"
+msgstr ""
+
+#: ../raster/r.flow/io.c:89
+msgid "Elevation file's resolution differs from current region resolution"
+msgstr ""
+
+#: ../raster/r.flow/io.c:101
+msgid "Reading input files: aspect"
+msgstr ""
+
+#: ../raster/r.flow/io.c:104
+msgid "Resolution of aspect file differs from current region resolution"
+msgstr ""
+
+#: ../raster/r.flow/io.c:118
+msgid "Reading input files: barrier"
+msgstr ""
+
+#: ../raster/r.flow/io.c:146
+#, c-format
+msgid "Cannot create segment file %s"
+msgstr ""
+
+#: ../raster/r.flow/io.c:151
+#, c-format
+msgid "Cannot format segment file %s"
+msgstr ""
+
+#: ../raster/r.flow/io.c:157
+#, c-format
+msgid "Cannot open segment file %s"
+msgstr ""
+
+#: ../raster/r.flow/io.c:203
+msgid "Cannot reset current region"
+msgstr ""
+
+#: ../raster/r.flow/io.c:205
+msgid "Writing density file"
+msgstr ""
+
+#: ../raster/r.flow/io.c:228
+#, c-format
+msgid "Unable to find file %s"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:47
+msgid "Precomputing: e/w distances"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:49
+msgid "Precomputing: quantization tolerances"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:52
+msgid "Precomputing: inverted elevations"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:56
+msgid "Precomputing: interpolated border elevations"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:62
+msgid "Precomputing: re-oriented aspects"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:66
+msgid "Precomputing: aspects"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:110
+#, c-format
+msgid ""
+"Resolution too unbalanced:\n"
+"atan2(%f deg, %f deg) =%f < %f tolerance\n"
+"please resample input map"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:115
+#, c-format
+msgid "Resolution too unbalanced (%f x %f); please resample input map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:303
+msgid "Calculating maps ..."
+msgstr ""
+
+#: ../raster/r.flow/calc.c:408
+msgid "Unable to get current region"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:413
+msgid ""
+"Construction of slope curves (flowlines), flowpath lengths, and flowline "
+"densities (upslope areas) from a raster digital elevation model (DEM)."
+msgstr ""
+
+#: ../raster/r.flow/calc.c:451
+msgid "Input elevation raster map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:458
+msgid "Input aspect raster map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:465
+msgid "Input barrier raster map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:472
+msgid "Number of cells between flowlines"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:480
+msgid "Maximum number of segments per flowline"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:488
+msgid "Output flowline vector map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:495
+msgid "Output flowpath length raster map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:502
+msgid "Output flowline density raster map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:507
+msgid "Compute upslope flowlines instead of default downhill flowlines"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:511
+msgid "3-D lengths instead of 2-D"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:515
+msgid "Use less memory, at a performance penalty"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:533
+msgid "You must select one or more output maps (flout, lgout, dsout)"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:549
+msgid ""
+"lat/long projection not supported by r.flow. Please use 'r.watershed' for "
+"calculating flow accumulation."
+msgstr ""
+
+#: ../raster/r.flow/mem.c:39
+#, c-format
+msgid "Unable to write segment file for %s"
+msgstr ""
+
+#: ../raster/r.describe/main.c:61
+msgid "Prints terse list of category values found in a raster map layer."
+msgstr ""
+
+#: ../raster/r.describe/main.c:80
+msgid "Number of quantization steps"
+msgstr ""
+
+#: ../raster/r.describe/main.c:86
+msgid "Print the output one value per line"
+msgstr ""
+
+#: ../raster/r.describe/main.c:90
+msgid "Only print the range of the data"
+msgstr ""
+
+#: ../raster/r.describe/main.c:98
+msgid "Use the current region"
+msgstr ""
+
+#: ../raster/r.describe/main.c:102
+msgid "Read fp map as integer"
+msgstr ""
+
+#: ../raster/r.describe/main.c:126
+#, c-format
+msgid "%s = %s -- must be greater than zero"
+msgstr ""
+
+#: ../raster/r.describe/main.c:137
+#, c-format
+msgid "%s: [%s] not found"
+msgstr ""
+
+#: ../raster/r.los/main.c:82
+msgid "raster, viewshed"
+msgstr ""
+
+#: ../raster/r.los/main.c:83
+msgid "Line-of-sight raster analysis program."
+msgstr ""
+
+#: ../raster/r.los/main.c:97
+msgid "Coordinate identifying the viewing position"
+msgstr ""
+
+#: ../raster/r.los/main.c:102
+msgid "Binary (1/0) raster map to use as a mask"
+msgstr ""
+
+#: ../raster/r.los/main.c:109
+msgid "Viewing position height above the ground"
+msgstr ""
+
+#: ../raster/r.los/main.c:117
+msgid "Maximum distance from the viewing point (meters)"
+msgstr ""
+
+#: ../raster/r.los/main.c:123
+msgid "Consider earth curvature (current ellipsoid)"
+msgstr ""
+
+#: ../raster/r.los/main.c:150
+msgid "Lat/Long support is not (yet) implemented for this module."
+msgstr ""
+
+#: ../raster/r.los/main.c:155
+msgid "Specified observer coordinate is outside current region bounds."
+msgstr ""
+
+#: ../raster/r.los/main.c:211
+msgid "Pattern map should be a binary 0/1 CELL map"
+msgstr ""
+
+#: ../raster/r.los/main.c:245
+msgid ""
+"Problem to obtain current ellipsoid parameters, using sphere (6370997.0)"
+msgstr ""
+
+#: ../raster/r.los/main.c:250
+#, c-format
+msgid "Using maximum distance from the viewing point (meters): %f"
+msgstr ""
+
+#: ../general/g.setproj/proj.c:168
+#, c-format
+msgid "Unrecognized 'ask' value in proj-parms.table: %s"
+msgstr ""
+
+#: ../general/g.setproj/proj.c:178
+#, c-format
+msgid "Unrecognized default value in proj-parms.table: %s"
+msgstr ""
+
+#: ../general/g.setproj/main.c:78 ../general/g.proj/main.c:63
+msgid "general, projection"
+msgstr ""
+
+#: ../general/g.setproj/main.c:80
+msgid "Interactively reset the location's projection settings."
+msgstr ""
+
+#: ../general/g.setproj/main.c:87
+msgid "You must be in the PERMANENT mapset to run g.setproj"
+msgstr ""
+
+#: ../general/g.setproj/main.c:100
+msgid "PERMANENT: permission denied"
+msgstr ""
+
+#: ../general/g.setproj/main.c:104
+msgid "Current region cannot be set"
+msgstr ""
+
+#: ../general/g.setproj/main.c:134
+msgid "Would you still like to change some of the parameters?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:136
+msgid "The projection information will not be updated"
+msgstr ""
+
+#: ../general/g.setproj/main.c:147
+#, c-format
+msgid ""
+"Zone in default geographic region definition: %d\n"
+" is different from zone in PROJ_INFO file: %d"
+msgstr ""
+
+#: ../general/g.setproj/main.c:157
+msgid "XY-location cannot be projected"
+msgstr ""
+
+#: ../general/g.setproj/main.c:191
+msgid "Unknown projection"
+msgstr ""
+
+#: ../general/g.setproj/main.c:197
+#, c-format
+msgid "Projection %s is not specified in the file 'proj-parms.table'"
+msgstr ""
+
+#: ../general/g.setproj/main.c:204
+msgid "Do you wish to specify a geodetic datum for this location?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:213
+#, c-format
+msgid "The current datum is %s (%s)"
+msgstr ""
+
+#: ../general/g.setproj/main.c:216
+msgid "Do you wish to change the datum (or datum transformation parameters)?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:224
+msgid "The datum information has not been changed"
+msgstr ""
+
+#: ../general/g.setproj/main.c:287
+#, c-format
+msgid "The current ellipsoid is %s"
+msgstr ""
+
+#: ../general/g.setproj/main.c:289
+msgid "Do you want to change ellipsoid parameter?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:293
+msgid "The ellipse information has not been changed"
+msgstr ""
+
+#: ../general/g.setproj/main.c:310
+#, c-format
+msgid "The radius is currently %f"
+msgstr ""
+
+#: ../general/g.setproj/main.c:311
+msgid "Do you want to change the radius?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:313 ../general/g.setproj/main.c:319
+msgid "Enter radius for the sphere in meters"
+msgstr ""
+
+#: ../general/g.setproj/main.c:335
+msgid "Invalid input ellipsoid"
+msgstr ""
+
+#: ../general/g.setproj/main.c:446
+#, c-format
+msgid "The UTM zone is now set to %d"
+msgstr ""
+
+#: ../general/g.setproj/main.c:449
+msgid "Do you want to change the UTM zone?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:450
+msgid "UTM zone information has not been updated"
+msgstr ""
+
+#: ../general/g.setproj/main.c:455
+msgid ""
+"But if you change zone, all the existing data will be interpreted by "
+"projection software. GRASS will not automatically re-project or even change "
+"the headers for existing maps."
+msgstr ""
+
+#: ../general/g.setproj/main.c:460
+msgid "Would you still like to change the UTM zone?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:496
+#, c-format
+msgid "Error writing PROJ_INFO file <%s>"
+msgstr ""
+
+#: ../general/g.setproj/main.c:570
+#, c-format
+msgid "Enter plural form of units [meters]: "
+msgstr ""
+
+#: ../general/g.setproj/main.c:602
+#, c-format
+msgid "Enter singular for unit: "
+msgstr ""
+
+#: ../general/g.setproj/main.c:610
+#, c-format
+msgid "Enter conversion factor from %s to meters: "
+msgstr ""
+
+#: ../general/g.setproj/main.c:635
+#, c-format
+msgid "Error writing into UNITS output file <%s>"
+msgstr ""
+
+#: ../general/g.setproj/main.c:642
+msgid "Unable to write to DEFAULT_WIND region file"
+msgstr ""
+
+#: ../general/g.setproj/main.c:644
+#, c-format
+msgid ""
+"\n"
+"Projection information has been recorded for this location\n"
+"\n"
+msgstr ""
+
+#: ../general/g.setproj/main.c:646
+msgid "The geographic region information in WIND is now obsolete"
+msgstr ""
+
+#: ../general/g.setproj/main.c:647
+msgid "Run g.region -d to update it"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:43
+msgid "This should not happen see your system admin"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:99
+msgid "Unable to open FIPS code file"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:125
+#, c-format
+msgid "No match of fips state %d county %d"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:179
+msgid "Reading sf key_value temp file"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:212
+msgid "Invalid State FIPS code"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:302
+msgid "Reading cf key_value temp file"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:336
+msgid "Invalid County FIPS code"
+msgstr ""
+
+#: ../general/g.dirseps/main.c:36
+msgid "Internal GRASS utility for converting directory separator characters."
+msgstr ""
+
+#: ../general/g.message/main.c:33
+msgid "general, scripts"
+msgstr ""
+
+#: ../general/g.message/main.c:35
+msgid ""
+"Prints a message, warning, progress info, or fatal error in the GRASS way."
+msgstr ""
+
+#: ../general/g.message/main.c:37
+msgid "This module should be used in scripts for messages served to user."
+msgstr ""
+
+#: ../general/g.message/main.c:41 ../general/g.message/main.c:46
+#: ../general/g.message/main.c:51 ../general/g.message/main.c:56
+msgid "Type"
+msgstr ""
+
+#: ../general/g.message/main.c:42
+msgid "Print message as warning"
+msgstr ""
+
+#: ../general/g.message/main.c:47
+msgid "Print message as fatal error"
+msgstr ""
+
+#: ../general/g.message/main.c:52
+msgid "Print message as debug message"
+msgstr ""
+
+#: ../general/g.message/main.c:57
+msgid "Print message as progress info"
+msgstr ""
+
+#: ../general/g.message/main.c:61 ../general/g.message/main.c:66
+#: ../general/g.message/main.c:80
+msgid "Level"
+msgstr ""
+
+#: ../general/g.message/main.c:62
+msgid "Print message in all but full quiet mode"
+msgstr ""
+
+#: ../general/g.message/main.c:67
+msgid "Print message only in verbose mode"
+msgstr ""
+
+#: ../general/g.message/main.c:74
+msgid "Text of the message to be printed"
+msgstr ""
+
+#: ../general/g.message/main.c:83
+msgid "Level to use for debug messages"
+msgstr ""
+
+#: ../general/g.message/main.c:91
+msgid "Select only one message level"
+msgstr ""
+
+#: ../general/g.message/main.c:104
+msgid "Unable to parse input message"
+msgstr ""
+
+#: ../general/g.access/main.c:37 ../general/g.mlist/main.c:65
+#: ../general/g.ask/main.c:40 ../general/g.findetc/main.c:28
+#: ../general/g.filename/main.c:39 ../general/manage/cmd/rename.c:40
+#: ../general/manage/cmd/remove.c:99 ../general/manage/cmd/list.c:41
+#: ../general/manage/cmd/copy.c:39 ../general/g.findfile/main.c:35
+#: ../general/g.mremove/main.c:58 ../general/g.tempfile/main.c:36
+msgid "general, map management"
+msgstr ""
+
+#: ../general/g.access/main.c:39
+msgid "Controls access to the current mapset for other users on the system."
+msgstr ""
+
+#: ../general/g.access/main.c:46
+msgid "Access for group"
+msgstr ""
+
+#: ../general/g.access/main.c:53
+msgid "Access for others"
+msgstr ""
+
+#: ../general/g.access/main.c:59
+msgid "UNIX filesystem access controls are not supported by MS-Windows"
+msgstr ""
+
+#: ../general/g.access/main.c:67
+msgid "Access to the PERMANENT mapset must be open, nothing changed"
+msgstr ""
+
+#: ../general/g.access/main.c:71
+msgid "Unable to determine mapset permissions"
+msgstr ""
+
+#: ../general/g.access/set_perms.c:26
+msgid "Unable to change mapset permissions"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:11 ../general/g.access/exp_perms.c:29
+msgid "have"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:12
+msgid "read "
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:15
+msgid "Everyone"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:16
+msgid "has"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:19
+msgid "Only users in your group"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:22
+msgid "Only users outside your group"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:25
+msgid "Only you"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:31
+#, c-format
+msgid "%s %s %s %saccess to mapset %s"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:32
+msgid "will"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:32
+msgid "now"
+msgstr ""
+
+#: ../general/g.proj/datumtrans.c:47
+#, c-format
+msgid "Invalid datum code <%s>"
+msgstr ""
+
+#: ../general/g.proj/datumtrans.c:77
+#, c-format
+msgid "Datum set to <%s>"
+msgstr ""
+
+#: ../general/g.proj/datumtrans.c:79
+#, c-format
+msgid "Ellipsoid set to <%s>"
+msgstr ""
+
+#: ../general/g.proj/main.c:66
+msgid ""
+"Prints and manipulates GRASS projection information files (in various co-"
+"ordinate system descriptions)."
+msgstr ""
+
+#: ../general/g.proj/main.c:69
+msgid "Can also be used to create new GRASS locations."
+msgstr ""
+
+#: ../general/g.proj/main.c:72
+msgid "Prints and manipulates GRASS projection information files."
+msgstr ""
+
+#: ../general/g.proj/main.c:79
+msgid "Print projection information in conventional GRASS format"
+msgstr ""
+
+#: ../general/g.proj/main.c:85
+msgid "Print projection information in shell script style"
+msgstr ""
+
+#: ../general/g.proj/main.c:91
+msgid "Verify datum information and print transformation parameters"
+msgstr ""
+
+#: ../general/g.proj/main.c:97
+msgid "Print projection information in PROJ.4 format"
+msgstr ""
+
+#: ../general/g.proj/main.c:103
+msgid ""
+"Print 'flat' output with no linebreaks (applies to WKT and PROJ.4 output)"
+msgstr ""
+
+#: ../general/g.proj/main.c:113
+msgid "Print projection information in WKT format"
+msgstr ""
+
+#: ../general/g.proj/main.c:119
+msgid "Use ESRI-style format (applies to WKT output only)"
+msgstr ""
+
+#: ../general/g.proj/main.c:126 ../general/g.proj/main.c:135
+#: ../general/g.proj/main.c:145 ../general/g.proj/main.c:155
+msgid "Specification"
+msgstr ""
+
+#: ../general/g.proj/main.c:127
+msgid "Name of georeferenced data file to read projection information from"
+msgstr ""
+
+#: ../general/g.proj/main.c:136
+msgid "Name of ASCII file containing a WKT projection description"
+msgstr ""
+
+#: ../general/g.proj/main.c:138 ../general/g.proj/main.c:147
+msgid "'-' for standard input"
+msgstr ""
+
+#: ../general/g.proj/main.c:146
+msgid "PROJ.4 projection description"
+msgstr ""
+
+#: ../general/g.proj/main.c:156
+msgid "EPSG projection code"
+msgstr ""
+
+#: ../general/g.proj/main.c:164 ../general/g.proj/main.c:177
+#: ../general/g.proj/main.c:183
+msgid "Datum"
+msgstr ""
+
+#: ../general/g.proj/main.c:166
+msgid "Datum (overrides any datum specified in input co-ordinate system)"
+msgstr ""
+
+#: ../general/g.proj/main.c:168
+msgid "Accepts standard GRASS datum codes, or \"list\" to list and exit"
+msgstr ""
+
+#: ../general/g.proj/main.c:178
+msgid "Index number of datum transform parameters"
+msgstr ""
+
+#: ../general/g.proj/main.c:179
+msgid "\"0\" for unspecified or \"-1\" to list and exit"
+msgstr ""
+
+#: ../general/g.proj/main.c:185
+msgid ""
+"Force override of datum transformation information in input co-ordinate "
+"system"
+msgstr ""
+
+#: ../general/g.proj/main.c:191
+msgid "Create new projection files (modifies current location)"
+msgstr ""
+
+#: ../general/g.proj/main.c:199 ../general/g.mapset/main.c:82
+#: ../locale/scriptstrings/r.mask_to_translate.c:4
+#: ../locale/scriptstrings/r.mask_to_translate.c:6
+#: ../locale/scriptstrings/r.mask_to_translate.c:8
+msgid "Create"
+msgstr ""
+
+#: ../general/g.proj/main.c:200
+msgid "Name of new location to create"
+msgstr ""
+
+#: ../general/g.proj/main.c:216
+#, c-format
+msgid "Only one of '%s', '%s', '%s' or '%s' options may be specified"
+msgstr ""
+
+#: ../general/g.proj/main.c:259
+msgid "Projection files missing"
+msgstr ""
+
+#: ../general/g.proj/main.c:279
+#, c-format
+msgid "Only one of -%c, -%c, -%c, -%c, -%c or -%c flags may be specified"
+msgstr ""
+
+#: ../general/g.proj/main.c:306
+#, c-format
+msgid "No output format specified, define one of flags -%c, -%c, -%c, or -%c"
+msgstr ""
+
+#: ../general/g.proj/main.c:310
+#, c-format
+msgid "No output format specified, define one of flags -%c, -%c, or -%c"
+msgstr ""
+
+#: ../general/g.proj/create.c:17
+#, c-format
+msgid "Unable to create location <%s>: %s"
+msgstr ""
+
+#: ../general/g.proj/create.c:20
+#, c-format
+msgid "Unable to create projection files: %s"
+msgstr ""
+
+#: ../general/g.proj/create.c:24
+msgid "Unspecified error while creating new location"
+msgstr ""
+
+#: ../general/g.proj/create.c:26
+#, c-format
+msgid ""
+"You can switch to the new location by\n"
+"`%s=%s`"
+msgstr ""
+
+#: ../general/g.proj/create.c:36
+#, c-format
+msgid ""
+"You must select the PERMANENT mapset before updating the current location's "
+"projection (current mapset is <%s>)."
+msgstr ""
+
+#: ../general/g.proj/create.c:63
+msgid ""
+"Default region was updated to the new projection, but if you have multiple "
+"mapsets `g.region -d` should be run in each to update the region from the "
+"default"
+msgstr ""
+
+#: ../general/g.proj/create.c:67
+msgid "Projection information updated"
+msgstr ""
+
+#: ../general/g.proj/input.c:91
+msgid "Error reading WKT projection description"
+msgstr ""
+
+#: ../general/g.proj/input.c:98
+#, c-format
+msgid "Unable to open file '%s' for reading"
+msgstr ""
+
+#: ../general/g.proj/input.c:143
+msgid "Can't parse PROJ.4-style parameter string"
+msgstr ""
+
+#: ../general/g.proj/input.c:181
+msgid "Unable to translate EPSG code"
+msgstr ""
+
+#: ../general/g.proj/input.c:218
+msgid "Trying to open with OGR..."
+msgstr ""
+
+#: ../general/g.proj/input.c:226 ../general/g.proj/input.c:245
+msgid "...succeeded."
+msgstr ""
+
+#: ../general/g.proj/input.c:239
+msgid "Trying to open with GDAL..."
+msgstr ""
+
+#: ../general/g.proj/input.c:254
+#, c-format
+msgid "Could not read georeferenced file %s using either OGR nor GDAL"
+msgstr ""
+
+#: ../general/g.proj/input.c:259
+#, c-format
+msgid ""
+"Read of file %s was successful, but it did not contain projection "
+"information. 'XY (unprojected)' will be used"
+msgstr ""
+
+#: ../general/g.proj/output.c:182
+#, c-format
+msgid "%s: Unable to convert to WKT"
+msgstr ""
+
+#: ../general/g.mlist/main.c:67
+msgid ""
+"Lists available GRASS data base files of the user-specified data type "
+"optionally using the search pattern."
+msgstr ""
+
+#: ../general/g.mlist/main.c:97
+msgid "Map name search pattern (default: all)"
+msgstr ""
+
+#: ../general/g.mlist/main.c:98 ../general/g.mlist/main.c:106
+#: ../general/g.mlist/main.c:129 ../general/g.mlist/main.c:135
+msgid "Pattern"
+msgstr ""
+
+#: ../general/g.mlist/main.c:105
+msgid "Map name exclusion pattern (default: none)"
+msgstr ""
+
+#: ../general/g.mlist/main.c:115
+msgid "One-character output separator, newline, comma, space, or tab"
+msgstr ""
+
+#: ../general/g.mlist/main.c:123 ../general/manage/cmd/list.c:72
+msgid "Mapset to list (default: current search path)"
+msgstr ""
+
+#: ../general/g.mlist/main.c:128 ../general/g.mremove/main.c:66
+msgid "Use basic regular expressions instead of wildcards"
+msgstr ""
+
+#: ../general/g.mlist/main.c:134 ../general/g.mremove/main.c:71
+msgid "Use extended regular expressions instead of wildcards"
+msgstr ""
+
+#: ../general/g.mlist/main.c:139
+msgid "Print data types"
+msgstr ""
+
+#: ../general/g.mlist/main.c:144
+msgid "Print fully-qualified map names (including mapsets)"
+msgstr ""
+
+#: ../general/g.mlist/main.c:149
+msgid "Pretty printing in human readable format"
+msgstr ""
+
+#: ../general/g.mlist/main.c:154 ../general/manage/cmd/list.c:76
+msgid "Verbose listing (also list map titles)"
+msgstr ""
+
+#: ../general/g.mlist/main.c:163 ../general/g.mremove/main.c:104
+msgid "-r and -e are mutually exclusive"
+msgstr ""
+
+#: ../general/g.mlist/main.c:172 ../general/g.mlist/main.c:183
+#: ../general/g.mremove/main.c:130
+#, c-format
+msgid "Unable to compile regular expression %s"
+msgstr ""
+
+#: ../general/g.mlist/read_list.c:144 ../general/g.mremove/read_list.c:144
+#, c-format
+msgid ""
+"Format error: <%s>\n"
+"Line: %d\n"
+"%s"
+msgstr ""
+
+#: ../general/g.gui/main.c:36 ../general/g.pnmcomp/main.c:281
+msgid "general, gui"
+msgstr ""
+
+#: ../general/g.gui/main.c:38
+msgid "Launches a GRASS graphical user interface (GUI) session."
+msgstr ""
+
+#: ../general/g.gui/main.c:43
+msgid "GUI type"
+msgstr ""
+
+#: ../general/g.gui/main.c:44
+msgid "Default value: GRASS_GUI if defined, otherwise wxpython"
+msgstr ""
+
+#: ../general/g.gui/main.c:45
+msgid ""
+"wxpython;wxPython based GUI - wxGUI;tcltk;Tcl/Tk based GUI - GIS Manager "
+"(gis.m);oldtcltk;Old Tcl/Tk based GUI - Display Manager (d.m);text;command "
+"line interface only"
+msgstr ""
+
+#: ../general/g.gui/main.c:54
+msgid "Name of workspace file"
+msgstr ""
+
+#: ../general/g.gui/main.c:58
+msgid "Update default GUI setting"
+msgstr ""
+
+#: ../general/g.gui/main.c:63
+msgid "Do not launch GUI after updating the default GUI setting"
+msgstr ""
+
+#: ../general/g.gui/main.c:90
+#, c-format
+msgid "<%s> is now the default GUI"
+msgstr ""
+
+#: ../general/g.gui/main.c:103
+#, c-format
+msgid "Launching '%s' GUI in the background, please wait ..."
+msgstr ""
+
+#: ../general/g.gui/main.c:107
+msgid "The old d.m GUI is not available for WinGRASS"
+msgstr ""
+
+#: ../general/g.version/main.c:41
+msgid "general, version"
+msgstr ""
+
+#: ../general/g.version/main.c:42
+msgid "Displays version and copyright information."
+msgstr ""
+
+#: ../general/g.version/main.c:46
+msgid "Print also the copyright message"
+msgstr ""
+
+#: ../general/g.version/main.c:50
+msgid "Print also the GRASS build information"
+msgstr ""
+
+#: ../general/g.version/main.c:55
+msgid "Print also the GIS library revision number and time"
+msgstr ""
+
+#: ../general/g.version/main.c:59
+msgid "Print info in shell script style (including SVN revision number)"
+msgstr ""
+
+#: ../general/g.filename/main.c:40
+msgid "Prints GRASS data base file names."
+msgstr ""
+
+#: ../general/g.filename/main.c:48 ../general/g.findfile/main.c:48
+msgid "Name of an element"
+msgstr ""
+
+#: ../general/g.filename/main.c:54
+msgid "Name of a database file"
+msgstr ""
+
+#: ../general/g.filename/main.c:60
+msgid "Name of a mapset (default: current)"
+msgstr ""
+
+#: ../general/manage/cmd/rename.c:42
+msgid "Renames data base element files in the user's current mapset."
+msgstr ""
+
+#: ../general/manage/cmd/rename.c:57
+#, c-format
+msgid "%s file(s) to be renamed"
+msgstr ""
+
+#: ../general/manage/cmd/rename.c:75
+#, c-format
+msgid "%s <%s> not found"
+msgstr ""
+
+#: ../general/manage/cmd/rename.c:79
+#, c-format
+msgid "<%s> already exists in mapset <%s>"
+msgstr ""
+
+#: ../general/manage/cmd/rename.c:89
+#, c-format
+msgid "%s=%s,%s: files could be the same, no rename possible"
+msgstr ""
+
+#: ../general/manage/cmd/rename.c:99
+msgid "Renaming reclass maps"
+msgstr ""
+
+#: ../general/manage/cmd/remove.c:38 ../general/g.mremove/check_reclass.c:14
+#, c-format
+msgid "[%s@%s] is a base map for [%s]. Remove forced."
+msgstr ""
+
+#: ../general/manage/cmd/remove.c:41 ../general/g.mremove/check_reclass.c:18
+#, c-format
+msgid "[%s@%s] is a base map. Remove reclassed map first: %s"
+msgstr ""
+
+#: ../general/manage/cmd/remove.c:63 ../general/manage/cmd/remove.c:76
+#: ../general/g.mremove/check_reclass.c:41
+#: ../general/g.mremove/check_reclass.c:55
+#, c-format
+msgid "Removing information about reclassed map from [%s@%s] failed"
+msgstr ""
+
+#: ../general/manage/cmd/remove.c:101 ../general/g.mremove/main.c:60
+msgid "Removes data base element files from the user's current mapset."
+msgstr ""
+
+#: ../general/manage/cmd/remove.c:106
+msgid "Force remove"
+msgstr ""
+
+#: ../general/manage/cmd/remove.c:120 ../general/g.mremove/main.c:96
+#, c-format
+msgid "%s file(s) to be removed"
+msgstr ""
+
+#: ../general/manage/cmd/list.c:43
+msgid "Lists available GRASS data base files of the user-specified data type."
+msgstr ""
+
+#: ../general/manage/cmd/copy.c:41
+msgid ""
+"Copies available data files in the user's current mapset search path and "
+"location to the appropriate element directories under the user's current "
+"mapset."
+msgstr ""
+
+#: ../general/manage/cmd/copy.c:58
+#, c-format
+msgid "%s file(s) to be copied"
+msgstr ""
+
+#: ../general/manage/cmd/copy.c:74
+#, c-format
+msgid "<%s> not found"
+msgstr ""
+
+#: ../general/manage/cmd/copy.c:79
+#, c-format
+msgid "%s=%s,%s: files are the same, no copy required"
+msgstr ""
+
+#: ../general/manage/cmd/copy.c:84
+#, c-format
+msgid "<%s> already exists"
+msgstr ""
+
+#: ../general/g.findfile/main.c:37
+msgid "Searches for GRASS data base files and sets variables for the shell."
+msgstr ""
+
+#: ../general/g.findfile/main.c:54
+msgid "Name of an existing map"
+msgstr ""
+
+#: ../general/g.findfile/main.c:60
+msgid "Name of a mapset"
+msgstr ""
+
+#: ../general/g.findfile/main.c:65
+msgid "Don't add quotes"
+msgstr ""
+
+#: ../general/g.findfile/main.c:79
+#, c-format
+msgid ""
+"Parameter 'file' contains reference to <%s> mapset, but mapset parameter <"
+"%s> does not correspond"
+msgstr ""
+
+#: ../general/g.mapsets/dsply_maps.c:23
+#, c-format
+msgid "Available mapsets:"
+msgstr ""
+
+#: ../general/g.mapsets/dsply_maps.c:33
+#, c-format
+msgid "** no mapsets **\n"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:59
+msgid "general, settings, search path"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:60
+msgid "Modifies the user's current mapset search path."
+msgstr ""
+
+#: ../general/g.mapsets/main.c:61
+msgid ""
+"Affects the user's access to data existing under the other mapsets in the "
+"current location."
+msgstr ""
+
+#: ../general/g.mapsets/main.c:69
+msgid "Name(s) of existing mapset(s)"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:70 ../general/g.mapsets/main.c:79
+#: ../general/g.mapsets/main.c:88
+msgid "Search path"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:78
+msgid "Name(s) of existing mapset(s) to add to search path"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:87
+msgid "Name(s) of existing mapset(s) to remove from search path"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:91
+#: ../locale/scriptstrings/m.proj_to_translate.c:7
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:6
+#: ../locale/scriptstrings/r.out.xyz_to_translate.c:5
+msgid "Field separator"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:92
+msgid "Special characters: newline, space, comma, tab"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:97
+msgid "List all available mapsets in alphabetical order"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:102
+msgid "Print mapsets in current search path"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:107
+msgid "Show mapset selection dialog"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:132 ../general/g.mapsets/main.c:161
+#, c-format
+msgid "Mapset <%s> not found"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:163
+#, c-format
+msgid "Mapset <%s> added to search path"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:189
+#, c-format
+msgid "Mapset <%s> removed from search path"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:222
+msgid "Cannot open SEARCH_PATH for write"
+msgstr ""
+
+#: ../general/g.mapsets/dsply_path.c:30
+#, c-format
+msgid "Your mapset search list:\n"
+msgstr ""
+
+#: ../general/g.mapsets/dsply_path.c:38
+#, c-format
+msgid "<%s> not found in mapset list"
+msgstr ""
+
+#: ../general/g.mremove/main.c:76
+#: ../locale/scriptstrings/db.dropcol_to_translate.c:3
+#: ../locale/scriptstrings/db.droptable_to_translate.c:3
+msgid "Force removal (required for actual deletion of files)"
+msgstr ""
+
+#: ../general/g.mremove/main.c:80
+msgid "Remove base maps"
+msgstr ""
+
+#: ../general/g.mremove/main.c:107
+msgid "The following files would be deleted:"
+msgstr ""
+
+#: ../general/g.mremove/main.c:158
+msgid "You must use the force flag to actually remove them. Exiting."
+msgstr ""
+
+#: ../general/g.mremove/do_remove.c:21
+#, c-format
+msgid "Removing %s <%s>"
+msgstr ""
+
+#: ../general/g.mremove/do_remove.c:42 ../general/g.mremove/do_remove.c:84
+msgid "couldn't be removed"
+msgstr ""
+
+#: ../general/g.mremove/do_remove.c:62
+#, c-format
+msgid "%s: couldn't be removed"
+msgstr ""
+
+#: ../general/g.mremove/do_remove.c:67 ../general/g.mremove/do_remove.c:89
+#, c-format
+msgid "%s: missing"
+msgstr ""
+
+#: ../general/g.mremove/do_remove.c:71 ../general/g.mremove/do_remove.c:93
+#, c-format
+msgid "%s: removed"
+msgstr ""
+
+#: ../general/g.mremove/do_remove.c:100
+#, c-format
+msgid "<%s> nothing removed"
+msgstr ""
+
+#: ../general/g.mapset/main.c:48 ../general/g.region/main.c:72
+#: ../general/g.gisenv/main.c:38
+msgid "general, settings"
+msgstr ""
+
+#: ../general/g.mapset/main.c:49
+msgid "Changes current mapset."
+msgstr ""
+
+#: ../general/g.mapset/main.c:50
+msgid ""
+"Optionally create new mapset or list available mapsets in given location."
+msgstr ""
+
+#: ../general/g.mapset/main.c:57
+msgid "Name of mapset where to switch"
+msgstr ""
+
+#: ../general/g.mapset/main.c:65
+msgid "Location name (not location path)"
+msgstr ""
+
+#: ../general/g.mapset/main.c:75
+msgid ""
+"GIS data directory (full path to the directory where the new location is)"
+msgstr ""
+
+#: ../general/g.mapset/main.c:80
+msgid "Create mapset if it doesn't exist"
+msgstr ""
+
+#: ../general/g.mapset/main.c:86
+msgid "List available mapsets"
+msgstr ""
+
+#: ../general/g.mapset/main.c:93
+msgid "Either mapset= or -l must be used"
+msgstr ""
+
+#: ../general/g.mapset/main.c:139
+#, c-format
+msgid "<%s> is already the current mapset"
+msgstr ""
+
+#: ../general/g.mapset/main.c:147
+msgid "You don't have permission to use this mapset"
+msgstr ""
+
+#: ../general/g.mapset/main.c:156
+msgid "The mapset does not exist. Use -c flag to create it."
+msgstr ""
+
+#: ../general/g.mapset/main.c:165
+msgid "Unable to read GIS_LOCK environment variable"
+msgstr ""
+
+#: ../general/g.mapset/main.c:179
+#, c-format
+msgid ""
+"%s is currently running GRASS in selected mapset or lock file cannot be "
+"checked"
+msgstr ""
+
+#: ../general/g.mapset/main.c:183
+msgid "Erasing monitors..."
+msgstr ""
+
+#: ../general/g.mapset/main.c:199
+msgid "Cleaning up temporary files..."
+msgstr ""
+
+#: ../general/g.mapset/main.c:213
+msgid "Your shell continues to use the history for the old mapset"
+msgstr ""
+
+#: ../general/g.mapset/main.c:217
+#, c-format
+msgid ""
+"You can switch the history by commands:\n"
+"history -w; history -r %s/.bash_history; HISTFILE=%s/.bash_history"
+msgstr ""
+
+#: ../general/g.mapset/main.c:222
+#, c-format
+msgid ""
+"You can switch the history by commands:\n"
+"history -S; history -L %s/.history; setenv histfile=%s/.history"
+msgstr ""
+
+#: ../general/g.mapset/main.c:228
+#, c-format
+msgid "Your current mapset is <%s>"
+msgstr ""
+
+#: ../general/g.region/main.c:74
+msgid "Manages the boundary definitions for the geographic region."
+msgstr ""
+
+#: ../general/g.region/main.c:81 ../general/g.region/main.c:87
+#: ../general/g.region/main.c:175 ../general/g.region/main.c:182
+#: ../general/g.region/main.c:191 ../general/g.region/main.c:198
+#: ../general/g.region/main.c:208
+msgid "Existing"
+msgstr ""
+
+#: ../general/g.region/main.c:85
+msgid "Save as default region"
+msgstr ""
+
+#: ../general/g.region/main.c:86
+msgid "Only possible from the PERMANENT mapset"
+msgstr ""
+
+#: ../general/g.region/main.c:91
+msgid "Print the current region"
+msgstr ""
+
+#: ../general/g.region/main.c:96
+msgid "Print the current region in lat/long using the current ellipsoid/datum"
+msgstr ""
+
+#: ../general/g.region/main.c:102
+msgid "Print the current region extent"
+msgstr ""
+
+#: ../general/g.region/main.c:108
+msgid "Print the current region map center coordinates"
+msgstr ""
+
+#: ../general/g.region/main.c:114
+msgid "Print the current region in GMT style"
+msgstr ""
+
+#: ../general/g.region/main.c:120
+msgid "Print the current region in WMS style"
+msgstr ""
+
+#: ../general/g.region/main.c:126
+msgid "Print region resolution in meters (geodesic)"
+msgstr ""
+
+#: ../general/g.region/main.c:131
+msgid "Print the convergence angle (degrees CCW)"
+msgstr ""
+
+#: ../general/g.region/main.c:133
+msgid ""
+"The difference between the projection's grid north and true north, measured "
+"at the center coordinates of the current region."
+msgstr ""
+
+#: ../general/g.region/main.c:139
+msgid "Print also 3D settings"
+msgstr ""
+
+#: ../general/g.region/main.c:145
+msgid "Print the maximum bounding box in lat/long on WGS84"
+msgstr ""
+
+#: ../general/g.region/main.c:156
+msgid ""
+"Align region to resolution (default = align to bounds, works only for 2D "
+"resolution)"
+msgstr ""
+
+#: ../general/g.region/main.c:162
+msgid "Do not update the current region"
+msgstr ""
+
+#: ../general/g.region/main.c:163 ../general/g.region/main.c:366
+#: ../vector/v.label/main.c:91 ../vector/v.label/main.c:96
+#: ../vector/v.label/main.c:171 ../vector/v.label/main.c:184
+msgid "Effects"
+msgstr ""
+
+#: ../general/g.region/main.c:173
+msgid "Set current region from named region"
+msgstr ""
+
+#: ../general/g.region/main.c:189
+msgid "Set region to match this 3D raster map (both 2D and 3D values)"
+msgstr ""
+
+#: ../general/g.region/main.c:256
+msgid "Value for the top edge"
+msgstr ""
+
+#: ../general/g.region/main.c:265
+msgid "Value for the bottom edge"
+msgstr ""
+
+#: ../general/g.region/main.c:274
+msgid "Number of rows in the new region"
+msgstr ""
+
+#: ../general/g.region/main.c:275 ../general/g.region/main.c:284
+#: ../general/g.region/main.c:294 ../general/g.region/main.c:304
+#: ../general/g.region/main.c:314 ../general/g.region/main.c:324
+#: ../general/g.region/main.c:333
+msgid "Resolution"
+msgstr ""
+
+#: ../general/g.region/main.c:283
+msgid "Number of columns in the new region"
+msgstr ""
+
+#: ../general/g.region/main.c:293
+msgid "Grid resolution 2D (both north-south and east-west)"
+msgstr ""
+
+#: ../general/g.region/main.c:303
+msgid "3D grid resolution (north-south, east-west and top-bottom)"
+msgstr ""
+
+#: ../general/g.region/main.c:312
+msgid "North-south grid resolution 2D"
+msgstr ""
+
+#: ../general/g.region/main.c:322
+msgid "East-west grid resolution 2D"
+msgstr ""
+
+#: ../general/g.region/main.c:332
+msgid "Top-bottom grid resolution 3D"
+msgstr ""
+
+#: ../general/g.region/main.c:342
+msgid "Shrink region until it meets non-NULL data from this raster map"
+msgstr ""
+
+#: ../general/g.region/main.c:353
+msgid "Adjust region cells to cleanly align with this raster map"
+msgstr ""
+
+#: ../general/g.region/main.c:364
+msgid "Save current region settings in named region file"
+msgstr ""
+
+#: ../general/g.region/main.c:511
+#, c-format
+msgid "Unable to read header of 3D raster map <%s@%s>"
+msgstr ""
+
+#: ../general/g.region/main.c:554
+#, c-format
+msgid "Unable to open vector map <%s@%s>"
+msgstr ""
+
+#: ../general/g.region/main.c:836
+#, c-format
+msgid "Raster map <%s@%s>: %s"
+msgstr ""
+
+#: ../general/g.region/main.c:842
+#, c-format
+msgid "<%s> is an illegal region name"
+msgstr ""
+
+#: ../general/g.region/main.c:846
+#, c-format
+msgid "Unable to set region <%s>"
+msgstr ""
+
+#: ../general/g.region/main.c:852
+msgid "Unable to update current region"
+msgstr ""
+
+#: ../general/g.region/main.c:860
+msgid "Unable to change default region. The current mapset is not <PERMANENT>."
+msgstr ""
+
+#: ../general/g.region/main.c:877
+#, c-format
+msgid "Invalid input <%s=%s>"
+msgstr ""
+
+#: ../general/g.region/main.c:898
+msgid "format"
+msgstr ""
+
+#: ../general/g.region/zoom.c:23
+#, c-format
+msgid "Unable to open raster map <%s> in <%s>"
+msgstr ""
+
+#: ../general/g.region/zoom.c:35
+#, c-format
+msgid "Could not read from <%s>"
+msgstr ""
+
+#: ../general/g.region/printwindow.c:263 ../general/g.region/printwindow.c:516
+#: ../general/g.region/printwindow.c:647
+msgid "Unable to update lat/long projection parameters"
+msgstr ""
+
+#: ../general/g.region/printwindow.c:410
+msgid "You are already in Lat/Long. Use the -p flag instead."
+msgstr ""
+
+#: ../general/g.region/printwindow.c:412
+msgid ""
+"You are in a simple XY location, projection to Lat/Lon is not possible. Use "
+"the -p flag instead."
+msgstr ""
+
+#: ../general/g.region/printwindow.c:637
+msgid ""
+"WGS84 output not possible as this location does not contain datum "
+"transformation parameters. Try running g.setproj."
+msgstr ""
+
+#: ../general/g.region/printwindow.c:783
+msgid "Lat/Long calculations are not possible from a simple XY system"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:37
+#, c-format
+msgid "Invalid color: %s"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:53
+msgid "Error reading PPM file"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:68 ../general/g.pnmcomp/main.c:73
+#: ../general/g.pnmcomp/main.c:82 ../general/g.pnmcomp/main.c:133
+#: ../general/g.pnmcomp/main.c:146
+msgid "Invalid PPM file"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:95
+#, c-format
+msgid "File <%s> not found"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:103
+msgid "Expecting PPM but got PGM"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:108
+msgid "Expecting PGM but got PPM"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:111
+#, c-format
+msgid "Invalid magic number: 'P%c'"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:124 ../general/g.pnmcomp/main.c:141
+msgid "Invalid PGM file"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:246
+msgid "Error writing PPM file"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:263
+msgid "Error writing PGM file"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:289
+msgid "Names of input files"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:296
+msgid "Names of mask files"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:303
+msgid "Layer opacities"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:309
+msgid "Name of output file"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:316
+msgid "Name of output mask file"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:323
+msgid "Image width"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:329
+msgid "Image height"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:334 ../display/d.path/main.c:116
+#: ../vector/v.label/main.c:188 ../vector/v.label.sa/main.c:170
+#: ../vector/v.lrs/v.lrs.label/main.c:228
+msgid "Background color"
+msgstr ""
+
+#: ../general/g.gisenv/main.c:40
+msgid "Outputs and modifies the user's current GRASS variable settings."
+msgstr ""
+
+#: ../general/g.gisenv/main.c:45
+msgid "GRASS variable to get"
+msgstr ""
+
+#: ../general/g.gisenv/main.c:52
+msgid "GRASS variable to set"
+msgstr ""
+
+#: ../general/g.gisenv/main.c:61
+msgid "Where GRASS variable is stored"
+msgstr ""
+
+#: ../general/g.gisenv/main.c:66
+msgid "Use shell syntax (for \"eval\")"
+msgstr ""
+
+#: ../general/g.gisenv/main.c:70
+msgid "Don't use shell syntax"
+msgstr ""
+
+#: ../general/g.gisenv/main.c:76
+msgid "-s and -n are mutually exclusive"
+msgstr ""
+
+#: ../general/g.transform/main.c:97
+#, c-format
+msgid "Not enough points, %d are required"
+msgstr ""
+
+#: ../general/g.transform/main.c:101
+#, c-format
+msgid "Error conducting transform (%d)"
+msgstr ""
+
+#: ../general/g.transform/main.c:199
+msgid "Poorly placed control points"
+msgstr ""
+
+#: ../general/g.transform/main.c:201
+msgid "Insufficient memory"
+msgstr ""
+
+#: ../general/g.transform/main.c:203
+msgid "Parameter error"
+msgstr ""
+
+#: ../general/g.transform/main.c:205
+msgid "No active control points"
+msgstr ""
+
+#: ../general/g.transform/main.c:300
+#, c-format
+msgid "Invalid coordinates: [%s]"
+msgstr ""
+
+#: ../general/g.transform/main.c:320
+msgid "general, transformation, GCP"
+msgstr ""
+
+#: ../general/g.transform/main.c:322
+msgid "Computes a coordinate transformation based on the control points."
+msgstr ""
+
+#: ../general/g.transform/main.c:331
+msgid "Rectification polynomial order"
+msgstr ""
+
+#: ../general/g.transform/main.c:339
+msgid ""
+"idx;point index;src;source coordinates;dst;destination coordinates;fwd;"
+"forward coordinates (destination);rev;reverse coordinates (source);fxy;"
+"forward coordinates difference (destination);rxy;reverse coordinates "
+"difference (source);fd;forward error (destination);rd;reverse error (source)"
+msgstr ""
+
+#: ../general/g.transform/main.c:349 ../vector/v.out.ascii/out.c:63
+msgid "Output format"
+msgstr ""
+
+#: ../general/g.transform/main.c:353
+msgid "Display summary information"
+msgstr ""
+
+#: ../general/g.transform/main.c:359
+msgid "File containing coordinates to transform (\"-\" to read from stdin)"
+msgstr ""
+
+#: ../general/g.transform/main.c:360
+msgid "Local x,y coordinates to target east,north"
+msgstr ""
+
+#: ../general/g.transform/main.c:364
+msgid "Reverse transform of coords file or coeff. dump"
+msgstr ""
+
+#: ../general/g.transform/main.c:365
+msgid "Target east,north coordinates to local x,y"
+msgstr ""
+
+#: ../general/g.transform/main.c:369
+msgid "Display transform matrix coefficients"
+msgstr ""
+
+#: ../sites/s.out.ascii/main.c:47 ../sites/s.in.ascii/main.c:50
+msgid "sites"
+msgstr ""
+
+#: ../db/base/databases.c:52 ../db/base/dropdb.c:43 ../db/base/droptable.c:44
+#: ../db/base/createdb.c:43 ../db/base/execute.c:61 ../db/base/tables.c:46
+#: ../db/base/columns.c:45 ../db/base/select.c:67 ../db/base/describe.c:52
+#: ../doc/vector/v.example/main.c:123 ../display/d.thematic.area/main.c:230
+#: ../display/d.vect/main.c:470 ../vector/v.out.ogr/main.c:629
+#: ../vector/v.out.ascii/b2a.c:46 ../vector/v.out.svg/main.c:155
+#: ../vector/v.in.sites/main.c:158 ../vector/v.drape/main.c:288
+#: ../vector/v.extract/main.c:286 ../vector/v.out.vtk/writeVTK.c:635
+#: ../vector/v.edit/select.c:514 ../vector/v.db.connect/main.c:212
+#: ../vector/v.db.connect/main.c:278
+#, c-format
+msgid "Unable to start driver <%s>"
+msgstr ""
+
+#: ../db/base/databases.c:56
+msgid "Unable to list databases"
+msgstr ""
+
+#: ../db/base/databases.c:85
+msgid "Location name"
+msgstr ""
+
+#: ../db/base/databases.c:90 ../db/base/dropdb.c:71 ../db/base/droptable.c:78
+#: ../db/base/createdb.c:71
+msgid "database, SQL"
+msgstr ""
+
+#: ../db/base/databases.c:92
+msgid "List all databases for a given driver and location."
+msgstr ""
+
+#: ../db/base/dropdb.c:72
+msgid "Removes a database."
+msgstr ""
+
+#: ../db/base/droptable.c:79
+msgid "Removes a table from database."
+msgstr ""
+
+#: ../db/base/createdb.c:72
+msgid "Creates an empty database."
+msgstr ""
+
+#: ../db/base/execute.c:68 ../db/base/tables.c:51 ../db/base/select.c:73
+#: ../db/base/describe.c:57 ../display/d.thematic.area/main.c:235
+#: ../display/d.vect/main.c:475 ../vector/v.convert/att.c:73
+#, c-format
+msgid "Unable to open database <%s>"
+msgstr ""
+
+#: ../db/base/execute.c:78 ../db/base/execute.c:86
+#, c-format
+msgid "Error while executing: '%s'"
+msgstr ""
+
+#: ../db/base/execute.c:112 ../db/base/copy.c:37 ../db/base/select.c:255
+msgid "database, attribute table, SQL"
+msgstr ""
+
+#: ../db/base/execute.c:113
+msgid "Executes any SQL statement."
+msgstr ""
+
+#: ../db/base/execute.c:117
+msgid "Name of file containing SQL statements"
+msgstr ""
+
+#: ../db/base/execute.c:118 ../vector/v.to.db/parse.c:47
+#: ../vector/v.to.db/parse.c:99
+msgid "Query"
+msgstr ""
+
+#: ../db/base/execute.c:119
+msgid "If not given or '-' read from standard input"
+msgstr ""
+
+#: ../db/base/execute.c:123 ../db/base/execute.c:128
+#: ../vector/v.in.db/main.c:63 ../vector/v.in.db/main.c:67
+msgid "Connection"
+msgstr ""
+
+#: ../db/base/execute.c:134
+msgid "Ignore SQL errors and continue"
+msgstr ""
+
+#: ../db/base/tables.c:87
+msgid "Print tables and exit"
+msgstr ""
+
+#: ../db/base/tables.c:91
+msgid "System tables instead of user tables"
+msgstr ""
+
+#: ../db/base/tables.c:95 ../db/base/columns.c:92 ../db/base/drivers.c:73
+#: ../db/base/describe.c:125 ../locale/scriptstrings/db.test_to_translate.c:2
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:2
+#: ../locale/scriptstrings/db.dropcol_to_translate.c:2
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:2
+#: ../locale/scriptstrings/db.droptable_to_translate.c:2
+msgid "database, attribute table"
+msgstr ""
+
+#: ../db/base/tables.c:96
+msgid "Lists all tables for a given database."
+msgstr ""
+
+#: ../db/base/connect.c:45
+msgid "database, attribute table, connection settings"
+msgstr ""
+
+#: ../db/base/connect.c:47
+msgid "Prints/sets general DB connection for current mapset and exits."
+msgstr ""
+
+#: ../db/base/connect.c:51
+msgid "Print current connection parameters and exit"
+msgstr ""
+
+#: ../db/base/connect.c:57
+msgid "Check connection parameters, set if uninitialized, and exit"
+msgstr ""
+
+#: ../db/base/connect.c:74
+msgid "Database schema"
+msgstr ""
+
+#: ../db/base/connect.c:75
+msgid ""
+"Do not use this option if schemas are not supported by driver/database server"
+msgstr ""
+
+#: ../db/base/connect.c:85
+msgid "Default group of database users to which select privilege is granted"
+msgstr ""
+
+#: ../db/base/connect.c:121
+msgid "Database connection not defined. Run db.connect."
+msgstr ""
+
+#: ../db/base/connect.c:141
+#, c-format
+msgid ""
+"Default driver / database set to:\n"
+"driver: %s\n"
+"database: %s"
+msgstr ""
+
+#: ../db/base/connect.c:148
+msgid "Default driver is not set"
+msgstr ""
+
+#: ../db/base/connect.c:151
+msgid "Default database is not set"
+msgstr ""
+
+#: ../db/base/columns.c:93
+msgid "List all columns for a given table."
+msgstr ""
+
+#: ../db/base/copy.c:38
+msgid "Copy a table."
+msgstr ""
+
+#: ../db/base/copy.c:40
+msgid ""
+"Either 'from_table' (optionally with 'where') can be used or 'select' "
+"option, but not 'from_table' and 'select' at the same time."
+msgstr ""
+
+#: ../db/base/copy.c:46
+msgid "Input driver name"
+msgstr ""
+
+#: ../db/base/copy.c:52
+msgid "Input database name"
+msgstr ""
+
+#: ../db/base/copy.c:59
+msgid "Input table name (only, if 'select' is not used)"
+msgstr ""
+
+#: ../db/base/copy.c:65
+msgid "Output driver name"
+msgstr ""
+
+#: ../db/base/copy.c:71
+msgid "Output database name"
+msgstr ""
+
+#: ../db/base/copy.c:78
+msgid "Output table name"
+msgstr ""
+
+#: ../db/base/copy.c:87
+msgid "Full select statement (only, if 'from_table' and 'where' is not used)"
+msgstr ""
+
+#: ../db/base/copy.c:88
+msgid "E.g.: SELECT dedek FROM starobince WHERE obec = 'Frimburg'"
+msgstr ""
+
+#: ../db/base/copy.c:96
+msgid "Cannot combine 'from_table' and 'select' options"
+msgstr ""
+
+#: ../db/base/copy.c:114
+msgid "Either 'from_table' or 'select' option must be given."
+msgstr ""
+
+#: ../db/base/copy.c:117
+msgid "Cannot combine 'select' and 'where' options"
+msgstr ""
+
+#: ../db/base/copy.c:127
+msgid "Copy table failed"
+msgstr ""
+
+#: ../db/base/drivers.c:41
+msgid "Error trying to read dbmscap file"
+msgstr ""
+
+#: ../db/base/drivers.c:65
+msgid "Full output"
+msgstr ""
+
+#: ../db/base/drivers.c:69
+msgid "Print drivers and exit"
+msgstr ""
+
+#: ../db/base/drivers.c:74
+msgid "Lists all database drivers."
+msgstr ""
+
+#: ../db/base/select.c:93
+#, c-format
+msgid "Test %s."
+msgstr ""
+
+#: ../db/base/select.c:93 ../imagery/i.ortho.photo/i.photo.rectify/report.c:10
+#: ../imagery/i.rectify/report.c:10
+msgid "failed"
+msgstr ""
+
+#: ../db/base/select.c:93
+msgid "succeeded"
+msgstr ""
+
+#: ../db/base/select.c:205
+msgid "SQL select statement"
+msgstr ""
+
+#: ../db/base/select.c:207
+msgid "For example: 'select * from rybniky where kapri = 'hodne'"
+msgstr ""
+
+#: ../db/base/select.c:211
+msgid "Name of file with sql statement"
+msgstr ""
+
+#: ../db/base/select.c:215 ../db/base/select.c:221 ../db/base/select.c:228
+#: ../db/base/select.c:238 ../db/base/select.c:247
+#: ../vector/v.db.select/main.c:65 ../vector/v.db.select/main.c:71
+#: ../vector/v.db.select/main.c:78 ../vector/v.db.select/main.c:94
+#: ../vector/v.db.select/main.c:99
+msgid "Format"
+msgstr ""
+
+#: ../db/base/select.c:219 ../vector/v.db.select/main.c:69
+msgid "Output vertical record separator"
+msgstr ""
+
+#: ../db/base/select.c:227 ../vector/v.db.select/main.c:77
+msgid "Null value indicator"
+msgstr ""
+
+#: ../db/base/select.c:237 ../vector/v.db.select/main.c:93
+msgid "Do not include column names in output"
+msgstr ""
+
+#: ../db/base/select.c:242
+msgid "Describe query only (don't run it)"
+msgstr ""
+
+#: ../db/base/select.c:246 ../vector/v.db.select/main.c:98
+msgid "Vertical output (instead of horizontal)"
+msgstr ""
+
+#: ../db/base/select.c:251
+msgid "Only test query, do not execute"
+msgstr ""
+
+#: ../db/base/select.c:256
+msgid "Selects data from attribute table (performs SQL query statement(s))."
+msgstr ""
+
+#: ../db/base/describe.c:63 ../doc/vector/v.example/main.c:134
+#: ../vector/v.in.ascii/in.c:408 ../vector/v.info/main.c:222
+#: ../vector/v.out.ogr/main.c:639 ../vector/v.out.svg/main.c:168
+#: ../vector/v.patch/main.c:139 ../vector/v.patch/main.c:177
+#: ../vector/v.drape/main.c:299 ../vector/v.out.vtk/writeVTK.c:644
+#: ../vector/v.reclass/main.c:174 ../vector/v.db.connect/main.c:223
+#: ../vector/v.random/main.c:214
+#, c-format
+msgid "Unable to describe table <%s>"
+msgstr ""
+
+#: ../db/base/describe.c:104
+msgid "Print column names only instead of full column descriptions"
+msgstr ""
+
+#: ../db/base/describe.c:109
+msgid "Print table structure"
+msgstr ""
+
+#: ../db/base/describe.c:126
+msgid "Describes a table in detail."
+msgstr ""
+
+#: ../db/db.login/main.c:43
+msgid "database, connection settings"
+msgstr ""
+
+#: ../db/db.login/main.c:44
+msgid "Sets user/password for driver/database."
+msgstr ""
+
+#: ../db/db.login/main.c:60
+msgid "Username"
+msgstr ""
+
+#: ../db/db.login/main.c:67
+msgid "Password"
+msgstr ""
+
+#: ../db/db.login/main.c:83
+#, c-format
+msgid ""
+"\n"
+"Enter database password for connection\n"
+"<%s:%s:user=%s>\n"
+msgstr ""
+
+#: ../db/db.login/main.c:85
+#, c-format
+msgid "Hit RETURN to cancel request\n"
+msgstr ""
+
+#: ../db/db.login/main.c:93
+msgid "Exiting. Not changing current settings"
+msgstr ""
+
+#: ../db/db.login/main.c:97
+msgid "New password set"
+msgstr ""
+
+#: ../db/db.login/main.c:106
+msgid "Unable to set user/password"
+msgstr ""
+
+#: ../db/db.login/main.c:110
+msgid "The password was stored in file"
+msgstr ""
+
+#: ../db/drivers/ogr/fetch.c:132 ../db/drivers/ogr/describe.c:165
+msgid "Unknown type"
+msgstr ""
+
+#: ../db/drivers/ogr/describe.c:94
+#, c-format
+msgid "OGR driver: column '%s', OGR type %d  is not supported"
+msgstr ""
+
+#: ../db/drivers/ogr/describe.c:157
+#, c-format
+msgid ""
+"column '%s', type 'string': unknown width -> stored as varchar(250) some "
+"data may be lost"
+msgstr ""
+
+#: ../db/drivers/sqlite/main.c:47
+#, c-format
+msgid "Busy SQLITE db, already waiting for %d seconds..."
+msgstr ""
+
+#: ../db/drivers/sqlite/db.c:85
+msgid "Unable to open database: "
+msgstr ""
+
+#: ../db/drivers/sqlite/db.c:110
+msgid "SQLite database connection is still busy"
+msgstr ""
+
+#: ../db/drivers/sqlite/describe.c:191
+#, c-format
+msgid "SQLite driver: column '%s', SQLite type %d  is not supported"
+msgstr ""
+
+#: ../db/drivers/mysql/cursor.c:46
+msgid "Cannot allocate cursor."
+msgstr ""
+
+#: ../db/drivers/mysql/cursor.c:55
+msgid "Cannot ad new token."
+msgstr ""
+
+#: ../db/drivers/mysql/error.c:29
+msgid "DBMI-MySQL driver error:\n"
+msgstr ""
+
+#: ../db/drivers/mysql/fetch.c:34
+msgid "Cursor not found"
+msgstr ""
+
+#: ../db/drivers/mysql/fetch.c:52
+msgid "Cursor position is not supported by MySQL driver"
+msgstr ""
+
+#: ../db/drivers/mysql/fetch.c:190
+msgid "Cannot scan timestamp: "
+msgstr ""
+
+#: ../db/drivers/mysql/fetch.c:198
+msgid "Unknown timestamp format: "
+msgstr ""
+
+#: ../db/drivers/mysql/fetch.c:212
+msgid "Cannot scan date: "
+msgstr ""
+
+#: ../db/drivers/mysql/fetch.c:225
+msgid "Cannot scan time: "
+msgstr ""
+
+#: ../db/drivers/mysql/fetch.c:240
+msgid "Cannot scan datetime: "
+msgstr ""
+
+#: ../db/drivers/mysql/listtab.c:36
+msgid "Cannot get list of tables:\n"
+msgstr ""
+
+#: ../db/drivers/mysql/db.c:67
+msgid "Cannot connect to MySQL: "
+msgstr ""
+
+#: ../db/drivers/mysql/db.c:83
+msgid "Cannot parse MySQL embedded database name"
+msgstr ""
+
+#: ../db/drivers/mysql/db.c:99
+msgid "Cannot initialize MySQL embedded server"
+msgstr ""
+
+#: ../db/drivers/mysql/db.c:118
+msgid "Cannot connect to MySQL embedded server: "
+msgstr ""
+
+#: ../db/drivers/mysql/parse.c:60
+msgid "Wrong port number in MySQL database definition: "
+msgstr ""
+
+#: ../db/drivers/mysql/parse.c:71 ../db/drivers/postgres/parse.c:55
+msgid "'user' in database definition is not supported, use db.login"
+msgstr ""
+
+#: ../db/drivers/mysql/parse.c:75 ../db/drivers/postgres/parse.c:59
+msgid "'password' in database definition is not supported, use db.login"
+msgstr ""
+
+#: ../db/drivers/mysql/parse.c:79
+msgid "Unknown option in database definition for "
+msgstr ""
+
+#: ../db/drivers/mysql/select.c:43
+msgid "Cannot select data: \n"
+msgstr ""
+
+#: ../db/drivers/mysql/describe.c:120
+#, c-format
+msgid "MySQL driver: column '%s', type %d is not supported"
+msgstr ""
+
+#: ../db/drivers/mysql/describe.c:126
+#, c-format
+msgid ""
+"column '%s' : type BIGINT is stored as integer (4 bytes) some data may be "
+"damaged"
+msgstr ""
+
+#: ../db/drivers/postgres/fetch.c:172
+msgid "Cannot recognize boolean value"
+msgstr ""
+
+#: ../db/drivers/postgres/parse.c:63
+msgid "Unknown option in database definition for PostgreSQL: "
+msgstr ""
+
+#: ../db/drivers/postgres/describe.c:103
+#, c-format
+msgid "pg driver: PostGIS column '%s', type 'geometry'  will not be converted"
+msgstr ""
+
+#: ../db/drivers/postgres/describe.c:109
+#, c-format
+msgid "pg driver: column '%s', type %d  is not supported"
+msgstr ""
+
+#: ../db/drivers/postgres/describe.c:116
+#, c-format
+msgid ""
+"column '%s' : type int8 (bigint) is stored as integer (4 bytes) some data "
+"may be damaged"
+msgstr ""
+
+#: ../db/drivers/postgres/describe.c:120
+#, c-format
+msgid ""
+"column '%s' : type character varying is stored as varchar(250) some data may "
+"be lost"
+msgstr ""
+
+#: ../db/drivers/postgres/describe.c:126
+#, c-format
+msgid ""
+"column '%s' : type bool (boolean) is stored as char(1), values: 0 (false), 1 "
+"(true)"
+msgstr ""
+
+#: ../doc/raster/r.example/main.c:85
+msgid "raster, keyword2, keyword3"
+msgstr ""
+
+#: ../doc/raster/r.example/main.c:86
+msgid "My first raster module"
+msgstr ""
+
+#: ../doc/raster/r.example/main.c:127
+#, c-format
+msgid "Unable to read file header of <%s>"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:50
+msgid "vector, keyword2, keyword3"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:51
+msgid "My first vector module"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:79
+msgid "Unable to set predetermined vector open level"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:85 ../display/d.what.vect/main.c:126
+#: ../vector/v.net.connectivity/main.c:115 ../vector/v.surf.rst/main.c:569
+#: ../vector/v.surf.rst/main.c:724 ../vector/v.surf.rst/main.c:813
+#: ../vector/v.info/main.c:113 ../vector/v.net.bridge/main.c:80
+#: ../vector/v.out.ascii/out.c:154 ../vector/v.support/main.c:135
+#: ../vector/v.net.distance/main.c:140 ../vector/v.net/main.c:164
+#: ../vector/v.buffer2/main.c:316 ../vector/v.net.allpairs/main.c:110
+#: ../vector/v.hull/main.c:307 ../vector/v.net.visibility/main.c:82
+#: ../vector/v.net.visibility/main.c:94 ../vector/v.to.3d/main.c:72
+#: ../vector/v.net.flow/main.c:132 ../vector/v.edit/main.c:166
+#: ../vector/v.net.spanningtree/main.c:81
+#: ../vector/lidar/v.lidar.growing/main.c:141
+#: ../vector/lidar/v.lidar.growing/main.c:145
+#: ../vector/lidar/v.lidar.edgedetection/main.c:223
+#: ../vector/lidar/v.lidar.correction/main.c:186
+#: ../vector/v.net.timetable/main.c:317 ../vector/v.net.components/main.c:108
+#: ../vector/v.net.centrality/main.c:188 ../vector/v.generalize/main.c:295
+#, c-format
+msgid "Unable to open vector map <%s>"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:103 ../display/d.thematic.area/plot1.c:196
+#: ../display/d.vect/area.c:54 ../display/d.vect/plot1.c:205
+#: ../display/d.vect.chart/plot.c:38 ../vector/v.extrude/main.c:163
+#: ../vector/v.info/main.c:208 ../vector/v.out.ascii/b2a.c:40
+#: ../vector/v.sample/main.c:167 ../vector/v.buffer2/main.c:329
+#: ../vector/v.db.select/main.c:149 ../vector/v.vect.stats/main.c:303
+#: ../vector/v.vect.stats/main.c:379 ../vector/v.univar/main.c:209
+#: ../vector/v.surf.idw/read_sites.c:34 ../vector/v.drape/main.c:271
+#: ../vector/v.extract/main.c:278 ../vector/v.distance/main.c:359
+#: ../vector/v.distance/main.c:395 ../vector/v.to.3d/trans3.c:47
+#: ../vector/v.to.3d/trans2.c:45 ../vector/v.overlay/main.c:345
+#: ../vector/v.edit/select.c:507 ../vector/v.what.rast/main.c:127
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:119
+#: ../vector/v.reclass/main.c:122 ../vector/v.to.rast/vect2rast.c:51
+#: ../vector/v.to.rast/support.c:124 ../vector/v.to.rast/support.c:285
+#: ../vector/v.to.rast/support.c:435 ../vector/v.db.connect/main.c:208
+#: ../vector/v.generalize/misc.c:163
+#, c-format
+msgid "Database connection not defined for layer %d"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:167
+#, c-format
+msgid "Unable to get attribute data for cat %d"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:176
+#, c-format
+msgid "Error while retrieving database record for cat %d"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:209
+#, c-format
+msgid "Unable to copy attribute table to vector map <%s>"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:225
+msgid "miscellaneous, distance"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:226
+msgid ""
+"A simple utility for converting bearing and distance measurements to "
+"coordinates and vice versa."
+msgstr ""
+
+#: ../misc/m.cogo/main.c:228
+msgid "It assumes a cartesian coordinate system"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:232
+msgid "Lines are labelled"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:236
+msgid "Suppress warnings"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:241
+msgid "Convert from coordinates to bearing and distance"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:256
+msgid "Starting coordinate pair"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:266
+#, c-format
+msgid "Couldn't open COGO file <%s>"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:275
+#, c-format
+msgid "Couldn't open output file <%s>"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:305 ../misc/m.cogo/main.c:308
+msgid "Converting starting coordinate pair"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:324
+#, c-format
+msgid "Input parse error on line %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/cplane.c:40
+#, c-format
+msgid "Cutting plane number <%d> not found"
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:49 ../visualization/nviz/src/nviz_init.c:53
+msgid "visualization, raster, vector, raster3d"
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:50
+msgid "Creates a 3D rendering of GIS data."
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:51
+msgid ""
+"Renders surfaces (raster data), 2D/3D vector data, and volumes (3D raster "
+"data) in 3D."
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:134
+#, c-format
+msgid "Vertical exaggeration not given, using calculated value %.0f"
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:146
+#, c-format
+msgid "Viewpoint height not given, using calculated value %.0f"
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:229
+msgid "Unsupported output format"
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:231 ../imagery/i.cluster/main.c:346
+#, c-format
+msgid "File <%s> created."
+msgstr ""
+
+#: ../misc/m.nviz.image/surface.c:68
+#, c-format
+msgid "Missing topography attribute for surface %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/surface.c:129 ../misc/m.nviz.image/volume.c:144
+#, c-format
+msgid "Color attribute not defined, using default <%s>"
+msgstr ""
+
+#: ../misc/m.nviz.image/surface.c:134
+#, c-format
+msgid "Missing color attribute for surface %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/surface.c:211
+#, c-format
+msgid "Surface id %d doesn't exist"
+msgstr ""
+
+#: ../misc/m.nviz.image/surface.c:258 ../misc/m.nviz.image/surface.c:265
+#, c-format
+msgid "Unable to set draw mode for surface id %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:42 ../misc/m.nviz.image/volume.c:125
+#, c-format
+msgid "3d raster map <%s> not found"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:92 ../misc/m.nviz.image/volume.c:231
+#, c-format
+msgid "Error tokenize '%s'"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:99 ../misc/m.nviz.image/volume.c:247
+#, c-format
+msgid "Volume set number %d is not available"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:105
+#, c-format
+msgid "Unable to add isosurface (volume set %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:113 ../misc/m.nviz.image/volume.c:131
+#: ../misc/m.nviz.image/volume.c:139 ../misc/m.nviz.image/volume.c:155
+#: ../misc/m.nviz.image/volume.c:162 ../misc/m.nviz.image/volume.c:173
+#: ../misc/m.nviz.image/volume.c:180
+#, c-format
+msgid "Unable to set isosurface (%d) attribute (%d) of volume %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:242
+#, c-format
+msgid "Wrong name for axis: %s"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:253
+#, c-format
+msgid "Unable to add slice (volume set %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:266
+#, c-format
+msgid "Unable to set slice (%d) position of volume %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:271
+#, c-format
+msgid "Unable to set slice (%d) transparency of volume %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:51
+msgid "Use draw mode for all loaded surfaces"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:52 ../misc/m.nviz.image/args.c:130
+#: ../misc/m.nviz.image/args.c:139 ../misc/m.nviz.image/args.c:146
+#: ../misc/m.nviz.image/args.c:152 ../misc/m.nviz.image/args.c:160
+#: ../misc/m.nviz.image/args.c:169 ../misc/m.nviz.image/args.c:179
+#: ../misc/m.nviz.image/args.c:187 ../misc/m.nviz.image/args.c:197
+#: ../misc/m.nviz.image/args.c:205 ../misc/m.nviz.image/args.c:215
+msgid "Surfaces"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:89
+msgid "Name for output image file (without extension)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:90 ../misc/m.nviz.image/args.c:104
+#: ../misc/m.nviz.image/args.c:114
+msgid "Image"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:102
+#: ../locale/scriptstrings/d.out.file_to_translate.c:4
+msgid "Graphics file format"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:112
+msgid "Size (width, height) of output image"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:129
+msgid "Name of raster map(s) for elevation"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:138
+msgid "Elevation value(s)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:145
+msgid "Name of raster map(s) for color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:151
+msgid "Color value(s)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:159
+msgid "Name of raster map(s) for mask"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:168
+msgid "Name of raster map(s) for transparency"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:178
+msgid "Transparency value(s)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:186
+msgid "Name of raster map(s) for shininess"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:196
+msgid "Shininess value(s)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:204
+msgid "Name of raster map(s) for emission"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:214
+msgid "Emission value(s)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:228
+msgid "Draw mode"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:231 ../misc/m.nviz.image/args.c:242
+#: ../misc/m.nviz.image/args.c:253 ../misc/m.nviz.image/args.c:265
+#: ../misc/m.nviz.image/args.c:277 ../misc/m.nviz.image/args.c:286
+#: ../misc/m.nviz.image/args.c:296 ../misc/m.nviz.image/args.c:526
+#: ../misc/m.nviz.image/args.c:538
+msgid "Draw"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:240
+msgid "Fine resolution"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:251
+msgid "Coarse resolution"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:262
+msgid "Draw style"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:274
+msgid "Shading"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:283
+msgid "Wire color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:295
+msgid "Surface position"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:307
+msgid "Name of line vector overlay map(s)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:308 ../misc/m.nviz.image/args.c:319
+#: ../misc/m.nviz.image/args.c:330 ../misc/m.nviz.image/args.c:342
+#: ../misc/m.nviz.image/args.c:352 ../misc/m.nviz.image/args.c:364
+msgid "Vector lines"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:318
+msgid "Vector line width"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:327
+msgid "Vector line color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:339
+msgid "Vector line display mode"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:351
+msgid "Vector line height"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:363
+msgid "Vector lines position"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:375
+msgid "Name of point vector overlay map(s)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:376 ../misc/m.nviz.image/args.c:387
+#: ../misc/m.nviz.image/args.c:399 ../misc/m.nviz.image/args.c:410
+#: ../misc/m.nviz.image/args.c:423 ../misc/m.nviz.image/args.c:433
+msgid "Vector points"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:386
+msgid "Icon size"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:398
+msgid "Icon width"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:407
+msgid "Icon color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:419
+msgid "Icon marker"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:432
+msgid "Vector points position"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:449
+msgid "Viewpoint position (x,y model coordinates)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:450 ../misc/m.nviz.image/args.c:461
+#: ../misc/m.nviz.image/args.c:471 ../misc/m.nviz.image/args.c:483
+#: ../misc/m.nviz.image/args.c:504
+msgid "Viewpoint"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:460
+msgid "Viewpoint height (in map units)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:470
+msgid "Viewpoint field of view (in degrees)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:482
+msgid "Viewpoint twist angle (in degrees)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:503
+msgid "Focus to point on surface (from SW corner in map units)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:513 ../misc/m.nviz.image/args.c:548
+#: ../misc/m.nviz.image/args.c:560 ../misc/m.nviz.image/args.c:570
+#: ../misc/m.nviz.image/args.c:578 ../misc/m.nviz.image/args.c:586
+#: ../misc/m.nviz.image/args.c:595 ../misc/m.nviz.image/args.c:605
+#: ../misc/m.nviz.image/args.c:613 ../misc/m.nviz.image/args.c:623
+#: ../misc/m.nviz.image/args.c:635 ../misc/m.nviz.image/args.c:645
+#: ../misc/m.nviz.image/args.c:656
+msgid "Volumes"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:523
+msgid "Volume draw mode"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:535
+msgid "Volume shading"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:547
+msgid "Volume position"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:558
+msgid "Volume resolution"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:569
+msgid "Isosurface level"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:577
+msgid "Name of volume for isosurface color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:585
+msgid "Isosurface color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:594
+msgid "Name of 3D raster map(s) for isosurface transparency"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:604
+msgid "Transparency value(s)for isosurfaces"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:612
+msgid "Name of 3D raster map(s) for shininess"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:622
+msgid "Shininess value(s) for isosurfaces"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:634
+msgid "Volume slice parallel to given axis (x, y, z)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:644
+msgid "Volume slice position"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:655
+msgid "Volume slice transparency"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:671
+msgid "Cutting plane index (0-5)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:672 ../misc/m.nviz.image/args.c:681
+#: ../misc/m.nviz.image/args.c:690 ../misc/m.nviz.image/args.c:701
+#: ../misc/m.nviz.image/args.c:712
+msgid "Cutting planes"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:680
+msgid "Cutting plane x,y,z coordinates"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:691
+msgid "Cutting plane rotation along the vertical axis"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:702
+msgid "Cutting plane tilt"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:713
+msgid "Cutting plane color (between two surfaces)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:727
+msgid "Light position (x,y,z model coordinates)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:728 ../misc/m.nviz.image/args.c:734
+#: ../misc/m.nviz.image/args.c:743 ../misc/m.nviz.image/args.c:753
+msgid "Lighting"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:733
+msgid "Light color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:742
+msgid "Light brightness"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:752
+msgid "Light ambient"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:764
+msgid ""
+"nw;North-West edge;ne;North-East edge;sw;South-West edge;se;South-East edge"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:768
+msgid "Fringe edges"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:769 ../misc/m.nviz.image/args.c:775
+#: ../misc/m.nviz.image/args.c:784
+msgid "Fringe"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:774
+msgid "Fringe color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:783
+msgid "Fringe elevation"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:796
+msgid ""
+"Place north arrow at given position \t(in screen coordinates from bottom "
+"left corner)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:798 ../misc/m.nviz.image/args.c:807
+#: ../misc/m.nviz.image/args.c:814
+msgid "Decoration"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:806
+msgid "North arrow size (in map units)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:813
+msgid "North arrow color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:862
+#, c-format
+msgid "At least one <%s> or <%s> required"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:876 ../misc/m.nviz.image/args.c:906
+#: ../misc/m.nviz.image/args.c:912 ../misc/m.nviz.image/args.c:918
+#: ../misc/m.nviz.image/args.c:924 ../misc/m.nviz.image/args.c:930
+#: ../misc/m.nviz.image/args.c:936
+#, c-format
+msgid "Inconsistent number of attributes (<%s/%s> %d: <%s> %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:947
+#, c-format
+msgid "Inconsistent number of attributes (<%s> %d: <%s> %d x 3)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:952 ../misc/m.nviz.image/args.c:957
+#: ../misc/m.nviz.image/args.c:968 ../misc/m.nviz.image/args.c:975
+#: ../misc/m.nviz.image/args.c:982 ../misc/m.nviz.image/args.c:989
+#: ../misc/m.nviz.image/args.c:996 ../misc/m.nviz.image/args.c:1028
+#, c-format
+msgid "Inconsistent number of attributes (<%s> %d: <%s> %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:1012 ../misc/m.nviz.image/args.c:1021
+#, c-format
+msgid "Inconsistent number of attributes (<%s> %d: <%s> %d, <%s> %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:1034
+#, c-format
+msgid "Inconsistent number of attributes (<%s> %d: <%s> %d x 6)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:1045
+#, c-format
+msgid "Inconsistent number of attributes (<%s/%s> %d: <%s> %d, <%s> %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/vector.c:179
+msgid "Unknown icon marker"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:1
+msgid "Imports Mapgen or Matlab-ASCII vector maps into GRASS."
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:2
+#: ../locale/scriptstrings/v.convert.all_to_translate.c:2
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:2
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:2
+#: ../vector/v.in.dxf/main.c:60 ../vector/v.in.ascii/in.c:48
+#: ../vector/v.in.dwg/main.c:65 ../vector/v.in.ogr/main.c:106
+msgid "vector, import"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:3
+msgid "Input map is in Matlab format"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:4
+msgid "Create a 3D vector points map from 3 column Matlab data"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:5
+msgid "Name of input file in Mapgen/Matlab format"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:6
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:10
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:11
+msgid "Name for output vector map (omit for display to stdout)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split.frame_to_translate.c:1
+msgid "Split the display into subframes."
+msgstr ""
+
+#: ../locale/scriptstrings/d.split.frame_to_translate.c:2
+msgid "Number of subframes"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split.frame_to_translate.c:3
+msgid "Split horizontally not vertically"
+msgstr ""
+
+#: ../locale/scriptstrings/d.monsize_to_translate.c:1
+msgid "Selects/starts specified monitor at specified size"
+msgstr ""
+
+#: ../locale/scriptstrings/d.monsize_to_translate.c:2
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:2
+#: ../locale/scriptstrings/d.resize_to_translate.c:2
+#: ../locale/scriptstrings/d.split_to_translate.c:2
+#: ../display/d.frame/frame.c:60 ../display/d.erase/main.c:32
+#: ../display/d.colorlist/main.c:35 ../display/d.extend/main.c:31
+#: ../display/d.font/main.c:46 ../display/d.font.freetype/main.c:59
+msgid "display, setup"
+msgstr ""
+
+#: ../locale/scriptstrings/d.monsize_to_translate.c:3
+msgid "Display monitor to start"
+msgstr ""
+
+#: ../locale/scriptstrings/d.monsize_to_translate.c:4
+msgid "Width in pixels of new display monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.monsize_to_translate.c:5
+msgid "Height in pixels of new display monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:1
+msgid "Moves displayed maps to another monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:3
+msgid "clear target monitor before moving"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:4
+msgid "stay with source monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:5
+msgid "kill source monitor after moving"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:6
+msgid "Target monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:7
+msgid "Source monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.resize_to_translate.c:1
+msgid "Resizes active display monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.resize_to_translate.c:3
+msgid "New width for window"
+msgstr ""
+
+#: ../locale/scriptstrings/d.resize_to_translate.c:4
+msgid "New height for window"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:1
+msgid "Calculates new grid3D volume from r3.mapcalc expression."
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:2
+msgid "A (grid3D file)"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:3
+msgid "B (grid3D file)"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:4
+msgid "C (grid3D file)"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:5
+msgid "D (grid3D file)"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:6
+msgid "E (grid3D file)"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:7
+msgid "F (grid3D file)"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:8
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:8
+msgid "Formula (e.g. A-B or A*C+B)"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:9
+msgid "Name for output grid3D volume"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:10
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:10
+msgid "Show help"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:11
+msgid "Expert mode (enter a set of r3.mapcalc expressions)"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:12
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:12
+msgid "Do not overwrite existing map"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gns_to_translate.c:1
+msgid ""
+"Imports US-NGA GEOnet Names Server (GNS) country files into a GRASS vector "
+"points map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gns_to_translate.c:2
+#: ../locale/scriptstrings/v.in.geonames_to_translate.c:2
+msgid "vector, import, gazetteer"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gns_to_translate.c:3
+msgid "Uncompressed GNS file from NGA (with .txt extension)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gns_to_translate.c:4
+#: ../locale/scriptstrings/v.in.geonames_to_translate.c:4
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:6
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:4
+#: ../locale/scriptstrings/v.centroids_to_translate.c:4
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:5
+#: ../locale/scriptstrings/v.in.wfs_to_translate.c:4
+msgid "Name for output vector map"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:1
+msgid ""
+"Set color rules for features in a vector using a numeric attribute column."
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:2
+msgid "vector, color table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:3
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:6
+#: ../locale/scriptstrings/v.report_to_translate.c:5
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:3
+#: ../locale/scriptstrings/v.centroids_to_translate.c:3
+#: ../vector/v.hull/main.c:278
+msgid "Name of input vector map"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:4
+msgid "Name of column containing numeric data"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:5
+msgid "Layer number of data column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:6
+msgid "Name of color column to populate"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:8
+msgid "Manually set range (min,max)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:13
+msgid "Path to rules file"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:15
+msgid "Save placeholder raster map for use with d.legend"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:1
+msgid "Removes existing attribute table of a vector map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:2
+#: ../locale/scriptstrings/v.db.join_to_translate.c:2
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:2
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:2
+#: ../locale/scriptstrings/v.db.update_to_translate.c:2
+#: ../locale/scriptstrings/v.db.dropcol_to_translate.c:2
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:2
+#: ../locale/scriptstrings/v.db.renamecol_to_translate.c:2
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:2
+#: ../vector/v.db.select/main.c:53 ../vector/v.vect.stats/main.c:128
+#: ../vector/v.distance/main.c:114 ../vector/v.to.db/main.c:33
+#: ../vector/v.db.connect/main.c:50
+msgid "vector, database, attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:3
+msgid "Force removal (required for actual deletion of table)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:4
+msgid "Vector map from which to remove attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:5
+msgid "Name of existing attribute table (default: vector map name)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:6
+msgid "Layer from which to drop linked attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/d.shadedmap_to_translate.c:1
+msgid "Drapes a color raster over a shaded relief map using d.his"
+msgstr ""
+
+#: ../locale/scriptstrings/d.shadedmap_to_translate.c:2
+msgid "Name of shaded relief or aspect map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.shadedmap_to_translate.c:3
+msgid "Name of raster to drape over relief map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.shadedmap_to_translate.c:4
+msgid "Percent to brighten"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:1
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:1
+msgid ""
+"Calculates univariate statistics on selected table column for a GRASS vector "
+"map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:2
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:2
+#: ../vector/v.univar/main.c:93 ../vector/v.class/main.c:45
+#: ../vector/v.qcount/main.c:69 ../vector/v.normal/main.c:79
+#: ../vector/v.kcv/main.c:76 ../vector/lidar/v.outlier/main.c:73
+#: ../vector/v.random/main.c:84
+msgid "vector, statistics"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:3
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:3
+msgid "Extended statistics (quartiles and 90th percentile)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:4
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:4
+msgid "Name of data table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:5
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:5
+msgid "Column on which to calculate statistics (must be numeric)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:6
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:6
+msgid "Database/directory for table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:7
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:7
+msgid "Database driver"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:8
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:8
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:13
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:47
+msgid "WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:1
+msgid "Joins a database table to a vector map table."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:3
+msgid "Vector map to which to join other table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:4
+msgid "Layer where to join"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:5
+msgid "Join column in map table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:6
+msgid "Other table name"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:7
+msgid "Join column in other table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.convert.all_to_translate.c:1
+msgid ""
+"Converts all older versions of GRASS vector maps in current mapset to "
+"current format."
+msgstr ""
+
+#: ../locale/scriptstrings/v.convert.all_to_translate.c:3
+msgid "run non-interactively"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:1
+msgid ""
+"Import waypoints, routes, and tracks from a GPS receiver or GPS download "
+"file into a vector map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:2
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:2
+msgid "vector, import, GPS"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:4
+msgid "Import waypoints"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:5
+msgid "Import routes"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:6
+msgid "Import track"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:7
+msgid "Force vertices of track or route data as points"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:8
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:10
+msgid "Do not attempt projection transform from WGS84"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:9
+msgid "Device or file used to import data"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:11
+msgid "Format of GPS input data (use gpsbabel supported formats)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:12
+msgid ""
+"Projection of input data (PROJ.4 style), if not set Lat/Lon WGS84 is assumed"
+msgstr ""
+
+#: ../locale/scriptstrings/db.test_to_translate.c:1
+msgid "Test database driver, database must exist and set by db.connect."
+msgstr ""
+
+#: ../locale/scriptstrings/db.test_to_translate.c:3
+msgid "Test name"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.srtm_to_translate.c:1
+msgid "Import SRTM HGT files into GRASS"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.srtm_to_translate.c:3
+msgid "SRTM input tile (file without .hgt.zip extension)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.srtm_to_translate.c:4
+msgid "Output raster map (default: input tile)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.srtm_to_translate.c:5
+msgid "Input is a 1-arcsec tile (default: 3-arcsec)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:1
+msgid ""
+"Displays spectral response at user specified locations in group or images."
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:2
+msgid "imagery, raster, multispectral"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:3
+msgid "Group input"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:4
+msgid "Raster input maps"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:5
+msgid "Write output to PNG image"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:6
+msgid "Use image list and not group"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:7
+msgid "Select multiple points"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:8
+msgid "Show pick coordinates instead of numbering in the legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.redraw_to_translate.c:1
+msgid "Redraws the current display frame in the GRASS monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.redraw_to_translate.c:2
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:2
+#: ../display/d.mon/cmd/main.c:49 ../visualization/ximgview/main.c:270
+msgid "display"
+msgstr ""
+
+#: ../locale/scriptstrings/d.redraw_to_translate.c:3
+msgid "Redraw all frames"
+msgstr ""
+
+#: ../locale/scriptstrings/d.redraw_to_translate.c:4
+msgid "Do not preserve individual regions when redrawing all frames"
+msgstr ""
+
+#: ../locale/scriptstrings/g.manual_to_translate.c:1
+msgid "Display the HTML man pages of GRASS"
+msgstr ""
+
+#: ../locale/scriptstrings/g.manual_to_translate.c:2
+msgid "general, manual, help"
+msgstr ""
+
+#: ../locale/scriptstrings/g.manual_to_translate.c:3
+msgid "Display index"
+msgstr ""
+
+#: ../locale/scriptstrings/g.manual_to_translate.c:4
+msgid "Display as MAN text page instead of HTML page in browser"
+msgstr ""
+
+#: ../locale/scriptstrings/g.manual_to_translate.c:5
+msgid "Manual entry to be displayed"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.geonames_to_translate.c:1
+msgid "Imports geonames.org country files into a GRASS vector points map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.geonames_to_translate.c:3
+msgid "Uncompressed geonames file from (with .txt extension)"
+msgstr ""
+
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:1
+msgid "Exports attribute tables into various formats."
+msgstr ""
+
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:3
+msgid "GRASS table name"
+msgstr ""
+
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:4
+msgid "Table file to be exported or DB connection string"
+msgstr ""
+
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:5
+msgid "Table format"
+msgstr ""
+
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:6
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:5
+msgid "Name for output table"
+msgstr ""
+
+#: ../locale/scriptstrings/i.in.spotvgt_to_translate.c:1
+msgid "Import of SPOT VGT NDVI file into a raster map"
+msgstr ""
+
+#: ../locale/scriptstrings/i.in.spotvgt_to_translate.c:2
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:2
+msgid "raster, imagery, import"
+msgstr ""
+
+#: ../locale/scriptstrings/i.in.spotvgt_to_translate.c:3
+msgid "Also import quality map (SM status map layer) and filter NDVI map"
+msgstr ""
+
+#: ../locale/scriptstrings/i.in.spotvgt_to_translate.c:4
+msgid "existing SPOT VGT NDVI HDF file (0001_NDV.HDF)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:1
+msgid "Fills no-data areas in raster maps using spline interpolation."
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:2
+msgid "raster, elevation, interpolation"
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:3
+msgid "Name of input raster map in which to fill nulls"
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:4
+msgid "Name for output raster map with nulls filled by interpolation"
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:5
+msgid "Spline tension parameter"
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:6
+msgid "Spline smoothing parameter"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.sites.all_to_translate.c:1
+msgid ""
+"Converts all old GRASS < Ver5.7 sites maps in current mapset to vector maps."
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.sites.all_to_translate.c:2
+msgid "sites, vector, import"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.sites.all_to_translate.c:3
+msgid "Run non-interactively"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:1
+msgid "Performs auto-balancing of colors for LANDSAT images."
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:2
+msgid "raster, imagery, colors"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:3
+msgid "LANDSAT red channel"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:4
+msgid "LANDSAT green channel"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:5
+msgid "LANDSAT blue channel"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:6
+msgid "Cropping intensity (upper brightness level)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:7
+msgid "Extend colors to full range of data on each channel"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:8
+msgid "Preserve relative colors, adjust brightness only"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:9
+msgid "Reset to standard color range"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:1
+msgid ""
+"Exports a vector map to a GPS receiver or file format supported by GpsBabel."
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:2
+msgid "vector, export, GPS"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:3
+msgid "Export as waypoints"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:4
+msgid "Export as routes"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:5
+msgid "Export as tracks"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:7
+msgid "Feature type(s)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:8
+msgid "Name for output file or GPS device"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:9
+msgid "GpsBabel supported output format"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:10
+#: ../locale/scriptstrings/v.report_to_translate.c:6
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:17
+#: ../locale/scriptstrings/v.centroids_to_translate.c:6
+#: ../vector/v.out.vtk/main.c:83
+msgid "Layer number"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:11
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:5
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:6
+msgid ""
+"A single vector map can be connected to multiple database tables. This "
+"number determines which table to use."
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:12
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:15
+msgid "Subset"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:14
+msgid "Example: income < 1000 and inhab >= 10000"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:1
+msgid "Draws polar diagram of angle map such as aspect or flow directions"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:2
+#: ../locale/scriptstrings/d.correlate_to_translate.c:2
+msgid "display, diagram"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:3
+msgid "Name of raster angle map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:4
+msgid "Pixel value to be interpreted as undefined (different from NULL)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:5
+msgid "Name of optional EPS output file"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:6
+msgid "Plot using Xgraph"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:1
+msgid ""
+"Adds one or more columns to the attribute table connected to a given vector "
+"map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:3
+msgid "Name of vector map for which to edit attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:4
+msgid "Layer number where to add column(s)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:6
+msgid "Name and type of the new column(s) ('name type [,name type, ...]')"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:7
+msgid ""
+"Data types depend on database backend, but all support VARCHAR(), INT, "
+"DOUBLE PRECISION and DATE"
+msgstr ""
+
+#: ../locale/scriptstrings/db.dropcol_to_translate.c:1
+msgid "Drops a column from selected attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/db.dropcol_to_translate.c:4
+msgid "Table from which to drop attribute column"
+msgstr ""
+
+#: ../locale/scriptstrings/db.dropcol_to_translate.c:5
+msgid "Name of the column"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:1
+msgid "Tasseled Cap (Kauth Thomas) transformation for LANDSAT-TM data"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:2
+msgid "raster, imagery"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:3
+msgid "use transformation rules for LANDSAT-4"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:4
+msgid "use transformation rules for LANDSAT-5"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:5
+msgid "use transformation rules for LANDSAT-7"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:6
+msgid "raster input map (LANDSAT channel 1)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:7
+msgid "raster input map (LANDSAT channel 2)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:8
+msgid "raster input map (LANDSAT channel 3)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:9
+msgid "raster input map (LANDSAT channel 4)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:10
+msgid "raster input map (LANDSAT channel 5)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:11
+msgid "raster input map (LANDSAT channel 7)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:12
+msgid "raster output TC maps prefix"
+msgstr ""
+
+#: ../locale/scriptstrings/r.pack_to_translate.c:1
+msgid "Packs up a raster map and support files for copying."
+msgstr ""
+
+#: ../locale/scriptstrings/r.pack_to_translate.c:2
+#: ../locale/scriptstrings/r.unpack_to_translate.c:2
+msgid "raster, copying"
+msgstr ""
+
+#: ../locale/scriptstrings/r.pack_to_translate.c:3
+msgid "Name of raster map to pack up"
+msgstr ""
+
+#: ../locale/scriptstrings/r.pack_to_translate.c:4
+msgid "Name for output file (default is input-map.pack)"
+msgstr ""
+
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:1
+msgid "Imports attribute tables in various formats."
+msgstr ""
+
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:3
+msgid "Table file to be imported or DB connection string"
+msgstr ""
+
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:4
+msgid "Table name of SQL DB table"
+msgstr ""
+
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:6
+msgid "Name for auto-generated unique key column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:1
+msgid ""
+"Creates and connects a new attribute table to a given layer of an existing "
+"vector map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:3
+msgid "Vector map for which to add new attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:4
+msgid "Name of new attribute table (default: vector map name)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:5
+msgid "Layer where to add new attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:6
+msgid ""
+"Name and type of the new column(s) (types depend on database backend, but "
+"all support VARCHAR(), INT, DOUBLE PRECISION and DATE)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:1
+msgid "Import E00 file into a vector map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:4
+msgid "E00 file"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:5
+msgid "Input type point, line or area"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:1
+msgid ""
+"Download waypoints, routes, and tracks from a Garmin GPS receiver into a "
+"vector map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:4
+msgid "Download Waypoints from GPS"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:5
+msgid "Download Routes from GPS"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:6
+msgid "Download Track from GPS"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:7
+msgid "Force import of track or route data as points"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:8
+msgid "Use gardump instead of gpstrans as the download program"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:9
+msgid "Import track in 3D (gardump only)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:12
+msgid "Port Garmin receiver is connected to"
+msgstr ""
+
+#: ../locale/scriptstrings/r.li.setup_to_translate.c:1
+msgid "Configuration editor for r.li.'index'"
+msgstr ""
+
+#: ../locale/scriptstrings/r.li.setup_to_translate.c:2
+msgid "raster, landscape structure analysis"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:1
+msgid "Calculate new raster map from a r.mapcalc expression."
+msgstr ""
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:2
+msgid "A"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:3
+msgid "B"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:4
+msgid "C"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:5
+msgid "D"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:6
+msgid "E"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:7
+msgid "F"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:11
+msgid "Expert mode (enter a set of r.mapcalc expressions)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:1
+msgid ""
+"Produces tilings of the source projection for use in the destination region "
+"and projection."
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:2
+msgid "raster, tiling"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:3
+msgid "Produces shell script output"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:4
+msgid "Produces web map server query string output"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:5
+msgid ""
+"Name of region to use instead of current region for bounds and resolution"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:6
+msgid "Source projection"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:7
+#: ../locale/scriptstrings/r.tileset_to_translate.c:9
+msgid "Conversion factor from units to meters in source projection"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:8
+msgid "Destination projection, defaults to this location's projection"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:10
+msgid "Maximum number of columns for a tile in the source projection"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:11
+msgid "Maximum number of rows for a tile in the source projection"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:12
+msgid "Number of cells tiles should overlap in each direction"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:14
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:50
+msgid "Verbosity level"
+msgstr ""
+
+#: ../locale/scriptstrings/v.report_to_translate.c:1
+msgid "Reports geometry statistics for vectors."
+msgstr ""
+
+#: ../locale/scriptstrings/v.report_to_translate.c:2
+msgid "vector, report, statistics"
+msgstr ""
+
+#: ../locale/scriptstrings/v.report_to_translate.c:3
+msgid "Reverse sort the result"
+msgstr ""
+
+#: ../locale/scriptstrings/v.report_to_translate.c:4
+msgid "Sort the result"
+msgstr ""
+
+#: ../locale/scriptstrings/v.report_to_translate.c:7
+msgid "Value to calculate"
+msgstr ""
+
+#: ../locale/scriptstrings/v.report_to_translate.c:8
+msgid "mi(les),f(eet),me(ters),k(ilometers),a(cres),h(ectares),p(ercent)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:1
+msgid ""
+"Dissolves boundaries between adjacent areas sharing a common category number "
+"or attribute."
+msgstr ""
+
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:2
+msgid "vector, area, dissolve"
+msgstr ""
+
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:5
+msgid "Layer number. If -1, all layers are extracted."
+msgstr ""
+
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:7
+msgid "Name of column used to dissolve common boundaries"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:1
+msgid "Creates a MASK for limiting raster operation."
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:2
+msgid "raster, mask"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:3
+msgid "Raster map to use as MASK"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:5
+msgid "Category values to use for MASK (format: 1 2 3 thru 7 *)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:7
+msgid "Create inverse MASK from specified 'maskcats' list"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:9
+msgid "Overwrite existing MASK"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:10
+msgid "Remove existing MASK (overrides other options)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:1
+msgid "Displays thematic vector map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:2
+msgid "display, vector, thematic, legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:3
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:44
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:48
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:51
+msgid "Files"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:4
+#: ../display/d.zoom/main.c:100
+msgid "Name of vector map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:5
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:7
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:9
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:11
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:13
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:16
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:25
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:46
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:53
+msgid "Theme"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:8
+msgid "Name of attribute column to use for thematic display (must be numeric)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:10
+msgid "Type of thematic display"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:12
+msgid "Thematic divisions of data for display"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:14
+msgid "Break points for custom breaks option"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:15
+msgid "Separate values by spaces (0 10 20 30 ...)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:19
+msgid "Vector point icon for point data"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:21
+msgid "Icon size for point data"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:22
+msgid "Minimum icon size/line width for graduated points/lines)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:24
+msgid "Maximum icon size/line width for graduated points and lines"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:26
+msgid "Number of classes for interval theme (integer)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:27
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:30
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:33
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:36
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:39
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:55
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:57
+#: ../display/d.grid/main.c:82 ../display/d.grid/main.c:87
+#: ../display/d.grid/main.c:93
+msgid "Color"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:28
+msgid "Color scheme for graduated color mapping"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:29
+msgid "Select 'single_color' for graduated point/line display"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:31
+msgid "Color for graduated points map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:32
+msgid "GRASS named color or R:G:B triplet. Set color scheme to single color"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:34
+msgid "Color for graduated lines or point/area outlines"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:35
+msgid "GRASS named color or R:G:B triplet. Set color scheme to single color."
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:37
+msgid "Beginning color for custom color gradient"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:38
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:41
+msgid "Must be expressed as R:G:B triplet"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:40
+msgid "Ending color for custom color gradient"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:42
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:59
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:61
+msgid "Misc"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:43
+msgid "Select x11 display monitor for legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:45
+msgid "Save thematic map commands to group file for GIS Manager"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:49
+msgid "Root for the name of psmap instruction files to be in current directory"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:50
+msgid "If not set, no psmap instruction files will be created)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:52
+msgid "Name of group file where thematic map commands will be saved"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:54
+msgid "Create graphic legend in x11 display monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:56
+msgid "Only draw fills (no outlines) for areas and points"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:58
+msgid "Update color values to GRASSRGB column in attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:60
+msgid "Output legend for GIS Manager (for scripting use only)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:62
+msgid "Use math notation brackets in legend"
+msgstr ""
+
+#: ../locale/scriptstrings/r.colors.stddev_to_translate.c:1
+msgid "Set color rules based on stddev from a map's mean value."
+msgstr ""
+
+#: ../locale/scriptstrings/r.colors.stddev_to_translate.c:4
+msgid "Color using standard deviation bands"
+msgstr ""
+
+#: ../locale/scriptstrings/r.colors.stddev_to_translate.c:5
+msgid "Force center at zero"
+msgstr ""
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:1
+msgid "Mosaics up to 4 images and extends colormap; creates map *.mosaic"
+msgstr ""
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:2
+msgid "raster, imagery, mosaicking"
+msgstr ""
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:3
+msgid "1st map for mosaic (top of image stack)."
+msgstr ""
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:4
+msgid "2nd map for mosaic."
+msgstr ""
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:5
+msgid "3rd map for mosaic."
+msgstr ""
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:6
+msgid "4th map for mosaic."
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:1
+msgid "Downloads and imports data from WMS servers."
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:2
+msgid "wms"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:3
+#: ../vector/v.in.dxf/main.c:82 ../vector/v.in.dwg/main.c:96
+msgid "List available layers and exit"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:4
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:8
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:17
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:21
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:23
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:25
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:27
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:29
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:31
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:33
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:35
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:38
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:49
+msgid "Request"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:5
+msgid "Skip to downloading (to resume downloads faster)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:6
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:10
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:40
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:42
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:44
+msgid "Download"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:7
+msgid "Don't request transparent data"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:9
+msgid "Clean existing data out of download directory"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:12
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:14
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:19
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:46
+msgid "Import"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:13
+msgid "Don't reproject the data, just patch it"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:15
+msgid "Use GET method instead of POST data method"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:16
+msgid "This may be needed to connect to servers which lack POST capability"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:20
+msgid "Mapserver to request data from"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:22
+msgid "Layers to request from map server"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:24
+msgid "Styles to request from map server"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:26
+msgid "Source projection to request from server"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:28
+msgid "Image format requested from the server"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:30
+msgid "Addition query options for server"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:32
+msgid "Maximum columns to request at a time"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:34
+msgid "Maximum rows to request at a time"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:36
+msgid "Additional options for r.tileset"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:37
+msgid "Named region to request data for. Current region used if omitted"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:39
+msgid "Folder to save downloaded data to"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:41
+msgid "Additional options for wget"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:43
+msgid "Additional options for curl"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:45
+msgid "Reprojection method to use"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:47
+msgid "Filename to save capabilities XML file to"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:48
+msgid "Requires list available layers flag"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:1
+msgid "Updates a column in the attribute table connected to a vector map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:3
+msgid "Vector map to edit the attribute table for"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:4
+msgid "Layer to which the table to be changed is connected"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:5
+msgid "Column to update"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:6
+msgid "Literal value to update the column with"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:7
+msgid "Varchar values must be in single quotes, e.g. 'grass'"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:8
+msgid "Name of attribute column to query"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:9
+msgid "Can be a combination of columns, e.g. col1+col2"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:10
+msgid ""
+"WHERE conditions for update, without 'where' keyword (e.g. cat=1 or col1/"
+"col2>1)"
+msgstr ""
+
+#: ../locale/scriptstrings/db.droptable_to_translate.c:1
+msgid "Drops an attribute table."
+msgstr ""
+
+#: ../locale/scriptstrings/db.droptable_to_translate.c:4
+msgid "Table to drop"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:1
+msgid "Convert coordinates from one projection to another (cs2cs frontend)."
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:2
+msgid "miscellaneous, projection"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:3
+msgid "Input coordinate file (omit to read from stdin)"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:4
+#: ../locale/scriptstrings/m.proj_to_translate.c:6
+#: ../locale/scriptstrings/m.proj_to_translate.c:8
+#: ../locale/scriptstrings/m.proj_to_translate.c:18
+#: ../locale/scriptstrings/m.proj_to_translate.c:20
+msgid "Files & format"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:5
+msgid "Output coordinate file (omit to send to stdout)"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:9
+msgid "Input projection parameters (PROJ.4 style)"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:10
+#: ../locale/scriptstrings/m.proj_to_translate.c:12
+#: ../locale/scriptstrings/m.proj_to_translate.c:14
+#: ../locale/scriptstrings/m.proj_to_translate.c:16
+msgid "Projections"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:11
+msgid "Output projection parameters (PROJ.4 style)"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:13
+msgid "Use LL WGS84 as input and current location as output projection"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:15
+msgid "Use current location as input and LL WGS84 as output projection"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:17
+msgid ""
+"Output long/lat in decimal degrees, or other projections with many decimal "
+"places"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:19
+msgid ""
+"Script style output in CSV format respecting the field separator settings"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:21
+msgid "Verbose mode (print projection parameters and filenames to stderr)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.dropcol_to_translate.c:1
+msgid ""
+"Drops a column from the attribute table connected to a given vector map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.dropcol_to_translate.c:3
+msgid "Vector map for which to drop attribute column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.dropcol_to_translate.c:4
+msgid "Layer where to drop column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.dropcol_to_translate.c:5
+msgid "Name of the column to drop"
+msgstr ""
+
+#: ../locale/scriptstrings/d.m_to_translate.c:1
+msgid "Display manager for GRASS"
+msgstr ""
+
+#: ../locale/scriptstrings/d.m_to_translate.c:2
+msgid "Name of .dmrc settings file"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:1
+msgid ""
+"Georeference, rectify and import Terra-ASTER imagery and relative DEM's "
+"using gdalwarp."
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:3
+msgid "Input ASTER image to be georeferenced & rectified"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:4
+msgid "ASTER imagery processing type (Level 1A, Level 1B, or relative DEM)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:5
+msgid ""
+"L1A or L1B band to translate (1, 2, 3n, 3b, 4-14). Can only translate a "
+"single band"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:1
+msgid "Displays a raster map and its legend on a graphics window"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:3
+#: ../display/d.legend/main.c:180
+msgid "Flip legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:4
+msgid "Omit entries with missing label"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:5
+#: ../display/d.legend/main.c:175
+msgid "Draw smooth gradient"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:6
+msgid "Name of raster map to display"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:7
+msgid "Number of lines to appear in the legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:8
+msgid "Name of raster map to generate legend from"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:9
+msgid "Name of raster map to print in legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:10
+msgid "Position of vertical map-legend separator (in percent)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:1
+msgid ""
+"Calculates univariate statistics from a raster map based on vector polygons "
+"and uploads statistics to new attribute columns."
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:2
+msgid "vector, raster, statistics"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:3
+msgid "Continue if upload column(s) already exist"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:5
+msgid "Name of vector polygon map"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:6
+msgid ""
+"A single vector map can be connected to multiple database tables. This "
+"number determines which table to use"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:7
+msgid "Name of raster map to calculate statistics from"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:8
+msgid "Column prefix for new attribute columns"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:1
+msgid ""
+"Divides active display into two frames & displays maps/executes commands in "
+"each frame."
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:3
+msgid "Enter raster map to display in 1st frame"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:4
+msgid "Enter command to execute in 1st frame"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:5
+msgid "Enter raster map to display in 2nd frame"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:6
+msgid "Enter command to execute in 2nd frame"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:7
+msgid "How to split display"
+msgstr ""
+
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:1
+msgid ""
+"Reclasses a raster map greater or less than user specified area size (in "
+"hectares)."
+msgstr ""
+
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:2
+msgid "raster, statistics, aggregation"
+msgstr ""
+
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:5
+msgid "Lesser value option that sets the <= area size limit [hectares]"
+msgstr ""
+
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:6
+msgid "Greater value option that sets the >= area size limit [hectares]"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:1
+msgid "Uploads vector values at positions of vector points to the table."
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:3
+msgid "Vector map to modify"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:4
+msgid "Layer in the vector to be modified"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:5
+msgid "Column to be updated with the query result"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:6
+msgid "Vector map to be queried"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:7
+msgid "Layer of the query vector containing data"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:8
+msgid "Column to be queried"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:9
+msgid "Maximum query distance in map units"
+msgstr ""
+
+#: ../locale/scriptstrings/gis.m_to_translate.c:1
+msgid "GIS manager for GRASS"
+msgstr ""
+
+#: ../locale/scriptstrings/gis.m_to_translate.c:2
+msgid "Name of GIS manager settings file (.grc)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.gpsdrive_to_translate.c:1
+msgid "Export display monitor to a GpsDrive compatible backdrop image"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.gpsdrive_to_translate.c:2
+msgid "display, export, GPS"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.gpsdrive_to_translate.c:3
+msgid "name for new map image (lives in ~/.gpsdrive/maps/)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.gpsdrive_to_translate.c:4
+msgid "Make JPEG instead of PNG image"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:1
+msgid "Slide show of GRASS raster/vector maps."
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:2
+msgid "display, slideshow"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:3
+msgid "Show vector maps rather than raster maps"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:4
+msgid "Map prefix. Specify character(s) to view selected maps only"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:5
+msgid "Map number show across the monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:6
+msgid "Map number show down the monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:7
+msgid "Mapsets to use. Specify multiple mapsets comma separated"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:8
+msgid "Number of seconds to pause between slides"
+msgstr ""
+
+#: ../locale/scriptstrings/v.build.all_to_translate.c:1
+msgid "Rebuilds topology on all vector maps in the current mapset."
+msgstr ""
+
+#: ../locale/scriptstrings/v.build.all_to_translate.c:2
+#: ../vector/v.info/main.c:265 ../vector/v.clean/test/topocheck.c:42
+msgid "vector"
+msgstr ""
+
+#: ../locale/scriptstrings/v.centroids_to_translate.c:1
+msgid "Adds missing centroids to closed boundaries."
+msgstr ""
+
+#: ../locale/scriptstrings/v.centroids_to_translate.c:2
+msgid "vector, centroid, area"
+msgstr ""
+
+#: ../locale/scriptstrings/v.centroids_to_translate.c:5
+msgid "Action to be taken"
+msgstr ""
+
+#: ../locale/scriptstrings/v.centroids_to_translate.c:7
+msgid "Category number starting value"
+msgstr ""
+
+#: ../locale/scriptstrings/v.centroids_to_translate.c:8
+#: ../vector/v.category/main.c:114
+msgid "Category increment"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:1
+msgid "Import ASCII x,y[,z] coordinates as a series of lines."
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:3
+msgid "Create a 3D line from 3 column data"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:4
+msgid "Name of input file (or \"-\" to read from stdin)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:1
+msgid ""
+"Brovey transform to merge multispectral and high-res panchromatic channels"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:2
+msgid "imagery, fusion, Brovey"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:3
+msgid "LANDSAT sensor"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:4
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:6
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:8
+msgid "Sensor"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:5
+msgid "QuickBird sensor"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:7
+msgid "SPOT sensor"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:9
+msgid "Name of input raster map (green: tm2 | qbird_green | spot1)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:10
+msgid "Name of input raster map (NIR: tm4 | qbird_nir | spot2)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:11
+msgid "Name of input raster map (MIR; tm5 | qbird_red | spot3)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:12
+msgid "Name of input raster map (etmpan | qbird_pan | spotpan)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:13
+msgid "Name for output raster map prefix (e.g. 'brov')"
+msgstr ""
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:1
+msgid "Calculates Optimum-Index-Factor table for LANDSAT TM bands 1-5, & 7"
+msgstr ""
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:2
+msgid "raster, imagery, statistics"
+msgstr ""
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:3
+msgid "LANDSAT TM band 1."
+msgstr ""
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:4
+msgid "LANDSAT TM band 2."
+msgstr ""
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:5
+msgid "LANDSAT TM band 3."
+msgstr ""
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:6
+msgid "LANDSAT TM band 4."
+msgstr ""
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:7
+msgid "LANDSAT TM band 5."
+msgstr ""
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:8
+msgid "LANDSAT TM band 7."
+msgstr ""
+
+#: ../locale/scriptstrings/d.correlate_to_translate.c:1
+msgid "Prints a graph of the correlation between data layers (in pairs)."
+msgstr ""
+
+#: ../locale/scriptstrings/d.correlate_to_translate.c:3
+#: ../locale/scriptstrings/d.correlate_to_translate.c:4
+#: ../locale/scriptstrings/d.correlate_to_translate.c:5
+#: ../locale/scriptstrings/d.correlate_to_translate.c:6
+msgid "raster input map"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:1
+msgid "Tool to maintain GRASS extensions in local GRASS installation."
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:2
+msgid ""
+"Downloads, installs extensions from GRASS Addons SVN repository into local "
+"GRASS installation or removes installed extensions."
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:3
+msgid "general, extensions"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:4
+msgid "Name of extension to install/remove"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:5
+#: ../vector/v.net/main.c:69
+msgid "Operation to be performed"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:6
+msgid "SVN Addons repository URL"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:7
+msgid "Prefix where to install extension"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:8
+msgid "List available modules in the GRASS Addons SVN repository"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:10
+msgid "Install system-wide (may need system administrator rights)"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:11
+msgid "Install system-wide using sudo"
+msgstr ""
+
+#: ../locale/scriptstrings/r.out.xyz_to_translate.c:1
+msgid ""
+"Export a raster map to a text file as x,y,z values based on cell centers."
+msgstr ""
+
+#: ../locale/scriptstrings/r.univar.sh_to_translate.c:1
+msgid "calculates univariate statistics from a GRASS raster map"
+msgstr ""
+
+#: ../locale/scriptstrings/r.univar.sh_to_translate.c:3
+msgid "extended statistics (quartiles and percentile)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.univar.sh_to_translate.c:4
+#: ../display/d.legend/main.c:92 ../display/d.zoom/main.c:90
+msgid "Name of raster map"
+msgstr ""
+
+#: ../locale/scriptstrings/r.univar.sh_to_translate.c:5
+msgid "Percentile to calculate (requires -e flag)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.wfs_to_translate.c:1
+msgid "Import GetFeature from WFS"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.wfs_to_translate.c:2
+msgid "vector, import, wfs"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.wfs_to_translate.c:3
+msgid "GetFeature URL starting with 'http'"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.png_to_translate.c:1
+msgid "Saves active display monitor to PNG file in home directory"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.png_to_translate.c:2
+#: ../locale/scriptstrings/d.out.file_to_translate.c:2
+msgid "display, export"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.png_to_translate.c:3
+msgid "Name of PNG file"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.png_to_translate.c:4
+msgid "Resolution of output file (single=1, double=2, quad=4)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.renamecol_to_translate.c:1
+msgid ""
+"Renames a column in the attribute table connected to a given vector map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.renamecol_to_translate.c:3
+msgid "Vector map for which to rename attribute column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.renamecol_to_translate.c:4
+msgid "Layer where to rename column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.renamecol_to_translate.c:5
+msgid "Old and new name of the column (old,new)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:1
+msgid "Blends color components of two raster maps by a given ratio."
+msgstr ""
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:2
+msgid "raster"
+msgstr ""
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:3
+msgid "Name of first raster map for blending"
+msgstr ""
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:4
+msgid "Name of second raster map for blending"
+msgstr ""
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:5
+msgid "Base name for red, green and blue output maps containing the blend"
+msgstr ""
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:6
+msgid "Percentage weight of first map for color blending"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:1
+msgid "Saves the contents of the active display monitor to a graphics file."
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:3
+msgid "Name for output file (do NOT add extension)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:5
+msgid "Dimensions of output file versus current window size"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:6
+msgid "(same=1, double size=2, quadruple size=4)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:7
+#: ../locale/scriptstrings/d.out.file_to_translate.c:9
+#: ../locale/scriptstrings/d.out.file_to_translate.c:12
+#: ../locale/scriptstrings/d.out.file_to_translate.c:15
+#: ../locale/scriptstrings/d.out.file_to_translate.c:28
+#: ../locale/scriptstrings/d.out.file_to_translate.c:30
+msgid "Images"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:8
+msgid "Width and height of output image (overrides resolution setting)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:10
+msgid "Compression for PNG files"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:11
+msgid "(0=none, 1=fastest, 9=most; lossless, only time vs. filesize)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:13
+msgid "File size/quality for JPEG files"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:14
+msgid "(10=smallest/worst, 100=largest/best)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:16
+msgid "Paper size for PostScript output"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:17
+#: ../locale/scriptstrings/d.out.file_to_translate.c:19
+#: ../locale/scriptstrings/d.out.file_to_translate.c:32
+msgid "PostScript"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:18
+msgid "PostScript level (only limits functionality!)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:20
+msgid "GeoTIFF creation option(s)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:22
+#: ../locale/scriptstrings/d.out.file_to_translate.c:25
+#: ../locale/scriptstrings/d.out.file_to_translate.c:34
+msgid "GeoTIFF"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:23
+msgid "GeoTIFF metadata key(s) and value(s) to add"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:24
+msgid ""
+"In the form of \"META-TAG=VALUE\", separate multiple entries with a comma."
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:26
+msgid "Set background color to black (white default)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:27
+msgid "Set transparent background"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:29
+msgid "Use the Cario driver to render images"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:31
+msgid "Set paper orientation to landscape (for PostScript output)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:33
+msgid "Do not crop away margins"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:1
+msgid "Creates shaded relief map from an elevation map (DEM)."
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:2
+#: ../locale/scriptstrings/r.plane_to_translate.c:2
+msgid "raster, elevation"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:4
+msgid "Output shaded relief map name"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:5
+msgid "Altitude of the sun in degrees above the horizon"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:6
+msgid "Azimuth of the sun in degrees to the east of north"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:7
+msgid "Factor for exaggerating relief"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:8
+msgid "Scale factor for converting horizontal units to elevation units"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:9
+msgid ""
+"Set scaling factor (applies to lat./long. locations only, none: scale=1)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:1
+msgid "Reconnects vectors to a new database."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:3
+msgid "Name of old database"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:4
+msgid ""
+"The database must be in form printed by v.db.connect -g, i.e. with "
+"substituted variables"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:5
+msgid "Name of new database"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:6
+msgid "Old schema"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:7
+msgid "New schema"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:1
+msgid ""
+"Creates raster plane map given dip (inclination), aspect (azimuth) and one "
+"point."
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:3
+msgid "Name of raster plane to be created"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:4
+msgid "Dip of plane. Value must be between -90 and 90 degrees"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:5
+msgid "Azimuth of the plane. Value must be between 0 and 360 degrees"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:6
+msgid "Easting coordinate of a point on the plane"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:7
+msgid "Northing coordinate of a point on the plane"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:8
+msgid "Elevation coordinate of a point on the plane"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:9
+msgid "Type of the raster map to be created"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:1
+#: ../display/d.rast.edit/main.c:61
+msgid "Interactively edit cell values in a raster map."
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:2
+#: ../display/d.colortable/main.c:62 ../display/d.what.rast/main.c:52
+#: ../display/d.rast.arrow/arrow.c:110 ../display/d.colors/main.c:50
+#: ../display/d.rast.num/number.c:84 ../display/d.rast.edit/main.c:59
+#: ../display/d.rast/main.c:51
+msgid "display, raster"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:5
+msgid "Name of aspect raster map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:6
+msgid "Width of display canvas"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:7
+msgid "Height of display canvas"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:8
+msgid "Minimum size of each cell"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:9
+msgid "Maximum number of rows to load"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:10
+msgid "Maximum number of columns to load"
+msgstr ""
+
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:1
+msgid "Exports GRASS raster into GDAL supported formats."
+msgstr ""
+
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:4
+msgid "Region sensitive output"
+msgstr ""
+
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:9
+msgid ""
+"Creation option to the output format driver. Multiple options may be listed"
+msgstr ""
+
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:10
+msgid "Metadata key passed on the output dataset if possible"
+msgstr ""
+
+#: ../locale/scriptstrings/r.unpack_to_translate.c:1
+msgid "Unpacks a raster map packed with r.pack."
+msgstr ""
+
+#: ../locale/scriptstrings/r.unpack_to_translate.c:3
+msgid "Name of input pack file"
+msgstr ""
+
+#: ../locale/scriptstrings/r.unpack_to_translate.c:4
+msgid "Name for output raster map (default: taken from input file internals)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.unpack_to_translate.c:5
+msgid "Override projection check (use current location's projection)"
+msgstr ""
+
+#: ../display/d.path/main.c:50
+msgid "display, networking"
+msgstr ""
+
+#: ../display/d.path/main.c:52
+msgid "Finds shortest path for selected starting and ending node."
+msgstr ""
+
+#: ../display/d.path/main.c:59 ../vector/v.net.salesman/main.c:110
+#: ../vector/v.net.path/main.c:50 ../vector/v.net.alloc/main.c:75
+#: ../vector/v.net.steiner/main.c:359 ../vector/v.net.iso/main.c:85
+msgid "Arc type"
+msgstr ""
+
+#: ../display/d.path/main.c:66 ../display/d.rhumbline/main.c:55
+#: ../display/d.geodesic/main.c:56
+msgid "Starting and ending coordinates"
+msgstr ""
+
+#: ../display/d.path/main.c:71 ../vector/v.net/main.c:82
+#: ../vector/v.net.salesman/main.c:114 ../vector/v.net.path/main.c:55
+#: ../vector/v.net.alloc/main.c:80 ../vector/v.net.steiner/main.c:364
+#: ../vector/v.net.iso/main.c:89
+msgid "Arc layer"
+msgstr ""
+
+#: ../display/d.path/main.c:76 ../vector/v.net/main.c:88
+#: ../vector/v.net.path/main.c:60 ../vector/v.net.alloc/main.c:85
+#: ../vector/v.net.iso/main.c:94
+msgid "Node layer"
+msgstr ""
+
+#: ../display/d.path/main.c:82 ../vector/v.net.distance/main.c:113
+#: ../vector/v.net.path/main.c:73
+msgid "Arc forward/both direction(s) cost column"
+msgstr ""
+
+#: ../display/d.path/main.c:88 ../vector/v.net.distance/main.c:118
+#: ../vector/v.net.path/main.c:79
+msgid "Arc backward direction cost column"
+msgstr ""
+
+#: ../display/d.path/main.c:94 ../vector/v.net.path/main.c:85
+msgid "Node cost column"
+msgstr ""
+
+#: ../display/d.path/main.c:100 ../display/d.extract/main.c:65
+msgid "Original line color"
+msgstr ""
+
+#: ../display/d.path/main.c:102 ../display/d.path/main.c:110
+#: ../display/d.path/main.c:118 ../display/d.path/main.c:128
+msgid "Rendering"
+msgstr ""
+
+#: ../display/d.path/main.c:108 ../display/d.extract/main.c:71
+msgid "Highlight color"
+msgstr ""
+
+#: ../display/d.path/main.c:123 ../vector/v.net.distance/main.c:123
+#: ../vector/v.net.salesman/main.c:136 ../vector/v.net.path/main.c:102
+#: ../vector/v.net.allpairs/main.c:89 ../vector/v.net.alloc/main.c:117
+#: ../vector/v.net.spanningtree/main.c:64 ../vector/v.net.steiner/main.c:394
+#: ../vector/v.net.iso/main.c:127 ../vector/v.net.centrality/main.c:167
+msgid "Use geodesic calculation for longitude-latitude locations"
+msgstr ""
+
+#: ../display/d.path/main.c:127
+msgid "Render bold lines"
+msgstr ""
+
+#: ../display/d.path/main.c:143 ../display/d.rhumbline/main.c:85
+#: ../display/d.geodesic/main.c:83
+msgid "No coordinates given"
+msgstr ""
+
+#: ../display/d.path/main.c:146 ../display/d.path/main.c:150
+#, c-format
+msgid "%s - illegal x value"
+msgstr ""
+
+#: ../display/d.path/main.c:148 ../display/d.path/main.c:152
+#, c-format
+msgid "%s - illegal y value"
+msgstr ""
+
+#: ../display/d.path/main.c:159 ../display/d.graph/main.c:96
+#: ../display/d.frame/list.c:23 ../display/d.frame/select.c:36
+#: ../display/d.frame/frame.c:129 ../display/d.frame/frame.c:183
+#: ../display/d.frame/frame.c:223 ../display/d.rhumbline/main.c:108
+#: ../display/d.legend/main.c:265 ../display/d.rgb/main.c:83
+#: ../display/d.grid/main.c:206 ../display/d.linegraph/linegraph.c:251
+#: ../display/d.thematic.area/main.c:396 ../display/d.erase/main.c:58
+#: ../display/d.vect/main.c:377 ../display/d.geodesic/main.c:105
+#: ../display/d.where/main.c:144 ../display/d.text/main.c:132
+#: ../display/d.colortable/main.c:145 ../display/d.info/main.c:74
+#: ../display/d.profile/main.c:134 ../display/d.what.rast/main.c:116
+#: ../display/d.rast.arrow/arrow.c:245 ../display/d.extend/main.c:41
+#: ../display/d.text.new/main.c:295 ../display/d.what.vect/main.c:160
+#: ../display/d.ask/main.c:61 ../display/d.barscale/main.c:134
+#: ../display/d.paint.labels/main.c:90 ../display/d.histogram/main.c:181
+#: ../display/d.rast.num/number.c:132 ../display/d.font/main.c:86
+#: ../display/d.menu/main.c:108 ../display/d.his/main.c:117
+#: ../display/d.text.freetype/main.c:310 ../display/d.extract/main.c:79
+#: ../display/d.vect.chart/main.c:257 ../display/d.nviz/main.c:250
+#: ../display/d.measure/main.c:87 ../display/d.zoom/main.c:158
+#: ../display/d.zoom/main.c:293 ../display/d.zoom/redraw.c:39
+#: ../display/d.rast/main.c:114 ../display/d.font.freetype/main.c:103
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:97
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:81
+#: ../imagery/i.class/main.c:90 ../imagery/i.points/main.c:123
+#: ../vector/v.label/main.c:234
+msgid "No graphics device selected"
+msgstr ""
+
+#: ../display/d.path/main.c:185 ../vector/v.net.distance/main.c:153
+#: ../vector/v.net.path/main.c:120 ../vector/v.net.allpairs/main.c:122
+#: ../vector/v.net.spanningtree/main.c:93
+#: ../vector/v.net.centrality/main.c:201
+msgid "The current projection is not longitude-latitude"
+msgstr ""
+
+#: ../display/d.path/select.c:35
+msgid ""
+"\n"
+"Mouse Buttons:"
+msgstr ""
+
+#: ../display/d.path/select.c:36
+#, c-format
+msgid "Left:   Select From\n"
+msgstr ""
+
+#: ../display/d.path/select.c:37
+#, c-format
+msgid "Middle: Select To\n"
+msgstr ""
+
+#: ../display/d.path/select.c:38
+#, c-format
+msgid ""
+"Right:  Quit\n"
+"\n"
+msgstr ""
+
+#: ../display/d.path/select.c:65 ../display/d.path/select.c:242
+#: ../display/d.path/select.c:259
+#, c-format
+msgid "Node %d: %f %f\n"
+msgstr ""
+
+#: ../display/d.path/select.c:149 ../display/d.path/select.c:280
+#, c-format
+msgid "Destination unreachable\n"
+msgstr ""
+
+#: ../display/d.path/select.c:153 ../display/d.path/select.c:283
+#, c-format
+msgid "Costs on the network = %f\n"
+msgstr ""
+
+#: ../display/d.path/select.c:154 ../display/d.path/select.c:284
+#, c-format
+msgid ""
+"  Distance to the network = %f, distance from the network = %f\n"
+"\n"
+msgstr ""
+
+#: ../display/d.graph/do_graph.c:54 ../display/d.graph/do_graph.c:83
+#, c-format
+msgid "Problem parsing coordinates [%s]"
+msgstr ""
+
+#: ../display/d.graph/do_graph.c:105
+msgid "Unable to read color"
+msgstr ""
+
+#: ../display/d.graph/do_graph.c:136 ../display/d.graph/do_graph.c:213
+#: ../display/d.graph/do_graph.c:234 ../display/d.graph/do_graph.c:292
+#: ../display/d.graph/do_graph.c:363 ../display/d.graph/graphics.c:60
+#, c-format
+msgid "Problem parsing command [%s]"
+msgstr ""
+
+#: ../display/d.graph/do_graph.c:415 ../imagery/i.vpoints/plot.c:61
+#: ../imagery/i.vpoints/plot.c:143
+msgid "Cannot read symbol, cannot display points"
+msgstr ""
+
+#: ../display/d.graph/main.c:54 ../display/d.legend/main.c:86
+#: ../display/d.grid/main.c:51 ../display/d.linegraph/linegraph.c:113
+#: ../display/d.thematic.area/main.c:78 ../display/d.text/main.c:66
+#: ../display/d.mapgraph/main.c:48 ../display/d.text.new/main.c:142
+#: ../display/d.barscale/main.c:56 ../display/d.text.freetype/main.c:138
+#: ../display/d.vect.chart/main.c:63 ../display/d.title/main.c:45
+msgid "display, cartography"
+msgstr ""
+
+#: ../display/d.graph/main.c:56
+msgid ""
+"Program for generating and displaying simple graphics on the display monitor."
+msgstr ""
+
+#: ../display/d.graph/main.c:63
+msgid ""
+"Name of file containing graphics commands, if not given reads from standard "
+"input"
+msgstr ""
+
+#: ../display/d.graph/main.c:71
+msgid "Color to draw with, either a standard GRASS color or R:G:B triplet"
+msgstr ""
+
+#: ../display/d.graph/main.c:78
+msgid "Coordinates are given in map units"
+msgstr ""
+
+#: ../display/d.graph/main.c:89
+#, c-format
+msgid "Graph file <%s> not found"
+msgstr ""
+
+#: ../display/d.graph/main.c:119 ../display/d.legend/main.c:268
+#: ../display/d.text/main.c:152 ../display/d.info/main.c:103
+#: ../display/d.info/main.c:129 ../display/d.rast.arrow/arrow.c:248
+#: ../display/d.text.new/main.c:309 ../display/d.barscale/main.c:137
+#: ../display/d.paint.labels/main.c:124 ../display/d.rast.num/number.c:166
+#: ../display/d.text.freetype/main.c:316
+msgid "No current window"
+msgstr ""
+
+#: ../display/d.graph/main.c:122 ../display/d.legend/main.c:271
+#: ../display/d.text/main.c:155 ../display/d.info/main.c:105
+#: ../display/d.info/main.c:131 ../display/d.rast.arrow/arrow.c:251
+#: ../display/d.text.new/main.c:312 ../display/d.barscale/main.c:140
+#: ../display/d.paint.labels/main.c:127 ../display/d.rast.num/number.c:169
+#: ../display/d.text.freetype/main.c:318
+msgid "Current window not available"
+msgstr ""
+
+#: ../display/d.graph/main.c:125 ../display/d.info/main.c:113
+#: ../display/d.info/main.c:138 ../display/d.rast.arrow/arrow.c:264
+#: ../display/d.barscale/main.c:163 ../display/d.paint.labels/main.c:137
+#: ../display/d.rast.num/number.c:184
+msgid "Getting screen window"
+msgstr ""
+
+#: ../display/d.frame/select.c:41
+#, c-format
+msgid "Error choosing frame [%s]\n"
+msgstr ""
+
+#: ../display/d.frame/select.c:51
+#, c-format
+msgid ""
+"\n"
+"Buttons:\n"
+msgstr ""
+
+#: ../display/d.frame/select.c:52
+#, c-format
+msgid "Left:   Select frame\n"
+msgstr ""
+
+#: ../display/d.frame/select.c:53
+#, c-format
+msgid "Middle: Keep original frame\n"
+msgstr ""
+
+#: ../display/d.frame/select.c:54
+#, c-format
+msgid "Right:  Accept frame\n"
+msgstr ""
+
+#: ../display/d.frame/frame.c:62
+msgid "Manages display frames on the user's graphics monitor."
+msgstr ""
+
+#: ../display/d.frame/frame.c:66
+msgid "Create a new frame"
+msgstr ""
+
+#: ../display/d.frame/frame.c:70
+msgid "Select a frame"
+msgstr ""
+
+#: ../display/d.frame/frame.c:74 ../display/d.erase/main.c:47
+msgid "Remove all frames and erase the screen"
+msgstr ""
+
+#: ../display/d.frame/frame.c:78
+msgid "Print name of current frame"
+msgstr ""
+
+#: ../display/d.frame/frame.c:82
+msgid "Print names of all frames"
+msgstr ""
+
+#: ../display/d.frame/frame.c:86
+msgid "List map names displayed in GRASS monitor"
+msgstr ""
+
+#: ../display/d.frame/frame.c:90
+msgid "Debugging output"
+msgstr ""
+
+#: ../display/d.frame/frame.c:95
+msgid "name"
+msgstr ""
+
+#: ../display/d.frame/frame.c:98
+msgid "Frame to be created/selected"
+msgstr ""
+
+#: ../display/d.frame/frame.c:102
+msgid "bottom,top,left,right"
+msgstr ""
+
+#: ../display/d.frame/frame.c:107
+msgid "Where to place the frame, values in percent (implies -c)"
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:45 ../display/d.geodesic/main.c:45
+msgid "display, distance"
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:47
+msgid ""
+"Displays the rhumbline joining two user-specified points, in the active "
+"frame on the user's graphics monitor."
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:61 ../display/d.geodesic/main.c:62
+msgid "Line color"
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:70 ../display/d.legend/main.c:95
+#: ../display/d.grid/main.c:92 ../display/d.barscale/main.c:88
+#: ../vector/v.label/main.c:152 ../vector/v.label.sa/main.c:144
+#: ../vector/v.lrs/v.lrs.label/main.c:193
+msgid "Text color"
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:79 ../display/d.geodesic/main.c:78
+#, c-format
+msgid "Location is not %s"
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:89 ../display/d.rhumbline/main.c:93
+#: ../display/d.rhumbline/main.c:98 ../display/d.rhumbline/main.c:102
+#: ../display/d.geodesic/main.c:87 ../display/d.geodesic/main.c:91
+#: ../display/d.geodesic/main.c:95 ../display/d.geodesic/main.c:99
+#, c-format
+msgid "%s - illegal longitude"
+msgstr ""
+
+#: ../display/d.legend/main.c:88
+msgid ""
+"Displays a legend for a raster map in the active frame of the graphics "
+"monitor."
+msgstr ""
+
+#: ../display/d.legend/main.c:103
+msgid "Number of text lines (useful for truncating long legends)"
+msgstr ""
+
+#: ../display/d.legend/main.c:112
+msgid "Thinning factor (thin=10 gives cats 0,10,20...)"
+msgstr ""
+
+#: ../display/d.legend/main.c:120
+msgid "Number of text labels for smooth gradient legend"
+msgstr ""
+
+#: ../display/d.legend/main.c:130
+msgid ""
+"Size and placement as percentage of screen coordinates (0,0 is lower left)"
+msgstr ""
+
+#: ../display/d.legend/main.c:140
+msgid "List of discrete category numbers/values for legend"
+msgstr ""
+
+#: ../display/d.legend/main.c:150
+msgid "Use a subset of the map range for the legend (min,max)"
+msgstr ""
+
+#: ../display/d.legend/main.c:156
+msgid "Use mouse to size & place legend"
+msgstr ""
+
+#: ../display/d.legend/main.c:160
+msgid "Do not show category labels"
+msgstr ""
+
+#: ../display/d.legend/main.c:165
+msgid "Do not show category numbers"
+msgstr ""
+
+#: ../display/d.legend/main.c:170
+msgid "Skip categories with no label"
+msgstr ""
+
+#: ../display/d.legend/main.c:260 ../display/d.histogram/main.c:168
+#: ../ps/ps.map/ps_clrtbl.c:39
+#, c-format
+msgid "Category file for <%s> not available"
+msgstr ""
+
+#: ../display/d.legend/main.c:331
+msgid "Legend box lies outside of frame. Text may not display properly."
+msgstr ""
+
+#: ../display/d.legend/main.c:335
+msgid "Drawing horizontal legend as box width exceeds height"
+msgstr ""
+
+#: ../display/d.legend/main.c:346
+#, c-format
+msgid "Range information for <%s> not available (run r.support)"
+msgstr ""
+
+#: ../display/d.legend/main.c:351
+msgid "Input map contains no data"
+msgstr ""
+
+#: ../display/d.legend/main.c:364 ../display/d.legend/main.c:522
+msgid "Color range exceeds lower limit of actual data"
+msgstr ""
+
+#: ../display/d.legend/main.c:370 ../display/d.legend/main.c:526
+msgid "Color range exceeds upper limit of actual data"
+msgstr ""
+
+#: ../display/d.legend/main.c:427
+#, c-format
+msgid "use=%s out of range [%d,%d] (extend with range= ?)"
+msgstr ""
+
+#: ../display/d.legend/main.c:468
+msgid "Nothing to draw! (no categories with labels? out of range?)"
+msgstr ""
+
+#: ../display/d.legend/main.c:478
+msgid "Forcing a smooth legend: too many categories for current window height"
+msgstr ""
+
+#: ../display/d.legend/main.c:508 ../display/d.histogram/main.c:171
+#, c-format
+msgid "Range information for <%s> not available"
+msgstr ""
+
+#: ../display/d.legend/main.c:533
+#, c-format
+msgid "use=%s out of range [%.3f, %.3f] (extend with range= ?)"
+msgstr ""
+
+#: ../display/d.legend/main.c:895
+msgid "Nothing to draw! (no categories with labels?)"
+msgstr ""
+
+#: ../display/d.rgb/main.c:54
+msgid "display, raster, RGB"
+msgstr ""
+
+#: ../display/d.rgb/main.c:56
+msgid ""
+"Displays three user-specified raster maps as red, green, and blue overlays "
+"in the active graphics frame."
+msgstr ""
+
+#: ../display/d.rgb/main.c:61 ../display/d.rast/main.c:88
+msgid "Overlay (non-null values only)"
+msgstr ""
+
+#: ../display/d.rgb/main.c:65 ../display/d.erase/main.c:52
+msgid "Don't add to list of commands in monitor"
+msgstr ""
+
+#: ../display/d.rgb/main.c:70
+#, c-format
+msgid "Name of raster map to be used for '%s'"
+msgstr ""
+
+#: ../display/d.rgb/main.c:119
+msgid "Error reading row of data"
+msgstr ""
+
+#: ../display/d.grid/main.c:53
+msgid ""
+"Overlays a user-specified grid in the active display frame on the graphics "
+"monitor."
+msgstr ""
+
+#: ../display/d.grid/main.c:61
+msgid "Size of grid to be drawn"
+msgstr ""
+
+#: ../display/d.grid/main.c:62
+msgid "In map units or DDD:MM:SS format. Example: \"1000\" or \"0:10\""
+msgstr ""
+
+#: ../display/d.grid/main.c:71
+msgid "Lines of the grid pass through this coordinate"
+msgstr ""
+
+#: ../display/d.grid/main.c:77
+msgid "Grid line width"
+msgstr ""
+
+#: ../display/d.grid/main.c:81
+msgid "Grid color"
+msgstr ""
+
+#: ../display/d.grid/main.c:86 ../vector/v.label/main.c:194
+#: ../vector/v.label.sa/main.c:190 ../vector/v.lrs/v.lrs.label/main.c:237
+msgid "Border color"
+msgstr ""
+
+#: ../display/d.grid/main.c:101
+msgid "Font size for gridline coordinate labels"
+msgstr ""
+
+#: ../display/d.grid/main.c:106
+msgid "Draw geographic grid (referenced to current ellipsoid)"
+msgstr ""
+
+#: ../display/d.grid/main.c:111
+msgid "Draw geographic grid (referenced to WGS84 ellipsoid)"
+msgstr ""
+
+#: ../display/d.grid/main.c:115
+msgid "Draw '+' marks instead of grid lines"
+msgstr ""
+
+#: ../display/d.grid/main.c:119
+msgid "Draw '.' marks instead of grid lines"
+msgstr ""
+
+#: ../display/d.grid/main.c:123
+msgid "Draw fiducial marks instead of grid lines"
+msgstr ""
+
+#: ../display/d.grid/main.c:127
+msgid "Disable grid drawing"
+msgstr ""
+
+#: ../display/d.grid/main.c:128 ../display/d.grid/main.c:133
+#: ../display/d.grid/main.c:138
+msgid "Disable"
+msgstr ""
+
+#: ../display/d.grid/main.c:132
+msgid "Disable border drawing"
+msgstr ""
+
+#: ../display/d.grid/main.c:137
+msgid "Disable text drawing"
+msgstr ""
+
+#: ../display/d.grid/main.c:147
+msgid "Both grid and border drawing are disabled"
+msgstr ""
+
+#: ../display/d.grid/main.c:151
+msgid "Geo-Grid option is not available for LL projection"
+msgstr ""
+
+#: ../display/d.grid/main.c:153
+msgid "Geo-Grid option is not available for XY projection"
+msgstr ""
+
+#: ../display/d.grid/main.c:172
+msgid "Choose a single mark style"
+msgstr ""
+
+#: ../display/d.grid/main.c:184
+#, c-format
+msgid "Invalid geo-grid size <%s>"
+msgstr ""
+
+#: ../display/d.grid/main.c:189
+#, c-format
+msgid "Invalid grid size <%s>"
+msgstr ""
+
+#: ../display/d.grid/fiducial.c:64
+msgid "Reading symbol"
+msgstr ""
+
+#: ../display/d.grid/plot.c:340
+msgid ""
+"WGS84 grid output not possible as this location does not contain\n"
+"datum transformation parameters. Try running g.setproj."
+msgstr ""
+
+#: ../display/d.grid/plot.c:512
+msgid "Error in pj_do_proj1"
+msgstr ""
+
+#: ../display/d.grid/plot.c:518
+msgid "Error in pj_do_proj2"
+msgstr ""
+
+#: ../display/d.grid/plot.c:522
+msgid "Error in pj_do_proj3"
+msgstr ""
+
+#: ../display/d.grid/plot.c:530
+msgid "Error in pj_do_proj5"
+msgstr ""
+
+#: ../display/d.grid/plot.c:534
+msgid "Error in pj_do_proj6"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:115
+msgid ""
+"Generates and displays simple line graphs in the active graphics monitor "
+"display frame."
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:119
+msgid "Name of data file for X axis of graph"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:125
+msgid "Name of data file(s) for Y axis of graph"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:132
+msgid "Path to file location"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:139
+msgid "Color for Y data"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:148
+msgid "Color for axis, tics, numbers, and title"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:156
+msgid "Title for X data"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:163
+msgid "Title for Y data"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:170
+msgid "Title for Graph"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:209
+msgid "Maximum of 10 Y data files exceeded"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:238
+#, c-format
+msgid "Only <%d> colors given for <%d> lines"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:290
+#, c-format
+msgid "Y input file <%s> contains %s data points than the X input file"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:295
+#, c-format
+msgid "The last %d point(s) will be ignored"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:355
+#, c-format
+msgid "Problem reading X data file at line %d"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:366
+#, c-format
+msgid "Problem reading <%s> data file at line %d"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:80
+msgid ""
+"Displays a thematic vector area map in the active frame on the graphics "
+"monitor."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:90
+msgid "Data to be classified: column name or expression"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:97
+msgid "Class breaks, without minimum and maximum"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:105 ../vector/v.class/main.c:68
+msgid "Algorithm to use for classification"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:106 ../vector/v.class/main.c:69
+msgid ""
+"int;simple intervals;std;standard deviations;qua;quantiles;equ;equiprobable "
+"(normal distribution);"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:117 ../vector/v.class/main.c:80
+msgid "Number of classes to define"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:124
+msgid "Colors (one per class)."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:129
+msgid "Layer number. If -1, all layers are displayed."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:130 ../display/d.thematic.area/main.c:133
+#: ../display/d.vect/main.c:103 ../display/d.vect/main.c:109
+#: ../display/d.vect/main.c:112 ../display/d.vect/main.c:115
+#: ../display/d.vect/main.c:333 ../display/d.rast/main.c:66
+#: ../display/d.rast/main.c:75 ../display/d.rast/main.c:94
+#: ../vector/v.surf.rst/main.c:193 ../vector/v.surf.rst/main.c:219
+#: ../vector/v.surf.rst/main.c:222 ../vector/v.category/main.c:94
+#: ../vector/v.category/main.c:99 ../vector/v.category/main.c:103
+#: ../vector/v.out.ascii/out.c:80 ../vector/v.out.ascii/out.c:87
+#: ../vector/v.buffer2/main.c:160 ../vector/v.buffer2/main.c:163
+#: ../vector/v.net.allpairs/main.c:67 ../vector/v.net.allpairs/main.c:69
+#: ../vector/v.net.allpairs/main.c:71 ../vector/v.extract/main.c:107
+#: ../vector/v.extract/main.c:117 ../vector/v.extract/main.c:123
+#: ../vector/v.extract/main.c:127 ../vector/v.extract/main.c:130
+#: ../vector/v.extract/main.c:138 ../vector/v.extract/main.c:148
+#: ../vector/v.edit/args.c:42 ../vector/v.edit/args.c:47
+#: ../vector/v.edit/args.c:125 ../vector/v.edit/args.c:129
+#: ../vector/v.edit/args.c:138 ../vector/v.edit/args.c:147
+#: ../vector/v.edit/args.c:156 ../vector/v.edit/args.c:159
+#: ../vector/v.edit/args.c:173 ../vector/v.edit/args.c:202
+#: ../vector/v.select/args.c:16 ../vector/v.select/args.c:21
+#: ../vector/v.select/args.c:30 ../vector/v.select/args.c:35
+#: ../vector/v.select/args.c:89 ../vector/v.reclass/main.c:76
+#: ../vector/v.reclass/main.c:79 ../vector/v.to.rast/main.c:45
+#: ../vector/v.to.rast/main.c:50 ../vector/v.in.ogr/main.c:135
+#: ../vector/v.in.ogr/main.c:149 ../vector/v.in.ogr/main.c:171
+#: ../vector/v.net.centrality/main.c:107 ../vector/v.net.centrality/main.c:109
+msgid "Selection"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:139 ../display/d.thematic.area/main.c:147
+msgid "Boundaries"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:140
+msgid "Boundary width"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:146
+msgid "Boundary color"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:157 ../display/d.vect/main.c:303
+msgid "Rendering method for filled polygons"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:159
+msgid ""
+"d;use the display library basic functions (features: polylines);c;use the "
+"display library clipping functions (features: clipping);l;use the display "
+"library culling functions (features: culling, polylines)"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:167
+msgid "File in which to save d.graph instructions for legend display"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:173 ../display/d.vect.chart/main.c:148
+msgid "Create legend information and send to stdout"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:178
+msgid ""
+"When printing legend info , include extended statistical info from "
+"classification algorithm"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:182
+msgid "Do not draw map, only output the legend"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:195
+#, c-format
+msgid "Invalid rendering method <%s>"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:217
+#, c-format
+msgid "%s: You must build topology on vector map. Run v.build."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:224
+msgid "'layer' must be > 0"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:226 ../display/d.vect/main.c:466
+#: ../display/d.what.vect/what.c:446 ../vector/v.db.connect/main.c:175
+#, c-format
+msgid "Database connection not defined"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:250
+#, c-format
+msgid "Data (%s) not numeric. Column must be numeric."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:254
+#: ../display/d.thematic.area/plot1.c:225
+#: ../display/d.thematic.area/plot1.c:253 ../display/d.vect/area.c:93
+#: ../display/d.vect/area.c:136 ../display/d.vect/plot1.c:243
+#: ../display/d.vect/plot1.c:284 ../display/d.vect/plot1.c:327
+#: ../display/d.vect/plot1.c:370
+#, c-format
+msgid "Cannot select data (%s) from table"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:317 ../display/d.vect/main.c:427
+#, c-format
+msgid "Unknown color: [%s]"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:328
+msgid ""
+"You gave both manual breaks and a classification algorithm or a number of "
+"classes. The manual breaks have precedence and will thus be used."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:365
+msgid "You must either give classbreaks or a classification algorithm"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:378
+#, c-format
+msgid ""
+"Not enough colors or error in color specifications.\n"
+"Need %i colors."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:383
+#, c-format
+msgid "Error interpreting color %s"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:401 ../display/d.vect/main.c:583
+msgid "Plotting ..."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:408 ../display/d.vect/main.c:591
+msgid ""
+"The bounding box of the map is outside the current region, nothing drawn."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:457
+#, c-format
+msgid ""
+"\n"
+"Total number of records: %.0f\n"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:459
+#, c-format
+msgid "Classification of %s into %i classes\n"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:461 ../vector/v.class/main.c:195
+#, c-format
+msgid "Using algorithm: *** %s ***\n"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:463 ../vector/v.class/main.c:196
+#, c-format
+msgid "Mean: %f\tStandard deviation = %f\n"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:467
+#, c-format
+msgid "Last chi2 = %f\n"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:470 ../vector/v.class/main.c:203
+#, c-format
+msgid "Stdev multiplied by %.4f to define step\n"
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:210 ../display/d.vect/plot1.c:222
+msgid "Color definition column not specified"
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:220
+#, c-format
+msgid ""
+"Color definition column (%s) not a string. Column must be of form RRR:GGG:"
+"BBB where RGB values range 0-255."
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:238 ../display/d.vect/area.c:113
+#: ../display/d.vect/plot1.c:261
+msgid "Line width column not specified."
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:249 ../display/d.vect/area.c:128
+#, c-format
+msgid "Line width column (%s) not a number."
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:294 ../display/d.vect/topo.c:39
+#, c-format
+msgid ""
+"\n"
+"ERROR: vector map - can't read\n"
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:369
+#, c-format
+msgid ""
+"Error in color definition column (%s), element %d with cat %d: colorstring "
+"[%s]"
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:376
+#, c-format
+msgid "Error in color definition column (%s), element %d with cat %d"
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:444 ../display/d.vect/area.c:369
+#: ../display/d.vect/plot1.c:587
+#, c-format
+msgid ""
+"Error in line width column (%s), element %d with cat %d: line width [%d]"
+msgstr ""
+
+#: ../display/d.erase/main.c:34
+msgid "Erase the contents of the active display frame with user defined color"
+msgstr ""
+
+#: ../display/d.erase/main.c:42
+msgid ""
+"Color to erase with, either a standard GRASS color or R:G:B triplet "
+"(separated by colons)"
+msgstr ""
+
+#: ../display/d.erase/main.c:62 ../display/d.colortable/main.c:147
+#: ../display/d.measure/main.c:90
+msgid "No current frame"
+msgstr ""
+
+#: ../display/d.erase/main.c:64 ../display/d.colortable/main.c:149
+#: ../display/d.measure/main.c:93
+msgid "Current frame not available"
+msgstr ""
+
+#: ../display/d.vect/dir.c:31 ../display/d.vect/label.c:28
+#: ../display/d.vect/attr.c:53
+msgid "Can't read vector map"
+msgstr ""
+
+#: ../display/d.vect/main.c:78 ../display/d.what.vect/main.c:54
+#: ../display/d.extract/main.c:50
+msgid "display, vector"
+msgstr ""
+
+#: ../display/d.vect/main.c:79
+msgid "Displays user-specified vector map in the active graphics frame."
+msgstr ""
+
+#: ../display/d.vect/main.c:91
+msgid "Display"
+msgstr ""
+
+#: ../display/d.vect/main.c:92
+msgid ""
+"shape;Display geometry of features;cat;Display category numbers of features;"
+"topo;Display topology information (nodes, edges);dir;Display direction of "
+"linear features;attr;Display selected attribute based on 'attrcol';zcoor;"
+"Display z-coordinate of features (only for 3D vector maps)"
+msgstr ""
+
+#: ../display/d.vect/main.c:107
+msgid "Layer number (if -1, all layers are displayed)"
+msgstr ""
+
+#: ../display/d.vect/main.c:122
+msgid "Feature color"
+msgstr ""
+
+#: ../display/d.vect/main.c:126 ../display/d.vect/main.c:136
+#: ../display/d.vect/main.c:239 ../display/d.vect/main.c:249
+msgid "Either a standard GRASS color, R:G:B triplet, or \"none\""
+msgstr ""
+
+#: ../display/d.vect/main.c:132
+msgid "Area fill color"
+msgstr ""
+
+#: ../display/d.vect/main.c:141
+msgid "Name of color definition column (for use with -a flag)"
+msgstr ""
+
+#: ../display/d.vect/main.c:149
+msgid "Type of color table (for use with -z flag)"
+msgstr ""
+
+#: ../display/d.vect/main.c:158 ../display/d.vect/main.c:163
+#: ../display/d.vect/main.c:171
+msgid "Lines"
+msgstr ""
+
+#: ../display/d.vect/main.c:159
+msgid "Line width"
+msgstr ""
+
+#: ../display/d.vect/main.c:165
+msgid "Name of column for line widths (these values will be scaled by wscale)"
+msgstr ""
+
+#: ../display/d.vect/main.c:172
+msgid "Scale factor for wcolumn"
+msgstr ""
+
+#: ../display/d.vect/main.c:180 ../display/d.vect/main.c:190
+#: ../display/d.vect/main.c:197 ../display/d.vect/main.c:203
+msgid "Symbols"
+msgstr ""
+
+#: ../display/d.vect/main.c:184
+msgid "Point and centroid symbol"
+msgstr ""
+
+#: ../display/d.vect/main.c:191
+msgid "Symbol size"
+msgstr ""
+
+#: ../display/d.vect/main.c:193
+msgid "When used with the size_column option this becomes the scale factor"
+msgstr ""
+
+#: ../display/d.vect/main.c:199
+msgid "Name of numeric column containing symbol size"
+msgstr ""
+
+#: ../display/d.vect/main.c:205
+msgid "Name of numeric column containing symbol rotation angle"
+msgstr ""
+
+#: ../display/d.vect/main.c:207
+msgid "Measured in degrees CCW from east"
+msgstr ""
+
+#: ../display/d.vect/main.c:212 ../display/d.vect/main.c:219
+#: ../display/d.vect/main.c:227 ../display/d.vect/main.c:235
+#: ../display/d.vect/main.c:245 ../display/d.vect/main.c:255
+#: ../display/d.vect/main.c:261 ../display/d.vect/main.c:267
+#: ../display/d.vect/main.c:275
+msgid "Labels"
+msgstr ""
+
+#: ../display/d.vect/main.c:214
+msgid "Layer number for labels (default: the given layer number)"
+msgstr ""
+
+#: ../display/d.vect/main.c:220
+msgid "Name of column to be displayed"
+msgstr ""
+
+#: ../display/d.vect/main.c:226
+msgid "Label color"
+msgstr ""
+
+#: ../display/d.vect/main.c:229
+msgid "Either a standard color name or R:G:B triplet"
+msgstr ""
+
+#: ../display/d.vect/main.c:236
+msgid "Label background color"
+msgstr ""
+
+#: ../display/d.vect/main.c:246
+msgid "Label border color"
+msgstr ""
+
+#: ../display/d.vect/main.c:256
+msgid "Label size (pixels)"
+msgstr ""
+
+#: ../display/d.vect/main.c:262 ../display/d.text.new/main.c:221
+#: ../display/d.text.freetype/main.c:168 ../vector/v.label/main.c:123
+msgid "Font name"
+msgstr ""
+
+#: ../display/d.vect/main.c:270
+msgid "Label horizontal justification"
+msgstr ""
+
+#: ../display/d.vect/main.c:278
+msgid "Label vertical justification"
+msgstr ""
+
+#: ../display/d.vect/main.c:285
+msgid ""
+"Minimum region size (average from height and width) when map is displayed"
+msgstr ""
+
+#: ../display/d.vect/main.c:293
+msgid ""
+"Maximum region size (average from height and width) when map is displayed"
+msgstr ""
+
+#: ../display/d.vect/main.c:305
+msgid ""
+"g;use the libgis render functions (features: clipping);r;use the raster "
+"graphics library functions (features: polylines);d;use the display library "
+"basic functions (features: polylines);c;use the display library clipping "
+"functions (features: clipping);l;use the display library culling functions "
+"(features: culling, polylines)"
+msgstr ""
+
+#: ../display/d.vect/main.c:321
+msgid "Get colors from map table column (of form RRR:GGG:BBB)"
+msgstr ""
+
+#: ../display/d.vect/main.c:327
+msgid ""
+"Random colors according to category number (or layer number if 'layer=-1' is "
+"given)"
+msgstr ""
+
+#: ../display/d.vect/main.c:334
+msgid "Use values from 'cats' option as feature id"
+msgstr ""
+
+#: ../display/d.vect/main.c:339
+msgid ""
+"Don't add to list of vectors and commands in monitor (it won't be drawn if "
+"the monitor is refreshed)"
+msgstr ""
+
+#: ../display/d.vect/main.c:344
+msgid "Colorize polygons according to z height"
+msgstr ""
+
+#: ../display/d.vect/main.c:387 ../display/d.paint.labels/main.c:102
+msgid "Region size is lower than minreg, nothing displayed."
+msgstr ""
+
+#: ../display/d.vect/main.c:396 ../display/d.paint.labels/main.c:111
+msgid "Region size is greater than maxreg, nothing displayed."
+msgstr ""
+
+#: ../display/d.vect/main.c:411
+msgid ""
+"The '-c' and '-a' flags cannot be used together, the '-c' flag will be "
+"ignored!"
+msgstr ""
+
+#: ../display/d.vect/main.c:442
+#, c-format
+msgid "Unknown color: '%s'"
+msgstr ""
+
+#: ../display/d.vect/main.c:463 ../vector/v.surf.rst/main.c:450
+#: ../vector/v.univar/main.c:205 ../vector/v.extract/main.c:274
+msgid "'layer' must be > 0 for 'where'."
+msgstr ""
+
+#: ../display/d.vect/main.c:490
+msgid "'layer' must be > 0 for 'cats'."
+msgstr ""
+
+#: ../display/d.vect/main.c:494
+#, c-format
+msgid "%d errors in cat option"
+msgstr ""
+
+#: ../display/d.vect/main.c:625
+msgid "Unable to display areas, topology not available"
+msgstr ""
+
+#: ../display/d.vect/main.c:630
+msgid "Unable to display lines by id, topology not available"
+msgstr ""
+
+#: ../display/d.vect/main.c:673
+msgid "Unable to display topology, not available"
+msgstr ""
+
+#: ../display/d.vect/area.c:72
+msgid "Color definition column not specified."
+msgstr ""
+
+#: ../display/d.vect/area.c:83 ../display/d.vect/plot1.c:233
+#, c-format
+msgid ""
+"Color definition column ('%s') not a string. Column must be of form 'RRR:GGG:"
+"BBB' where RGB values range 0-255. You can use '%s' module to define color "
+"rules. Unable to colorize features."
+msgstr ""
+
+#: ../display/d.vect/area.c:302
+#, c-format
+msgid ""
+"Error in color definition column (%s), area %d with cat %d: colorstring [%s]"
+msgstr ""
+
+#: ../display/d.vect/area.c:308
+#, c-format
+msgid "Error in color definition column (%s), area %d with cat %d"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:276
+#, c-format
+msgid "Line width column (%s) is not numeric."
+msgstr ""
+
+#: ../display/d.vect/plot1.c:304
+msgid "Symbol size column not specified."
+msgstr ""
+
+#: ../display/d.vect/plot1.c:319
+#, c-format
+msgid "Symbol size column (%s) is not numeric."
+msgstr ""
+
+#: ../display/d.vect/plot1.c:347
+msgid "Symbol rotation column not specified."
+msgstr ""
+
+#: ../display/d.vect/plot1.c:362
+#, c-format
+msgid "Symbol rotation column (%s) is not numeric."
+msgstr ""
+
+#: ../display/d.vect/plot1.c:388 ../display/d.vect/plot1.c:689
+msgid "Unable to read symbol, unable to display points"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:419 ../vector/v.label/main.c:297
+#: ../vector/v.info/main.c:388 ../vector/v.label.sa/labels.c:146
+#: ../vector/v.to.3d/trans3.c:82 ../vector/v.to.3d/trans2.c:81
+msgid "Unable to read vector map"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:511
+#, c-format
+msgid ""
+"Error in color definition column '%s', feature id %d with cat %d: "
+"colorstring '%s'"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:519
+#, c-format
+msgid "Error in color definition column '%s', feature id %d with cat %d"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:641
+#, c-format
+msgid ""
+"Error in symbol size column (%s), element %d with cat %d: symbol size [%f]"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:729
+#, c-format
+msgid "Error in color definition column '%s': %d features affected"
+msgstr ""
+
+#: ../display/d.vect/attr.c:30
+msgid "attrcol not specified, cannot display attributes"
+msgstr ""
+
+#: ../display/d.vect/attr.c:110 ../display/d.vect.chart/plot.c:85
+#: ../vector/v.in.db/main.c:163
+#, c-format
+msgid "Unable to open select cursor: '%s'"
+msgstr ""
+
+#: ../display/d.vect/attr.c:129
+#, c-format
+msgid "No attribute found for cat %d: %s"
+msgstr ""
+
+#: ../display/d.geodesic/main.c:47
+msgid ""
+"Displays a geodesic line, tracing the shortest distance between two "
+"geographic points along a great circle, in a longitude/latitude data set."
+msgstr ""
+
+#: ../display/d.geodesic/main.c:70
+msgid "Text color or \"none\""
+msgstr ""
+
+#: ../display/d.where/main.c:42
+msgid "display, position, querying"
+msgstr ""
+
+#: ../display/d.where/main.c:44
+msgid ""
+"Identifies the geographic coordinates associated with point locations in the "
+"active frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.where/main.c:49
+msgid "One mouse click only"
+msgstr ""
+
+#: ../display/d.where/main.c:53
+msgid "Output lat/long in decimal degree"
+msgstr ""
+
+#: ../display/d.where/main.c:58
+msgid "Output lat/long referenced to current ellipsoid"
+msgstr ""
+
+#: ../display/d.where/main.c:63
+msgid ""
+"Output lat/long referenced to WGS84 ellipsoid using datum transformation "
+"parameters defined in current location (if available)"
+msgstr ""
+
+#: ../display/d.where/main.c:69
+msgid "Output frame coordinates of current display monitor (percentage)"
+msgstr ""
+
+#: ../display/d.where/main.c:77
+msgid "Ambiguous request for lat/long ellipsoids"
+msgstr ""
+
+#: ../display/d.where/main.c:80
+msgid "Please specify a lat/long ellipsoid with -l or -w"
+msgstr ""
+
+#: ../display/d.where/main.c:122
+msgid ""
+"WGS84 output not possible as this location does not contain\n"
+"datum transformation parameters. Try running g.setproj."
+msgstr ""
+
+#: ../display/d.text/main.c:68 ../display/d.text.new/main.c:144
+msgid ""
+"Draws text in the active display frame on the graphics monitor using the "
+"current font."
+msgstr ""
+
+#: ../display/d.text/main.c:77 ../display/d.text.new/main.c:159
+msgid "Height of letters in percentage of available frame height"
+msgstr ""
+
+#: ../display/d.text/main.c:85 ../display/d.text.new/main.c:167
+#: ../display/d.text.freetype/main.c:192
+msgid "Text color, either a standard GRASS color or R:G:B triplet"
+msgstr ""
+
+#: ../display/d.text/main.c:94 ../display/d.text.new/main.c:184
+msgid "The screen line number on which text will begin to be drawn"
+msgstr ""
+
+#: ../display/d.text/main.c:103 ../display/d.text.new/main.c:192
+msgid ""
+"Screen position at which text will begin to be drawn (percentage, [0,0] is "
+"lower left)"
+msgstr ""
+
+#: ../display/d.text/main.c:110 ../display/d.text.new/main.c:208
+#: ../display/d.text.freetype/main.c:217
+msgid "Rotation angle in degrees (counter-clockwise)"
+msgstr ""
+
+#: ../display/d.text/main.c:114 ../display/d.text.new/main.c:251
+#: ../display/d.text.freetype/main.c:236
+msgid "Use bold text"
+msgstr ""
+
+#: ../display/d.text/main.c:122 ../display/d.text.new/main.c:275
+msgid "Please choose only one placement method"
+msgstr ""
+
+#: ../display/d.text/main.c:177
+#, c-format
+msgid "value [%.0f,%.0f] out of range [0-100]"
+msgstr ""
+
+#: ../display/d.colortable/main.c:64
+msgid "Displays the color table associated with a raster map layer."
+msgstr ""
+
+#: ../display/d.colortable/main.c:68
+msgid "Name of raster map whose color table is to be displayed"
+msgstr ""
+
+#: ../display/d.colortable/main.c:76
+msgid "Color of lines separating the colors of the color table"
+msgstr ""
+
+#: ../display/d.colortable/main.c:82
+msgid "Number of lines to appear in the color table"
+msgstr ""
+
+#: ../display/d.colortable/main.c:88
+msgid "Number of columns to appear in the color table"
+msgstr ""
+
+#: ../display/d.colortable/main.c:93
+msgid "Don't draw a collar showing the NULL color in FP maps"
+msgstr ""
+
+#: ../display/d.colortable/main.c:118
+#, c-format
+msgid ""
+"<%s> is a floating point map. Ignoring [lines] and drawing continuous color "
+"ramp"
+msgstr ""
+
+#: ../display/d.colortable/main.c:132
+#, c-format
+msgid ""
+"<%s> is a floating point map. Ignoring [cols] and drawing continuous color "
+"ramp"
+msgstr ""
+
+#: ../display/d.colortable/main.c:141
+#, c-format
+msgid "R_color file for [%s] not available"
+msgstr ""
+
+#: ../display/d.colortable/main.c:143
+#, c-format
+msgid "Range file for [%s] not available"
+msgstr ""
+
+#: ../display/d.colortable/main.c:156
+msgid "Data range is empty"
+msgstr ""
+
+#: ../display/d.mapgraph/main.c:50
+msgid ""
+"Generates and displays simple graphics on map layers drawn in the active "
+"graphics monitor display frame."
+msgstr ""
+
+#: ../display/d.mapgraph/main.c:57
+msgid ""
+"Unix file containg graphing instructions, if not given reads from standard "
+"input"
+msgstr ""
+
+#: ../display/d.mapgraph/main.c:67
+msgid ""
+"Color to draw with, either a standard GRASS color or R:G:B triplet "
+"(separated by colons)"
+msgstr ""
+
+#: ../display/d.info/main.c:34 ../display/d.save/main.c:79
+msgid "display, metadata"
+msgstr ""
+
+#: ../display/d.info/main.c:36
+msgid "Display information about the active display monitor"
+msgstr ""
+
+#: ../display/d.info/main.c:41
+msgid "Display screen rectangle (left, right, top, bottom)"
+msgstr ""
+
+#: ../display/d.info/main.c:45
+msgid "Display screen dimensions (width, height)"
+msgstr ""
+
+#: ../display/d.info/main.c:49
+msgid "Display active frame rectangle"
+msgstr ""
+
+#: ../display/d.info/main.c:53
+msgid "Display screen rectangle of current region"
+msgstr ""
+
+#: ../display/d.info/main.c:58
+msgid "Display geographic coordinates and resolution of entire screen"
+msgstr ""
+
+#: ../display/d.info/main.c:62
+msgid "Display number of colors"
+msgstr ""
+
+#: ../display/d.info/main.c:111 ../display/d.info/main.c:136
+#: ../display/d.rast.arrow/arrow.c:257 ../display/d.barscale/main.c:156
+#: ../display/d.paint.labels/main.c:130 ../display/d.rast.num/number.c:176
+#: ../display/d.rast.edit/cell.c:35
+msgid "Setting map window"
+msgstr ""
+
+#: ../display/d.info/main.c:115 ../display/d.info/main.c:140
+#: ../display/d.what.rast/main.c:137 ../display/d.rast.arrow/arrow.c:266
+#: ../display/d.barscale/main.c:165 ../display/d.paint.labels/main.c:139
+#: ../display/d.rast.num/number.c:186
+msgid "Error in calculating conversions"
+msgstr ""
+
+#: ../display/d.profile/Range.c:87
+msgid "one moment ..."
+msgstr ""
+
+#: ../display/d.profile/What.c:29
+msgid "Error reading raster map"
+msgstr ""
+
+#: ../display/d.profile/main.c:61
+msgid "display, raster, profile"
+msgstr ""
+
+#: ../display/d.profile/main.c:63
+msgid "Interactive profile plotting utility with optional output."
+msgstr ""
+
+#: ../display/d.profile/main.c:71
+msgid "Raster map to be profiled"
+msgstr ""
+
+#: ../display/d.profile/main.c:78
+msgid "Optional display raster"
+msgstr ""
+
+#: ../display/d.profile/main.c:85
+msgid "Output profile data to file(s) with prefix 'name'"
+msgstr ""
+
+#: ../display/d.profile/main.c:106
+#, c-format
+msgid "Display raster [%s] not found. Using profile raster."
+msgstr ""
+
+#: ../display/d.profile/main.c:130
+msgid ""
+"\n"
+"\n"
+"Use mouse to choose action"
+msgstr ""
+
+#: ../display/d.profile/main.c:199 ../display/d.profile/main.c:393
+msgid "Use 'd.frame -e' to remove left over frames"
+msgstr ""
+
+#: ../display/d.profile/main.c:283
+msgid "Error opening cell-file"
+msgstr ""
+
+#: ../display/d.profile/main.c:285
+msgid "Error reading from cell-file"
+msgstr ""
+
+#: ../display/d.profile/main.c:287
+msgid "Mysterious window inconsistancy error"
+msgstr ""
+
+#: ../display/d.profile/main.c:430
+#, c-format
+msgid "%s: Couldn't open raster <%s@%s>"
+msgstr ""
+
+#: ../display/d.profile/main.c:434
+#, c-format
+msgid "%s: Couldn't read color table for <%s@%s>"
+msgstr ""
+
+#: ../display/d.profile/utils.c:8
+#, c-format
+msgid "%s: 'is_null_value()' got NULL pointer!"
+msgstr ""
+
+#: ../display/d.profile/utils.c:11
+#, c-format
+msgid "%s: 'is_null_value()' got negative column index"
+msgstr ""
+
+#: ../display/d.profile/utils.c:22
+#, c-format
+msgid "%s: 'is_null_value()' Unknown RASTER_MAP_TYPE '%d'"
+msgstr ""
+
+#: ../display/d.what.rast/what.c:57
+msgid "You are clicking outside the map"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:54
+msgid ""
+"Allows the user to interactively query the category contents of multiple "
+"raster map layers at user specified locations within the current geographic "
+"region."
+msgstr ""
+
+#: ../display/d.what.rast/main.c:89
+msgid "Field separator (terse mode only)"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:94 ../display/d.what.vect/main.c:74
+msgid "Identify just one location"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:98 ../display/d.what.vect/main.c:89
+msgid "Terse output. For parsing by programs"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:103
+msgid "Print out col/row for the entire map in grid resolution of the region"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:119 ../display/d.his/main.c:120
+msgid "No current graphics window"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:122 ../display/d.his/main.c:123
+msgid "Current graphics window not available"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:128
+msgid "Setting graphics window"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:131
+msgid "Can't set current graphics window"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:135
+msgid "Getting graphics window coordinates"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:112
+msgid ""
+"Draws arrows representing cell aspect direction for a raster map containing "
+"aspect data."
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:121
+msgid "Name of raster aspect map to be displayed"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:129
+msgid "Type of existing raster aspect map"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:137
+msgid "Color for drawing arrows"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:145
+msgid "Color for drawing grid or \"none\""
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:153
+msgid "Color for drawing X's (Null values)"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:161
+msgid "Color for showing unknown information"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:168
+msgid "Draw arrow every Nth grid cell"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:177
+msgid "Raster map containing values used for arrow length"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:184
+msgid "Scale factor for arrows (magnitude map)"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:224
+msgid "Illegal value for scale factor"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:228
+msgid "Illegal value for skip factor"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:233
+msgid "Magnitude is only supported for GRASS and compass aspect maps."
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:240
+msgid "Scale option requires magnitude_map"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:260 ../display/d.barscale/main.c:159
+#: ../display/d.paint.labels/main.c:133 ../display/d.rast.num/number.c:179
+#: ../display/d.rast.edit/cell.c:38
+msgid "Current window not settable"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:313
+msgid "Problem reading range file"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:368
+msgid "No raster map exists in the current window"
+msgstr ""
+
+#: ../display/d.extend/main.c:52
+msgid "No raster or vector map displayed"
+msgstr ""
+
+#: ../display/d.text.new/main.c:150 ../display/d.text.freetype/main.c:146
+msgid "Text to display"
+msgstr ""
+
+#: ../display/d.text.new/main.c:175
+msgid "Text background color, either a standard GRASS color or R:G:B triplet"
+msgstr ""
+
+#: ../display/d.text.new/main.c:200 ../display/d.text.freetype/main.c:209
+msgid "Text alignment"
+msgstr ""
+
+#: ../display/d.text.new/main.c:215 ../display/d.text.freetype/main.c:224
+msgid "Line spacing"
+msgstr ""
+
+#: ../display/d.text.new/main.c:227
+msgid "Path to font file"
+msgstr ""
+
+#: ../display/d.text.new/main.c:235
+msgid "Text encoding (only applicable to TrueType fonts)"
+msgstr ""
+
+#: ../display/d.text.new/main.c:239
+msgid "Use mouse to interactively place text"
+msgstr ""
+
+#: ../display/d.text.new/main.c:243 ../display/d.text.freetype/main.c:228
+msgid "Screen position in pixels ([0,0] is top left)"
+msgstr ""
+
+#: ../display/d.text.new/main.c:247 ../display/d.text.freetype/main.c:232
+msgid "Screen position in geographic coordinates"
+msgstr ""
+
+#: ../display/d.text.new/main.c:255 ../display/d.text.freetype/main.c:240
+msgid "Use radians instead of degrees for rotation"
+msgstr ""
+
+#: ../display/d.text.new/main.c:259 ../display/d.text.freetype/main.c:244
+msgid "Font size is height in pixels"
+msgstr ""
+
+#: ../display/d.text.new/main.c:263
+msgid "Ignored (compatibility with d.text.freetype)"
+msgstr ""
+
+#: ../display/d.text.new/main.c:345
+msgid "Invalid coordinates"
+msgstr ""
+
+#: ../display/d.text.new/main.c:413
+#, c-format
+msgid ""
+"\n"
+"Please enter text instructions.  Enter EOF (ctrl-d) on last line to quit\n"
+msgstr ""
+
+#: ../display/d.text.new/main.c:612
+#, c-format
+msgid "[%s]: No such color. Use '%s'"
+msgstr ""
+
+#: ../display/d.text.new/main.c:632
+#, c-format
+msgid "Click!\n"
+msgstr ""
+
+#: ../display/d.text.new/main.c:633
+#, c-format
+msgid " Left:    Place text here\n"
+msgstr ""
+
+#: ../display/d.text.new/main.c:634
+#, c-format
+msgid " Right:   Quit\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:179 ../display/d.what.vect/what.c:181
+#: ../vector/v.what/what.c:112 ../vector/v.what/what.c:114
+#, c-format
+msgid "Nothing Found.\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:237
+#, c-format
+msgid "Line: %d  Type: %s  Left: %d  Right: %d  "
+msgstr ""
+
+#: ../display/d.what.vect/what.c:241 ../vector/v.what/what.c:169
+#: ../vector/v.what/what.c:224
+#, c-format
+msgid "Length: %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:257
+#, c-format
+msgid "  Node[%d]: %d  Number of lines: %d  Coordinates: %.6f, %.6f, %.6f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:266
+#, c-format
+msgid "    Line: %5d  Angle: %.8f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:275
+#, c-format
+msgid "length %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:295 ../vector/v.what/what.c:238
+#, c-format
+msgid "Point height: %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:313 ../vector/v.what/what.c:255
+#, c-format
+msgid "Line height: %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:322
+#, c-format
+msgid "Line height min: %f max: %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:343
+#, c-format
+msgid "Area height: %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:352
+#, c-format
+msgid "Area\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:374
+#, c-format
+msgid "Area: %d  Number of isles: %d\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:379
+#, c-format
+msgid "  Isle[%d]: %d\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:386
+#, c-format
+msgid "Island: %d  In area: %d\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:393 ../display/d.what.vect/what.c:401
+#, c-format
+msgid "Size - Sq Meters: %.3f\t\tHectares: %.3f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:397 ../display/d.what.vect/what.c:405
+#, c-format
+msgid "           Acres: %.3f\t\tSq Miles: %.4f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:433
+#, c-format
+msgid ""
+"Layer: %d\n"
+"category: %d\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:458
+#, c-format
+msgid ""
+"driver: %s\n"
+"database: %s\n"
+"table: %s\n"
+"key column: %s\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:523
+#, c-format
+msgid ""
+"\n"
+"Click mouse button on desired location\n"
+"\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:528
+#, c-format
+msgid "Buttons\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:529
+#, c-format
+msgid " Left:  what's here\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:531
+#, c-format
+msgid " Middle: toggle flash color\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:536
+#, c-format
+msgid " Right: quit\n"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:56
+msgid ""
+"Allows the user to interactively query a vector map layer at user-selected "
+"locations within the current geographic region."
+msgstr ""
+
+#: ../display/d.what.vect/main.c:85
+msgid "Name of existing vector map"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:94
+msgid "Print information as plain text to terminal window"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:98 ../vector/v.what/main.c:81
+msgid "Print topological information (debugging)"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:102
+msgid "Enable flashing (slower)"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:106
+msgid "Open form in edit mode"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:151
+#, c-format
+msgid "%s: You must build topology on vector map"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:154 ../vector/v.what/main.c:162
+#: ../vector/v.select/main.c:143
+msgid "Building spatial index..."
+msgstr ""
+
+#: ../display/d.what.vect/openvect.c:11
+#, c-format
+msgid "warning: %s - vector map not found\n"
+msgstr ""
+
+#: ../display/d.ask/main.c:36
+msgid "display, map management"
+msgstr ""
+
+#: ../display/d.ask/main.c:38
+msgid ""
+"Prompts the user to select a GRASS data base file from among files displayed "
+"in a menu on the graphics monitor."
+msgstr ""
+
+#: ../display/d.ask/main.c:46
+msgid "Database element, one word description"
+msgstr ""
+
+#: ../display/d.ask/main.c:52
+msgid "Short user prompt message"
+msgstr ""
+
+#: ../display/d.ask/main.c:85
+#, c-format
+msgid "** no %s files found **\n"
+msgstr ""
+
+#: ../display/d.ask/main.c:86
+#, c-format
+msgid "Click here to CONTINUE\n"
+msgstr ""
+
+#: ../display/d.barscale/main.c:57
+msgid "Displays a barscale on the graphics monitor."
+msgstr ""
+
+#: ../display/d.barscale/main.c:61
+msgid "Use mouse to interactively place scale"
+msgstr ""
+
+#: ../display/d.barscale/main.c:65
+msgid "Use feet/miles instead of meters"
+msgstr ""
+
+#: ../display/d.barscale/main.c:69
+msgid "Draw a line scale instead of a bar scale"
+msgstr ""
+
+#: ../display/d.barscale/main.c:73
+msgid "Write text on top of the scale, not to the right"
+msgstr ""
+
+#: ../display/d.barscale/main.c:77
+msgid "Draw a north arrow only"
+msgstr ""
+
+#: ../display/d.barscale/main.c:81
+msgid "Draw a scale bar only"
+msgstr ""
+
+#: ../display/d.barscale/main.c:98
+msgid ""
+"The screen coordinates for top-left corner of label ([0,0] is top-left of "
+"frame)"
+msgstr ""
+
+#: ../display/d.barscale/main.c:106
+msgid "Font size"
+msgstr ""
+
+#: ../display/d.barscale/main.c:114
+#, c-format
+msgid "%s does not work with a latitude-longitude location"
+msgstr ""
+
+#: ../display/d.barscale/main.c:122
+msgid "Choose either -n or -s flag"
+msgstr ""
+
+#: ../display/d.paint.labels/do_labels.c:142
+#, c-format
+msgid "Error: %s\n"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:46
+msgid "display, paint labels"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:48
+msgid ""
+"Displays text labels (created with v.label) to the active frame on the "
+"graphics monitor."
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:54
+msgid "Ignore rotation setting and draw horizontally"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:61
+msgid "Name of label file"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:68
+msgid "Minimum region size (diagonal) when labels are displayed"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:75
+msgid "Maximum region size (diagonal) when labels are displayed"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:87
+#, c-format
+msgid "Label file <%s> not found"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:121 ../vector/v.lrs/v.lrs.label/main.c:299
+#, c-format
+msgid "Unable to open label file <%s>"
+msgstr ""
+
+#: ../display/d.histogram/main.c:71
+msgid "display, histogram, statistics"
+msgstr ""
+
+#: ../display/d.histogram/main.c:73
+msgid ""
+"Displays a histogram in the form of a pie or bar chart for a user-specified "
+"raster map."
+msgstr ""
+
+#: ../display/d.histogram/main.c:77
+msgid "Raster map for which histogram will be displayed"
+msgstr ""
+
+#: ../display/d.histogram/main.c:81
+msgid "Indicate if a pie or bar chart is desired"
+msgstr ""
+
+#: ../display/d.histogram/main.c:90
+msgid "Color for text and axes"
+msgstr ""
+
+#: ../display/d.histogram/main.c:98
+msgid "Indicate if cell counts or map areas should be displayed"
+msgstr ""
+
+#: ../display/d.histogram/main.c:108
+msgid "Number of steps to divide the data range into (fp maps only)"
+msgstr ""
+
+#: ../display/d.histogram/main.c:115
+msgid "Display information for null cells"
+msgstr ""
+
+#: ../display/d.histogram/main.c:119
+msgid "Gather the histogram quietly"
+msgstr ""
+
+#: ../display/d.histogram/main.c:124
+msgid "Report for ranges defined in cats file (fp maps only)"
+msgstr ""
+
+#: ../display/d.histogram/main.c:149
+#, c-format
+msgid "Invalid number of steps: %s"
+msgstr ""
+
+#: ../display/d.histogram/main.c:154
+msgid "When -C flag is set, the nsteps argument is ignored"
+msgstr ""
+
+#: ../display/d.rast.num/number.c:86
+msgid ""
+"Overlays cell category values on a raster map layer displayed to the "
+"graphics monitor."
+msgstr ""
+
+#: ../display/d.rast.num/number.c:100
+msgid "Color for drawing grid, or \"none\""
+msgstr ""
+
+#: ../display/d.rast.num/number.c:110
+msgid "Color for drawing text"
+msgstr ""
+
+#: ../display/d.rast.num/number.c:124
+msgid "Get text color from cell color value"
+msgstr ""
+
+#: ../display/d.rast.num/number.c:138
+msgid "No raster map exists in current window"
+msgstr ""
+
+#: ../display/d.rast.num/number.c:209
+#, c-format
+msgid ""
+"Current region size: %d rows X %d cols\n"
+"Your current region setting may be too large. Cells displayed on your "
+"graphics window may be too small for cell category number to be visible."
+msgstr ""
+
+#: ../display/d.rast.num/number.c:216
+msgid "Aborting (region larger then 200 rows X 200 cols is not allowed)"
+msgstr ""
+
+#: ../display/d.rast.edit/cell.c:43
+msgid "Can't clear current graphics window"
+msgstr ""
+
+#: ../display/d.rast.edit/cell.c:86 ../display/d.rast/display.c:75
+msgid "Cannot use current window"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Get_w_line.c:35
+#: ../display/drivers/XDRIVER/Get_w_pointer.c:21
+#: ../display/drivers/XDRIVER/Get_w_box.c:34
+msgid "Monitor: interactive command in redraw"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Serve_Xevent.c:125
+#, c-format
+msgid "Monitor: waitpid: expected %d but got %d"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Serve_Xevent.c:331
+msgid "Monitor: XGetWMName failed"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Serve_Xevent.c:336
+msgid "Monitor: XGetWMName: bad result"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Graph_set.c:110
+#, c-format
+msgid "found %d visuals of type TrueColor"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Graph_set.c:112
+msgid "searching for highest bit depth"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Graph_set.c:128
+#, c-format
+msgid "selected %d bit depth"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Graph_set.c:188
+#, c-format
+msgid "using default visual which is %s"
+msgstr ""
+
+#: ../display/d.font/main.c:48 ../display/d.font.freetype/main.c:61
+msgid ""
+"Selects the font in which text will be displayed on the user's graphics "
+"monitor."
+msgstr ""
+
+#: ../display/d.font/main.c:56
+msgid "Choose new current font"
+msgstr ""
+
+#: ../display/d.font/main.c:63
+msgid "Path to Freetype-compatible font including file name"
+msgstr ""
+
+#: ../display/d.font/main.c:71 ../display/d.font.freetype/main.c:75
+msgid "Character encoding"
+msgstr ""
+
+#: ../display/d.font/main.c:75
+msgid "List fonts"
+msgstr ""
+
+#: ../display/d.font/main.c:79
+msgid "List fonts verbosely"
+msgstr ""
+
+#: ../display/d.font/main.c:105
+#, c-format
+msgid "Unable to access font path %s: %s"
+msgstr ""
+
+#: ../display/d.font/main.c:109
+#, c-format
+msgid "Font path %s is not a file"
+msgstr ""
+
+#: ../display/d.font/main.c:126
+#, c-format
+msgid ""
+"Font name <%s> is invalid. Check font name or consider running 'g.mkfontcap'"
+msgstr ""
+
+#: ../display/d.save/main.c:81
+msgid "Creates a list of commands for recreating screen graphics."
+msgstr ""
+
+#: ../display/d.save/main.c:86
+msgid "Name of frame(s) to save"
+msgstr ""
+
+#: ../display/d.save/main.c:126
+msgid ""
+"List of object numbers to remove which are displayed after \"#\". -1 for the "
+"last object."
+msgstr ""
+
+#: ../display/d.save/main.c:134
+msgid ""
+"List of object numbers to move (\"from\" to \"to\"). remove= option will be "
+"done first, if any."
+msgstr ""
+
+#: ../display/d.save/main.c:143
+msgid "Save current frame"
+msgstr ""
+
+#: ../display/d.save/main.c:148
+msgid "Save all the frames"
+msgstr ""
+
+#: ../display/d.save/main.c:154
+msgid "Only map objects without extra header and tailer"
+msgstr ""
+
+#: ../display/d.save/main.c:162
+msgid "No monitor selected"
+msgstr ""
+
+#: ../display/d.save/main.c:481 ../display/d.save/main.c:516
+#, c-format
+msgid "Unknown item type in pad: %s"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:51
+msgid "To establish and control use of a graphics display monitor."
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:57
+msgid "Name of graphics monitor to start"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:63
+msgid "Name of graphics monitor to stop"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:69
+msgid "Name of graphics monitor to select"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:75
+msgid "Name of graphics monitor to unlock"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:79
+msgid "List all monitors"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:83
+msgid "List all monitors (with current status)"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:87
+msgid "Print name of currently selected monitor"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:91
+msgid "Release currently selected monitor"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:96
+msgid "Do not automatically select when starting"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:134
+#, c-format
+msgid "Problem selecting %s. Will try once more"
+msgstr ""
+
+#: ../display/d.mon/pgms/start.c:68 ../display/d.mon/pgms/select.c:18
+#, c-format
+msgid "Usage:  %s monitor_name"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:33 ../display/d.mon/pgms/release.c:41
+#, c-format
+msgid "%s: -%c unrecognized option"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:49
+#, c-format
+msgid "Usage: %s [-f] monitor_name"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:70
+#, c-format
+msgid "Monitor '%s' terminated"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:73
+#, c-format
+msgid "Error - Monitor '%s' was not running"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:76 ../display/d.mon/pgms/release.c:74
+#: ../display/d.mon/pgms/select.c:27
+#, c-format
+msgid "No such monitor as <%s>"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:79
+#, c-format
+msgid "Error - Monitor '%s' in use by another user"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:82
+msgid "Error - Locking mechanism failed"
+msgstr ""
+
+#: ../display/d.mon/pgms/release.c:68
+#, c-format
+msgid "Monitor <%s> released"
+msgstr ""
+
+#: ../display/d.mon/pgms/release.c:71
+#, c-format
+msgid "Monitor <%s> in use by another user"
+msgstr ""
+
+#: ../display/d.mon/pgms/release.c:77
+msgid "Failed testing lock mechanism"
+msgstr ""
+
+#: ../display/d.mon/pgms/release.c:88
+#, c-format
+msgid "Usage:  %s [-fv] [name]"
+msgstr ""
+
+#: ../display/d.menu/main.c:66
+msgid "display, menu"
+msgstr ""
+
+#: ../display/d.menu/main.c:68
+msgid ""
+"Creates and displays a menu within the active frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.menu/main.c:77
+msgid "Sets the color of the menu background"
+msgstr ""
+
+#: ../display/d.menu/main.c:85
+msgid "Sets the color of the menu text"
+msgstr ""
+
+#: ../display/d.menu/main.c:93
+msgid "Sets the color dividing lines of text"
+msgstr ""
+
+#: ../display/d.menu/main.c:101
+msgid "Sets the menu text size (in percent)"
+msgstr ""
+
+#: ../display/d.menu/main.c:113 ../display/d.menu/main.c:119
+#: ../display/d.menu/main.c:125
+#, c-format
+msgid "Don't know the color %s"
+msgstr ""
+
+#: ../display/d.menu/main.c:186
+msgid "Menu must contain a title and at least one option"
+msgstr ""
+
+#: ../display/d.his/main.c:65
+msgid "display, color transformation"
+msgstr ""
+
+#: ../display/d.his/main.c:67
+msgid ""
+"Displays the result obtained by combining hue, intensity, and saturation "
+"(his) values from user-specified input raster map layers."
+msgstr ""
+
+#: ../display/d.his/main.c:95
+msgid "Percent to brighten intensity channel"
+msgstr ""
+
+#: ../display/d.his/main.c:219
+msgid "Error reading hue data"
+msgstr ""
+
+#: ../display/d.his/main.c:224
+msgid "Error reading intensity data"
+msgstr ""
+
+#: ../display/d.his/main.c:229
+msgid "Error reading saturation data"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:140
+msgid ""
+"Draws text in the graphics monitor's active display frame using TrueType "
+"fonts."
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:154
+msgid "Screen position (percentage, [0,0] is bottom left)"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:176
+msgid "Path to TrueType font (including file name)"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:201
+msgid "Height of letters (in percent of available frame height)"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:248
+msgid "Command mode (Compatibility with d.text)"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:255
+msgid "Either text or -c should be given"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:260
+msgid "Choose only one coordinate system for placement"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:265 ../display/d.text.freetype/main.c:268
+#: ../display/d.text.freetype/main.c:606
+msgid "No font selected"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:277 ../display/d.text.freetype/main.c:440
+#, c-format
+msgid "Invalid font: %s"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:327 ../vector/v.label.sa/labels.c:92
+msgid "Unable to initialise FreeType"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:331 ../display/d.text.freetype/main.c:458
+msgid "Unable to create face"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:334 ../display/d.text.freetype/main.c:461
+#: ../display/d.text.freetype/main.c:478
+msgid "Unable to set size"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:349 ../display/d.text.freetype/main.c:568
+msgid "Unable to create text conversion context"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:351 ../display/d.text.freetype/main.c:570
+msgid "Text conversion error"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:415
+msgid "Unable to write the temporary file"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:435
+msgid "No predefined font"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:451
+#, c-format
+msgid "%s: Unable to read font"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:645
+#, c-format
+msgid "%s: Unable to read FreeType definition file; use the default"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:651
+#, c-format
+msgid "%s: No FreeType definition file"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:655
+#, c-format
+msgid "%s: Unable to read FreeType definition file"
+msgstr ""
+
+#: ../display/d.extract/main.c:52
+msgid "Selects and extracts vectors with mouse into new vector map."
+msgstr ""
+
+#: ../display/d.extract/main.c:117
+msgid "Copying tables..."
+msgstr ""
+
+#: ../display/d.extract/main.c:125
+msgid "Cannot get db link info -> cannot copy table."
+msgstr ""
+
+#: ../display/d.extract/extract.c:44
+msgid "Select vector(s) with mouse"
+msgstr ""
+
+#: ../display/d.extract/extract.c:45
+msgid " - L: draw box with left mouse button to select"
+msgstr ""
+
+#: ../display/d.extract/extract.c:46
+msgid " - M: draw box with middle mouse button to remove from display"
+msgstr ""
+
+#: ../display/d.extract/extract.c:47
+msgid " - R: quit and save selected vectors to new map\n"
+msgstr ""
+
+#: ../display/d.extract/extract.c:49
+msgid "L: add  M: remove  R: quit and save\n"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:65
+msgid ""
+"Displays charts of vector data in the active frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:82
+msgid "Chart type"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:83 ../display/d.vect.chart/main.c:97
+#: ../display/d.vect.chart/main.c:105 ../display/d.vect.chart/main.c:112
+#: ../display/d.vect.chart/main.c:120 ../display/d.vect.chart/main.c:129
+#: ../display/d.vect.chart/main.c:135
+msgid "Chart properties"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:90
+msgid "Attribute columns containing data"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:96
+msgid "Column used for pie chart size"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:104
+msgid "Size of chart (diameter for pie, total width for bar)"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:111
+msgid "Scale for size (to get size in pixels)"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:118
+msgid "Outline color"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:127
+msgid "Colors used to fill charts"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:134
+msgid "Center the bar chart around a data point"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:143
+msgid "Maximum value used for bar plot reference"
+msgstr ""
+
+#: ../display/d.nviz/main.c:69
+msgid "display, visualization, raster, vector, raster3d"
+msgstr ""
+
+#: ../display/d.nviz/main.c:70
+msgid "Creates fly-through script to run in NVIZ."
+msgstr ""
+
+#: ../display/d.nviz/main.c:75
+msgid "Name of output script"
+msgstr ""
+
+#: ../display/d.nviz/main.c:81
+msgid "Prefix of output images (default = NVIZ)"
+msgstr ""
+
+#: ../display/d.nviz/main.c:89
+msgid "Route coordinates (east,north)"
+msgstr ""
+
+#: ../display/d.nviz/main.c:95
+msgid "Camera layback distance (in map units)"
+msgstr ""
+
+#: ../display/d.nviz/main.c:101
+msgid "Camera height above terrain"
+msgstr ""
+
+#: ../display/d.nviz/main.c:107
+msgid "Number of frames"
+msgstr ""
+
+#: ../display/d.nviz/main.c:113
+msgid "Start frame number (default=0)"
+msgstr ""
+
+#: ../display/d.nviz/main.c:118
+msgid "Interactively select route"
+msgstr ""
+
+#: ../display/d.nviz/main.c:122
+msgid "Full render -- Save images"
+msgstr ""
+
+#: ../display/d.nviz/main.c:126
+msgid "Fly at constant elevation (ht)"
+msgstr ""
+
+#: ../display/d.nviz/main.c:131
+msgid "Include command in the script to output a KeyFrame file"
+msgstr ""
+
+#: ../display/d.nviz/main.c:135
+msgid "Render images off-screen"
+msgstr ""
+
+#: ../display/d.nviz/main.c:139
+msgid "Enable vector and sites drawing"
+msgstr ""
+
+#: ../display/d.nviz/main.c:147
+msgid "Either -i flag and/or route parameter must be used"
+msgstr ""
+
+#: ../display/d.nviz/main.c:171
+msgid "Off-screen only available with full render mode"
+msgstr ""
+
+#: ../display/d.nviz/main.c:282
+msgid "You must select more than one point"
+msgstr ""
+
+#: ../display/d.nviz/main.c:300
+msgid "You must select at least four points"
+msgstr ""
+
+#: ../display/d.nviz/main.c:317
+#, c-format
+msgid "You must provide at least four points %d"
+msgstr ""
+
+#: ../display/d.nviz/main.c:391
+#, c-format
+msgid "Created NVIZ script <%s>."
+msgstr ""
+
+#: ../display/d.nviz/main.c:538
+msgid ""
+"Skipping this point, selected point is outside region. Perhaps the camera "
+"setback distance puts it beyond the edge?"
+msgstr ""
+
+#: ../display/d.measure/main.c:49
+msgid "display, geometry"
+msgstr ""
+
+#: ../display/d.measure/main.c:51
+msgid ""
+"Measures the lengths and areas of features drawn by the user in the active "
+"display frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.measure/main.c:57
+msgid "Line color 1"
+msgstr ""
+
+#: ../display/d.measure/main.c:65
+msgid "Line color 2"
+msgstr ""
+
+#: ../display/d.measure/main.c:73
+msgid "Suppress clear screen"
+msgstr ""
+
+#: ../display/d.measure/main.c:77
+msgid "Output in meters only"
+msgstr ""
+
+#: ../display/d.measure/main.c:81
+msgid "Output in kilometers as well"
+msgstr ""
+
+#: ../display/d.title/main.c:47
+msgid ""
+"Create a TITLE for a raster map in a form suitable for display with d.text."
+msgstr ""
+
+#: ../display/d.title/main.c:58
+msgid "Sets the text color"
+msgstr ""
+
+#: ../display/d.title/main.c:66
+msgid "Sets the text size as percentage of the frame's height"
+msgstr ""
+
+#: ../display/d.title/main.c:70
+msgid "Draw title on current display"
+msgstr ""
+
+#: ../display/d.title/main.c:74
+msgid "Do a fancier title"
+msgstr ""
+
+#: ../display/d.title/main.c:79
+msgid "Do a simple title"
+msgstr ""
+
+#: ../display/d.title/main.c:97
+msgid "Title can be fancy or simple, not both"
+msgstr ""
+
+#: ../display/d.title/main.c:100
+msgid "No map name given"
+msgstr ""
+
+#: ../display/d.zoom/main.c:57
+msgid "display, zoom"
+msgstr ""
+
+#: ../display/d.zoom/main.c:59
+msgid ""
+"Allows the user to change the current geographic region settings "
+"interactively, with a mouse."
+msgstr ""
+
+#: ../display/d.zoom/main.c:108
+msgid "Magnification: >1.0 zooms in, <1.0 zooms out"
+msgstr ""
+
+#: ../display/d.zoom/main.c:118
+msgid "Full menu (zoom + pan) & Quit menu"
+msgstr ""
+
+#: ../display/d.zoom/main.c:122
+msgid "Pan mode"
+msgstr ""
+
+#: ../display/d.zoom/main.c:126
+msgid "Handheld mode"
+msgstr ""
+
+#: ../display/d.zoom/main.c:130
+msgid "Just redraw given maps using default colors"
+msgstr ""
+
+#: ../display/d.zoom/main.c:134
+msgid "Return to previous zoom"
+msgstr ""
+
+#: ../display/d.zoom/main.c:145
+msgid "Please choose only one mode of operation"
+msgstr ""
+
+#: ../display/d.zoom/main.c:162
+msgid "ERROR: can not get \"list\" items"
+msgstr ""
+
+#: ../display/d.zoom/main.c:163
+msgid "-j flag forced"
+msgstr ""
+
+#: ../display/d.zoom/main.c:196
+msgid "No map is displayed in GRASS monitor"
+msgstr ""
+
+#: ../display/d.zoom/main.c:298
+#, c-format
+msgid "%d raster%s, %d vector%s\n"
+msgstr ""
+
+#: ../display/d.zoom/main.c:307
+msgid "No previous zoom available"
+msgstr ""
+
+#: ../display/d.zoom/main.c:311
+msgid "Returning to previous zoom"
+msgstr ""
+
+#: ../display/d.zoom/main.c:352
+msgid "Zooming complete."
+msgstr ""
+
+#: ../display/d.zoom/pan.c:17 ../display/d.zoom/zoom.c:15
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Buttons:\n"
+msgstr ""
+
+#: ../display/d.zoom/pan.c:18
+#, c-format
+msgid "Left:   Pan\n"
+msgstr ""
+
+#: ../display/d.zoom/pan.c:19
+#, c-format
+msgid "Right:  Quit\n"
+msgstr ""
+
+#: ../display/d.zoom/zoom.c:16
+#, c-format
+msgid "Left:   Zoom menu\n"
+msgstr ""
+
+#: ../display/d.zoom/zoom.c:17
+#, c-format
+msgid "Middle: Pan\n"
+msgstr ""
+
+#: ../display/d.zoom/zoom.c:18
+#, c-format
+msgid "Right:  Quit menu\n"
+msgstr ""
+
+#: ../display/d.zoom/zoom.c:40
+#, c-format
+msgid ""
+"This region now saved as current region.\n"
+"\n"
+msgstr ""
+
+#: ../display/d.zoom/zoom.c:42
+#, c-format
+msgid "Note: run 'd.erase' for the new region to affect the graphics.\n"
+msgstr ""
+
+#: ../display/d.rast/main.c:52
+msgid "Displays user-specified raster map in the active graphics frame."
+msgstr ""
+
+#: ../display/d.rast/main.c:57 ../imagery/i.class/main.c:62
+msgid "Name of raster map to be displayed"
+msgstr ""
+
+#: ../display/d.rast/main.c:65
+msgid "List of categories to be displayed (INT maps)"
+msgstr ""
+
+#: ../display/d.rast/main.c:74
+msgid "List of values to be displayed (FP maps)"
+msgstr ""
+
+#: ../display/d.rast/main.c:83
+msgid "Background color (for null)"
+msgstr ""
+
+#: ../display/d.rast/main.c:84 ../display/d.rast/main.c:89
+msgid "Null cells"
+msgstr ""
+
+#: ../display/d.rast/main.c:93
+msgid "Invert catlist"
+msgstr ""
+
+#: ../display/d.rast/main.c:99
+msgid "Don't add to list of rasters and commands in monitor"
+msgstr ""
+
+#: ../display/d.rast/main.c:119
+msgid "Ignoring catlist: map is floating point (please use 'val=')"
+msgstr ""
+
+#: ../display/d.rast/main.c:125
+msgid "Ignoring vallist: map is integer (please use 'cat=')"
+msgstr ""
+
+#: ../display/d.font.freetype/main.c:68
+msgid "Font name or pathname of TTF file"
+msgstr ""
+
+#: ../display/d.font.freetype/main.c:173
+msgid "Setting release of FreeType"
+msgstr ""
+
+#: ../raster3d/base/r3.timestamp.main.c:43 ../raster3d/base/r3.mask.main.c:153
+#: ../raster3d/base/r3.info.main.c:78 ../raster3d/base/r3.null.main.c:205
+#: ../raster3d/r3.cross.rast/main.c:270 ../raster3d/r3.mkdspf/main.c:75
+#: ../raster3d/r3.to.rast/main.c:215 ../raster3d/r3.gwflow/main.c:169
+msgid "raster3d, voxel"
+msgstr ""
+
+#: ../raster3d/base/r3.timestamp.main.c:45
+msgid "Print/add/remove a timestamp for a 3D raster map"
+msgstr ""
+
+#: ../raster3d/base/r3.timestamp.main.c:52
+msgid "Input grid3 filename"
+msgstr ""
+
+#: ../raster3d/base/r3.timestamp.main.c:59
+msgid "Datetime, datetime1/datetime2, or none"
+msgstr ""
+
+#: ../raster3d/base/r3.timestamp.main.c:74
+#, c-format
+msgid "Grid3 <%s> not found %s"
+msgstr ""
+
+#: ../raster3d/base/mask_functions.c:82
+#, c-format
+msgid "Adding rule: %lf - %lf"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:44
+msgid "3D raster map with reference values"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:52
+msgid "List of cell values to be masked out"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:95
+msgid "Unable to open 3D raster mask file"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:124
+msgid "makeMask: error flushing tiles in cube"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:129
+msgid "makeMask: error flushing all tiles"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:137
+msgid "Unable to close 3D raster mask file"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:139
+#, c-format
+msgid "Unable to close raster map <%s>"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:155
+msgid "Establishes the current working 3D raster mask."
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:159
+msgid ""
+"Cannot create mask file: G3D_MASK already exists!\n"
+" Use 'g.remove rast3d=G3D_MASK' to remove the existing mask."
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:80
+msgid "Outputs basic information about a user-specified 3D raster map layer."
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:87
+msgid "Name of input 3D raster map"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:96
+msgid "Print 3D raster map resolution (NS-res, EW-res, TB-res) only"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:100
+msgid "Print 3D raster map type (float/double) only"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:104
+msgid "Print 3D raster map region only"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:108
+msgid "Print 3D raster history instead of info"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:113
+msgid "Print 3D raster map timestamp (day.month.year hour:minute:seconds) only"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:121
+#, c-format
+msgid "3D Raster map <%s> not found"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:287 ../raster3d/base/r3.info.main.c:349
+#, c-format
+msgid "Unable to read range of 3D raster map <%s>"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:404
+msgid "Error while reading history file"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:425 ../raster3d/r3.cross.rast/main.c:404
+#: ../raster3d/r3.out.vtk/errorHandling.c:67 ../raster3d/r3.gwflow/main.c:415
+#, c-format
+msgid "Unable to close 3D raster map <%s>"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:58
+msgid "3d raster map for which to modify null values"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:88
+msgid "Illegal value for null"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:125
+msgid "modifyNull: error opening tmp file"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:174
+msgid "modifyNull: error flushing tiles in cube"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:180
+msgid "modifyNull: error flushing all tiles"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:190
+msgid "modifyNull: Unable to close tmp file"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:207
+msgid "Explicitly create the 3D NULL-value bitmap file."
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:55 ../raster3d/r3.in.ascii/main.c:287
+#: ../raster3d/r3.out.vtk/main.c:254 ../raster3d/r3.out.vtk/main.c:339
+#: ../raster3d/r3.out.v5d/main.c:54 ../raster3d/r3.out.v5d/main.c:326
+#: ../raster3d/r3.out.ascii/main.c:58 ../raster3d/r3.out.ascii/main.c:300
+#: ../raster3d/r3.to.rast/main.c:55 ../raster3d/r3.to.rast/main.c:390
+#: ../raster3d/r3.in.v5d/main.c:218
+msgid "Unable to close 3D raster map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:77 ../raster3d/r3.cross.rast/main.c:392
+#: ../raster3d/r3.to.rast/main.c:194
+msgid "Unable to close output map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:91
+msgid "Input 3D raster map for cross section."
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:98
+msgid "2D elevation map used to create the cross section map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:105
+msgid "Resulting cross section 2D raster map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:162
+msgid "Unable to get elevation raster row"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:230 ../raster3d/r3.cross.rast/main.c:237
+#: ../raster3d/r3.to.rast/main.c:152 ../raster3d/r3.to.rast/main.c:159
+msgid "Unable to write raster row"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:272
+msgid ""
+"Creates cross section 2D raster map from 3D raster map based on 2D elevation "
+"map."
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:298
+msgid ""
+"The 2D and 3D region settings are different. Using the 3D raster map "
+"settings to adjust the 2D region."
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:333
+msgid "Elevation map not found"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:338
+msgid "Unable to open elevation map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:352
+msgid "Output map already exists. Will be overwritten!"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:358 ../raster3d/r3.cross.rast/main.c:364
+msgid "Unable to create raster map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:394
+msgid "Unable to close elevation map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:399
+msgid "Wrong 3D raster map datatype! Unable to create raster map."
+msgstr ""
+
+#: ../raster3d/r3.stats/main.c:569
+msgid "Generates volume statistics for 3D raster maps."
+msgstr ""
+
+#: ../raster3d/r3.stats/main.c:580
+msgid "Number of subranges to collect stats from"
+msgstr ""
+
+#: ../raster3d/r3.stats/main.c:586
+msgid "Calculate statistics based on equal value groups"
+msgstr ""
+
+#: ../raster3d/r3.stats/main.c:606
+msgid "The number of subranges has to be equal or greater than 1"
+msgstr ""
+
+#: ../raster3d/r3.stats/main.c:665
+msgid "Sort non-null values"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:79
+msgid "ASCII raster map to be imported"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:90
+msgid "String representing NULL value data cell (use 'none' if no such value)"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:175
+#, c-format
+msgid "Loading data ...  (%dx%dx%d)"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:192
+msgid "End of file reached while still loading data."
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:205
+msgid "Invalid value detected"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:222
+#, c-format
+msgid ""
+"Data exists in input file after fully importing expected data.  [%.4f ...]"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:253 ../raster3d/r3.in.v5d/main.c:191
+msgid "raster3d, voxel, import"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:255
+msgid ""
+"Converts a 3D ASCII raster text file into a (binary) 3D raster map layer."
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:281 ../raster3d/r3.in.v5d/main.c:213
+msgid "Unable to open 3D raster map"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:297
+msgid "Unable to close ASCII file"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:99
+#, c-format
+msgid "Could not open map %s"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:118
+msgid "Specify top and bottom map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:125
+#, c-format
+msgid "Top cell map <%s> not found"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:134
+#, c-format
+msgid "Bottom cell map <%s> not found"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:157
+msgid "Please provide three RGB 3D raster maps"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:167
+#, c-format
+msgid "3D vector map <%s> not found"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:171
+msgid "Please provide three 3D raster maps for the xyz-vector maps [x,y,z]"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:178
+msgid ""
+"No 3D raster data, RGB or xyz-vector maps are provided. Will only write the "
+"geometry"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:211
+msgid "No RGB Data will be created"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:295
+msgid "No vector data will be created"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:376 ../raster3d/r3.out.v5d/main.c:286
+#: ../raster3d/r3.out.ascii/main.c:244
+msgid "raster3d, voxel, export"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:378
+msgid "Converts 3D raster maps into the VTK-ASCII format."
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:389
+msgid "failed to interpret dp as an integer"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:451 ../raster3d/r3.to.rast/main.c:267
+msgid ""
+"The 2D and 3D region settings are different. Using the 2D window settings to "
+"adjust the 2D part of the 3D region."
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:489
+msgid "Unable to close top raster map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:494
+msgid "Unable to close bottom raster map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:546
+msgid "Unable to close 3D raster map, the VTK file may be incomplete"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:561
+msgid "Unable to close VTK-ASCII file"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/errorHandling.c:52
+msgid "Unable to close input raster map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/errorHandling.c:107
+msgid "Unable to close input raster maps"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKData.c:122
+msgid "write_vtk_points: Writing point coordinates"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKData.c:131
+msgid "Unable to read top raster row \n"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKData.c:135
+msgid "Unable to read bottom raster row \n"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKData.c:256
+msgid "write_vtk_unstructured_grid_cells: Writing the cells"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKData.c:429
+#: ../raster3d/r3.out.vtk/writeVTKData.c:462
+msgid "Wrong 3D raster map values: Values should in between 0 and 255\n"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:30
+msgid "G3D map(s) to be converted to VTK-ASCII data format"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:41
+msgid "Float value to represent no data cell/points"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:47
+msgid "Create VTK pointdata instead of VTK celldata (celldata is default)"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:56
+msgid "top surface 2D raster map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:65
+msgid "bottom surface 2D raster map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:71
+msgid ""
+"Create 3d elevation output with a top and a bottom surface, both raster maps "
+"are required."
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:82
+msgid ""
+"Three (R,G,B) 3D raster maps to create RGB values [redmap,greenmap,bluemap]"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:92
+msgid "Three (x,y,z) 3D raster maps to create vector values [xmap,ymap,zmap]"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:117 ../raster3d/r3.gwflow/main.c:136
+msgid "Use 3D raster mask (if exists) with input maps"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:122
+msgid "Scale factor effects the origin"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKHead.c:39
+msgid "write_vtk_structured_point_header: Writing VTKStructuredPoint-Header"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKHead.c:95
+msgid "write_vtk_structured_grid_header: Writing VTKStructuredGrid-Header"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKHead.c:116
+msgid "write_vtk_unstructured_grid_header: Writing VTKUnstructuredGrid-Header"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:72
+msgid "3D raster map to be converted to Vis5D (V5D) file"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:79
+msgid "Name for V5D output file"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:149
+#, c-format
+msgid "Vis5D allows %d columns, %d columns found"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:152
+#, c-format
+msgid "Vis5D allows %d rows, %d rows found"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:259
+#, c-format
+msgid "Unable to create V5D file <%s>"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:264
+msgid "Failed writing V5D file"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:288
+msgid "Exports GRASS 3D raster map to 3-dimensional Vis5D file."
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:295
+msgid "Use map coordinates instead of xyz coordinates"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:77
+msgid ""
+"Creates a display file from an existing grid3 file according to specified "
+"threshold levels."
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:85
+msgid "Name of an existing 3d raster map"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:91
+msgid "Name of output display file"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:98
+msgid "List of thresholds for isosurfaces"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:104
+msgid "Minimum isosurface level"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:110
+msgid "Maximum isosurface level"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:116
+msgid "Positive increment between isosurface levels"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:123
+msgid "Number of isosurface threshold levels"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:127
+msgid "Suppress progress report & min/max information"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:131
+msgid "Use flat shading rather than gradient"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:139
+#, c-format
+msgid "Region from getWindow: %d %d %d"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:151
+#, c-format
+msgid "Not able to find grid3 file for [%s]"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:163
+#, c-format
+msgid "Error opening grid3 file [%s]"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:166
+#, c-format
+msgid "Error reading range for [%s]"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:195
+#, c-format
+msgid "Error opening display file [%s]"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:216
+#, c-format
+msgid "Writing %s from %s..."
+msgstr ""
+
+#: ../raster3d/r3.out.ascii/main.c:76
+msgid "3D raster map to be converted to ASCII"
+msgstr ""
+
+#: ../raster3d/r3.out.ascii/main.c:83
+msgid "Name for ASCII output file"
+msgstr ""
+
+#: ../raster3d/r3.out.ascii/main.c:92
+msgid "Number of decimal places for floats"
+msgstr ""
+
+#: ../raster3d/r3.out.ascii/main.c:246
+msgid "Converts a 3D raster map layer into an ASCII text file."
+msgstr ""
+
+#: ../raster3d/r3.out.ascii/main.c:305
+msgid "Unable to close new ASCII file"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:79
+msgid "3D raster map(s) to be converted to 2D raster slices"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:85
+msgid "Basename for resultant raster slice maps"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:95
+msgid ""
+"Use the same resolution as the input 3D raster map for the 2D outputmaps, "
+"independent of the current region settings"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:216
+msgid "Converts 3D raster maps to 2D raster maps"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:225
+#, c-format
+msgid "Open 3D raster map <%s>"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:243 ../raster3d/r3.to.rast/main.c:284
+#, c-format
+msgid "Error opening 3D raster map <%s>"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:304
+#, c-format
+msgid "Creating %i raster maps"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:310
+#, c-format
+msgid "Raster map %i Filename: %s"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:313
+#, c-format
+msgid "Raster map %d Filename: %s already exists. Will be overwritten!"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:55
+msgid "Input 3D raster map with initial piezometric heads in [m]"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:63
+msgid "The status for each cell, = 0 - inactive, 1 - active, 2 - dirichlet"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:71
+msgid "The x-part of the hydraulic conductivity tensor in [m/s]"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:79
+msgid "The y-part of the hydraulic conductivity tensor in [m/s]"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:87
+msgid "The z-part of the hydraulic conductivity tensor in [m/s]"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:94
+msgid "Sources and sinks in [m^3/s]"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:101
+msgid "Specific yield in 1/m"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:108
+msgid "Recharge raster map in m^3/s"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:116
+msgid ""
+"The piezometric head result of the numerical calculation will be written to "
+"this map"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:123
+msgid ""
+"Calculate the groundwater distance velocity vector field \n"
+"and write the x, y, and z components to maps named name_[xyz].\n"
+"Name is basename for the new 3D raster maps."
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:141
+msgid ""
+"Use a sparse linear equation system, only available with iterative solvers"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:171
+msgid ""
+"Calculates numerically transient, confined groundwater flow in three "
+"dimensions."
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:193
+msgid "The direct Cholesky solver do not work with sparse matrices"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:371
+#, c-format
+msgid "Unable to create 3D raster map <%s>"
+msgstr ""
+
+#: ../raster3d/r3.in.v5d/main.c:193
+msgid ""
+"Imports 3-dimensional Vis5D files (i.e. the V5D file with 1 variable and 1 "
+"time step)."
+msgstr ""
+
+#: ../ps/ps.map/do_psfiles.c:20
+#, c-format
+msgid "Reading PostScript include file <%s> ..."
+msgstr ""
+
+#: ../ps/ps.map/do_labels.c:43
+#, c-format
+msgid "Can't open label file <%s> in mapset <%s>"
+msgstr ""
+
+#: ../ps/ps.map/do_labels.c:47
+#, c-format
+msgid "Reading labels file <%s in %s> ..."
+msgstr ""
+
+#: ../ps/ps.map/do_labels.c:65
+#, c-format
+msgid "Can't open temporary label file <%s>"
+msgstr ""
+
+#: ../ps/ps.map/do_labels.c:68
+msgid "Reading text file ..."
+msgstr ""
+
+#: ../ps/ps.map/do_labels.c:161
+msgid "Text labels: 'fontsize' given so ignoring 'size'"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:48 ../ps/ps.map/r_vlegend.c:49
+#: ../ps/ps.map/r_colortable.c:61
+msgid "illegal where request"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:67 ../ps/ps.map/ps_outline.c:86
+#: ../ps/ps.map/r_header.c:65 ../ps/ps.map/getgrid.c:61
+#: ../ps/ps.map/getgrid.c:85 ../ps/ps.map/getgrid.c:171
+#: ../ps/ps.map/getgrid.c:195
+msgid "Unsupported color request"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:69 ../ps/ps.map/ps_outline.c:88
+#: ../ps/ps.map/r_header.c:67 ../ps/ps.map/main.c:399
+#: ../ps/ps.map/getgrid.c:63 ../ps/ps.map/getgrid.c:87
+#: ../ps/ps.map/getgrid.c:173 ../ps/ps.map/getgrid.c:197
+msgid "illegal color request"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:81
+msgid "illegal bgcolor request"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:93 ../ps/ps.map/r_vlegend.c:86
+msgid "illegal border color request"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:103
+msgid "illegal mapinfo sub-request"
+msgstr ""
+
+#: ../ps/ps.map/r_vlegend.c:97
+msgid "illegal vlegend sub-request"
+msgstr ""
+
+#: ../ps/ps.map/makeprocs.c:29
+#, c-format
+msgid "Unable to open prolog <%s>"
+msgstr ""
+
+#: ../ps/ps.map/ps_outline.c:42
+#, c-format
+msgid "Outlining areas in raster map <%s in %s> ..."
+msgstr ""
+
+#: ../ps/ps.map/ps_outline.c:99 ../ps/ps.map/r_colortable.c:69
+msgid "illegal width request"
+msgstr ""
+
+#: ../ps/ps.map/ps_outline.c:106
+msgid "illegal outline sub-request"
+msgstr ""
+
+#: ../ps/ps.map/eps.c:19
+#, c-format
+msgid "Can't open eps file <%s>"
+msgstr ""
+
+#: ../ps/ps.map/eps.c:38
+#, c-format
+msgid "Bounding box in eps file <%s> was not found"
+msgstr ""
+
+#: ../ps/ps.map/r_header.c:77
+msgid "illegal header sub-request"
+msgstr ""
+
+#: ../ps/ps.map/scale.c:137
+msgid "PSmap: do_scale(): shouldn't happen"
+msgstr ""
+
+#: ../ps/ps.map/ps_vlines.c:55 ../ps/ps.map/ps_vareas.c:163
+#: ../ps/ps.map/ps_vpoints.c:71
+msgid "Cannot load data from table"
+msgstr ""
+
+#: ../ps/ps.map/ps_vlines.c:83 ../ps/ps.map/ps_vareas.c:66
+#: ../ps/ps.map/ps_vareas.c:77 ../ps/ps.map/ps_vpoints.c:127
+msgid "Read error in vector map"
+msgstr ""
+
+#: ../ps/ps.map/ps_vlines.c:118 ../ps/ps.map/ps_vareas.c:101
+#: ../ps/ps.map/ps_vpoints.c:164 ../ps/ps.map/ps_vpoints.c:175
+#: ../ps/ps.map/ps_vpoints.c:199 ../ps/ps.map/ps_vpoints.c:240
+#: ../ps/ps.map/ps_vpoints.c:250
+#, c-format
+msgid "No record for category [%d]"
+msgstr ""
+
+#: ../ps/ps.map/ps_vlines.c:124 ../ps/ps.map/ps_vareas.c:107
+#: ../ps/ps.map/ps_vpoints.c:205
+#, c-format
+msgid "Invalid RGB color definition in column <%s> for category [%d]"
+msgstr ""
+
+#: ../ps/ps.map/catval.c:49 ../ps/ps.map/catval.c:111
+#: ../ps/ps.map/catval.c:177 ../vector/v.label/main.c:278
+#: ../vector/v.vol.rst/user1.c:93 ../vector/v.label.sa/labels.c:80
+#: ../vector/v.class/main.c:105 ../vector/v.buffer/main.c:383
+#: ../vector/v.to.rast3/main.c:82
+msgid "Unable to get layer info for vector map"
+msgstr ""
+
+#: ../ps/ps.map/catval.c:64
+msgid "Column type not supported (must be string)"
+msgstr ""
+
+#: ../ps/ps.map/catval.c:67 ../ps/ps.map/catval.c:132
+#: ../ps/ps.map/catval.c:199 ../vector/v.sample/main.c:185
+#: ../vector/v.univar/main.c:331 ../vector/v.surf.idw/read_sites.c:52
+#: ../vector/v.class/main.c:126 ../vector/v.buffer/main.c:397
+#: ../vector/v.to.rast3/main.c:96 ../vector/v.normal/main.c:154
+#: ../vector/lidar/v.surf.bspline/main.c:348
+msgid "Unable to select data from table"
+msgstr ""
+
+#: ../ps/ps.map/catval.c:129
+msgid "Size column type must be numeric"
+msgstr ""
+
+#: ../ps/ps.map/catval.c:196
+msgid "Rotation column type must be numeric"
+msgstr ""
+
+#: ../ps/ps.map/main.c:100
+msgid "postscript, map, printing"
+msgstr ""
+
+#: ../ps/ps.map/main.c:101
+msgid "Produces hardcopy PostScript map output."
+msgstr ""
+
+#: ../ps/ps.map/main.c:105
+msgid "Rotate plot 90 degrees"
+msgstr ""
+
+#: ../ps/ps.map/main.c:106 ../ps/ps.map/main.c:118 ../ps/ps.map/main.c:148
+#: ../ps/ps.map/main.c:156
+msgid "Output settings"
+msgstr ""
+
+#: ../ps/ps.map/main.c:111
+msgid "List paper formats ( name width height left right top bottom(margin) )"
+msgstr ""
+
+#: ../ps/ps.map/main.c:112 ../ps/ps.map/main.c:124
+msgid "Utility"
+msgstr ""
+
+#: ../ps/ps.map/main.c:117
+msgid "Create EPS (Encapsulated PostScript) instead of PostScript file"
+msgstr ""
+
+#: ../ps/ps.map/main.c:123
+msgid ""
+"Describe map-box's position on the page and exit (inches from top-left of "
+"paper)"
+msgstr ""
+
+#: ../ps/ps.map/main.c:129
+msgid "File containing mapping instructions"
+msgstr ""
+
+#: ../ps/ps.map/main.c:130
+msgid "Use '-' to enter instructions from keyboard"
+msgstr ""
+
+#: ../ps/ps.map/main.c:138
+msgid "PostScript output file"
+msgstr ""
+
+#: ../ps/ps.map/main.c:147
+msgid "Scale of the output map, e.g. 1:25000 (default: Auto-sized to fit page)"
+msgstr ""
+
+#: ../ps/ps.map/main.c:154
+msgid "Number of copies to print"
+msgstr ""
+
+#: ../ps/ps.map/main.c:247
+#, c-format
+msgid ""
+"Using <%s> from the command line is depreciated. Please use the <%s> mapping "
+"instruction instead. The parameter <%s> will be removed in future versions "
+"of GRASS."
+msgstr ""
+
+#: ../ps/ps.map/main.c:255 ../ps/ps.map/main.c:559
+msgid "illegal scale request"
+msgstr ""
+
+#: ../ps/ps.map/main.c:261
+msgid "illegal copies request"
+msgstr ""
+
+#: ../ps/ps.map/main.c:273
+#, c-format
+msgid ""
+"ERROR: Required parameter <%s> not set:\n"
+"\t(%s)\n"
+msgstr ""
+
+#: ../ps/ps.map/main.c:288
+msgid "Current region cannot be set."
+msgstr ""
+
+#: ../ps/ps.map/main.c:297
+msgid "Data exists after final 'end' instruction!"
+msgstr ""
+
+#: ../ps/ps.map/main.c:330
+msgid ""
+"GRASS environment variable GRASS_VERBOSE is overwritten by VERBOSE mapping "
+"instruction. This mapping instruction is superseded and will be removed in "
+"future versions of GRASS. Please use --verbose instead."
+msgstr ""
+
+#: ../ps/ps.map/main.c:337
+msgid "Cannot set GRASS_VERBOSE variable."
+msgstr ""
+
+#: ../ps/ps.map/main.c:394
+msgid "no raster map selected yet"
+msgstr ""
+
+#: ../ps/ps.map/main.c:410
+msgid "illegal value list"
+msgstr ""
+
+#: ../ps/ps.map/main.c:738
+#, c-format
+msgid "PostScript file '%s' successfully written."
+msgstr ""
+
+#: ../ps/ps.map/do_plt.c:41
+msgid "Reading point/line file ..."
+msgstr ""
+
+#: ../ps/ps.map/do_plt.c:147 ../ps/ps.map/ps_vpoints.c:87
+msgid "Cannot read symbol, using default icon"
+msgstr ""
+
+#: ../ps/ps.map/ps_clrtbl.c:35 ../ps/ps.map/ps_fclrtbl.c:46
+#, c-format
+msgid "Creating color table for <%s in %s>..."
+msgstr ""
+
+#: ../ps/ps.map/ps_clrtbl.c:44 ../ps/ps.map/ps_fclrtbl.c:69
+msgid "Unable to read colors for colorbar"
+msgstr ""
+
+#: ../ps/ps.map/ps_clrtbl.c:54
+msgid ""
+"Your cats/ file is invalid. A cats/ file with categories and labels is "
+"required for 'colortable' when using categorical legends; see the r.category "
+"help page. Colortable creation has been skipped."
+msgstr ""
+
+#: ../ps/ps.map/ps_clrtbl.c:69 ../ps/ps.map/ps_fclrtbl.c:92
+#: ../ps/ps.map/ps_fclrtbl.c:97
+msgid "Colorbar y location beyond page margins. Adjusting."
+msgstr ""
+
+#: ../ps/ps.map/ps_clrtbl.c:75 ../ps/ps.map/ps_fclrtbl.c:103
+#: ../ps/ps.map/ps_fclrtbl.c:108
+msgid "Colorbar x location beyond page margins. Adjusting."
+msgstr ""
+
+#: ../ps/ps.map/r_vpoints.c:244
+#, c-format
+msgid ""
+"The mapping instruction <%s> will be renamed to <%s> in future versions of "
+"GRASS. Please use <%s> instead."
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:77
+msgid "illegal height request"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:94
+msgid "illegal range request"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:110
+msgid "illegal columns request"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:129
+msgid "Unsupported color request (colortable)"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:131
+msgid "illegal color request (colortable)"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:158
+msgid "illegal colortable sub-request"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:169
+msgid "No raster selected for colortable!"
+msgstr ""
+
+#: ../ps/ps.map/ps_vpoints.c:181
+#, c-format
+msgid "Attribute is of invalid size [%.3f] for category [%d]"
+msgstr ""
+
+#: ../ps/ps.map/getgrid.c:95 ../ps/ps.map/getgrid.c:206
+msgid "illegal numbers request"
+msgstr ""
+
+#: ../ps/ps.map/getgrid.c:126 ../ps/ps.map/getgrid.c:234
+msgid "illegal grid width request"
+msgstr ""
+
+#: ../ps/ps.map/getgrid.c:132
+msgid "illegal request (grid)"
+msgstr ""
+
+#: ../ps/ps.map/getgrid.c:240
+msgid "illegal request (geogrid)"
+msgstr ""
+
+#: ../ps/ps.map/ps_raster.c:43
+msgid "Can't create temporary PostScript mask file."
+msgstr ""
+
+#: ../ps/ps.map/ps_raster.c:103
+#, c-format
+msgid "Reading raster map <%s in %s> ..."
+msgstr ""
+
+#: ../ps/ps.map/ps_raster.c:106
+#, c-format
+msgid "Reading raster maps in group <%s> ..."
+msgstr ""
+
+#: ../ps/ps.map/r_group.c:31
+msgid "Can't get group information"
+msgstr ""
+
+#: ../ps/ps.map/r_plt.c:158
+msgid "Can't open eps file"
+msgstr ""
+
+#: ../ps/ps.map/do_vectors.c:34
+#, c-format
+msgid "Reading vector map <%s in %s> ..."
+msgstr ""
+
+#: ../ps/ps.map/do_vectors.c:139
+#, c-format
+msgid "Reading vector points file <%s in %s> ..."
+msgstr ""
+
+#: ../ps/ps.map/do_masking.c:23
+msgid "Can't open temporary PostScript mask file."
+msgstr ""
+
+#: ../ps/ps.map/ps_fclrtbl.c:51
+msgid "Range information not available (run r.support)"
+msgstr ""
+
+#: ../ps/ps.map/ps_fclrtbl.c:64
+msgid "A floating point colortable must contain a range of values"
+msgstr ""
+
+#: ../ps/ps.map/map_setup.c:88
+#, c-format
+msgid "Scale set to %s."
+msgstr ""
+
+#: ../ps/ps.map/read_cfg.c:64
+#, c-format
+msgid "Paper '%s' not found, using defaults"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/curses.c:22
+#: ../imagery/i.class/curses.c:22
+#, c-format
+msgid "make_window(%d,%d,%d,%d): illegal screen values."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/curses.c:148
+#: ../imagery/i.class/curses.c:153
+#, c-format
+msgid "%s"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:53
+#: ../imagery/i.ortho.photo/menu/menu.c:43
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:62
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:86
+#: ../imagery/i.ortho.photo/i.photo.target/main.c:46
+#: ../imagery/i.ortho.photo/i.photo.init/main.c:44
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:55
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:54
+msgid "imagery, orthorectify"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:54
+msgid "Creates control points on an image to be ortho-rectified."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:62
+#: ../imagery/i.group/main.c:58
+msgid "Name of imagery group"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:66
+msgid "Name of image to be rectified which will be initially drawn on screen"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:72
+msgid ""
+"Name of a map from target mapset which will be initially drawn on screen"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:102
+#: ../imagery/i.ortho.photo/i.photo.init/main.c:64
+#, c-format
+msgid "Group [%s] not found"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:114
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:98
+#, c-format
+msgid "No camera reference file selected for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:118
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:102
+#, c-format
+msgid "Bad format in camera file for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:125
+#, c-format
+msgid "No initial camera exposure station for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:129
+#, c-format
+msgid "Bad format in initial camera exposure station for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:143
+#, c-format
+msgid "No photo points for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:145
+#, c-format
+msgid "Poorly placed photo points for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:167
+msgid "Computing equations ..."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:202
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:233
+#, c-format
+msgid "Unable to read raster header of <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:302
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:195
+#: ../imagery/i.vpoints/main.c:254 ../imagery/i.points/main.c:248
+#, c-format
+msgid "ERROR: %s"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:304
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:197
+#: ../imagery/i.vpoints/main.c:256 ../imagery/i.points/main.c:250
+#, c-format
+msgid "WARNING: %s (click mouse to continue)"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:44
+#, c-format
+msgid "Could not read REF file for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:45
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:50
+#, c-format
+msgid "Orthorectification cancelled"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:49
+#, c-format
+msgid "No files in this group!"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:61
+msgid ""
+"\n"
+"Rectify all images in the group? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:71
+#, c-format
+msgid ""
+"\n"
+"Rectify image <%s>? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:84
+#, c-format
+msgid ""
+"\n"
+"No images selected, orthorectification cancelled."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:99
+msgid "Enter an extension to be appended to rectified maps:"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:109
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:278
+#: ../imagery/i.rectify/main.c:266
+#, c-format
+msgid "Extension <%s> is illegal"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:110
+msgid ""
+"\n"
+"Choose another extension? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:112
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:144
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:285
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:294
+#: ../imagery/i.rectify/main.c:273
+#, c-format
+msgid "Orthorectification cancelled."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:122
+msgid ""
+"\n"
+"Compute local camera angle? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:132
+msgid "Enter a name for the camera angle map:"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:141
+#, c-format
+msgid "Map name <%s> is illegal"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:142
+msgid ""
+"\n"
+"Choose another name? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:156
+msgid ""
+"\n"
+"Overwrite maps in target location/mapset? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:224
+#, c-format
+msgid "Please select one of the following interpolation methods\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:225
+#, c-format
+msgid " 1. nearest neighbor\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:226
+#, c-format
+msgid " 2. bilinear\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:227
+#, c-format
+msgid " 3. bicubic\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:228
+#, c-format
+msgid " 4. bilinear with fallback\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:229
+#, c-format
+msgid " 5. bicubic with fallback\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:291
+#, c-format
+msgid "Enter amount of memory to use in MB, or\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:293
+#, c-format
+msgid "RETURN   use %d MB to keep all data in RAM\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:295
+#, c-format
+msgid "RETURN   use %d MB\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/menu.c:44
+msgid "Menu driver for the photo imagery programs."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/menu.c:48
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:68
+#: ../imagery/i.ortho.photo/i.photo.target/main.c:52
+#: ../imagery/i.ortho.photo/i.photo.init/main.c:52
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:61
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:60
+msgid "Name of imagery group for ortho-rectification"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/menu.c:62
+#, c-format
+msgid "Pre-selected group <%s> not found"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/menu.c:68
+msgid "Enter imagery group for ortho-rectification"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/menu.c:74
+#, c-format
+msgid "Group [%s] contains no files"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:64
+msgid "Interactively select or modify the target elevation model."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:91
+#, c-format
+msgid "Target information for group [%s] missing\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:98
+#, c-format
+msgid "Target location [%s] not found\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:127
+#, c-format
+msgid "Mapset [%s] in target location [%s] - "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:128
+msgid "permission denied\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:128
+msgid "not found\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:131
+msgid "Please select a target for group"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:13
+#, c-format
+msgid ""
+"Control Z Point file for group [%s] in [%s] \n"
+" \n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:16
+msgid "Computing equations..."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:22
+msgid "Poorly placed Control Points!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:23
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:28
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:52
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:58
+msgid "Can not generate the transformation equation.\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:24
+msgid "Run OPTION 7 of i.ortho.photo again!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:27
+msgid "No active Control Points!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:29
+msgid "Run OPTION 7 of i.ortho.photo!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:45
+#, c-format
+msgid ""
+"Reference Point file for group [%s] in [%s] \n"
+" \n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:51
+msgid "Poorly placed Reference Points!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:53
+msgid "Run OPTION 5 of i.ortho.photo again!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:57
+msgid "No active Reference Points!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:59
+msgid "Run OPTION 5 of i.ortho.photo!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/report.c:10
+#: ../imagery/i.rectify/report.c:10
+msgid "complete"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/report.c:20
+#: ../imagery/i.rectify/report.c:20
+#, c-format
+msgid "%d rows, %d cols (%ld cells) completed in"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/report.c:23
+#: ../imagery/i.rectify/report.c:23
+#, c-format
+msgid "%d:%02d:%02ld hours"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/report.c:25
+#: ../imagery/i.rectify/report.c:25
+#, c-format
+msgid "%d:%02ld minutes"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/report.c:27
+#: ../imagery/i.rectify/report.c:27
+#, c-format
+msgid "%.1f cells per minute"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/rectify.c:46
+#: ../imagery/i.rectify/rectify.c:43
+#, c-format
+msgid "Rectify <%s@%s> (location <%s>)"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/rectify.c:50
+#: ../imagery/i.rectify/rectify.c:47
+#, c-format
+msgid "into  <%s@%s> (location <%s>) ..."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/rectify.c:84
+#, c-format
+msgid "No elevation available at row = %d, col = %d"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/rectify.c:131
+#: ../imagery/i.rectify/rectify.c:109
+#, c-format
+msgid "Raster map <%s@%s>: projection don't match current settings"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/rectify.c:137
+#: ../imagery/i.rectify/rectify.c:115
+#, c-format
+msgid "Raster map <%s@%s>: zone don't match current settings"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:88
+msgid ""
+"Orthorectifies an image by using the image to photo coordinate "
+"transformation matrix."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:100
+#: ../imagery/i.rectify/main.c:106
+msgid "Output raster map(s) suffix"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:106
+#: ../imagery/i.rectify/main.c:118
+msgid "Target resolution (ignored if -c flag used)"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:114
+#: ../imagery/i.rectify/main.c:126
+msgid "Amount of memory to use in MB"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:129
+msgid "Raster map with camera angle relative to ground surface"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:134
+#: ../imagery/i.rectify/main.c:141
+msgid ""
+"Use current region settings in target location (def.=calculate smallest area)"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:138
+#: ../imagery/i.rectify/main.c:145
+msgid "Rectify all raster maps in group"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:177
+#, c-format
+msgid "Group <%s> not found"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:181
+#, c-format
+msgid "Could not read REF file for group <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:184
+#: ../imagery/i.rectify/main.c:191
+#, c-format
+msgid "Group <%s> contains no raster maps; run i.group"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:238
+#, c-format
+msgid "No camera reference file selected for group <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:242
+#, c-format
+msgid "Bad format in camera file for group <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:248
+#, c-format
+msgid "Bad format in initial exposure station file for group <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:281
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:290
+#: ../imagery/i.rectify/main.c:269
+msgid "The following raster map already exists in"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:282
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:291
+#: ../imagery/i.rectify/main.c:270
+#, c-format
+msgid "target LOCATION %s, MAPSET %s:"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:309
+#: ../imagery/i.rectify/main.c:288
+msgid "Target resolution must be > 0, ignored"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:316
+#: ../imagery/i.rectify/main.c:306
+#, c-format
+msgid "Using region: N=%f S=%f, E=%f W=%f"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:324
+#, c-format
+msgid "No target elevation model selected for group <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:383
+#: ../imagery/i.rectify/main.c:321
+#, c-format
+msgid "Input raster map <%s> does not exist in group <%s>."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:385
+#: ../imagery/i.rectify/main.c:323
+msgid "Try:"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:390
+#: ../imagery/i.rectify/main.c:328
+msgid "Exit!"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/target.c:13
+#: ../imagery/i.rectify/target.c:14
+#, c-format
+msgid "Target information for group <%s> missing"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/target.c:19
+#: ../imagery/i.rectify/target.c:20
+#, c-format
+msgid "Target location <%s> not found"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/angle.c:36
+msgid "Calculating camera angle to local surface..."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/angle.c:51
+#: ../imagery/i.ortho.photo/i.photo.rectify/exec.c:43
+msgid "Could not open elevation raster"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:140
+msgid "Error reading segment file"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.target/main.c:48
+msgid "Interactively select or modify the imagery group target."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.target/main.c:66
+#, c-format
+msgid "Group [%s] targeted for location [%s], mapset [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.init/main.c:46
+msgid ""
+"Interactively creates or modifies entries in a camera initial exposure "
+"station file for imagery group referenced by a sub-block."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:57
+msgid ""
+"Interactively select and modify the imagery group camera reference file."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:68
+msgid "Name of camera reference file to use"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:84
+msgid "Enter a camera reference file to be used with this imagery group"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:101
+#, c-format
+msgid "Group [%s] in location [%s] mapset [%s] now has camera file [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:56
+msgid "Interactively mark fiducial or reseau points on an image."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:86
+#, c-format
+msgid "Image Group [%s] not found"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:74
+#, c-format
+msgid ""
+"Input raster map <%s> is not floating point (process DN using i.landsat.toar "
+"to radiance first)"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:106
+msgid "Performs Landsat TM/ETM+ Automatic Cloud Cover Assessment (ACCA)."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:107
+msgid "imagery, landsat, acca"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:111 ../imagery/i.landsat.toar/main.c:71
+msgid "Base name of input raster bands"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:112 ../imagery/i.landsat.toar/main.c:72
+msgid "Example: 'B.' for B.1, B.2, ..."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:122
+msgid "B56composite (step 6)"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:129
+msgid "B45ratio: Desert detection (step 10)"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:137
+msgid "Number of classes in the cloud temperature histogram"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:139 ../imagery/i.landsat.acca/main.c:154
+#: ../imagery/i.landsat.acca/main.c:160 ../imagery/i.landsat.acca/main.c:165
+msgid "Cloud settings"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:143
+msgid "Data is Landsat-5 TM"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:144
+msgid "I.e. Thermal band is '.6' not '.61')"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:149
+msgid "Apply post-processing filter to remove small holes"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:153
+msgid "Always use cloud signature (step 14)"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:159
+msgid ""
+"Bypass second-pass processing, and merge warm (not ambiguous) and cold clouds"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:164
+msgid "Include a category for cloud shadows"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/tools.c:142
+msgid "Filling small holes in clouds..."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:124
+msgid "Preliminary scene analysis:"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:125
+#, c-format
+msgid "* Desert index: %.2lf"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:126
+#, c-format
+msgid "* Snow cover: %.2lf %%"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:127
+#, c-format
+msgid "* Cloud cover: %.2lf %%"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:128
+msgid "* Temperature of clouds:"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:129
+#, c-format
+msgid "** Maximum: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:130
+#, c-format
+msgid "** Mean (%s cloud): %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:132
+#, c-format
+msgid "** Minimum: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:142
+msgid "Histogram cloud signature:"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:148
+#, c-format
+msgid "* Mean temperature: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:149
+#, c-format
+msgid "* Standard deviation: %.2lf"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:150
+#, c-format
+msgid "* Skewness: %.2lf"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:151
+#, c-format
+msgid "* Histogram classes: %d"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:163
+#, c-format
+msgid "* 98.75 percentile: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:164
+#, c-format
+msgid "* 97.50 percentile: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:165
+#, c-format
+msgid "* 83.50 percentile: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:186
+msgid "Maximum temperature:"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:187
+#, c-format
+msgid "* Cold cloud: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:188
+#, c-format
+msgid "* Warm cloud: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:193
+msgid "Result: Scene with clouds"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:200
+msgid "Result: Scene cloud free"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:238
+msgid "Processing first pass..."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:400
+msgid "Removing ambiguous pixels..."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:402
+msgid "Pass two processing..."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:448
+#, c-format
+msgid "Cannot write to raster map <%s>"
+msgstr ""
+
+#: ../imagery/i.vpoints/main.c:94 ../imagery/i.points/main.c:96
+msgid "imagery, geometry"
+msgstr ""
+
+#: ../imagery/i.vpoints/main.c:96
+msgid ""
+"Set registration points for an imagery group from a vector map or keyboard "
+"entry."
+msgstr ""
+
+#: ../imagery/i.vpoints/main.c:104 ../imagery/i.points/main.c:105
+msgid "Name of imagery group to be registered"
+msgstr ""
+
+#: ../imagery/i.vpoints/main.c:127 ../imagery/i.points/main.c:130
+#, c-format
+msgid "[%s] Only local groups may be used"
+msgstr ""
+
+#: ../imagery/i.vpoints/main.c:136 ../imagery/i.vpoints/main.c:140
+#: ../imagery/i.points/main.c:139 ../imagery/i.points/main.c:143
+#, c-format
+msgid "Group [%s] contains no maps, run i.group"
+msgstr ""
+
+#: ../imagery/i.cluster/print4.c:16
+#, c-format
+msgid "class centroids (sum/count=mean)\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print4.c:18
+#, c-format
+msgid "band %d"
+msgstr ""
+
+#: ../imagery/i.cluster/print3.c:16
+#, c-format
+msgid ""
+"\n"
+"initial means for each band\n"
+"\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print3.c:19
+#, c-format
+msgid "class %-3d "
+msgstr ""
+
+#: ../imagery/i.cluster/print2.c:18
+#, c-format
+msgid ""
+"\n"
+"class means/stddev for each band\n"
+"\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print2.c:22
+#, c-format
+msgid "class %d (%d)\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print2.c:23
+#, c-format
+msgid "  means "
+msgstr ""
+
+#: ../imagery/i.cluster/print2.c:28
+#, c-format
+msgid "  stddev"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:80
+msgid "imagery, classification, signatures"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:82
+msgid ""
+"Generates spectral signatures for land cover types in an image using a "
+"clustering algorithm."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:85
+msgid ""
+"The resulting signature file is used as input for i.maxlik, to generate an "
+"unsupervised image classification."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:97 ../imagery/i.gensigset/parse.c:21
+#: ../imagery/i.gensig/parse.c:22
+msgid "Name for output file containing result signatures"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:104
+msgid "Initial number of classes"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:112
+msgid "Name of file containing initial signatures"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:120
+msgid "Sampling intervals (by row and col); default: ~10,000 pixels"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:127
+msgid "Maximum number of iterations"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:136
+msgid "Percent convergence"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:144
+msgid "Cluster separation"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:152
+msgid "Minimum number of pixels in a class"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:159
+msgid "Name for output file containing final report"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:182
+#, c-format
+msgid "Illegal number of initial classes (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:193
+#, c-format
+msgid "Illegal value(s) of sample intervals (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:207
+#, c-format
+msgid "Illegal value of iterations (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:213
+#, c-format
+msgid "Illegal value of convergence (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:218
+#, c-format
+msgid "Illegal value of separation (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:223
+#, c-format
+msgid "Illegal value of min_size (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:234
+#, c-format
+msgid "Unable to create report file <%s>"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:242
+#, c-format
+msgid ""
+"#################### CLUSTER (%s) ####################\n"
+"\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:244
+#, c-format
+msgid "Location: %s\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:245
+#, c-format
+msgid "Mapset:   %s\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:246
+#, c-format
+msgid "Group:    %s\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:247
+#, c-format
+msgid "Subgroup: %s\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:249
+#, c-format
+msgid " %s\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:252
+#, c-format
+msgid "Result signature file: %s\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:254
+#, c-format
+msgid "Region\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:255
+#, c-format
+msgid "  North: %12.2f  East: %12.2f\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:257
+#, c-format
+msgid "  South: %12.2f  West: %12.2f\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:259
+#, c-format
+msgid "  Res:   %12.2f  Res:  %12.2f\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:261
+#, c-format
+msgid "  Rows:  %12d  Cols: %12d  Cells: %d\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:263
+#, c-format
+msgid "Mask: %s\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:265
+#, c-format
+msgid "Cluster parameters\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:266
+#, c-format
+msgid " Number of initial classes:    %d"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:268
+#, c-format
+msgid " [from signature file %s]"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:270
+#, c-format
+msgid " Minimum class size:           %d\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:271
+#, c-format
+msgid " Minimum class separation:     %f\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:272
+#, c-format
+msgid " Percent convergence:          %f\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:273
+#, c-format
+msgid " Maximum number of iterations: %d\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:275
+#, c-format
+msgid " Row sampling interval:        %d\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:276
+#, c-format
+msgid " Col sampling interval:        %d\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:285 ../imagery/i.gensigset/read_data.c:19
+#: ../imagery/i.ifft/ifftmain.c:144
+msgid "Reading raster maps..."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:297
+msgid "Out of Memory. Please run again and choose a smaller sample size."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:303
+#, c-format
+msgid "Sample size: %d points\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:306
+msgid ""
+"Not enough sample points. Please run again and choose a larger sample size."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:310
+msgid ""
+"Not enough non-zero sample data points. Check your current region (and mask)."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:323
+#, c-format
+msgid ""
+"\n"
+"########## final results #############\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:324
+#, c-format
+msgid "%d classes (convergence=%.1f%%)\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:335
+#, c-format
+msgid "Unable to create signature file <%s> for group <%s>, subsgroup <%s>"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:340
+#, c-format
+msgid ""
+"\n"
+"\n"
+"#################### CLASSES ####################\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:341
+#, c-format
+msgid ""
+"\n"
+"%d classes, %.2f%% points stable\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:343
+#, c-format
+msgid ""
+"\n"
+"######## CLUSTER END (%s) ########\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print5.c:15
+#, c-format
+msgid ""
+"\n"
+"class separability matrix\n"
+"\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print1.c:12
+#, c-format
+msgid ""
+"means and standard deviations for %d band%s\n"
+"\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print1.c:14
+#, c-format
+msgid " means  "
+msgstr ""
+
+#: ../imagery/i.cluster/print1.c:18
+#, c-format
+msgid " stddev "
+msgstr ""
+
+#: ../imagery/i.cluster/print6.c:11
+#, c-format
+msgid "class distribution"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:17 ../imagery/i.maxlik/open.c:16
+#: ../imagery/i.smap/shapiro/parse.c:58 ../imagery/i.gensigset/parse.c:45
+#: ../imagery/i.gensig/parse.c:39
+#, c-format
+msgid "Group <%s> not found in current mapset"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:21 ../imagery/i.maxlik/open.c:19
+#: ../imagery/i.smap/shapiro/parse.c:61 ../imagery/i.gensigset/parse.c:48
+#: ../imagery/i.gensig/parse.c:42
+#, c-format
+msgid "Subgroup <%s> in group <%s> not found"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:33
+#, c-format
+msgid "Raster map <%s> do not exists in subgroup <%s>"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:38
+msgid "No raster maps found"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:42
+#, c-format
+msgid "Subgroup <%s> doesn't have any raster maps"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:45
+#, c-format
+msgid "Subgroup <%s> only has 1 raster map"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:46
+msgid "Subgroup must have at least 2 raster maps"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:64
+#, c-format
+msgid "Unable to open seed signature file <%s>"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:70 ../imagery/i.maxlik/open.c:54
+#: ../imagery/i.smap/shapiro/read_sig.c:23
+#, c-format
+msgid "Unable to read signature file <%s>"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:74 ../imagery/i.maxlik/open.c:58
+#, c-format
+msgid "<%s> has too many signatures (limit is 255)"
+msgstr ""
+
+#: ../imagery/i.cluster/checkpt.c:16
+#, c-format
+msgid "using seed means (%d files)\n"
+msgstr ""
+
+#: ../imagery/i.cluster/checkpt.c:28
+#, c-format
+msgid ""
+"\n"
+"######## iteration %d ###########\n"
+msgstr ""
+
+#: ../imagery/i.cluster/checkpt.c:30
+#, c-format
+msgid "%d classes, %.2f%% points stable\n"
+msgstr ""
+
+#: ../imagery/i.cluster/checkpt.c:40
+#, c-format
+msgid "Iteration %.2d: convergence %.2f%% (%s elapsed, %s left)"
+msgstr ""
+
+#: ../imagery/i.class/analyze_sig.c:12
+msgid "Cannot analyze until region is completed."
+msgstr ""
+
+#: ../imagery/i.class/readbands.c:12
+msgid "Error reading raster map in function readbands."
+msgstr ""
+
+#: ../imagery/i.class/draw_reg.c:89
+#, c-format
+msgid ""
+"\n"
+"Orig:(x1 y1), (x2 y2) = (%d %d), (%d %d)"
+msgstr ""
+
+#: ../imagery/i.class/draw_reg.c:97
+#, c-format
+msgid ""
+"\n"
+"New:(x1 y1), (x2 y2) = (%d %d), (%d %d)"
+msgstr ""
+
+#: ../imagery/i.class/save_reg.c:14
+msgid "Region is not complete, can not save."
+msgstr ""
+
+#: ../imagery/i.class/main.c:53
+msgid "imagery, classification"
+msgstr ""
+
+#: ../imagery/i.class/main.c:55
+msgid ""
+"Generates spectral signatures for an image by allowing the user to outline "
+"regions of interest."
+msgstr ""
+
+#: ../imagery/i.class/main.c:58
+msgid ""
+"The resulting signature file can be used as input for i.maxlik or as a seed "
+"signature file for i.cluster."
+msgstr ""
+
+#: ../imagery/i.class/main.c:72 ../imagery/i.cca/main.c:93
+msgid "Name of input imagery subgroup"
+msgstr ""
+
+#: ../imagery/i.class/main.c:77
+msgid "File to contain result signatures"
+msgstr ""
+
+#: ../imagery/i.class/main.c:82
+msgid "File containing input signatures (seed)"
+msgstr ""
+
+#: ../imagery/i.class/main.c:94
+msgid "You have a mask set. Unset mask and run again"
+msgstr ""
+
+#: ../imagery/i.class/main.c:103 ../imagery/i.group/main.c:110
+#: ../imagery/i.target/main.c:79
+msgid "Group must exist in the current mapset"
+msgstr ""
+
+#: ../imagery/i.class/main.c:213
+#, c-format
+msgid "** The following raster maps in subgroup [%s] do not exist:"
+msgstr ""
+
+#: ../imagery/i.class/main.c:222
+#, c-format
+msgid "Subgroup [%s] does not have any files"
+msgstr ""
+
+#: ../imagery/i.class/main.c:223 ../imagery/i.class/main.c:227
+msgid "The subgroup must have at least 2 files to run"
+msgstr ""
+
+#: ../imagery/i.class/main.c:226
+#, c-format
+msgid "Subgroup [%s] only has 1 file"
+msgstr ""
+
+#: ../imagery/i.class/main.c:232
+msgid "Unable to read cell header for first band file"
+msgstr ""
+
+#: ../imagery/i.class/main.c:237
+msgid ""
+"\n"
+"RESULT SIGNATURE"
+msgstr ""
+
+#: ../imagery/i.class/main.c:242
+#, c-format
+msgid "Unable to open output signature file '%s'"
+msgstr ""
+
+#: ../imagery/i.class/main.c:249
+msgid ""
+"\n"
+"SEED SIGNATURES"
+msgstr ""
+
+#: ../imagery/i.class/main.c:254
+#, c-format
+msgid "Unable to read signature file [%s]"
+msgstr ""
+
+#: ../imagery/i.class/main.c:257
+#, c-format
+msgid "** Unable to read signature file [%s] **"
+msgstr ""
+
+#: ../imagery/i.class/main.c:264
+#, c-format
+msgid "%s has too many signatures"
+msgstr ""
+
+#: ../imagery/i.class/add_point.c:22
+#, c-format
+msgid "Can't mark another point.  Only %d points allowed.  Sorry."
+msgstr ""
+
+#: ../imagery/i.class/remove_mask.c:15
+msgid "Error while removing the old MASK cell map."
+msgstr ""
+
+#: ../imagery/i.class/band_files.c:22
+msgid "Unable to open band files."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:50 ../imagery/i.class/signature.c:55
+msgid "Unable to allocate space for signature statistics."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:82
+msgid "prepare_signature: outline has odd number of points."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:113
+#, c-format
+msgid "prepare_signature: scan line %d has odd number of points."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:123
+msgid "signature: perimeter points out of order."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:132
+msgid "prepare_signature: data error."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:234
+msgid "Unknown Menu selection in show_signature()."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:276
+msgid "Unable to open the cell map MASK."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:278
+msgid "Unable to allocate the cell buffer in display_signature()."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:310
+msgid "Did not find input cell map MASK."
+msgstr ""
+
+#: ../imagery/i.class/complete_reg.c:12
+msgid "Too few points for region.  Must have at least 3 points."
+msgstr ""
+
+#: ../imagery/i.class/complete_reg.c:14
+msgid "Area already completed."
+msgstr ""
+
+#: ../imagery/i.class/erase_reg.c:10
+msgid "Can not erase an undefined region."
+msgstr ""
+
+#: ../imagery/i.class/outline.c:57
+msgid "Absurd polygon."
+msgstr ""
+
+#: ../imagery/i.class/outline.c:99
+msgid "Outlined area is too large."
+msgstr ""
+
+#: ../imagery/i.class/restore_reg.c:15
+msgid "No region is saved, can not restore."
+msgstr ""
+
+#: ../imagery/i.class/redisplay.c:56
+msgid "No zoom window is defined."
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:90
+msgid "QC, Quality Control, surface reflectance, Modis"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:92
+msgid "Extracts quality control parameters from Modis QC layers."
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:98
+msgid "Name of input surface reflectance QC layer [bit array]"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:103
+msgid "Name for output QC type classification layer"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:109
+msgid "Name of MODIS product type"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:110
+msgid ""
+"mod09Q1;surf. refl. 250m 8-days;mod09A1;surf. refl. 500m 8-days;mod09A1s;"
+"surf. refl. 500m 8-days, State QA;mod11A1;LST 1Km daily (Day/Night);mod11A2;"
+"LST 1Km 8-days (Day/Night);"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:122
+msgid "Name of QC type to extract"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:123
+msgid ""
+"adjcorr;mod09: Adjacency Correction;atcorr;mod09: Atmospheric Correction;"
+"cloud;mod09: Cloud State;data_quality;mod09: Band-Wise Data Quality Flag;"
+"diff_orbit_from_500m;mod09: 250m Band is at Different Orbit than 500m;"
+"modland_qa_bits;mod09: MODIS Land General Quality Assessment;"
+"mandatory_qa_11A1;mod11A1: MODIS Land General Quality Assessment;"
+"data_quality_flag_11A1;mod11A1: Detailed Quality Indications;emis_error_11A1;"
+"mod11A1: Average Emissivity Error Classes;lst_error_11A1;mod11A1: Average "
+"LST Error Classes;data_quality_flag_11A2;mod11A2: Detailed Quality "
+"Indications;emis_error_11A2;mod11A2: Average Emissivity Error Classes;"
+"mandatory_qa_11A2;mod11A2: MODIS Land General Quality Assessment;"
+"lst_error_11A2;mod11A2: Average LST Error Classes;aerosol_quantity;mod09A1s: "
+"StateQA Internal Snow Mask;brdf_correction_performed;mod09A1s: StateQA "
+"Internal Snow Mask;cirrus_detected;mod09A1s: StateQA Internal Snow Mask;"
+"cloud_shadow;mod09A1s: StateQA Internal Snow Mask;cloud_state;mod09A1s: "
+"StateQA Internal Snow Mask;internal_clou_algorithm;mod09A1s: StateQA "
+"Internal Snow Mask;internal_fire_algorithm;mod09A1s: StateQA Internal Snow "
+"Mask;internal_snow_mask;mod09A1s: StateQA Internal Snow Mask;land_water;"
+"mod09A1s: StateQA Internal Snow Mask;mod35_snow_ice;mod09A1s: StateQA "
+"Internal Snow Mask;pixel_adjacent_to_cloud;mod09A1s: StateQA Internal Snow "
+"Mask;"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:157
+msgid "Band number of Modis product (mod09Q1=[1,2],mod09A1=[1-7])"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:158
+msgid ""
+"1;mod09Q1/A1 Band 1: Red;2;mod09Q1/A1 Band 2: NIR;3;mod09A1 Band 3: Blue;4;"
+"mod09A1 Band 4: Green;5;mod09A1 Band 5: SWIR 1;6;mod09A1 Band 6: SWIR 2;7;"
+"mod09A1 Band 7: SWIR 3;"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:181
+msgid "This flag is only available for MOD09Q1 @ 250m products"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:185
+msgid "Band number out of allowed range [1-7]"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:187
+msgid "mod09Q1 product only has 2 bands"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:194
+msgid "This flag is only available for MOD11A1 @ 1Km products"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:200
+msgid "This flag is only available for MOD11A2 @ 1Km products"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:213
+msgid "This flag is only available for MOD09A1s @ 500m products"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:354
+msgid "Unknown flag name, please check spelling"
+msgstr ""
+
+#: ../imagery/i.ask/popup.c:239
+#, c-format
+msgid "name=%s\n"
+msgstr ""
+
+#: ../imagery/i.ask/popup.c:240
+#, c-format
+msgid "mapset=%s\n"
+msgstr ""
+
+#: ../imagery/i.ask/popup.c:241
+#, c-format
+msgid "fullname=%s\n"
+msgstr ""
+
+#: ../imagery/i.ask/main.c:26
+#, c-format
+msgid "usage: %s file [prompt %%x %%y]\n"
+msgstr ""
+
+#: ../imagery/i.maxlik/invert.c:28
+#, c-format
+msgid "Signature %d is not valid (ill-conditioned) - ignored"
+msgstr ""
+
+#: ../imagery/i.maxlik/invert.c:31
+#, c-format
+msgid "Signature %d is not valid (singular) - ignored"
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:63
+msgid "imagery, classification, MLC"
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:65
+msgid "Classifies the cell spectral reflectances in imagery data."
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:67
+msgid ""
+"Classification is based on the spectral signature information generated by "
+"either i.cluster, i.class, or i.gensig."
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:79 ../imagery/i.smap/shapiro/parse.c:21
+msgid "Name of file containing signatures"
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:80
+msgid "Generated by either i.cluster, i.class, or i.gensig"
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:85
+msgid "Name for raster map holding classification results"
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:91
+msgid "Name for raster map holding reject threshold results"
+msgstr ""
+
+#: ../imagery/i.maxlik/open.c:26
+#, c-format
+msgid ""
+"Subgroup <%s> of group <%s> doesn't have any raster maps. The subgroup must "
+"have at least 2 raster maps."
+msgstr ""
+
+#: ../imagery/i.maxlik/open.c:29
+#, c-format
+msgid ""
+"Subgroup <%s> of group <%s> only has 1 raster map. The subgroup must have at "
+"least 2 raster maps."
+msgstr ""
+
+#: ../imagery/i.maxlik/open.c:48
+#, c-format
+msgid "Unable to open signature file <%s>"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:45 ../imagery/i.rgb.his/r2hmain.c:45
+msgid "imagery, color transformation, RGB, HIS"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:47
+msgid ""
+"Transforms raster maps from HIS (Hue-Intensity-Saturation) color space to "
+"RGB (Red-Green-Blue) color space."
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:53
+msgid "Name of input raster map (hue)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:57
+msgid "Name of input raster map (intensity)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:61
+msgid "Name of input raster map (saturation)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:65
+msgid "Name for output raster map (red)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:69
+msgid "Name for output raster map (green)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:73
+msgid "Name for output raster map (blue)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:95 ../imagery/i.rgb.his/r2hmain.c:93
+#, c-format
+msgid "Unable to read raster map row %ld"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:104 ../imagery/i.rgb.his/r2hmain.c:102
+#, c-format
+msgid "Failed writing raster map row %ld"
+msgstr ""
+
+#: ../imagery/i.his.rgb/openfiles.c:23 ../imagery/i.his.rgb/openfiles.c:25
+#: ../imagery/i.his.rgb/openfiles.c:27 ../imagery/i.rgb.his/openfiles.c:37
+#: ../imagery/i.rgb.his/openfiles.c:39 ../imagery/i.rgb.his/openfiles.c:41
+msgid "Unable to allocate the input row buffer"
+msgstr ""
+
+#: ../imagery/i.smap/bouman/interp.c:38
+msgid "pyramid constructed."
+msgstr ""
+
+#: ../imagery/i.smap/bouman/interp.c:237
+msgid "Invalid parameter values"
+msgstr ""
+
+#: ../imagery/i.smap/bouman/segment.c:70
+msgid "Number of classes must be < 256"
+msgstr ""
+
+#: ../imagery/i.smap/bouman/segment.c:95
+#, c-format
+msgid "Processing rows %d-%d (of %d)..."
+msgstr ""
+
+#: ../imagery/i.smap/bouman/model.c:39
+#, c-format
+msgid "Nonsymetric covariance for class %d subclass %d"
+msgstr ""
+
+#: ../imagery/i.smap/bouman/model.c:49
+#, c-format
+msgid "Nonpositive eigenvalues for class %d subclass %d"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/main.c:38 ../imagery/i.gensigset/main.c:40
+msgid "imagery, classification, supervised, SMAP"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/main.c:40
+msgid ""
+"Performs contextual image classification using sequential maximum a "
+"posteriori (SMAP) estimation."
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/openfiles.c:15
+#: ../imagery/i.smap/shapiro/read_sig.c:13
+#: ../imagery/i.gensigset/openfiles.c:15 ../imagery/i.gensig/openfiles.c:16
+#, c-format
+msgid "Unable to read REF file for subgroup <%s> in group <%s>"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/openfiles.c:19
+#: ../imagery/i.smap/shapiro/read_sig.c:17
+#, c-format
+msgid "Subgroup <%s> in group <%s> contains no raster maps"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/parse.c:22
+msgid "Generated by i.gensigset"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/parse.c:31
+msgid "Size of submatrix to process at one time"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/parse.c:39
+msgid "Use maximum likelihood estimation (instead of smap)"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/read_sig.c:27
+#, c-format
+msgid "Signature file <%s> is invalid"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/read_sig.c:30
+#, c-format
+msgid "Signature file <%s> is empty"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:75
+#, c-format
+msgid "Not enough pixels in class %d"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:85
+#, c-format
+msgid "Too many subclasses for class index %d"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:87
+#, c-format
+msgid "Number of subclasses set to %d"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:102
+#, c-format
+msgid "Combining subclasses (%d,%d)..."
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:312
+#, c-format
+msgid "Subsignature %d only contains %f pixels"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:547
+msgid "Unreliable clustering. Try a smaller initial number of clusters"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:556
+#, c-format
+msgid "Removed a singular subsignature number %d (%d remain)"
+msgstr ""
+
+#: ../imagery/i.gensigset/get_train.c:32 ../imagery/i.gensig/get_train.c:28
+msgid "Finding training classes..."
+msgstr ""
+
+#: ../imagery/i.gensigset/get_train.c:57 ../imagery/i.gensig/get_train.c:53
+#, c-format
+msgid "Training class %d only has one cell - this class will be ignored"
+msgstr ""
+
+#: ../imagery/i.gensigset/get_train.c:62 ../imagery/i.gensig/get_train.c:58
+msgid "Training map has no classes"
+msgstr ""
+
+#: ../imagery/i.gensigset/get_train.c:78 ../imagery/i.gensig/get_train.c:73
+msgid "1 class found"
+msgstr ""
+
+#: ../imagery/i.gensigset/get_train.c:80 ../imagery/i.gensig/get_train.c:75
+#, c-format
+msgid "%d classes found"
+msgstr ""
+
+#: ../imagery/i.gensigset/main.c:42
+msgid "Generates statistics for i.smap from raster map."
+msgstr ""
+
+#: ../imagery/i.gensigset/main.c:52
+#, c-format
+msgid "Clustering class %d (%d pixels)..."
+msgstr ""
+
+#: ../imagery/i.gensigset/main.c:55
+#, c-format
+msgid "Number of subclasses is %d"
+msgstr ""
+
+#: ../imagery/i.gensigset/openfiles.c:19 ../imagery/i.gensig/openfiles.c:20
+#, c-format
+msgid "Subgroup <%s> in group <%s> contains no raster maps."
+msgstr ""
+
+#: ../imagery/i.gensigset/write_sig.c:13 ../imagery/i.gensig/write_sig.c:15
+#, c-format
+msgid "Unable to create signature file <%s>"
+msgstr ""
+
+#: ../imagery/i.gensigset/write_sig.c:16 ../imagery/i.gensig/write_sig.c:18
+msgid "Writing signatures..."
+msgstr ""
+
+#: ../imagery/i.gensigset/parse.c:13 ../imagery/i.gensig/parse.c:14
+msgid "Ground truth training map"
+msgstr ""
+
+#: ../imagery/i.gensigset/parse.c:27
+msgid "Maximum number of sub-signatures in any class"
+msgstr ""
+
+#: ../imagery/i.gensigset/parse.c:52
+#, c-format
+msgid "Illegal number of sub-signatures (%s)"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:57
+msgid "imagery, edges"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:59
+msgid "Zero-crossing \"edge detection\" raster function for image processing."
+msgstr ""
+
+#: ../imagery/i.zc/main.c:78
+msgid "Zero crossing raster map"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:86
+msgid "x-y extent of the Gaussian filter"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:94
+msgid "Sensitivity of Gaussian filter"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:102
+msgid "Number of azimuth directions categorized"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:123
+msgid "Threshold less than or equal to zero not allowed"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:129
+msgid "Width less than or equal to zero not allowed"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:133
+msgid "Fewer than 1 orientation classes not allowed"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:147
+#, c-format
+msgid "Power 2 values : %d rows %d columns"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:157
+msgid "Initializing data..."
+msgstr ""
+
+#: ../imagery/i.zc/main.c:170 ../imagery/i.fft/fftmain.c:170
+msgid "Error while reading input raster map."
+msgstr ""
+
+#: ../imagery/i.zc/main.c:188
+msgid "Writing transformed data to file..."
+msgstr ""
+
+#: ../imagery/i.zc/main.c:209
+msgid "Transform successful"
+msgstr ""
+
+#: ../imagery/i.points/main.c:98
+msgid "Mark ground control points on image to be rectified."
+msgstr ""
+
+#: ../imagery/i.group/main.c:52 ../imagery/i.target/main.c:45
+msgid "imagery, map management"
+msgstr ""
+
+#: ../imagery/i.group/main.c:54
+msgid "Creates, edits, and lists groups and subgroups of imagery files."
+msgstr ""
+
+#: ../imagery/i.group/main.c:64
+msgid "Name of imagery sub-group"
+msgstr ""
+
+#: ../imagery/i.group/main.c:68
+msgid "Name of raster map(s) to include in group"
+msgstr ""
+
+#: ../imagery/i.group/main.c:72
+msgid "Remove selected files from specified group"
+msgstr ""
+
+#: ../imagery/i.group/main.c:76
+msgid "List files from specified (sub)group (fancy)"
+msgstr ""
+
+#: ../imagery/i.group/main.c:82
+msgid "List files from specified (sub)group (shell script style)"
+msgstr ""
+
+#: ../imagery/i.group/main.c:120 ../imagery/i.group/main.c:141
+msgid "Specified group does not exist in current mapset"
+msgstr ""
+
+#: ../imagery/i.group/main.c:124
+#, c-format
+msgid "Removing raster maps from subgroup <%s>..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:129
+#, c-format
+msgid "Removing raster maps from group <%s>..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:164
+#, c-format
+msgid "Group <%s> does not yet exist. Creating..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:168 ../imagery/i.group/main.c:177
+#, c-format
+msgid "Adding raster maps to group <%s>..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:172
+#, c-format
+msgid "Adding raster maps to subgroup <%s>..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:203
+#, c-format
+msgid "Adding raster map <%s> to group"
+msgstr ""
+
+#: ../imagery/i.group/main.c:209
+#, c-format
+msgid "Raster map <%s> exists in group. Skipping..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:243
+#, c-format
+msgid "Adding raster map <%s> to subgroup"
+msgstr ""
+
+#: ../imagery/i.group/main.c:249
+#, c-format
+msgid "Raster map <%s> exists in subgroup. Skipping..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:298
+#, c-format
+msgid "Removing raster map <%s> from group"
+msgstr ""
+
+#: ../imagery/i.group/main.c:315 ../imagery/i.group/main.c:374
+msgid "No raster map removed"
+msgstr ""
+
+#: ../imagery/i.group/main.c:357
+#, c-format
+msgid "Removing raster map <%s> from subgroup"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:74 ../imagery/i.ifft/ifftmain.c:68
+msgid "imagery, FFT"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:76
+msgid "Fast Fourier Transform (FFT) for image processing."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:84
+msgid "Name for output real part arrays stored as raster map"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:88
+msgid "Name for output imaginary part arrays stored as raster map"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:96
+msgid "Range of values in output display files"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:115
+msgid "Raster MASK found, consider to remove (see man-page). Will continue..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:129
+msgid "Range less than or equal to zero not allowed"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:166
+#, c-format
+msgid "Reading the raster map <%s>..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:182
+msgid "Starting FFT..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:201 ../imagery/i.ifft/ifftmain.c:172
+msgid "Rotating data..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:225
+msgid "Writing transformed data..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:231
+msgid "Writing viewable versions of transformed data..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:274
+msgid " "
+msgstr ""
+
+#: ../imagery/i.fft/save_fft.c:17 ../imagery/i.fft/save_fft.c:22
+msgid "Unable to open file in the 'cell_misc' directory"
+msgstr ""
+
+#: ../imagery/i.gensig/covariance.c:26
+msgid "Calculating class covariance matrices..."
+msgstr ""
+
+#: ../imagery/i.gensig/main.c:39
+msgid "imagery, classification, supervised, MLC"
+msgstr ""
+
+#: ../imagery/i.gensig/main.c:41
+msgid "Generates statistics for i.maxlik from raster map."
+msgstr ""
+
+#: ../imagery/i.gensig/check.c:21
+#, c-format
+msgid "Signature %d not invertible"
+msgstr ""
+
+#: ../imagery/i.gensig/check.c:27
+#, c-format
+msgid "Signature %d unable to get eigen values"
+msgstr ""
+
+#: ../imagery/i.gensig/check.c:33
+#, c-format
+msgid "Signature %d not positive definite"
+msgstr ""
+
+#: ../imagery/i.gensig/means.c:24
+msgid "Calculating class means..."
+msgstr ""
+
+#: ../imagery/i.find/main.c:63
+#, c-format
+msgid "usage: %s location mapset element file."
+msgstr ""
+
+#: ../imagery/i.find/main.c:83
+msgid "Unable to open temp file."
+msgstr ""
+
+#: ../imagery/i.pca/main.c:66
+msgid "imagery, image transformation, PCA"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:67
+msgid "Principal components analysis (PCA) for image processing."
+msgstr ""
+
+#: ../imagery/i.pca/main.c:72
+msgid "Name of two or more input raster maps"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:75
+msgid "Base name for output raster maps"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:77
+msgid "A numerical suffix will be added for each component map"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:90
+msgid "Rescaling range for output maps"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:92
+msgid "For no rescaling use 0,0"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:93
+msgid "Rescale"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:97
+msgid "Normalize (center and scale) input maps"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:107
+msgid "Sorry, at least 2 input bands must be provided"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:218
+msgid "Scale range length should be > 0. Using default values: 0,255."
+msgstr ""
+
+#: ../imagery/i.pca/main.c:264
+msgid "Computing covariance matrix..."
+msgstr ""
+
+#: ../imagery/i.pca/main.c:373
+#, c-format
+msgid "Rescaling to range %d,%d..."
+msgstr ""
+
+#: ../imagery/i.pca/main.c:381
+msgid "Calculating principal components..."
+msgstr ""
+
+#: ../imagery/i.pca/support.c:44
+msgid "Eigen values, (vectors), and [percent importance]:"
+msgstr ""
+
+#: ../imagery/i.rectify/get_wind.c:113
+#, c-format
+msgid "Region N=%f S=%f E=%f W=%f"
+msgstr ""
+
+#: ../imagery/i.rectify/get_wind.c:115
+#, c-format
+msgid "Resolution EW=%f NS=%f"
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:15
+#, c-format
+msgid "Control Point file for group <%s@%s> - "
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:21
+#, c-format
+msgid "Not enough active control points for current order, %d are required."
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:25
+msgid "Poorly placed control points."
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:26
+msgid " Can not generate the transformation equation."
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:29
+msgid "Not enough memory to solve for transformation equation"
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:32
+msgid "Invalid order"
+msgstr ""
+
+#: ../imagery/i.rectify/main.c:90
+msgid "imagery, rectify"
+msgstr ""
+
+#: ../imagery/i.rectify/main.c:92
+msgid ""
+"Rectifies an image by computing a coordinate transformation for each pixel "
+"in the image based on the control points."
+msgstr ""
+
+#: ../imagery/i.rectify/main.c:112
+msgid "Rectification polynom order (1-3)"
+msgstr ""
+
+#: ../imagery/i.rectify/main.c:183
+#, c-format
+msgid "Invalid order (%d); please enter 1 to %d"
+msgstr ""
+
+#: ../imagery/i.rectify/main.c:188
+#, c-format
+msgid "Group <%s> does not exist"
+msgstr ""
+
+#: ../imagery/i.rectify/target.c:35
+msgid "Please run i.target for group."
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:84
+msgid "Computes topographic correction of reflectance."
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:86
+msgid "imagery, terrain, topographic correction"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:94
+msgid "Name of reflectance raster maps to be corrected topographically"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:98
+msgid "Name (flag -i) or prefix for output raster maps"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:102
+msgid "Name of input base raster map (elevation or illumination)"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:108
+msgid "Solar zenith in degrees"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:114
+msgid "Solar azimuth in degrees (only if flag -i)"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:121
+msgid "Topographic correction method"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:126
+msgid "Output sun illumination terrain model"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:132
+msgid "Solar azimuth is necessary to calculate illumination terrain model"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:135
+msgid "Reflectance maps are necessary to make topographic correction"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:167
+msgid "Elevation raster map of unknown type"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:201
+msgid "Illumination model is of CELL type"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:208
+#, c-format
+msgid "Reflectance of raster map <%s> is not of DCELL type - ignored"
+msgstr ""
+
+#: ../imagery/i.topo.corr/correction.c:100
+#, c-format
+msgid "Minnaert constant = %lf"
+msgstr ""
+
+#: ../imagery/i.topo.corr/correction.c:105
+#, c-format
+msgid "C-factor constant = %lf (a=%.4f; m=%.4f)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:47
+msgid ""
+"Transforms raster maps from RGB (Red-Green-Blue) color space to HIS (Hue-"
+"Intensity-Saturation) color space."
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:53
+msgid "Name of input raster map (red)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:57
+msgid "Name of input raster map (green)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:61
+msgid "Name of input raster map (blue)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:65
+msgid "Name for output raster map (hue)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:69
+msgid "Name for output raster map (intensity)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:73
+msgid "Name for output raster map (saturation)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:64
+msgid ""
+"Calculates top-of-atmosphere radiance or reflectance and temperature for "
+"Landsat MSS/TM/ETM+."
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:66
+msgid ""
+"imagery, landsat, top-of-atmosphere reflectance, dos-type simple atmospheric "
+"correction"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:78
+msgid "Prefix for output raster maps"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:80
+msgid "Example: 'B.toar.' generates B.toar.1, B.toar.2, ..."
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:87
+msgid "Name of Landsat metadata file (.met or MTL.txt)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:93
+msgid "Spacecraft sensor"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:95
+msgid "Required only if 'metfile' not given (recommended for sanity)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:98
+msgid ""
+"mss1;Landsat_1 MSS;mss2;Landsat_2 MSS;mss3;Landsat_3 MSS;mss4;Landsat_4 MSS;"
+"mss5;Landsat_5 MSS;tm4;Landsat_4 TM;tm5;Landsat_5 TM;tm7;Landsat_7 ETM+;ot8;"
+"Landsat_8 OLI/TIRS"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:115 ../imagery/i.landsat.toar/main.c:116
+msgid "Atmospheric correction method"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:125
+msgid "Image acquisition date (yyyy-mm-dd)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:126 ../imagery/i.landsat.toar/main.c:134
+#: ../imagery/i.landsat.toar/main.c:143 ../imagery/i.landsat.toar/main.c:151
+msgid "Required only if 'metfile' not given"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:133
+msgid "Sun elevation in degrees"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:142
+msgid "Image creation date (yyyy-mm-dd)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:150
+msgid "Gain (H/L) of all Landsat ETM+ bands (1-5,61,62,7,8)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:158
+msgid "Percent of solar radiance in path radiance"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:159 ../imagery/i.landsat.toar/main.c:169
+msgid "Required only if 'method' is any DOS"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:168
+msgid "Minimum pixels to consider digital number as dark object"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:177
+msgid "Rayleigh atmosphere (diffuse sky irradiance)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:178
+msgid "Required only if 'method' is DOS3"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:186
+msgid "Output at-sensor radiance instead of reflectance for all bands"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:191
+msgid ""
+"Input raster maps use as extension the number of the band instead the code"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:213 ../imagery/i.landsat.toar/main.c:221
+#, c-format
+msgid "Illegal date format: [%s] (yyyy-mm-dd)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:241
+msgid "Failed to identify satellite"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:252
+#, c-format
+msgid "Lacking '%s' and/or '%s' for this satellite"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:259
+msgid "Landsat-7 requires band gain with 9 (H/L) data"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:280
+#, c-format
+msgid "Unknown satellite type (defined by '%s')"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:452
+msgid "Calculating..."
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:488
+#, c-format
+msgid "Writing %s of <%s> to <%s>..."
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:489
+msgid "radiance"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:491
+msgid "temperature"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:492
+msgid "reflectance"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/landsat_met.c:81
+#, c-format
+msgid "Metadata file <%s> not found"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:70
+msgid "Inverse Fast Fourier Transform (IFFT) for image processing."
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:75
+msgid "Name of input raster map (image fft, real part)"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:79
+msgid "Name of input raster map (image fft, imaginary part"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:101
+msgid ""
+"Unable to open real-image in the 'cell_misc' directory. Raster map probably "
+"wasn't created by i.fft"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:111
+msgid ""
+"Unable to open imaginary-image in the 'cell_misc' directory. Raster map "
+"probably wasn't created by i.fft"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:134
+#, c-format
+msgid "Power 2 values: %d rows %d columns"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:151
+msgid "Masking raster maps..."
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:211
+msgid "Starting Inverse FFT..."
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:225
+msgid "Writing data..."
+msgstr ""
+
+#: ../imagery/i.ifft/orig_wind.c:27
+msgid "The real and imaginary original windows did not match"
+msgstr ""
+
+#: ../imagery/i.cca/transform.c:18
+msgid "Unable to allocate cell buffers."
+msgstr ""
+
+#: ../imagery/i.cca/transform.c:24
+msgid "Error reading cell map during transform."
+msgstr ""
+
+#: ../imagery/i.cca/transform.c:46
+msgid "Error writing cell map during transform."
+msgstr ""
+
+#: ../imagery/i.cca/transform.c:51
+msgid "Transform completed.\n"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:84
+msgid "imagery, statistics"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:86
+msgid "Canonical components analysis (cca) program for image processing."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:99
+msgid "File containing spectral signatures"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:102
+msgid "Output raster map prefix name"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:108
+#, c-format
+msgid "Illegal group name <%s>"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:111
+#, c-format
+msgid "Illegal subgroup name <%s>"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:114
+#, c-format
+msgid "Illegal signature file name <%s>"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:117
+#, c-format
+msgid "Illegal output file name <%s>"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:122
+msgid "Unknown imagery group."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:125
+msgid "Unable to find subgroup reference information."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:131
+msgid "Unable to open the signature file"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:135
+msgid "Error while reading the signatures file."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:140
+msgid "Need at least two signatures in signature file."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:145
+#, c-format
+msgid ""
+"Subgroup too large.  Maximum number of bands is %d\n"
+"."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:207
+#, c-format
+msgid "The output cell map <%s.%d> has values outside the 0-255 range."
+msgstr ""
+
+#: ../imagery/i.target/main.c:47
+msgid "Targets an imagery group to a GRASS location and mapset."
+msgstr ""
+
+#: ../imagery/i.target/main.c:56
+msgid "Name of imagery target location"
+msgstr ""
+
+#: ../imagery/i.target/main.c:62
+msgid "Name of target mapset"
+msgstr ""
+
+#: ../imagery/i.target/main.c:67
+msgid "Set current location and mapset as target for of imagery group"
+msgstr ""
+
+#: ../imagery/i.target/main.c:89 ../imagery/i.target/main.c:106
+#: ../imagery/i.target/main.c:115
+#, c-format
+msgid "Group <%s> targeted for location [%s], mapset [%s]"
+msgstr ""
+
+#: ../imagery/i.target/main.c:92
+#, c-format
+msgid "Group <%s> has no target"
+msgstr ""
+
+#: ../imagery/i.target/main.c:100
+msgid ""
+"Use either the Current Mapset and Location Flag (-c)\n"
+" OR\n"
+" manually enter the variables"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:55
+msgid "nviz - Visualization and animation tool for GRASS data."
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:60
+msgid "Name of raster map(s) for Elevation"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:61
+#: ../visualization/nviz/src/nviz_init.c:70
+#: ../visualization/nviz/src/nviz_init.c:97
+msgid "Raster"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:69
+msgid "Name of raster map(s) for Color"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:78
+msgid "Name of vector lines/areas overlay map(s)"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:79
+#: ../visualization/nviz/src/nviz_init.c:88
+msgid "Vector"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:87
+msgid "Name of vector points overlay file(s)"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:96
+msgid "Name of existing 3d raster map"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:101
+msgid "Quickstart - Do not load any data"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:106
+msgid "Exit after completing script launched from the command line"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:111
+msgid "Start in Demo mode (skip the \"please wait\" message)"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:115
+msgid "Verbose module output"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:121
+msgid "Set alternative panel path"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:127
+msgid "Execute script file at startup"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:133
+msgid "Load previously saved state file"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:287
+msgid "Number of elevation files does not match number of colors files"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:298
+msgid "Loading data failed"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:411
+msgid "Entering script mode ..."
+msgstr ""
+
+#: ../visualization/ximgview/main.c:62
+msgid "Unable to open display"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:82
+msgid "Unable to get window attributes"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:238
+msgid "Unable to open image file"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:241
+msgid "Unable to read BMP header"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:244
+msgid "Invalid BMP header"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:250
+msgid "Unable to map image file"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:271
+msgid "View BMP images from the PNG driver."
+msgstr ""
+
+#: ../visualization/ximgview/main.c:279
+msgid "Image file"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:286
+msgid "Percentage of CPU time to use"
+msgstr ""
+
+#: ../visualization/ximgview/color.c:90 ../visualization/ximgview/color.c:288
+#: ../visualization/xganim/Clr_table.c:94
+#: ../visualization/xganim/Clr_table.c:292
+#: ../visualization/xganim/Clr_table.c:318
+#, c-format
+msgid "Unknown visual class [%d]."
+msgstr ""
+
+#: ../visualization/ximgview/color.c:239
+#: ../visualization/xganim/Clr_table.c:243
+msgid "Unable to get sufficient gray shades."
+msgstr ""
+
+#: ../visualization/ximgview/color.c:256
+#: ../visualization/xganim/Clr_table.c:260
+msgid "Unable to get sufficient colors."
+msgstr ""
+
+#: ../visualization/ximgview/color.c:269
+#: ../visualization/xganim/Clr_table.c:273
+msgid "Using private colormap for DirectColor visual."
+msgstr ""
+
+#: ../visualization/xganim/main.c:362
+#, c-format
+msgid "Reading file [%s]..."
+msgstr ""
+
+#: ../visualization/xganim/main.c:384
+msgid "Unable to determine raster cell type"
+msgstr ""
+
+#: ../visualization/xganim/main.c:388
+msgid "Unable to read color file"
+msgstr ""
+
+#: ../visualization/xganim/main.c:393
+msgid "Unable to read raster row"
+msgstr ""
+
+#: ../vector/v.in.dxf/add_lwpolyline.c:33 ../vector/v.in.dxf/add_3dface.c:29
+#: ../vector/v.in.dxf/add_polyline.c:90 ../vector/v.in.dxf/add_text.c:35
+#: ../vector/v.in.dxf/add_line.c:28 ../vector/v.in.dxf/add_point.c:27
+#: ../vector/v.in.dxf/add_circle.c:32 ../vector/v.in.dxf/add_arc.c:36
+#, c-format
+msgid "Layer %d: %s\n"
+msgstr ""
+
+#: ../vector/v.in.dxf/add_polyline.c:45
+msgid "vertices following flag missing"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:62
+msgid "Converts files in DXF format to GRASS vector map format."
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:66
+msgid "Ignore the map extent of DXF file"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:70
+msgid "Do not create attribute tables"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:74 ../vector/v.edit/args.c:216
+#: ../vector/v.random/main.c:136
+msgid "Do not build topology"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:78
+msgid "Import polyface meshes as 3D wire frame"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:83 ../vector/v.in.dxf/main.c:89
+#: ../vector/v.in.dxf/main.c:94 ../vector/v.in.dxf/main.c:108
+msgid "DXF layers"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:88 ../vector/v.in.dwg/main.c:84
+msgid "Invert selection by layers (don't import layers in list)"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:93
+msgid "Import all objects into one layer"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:97
+msgid "Name of input DXF file"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:107 ../vector/v.in.dwg/main.c:79
+msgid "List of layers to import"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:122
+#, c-format
+msgid "Unable to open DXF file <%s>"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:157
+#, c-format
+msgid "Option <%s>: <%s> exists."
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:162
+#, c-format
+msgid "Use '%s' option to change vector map name"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:189
+msgid "Building topology failed"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:195
+msgid "Failed to import DXF file!"
+msgstr ""
+
+#: ../vector/v.in.dxf/read_dxf.c:57
+msgid "end of file while looking for HEADER"
+msgstr ""
+
+#: ../vector/v.in.dxf/write_vect.c:58 ../vector/v.in.ascii/points.c:405
+#: ../vector/v.in.sites/main.c:240 ../vector/v.mkgrid/main.c:309
+#, c-format
+msgid "Unable to insert new record: %s"
+msgstr ""
+
+#: ../vector/v.in.dxf/write_vect.c:78
+msgid "No DXF layers found!"
+msgstr ""
+
+#: ../vector/v.in.dxf/write_vect.c:87
+msgid "Following DXF layers found:"
+msgstr ""
+
+#: ../vector/v.in.dxf/write_vect.c:91
+#, c-format
+msgid "Layer %d: %s"
+msgstr ""
+
+#: ../vector/v.in.dxf/write_vect.c:230
+#, c-format
+msgid "Unable to add database link for vector map <%s>"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:67
+#, c-format
+msgid "\tScore Value=%f\tsmoothing parameter (standard deviation)=%f"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:106
+msgid "vector, kernel density"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:108
+msgid ""
+"Generates a raster density map from vector point data using a moving kernel "
+"or optionally generates a vector density map on a vector network."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:112
+msgid "Input vector with training points"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:116
+msgid "Input network vector map"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:124
+msgid "Output raster/vector map"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:130
+msgid "Standard deviation in map units"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:136
+msgid "Discretization error in map units"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:143
+msgid "Maximum length of segment on network"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:150
+msgid "Maximum distance from point to network"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:157
+msgid "Multiply the density result by this number"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:164
+msgid "Node method"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:168
+msgid ""
+"none;No method applied at nodes with more than 2 arcs;split;Equal split "
+"(Okabe 2009) applied at nodes;"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:175
+msgid "Kernel function"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:183
+msgid ""
+"Try to calculate an optimal standard deviation with 'stddeviation' taken as "
+"maximum (experimental)"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:188
+msgid "Only calculate optimal standard deviation and exit (no map is written)"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:193
+msgid ""
+"In network mode, normalize values by sum of density multiplied by length of "
+"each segment. Integral over the output map then gives 1.0 * mult"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:198
+msgid "In network mode, multiply the result by number of input points."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:203
+msgid "Verbose module output (retained for backwards compatibility)"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:225
+msgid "Unknown node method"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:243
+msgid "Unknown kernel function"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:249
+msgid ""
+"Optimal standard deviation calculation is supported only for node method "
+"'none' and kernel function 'gaussian'."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:253
+msgid ""
+"Optimal standard deviation calculation is supported only for kernel function "
+"'gaussian'."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:290
+#, c-format
+msgid "Network input map <%s> not found"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:317
+#, c-format
+msgid "%d points outside threshold"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:345
+#, c-format
+msgid ""
+"Automatic choice of smoothing parameter (standard deviation), maximum "
+"possible value of standard deviation is set to %f"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:352
+#, c-format
+msgid "Using maximum distance between points: %f"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:366
+#, c-format
+msgid "Number of input points: %d."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:367
+#, c-format
+msgid "%d distances read from the map."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:370
+#, c-format
+msgid ""
+"Distances between all points are beyond %e (4 * standard deviation), unable "
+"to calculate optimal value."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:381
+#, c-format
+msgid "Optimal smoothing parameter (standard deviation): %f."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:408
+#, c-format
+msgid ""
+"\n"
+"Writing output vector map using smooth parameter=%f."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:410 ../vector/v.kernel/main.c:517
+#, c-format
+msgid ""
+"\n"
+"Normalising factor=%f."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:515
+#, c-format
+msgid ""
+"\n"
+"Writing output raster map using smooth parameter=%f."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:524
+msgid "Unable to read MASK"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:551
+#, c-format
+msgid "Maximum value in output: %e."
+msgstr ""
+
+#: ../vector/v.kernel/function.c:220
+msgid "Dimension > 2 supported only by gaussian function"
+msgstr ""
+
+#: ../vector/v.digit/centre.c:54
+msgid "Select tool"
+msgstr ""
+
+#: ../vector/v.digit/var.c:80 ../vector/v.digit/var.c:101
+#: ../vector/v.digit/var.c:122
+#, c-format
+msgid "Cannot set variable code = %d"
+msgstr ""
+
+#: ../vector/v.digit/var.c:143
+#, c-format
+msgid "Cannot get type of variable %s"
+msgstr ""
+
+#: ../vector/v.digit/var.c:164
+#, c-format
+msgid "Cannot get code of variable %s"
+msgstr ""
+
+#: ../vector/v.digit/var.c:184
+#, c-format
+msgid "Cannot get name of variable %d"
+msgstr ""
+
+#: ../vector/v.digit/var.c:199 ../vector/v.digit/var.c:215
+#: ../vector/v.digit/var.c:231
+#, c-format
+msgid "Cannot get value of variable code = %d"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:35
+msgid "Split line:"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:36 ../vector/v.digit/vertex.c:56
+#: ../vector/v.digit/vertex.c:152 ../vector/v.digit/vertex.c:373
+#: ../vector/v.digit/vertex.c:516 ../vector/v.digit/vertex.c:570
+#: ../vector/v.digit/vertex.c:669 ../vector/v.digit/line.c:481
+#: ../vector/v.digit/line.c:566 ../vector/v.digit/line.c:620
+#: ../vector/v.digit/line.c:705 ../vector/v.digit/attr.c:403
+msgid "Select"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:36 ../vector/v.digit/vertex.c:56
+#: ../vector/v.digit/vertex.c:131 ../vector/v.digit/vertex.c:152
+#: ../vector/v.digit/vertex.c:200 ../vector/v.digit/vertex.c:220
+#: ../vector/v.digit/vertex.c:304 ../vector/v.digit/vertex.c:325
+#: ../vector/v.digit/vertex.c:373 ../vector/v.digit/vertex.c:471
+#: ../vector/v.digit/vertex.c:516 ../vector/v.digit/vertex.c:570
+#: ../vector/v.digit/vertex.c:633 ../vector/v.digit/vertex.c:669
+#: ../vector/v.digit/line.c:140 ../vector/v.digit/line.c:224
+#: ../vector/v.digit/line.c:481 ../vector/v.digit/line.c:564
+#: ../vector/v.digit/line.c:566 ../vector/v.digit/line.c:620
+#: ../vector/v.digit/line.c:671 ../vector/v.digit/line.c:705
+#: ../vector/v.digit/attr.c:192 ../vector/v.digit/attr.c:302
+#: ../vector/v.digit/attr.c:398 ../vector/v.digit/attr.c:403
+#: ../vector/v.digit/attr.c:407 ../vector/v.digit/attr.c:463
+msgid "Quit tool"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:130 ../vector/v.digit/vertex.c:303
+#: ../vector/v.digit/line.c:564
+msgid "Confirm and select next"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:130 ../vector/v.digit/vertex.c:303
+#: ../vector/v.digit/vertex.c:471 ../vector/v.digit/vertex.c:633
+#: ../vector/v.digit/line.c:481 ../vector/v.digit/line.c:564
+#: ../vector/v.digit/line.c:566 ../vector/v.digit/line.c:671
+msgid "Unselect"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:199
+msgid "Remove vertex:"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:200 ../vector/v.digit/vertex.c:220
+#: ../vector/v.digit/vertex.c:325
+msgid "Select vertex"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:372
+msgid "Add vertex:"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:471
+msgid "New vertex"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:569
+msgid "Move vertex:"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:633 ../vector/v.digit/line.c:671
+msgid "New location"
+msgstr ""
+
+#: ../vector/v.digit/line.c:55
+msgid "Form"
+msgstr ""
+
+#: ../vector/v.digit/line.c:64
+msgid "New record was created.<BR>"
+msgstr ""
+
+#: ../vector/v.digit/line.c:68
+msgid "Record for this category already existed.<BR>"
+msgstr ""
+
+#: ../vector/v.digit/line.c:138
+#, c-format
+msgid "Digitize new %s:"
+msgstr ""
+
+#: ../vector/v.digit/line.c:140 ../vector/v.digit/line.c:224
+#: ../vector/v.digit/line.c:253
+msgid "New point"
+msgstr ""
+
+#: ../vector/v.digit/line.c:191
+msgid "Out of memory! Point not added."
+msgstr ""
+
+#: ../vector/v.digit/line.c:246
+msgid "Less than 2 points for line -> nothing written"
+msgstr ""
+
+#: ../vector/v.digit/line.c:253
+msgid "Undo last point"
+msgstr ""
+
+#: ../vector/v.digit/line.c:253 ../vector/v.digit/line.c:337
+#: ../vector/v.digit/line.c:386
+msgid "Close line"
+msgstr ""
+
+#: ../vector/v.digit/line.c:337 ../vector/v.digit/line.c:386
+#: ../vector/v.digit/line.c:407
+msgid "New Point"
+msgstr ""
+
+#: ../vector/v.digit/line.c:337 ../vector/v.digit/line.c:386
+msgid "Undo Last Point"
+msgstr ""
+
+#: ../vector/v.digit/line.c:407
+msgid "Delete line and exit"
+msgstr ""
+
+#: ../vector/v.digit/line.c:480
+msgid "Delete point, line, boundary, or centroid:"
+msgstr ""
+
+#: ../vector/v.digit/line.c:619
+msgid "Move point, line, boundary, or centroid:"
+msgstr ""
+
+#: ../vector/v.digit/form.c:97
+msgid "db connection was not set by form"
+msgstr ""
+
+#: ../vector/v.digit/form.c:108 ../vector/v.digit/generate.c:77
+msgid "Cannot open driver"
+msgstr ""
+
+#: ../vector/v.digit/form.c:120 ../vector/v.digit/generate.c:89
+msgid "Cannot open database"
+msgstr ""
+
+#: ../vector/v.digit/form.c:133
+msgid "Cannot describe table"
+msgstr ""
+
+#: ../vector/v.digit/form.c:162
+msgid "Cannot find column type"
+msgstr ""
+
+#: ../vector/v.digit/form.c:199
+#, c-format
+msgid "Could not set Tcl system encoding to '%s' (%s)"
+msgstr ""
+
+#: ../vector/v.digit/form.c:228
+msgid "Could not convert UTF to external."
+msgstr ""
+
+#: ../vector/v.digit/form.c:256
+msgid "Cannot update table"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:183 ../vector/v.digit/c_face.c:241
+#, c-format
+msgid "Cannot open driver %s"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:189 ../vector/v.digit/c_face.c:251
+#, c-format
+msgid "Cannot open database %s"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:242
+msgid "Cannot open driver "
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:252 ../vector/v.digit/attr.c:137
+#: ../vector/v.digit/attr.c:650
+#, c-format
+msgid "Cannot open database %s by driver %s"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:269 ../vector/v.vol.rst/main.c:596
+#, c-format
+msgid "Cannot create table: %s"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:270
+msgid "Cannot create table: "
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:282 ../vector/v.sample/main.c:219
+#: ../vector/v.net.distance/main.c:212 ../vector/v.net.path/path.c:113
+#: ../vector/v.net.flow/main.c:172 ../vector/v.db.connect/main.c:331
+#: ../vector/v.net.timetable/main.c:107 ../vector/v.net.components/main.c:151
+#: ../vector/v.net.centrality/main.c:244
+msgid "Cannot create index"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:283
+msgid "Cannot create index:\n"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:294 ../vector/v.db.connect/main.c:336
+#, c-format
+msgid "Cannot grant privileges on table %s"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:295
+msgid "Cannot grant privileges on table:\n"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:312
+msgid ""
+"Cannot add database link to vector, link for given field probably already "
+"exists."
+msgstr ""
+
+#: ../vector/v.digit/main.c:107
+msgid "vector, editing, digitization"
+msgstr ""
+
+#: ../vector/v.digit/main.c:109
+msgid "Interactive editing and digitization of vector maps."
+msgstr ""
+
+#: ../vector/v.digit/main.c:124
+msgid "Create new file if it does not exist."
+msgstr ""
+
+#: ../vector/v.digit/main.c:161
+msgid "New empty map created."
+msgstr ""
+
+#: ../vector/v.digit/main.c:165
+#, c-format
+msgid ""
+"Map <%s> does not exist in current mapset. Add flag -n to create a new map."
+msgstr ""
+
+#: ../vector/v.digit/generate.c:78
+#, c-format
+msgid "Cannot open driver '%s'<BR>"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:91
+#, c-format
+msgid "Cannot open database '%s' by driver '%s'<BR>"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:106
+msgid "Cannot open select cursor"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:110
+#, c-format
+msgid ""
+"Cannot open select cursor:<BR>'%s'<BR>on database '%s' by driver '%s'<BR>"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:121
+msgid "Cannot fetch next record"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:130
+msgid "No database record"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:223
+#, c-format
+msgid "<HR>   Assume data encoding as:<BR><BR><SELECT NAME=%s SIZE=4><HR><BR>"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:26
+msgid "Zoom by window"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:27 ../vector/v.digit/zoom.c:44
+#: ../vector/v.digit/zoom.c:75
+msgid "1. corner"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:27 ../vector/v.digit/zoom.c:44
+#: ../vector/v.digit/zoom.c:75 ../vector/v.digit/zoom.c:158
+msgid "Quit"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:44
+msgid "2. corner"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:157
+msgid "Pan"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:158
+msgid "New center"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:247
+#, c-format
+msgid "Cannot find window '%s'"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:94
+msgid "Cannot create new record."
+msgstr ""
+
+#: ../vector/v.digit/attr.c:127
+msgid "Database table for this layer is not defined"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:145 ../vector/v.digit/attr.c:659
+#, c-format
+msgid "Cannot select record from table %s"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:191
+msgid "Display categories:"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:192 ../vector/v.digit/attr.c:463
+msgid "Select line"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:301 ../vector/v.digit/attr.c:406
+msgid "Copy attributes:"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:302 ../vector/v.digit/attr.c:407
+msgid "Select source object"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:396 ../vector/v.digit/attr.c:402
+msgid "Select the target object"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:397
+msgid "Conform and select next"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:397
+msgid "Deselect Target"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:403
+msgid "Deselect Source"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:462
+msgid "Display attributes:"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:536 ../vector/v.voronoi/vo_main.c:339
+#: ../vector/v.extract/main.c:461 ../vector/v.generalize/misc.c:159
+#, c-format
+msgid "Layer %d"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:542
+#, c-format
+msgid "layer: %d<BR>category: %d<BR>"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:549
+msgid "Database connection not defined<BR>"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:553
+#, c-format
+msgid "driver: %s<BR>database: %s<BR>table: %s<BR>key column: %s<BR>"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:571
+#, c-format
+msgid "Line %d"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:577
+msgid "No categories"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:668
+#, c-format
+msgid ""
+"There are no more features with category %d (layer %d) in the map, but there "
+"is record in the table. Delete this record?"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:680
+#, c-format
+msgid "Cannot delete record: %s"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:69
+msgid "vector, geometry, 3D"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:71
+msgid "Extrudes flat vector object to 3D with defined height."
+msgstr ""
+
+#: ../vector/v.extrude/main.c:75
+msgid "Trace elevation"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:78
+msgid "Name of input 2D vector map"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:81
+msgid "Name of resulting 3D vector map"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:85 ../vector/v.transform/main.c:141
+msgid "Shifting value for z coordinates"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:93
+msgid "Elevation raster for height extraction"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:100
+msgid "Fixed height for 3D vector objects"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:105
+msgid "Name of attribute column with object heights"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:119
+#, c-format
+msgid "One of '%s' or '%s' parameters must be set"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:194
+msgid "Extruding areas..."
+msgstr ""
+
+#: ../vector/v.extrude/main.c:204 ../vector/v.out.svg/main.c:236
+#, c-format
+msgid "Skipping area %d without centroid"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:219
+#, c-format
+msgid "Cannot select attributes for area %d"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:258
+msgid "Extruding vector primitives..."
+msgstr ""
+
+#: ../vector/v.extrude/main.c:291
+#, c-format
+msgid "Cannot select attributes for area #%d"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:309
+#, c-format
+msgid "Column <%s>: invalid data type"
+msgstr ""
+
+#: ../vector/v.label/main.c:61 ../vector/v.label.sa/main.c:54
+msgid "vector, paint labels"
+msgstr ""
+
+#: ../vector/v.label/main.c:63
+msgid "Creates paint labels for a vector map from attached attributes."
+msgstr ""
+
+#: ../vector/v.label/main.c:68 ../vector/v.label.sa/main.c:107
+msgid "Name for new paint-label file"
+msgstr ""
+
+#: ../vector/v.label/main.c:70
+msgid "If not given the name of the input map is used"
+msgstr ""
+
+#: ../vector/v.label/main.c:79 ../vector/v.label.sa/main.c:103
+msgid "Name of attribute column to be used for labels"
+msgstr ""
+
+#: ../vector/v.label/main.c:90
+msgid "Rotate labels to align with lines"
+msgstr ""
+
+#: ../vector/v.label/main.c:95
+msgid "Curl labels along lines"
+msgstr ""
+
+#: ../vector/v.label/main.c:100
+msgid "Offset label in x-direction"
+msgstr ""
+
+#: ../vector/v.label/main.c:103 ../vector/v.label/main.c:110
+#: ../vector/v.label/main.c:119 ../vector/v.label/main.c:163
+msgid "Placement"
+msgstr ""
+
+#: ../vector/v.label/main.c:107
+msgid "Offset label in y-direction"
+msgstr ""
+
+#: ../vector/v.label/main.c:114 ../vector/v.lrs/v.lrs.label/main.c:173
+msgid "Reference position"
+msgstr ""
+
+#: ../vector/v.label/main.c:126 ../vector/v.label/main.c:133
+#: ../vector/v.label/main.c:141 ../vector/v.label/main.c:149
+#: ../vector/v.label.sa/main.c:118 ../vector/v.label.sa/main.c:119
+#: ../vector/v.label.sa/main.c:126 ../vector/v.lrs/v.lrs.label/main.c:180
+msgid "Font"
+msgstr ""
+
+#: ../vector/v.label/main.c:130 ../vector/v.label.sa/main.c:123
+#: ../vector/v.lrs/v.lrs.label/main.c:186
+msgid "Label size (in map-units)"
+msgstr ""
+
+#: ../vector/v.label/main.c:138
+msgid "Space between letters for curled labels (in map-units)"
+msgstr ""
+
+#: ../vector/v.label/main.c:145
+msgid "Label size (in points)"
+msgstr ""
+
+#: ../vector/v.label/main.c:157
+msgid "Rotation angle (degrees counter-clockwise)"
+msgstr ""
+
+#: ../vector/v.label/main.c:167
+msgid "Border width"
+msgstr ""
+
+#: ../vector/v.label/main.c:175 ../vector/v.label.sa/main.c:153
+#: ../vector/v.lrs/v.lrs.label/main.c:210
+msgid "Highlight color for text"
+msgstr ""
+
+#: ../vector/v.label/main.c:181 ../vector/v.label.sa/main.c:163
+msgid "Width of highlight coloring"
+msgstr ""
+
+#: ../vector/v.label/main.c:201 ../vector/v.label.sa/main.c:181
+msgid "Opaque to vector (only relevant if background color is selected)"
+msgstr ""
+
+#: ../vector/v.label/main.c:252
+msgid ""
+"size and space options vary significantly which may lead to crummy output"
+msgstr ""
+
+#: ../vector/v.label/main.c:260
+msgid "Too many parameters for <reference>"
+msgstr ""
+
+#: ../vector/v.label/main.c:323 ../vector/v.label.sa/labels.c:174
+#: ../vector/v.overlay/main.c:362
+msgid "Unable to select attributes"
+msgstr ""
+
+#: ../vector/v.label/main.c:329 ../vector/v.sample/main.c:252
+#: ../vector/v.sample/main.c:260 ../vector/v.vol.rst/user1.c:170
+#: ../vector/v.buffer2/main.c:417 ../vector/v.buffer2/main.c:489
+#: ../vector/v.label.sa/labels.c:178 ../vector/v.buffer/main.c:454
+#: ../vector/v.buffer/main.c:466 ../vector/v.buffer/main.c:531
+#: ../vector/v.buffer/main.c:543 ../vector/v.what.rast/main.c:318
+#, c-format
+msgid "No record for category %d in table <%s>"
+msgstr ""
+
+#: ../vector/v.label/main.c:442
+#, c-format
+msgid "Labeled %d lines."
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:53
+msgid "vector, network, connectivity"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:55
+msgid "Computes vertex connectivity between two sets of nodes in the network."
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:66
+msgid "Name of node capacity column"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:70
+msgid "Set1 layer number or name"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:71
+#: ../vector/v.net.connectivity/main.c:76
+#: ../vector/v.net.connectivity/main.c:82
+msgid "Set1"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:75
+msgid "Set1 category values"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:81
+msgid "Set1 WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:86
+msgid "Set2 layer number or name"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:87
+#: ../vector/v.net.connectivity/main.c:92
+#: ../vector/v.net.connectivity/main.c:98
+msgid "Set2"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:91
+msgid "Set2 category values"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:97
+msgid "Set2 WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:130
+#: ../vector/v.net.connectivity/main.c:135 ../vector/v.net.flow/main.c:186
+#: ../vector/v.net.flow/main.c:191
+#, c-format
+msgid "Neither %s nor %s was given"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:148
+#: ../vector/v.net.connectivity/main.c:151
+#, c-format
+msgid "%s is empty"
+msgstr ""
+
+#: ../vector/v.delaunay2/memory.c:64 ../vector/v.delaunay2/memory.c:70
+#: ../vector/v.delaunay2/memory.c:74 ../vector/v.delaunay2/memory.c:84
+#: ../vector/v.delaunay2/memory.c:92 ../vector/v.delaunay2/memory.c:104
+#: ../vector/v.delaunay2/memory.c:108
+msgid "Not enough memory."
+msgstr ""
+
+#: ../vector/v.delaunay2/memory.c:124
+msgid "All allocated edges have been used."
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:86 ../vector/v.voronoi/vo_main.c:120
+#: ../vector/v.voronoi/dt_main.c:46
+msgid "vector, geometry, triangulation"
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:87 ../vector/v.voronoi/dt_main.c:47
+msgid ""
+"Creates a Delaunay triangulation from an input vector map containing points "
+"or centroids."
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:95 ../vector/v.voronoi/dt_main.c:55
+msgid "Use only points in current region"
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:100 ../vector/v.voronoi/dt_main.c:60
+msgid "Output triangulation as a graph (lines), not areas"
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:141
+msgid "no points to triangulate"
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:149
+msgid "Delaunay triangulation..."
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:152
+msgid "Writing edges..."
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:162
+msgid "Calculate area centroids..."
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:172 ../vector/v.category/main.c:290
+msgid "Unable to calculate area centroid"
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:178
+msgid "Unable to calculate area centroid z coordinate"
+msgstr ""
+
+#: ../vector/v.out.dxf/write_dxf.c:21
+#, c-format
+msgid "The file '%s' already exists."
+msgstr ""
+
+#: ../vector/v.out.dxf/write_dxf.c:23
+#, c-format
+msgid "The file '%s' already exists and will be overwritten."
+msgstr ""
+
+#: ../vector/v.out.dxf/write_dxf.c:27
+#, c-format
+msgid "%s: Cannot write dxf file."
+msgstr ""
+
+#: ../vector/v.out.dxf/main.c:48 ../vector/v.out.ogr/main.c:96
+#: ../vector/v.out.ascii/out.c:45 ../vector/v.out.svg/main.c:77
+#: ../vector/v.out.pov/main.c:43 ../vector/v.out.vtk/main.c:46
+msgid "vector, export"
+msgstr ""
+
+#: ../vector/v.out.dxf/main.c:50
+msgid "Exports GRASS vector map layers to DXF file format."
+msgstr ""
+
+#: ../vector/v.out.dxf/main.c:60
+msgid "DXF output file"
+msgstr ""
+
+#: ../vector/v.out.dxf/main.c:97
+#, c-format
+msgid "%d features written to '%s'."
+msgstr ""
+
+#: ../vector/v.transform/setup_trans.c:83
+msgid "The points weren't spread out enough."
+msgstr ""
+
+#: ../vector/v.transform/setup_trans.c:86
+#, c-format
+msgid "You need to enter at least %d points."
+msgstr ""
+
+#: ../vector/v.transform/main.c:73
+msgid "vector, transformation"
+msgstr ""
+
+#: ../vector/v.transform/main.c:75
+msgid ""
+"Performs an affine transformation (shift, scale and rotate, or GPCs) on "
+"vector map."
+msgstr ""
+
+#: ../vector/v.transform/main.c:82
+msgid "Suppress display of residuals or other information"
+msgstr ""
+
+#: ../vector/v.transform/main.c:86
+msgid "Shift all z values to bottom=0"
+msgstr ""
+
+#: ../vector/v.transform/main.c:87 ../vector/v.transform/main.c:99
+#: ../vector/v.transform/main.c:125 ../vector/v.transform/main.c:134
+#: ../vector/v.transform/main.c:143 ../vector/v.transform/main.c:152
+#: ../vector/v.transform/main.c:161 ../vector/v.transform/main.c:170
+#: ../vector/v.transform/main.c:180
+msgid "Custom"
+msgstr ""
+
+#: ../vector/v.transform/main.c:92
+msgid "Print the transformation matrix to stdout"
+msgstr ""
+
+#: ../vector/v.transform/main.c:97
+msgid ""
+"Instead of points use transformation parameters (xshift, yshift, zshift, "
+"xscale, yscale, zscale, zrot)"
+msgstr ""
+
+#: ../vector/v.transform/main.c:111
+msgid "ASCII file holding transform coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:112
+msgid ""
+"If not given, transformation parameters (xshift, yshift, zshift, xscale, "
+"yscale, zscale, zrot) are used instead"
+msgstr ""
+
+#: ../vector/v.transform/main.c:123
+msgid "Shifting value for x coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:132
+msgid "Shifting value for y coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:150
+msgid "Scaling factor for x coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:159
+msgid "Scaling factor for y coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:168
+msgid "Scaling factor for z coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:178
+msgid "Rotation around z axis in degrees counterclockwise"
+msgstr ""
+
+#: ../vector/v.transform/main.c:184
+msgid "Name of table containing transformation parameters"
+msgstr ""
+
+#: ../vector/v.transform/main.c:193
+msgid "Name of attribute column(s) used as transformation parameters"
+msgstr ""
+
+#: ../vector/v.transform/main.c:195
+msgid "Format: parameter:column, e.g. xshift:xs,yshift:ys,zrot:zr"
+msgstr ""
+
+#: ../vector/v.transform/main.c:211
+#, c-format
+msgid ""
+"The '%c' flag is deprecated and will be removed in future. Transformation "
+"parameters are used automatically when no pointsfile is given."
+msgstr ""
+
+#: ../vector/v.transform/main.c:217
+#, c-format
+msgid ""
+"The '%c' flag is deprecated and will be removed in future. Please use '--"
+"quiet' instead."
+msgstr ""
+
+#: ../vector/v.transform/main.c:226
+#, c-format
+msgid "Column names are not defined. Please use '%s' parameter."
+msgstr ""
+
+#: ../vector/v.transform/main.c:231
+#, c-format
+msgid "Please specify a valid layer with '%s' parameter."
+msgstr ""
+
+#: ../vector/v.transform/main.c:236
+msgid ""
+"Name of table and name for output vector map must be different. Otherwise "
+"the table is overwritten."
+msgstr ""
+
+#: ../vector/v.transform/main.c:253
+#, c-format
+msgid "Unable to open file with coordinates <%s>"
+msgstr ""
+
+#: ../vector/v.transform/main.c:289
+#, c-format
+msgid "Unable to tokenize column string: [%s]"
+msgstr ""
+
+#: ../vector/v.transform/main.c:361 ../vector/v.category/main.c:556
+#: ../vector/v.proj/main.c:296 ../vector/v.type/main.c:234
+#: ../vector/v.net/main.c:197 ../vector/v.build.polylines/main.c:233
+#: ../vector/v.clean/main.c:281 ../vector/v.kcv/main.c:161
+msgid "Failed to copy attribute table to output map"
+msgstr ""
+
+#: ../vector/v.transform/main.c:367
+#, c-format
+msgid ""
+"\n"
+"New vector map <%s> boundary coordinates:"
+msgstr ""
+
+#: ../vector/v.transform/main.c:369
+#, c-format
+msgid " N: %-10.3f    S: %-10.3f"
+msgstr ""
+
+#: ../vector/v.transform/main.c:370
+#, c-format
+msgid " E: %-10.3f    W: %-10.3f"
+msgstr ""
+
+#: ../vector/v.transform/main.c:371
+#, c-format
+msgid " B: %6.3f    T: %6.3f"
+msgstr ""
+
+#: ../vector/v.transform/get_coor.c:36
+msgid "Reading coordinates from file."
+msgstr ""
+
+#: ../vector/v.transform/trans_digit.c:106 ../vector/v.in.db/main.c:138
+#: ../vector/v.db.connect/main.c:284
+#, c-format
+msgid "Missing column <%s> in table <%s>"
+msgstr ""
+
+#: ../vector/v.transform/trans_digit.c:109
+#, c-format
+msgid "Unsupported column type of <%s>"
+msgstr ""
+
+#: ../vector/v.transform/trans_digit.c:117
+#, c-format
+msgid ""
+"Unable to select value for category %d from table <%s>, column <%s>. For "
+"category %d using default transformation parameter %.3f."
+msgstr ""
+
+#: ../vector/v.transform/trans_digit.c:128
+msgid "No category number defined. Using default transformation parameters."
+msgstr ""
+
+#: ../vector/v.transform/creat_trans.c:69
+#, c-format
+msgid " Number of points that have been entered: %d\n"
+msgstr ""
+
+#: ../vector/v.transform/creat_trans.c:102
+msgid "Please answer yes or no"
+msgstr ""
+
+#: ../vector/v.transform/creat_trans.c:118
+msgid "Error reading coordinates file"
+msgstr ""
+
+#: ../vector/v.transform/creat_trans.c:123
+#, c-format
+msgid "Number of points that have been entered [%d]"
+msgstr ""
+
+#: ../vector/v.transform/creat_trans.c:126
+msgid "Error creating transformation"
+msgstr ""
+
+#: ../vector/v.transform/ask_trans.c:88
+msgid "ask_transform_coor():  Leaving session.. \n"
+msgstr ""
+
+#: ../vector/v.in.ascii/head.c:22
+#, c-format
+msgid ""
+"Unexpected data in vector head:\n"
+"[%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/head.c:56
+#, c-format
+msgid "Unknown keyword <%s> in vector head"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:50
+msgid "Creates a vector map from ASCII points file or ASCII vector file."
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:56
+msgid "ASCII file to be imported, if not given reads from standard input"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:67
+msgid "point;simple x,y[,z] list;standard;GRASS vector ASCII format"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:70
+msgid "Input file format"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:71 ../vector/v.in.ascii/in.c:74
+#: ../vector/v.in.ascii/in.c:152
+msgid "Input format"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:83
+msgid "Number of header lines to skip at top of input file (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:92
+msgid "Column definition in SQL style (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:93
+msgid ""
+"For example: 'x double precision, y double precision, cat int, name varchar"
+"(10)'"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:105 ../vector/v.in.ascii/in.c:115
+msgid "First column is 1"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:114
+msgid "Number of column used as y coordinate (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:124
+msgid "Number of column used as z coordinate (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:125
+msgid "First column is 1. If 0, z coordinate is not used"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:135
+msgid "Number of column used as category (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:137
+msgid ""
+"First column is 1. If 0, unique category is assigned to each row and written "
+"to new column 'cat'"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:141 ../vector/v.in.dwg/main.c:88
+msgid "Create 3D vector map"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:146
+msgid "Create a new empty vector map and exit. Nothing is read from input."
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:151
+msgid "Don't expect a header when reading in standard format"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:156
+msgid "Do not create table in points mode"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:167
+msgid "Only import points falling within current region (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:181
+msgid "Please specify reasonable number of lines to skip"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:184
+msgid "Please specify z column"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:195
+msgid "Please specify reasonable z column"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:200
+msgid "Column numbers must not be negative"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:204 ../vector/v.edit/main.c:78
+#, c-format
+msgid "Unable to open ASCII file <%s>"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:256
+#, c-format
+msgid "Maximum input row length: %d"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:257
+#, c-format
+msgid "Maximum number of columns: %d"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:258
+#, c-format
+msgid "Minimum number of columns: %d"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:263
+msgid ""
+"x column number > minimum last column number\n"
+"(incorrect field separator?)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:267
+msgid ""
+"y column number > minimum last column number\n"
+"(incorrect field separator?)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:271
+msgid ""
+"z column number > minimum last column number (incorrect field separator?)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:276
+msgid ""
+"cat column number > minimum last column number (incorrect field separator?)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:282
+msgid "x column is not of number type"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:286
+msgid "y column is not of number type"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:290
+msgid "z column is not of number type"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:294
+msgid "cat column is not of number type"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:336
+msgid "Category column is not of integer type"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:417
+#, c-format
+msgid ""
+"Number of columns defined (%d) does not match number of columns (%d) in input"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:445
+#, c-format
+msgid "Column number %d <%s> defined as double has only integer values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:450
+#, c-format
+msgid "Column number %d <%s> defined as string has only integer values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:458
+#, c-format
+msgid "Column number %d <%s> defined as integer has double values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:463
+#, c-format
+msgid "Column number %d <%s> defined as string has double values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:471
+#, c-format
+msgid "Column number %d <%s> defined as integer has string values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:477
+#, c-format
+msgid "Column number %d <%s> defined as double has string values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:483
+#, c-format
+msgid "Length of column %d <%s> (%d) is less than maximum value length (%d)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:523
+msgid "Populating table..."
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:530
+msgid ""
+"Could not close attribute table. The DBMI driver did not accept all "
+"attributes"
+msgstr ""
+
+#: ../vector/v.in.ascii/points.c:83
+msgid "Scanning input for column types..."
+msgstr ""
+
+#: ../vector/v.in.ascii/points.c:165
+#, c-format
+msgid "Unparsable longitude value in column <%d>: %s"
+msgstr ""
+
+#: ../vector/v.in.ascii/points.c:184
+#, c-format
+msgid "Unparsable latitude value in column <%d>: %s"
+msgstr ""
+
+#: ../vector/v.in.ascii/points.c:265
+#, c-format
+msgid "Skipping %d of %d rows falling outside of current region"
+msgstr ""
+
+#: ../vector/v.in.ascii/points.c:293
+msgid "Importing points..."
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:52
+#, c-format
+msgid "Error reading ASCII file: (bad type) [%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:90
+#, c-format
+msgid "Error reading ASCII file: (unknown type) [%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:103 ../vector/v.edit/a2b.c:136
+msgid "End of ASCII file reached before end of coordinates"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:114
+#, c-format
+msgid "Error reading ASCII file: (bad point) [%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:118
+#, c-format
+msgid "Unparsable longitude value: [%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:121
+#, c-format
+msgid "Unparsable latitude value: [%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:154
+msgid "End of ASCII file reached before end of categories"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:164
+#, c-format
+msgid "Error reading categories: [%s]"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:164 ../vector/v.vol.rst/main.c:202
+#: ../vector/v.surf.idw/main.c:84 ../vector/lidar/v.surf.bspline/main.c:83
+msgid "vector, interpolation"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:166
+msgid ""
+"Spatial approximation and topographic analysis from given point or isoline "
+"data in vector format to floating point raster format using regularized "
+"spline with tension."
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:192
+msgid "Use z-coordinates (3D vector only)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:198
+msgid "Perform cross-validation procedure without raster approximation"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:203
+msgid "Use scale dependent tension"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:216 ../vector/lidar/v.surf.bspline/main.c:150
+msgid "If set to 0, z coordinates are used. (3D vector only)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:227
+msgid "Output surface raster map (elevation)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:233
+msgid "Output slope raster map"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:239
+msgid "Output aspect raster map"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:245
+msgid "Output profile curvature raster map"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:251
+msgid "Output tangential curvature raster map"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:257
+msgid "Output mean curvature raster map"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:265 ../vector/v.vol.rst/main.c:286
+msgid "Output deviations vector point file"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:272
+msgid "Output cross-validation errors vector point file"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:279
+msgid "Output vector map showing quadtree segmentation"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:286
+msgid "Output vector map showing overlapping windows"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:292 ../vector/v.vol.rst/main.c:302
+msgid "Name of the raster map used as mask"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:300
+msgid ""
+"Name of the attribute column with values to be used for approximation (if "
+"layer>0)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:308 ../vector/v.vol.rst/main.c:260
+msgid "Tension parameter"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:315 ../vector/v.vol.rst/main.c:268
+msgid "Smoothing parameter"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:323
+msgid "Name of the attribute column with smoothing parameters"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:331 ../vector/v.vol.rst/main.c:309
+msgid "Maximum number of points in a segment"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:340 ../vector/v.vol.rst/main.c:318
+msgid "Minimum number of points for approximation in a segment (>segmax)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:349 ../vector/v.vol.rst/main.c:336
+msgid "Minimum distance between points (to remove almost identical points)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:358
+msgid ""
+"Maximum distance between points on isoline (to insert additional points)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:367
+msgid "Conversion factor for values used for approximation"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:375
+msgid "Anisotropy angle (in degrees counterclockwise from East)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:408 ../vector/v.surf.rst/main.c:413
+#: ../vector/v.surf.rst/main.c:418 ../vector/v.surf.rst/main.c:423
+#, c-format
+msgid "Output vector map name <%s> is not valid map name"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:436
+msgid "You are not outputting any raster or vector maps"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:456
+msgid ""
+"Both cross-validation options (-c flag and cvdev vector output) must be "
+"specified"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:459
+msgid ""
+"The cross-validation cannot be computed simultaneously with output raster or "
+"devi file"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:462
+msgid "Both z-coordinate and zcol attribute defined, only one is allowed"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:464
+msgid "Only smoothing column defined, zcol or -z flag is missing"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:484
+msgid "Using anisotropy - both theta and scalex have to be specified"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:492
+msgid "Both smatt and smooth options specified - using constant"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:502
+msgid "The computation will last too long - lower npmin is suggested"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:549
+msgid "Cannot create quaddata"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:555
+msgid "Cannot create quadfunc"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:558
+msgid "Cannot create tree"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:562
+msgid "Cannot create tree info"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:755
+#, c-format
+msgid ""
+"Processing all selected output files\n"
+"will require %d bytes of disk space for temp files"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:779
+msgid "Interp_segmets failed"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:796
+msgid "Cannot write raster maps -- try to increase resolution"
+msgstr ""
+
+#: ../vector/v.info/main.c:63
+msgid "vector, metadata, history"
+msgstr ""
+
+#: ../vector/v.info/main.c:65
+msgid "Outputs basic information about a user-specified vector map."
+msgstr ""
+
+#: ../vector/v.info/main.c:74
+msgid "Print vector history instead of info"
+msgstr ""
+
+#: ../vector/v.info/main.c:80
+msgid "Print types/names of table columns for specified layer instead of info"
+msgstr ""
+
+#: ../vector/v.info/main.c:95
+msgid "Print topology information only"
+msgstr ""
+
+#: ../vector/v.info/main.c:199 ../vector/v.db.connect/main.c:161
+#, c-format
+msgid "Database connection for map <%s> is not defined in DB file"
+msgstr ""
+
+#: ../vector/v.info/main.c:205
+#, c-format
+msgid "Displaying column types/names for database connection of layer %d:"
+msgstr ""
+
+#: ../vector/v.info/main.c:212 ../vector/v.convert/att.c:67
+#, c-format
+msgid "Unable to open driver <%s>"
+msgstr ""
+
+#: ../vector/v.info/main.c:240
+#, c-format
+msgid "Layer:           %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:242
+#, c-format
+msgid "Mapset:          %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:244
+#, c-format
+msgid "Location:        %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:246
+#, c-format
+msgid "Database:        %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:248
+#, c-format
+msgid "Title:           %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:250
+#, c-format
+msgid "Map scale:       1:%d"
+msgstr ""
+
+#: ../vector/v.info/main.c:252
+#, c-format
+msgid "Map format:      %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:254
+#, c-format
+msgid "Name of creator: %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:256
+#, c-format
+msgid "Organization:    %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:259
+#, c-format
+msgid "Source date:     %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:264
+#, c-format
+msgid "  Type of Map:  %s (level: %i)        "
+msgstr ""
+
+#: ../vector/v.info/main.c:272
+#, c-format
+msgid "  Number of points:       %-9ld       Number of areas:      %-9ld"
+msgstr ""
+
+#: ../vector/v.info/main.c:277
+#, c-format
+msgid "  Number of lines:        %-9ld       Number of islands:    %-9ld"
+msgstr ""
+
+#: ../vector/v.info/main.c:282
+#, c-format
+msgid "  Number of boundaries:   %-9ld       Number of faces:      %-9ld"
+msgstr ""
+
+#: ../vector/v.info/main.c:287
+#, c-format
+msgid "  Number of centroids:    %-9ld       Number of kernels:    %-9ld"
+msgstr ""
+
+#: ../vector/v.info/main.c:292
+#, c-format
+msgid "  Map is 3D:              %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:295
+#, c-format
+msgid "  Number of dblinks:      %-9ld"
+msgstr ""
+
+#: ../vector/v.info/main.c:304
+#, c-format
+msgid "        Projection: %s (zone %d)"
+msgstr ""
+
+#: ../vector/v.info/main.c:307
+#, c-format
+msgid "        Projection: %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:332
+#, c-format
+msgid "  Digitization threshold: %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:334
+#, c-format
+msgid "  Comments:"
+msgstr ""
+
+#: ../vector/v.net.bridge/main.c:45
+msgid "vector, network, articulation points"
+msgstr ""
+
+#: ../vector/v.net.bridge/main.c:47
+msgid "Computes bridges and articulation points in the network."
+msgstr ""
+
+#: ../vector/v.net.bridge/main.c:61
+msgid "bridge;Finds bridges;articulation;Finds articulation points;"
+msgstr ""
+
+#: ../vector/v.category/main.c:68
+msgid "vector, category"
+msgstr ""
+
+#: ../vector/v.category/main.c:70
+msgid "Attach, delete or report vector categories to map geometry."
+msgstr ""
+
+#: ../vector/v.category/main.c:84
+msgid "Action to be done"
+msgstr ""
+
+#: ../vector/v.category/main.c:85
+msgid ""
+"add;add a new category;del;delete all categories of given layer;chlayer;"
+"change layer number (e.g. layer=3,1 changes layer 3 to layer 1);sum;add the "
+"value specified by cat option to the current category value;report;print "
+"report (statistics), in shell style: layer type count min max;print;print "
+"category values, more cats in the same layer are separated by '/';layers;"
+"print only layer numbers"
+msgstr ""
+
+#: ../vector/v.category/main.c:102
+msgid "Feature ids (by default all features are processed)"
+msgstr ""
+
+#: ../vector/v.category/main.c:118
+msgid "Shell script style, currently only for report"
+msgstr ""
+
+#: ../vector/v.category/main.c:119
+msgid "Format: layer type count min max"
+msgstr ""
+
+#: ../vector/v.category/main.c:137
+msgid ""
+"Database connection and attribute tables for concerned layers are not changed"
+msgstr ""
+
+#: ../vector/v.category/main.c:160 ../vector/v.edit/main.c:131
+#: ../vector/v.kcv/main.c:137
+#, c-format
+msgid "Unable to open vector map <%s> at topological level %d"
+msgstr ""
+
+#: ../vector/v.category/main.c:182
+msgid ""
+"Invalid category number (must be equal to or greater than 0). Normally "
+"category number starts at 1."
+msgstr ""
+
+#: ../vector/v.category/main.c:191
+#, c-format
+msgid "%d errors in id option"
+msgstr ""
+
+#: ../vector/v.category/main.c:212
+msgid "Too many layers for this operation"
+msgstr ""
+
+#: ../vector/v.category/main.c:215
+msgid "2 layers must be specified"
+msgstr ""
+
+#: ../vector/v.category/main.c:219
+msgid "Output vector wasn't entered"
+msgstr ""
+
+#: ../vector/v.category/main.c:258 ../vector/v.select/main.c:149
+msgid "Processing features..."
+msgstr ""
+
+#: ../vector/v.category/main.c:303
+#, c-format
+msgid "%d new centroids placed in output map"
+msgstr ""
+
+#: ../vector/v.category/main.c:474
+msgid "Layer/table"
+msgstr ""
+
+#: ../vector/v.category/main.c:478
+msgid "Layer"
+msgstr ""
+
+#: ../vector/v.category/main.c:480
+#, c-format
+msgid "type       count        min        max\n"
+msgstr ""
+
+#: ../vector/v.category/main.c:481
+msgid "point"
+msgstr ""
+
+#: ../vector/v.category/main.c:485
+msgid "line"
+msgstr ""
+
+#: ../vector/v.category/main.c:489
+msgid "boundary"
+msgstr ""
+
+#: ../vector/v.category/main.c:493
+msgid "centroid"
+msgstr ""
+
+#: ../vector/v.category/main.c:497
+msgid "area"
+msgstr ""
+
+#: ../vector/v.category/main.c:501
+msgid "all"
+msgstr ""
+
+#: ../vector/v.category/main.c:554
+msgid "Copying attribute table(s)..."
+msgstr ""
+
+#: ../vector/v.category/main.c:560
+#, c-format
+msgid "%d features modified."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:98
+msgid "Converts GRASS vector map to one of the supported OGR vector formats."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:106
+msgid ""
+"Feature type(s). Combinations not supported by all output formats. Default: "
+"first type found in input."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:114
+msgid "OGR output datasource name"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:116
+msgid "For example: ESRI Shapefile: filename or directory for storage"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:123
+msgid "OGR layer name. If not specified, input name is used."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:124
+msgid "For example: ESRI Shapefile: shapefile name"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:125 ../vector/v.out.ogr/main.c:138
+#: ../vector/v.out.ogr/main.c:148 ../vector/v.out.ogr/main.c:158
+msgid "Creation"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:137
+msgid "OGR format"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:147
+msgid "OGR dataset creation option (format specific, NAME=VALUE)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:157
+msgid "OGR layer creation option (format specific, NAME=VALUE)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:162
+msgid "Open an existing datasource for update"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:167
+msgid "Skip export of GRASS category ID ('cat') attribute"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:171
+msgid ""
+"Export features with category (labeled) only. Otherwise all features are "
+"exported"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:176
+msgid "Use ESRI-style .prj file format (applies to Shapefile output only)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:181
+msgid "Create 3D output if input is 3D (applies to Shapefile output only)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:186
+msgid "Export lines as polygons"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:230
+msgid "Skipping all boundaries that are not part of an area."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:249
+msgid "Volumes will be exported as sets of faces."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:267
+msgid "Could not determine input map's feature type(s)."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:312
+msgid "The combination of types is not supported by all formats."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:326
+msgid ""
+"The map contains islands. To preserve them in the output map, use the -c flag"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:331
+#, c-format
+msgid ""
+"%d point(s) found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:336
+#, c-format
+msgid ""
+"%d line(s) found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:342
+#, c-format
+msgid ""
+"%d boundary(ies) found, but not requested to be exported. Verify 'type' "
+"parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:348
+#, c-format
+msgid ""
+"%d centroid(s) found, but not requested to be exported. Verify 'type' "
+"parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:353
+#, c-format
+msgid ""
+"%d areas found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:357
+#, c-format
+msgid ""
+"%d face(s) found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:363
+#, c-format
+msgid ""
+"%d kernel(s) found, but not requested to be exported. Verify 'type' "
+"parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:368
+#, c-format
+msgid ""
+"%d volume(s) found, but not requested to be exported. Verify 'type' "
+"parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:374
+msgid ""
+"No points found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:383
+msgid ""
+"No lines found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:393
+msgid ""
+"No boundaries found, but requested to be exported. Will skip this geometry "
+"type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:402
+msgid ""
+"No areas found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:412
+msgid ""
+"No centroids found, but requested to be exported. Will skip this geometry "
+"type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:421
+msgid ""
+"No faces found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:430
+msgid ""
+"No kernels found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:439
+msgid ""
+"No volumes found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:450
+msgid "Nothing to export"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:483
+#, c-format
+msgid "OGR driver <%s> not found"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:508
+#, c-format
+msgid "Unable to open OGR data source '%s'"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:522
+#, c-format
+msgid "Layer <%s> already exists in OGR data source '%s'"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:526
+#, c-format
+msgid "OGR layer <%s> already exists and will be overwritten"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:567
+msgid "Overriding existing user-defined 'SHPT=' LCO."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:583
+#, c-format
+msgid ""
+"Vector map <%s> is 3D. Use format specific layer creation options (parameter "
+"'lco') or '-z' flag to export in 3D rather than 2D (default)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:590
+#, c-format
+msgid ""
+"Vector map <%s> is 3D. Use format specific layer creation options (parameter "
+"'lco') to export in 3D rather than 2D (default)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:603
+msgid "Unable to create OGR layer"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:613
+msgid "No attribute table found -> using only category numbers as attributes"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:617
+msgid "Exporting 'cat' anyway, as it is the only attribute table field"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:700
+#, c-format
+msgid "Key column '%s' not found"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:713
+#, c-format
+msgid "Exporting %i geometries..."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:795
+#, c-format
+msgid "Exporting %i areas (may take some time)..."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:870
+#, c-format
+msgid "Exporting %i faces (may take some time) ..."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:933
+#, c-format
+msgid "Exporting %i kernels..."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:992
+#, c-format
+msgid "Exporting %i volumes..."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:993
+msgid "Export of volumes not implemented yet. Skipping."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1010
+#, c-format
+msgid "%d features without category were written"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1012
+#, c-format
+msgid "%d features without attributes were written"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1014
+#, c-format
+msgid "%d features found without category were skipped"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1025
+#, c-format
+msgid "%d features written to <%s> (%s)."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1067 ../vector/v.out.vtk/writeVTK.c:576
+#, c-format
+msgid "Cannot select attributes for cat = %d"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1072 ../vector/v.out.svg/main.c:397
+#: ../vector/v.out.vtk/writeVTK.c:580 ../vector/v.overlay/main.c:426
+#: ../vector/v.lrs/v.lrs.label/main.c:347
+msgid "Unable to fetch data from table"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1083
+#, c-format
+msgid "No database record for cat = %d and export of 'cat' disabled"
+msgstr ""
+
+#: ../vector/v.out.ascii/b2a.c:160
+#, c-format
+msgid "got type %d"
+msgstr ""
+
+#: ../vector/v.out.ascii/b2a.c:202
+#, c-format
+msgid "Feature has more categories. Only first category (%d) is exported."
+msgstr ""
+
+#: ../vector/v.out.ascii/b2a.c:212
+#, c-format
+msgid "Unable to select record from table <%s> (key %s, column %s)"
+msgstr ""
+
+#: ../vector/v.out.ascii/b2a.c:237 ../vector/v.vect.stats/main.c:394
+#: ../vector/v.distance/main.c:377 ../vector/v.distance/main.c:419
+#: ../vector/v.to.3d/trans3.c:62 ../vector/v.to.3d/trans2.c:60
+#: ../vector/v.reclass/main.c:138
+#, c-format
+msgid "Column <%s> not found in table <%s>"
+msgstr ""
+
+#: ../vector/v.out.ascii/b2a.c:239
+#, c-format
+msgid "Column <%s>: unsupported data type"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:47
+msgid "Converts a GRASS binary vector map to a GRASS ASCII vector map."
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:54
+msgid "Path to resulting ASCII file or ASCII vector name if '-o' is defined"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:66
+msgid "Field separator (points mode)"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:83
+msgid "Name of attribute column(s) to be exported (point mode)"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:91
+msgid "Create old (version 4) ASCII file"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:96
+msgid "Only export points falling within current 3D region (points mode)"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:111
+#, c-format
+msgid "Parameter '%s' ignored in standard mode"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:119
+msgid "Format 'point' is not supported for old version"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:123
+msgid "'output' must be given for old version"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:140 ../vector/v.out.vtk/main.c:186
+msgid "Failed to interpret 'dp' parameter as an integer"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:147
+#, c-format
+msgid ""
+"Unable to open vector map <%s> at topology level. Areas will not be "
+"processed."
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:185
+msgid "dig_att file already exist"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:188
+#, c-format
+msgid "Unable to open dig_att file <%s>"
+msgstr ""
+
+#: ../vector/v.support/main.c:40
+msgid "vector, metadata"
+msgstr ""
+
+#: ../vector/v.support/main.c:41
+msgid "Updates vector map metadata."
+msgstr ""
+
+#: ../vector/v.support/main.c:52
+msgid "Organization where vector map was created"
+msgstr ""
+
+#: ../vector/v.support/main.c:61
+msgid "Date of vector map digitization (e.g., \"15 Mar 2007\")"
+msgstr ""
+
+#: ../vector/v.support/main.c:68
+msgid "Person who created vector map"
+msgstr ""
+
+#: ../vector/v.support/main.c:75
+msgid "Vector map title"
+msgstr ""
+
+#: ../vector/v.support/main.c:83
+msgid "Date when the source map was originally produced"
+msgstr ""
+
+#: ../vector/v.support/main.c:89
+msgid "Vector map scale number (e.g., 24000)"
+msgstr ""
+
+#: ../vector/v.support/main.c:95
+msgid "Vector map projection zone"
+msgstr ""
+
+#: ../vector/v.support/main.c:102
+msgid "Vector map digitizing threshold number (e.g., 0.5)"
+msgstr ""
+
+#: ../vector/v.support/main.c:110
+msgid "Text to append to the comment line of the map's metadata file"
+msgstr ""
+
+#: ../vector/v.support/main.c:118
+msgid ""
+"Command line to store into vector map history file (used for vector scripts)"
+msgstr ""
+
+#: ../vector/v.support/main.c:122
+msgid "Replace comment instead of appending it"
+msgstr ""
+
+#: ../vector/v.support/main.c:129 ../vector/v.build/main.c:84
+#: ../vector/v.edit/main.c:120 ../vector/v.neighbors/main.c:77
+#, c-format
+msgid "Vector map <%s> not found in the current mapset"
+msgstr ""
+
+#: ../vector/v.support/main.c:188
+#, c-format
+msgid "Unable to open history file for vector map <%s>"
+msgstr ""
+
+#: ../vector/v.proj/main.c:63
+msgid "vector, projection, transformation"
+msgstr ""
+
+#: ../vector/v.proj/main.c:64
+msgid "Re-projects a vector map from one location to the current location."
+msgstr ""
+
+#: ../vector/v.proj/main.c:76
+msgid "Location containing input vector map"
+msgstr ""
+
+#: ../vector/v.proj/main.c:84
+msgid "Mapset containing input vector map"
+msgstr ""
+
+#: ../vector/v.proj/main.c:100
+msgid "Name for output vector map (default: input)"
+msgstr ""
+
+#: ../vector/v.proj/main.c:105
+msgid "List vector maps in input location and exit"
+msgstr ""
+
+#: ../vector/v.proj/main.c:109
+msgid "3D vector maps only"
+msgstr ""
+
+#: ../vector/v.proj/main.c:111
+msgid "Assume z co-ordinate is ellipsoidal height and transform if possible"
+msgstr ""
+
+#: ../vector/v.proj/main.c:188
+#, c-format
+msgid "Vector map <%s> in location <%s> mapset <%s> not found"
+msgstr ""
+
+#: ../vector/v.proj/main.c:211
+#, c-format
+msgid "Mapset <%s> in input location <%s> - permission denied"
+msgstr ""
+
+#: ../vector/v.proj/main.c:214
+#, c-format
+msgid "Mapset <%s> in input location <%s> not found"
+msgstr ""
+
+#: ../vector/v.proj/main.c:270
+#, c-format
+msgid "Reprojecting primitives: "
+msgstr ""
+
+#: ../vector/v.proj/main.c:281
+msgid "Reading input vector map"
+msgstr ""
+
+#: ../vector/v.proj/main.c:287
+msgid "Error in pj_do_transform"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:76
+msgid "Exports a GRASS vector map to SVG."
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:82
+msgid "Name for SVG output file"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:91
+msgid "Output type"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:92
+msgid "Defines which feature-type will be extracted"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:100
+msgid "Coordinate precision"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:107
+msgid "Attribute(s) to include in output SVG"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:130
+msgid "Precision must not be negative"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:133
+msgid "Precision must not be higher than 15"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:204
+#, c-format
+msgid "Unable to open SVG file <%s>"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:221
+msgid "No areas found, skipping %"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:262
+#, c-format
+msgid "%d areas extracted"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:269
+#, c-format
+msgid "No points found, skipping %s"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:295
+#, c-format
+msgid "%d points extracted"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:302
+#, c-format
+msgid "No lines found, skipping %s"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:326
+#, c-format
+msgid "%d lines extracted"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:393
+#, c-format
+msgid "Cannot select attributes for cat=%d"
+msgstr ""
+
+#: ../vector/v.sample/main.c:86
+msgid "vector, raster, resample"
+msgstr ""
+
+#: ../vector/v.sample/main.c:88
+msgid "Samples a raster map at vector point locations."
+msgstr ""
+
+#: ../vector/v.sample/main.c:91
+msgid "Vector map defining sample points"
+msgstr ""
+
+#: ../vector/v.sample/main.c:98
+msgid "Vector map attribute column to use for comparison"
+msgstr ""
+
+#: ../vector/v.sample/main.c:101
+msgid "Vector map to store differences"
+msgstr ""
+
+#: ../vector/v.sample/main.c:105
+msgid "Raster map to be sampled"
+msgstr ""
+
+#: ../vector/v.sample/main.c:113
+msgid ""
+"Option scaling factor for values read from raster map. Sampled values will "
+"be multiplied by this factor"
+msgstr ""
+
+#: ../vector/v.sample/main.c:119
+msgid "Bilinear interpolation (default is nearest neighbor)"
+msgstr ""
+
+#: ../vector/v.sample/main.c:124
+msgid "Cubic convolution interpolation (default is nearest neighbor)"
+msgstr ""
+
+#: ../vector/v.sample/main.c:142
+msgid "Flags -b & -c are mutually exclusive. Choose only one."
+msgstr ""
+
+#: ../vector/v.sample/main.c:181
+#, c-format
+msgid "Column type <%s> not supported (must be integer or double precision)"
+msgstr ""
+
+#: ../vector/v.sample/main.c:187 ../vector/v.surf.idw/read_sites.c:54
+#: ../vector/v.normal/main.c:155
+#, c-format
+msgid "%d records selected from table"
+msgstr ""
+
+#: ../vector/v.sample/main.c:216 ../vector/v.patch/main.c:285
+#, c-format
+msgid "Unable to create table <%s>"
+msgstr ""
+
+#: ../vector/v.sample/main.c:227
+msgid "Checking vector points..."
+msgstr ""
+
+#: ../vector/v.sample/main.c:266 ../vector/v.buffer2/main.c:350
+#: ../vector/v.univar/main.c:328 ../vector/v.surf.idw/read_sites.c:49
+#: ../vector/v.class/main.c:123 ../vector/v.buffer/main.c:402
+#: ../vector/v.to.rast3/main.c:100 ../vector/v.what.rast/main.c:163
+#: ../vector/lidar/v.surf.bspline/main.c:345
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:138
+msgid "Column type not supported"
+msgstr ""
+
+#: ../vector/v.sample/main.c:289 ../vector/v.kcv/main.c:270
+#, c-format
+msgid "Unable to insert row: %s"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:60 ../vector/v.net.path/main.c:41
+#: ../vector/v.net.allpairs/main.c:58 ../vector/v.net.timetable/main.c:254
+msgid "vector, network, shortest path"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:61
+msgid ""
+"Computes shortest distance via the network between the given sets of "
+"features."
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:64
+msgid ""
+"Finds the shortest paths from a feature 'to' to every feature 'from' and "
+"various information about this realtion are uploaded to the attribute table."
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:73
+msgid "From layer number or name"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:74 ../vector/v.net.distance/main.c:79
+#: ../vector/v.net.distance/main.c:85 ../vector/v.distance/main.c:121
+#: ../vector/v.distance/main.c:133 ../vector/v.distance/main.c:145
+msgid "From"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:78
+msgid "From category values"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:84
+msgid "From WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:89
+msgid "To layer number or name"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:90 ../vector/v.net.distance/main.c:95
+#: ../vector/v.net.distance/main.c:101 ../vector/v.net.distance/main.c:108
+#: ../vector/v.distance/main.c:126 ../vector/v.distance/main.c:140
+#: ../vector/v.distance/main.c:150 ../vector/v.distance/main.c:209
+msgid "To"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:94
+msgid "To category values"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:100
+msgid "To WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:107
+msgid "To feature type"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:216 ../vector/v.net.path/path.c:117
+#: ../vector/v.net.allpairs/main.c:161 ../vector/v.net.flow/main.c:176
+#: ../vector/v.net.timetable/main.c:112 ../vector/v.net.components/main.c:155
+#: ../vector/v.net.centrality/main.c:248
+#, c-format
+msgid "Cannot grant privileges on table <%s>"
+msgstr ""
+
+#: ../vector/v.type/main.c:47 ../vector/v.patch/main.c:68
+#: ../vector/v.to.points/main.c:173 ../vector/v.mkgrid/main.c:63
+#: ../vector/v.segment/main.c:52 ../vector/v.hull/main.c:273
+#: ../vector/v.in.region/main.c:38 ../vector/v.split/main.c:42
+#: ../vector/v.overlay/main.c:60 ../vector/v.parallel2/main.c:45
+#: ../vector/v.parallel/main.c:39
+msgid "vector, geometry"
+msgstr ""
+
+#: ../vector/v.type/main.c:48
+msgid "Change the type of geometry elements."
+msgstr ""
+
+#: ../vector/v.type/main.c:62
+msgid "Feature type to convert from"
+msgstr ""
+
+#: ../vector/v.type/main.c:72
+msgid "Feature type to convert to"
+msgstr ""
+
+#: ../vector/v.type/main.c:77
+msgid "Pairs for input and output type separated by comma"
+msgstr ""
+
+#: ../vector/v.type/main.c:79
+msgid ""
+"<input_type1>,<output_type1>,<input_type2>,<output_type2>,...\n"
+"\t\tExample1: line,boundary\n"
+"\t\tExample2: line,boundary,point,centroid"
+msgstr ""
+
+#: ../vector/v.type/main.c:92
+msgid "Nothing to do"
+msgstr ""
+
+#: ../vector/v.type/main.c:141 ../vector/v.type/main.c:174
+msgid "Incompatible types"
+msgstr ""
+
+#: ../vector/v.type/main.c:186
+msgid "Not enough types"
+msgstr ""
+
+#: ../vector/v.type/main.c:189
+msgid "Odd number of types"
+msgstr ""
+
+#: ../vector/v.build/main.c:34 ../vector/v.clean/main.c:43
+msgid "vector, topology"
+msgstr ""
+
+#: ../vector/v.build/main.c:35
+msgid "Creates topology for GRASS vector map."
+msgstr ""
+
+#: ../vector/v.build/main.c:42
+msgid "Name for vector map where erroneous vector features are written to"
+msgstr ""
+
+#: ../vector/v.build/main.c:53
+msgid "Build topology or dump topology or spatial index to stdout"
+msgstr ""
+
+#: ../vector/v.build/main.c:55
+msgid ""
+"build;build topology;dump;write topology to stdout;sdump;write spatial index "
+"to stdout;cdump;write category index to stdout"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:204
+msgid ""
+"Interpolates point data to a 3D raster map using regularized spline with "
+"tension (RST) algorithm."
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:237
+msgid "Name of the vector map with input x,y,z,w"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:245
+msgid "Name of the surface raster map for cross-section"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:252
+msgid "Name of the column containing w attribute to interpolate"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:276
+msgid "Name of the column with smoothing parameters"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:287 ../vector/v.vol.rst/main.c:295
+msgid "Analysis"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:294
+msgid "Output cross-validation vector map"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:327
+msgid "Maximum number of points for approximation in a segment (>npmin)"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:345
+msgid "Conversion factor for w-values used for interpolation"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:353
+msgid "Conversion factor for z-values"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:361
+msgid "Output cross-section raster map"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:370
+msgid "Output elevation g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:378
+msgid "Output gradient magnitude g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:388
+msgid "Output gradient horizontal angle g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:397
+msgid "Output gradient vertical angle g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:406
+msgid "Output change of gradient g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:415
+msgid "Output gaussian curvature g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:424
+msgid "Output mean curvature g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:430
+msgid "Perform a cross-validation procedure without volume interpolation"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:467
+msgid "Smoothing must be a positive value"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:473
+msgid "Both crossvalidation options (-c, cvdev) must be specified"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:475
+msgid "Both crossvalidation and deviations file specified"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:557
+msgid "Vector is not 3D"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:612
+#, c-format
+msgid "Cannot open %s"
+msgstr ""
+
+#: ../vector/v.vol.rst/user1.c:107
+msgid "Column type of wcolumn is not supported (must be integer or double)"
+msgstr ""
+
+#: ../vector/v.vol.rst/user1.c:126
+msgid ""
+"Column type of smooth column is not supported (must be integer or double)"
+msgstr ""
+
+#: ../vector/v.net/report.c:44
+#, c-format
+msgid "Line %d has no category"
+msgstr ""
+
+#: ../vector/v.net/report.c:67
+#, c-format
+msgid "Point not found: %.3lf %.3lf %.3lf line category: %d"
+msgstr ""
+
+#: ../vector/v.net/report.c:70
+#, c-format
+msgid "%d points found: %.3lf %.3lf %.3lf line category: %d"
+msgstr ""
+
+#: ../vector/v.net/main.c:47
+msgid "vector, networking, maintenance"
+msgstr ""
+
+#: ../vector/v.net/main.c:48
+msgid "Performs network maintenance."
+msgstr ""
+
+#: ../vector/v.net/main.c:55
+msgid "Name of input point vector map"
+msgstr ""
+
+#: ../vector/v.net/main.c:56
+msgid "Required for operation 'connect'"
+msgstr ""
+
+#: ../vector/v.net/main.c:71
+msgid ""
+"nodes;new point is placed on each node (line end) if doesn't exist;connect;"
+"connect still unconnected points to vector network by inserting new line(s);"
+"report;print to standard output {line_category start_point_category "
+"end_point_category};nreport;print to standard output {point_category "
+"line_category[,line_category...]}"
+msgstr ""
+
+#: ../vector/v.net/main.c:97
+msgid "Required for operation 'connect'. Connect points in given threshold."
+msgstr ""
+
+#: ../vector/v.net/main.c:101
+msgid "Assign unique categories to new points"
+msgstr ""
+
+#: ../vector/v.net/main.c:102
+msgid "For operation 'nodes'"
+msgstr ""
+
+#: ../vector/v.net/main.c:120
+msgid "Unknown operation"
+msgstr ""
+
+#: ../vector/v.net/main.c:124
+msgid "Output vector map must be specified"
+msgstr ""
+
+#: ../vector/v.net/main.c:129
+msgid "Point vector map must be specified"
+msgstr ""
+
+#: ../vector/v.net/main.c:132
+msgid "Threshold value must be specified"
+msgstr ""
+
+#: ../vector/v.net/main.c:137
+msgid "Threshold value must be >= 0"
+msgstr ""
+
+#: ../vector/v.net/main.c:174
+#, c-format
+msgid "Unable to open vector map <%s> at topology level %d"
+msgstr ""
+
+#: ../vector/v.net/main.c:190
+#, c-format
+msgid "%d arcs added to network (nlayer %d)"
+msgstr ""
+
+#: ../vector/v.net/nodes.c:85
+#, c-format
+msgid "%d new points written to output"
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:31
+msgid "Failed opening input dig file."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:46
+msgid "dig_att file doesn't exist."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:50
+msgid "Failed opening input dig_att file."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:72
+msgid "Attaching categories..."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:89
+#, c-format
+msgid "Failed to attach an attribute (category %d) to a line."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:94
+#, c-format
+msgid "Line %d label: %d matched another label: %d."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:103
+msgid "Writing new file..."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:125
+#, c-format
+msgid "[%d] points and lines written to output file."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:139
+#, c-format
+msgid "[%d] centroids written to output file."
+msgstr ""
+
+#: ../vector/v.convert/main.c:36
+msgid "vector, import, conversion"
+msgstr ""
+
+#: ../vector/v.convert/main.c:37
+msgid "Imports older versions of GRASS vector maps."
+msgstr ""
+
+#: ../vector/v.convert/main.c:54
+msgid "Endian of input vector map"
+msgstr ""
+
+#: ../vector/v.convert/att.c:36
+msgid "No category labels (dig_cats) found, no table created"
+msgstr ""
+
+#: ../vector/v.convert/att.c:41
+msgid "Unable to open dig_cats file"
+msgstr ""
+
+#: ../vector/v.convert/read.c:41
+msgid "Reading dig file..."
+msgstr ""
+
+#: ../vector/v.convert/read.c:82
+msgid "Input file is version 3."
+msgstr ""
+
+#: ../vector/v.convert/read.c:86
+msgid "Input file is version 4."
+msgstr ""
+
+#: ../vector/v.convert/read.c:96
+msgid "Input file is portable."
+msgstr ""
+
+#: ../vector/v.convert/read.c:99
+msgid ""
+"Input file is not portable. We will attempt to convert anyway but conversion "
+"may fail. Please read manual for detail information."
+msgstr ""
+
+#: ../vector/v.convert/read.c:185
+#, c-format
+msgid "[%d] points read to memory"
+msgstr ""
+
+#: ../vector/v.convert/read.c:186
+#, c-format
+msgid "[%d] lines read to memory"
+msgstr ""
+
+#: ../vector/v.convert/read.c:189
+#, c-format
+msgid "[%d] points read and written to output"
+msgstr ""
+
+#: ../vector/v.convert/read.c:190
+#, c-format
+msgid "[%d] lines read and written to output"
+msgstr ""
+
+#: ../vector/v.convert/read.c:192
+#, c-format
+msgid "[%d] area boundaries read and written to output"
+msgstr ""
+
+#: ../vector/v.convert/read.c:193
+#, c-format
+msgid "[%d] dead points skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:194
+#, c-format
+msgid "[%d] dead lines skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:195
+#, c-format
+msgid "[%d] dead area boundaries skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:196
+#, c-format
+msgid "[%d] elements of unknown type skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:198
+#, c-format
+msgid "[%d] elements read to memory"
+msgstr ""
+
+#: ../vector/v.convert/read.c:241
+msgid "Reading dig_att file..."
+msgstr ""
+
+#: ../vector/v.convert/read.c:249
+#, c-format
+msgid "Error: %s"
+msgstr ""
+
+#: ../vector/v.convert/read.c:270
+#, c-format
+msgid "Unknown type: %c"
+msgstr ""
+
+#: ../vector/v.convert/read.c:293
+#, c-format
+msgid "[%d] point categories read"
+msgstr ""
+
+#: ../vector/v.convert/read.c:294
+#, c-format
+msgid "[%d] line categories read"
+msgstr ""
+
+#: ../vector/v.convert/read.c:295
+#, c-format
+msgid "[%d] centroids read"
+msgstr ""
+
+#: ../vector/v.convert/read.c:296
+#, c-format
+msgid "[%d] dead point categories skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:297
+#, c-format
+msgid "[%d] dead line categories skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:298
+#, c-format
+msgid "[%d] dead centroids skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:299
+#, c-format
+msgid "[%d] categories of unknown type skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:301
+#, c-format
+msgid "[%d] categories read into memory"
+msgstr ""
+
+#: ../vector/v.convert/type.c:29
+#, c-format
+msgid "OLD_T_NEW Got a bad type code [%x]"
+msgstr ""
+
+#: ../vector/v.convert/type.c:50
+#, c-format
+msgid "NEW_T_OLD Got a bad type code [%x]"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:150
+msgid "vector, buffer"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:152 ../vector/v.buffer/main.c:256
+msgid ""
+"Creates a buffer around features of given type (areas must contain centroid)."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:170
+msgid "Buffer distance along major axis in map units"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:171 ../vector/v.buffer2/main.c:179
+#: ../vector/v.buffer2/main.c:187 ../vector/v.buffer2/main.c:193
+#: ../vector/v.buffer2/main.c:201 ../vector/v.buffer2/main.c:210
+msgid "Distance"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:178
+msgid "Buffer distance along minor axis in map units"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:186 ../vector/v.parallel2/main.c:74
+msgid "Angle of major axis in degrees"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:192
+msgid "Name of column to use for buffer distances"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:200 ../vector/v.buffer/main.c:286
+msgid "Scaling factor for attribute column values"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:209 ../vector/v.buffer/main.c:296
+msgid ""
+"Maximum distance between theoretical arc and polygon segments as multiple of "
+"buffer"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:225
+msgid ""
+"This is an alias to the distance option. It is retained for backwards "
+"compatibility"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:227 ../vector/v.buffer/main.c:271
+msgid "Buffer distance in map units"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:232
+msgid "Make outside corners straight"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:236
+msgid "Don't make caps at the ends of polylines"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:247
+msgid "Select a buffer distance/minordistance/angle or column, but not both."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:251 ../vector/v.buffer/main.c:319
+msgid ""
+"The bufcol option may contain bugs during the cleaning step. If you "
+"encounter problems, use the debug option or clean manually with v.clean "
+"tool=break; v.category step=0; v.extract -d type=area"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:262
+msgid "The bufcol option requires a valid layer."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:265
+msgid ""
+"The buffer option has been replaced by the distance option and will be "
+"removed in future."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:268
+msgid "Use the distance option instead of the buffer option."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:272
+msgid "The tolerance must be > 0."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:275
+#, c-format
+msgid "The tolerance was reset to %g"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:299
+#, c-format
+msgid "The tolerance in map units = %g"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:344
+#, c-format
+msgid "Unable to select data from table <%s>"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:380
+msgid ""
+"No features available for buffering. Check type option and features "
+"available in the input vector."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:394
+msgid "Buffering lines..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:423 ../vector/v.buffer2/main.c:495
+#: ../vector/v.buffer/main.c:473 ../vector/v.buffer/main.c:550
+#, c-format
+msgid "Attribute is of invalid size (%.3f) for category %d"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:437 ../vector/v.buffer2/main.c:509
+#: ../vector/v.buffer/main.c:335 ../vector/v.buffer/main.c:485
+#: ../vector/v.buffer/main.c:562
+#, c-format
+msgid "The tolerance in map units: %g"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:468
+msgid "Buffering areas..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:524
+msgid "Writing buffers..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:540 ../vector/v.buffer/main.c:607
+msgid "Building parts of topology..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:543 ../vector/v.buffer/main.c:619
+msgid "Snapping boundaries..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:546
+msgid "Breaking polygons..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:549 ../vector/v.buffer2/main.c:556
+#: ../vector/v.buffer/main.c:625 ../vector/v.overlay/area_area.c:114
+msgid "Removing duplicates..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:553 ../vector/v.buffer/main.c:622
+msgid "Breaking boundaries..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:559
+msgid "Cleaning boundaries at nodes"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:574 ../vector/v.buffer/main.c:637
+#: ../vector/v.overlay/area_area.c:157
+msgid "Attaching islands..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:580 ../vector/v.buffer2/main.c:673
+#: ../vector/v.buffer/main.c:644 ../vector/v.buffer/main.c:734
+msgid "Calculating centroids for areas..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:594 ../vector/v.buffer2/main.c:686
+#: ../vector/v.voronoi/dt_main.c:142 ../vector/v.buffer/main.c:663
+#: ../vector/v.buffer/main.c:750 ../vector/v.overlay/area_area.c:171
+#: ../vector/v.in.ogr/main.c:1065
+msgid "Cannot calculate area centroid"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:611 ../vector/v.buffer/main.c:686
+msgid "Generating list of boundaries to be deleted..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:644 ../vector/v.buffer/main.c:718
+msgid "Deleting boundaries..."
+msgstr ""
+
+#: ../vector/v.patch/main.c:69
+msgid "Create a new vector map layer by combining other vector map layers."
+msgstr ""
+
+#: ../vector/v.patch/main.c:80
+msgid ""
+"Name for output vector map where bounding boxes of input vector maps are "
+"written to"
+msgstr ""
+
+#: ../vector/v.patch/main.c:84
+msgid ""
+"Append files to existing file (overwriting existing files must be activated)"
+msgstr ""
+
+#: ../vector/v.patch/main.c:89
+msgid "Copy also attribute table"
+msgstr ""
+
+#: ../vector/v.patch/main.c:91
+msgid "Only the table of layer 1 is currently supported"
+msgstr ""
+
+#: ../vector/v.patch/main.c:189
+msgid "Missing table"
+msgstr ""
+
+#: ../vector/v.patch/main.c:193
+msgid "Key columns differ"
+msgstr ""
+
+#: ../vector/v.patch/main.c:199
+msgid "Number of columns differ"
+msgstr ""
+
+#: ../vector/v.patch/main.c:211
+msgid "Column names differ"
+msgstr ""
+
+#: ../vector/v.patch/main.c:219
+msgid "Column types differ"
+msgstr ""
+
+#: ../vector/v.patch/main.c:224
+msgid "Length of string columns differ"
+msgstr ""
+
+#: ../vector/v.patch/main.c:238
+msgid "Key column not found"
+msgstr ""
+
+#: ../vector/v.patch/main.c:245
+msgid "The output map is not 3D"
+msgstr ""
+
+#: ../vector/v.patch/main.c:298
+#, c-format
+msgid "Patching vector map <%s@%s>..."
+msgstr ""
+
+#: ../vector/v.patch/main.c:322
+#, c-format
+msgid "Error reading vector map <%s> - some data may not be correct"
+msgstr ""
+
+#: ../vector/v.patch/main.c:364
+#, c-format
+msgid "Building topology for vector map <%s>..."
+msgstr ""
+
+#: ../vector/v.patch/main.c:370
+msgid "Intersections at borders will have to be snapped"
+msgstr ""
+
+#: ../vector/v.patch/main.c:371
+msgid "Lines common between files will have to be edited"
+msgstr ""
+
+#: ../vector/v.patch/main.c:372
+msgid "The header information also may have to be edited"
+msgstr ""
+
+#: ../vector/v.patch/main.c:374
+#, c-format
+msgid "%d vector maps patched"
+msgstr ""
+
+#: ../vector/v.patch/main.c:397
+#, c-format
+msgid "Cannot open select cursor: '%s'"
+msgstr ""
+
+#: ../vector/v.patch/main.c:408
+msgid "Cannot fetch row"
+msgstr ""
+
+#: ../vector/v.patch/main.c:459
+msgid "Unknown column type"
+msgstr ""
+
+#: ../vector/v.patch/main.c:467
+#, c-format
+msgid "Cannot insert new record: '%s'"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:57
+msgid "vector, import, sites"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:59
+msgid "Converts a GRASS site_lists file into a vector map."
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:83
+#, c-format
+msgid "Site file <%s> not found"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:86
+#, c-format
+msgid "Unable to open site file <%s@%s>"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:89
+msgid "Unable to guess site_list format"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:92
+msgid "Failed to allocate site structure"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:94
+#, c-format
+msgid "Input format: dimension: %d strings: %d FP: %d"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:98
+msgid "Floating point category values, using sequential integer for category"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:101
+msgid "No category values, using sequential integer for category"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:183
+msgid "Transferring sites to vector point map..."
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:255
+#, c-format
+msgid "%d sites written."
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:97
+msgid "vector, network, salesman"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:99
+msgid "Creates a cycle connecting given nodes (Traveling salesman problem)."
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:101
+msgid ""
+"Note that TSP is NP-hard, heuristic algorithm is used by this module and "
+"created cycle may be sub optimal"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:119
+msgid "Node layer (used for cities)"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:125 ../vector/v.net.steiner/main.c:375
+msgid "Arcs' cost column (for both directions)"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:130
+msgid "Categories of points ('cities') on nodes (layer is specified by nlayer)"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:193
+#, c-format
+msgid "Number of cities: [%d]"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:195
+msgid "Not enough cities (< 2)"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:227
+#, c-format
+msgid "Destination node [%d] is unreachable from node [%d]"
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:110
+msgid "vector, geometry, topology"
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:111
+msgid "Builds polylines from lines or boundaries."
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:121
+msgid "Category number mode"
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:123
+msgid ""
+"no;Do not assign any category number to polyline;first;Assign category "
+"number of first line to polyline;multi;Assign multiple category numbers to "
+"polyline"
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:225
+#, c-format
+msgid "%d lines or boundaries found in vector map <%s@%s>"
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:227
+#, c-format
+msgid "%d polylines stored in vector map <%s@%s>"
+msgstr ""
+
+#: ../vector/v.net.path/main.c:42
+msgid "Finds shortest path on vector network."
+msgstr ""
+
+#: ../vector/v.net.path/main.c:65
+msgid ""
+"Name of file containing start and end points. If not given, read from stdin"
+msgstr ""
+
+#: ../vector/v.net.path/main.c:92
+msgid "Maximum distance to the network"
+msgstr ""
+
+#: ../vector/v.net.path/main.c:93
+msgid ""
+"If start/end are given as coordinates. If start/end point is outside this "
+"threshold, the path is not found and error message is printed. To speed up "
+"the process, keep this value as low as possible."
+msgstr ""
+
+#: ../vector/v.net.path/main.c:106
+msgid "Write output as original input segments, not each path as one line."
+msgstr ""
+
+#: ../vector/v.net.path/path.c:82
+#, c-format
+msgid "[%d] points without category (nfield: [%d])"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:149 ../vector/v.net.timetable/main.c:444
+#, c-format
+msgid "Wrong input format: %s"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:168 ../vector/v.net.path/path.c:186
+#, c-format
+msgid "No point with category [%d]"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:205
+#, c-format
+msgid "Point with category [%d] is not reachable from point with category [%d]"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:262
+#, c-format
+msgid "Point %f,%f is not reachable from point %f,%f"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:327
+#, c-format
+msgid "[%d] input format errors"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:329
+#, c-format
+msgid "[%d] points of given category missing"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:331
+#, c-format
+msgid "%d destination(s) unreachable (including points out of threshold)"
+msgstr ""
+
+#: ../vector/v.out.pov/main.c:210
+#, c-format
+msgid "%d features written"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:175
+msgid "Create points along input lines in new vector with 2 layers."
+msgstr ""
+
+#: ../vector/v.to.points/main.c:178 ../vector/v.lrs/v.lrs.segment/main.c:76
+#: ../vector/v.lrs/v.lrs.create/main.c:126
+#: ../vector/v.lrs/v.lrs.where/main.c:65
+#: ../vector/v.lrs/v.lrs.label/main.c:107
+msgid "Input vector map containing lines"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:182
+msgid "Output vector map where points will be written"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:194
+msgid "Write line nodes"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:198
+msgid "Write line vertices"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:202
+msgid "Interpolate points between line vertices"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:209
+msgid "Maximum distance between points in map units"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:213 ../vector/v.voronoi/vo_main.c:140
+#: ../vector/v.overlay/main.c:132 ../vector/v.select/args.c:80
+#: ../vector/v.in.ogr/main.c:218
+msgid "Do not create attribute table"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:229
+msgid "Use either -n or -v flag, not both"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:273 ../vector/v.generalize/misc.c:177
+#, c-format
+msgid "Unable to copy table <%s>"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:384
+#, c-format
+msgid "%d points written to output vector map"
+msgstr ""
+
+#: ../vector/v.label.sa/font.c:55
+#, c-format
+msgid "%s: Unable to read font definition file; use the default"
+msgstr ""
+
+#: ../vector/v.label.sa/font.c:61
+#, c-format
+msgid "%s: No font definition file"
+msgstr ""
+
+#: ../vector/v.label.sa/main.c:56
+msgid "Create optimally placed labels for vector map(s)"
+msgstr ""
+
+#: ../vector/v.label.sa/main.c:117
+msgid "Name of TrueType font (as listed in the fontcap)"
+msgstr ""
+
+#: ../vector/v.label.sa/main.c:130
+msgid "Icon size of point features (in map-units)"
+msgstr ""
+
+#: ../vector/v.label.sa/main.c:200
+msgid "Border width (only for ps.map output)"
+msgstr ""
+
+#: ../vector/v.label.sa/main.c:207
+msgid ""
+"Numeric column to give precedence in case of overlapping labels. The label "
+"with a smaller weight is hidden."
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:73
+#, c-format
+msgid "Cannot allocate %d bytes of memory"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:95
+#, c-format
+msgid "Unable to find font '%s'\n"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:97
+#, c-format
+msgid "Font '%s' is not a FreeType font\n"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:101
+msgid "Font file format is not supported by FreeType"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:103
+msgid "Font file can not be loaded"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:112
+msgid "Unable to set font size"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:133
+msgid "Cannot allocate more memory"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:223
+#, c-format
+msgid ""
+"Cannot load overlap weights. Column %s is not of numeric type in table <%s>"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:281
+#, c-format
+msgid "Cannot load glyph for '%c'"
+msgstr ""
+
+#: ../vector/v.clean/rmdac.c:61
+#, c-format
+msgid "Duplicate area centroids: %d"
+msgstr ""
+
+#: ../vector/v.clean/rmline.c:62
+#, c-format
+msgid "Lines / boundaries removed: %d"
+msgstr ""
+
+#: ../vector/v.clean/main.c:44
+msgid "Toolset for cleaning topology of vector map."
+msgstr ""
+
+#: ../vector/v.clean/main.c:53
+msgid "Name of output map where errors are written"
+msgstr ""
+
+#: ../vector/v.clean/main.c:64
+msgid "Cleaning tool"
+msgstr ""
+
+#: ../vector/v.clean/main.c:66
+msgid ""
+"break;break lines at each intersection;rmdupl;remove duplicate geometry "
+"features (pay attention to categories!);rmdangle;remove dangles, threshold "
+"ignored if < 0;chdangle;change the type of boundary dangle to line, "
+"threshold ignored if < 0, input line type is ignored;rmbridge;remove bridges "
+"connecting area and island or 2 islands;chbridge;change the type of bridges "
+"connecting area and island or 2 islands from boundary to line;snap;snap "
+"lines to vertex in threshold;rmdac;remove duplicate area centroids ('type' "
+"option ignored);bpol;break (topologically clean) polygons (imported from non "
+"topological format, like ShapeFile). Boundaries are broken on each point "
+"shared between 2 and more polygons where angles of segments are different;"
+"prune;remove vertices in threshold from lines and boundaries, boundary is "
+"pruned only if topology is not damaged (new intersection, changed attachment "
+"of centroid), first and last segment of the boundary is never changed;rmarea;"
+"remove small areas, the longest boundary with adjacent area is removed;"
+"rmline;remove all lines or boundaries of zero length, threshold is ignored;"
+"rmsa;remove small angles between lines at nodes"
+msgstr ""
+
+#: ../vector/v.clean/main.c:94
+msgid ""
+"Threshold in map units, one value for each tool (default: 0.0[,0.0,...])"
+msgstr ""
+
+#: ../vector/v.clean/main.c:100
+msgid "Don't build topology for the output vector"
+msgstr ""
+
+#: ../vector/v.clean/main.c:121
+msgid "You must select at least one tool"
+msgstr ""
+
+#: ../vector/v.clean/main.c:156
+msgid "Tool doesn't exist"
+msgstr ""
+
+#: ../vector/v.clean/main.c:176
+#, c-format
+msgid "Threshold for tool %d may not be > 0, set to 0"
+msgstr ""
+
+#: ../vector/v.clean/main.c:185
+msgid "Tool: Threshold"
+msgstr ""
+
+#: ../vector/v.clean/main.c:190
+msgid "Break"
+msgstr ""
+
+#: ../vector/v.clean/main.c:193
+msgid "Remove duplicates"
+msgstr ""
+
+#: ../vector/v.clean/main.c:196
+msgid "Remove dangles"
+msgstr ""
+
+#: ../vector/v.clean/main.c:199
+msgid "Change type of boundary dangles"
+msgstr ""
+
+#: ../vector/v.clean/main.c:203
+msgid "Remove bridges"
+msgstr ""
+
+#: ../vector/v.clean/main.c:206
+msgid "Change type of boundary bridges"
+msgstr ""
+
+#: ../vector/v.clean/main.c:210
+msgid "Snap vertices"
+msgstr ""
+
+#: ../vector/v.clean/main.c:213
+msgid "Remove duplicate area centroids"
+msgstr ""
+
+#: ../vector/v.clean/main.c:217
+msgid "Break polygons"
+msgstr ""
+
+#: ../vector/v.clean/main.c:220
+msgid "Prune"
+msgstr ""
+
+#: ../vector/v.clean/main.c:223
+msgid "Remove small areas"
+msgstr ""
+
+#: ../vector/v.clean/main.c:226
+msgid "Remove small angles at nodes"
+msgstr ""
+
+#: ../vector/v.clean/main.c:231
+msgid "Remove all lines or boundaries of zero length"
+msgstr ""
+
+#: ../vector/v.clean/main.c:273
+msgid "Copying vector lines..."
+msgstr ""
+
+#: ../vector/v.clean/main.c:295 ../vector/v.clean/main.c:305
+msgid "Rebuilding parts of topology..."
+msgstr ""
+
+#: ../vector/v.clean/main.c:313
+msgid "Tool: Break lines at intersections"
+msgstr ""
+
+#: ../vector/v.clean/main.c:317
+msgid "Tool: Remove duplicates"
+msgstr ""
+
+#: ../vector/v.clean/main.c:321
+msgid "Tool: Remove dangles"
+msgstr ""
+
+#: ../vector/v.clean/main.c:325
+msgid "Tool: Change type of boundary dangles"
+msgstr ""
+
+#: ../vector/v.clean/main.c:329
+msgid "Tool: Remove bridges"
+msgstr ""
+
+#: ../vector/v.clean/main.c:333
+msgid "Tool: Change type of boundary bridges"
+msgstr ""
+
+#: ../vector/v.clean/main.c:337
+msgid "Tool: Remove duplicate area centroids"
+msgstr ""
+
+#: ../vector/v.clean/main.c:341
+msgid "Tool: Snap line to vertex in threshold"
+msgstr ""
+
+#: ../vector/v.clean/main.c:345
+msgid "Tool: Break polygons"
+msgstr ""
+
+#: ../vector/v.clean/main.c:349
+msgid "Tool: Prune lines/boundaries"
+msgstr ""
+
+#: ../vector/v.clean/main.c:353
+msgid "Tool: Remove small areas"
+msgstr ""
+
+#: ../vector/v.clean/main.c:356
+#, c-format
+msgid "%d areas of total size %g removed"
+msgstr ""
+
+#: ../vector/v.clean/main.c:359
+msgid "Tool: Remove small angles at nodes"
+msgstr ""
+
+#: ../vector/v.clean/main.c:362
+#, c-format
+msgid "%d modifications done"
+msgstr ""
+
+#: ../vector/v.clean/main.c:365
+msgid "Tool: Remove all lines and boundaries of zero length"
+msgstr ""
+
+#: ../vector/v.clean/main.c:367
+#, c-format
+msgid "%d lines / boundaries removed"
+msgstr ""
+
+#: ../vector/v.clean/main.c:375
+msgid "Rebuilding topology for output vector map..."
+msgstr ""
+
+#: ../vector/v.clean/main.c:386
+msgid "Building topology for error vector map..."
+msgstr ""
+
+#: ../vector/v.clean/prune.c:217
+#, c-format
+msgid ""
+"\n"
+"%d vertices from input %d (vertices of given type) removed, i.e. %.2f %%"
+msgstr ""
+
+#: ../vector/v.clean/prune.c:221
+#, c-format
+msgid "%d boundaries not pruned because pruning would damage topology"
+msgstr ""
+
+#: ../vector/v.db.select/main.c:54
+msgid "Prints vector map attributes."
+msgstr ""
+
+#: ../vector/v.db.select/main.c:89
+msgid ""
+"Print minimal region extent of selected vector features instead of attributes"
+msgstr ""
+
+#: ../vector/v.db.select/main.c:141
+#, c-format
+msgid ""
+"Unable to open vector map <%s> at topology level. Flag '%c' requires "
+"topology level."
+msgstr ""
+
+#: ../vector/v.db.select/main.c:176
+msgid "Unable to open select cursor"
+msgstr ""
+
+#: ../vector/v.db.select/main.c:197 ../vector/v.reclass/main.c:247
+#, c-format
+msgid "Unable to fetch data from table <%s>"
+msgstr ""
+
+#: ../vector/v.db.select/main.c:243
+#, c-format
+msgid "Unable to get bounding box of area %d"
+msgstr ""
+
+#: ../vector/v.db.select/main.c:248
+#, c-format
+msgid "Unable to get bounding box of line %d"
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:121
+msgid ""
+"Creates a Voronoi diagram from an input vector map containing points or "
+"centroids."
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:136
+msgid "Output tessellation as a graph (lines), not areas"
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:179
+msgid "Reading sites..."
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:189
+msgid "Voronoi triangulation..."
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:271
+msgid "Writing sites to output..."
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:344 ../vector/v.extract/main.c:466
+msgid "No table"
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:359
+msgid "Cannot copy table"
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:415
+msgid "Output needs topological cleaning"
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:447
+msgid "Removing incorrect boundaries from output"
+msgstr ""
+
+#: ../vector/v.voronoi/dt_main.c:149
+msgid "Cannot calculate area centroid z coordinate"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:129
+msgid "Count points in areas, calculate statistics."
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:133
+msgid "Name of existing vector map with points"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:138
+msgid "Name of existing vector map with areas"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:150
+msgid "Layer number for points map"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:154
+msgid "Layer number for area map"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:170
+msgid "Method for aggregate statistics"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:177
+msgid "Column name of points map to use for statistics"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:178
+msgid "Column of points map must be numeric"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:185
+msgid "Column name to upload points count"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:187
+msgid ""
+"Column to hold points count, must be of type integer, will be created if not "
+"existing"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:194
+msgid "Column name to upload statistics"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:196
+msgid ""
+"Column to hold statistics, must be of type double, will be created if not "
+"existing"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:206
+msgid "Print output to stdout, do not update attribute table"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:207
+msgid "First column is always area category"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:261 ../vector/v.distance/main.c:306
+#, c-format
+msgid "Vector map <%s> is not in user mapset and cannot be updated"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:308 ../vector/v.vect.stats/main.c:384
+#, c-format
+msgid "Unable to open database <%s> with driver <%s>"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:312
+msgid "ccolumn is required to upload point counts"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:321
+msgid "ccolumn must be of type integer"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:334 ../vector/v.vect.stats/main.c:364
+#, c-format
+msgid "Unable to add column <%s>"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:340
+msgid "scolumn is required to upload point stats"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:351
+msgid "scolumn must be of type double"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:375
+msgid "collecting attributes from points vector..."
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:407
+msgid "column for points vector must be numeric"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:481
+msgid "creating spatial index"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:484
+msgid "Selecting points for each area..."
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:581
+#, c-format
+msgid "could not find area category %d"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:709 ../vector/v.distance/main.c:1151
+#: ../vector/v.what.rast/main.c:377
+#, c-format
+msgid "%d records updated"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:711 ../vector/v.distance/main.c:1153
+#: ../vector/v.what.rast/main.c:378
+#, c-format
+msgid "%d update errors"
+msgstr ""
+
+#: ../vector/v.univar/main.c:95
+msgid ""
+"Calculates univariate statistics for attribute. Variance and standard "
+"deviation is calculated only for points if specified."
+msgstr ""
+
+#: ../vector/v.univar/main.c:111
+msgid "Column name"
+msgstr ""
+
+#: ../vector/v.univar/main.c:136
+msgid "Calculate geometry distances instead of table data."
+msgstr ""
+
+#: ../vector/v.univar/main.c:144
+#, c-format
+msgid "The '-%c' flag is currently broken, please use v.distance instead."
+msgstr ""
+
+#: ../vector/v.univar/main.c:149
+#, c-format
+msgid ""
+"Required parameter <%s> not set:\n"
+"\t(%s)"
+msgstr ""
+
+#: ../vector/v.univar/main.c:175
+msgid ""
+"Incompatible vector type(s) specified, only number of features, minimum, "
+"maximum and range can be calculated"
+msgstr ""
+
+#: ../vector/v.univar/main.c:180
+msgid "Extended statistics is currently supported only for points/centroids"
+msgstr ""
+
+#: ../vector/v.univar/main.c:220
+#, c-format
+msgid "Unable select categories from table <%s>"
+msgstr ""
+
+#: ../vector/v.univar/main.c:311
+#, c-format
+msgid " Database connection not defined for layer <%s>"
+msgstr ""
+
+#: ../vector/v.univar/main.c:605
+msgid "Cannot sort the key/value array"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:86
+msgid ""
+"Surface interpolation from vector point data by Inverse Distance Squared "
+"Weighting."
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:95
+msgid "If set to 0, z coordinates are used (3D vector only)"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:98 ../vector/v.surf.idw/main.c:106
+msgid "Values"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:104
+msgid "Attribute table column with values to interpolate"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:105
+msgid "Required if layer > 0"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:122
+msgid ""
+"Power parameter; greater values assign greater influence to closer points"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:127
+msgid "Don't index points by raster cell"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:128
+msgid ""
+"Slower but uses less memory and includes points from outside region in the "
+"interpolation"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:147
+msgid "No attribute column specified"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:182
+msgid "No data points found"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:267
+#, c-format
+msgid "Interpolating raster map <%s> (%d rows, %d cols)... "
+msgstr ""
+
+#: ../vector/v.surf.idw/read_sites.c:86
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:225
+#, c-format
+msgid "No record for point (cat = %d)"
+msgstr ""
+
+#: ../vector/v.surf.idw/read_sites.c:102
+#, c-format
+msgid "%d points loaded"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:67
+#, c-format
+msgid "Performing 1 arg map function on map %s"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:78
+#, c-format
+msgid "Performing 2 arg map function on maps %s and %s"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:90
+#, c-format
+msgid "Performing map %s + %s"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:264
+msgid "Can't call bad map-function"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:276
+#, c-format
+msgid "Bad arguments to mapfunc %s (argc = %d)"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:300
+#, c-format
+msgid "No function defined to perform map %c map"
+msgstr ""
+
+#: ../vector/v.mapcalc/number.c:159
+msgid "Can't call bad num-function"
+msgstr ""
+
+#: ../vector/v.mapcalc/number.c:189
+#, c-format
+msgid "Bad arguments to numfunc %s"
+msgstr ""
+
+#: ../vector/v.mapcalc/number.c:213
+#, c-format
+msgid "No function defined to perform ``number %c number''"
+msgstr ""
+
+#: ../vector/v.mapcalc/number.c:216 ../vector/v.mapcalc/vector.c:304
+#, c-format
+msgid "No function defined to perform ``point %c point''"
+msgstr ""
+
+#: ../vector/v.mapcalc/any.c:116
+msgid "Can't call bad any-function"
+msgstr ""
+
+#: ../vector/v.mapcalc/any.c:128
+#, c-format
+msgid "Bad arguments to anyfunc %s (argc = %d)"
+msgstr ""
+
+#: ../vector/v.mapcalc/vector.c:244
+msgid "Can't call bad function"
+msgstr ""
+
+#: ../vector/v.mapcalc/vector.c:281
+#, c-format
+msgid "Bad arguments to pointfunc %s"
+msgstr ""
+
+#: ../vector/v.class/main.c:47
+msgid "Classifies attribute data, e.g. for thematic mapping"
+msgstr ""
+
+#: ../vector/v.class/main.c:58
+msgid "Column name or expression"
+msgstr ""
+
+#: ../vector/v.class/main.c:85
+msgid "Print only class breaks (without min and max)"
+msgstr ""
+
+#: ../vector/v.class/main.c:166
+msgid ""
+"The discontinuities algorithm indicates that some class breaks are not "
+"statistically significant at alpha=0.05. You are advised to reduce the "
+"number of classes."
+msgstr ""
+
+#: ../vector/v.class/main.c:193
+#, c-format
+msgid ""
+"\n"
+"Classification of %s into %i classes\n"
+msgstr ""
+
+#: ../vector/v.class/main.c:200
+#, c-format
+msgid "Lowest chi2 = %f\n"
+msgstr ""
+
+#: ../vector/v.class/main.c:206
+#, c-format
+msgid ""
+"%15s%15s%15s\n"
+"\n"
+msgstr ""
+
+#: ../vector/v.class/main.c:218
+#, c-format
+msgid ""
+"\n"
+"Note: Minimum of first class is including\n"
+"\n"
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:60
+msgid "Computes the shortest path between all pairs of nodes in the network."
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:77 ../vector/v.net.centrality/main.c:115
+msgid "Name of arc forward/both direction(s) cost column"
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:78 ../vector/v.net.allpairs/main.c:84
+#: ../vector/v.net.centrality/main.c:116 ../vector/v.net.centrality/main.c:122
+msgid "Cost"
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:83 ../vector/v.net.centrality/main.c:121
+msgid "Name of arc backward direction cost column"
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:93
+msgid "Add points on nodes without points"
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:209
+msgid "New points are excluded from shortest path calculations."
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:219 ../vector/v.net.centrality/main.c:311
+msgid "Writing data into the table..."
+msgstr ""
+
+#: ../vector/v.drape/main.c:166
+msgid "vector, geometry, sampling"
+msgstr ""
+
+#: ../vector/v.drape/main.c:168
+msgid "Converts vector map to 3D by sampling of elevation raster map."
+msgstr ""
+
+#: ../vector/v.drape/main.c:180
+msgid "Elevation raster map for height extraction"
+msgstr ""
+
+#: ../vector/v.drape/main.c:194
+msgid "Sampling method"
+msgstr ""
+
+#: ../vector/v.drape/main.c:199
+msgid "Scale sampled raster values"
+msgstr ""
+
+#: ../vector/v.drape/main.c:206
+msgid "Layer is only used for WHERE SQL statement"
+msgstr ""
+
+#: ../vector/v.drape/main.c:211
+msgid "Vector Z value for unknown height"
+msgstr ""
+
+#: ../vector/v.drape/main.c:213
+msgid "Will set Z to this value, if value from raster map can not be read"
+msgstr ""
+
+#: ../vector/v.drape/main.c:220 ../vector/v.extract/main.c:204
+msgid "Layer 0 not supported"
+msgstr ""
+
+#: ../vector/v.drape/main.c:305
+msgid "No features match Your query"
+msgstr ""
+
+#: ../vector/v.drape/main.c:407 ../vector/v.drape/main.c:417
+msgid "Due to error attribute data to new map are not transferred"
+msgstr ""
+
+#: ../vector/v.drape/main.c:425
+msgid ""
+"No features drapped. Check Your computational region and input raster map."
+msgstr ""
+
+#: ../vector/v.buffer/main.c:223 ../vector/v.overlay/main.c:551
+msgid "Rebuilding topology..."
+msgstr ""
+
+#: ../vector/v.buffer/main.c:254
+msgid "vector, geometry, buffer"
+msgstr ""
+
+#: ../vector/v.buffer/main.c:278
+msgid "Attribute column to use for buffer distances"
+msgstr ""
+
+#: ../vector/v.buffer/main.c:305
+msgid "Stop the process at a certain stage"
+msgstr ""
+
+#: ../vector/v.buffer/main.c:342
+#, c-format
+msgid "The tolerance was reset to %g (map units)"
+msgstr ""
+
+#: ../vector/v.buffer/main.c:432
+msgid "Lines buffers... "
+msgstr ""
+
+#: ../vector/v.buffer/main.c:492 ../vector/v.buffer/main.c:569
+#, c-format
+msgid "The tolerance was reset to %g (map units). [category %d]"
+msgstr ""
+
+#: ../vector/v.buffer/main.c:509
+msgid "Areas buffers... "
+msgstr ""
+
+#: ../vector/v.buffer/main.c:760 ../vector/v.overlay/area_area.c:372
+msgid "Attaching centroids..."
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:65
+msgid "Creates a GRASS vector map of a user-defined grid."
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:76
+msgid "Number of rows and columns in grid"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:85
+msgid "Where to place the grid"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:86
+msgid "region;current region;coor;use 'coor' and 'box' options"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:96
+msgid "Lower left easting and northing coordinates of map"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:104
+msgid "Width and height of boxes in grid"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:111
+msgid "Angle of rotation (in degrees counter-clockwise)"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:119
+msgid "Number of horizontal vertex points per grid cell"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:126
+msgid "Create grid of points instead of areas and centroids"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:131
+msgid "Quiet; No chatter"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:189
+msgid "'coor' option missing"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:192
+msgid "'box' option missing"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:196
+msgid "Invalid easting"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:199
+msgid "Invalid northing"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:203 ../vector/v.mkgrid/main.c:206
+msgid "Invalid distance"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:272
+msgid "Creating centroids..."
+msgstr ""
+
+#: ../vector/v.mkgrid/write_grid.c:42
+msgid "Writing out vector rows..."
+msgstr ""
+
+#: ../vector/v.mkgrid/write_grid.c:79
+msgid "Writing out vector columns..."
+msgstr ""
+
+#: ../vector/v.extract/main.c:91
+msgid "vector, extract"
+msgstr ""
+
+#: ../vector/v.extract/main.c:93
+msgid ""
+"Selects vector objects from an existing vector map and creates a new map "
+"containing only the selected objects."
+msgstr ""
+
+#: ../vector/v.extract/main.c:98
+msgid "Dissolve common boundaries (default is no)"
+msgstr ""
+
+#: ../vector/v.extract/main.c:102
+msgid "Do not copy table (see also 'new' parameter)"
+msgstr ""
+
+#: ../vector/v.extract/main.c:106 ../vector/v.edit/args.c:201
+#: ../vector/v.select/args.c:88
+msgid "Reverse selection"
+msgstr ""
+
+#: ../vector/v.extract/main.c:116
+msgid "Types to be extracted"
+msgstr ""
+
+#: ../vector/v.extract/main.c:122
+msgid ""
+"Layer number (if -1, all features in all layers of given type are extracted)"
+msgstr ""
+
+#: ../vector/v.extract/main.c:136
+msgid "Input text file with category numbers/number ranges to be extracted"
+msgstr ""
+
+#: ../vector/v.extract/main.c:137
+msgid "If '-' given reads from standard input"
+msgstr ""
+
+#: ../vector/v.extract/main.c:145
+msgid "Number of random categories matching vector objects to extract"
+msgstr ""
+
+#: ../vector/v.extract/main.c:147
+msgid "Number must be smaller than unique cat count in layer"
+msgstr ""
+
+#: ../vector/v.extract/main.c:156
+msgid "Enter -1 to keep original categories or the desired NEW category value"
+msgstr ""
+
+#: ../vector/v.extract/main.c:157
+msgid "If new >= 0, table is not copied"
+msgstr ""
+
+#: ../vector/v.extract/main.c:175
+msgid ""
+"List, file, where and random options are exclusive. Please specify only one "
+"of them"
+msgstr ""
+
+#: ../vector/v.extract/main.c:228
+#, c-format
+msgid "Category value in '%s' not valid"
+msgstr ""
+
+#: ../vector/v.extract/main.c:244
+#, c-format
+msgid "Process file <%s> for category numbers"
+msgstr ""
+
+#: ../vector/v.extract/main.c:249
+#, c-format
+msgid "Unable to open specified file <%s>"
+msgstr ""
+
+#: ../vector/v.extract/main.c:259
+#, c-format
+msgid "Ignored text entry: %s"
+msgstr ""
+
+#: ../vector/v.extract/main.c:297
+#, c-format
+msgid "Unable select records from table <%s>"
+msgstr ""
+
+#: ../vector/v.extract/main.c:298
+#, c-format
+msgid "%d categories loaded from table <%s>"
+msgstr ""
+
+#: ../vector/v.extract/main.c:313
+msgid ""
+"This map has no categories attached. Use v.category to attach categories to "
+"this vector map."
+msgstr ""
+
+#: ../vector/v.extract/main.c:319
+msgid "Please specify random number larger than 0"
+msgstr ""
+
+#: ../vector/v.extract/main.c:323
+#, c-format
+msgid ""
+"Random category count must be smaller than feature count. There are only %d "
+"features of type(s): %s"
+msgstr ""
+
+#: ../vector/v.extract/main.c:346
+#, c-format
+msgid ""
+"Random category count is larger or equal to uniq \"%s\" feature category "
+"count %d"
+msgstr ""
+
+#: ../vector/v.extract/main.c:383
+msgid "Extracting features..."
+msgstr ""
+
+#: ../vector/v.extract/main.c:428 ../vector/v.select/main.c:480
+#: ../vector/v.generalize/misc.c:127
+msgid "Writing attributes..."
+msgstr ""
+
+#: ../vector/v.extract/main.c:481 ../vector/v.in.db/main.c:225
+msgid "Unable to copy table"
+msgstr ""
+
+#: ../vector/v.extract/main.c:498
+msgid "Removing duplicate centroids..."
+msgstr ""
+
+#: ../vector/v.segment/main.c:54
+msgid "Creates points/segments from input vector lines and positions."
+msgstr ""
+
+#: ../vector/v.segment/main.c:57
+msgid "Name of input vector map containing lines"
+msgstr ""
+
+#: ../vector/v.segment/main.c:61
+msgid "Name for output vector map where segments will be written"
+msgstr ""
+
+#: ../vector/v.segment/main.c:66 ../vector/v.lrs/v.lrs.segment/main.c:85
+#: ../vector/v.lrs/v.lrs.create/main.c:145
+#: ../vector/v.lrs/v.lrs.where/main.c:74
+#: ../vector/v.lrs/v.lrs.label/main.c:116
+msgid "Line layer"
+msgstr ""
+
+#: ../vector/v.segment/main.c:71 ../vector/v.lrs/v.lrs.segment/main.c:112
+msgid "Name of file containing segment rules. If not given, read from stdin."
+msgstr ""
+
+#: ../vector/v.segment/main.c:137 ../vector/v.segment/main.c:177
+#, c-format
+msgid "Unable to read input: %s"
+msgstr ""
+
+#: ../vector/v.segment/main.c:147 ../vector/v.segment/main.c:186
+#, c-format
+msgid "Unable to find line of cat %d"
+msgstr ""
+
+#: ../vector/v.segment/main.c:157
+#, c-format
+msgid ""
+"Unable to get point on line: cat = %d offset = %f (line length = %.15g)\n"
+"%s"
+msgstr ""
+
+#: ../vector/v.segment/main.c:194
+msgid "End of segment > line length -> cut"
+msgstr ""
+
+#: ../vector/v.segment/main.c:200
+#, c-format
+msgid ""
+"Unable to make line segment: cat = %d : %f - %f (line length = %.15g)\n"
+"%s"
+msgstr ""
+
+#: ../vector/v.segment/main.c:222 ../vector/v.lrs/v.lrs.segment/main.c:331
+#, c-format
+msgid "Incorrect segment type: %s"
+msgstr ""
+
+#: ../vector/v.segment/main.c:227
+#, c-format
+msgid "%d points read from input"
+msgstr ""
+
+#: ../vector/v.segment/main.c:228
+#, c-format
+msgid "%d points written to output map (%d lost)"
+msgstr ""
+
+#: ../vector/v.segment/main.c:230
+#, c-format
+msgid "%d lines read from input"
+msgstr ""
+
+#: ../vector/v.segment/main.c:231
+#, c-format
+msgid "%d lines written to output map (%d lost)"
+msgstr ""
+
+#: ../vector/v.out.vtk/head.c:27
+msgid "writeVTKHeader: Writing VTK-Header"
+msgstr ""
+
+#: ../vector/v.out.vtk/writeVTK.c:188
+msgid ""
+"No coordinates to generate the output! Maybe an empty vector type chosen?"
+msgstr ""
+
+#: ../vector/v.out.vtk/writeVTK.c:623
+msgid "Cannot export attribute table fields for layer < 1. Skipping export"
+msgstr ""
+
+#: ../vector/v.out.vtk/writeVTK.c:631
+msgid "No attribute table found"
+msgstr ""
+
+#: ../vector/v.out.vtk/writeVTK.c:663
+msgid "No numerical attributes found. Skipping export"
+msgstr ""
+
+#: ../vector/v.out.vtk/writeVTK.c:717 ../vector/v.out.vtk/writeVTK.c:744
+#: ../vector/v.out.vtk/writeVTK.c:771 ../vector/v.out.vtk/writeVTK.c:797
+#, c-format
+msgid "Error reading value of attribute '%s'"
+msgstr ""
+
+#: ../vector/v.out.vtk/main.c:48
+msgid "Converts a GRASS binary vector map to VTK ASCII output."
+msgstr ""
+
+#: ../vector/v.out.vtk/main.c:58
+msgid "Path to resulting VTK file"
+msgstr ""
+
+#: ../vector/v.out.vtk/main.c:93
+msgid "Export numeric attribute table fields as VTK scalar variables"
+msgstr ""
+
+#: ../vector/v.out.vtk/main.c:188
+msgid "dp has to be from 0 to 8"
+msgstr ""
+
+#: ../vector/v.out.vtk/main.c:197
+msgid "Failed to interpret 'layer' parameter as an integer"
+msgstr ""
+
+#: ../vector/v.hull/main.c:141
+msgid "Simple planar hulls not implemented yet"
+msgstr ""
+
+#: ../vector/v.hull/main.c:275
+msgid "Produces a convex hull for a given vector map."
+msgstr ""
+
+#: ../vector/v.hull/main.c:279
+msgid "For vector lines reads their vertices"
+msgstr ""
+
+#: ../vector/v.hull/main.c:286
+msgid "Use all vector points (do not limit to current region)"
+msgstr ""
+
+#: ../vector/v.hull/main.c:291
+msgid "Create a 'flat' 2D hull even if the input is 3D points"
+msgstr ""
+
+#: ../vector/v.hull/main.c:314
+#, c-format
+msgid "Error loading vector points from <%s>"
+msgstr ""
+
+#: ../vector/v.hull/main.c:318
+msgid "Convex hull calculation requires at least three points. Exiting."
+msgstr ""
+
+#: ../vector/v.hull/main.c:320
+#, c-format
+msgid "%d points read from vector map <%s>"
+msgstr ""
+
+#: ../vector/v.to.rast3/main.c:45
+msgid "vector, volume, conversion"
+msgstr ""
+
+#: ../vector/v.to.rast3/main.c:46
+msgid ""
+"Converts a binary GRASS vector map (only points) layer into a 3D GRASS "
+"raster map layer."
+msgstr ""
+
+#: ../vector/v.to.rast3/main.c:59
+msgid "Column name (type must be numeric)"
+msgstr ""
+
+#: ../vector/v.to.rast3/main.c:108
+msgid "Unable to create output map"
+msgstr ""
+
+#: ../vector/v.to.rast3/main.c:150 ../vector/v.to.rast/do_lines.c:51
+#: ../vector/v.to.rast/do_lines.c:59
+#, c-format
+msgid "No record for line (cat = %d)"
+msgstr ""
+
+#: ../vector/v.to.rast3/main.c:162
+msgid "Unable to close new 3d raster map"
+msgstr ""
+
+#: ../vector/v.in.region/main.c:39
+msgid "Creates a vector polygon from the current region extent."
+msgstr ""
+
+#: ../vector/v.in.region/main.c:47
+msgid "Select type: line or area"
+msgstr ""
+
+#: ../vector/v.distance/main.c:116
+msgid ""
+"Finds the nearest element in vector map 'to' for elements in vector map "
+"'from'."
+msgstr ""
+
+#: ../vector/v.distance/main.c:120
+msgid "Name of existing vector map (from)"
+msgstr ""
+
+#: ../vector/v.distance/main.c:125
+msgid "Name of existing vector map (to)"
+msgstr ""
+
+#: ../vector/v.distance/main.c:132
+msgid "Feature type (from)"
+msgstr ""
+
+#: ../vector/v.distance/main.c:139
+msgid "Feature type (to)"
+msgstr ""
+
+#: ../vector/v.distance/main.c:144
+msgid "Layer number (from)"
+msgstr ""
+
+#: ../vector/v.distance/main.c:149
+msgid "Layer number (to)"
+msgstr ""
+
+#: ../vector/v.distance/main.c:155
+msgid "Name for output vector map containing lines connecting nearest elements"
+msgstr ""
+
+#: ../vector/v.distance/main.c:163
+msgid "Maximum distance or -1 for no limit"
+msgstr ""
+
+#: ../vector/v.distance/main.c:170
+msgid "Minimum distance or -1 for no limit"
+msgstr ""
+
+#: ../vector/v.distance/main.c:179
+msgid "Values describing the relation between two nearest features"
+msgstr ""
+
+#: ../vector/v.distance/main.c:181
+msgid ""
+"cat;category of the nearest feature;dist;minimum distance to nearest feature;"
+"to_x;x coordinate of the nearest point on the 'to' feature;to_y;y coordinate "
+"of the nearest point on the 'to' feature;to_along;distance to the nearest "
+"point on the 'to' feature along that linear feature;to_angle;angle along the "
+"nearest linear feature in the 'to' map, measured CCW from the +x axis, in "
+"radians, between -Pi and Pi inclusive;to_attr;attribute of nearest feature "
+"given by to_column option"
+msgstr ""
+
+#: ../vector/v.distance/main.c:202
+msgid ""
+"Column name(s) where values specified by 'upload' option will be uploaded"
+msgstr ""
+
+#: ../vector/v.distance/main.c:203
+msgid "From_map"
+msgstr ""
+
+#: ../vector/v.distance/main.c:208
+msgid "Column name of nearest feature (used with upload=to_attr)"
+msgstr ""
+
+#: ../vector/v.distance/main.c:214
+msgid "Name of table created for output when the distance to all flag is used"
+msgstr ""
+
+#: ../vector/v.distance/main.c:219
+msgid "Print output to stdout, don't update attribute table"
+msgstr ""
+
+#: ../vector/v.distance/main.c:221
+msgid "First column is always category of 'from' feature called from_cat"
+msgstr ""
+
+#: ../vector/v.distance/main.c:226
+msgid "Calculate distances to all features within the threshold"
+msgstr ""
+
+#: ../vector/v.distance/main.c:228
+msgid ""
+"Output is written to stdout but may be uploaded to a new table created by "
+"this module; multiple 'upload' options may be used."
+msgstr ""
+
+#: ../vector/v.distance/main.c:280
+msgid "to_column option missing"
+msgstr ""
+
+#: ../vector/v.distance/main.c:292
+msgid "Too many column names"
+msgstr ""
+
+#: ../vector/v.distance/main.c:299
+msgid "Not enough column names"
+msgstr ""
+
+#: ../vector/v.distance/main.c:387
+msgid "Unable to open default database"
+msgstr ""
+
+#: ../vector/v.distance/main.c:451
+msgid "Incompatible column types"
+msgstr ""
+
+#: ../vector/v.distance/main.c:524
+msgid "Finding nearest lines..."
+msgstr ""
+
+#: ../vector/v.distance/main.c:654
+msgid "Finding nearest areas..."
+msgstr ""
+
+#: ../vector/v.distance/main.c:726
+#, c-format
+msgid "More cats found in to_layer (area=%d)"
+msgstr ""
+
+#: ../vector/v.distance/main.c:872
+msgid "DATETIME type not yet supported, no attributes will be uploaded"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1123
+#, c-format
+msgid "%d categories with more than 1 feature in vector map <%s>"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1126
+#, c-format
+msgid "%d categories - no nearest feature found"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1135
+#, c-format
+msgid "%d distances calculated"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1136
+#, c-format
+msgid "%d records inserted"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1138
+#, c-format
+msgid "%d insert errors"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1142
+#, c-format
+msgid "%d categories read from the map"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1144
+#, c-format
+msgid "%d categories exist in the table"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1146
+#, c-format
+msgid "%d categories read from the map exist in the table"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1149
+#, c-format
+msgid "%d categories read from the map don't exist in the table"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:70
+msgid "Indices for quadrat counts of sites lists."
+msgstr ""
+
+#: ../vector/v.qcount/main.c:76
+msgid "Vector of points defining sample points"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:84
+msgid "Output quadrant centres, number of points is written as category"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:91
+msgid "Number of quadrats"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:98
+msgid "Quadrat radius"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:103
+msgid "Print results in shell script style"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:134
+msgid "Finding quadrats..."
+msgstr ""
+
+#: ../vector/v.qcount/main.c:139
+msgid "Counting sites in quadrats..."
+msgstr ""
+
+#: ../vector/v.net.visibility/main.c:46
+msgid "vector, path, visibility"
+msgstr ""
+
+#: ../vector/v.net.visibility/main.c:47
+msgid "Visibility graph construction."
+msgstr ""
+
+#: ../vector/v.net.visibility/main.c:59
+msgid "One or more coordinates"
+msgstr ""
+
+#: ../vector/v.net.visibility/main.c:65
+msgid "Add points after computing the vis graph"
+msgstr ""
+
+#: ../vector/v.net.visibility/main.c:98
+#, c-format
+msgid "Unable to copy elements from vector map <%s>"
+msgstr ""
+
+#: ../vector/v.net.visibility/main.c:104
+msgid "Lat-long projection"
+msgstr ""
+
+#: ../vector/v.to.db/report.c:187
+#, c-format
+msgid "%d categories read from vector map (layer %d)"
+msgstr ""
+
+#: ../vector/v.to.db/report.c:191
+#, c-format
+msgid "%d records selected from table (layer %d)"
+msgstr ""
+
+#: ../vector/v.to.db/report.c:194
+#, c-format
+msgid "%d categories read from vector map exist in selection from table"
+msgstr ""
+
+#: ../vector/v.to.db/report.c:197
+#, c-format
+msgid "%d categories read from vector map don't exist in selection from table"
+msgstr ""
+
+#: ../vector/v.to.db/report.c:199
+#, c-format
+msgid "%d records updated/inserted (layer %d)"
+msgstr ""
+
+#: ../vector/v.to.db/report.c:202
+#, c-format
+msgid "%d update/insert errors (layer %d)"
+msgstr ""
+
+#: ../vector/v.to.db/report.c:205
+#, c-format
+msgid "%d categories with more points (coordinates not loaded)"
+msgstr ""
+
+#: ../vector/v.to.db/lines.c:75 ../vector/v.to.db/query.c:23
+#: ../vector/v.to.rast/do_lines.c:35
+msgid "Reading features..."
+msgstr ""
+
+#: ../vector/v.to.db/main.c:34
+msgid "Populates database values from vector features."
+msgstr ""
+
+#: ../vector/v.to.db/main.c:48 ../vector/v.to.db/query.c:83
+#: ../vector/v.to.db/update.c:28 ../vector/v.to.db/update.c:32
+#, c-format
+msgid "Database connection not defined for layer %d. Use v.db.connect first."
+msgstr ""
+
+#: ../vector/v.to.db/areas.c:28 ../vector/v.to.rast/do_areas.c:33
+msgid "Reading areas..."
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:38
+msgid "For coor valid point/centroid, for length valid line/boundary"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:42
+msgid "Layer number (write to)"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:46
+msgid "Query layer number (read from)"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:56
+msgid "Value to upload"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:87
+msgid ""
+"mi(les),f(eet),me(ters),k(ilometers),a(cres),h(ectares),r(adians),d(egrees)"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:93
+msgid "Name of attribute column used for 'query' option"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:94
+msgid "E.g. 'cat', 'count(*)', 'sum(val)'"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:103
+msgid "Print only"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:108
+msgid "Only print SQL statements"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:114
+msgid "In print mode prints totals for options: length,area,count"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:153
+msgid "This option requires one column"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:158
+msgid "This option requires two columns"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:163
+msgid "This option requires at least two columns"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:169
+msgid "Parameter 'qcolumn' must be specified for 'option=query'"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:174
+msgid "The 'sides' option makes sense only for boundaries"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:177
+msgid "The 'sinuous' option makes sense only for lines"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:180
+msgid "The 'azimuth' option makes sense only for lines"
+msgstr ""
+
+#: ../vector/v.to.db/query.c:93
+msgid "Querying database... "
+msgstr ""
+
+#: ../vector/v.to.db/query.c:108
+#, c-format
+msgid ""
+"Query for category '0' (no category) was not executed because of too many "
+"(%d) query categories. All later reported values for cat 0 are not valid."
+msgstr ""
+
+#: ../vector/v.to.db/query.c:145
+#, c-format
+msgid "Multiple query results, output value set to NULL (category [%d])"
+msgstr ""
+
+#: ../vector/v.to.db/query.c:152
+msgid "Unable to fetch record"
+msgstr ""
+
+#: ../vector/v.to.db/update.c:82
+msgid "Updating database..."
+msgstr ""
+
+#: ../vector/v.to.db/update.c:115
+#, c-format
+msgid "More elements of category %d, nothing loaded to database"
+msgstr ""
+
+#: ../vector/v.to.db/update.c:213
+#, c-format
+msgid "Record (cat %d) already exists (not inserted)"
+msgstr ""
+
+#: ../vector/v.to.db/update.c:221 ../vector/v.to.3d/trans3.c:129
+#, c-format
+msgid "Record (cat %d) does not exist (not updated)"
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:66
+msgid "Converts DWG/DXF to GRASS vector map"
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:69
+msgid "Name of DWG or DXF file"
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:92
+msgid "Write circles as points (centre)"
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:100
+msgid "Use numeric type for attribute \"layer\""
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:120
+#, c-format
+msgid "Unable to initialize OpenDWG Toolkit, error: %d: %s."
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:123
+#, c-format
+msgid "%s Cannot open %s"
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:131
+#, c-format
+msgid "Unable to open input file <%s>. Error %d: %s"
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:266
+#, c-format
+msgid "%d elements skipped (layer name was not in list)"
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:269
+#, c-format
+msgid "%d elements processed"
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:37
+msgid "vector, transformation, 3D"
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:39
+msgid "Performs transformation of 2D vector features to 3D."
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:52
+#, c-format
+msgid "Either '%s' or '%s' parameter have to be used"
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:58
+#, c-format
+msgid "Parameters '%s' ignored"
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:63
+msgid "Attribute table required"
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:76
+#, c-format
+msgid "Vector map <%s> is 2D"
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:81
+#, c-format
+msgid "Vector map <%s> is 3D"
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:97 ../vector/v.to.3d/main.c:127
+#: ../vector/v.in.db/main.c:212
+msgid "Copying attributes..."
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:99 ../vector/v.to.3d/main.c:129
+msgid "Unable to copy attributes"
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:103
+msgid "Transforming features..."
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:123
+#, c-format
+msgid "%s failed"
+msgstr ""
+
+#: ../vector/v.to.3d/main.c:138
+#, c-format
+msgid "Vertical extent of vector map <%s>: B: %f T: %f"
+msgstr ""
+
+#: ../vector/v.to.3d/trans3.c:67 ../vector/v.to.3d/trans2.c:65
+msgid "Column must be numeric"
+msgstr ""
+
+#: ../vector/v.to.3d/trans3.c:100
+#, c-format
+msgid "Feature id %d has no category - skipping"
+msgstr ""
+
+#: ../vector/v.to.3d/trans3.c:103
+#, c-format
+msgid "Feature id %d has more categories. Using category %d."
+msgstr ""
+
+#: ../vector/v.to.3d/trans2.c:98
+msgid "Skipping feature without category"
+msgstr ""
+
+#: ../vector/v.to.3d/trans2.c:113
+#, c-format
+msgid "Unable to get height for feature category %d"
+msgstr ""
+
+#: ../vector/v.to.3d/args.c:11
+msgid "Reverse transformation; 3D vector features to 2D"
+msgstr ""
+
+#: ../vector/v.to.3d/args.c:15
+msgid "Do not copy table"
+msgstr ""
+
+#: ../vector/v.to.3d/args.c:30
+msgid "Fixed height for 3D vector features"
+msgstr ""
+
+#: ../vector/v.to.3d/args.c:31 ../vector/v.to.3d/args.c:34
+#: ../vector/v.to.3d/args.c:41
+msgid "Height"
+msgstr ""
+
+#: ../vector/v.to.3d/args.c:37
+msgid "Name of attribute column used for height"
+msgstr ""
+
+#: ../vector/v.to.3d/args.c:39
+msgid "Can be used for reverse transformation, to store height of points"
+msgstr ""
+
+#: ../vector/v.overlay/line_area.c:69 ../vector/v.overlay/area_area.c:110
+msgid "Breaking lines..."
+msgstr ""
+
+#: ../vector/v.overlay/line_area.c:71 ../vector/v.overlay/area_area.c:153
+msgid "Merging lines..."
+msgstr ""
+
+#: ../vector/v.overlay/line_area.c:83
+msgid "Selecting lines..."
+msgstr ""
+
+#: ../vector/v.overlay/line_area.c:162 ../vector/v.overlay/line_area.c:190
+#: ../vector/v.overlay/area_area.c:208 ../vector/v.overlay/area_area.c:290
+#: ../vector/v.overlay/area_area.c:318
+msgid "Attribute not found"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:61
+msgid "Overlays two vector maps."
+msgstr ""
+
+#: ../vector/v.overlay/main.c:64 ../vector/v.select/args.c:10
+msgid "Name of input vector map (A)"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:68 ../vector/v.select/args.c:14
+msgid "Feature type (vector map A)"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:74 ../vector/v.select/args.c:19
+msgid "Layer number (vector map A)"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:78 ../vector/v.select/args.c:24
+msgid "Name of input vector map (B)"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:82 ../vector/v.select/args.c:28
+msgid "Feature type (vector map B)"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:88 ../vector/v.select/args.c:33
+msgid "Layer number (vector map B)"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:100
+msgid "Operator defines features written to output vector map"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:103
+msgid ""
+"Feature is written to output if the result of operation 'ainput operator "
+"binput' is true. Input feature is considered to be true, if category of "
+"given layer is defined."
+msgstr ""
+
+#: ../vector/v.overlay/main.c:108
+msgid ""
+"and;also known as 'intersection' in GIS;or;also known as 'union' in GIS "
+"(only for atype=area);not;features from ainput not overlayed by features "
+"from binput;xor;features from either ainput or binput but not those from "
+"ainput overlayed by binput (only for atype=area)"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:119
+msgid "Output layer for new category, ainput and binput"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:120
+msgid "If 0 or not given, the category is not written"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:125 ../vector/v.in.ogr/main.c:178
+msgid "Snapping threshold for boundaries"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:126
+msgid "Disable snapping with snap <= 0"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:160
+#, c-format
+msgid "Unknown operator '%s'"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:165
+#, c-format
+msgid "Operator '%s' is not supported for type line"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:220
+#, c-format
+msgid "Copying vector objects from vector map <%s>..."
+msgstr ""
+
+#: ../vector/v.overlay/main.c:293
+#, c-format
+msgid "No %s features found in vector map <%s>. Verify '%s' parameter."
+msgstr ""
+
+#: ../vector/v.overlay/main.c:327
+msgid "Collecting input attributes..."
+msgstr ""
+
+#: ../vector/v.overlay/main.c:413
+#, c-format
+msgid "Unknown column type '%s' of column '%s'"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:478
+#, c-format
+msgid "Unknown column type '%s' of column '%s', values lost"
+msgstr ""
+
+#: ../vector/v.overlay/area_area.c:54
+#, c-format
+msgid "Snapping boundaries with %g ..."
+msgstr ""
+
+#: ../vector/v.overlay/area_area.c:102
+#, c-format
+msgid "%d boundaries snapped"
+msgstr ""
+
+#: ../vector/v.overlay/area_area.c:117
+msgid "Cleaning boundaries at nodes..."
+msgstr ""
+
+#: ../vector/v.overlay/area_area.c:181
+#, c-format
+msgid "Querying vector map <%s>..."
+msgstr ""
+
+#: ../vector/v.overlay/area_area.c:218
+msgid "Writing centroids..."
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:46
+msgid "Creates parallel line to input vector lines."
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:58
+msgid "Offset along major axis in map units"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:66
+msgid "Offset along minor axis in map units"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:83
+msgid "Side"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:85
+msgid ""
+"left;Parallel line is on the left;right;Parallel line is on the right;both;"
+"Parallel lines on both sides"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:95
+msgid "Tolerance of arc polylines in map units"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:99
+msgid "Make outside corners round"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:103
+msgid "Create buffer-like parallel lines"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:58
+msgid "vector, network, flow"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:60
+msgid "Computes the maximum flow between two sets of nodes in the network."
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:71
+msgid "Name for output vector map containing a minimum cut"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:77
+msgid "Name of arc forward/both direction(s) capacity column"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:82
+msgid "Name of arc backward direction capacity column"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:86
+msgid "Source layer number or name"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:91
+msgid "Source category values"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:97
+msgid "Source WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:102
+msgid "Sink layer number or name"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:103 ../vector/v.net.flow/main.c:108
+#: ../vector/v.net.flow/main.c:114
+msgid "Sink"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:107
+msgid "Sink category values"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:113
+msgid "Sink WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:199
+msgid "No sources"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:202
+msgid "No sinks"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:224
+msgid "Writing the output..."
+msgstr ""
+
+#: ../vector/v.what/what.c:164
+#, c-format
+msgid ""
+"Id: %d\n"
+"Type: %s\n"
+"Left: %d\n"
+"Right: %d\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:187
+#, c-format
+msgid ""
+"Node[%d]=%d\n"
+"Number_lines=%d\n"
+"Coordinates=%.6f,%.6f,%.6f\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:192
+#, c-format
+msgid ""
+"Node[%d]: %d\n"
+"Number of lines: %d\n"
+"Coordinates: %.6f, %.6f, %.6f\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:206
+#, c-format
+msgid ""
+"Id: %5d\n"
+"Angle: %.8f\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:221
+#, c-format
+msgid "Type: %s"
+msgstr ""
+
+#: ../vector/v.what/what.c:222
+#, c-format
+msgid "Id: %d\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:266
+#, c-format
+msgid ""
+"Line height min: %f\n"
+"Line height max: %f\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:280
+#, c-format
+msgid ""
+"Type: Area\n"
+"Area height: %f\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:288
+#, c-format
+msgid "Type: Area\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:310
+#, c-format
+msgid ""
+"Area: %d\n"
+"Number of isles: %d\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:320
+#, c-format
+msgid "Isle[%d]: %d\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:333
+#, c-format
+msgid "Island: %d In area: %d\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:346 ../vector/v.what/what.c:353
+#, c-format
+msgid ""
+"Sq Meters: %.3f\n"
+"Hectares: %.3f\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:348 ../vector/v.what/what.c:356
+#, c-format
+msgid ""
+"Acres: %.3f\n"
+"Sq Miles: %.4f\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:379
+#, c-format
+msgid ""
+"Layer: %d\n"
+"Category: %d\n"
+msgstr ""
+
+#: ../vector/v.what/what.c:393
+#, c-format
+msgid ""
+"\n"
+"Driver: %s\n"
+"Database: %s\n"
+"Table: %s\n"
+"Key column: %s\n"
+msgstr ""
+
+#: ../vector/v.what/main.c:56
+msgid "vector, querying"
+msgstr ""
+
+#: ../vector/v.what/main.c:57
+msgid "Queries a vector map layer at given locations."
+msgstr ""
+
+#: ../vector/v.what/main.c:70
+msgid "If not given reads from standard input"
+msgstr ""
+
+#: ../vector/v.what/main.c:77
+msgid "Query threshold distance"
+msgstr ""
+
+#: ../vector/v.what/main.c:85
+msgid "Print attribute information"
+msgstr ""
+
+#: ../vector/v.what/main.c:159
+#, c-format
+msgid "You must build topology on vector map <%s>"
+msgstr ""
+
+#: ../vector/v.what/main.c:178
+#, c-format
+msgid "Unknown input format, skipping: '%s'"
+msgstr ""
+
+#: ../vector/v.external/main.c:58
+msgid "vector, external, import"
+msgstr ""
+
+#: ../vector/v.external/main.c:60
+msgid "Creates a new vector as a read-only link to OGR layer."
+msgstr ""
+
+#: ../vector/v.external/main.c:75
+msgid "Output vector. If not given, available layers are printed only."
+msgstr ""
+
+#: ../vector/v.external/main.c:83
+msgid ""
+"OGR layer name. If not given, available layers are printed only. Examples:\n"
+"\t\tESRI Shapefile: shapefile name\n"
+"\t\tMapInfo File: mapinfo file name"
+msgstr ""
+
+#: ../vector/v.external/main.c:91
+msgid "Output vector name was not specified"
+msgstr ""
+
+#: ../vector/v.external/main.c:96
+msgid "Cannot open data source"
+msgstr ""
+
+#: ../vector/v.external/main.c:128 ../vector/v.in.ogr/main.c:370
+#, c-format
+msgid "Layer <%s> not available"
+msgstr ""
+
+#: ../vector/v.normal/main.c:80
+msgid "Tests for normality for points."
+msgstr ""
+
+#: ../vector/v.normal/main.c:223
+msgid "Doing log transformation"
+msgstr ""
+
+#: ../vector/v.edit/snap.c:111 ../vector/v.edit/a2b.c:328
+#, c-format
+msgid "Unable to rewrite line %d"
+msgstr ""
+
+#: ../vector/v.edit/main.c:56
+msgid "vector, editing, geometry"
+msgstr ""
+
+#: ../vector/v.edit/main.c:57
+msgid ""
+"Edits a vector map, allows adding, deleting and modifying selected vector "
+"features."
+msgstr ""
+
+#: ../vector/v.edit/main.c:66
+#, c-format
+msgid "Unable to get category list <%s>"
+msgstr ""
+
+#: ../vector/v.edit/main.c:94 ../vector/v.in.ogr/main.c:345
+#, c-format
+msgid "Vector map <%s> already exists"
+msgstr ""
+
+#: ../vector/v.edit/main.c:99
+msgid "Creating new DB connection based on default mapset settings..."
+msgstr ""
+
+#: ../vector/v.edit/main.c:154
+#, c-format
+msgid ""
+"Unable to open vector map <%s> as the background map. It is given as vector "
+"map to be edited."
+msgstr ""
+
+#: ../vector/v.edit/main.c:169
+#, c-format
+msgid "Background vector map <%s> registered"
+msgstr ""
+
+#: ../vector/v.edit/main.c:209
+msgid "Selecting features..."
+msgstr ""
+
+#: ../vector/v.edit/main.c:221
+msgid "No features selected, nothing to edit"
+msgstr ""
+
+#: ../vector/v.edit/main.c:229
+#, c-format
+msgid ""
+"Vector map <%s> is not 3D. Tool '%s' requires 3D vector map. Please convert "
+"the vector map to 3D using e.g. %s."
+msgstr ""
+
+#: ../vector/v.edit/main.c:267
+#, c-format
+msgid "%d features added"
+msgstr ""
+
+#: ../vector/v.edit/main.c:269 ../vector/v.edit/main.c:290
+#: ../vector/v.edit/main.c:298 ../vector/v.edit/main.c:323
+#: ../vector/v.edit/main.c:360
+#, c-format
+msgid "Threshold value for snapping is %.2f"
+msgstr ""
+
+#: ../vector/v.edit/main.c:278
+#, c-format
+msgid "%d boundaries closed"
+msgstr ""
+
+#: ../vector/v.edit/main.c:285
+#, c-format
+msgid "%d features deleted"
+msgstr ""
+
+#: ../vector/v.edit/main.c:293
+#, c-format
+msgid "%d features moved"
+msgstr ""
+
+#: ../vector/v.edit/main.c:302
+#, c-format
+msgid "%d vertices moved"
+msgstr ""
+
+#: ../vector/v.edit/main.c:306
+#, c-format
+msgid "%d vertices added"
+msgstr ""
+
+#: ../vector/v.edit/main.c:310
+#, c-format
+msgid "%d vertices removed"
+msgstr ""
+
+#: ../vector/v.edit/main.c:320
+#, c-format
+msgid "%d lines broken"
+msgstr ""
+
+#: ../vector/v.edit/main.c:326
+#, c-format
+msgid "%d lines connected"
+msgstr ""
+
+#: ../vector/v.edit/main.c:330
+#, c-format
+msgid "%d lines merged"
+msgstr ""
+
+#: ../vector/v.edit/main.c:338 ../vector/v.edit/main.c:342
+#, c-format
+msgid "%d features modified"
+msgstr ""
+
+#: ../vector/v.edit/main.c:347
+#, c-format
+msgid ""
+"Multiple background maps were given. Selected features will be copied only "
+"from vector map <%s>."
+msgstr ""
+
+#: ../vector/v.edit/main.c:357
+#, c-format
+msgid "%d features copied"
+msgstr ""
+
+#: ../vector/v.edit/main.c:366
+#, c-format
+msgid "%d lines flipped"
+msgstr ""
+
+#: ../vector/v.edit/main.c:386
+#, c-format
+msgid "%d lines labeled"
+msgstr ""
+
+#: ../vector/v.edit/main.c:393
+#, c-format
+msgid "%d features converted"
+msgstr ""
+
+#: ../vector/v.edit/main.c:396
+msgid "No feature modified"
+msgstr ""
+
+#: ../vector/v.edit/main.c:401
+msgid "Operation not implemented"
+msgstr ""
+
+#: ../vector/v.edit/select.c:73
+#, c-format
+msgid "Threshold value for coordinates is %.2f"
+msgstr ""
+
+#: ../vector/v.edit/select.c:160
+#, c-format
+msgid "Threshold value for querying is %.2f"
+msgstr ""
+
+#: ../vector/v.edit/select.c:176
+#, c-format
+msgid "%d of %d features selected from vector map <%s>"
+msgstr ""
+
+#: ../vector/v.edit/select.c:501
+msgid "Layer must be > 0 for 'where'"
+msgstr ""
+
+#: ../vector/v.edit/args.c:38
+msgid "Name of vector map to edit"
+msgstr ""
+
+#: ../vector/v.edit/args.c:54
+msgid "Tool"
+msgstr ""
+
+#: ../vector/v.edit/args.c:55
+msgid ""
+"create;Create new (empty) vector map;add;Add new features to existing vector "
+"map;delete;Delete selected features from vector map;move;Move selected "
+"features in vector map;vertexmove;Move vertex of selected vector lines;"
+"vertexdel;Remove vertex from selected vector lines;vertexadd;Add new vertex "
+"to selected vector lines;merge;Merge selected vector lines;break;Break/split "
+"vector lines;select;Select lines and print their ID's;catadd;Set new "
+"categories to selected vector features for defined layer;catdel;Delete "
+"categories from selected vector features for defined layer;copy;Copy "
+"selected features;snap;Snap vector features in given threshold;flip;Flip "
+"direction of selected vector lines;connect;Connect two lines;zbulk;Z bulk-"
+"labeling (automated assignment of z coordinate to vector lines);chtype;"
+"Change feature type (point<->centroid, line<->boundary)"
+msgstr ""
+
+#: ../vector/v.edit/args.c:100
+msgid "ASCII file to be converted to binary vector map"
+msgstr ""
+
+#: ../vector/v.edit/args.c:102
+msgid "If not given (or \"-\") reads from standard input"
+msgstr ""
+
+#: ../vector/v.edit/args.c:112
+msgid "Difference in x,y direction for moving feature or vertex"
+msgstr ""
+
+#: ../vector/v.edit/args.c:119
+msgid "Threshold distance (coords,snap,query)"
+msgstr ""
+
+#: ../vector/v.edit/args.c:121
+msgid "'-1' for threshold based on the current resolution settings"
+msgstr ""
+
+#: ../vector/v.edit/args.c:137
+msgid "List of point coordinates"
+msgstr ""
+
+#: ../vector/v.edit/args.c:146
+msgid "Bounding box for selecting features"
+msgstr ""
+
+#: ../vector/v.edit/args.c:155
+msgid "Polygon for selecting features"
+msgstr ""
+
+#: ../vector/v.edit/args.c:165
+msgid "Query tool"
+msgstr ""
+
+#: ../vector/v.edit/args.c:167
+msgid "For 'shorter' use negative threshold value, positive value for 'longer'"
+msgstr ""
+
+#: ../vector/v.edit/args.c:170
+msgid ""
+"length;Select only lines or boundaries shorter/longer than threshold "
+"distance;dangle;Select dangles shorter/longer than threshold distance"
+msgstr ""
+
+#: ../vector/v.edit/args.c:178
+msgid "Name of background vector map(s)"
+msgstr ""
+
+#: ../vector/v.edit/args.c:185
+msgid ""
+"Snap added or modified features in the given threshold to the nearest "
+"existing feature"
+msgstr ""
+
+#: ../vector/v.edit/args.c:187
+msgid ""
+"no;Not apply snapping;node;Snap only to node;vertex;Allow snapping also to "
+"vertex"
+msgstr ""
+
+#: ../vector/v.edit/args.c:195
+msgid "Starting value and step for z bulk-labeling"
+msgstr ""
+
+#: ../vector/v.edit/args.c:196
+msgid "Pair: value,step (e.g. 1100,10)"
+msgstr ""
+
+#: ../vector/v.edit/args.c:207
+msgid "Close added boundaries (using threshold distance)"
+msgstr ""
+
+#: ../vector/v.edit/args.c:211
+msgid "Do not expect header of input data"
+msgstr ""
+
+#: ../vector/v.edit/args.c:221
+msgid "Modify only first found feature in bounding box"
+msgstr ""
+
+#: ../vector/v.edit/args.c:233
+msgid "Polygon must have at least 3 coordinate pairs"
+msgstr ""
+
+#: ../vector/v.edit/args.c:294
+#, c-format
+msgid "Operation '%s' not implemented"
+msgstr ""
+
+#: ../vector/v.edit/args.c:303
+#, c-format
+msgid "At least one option from %s must be specified"
+msgstr ""
+
+#: ../vector/v.edit/args.c:309 ../vector/v.edit/args.c:318
+#: ../vector/v.edit/args.c:325 ../vector/v.edit/args.c:332
+#: ../vector/v.edit/args.c:336
+#, c-format
+msgid "Tool %s requires option %s"
+msgstr ""
+
+#: ../vector/v.edit/a2b.c:85 ../vector/v.edit/a2b.c:123
+#: ../vector/v.edit/a2b.c:147
+#, c-format
+msgid "Error reading ASCII file: '%s'"
+msgstr ""
+
+#: ../vector/v.edit/a2b.c:178
+msgid "End of ascii file reached before end of categories"
+msgstr ""
+
+#: ../vector/v.edit/a2b.c:189
+#, c-format
+msgid "Error reading categories: '%s'"
+msgstr ""
+
+#: ../vector/v.edit/a2b.c:236
+#, c-format
+msgid "Unexpected data in vector head: '%s'"
+msgstr ""
+
+#: ../vector/v.edit/a2b.c:270
+#, c-format
+msgid "Unknown keyword '%s' in vector head"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:61
+msgid "vector, network, allocation"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:63
+msgid "Allocate subnets for nearest centres (direction from centre)."
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:65
+msgid ""
+"Centre node must be opened (costs >= 0). Costs of centre node are used in "
+"calculation"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:92 ../vector/v.net.iso/main.c:99
+msgid "Arc forward/both direction(s) cost column (number)"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:98 ../vector/v.net.iso/main.c:103
+msgid "Arc backward direction cost column (number)"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:104 ../vector/v.net.iso/main.c:107
+msgid "Node cost column (number)"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:110
+msgid ""
+"Categories of centres (points on nodes) to which net will be allocated, "
+"layer for this categories is given by nlayer option"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:186
+#, c-format
+msgid "Number of centres: [%d] (nlayer: [%d])"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:189 ../vector/v.net.iso/main.c:227
+msgid "Not enough centres for selected nlayer. Nothing will be allocated."
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:200
+msgid "Calculating costs from centres ..."
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:340 ../vector/v.net.alloc/main.c:351
+#: ../vector/v.net.iso/main.c:508
+msgid "Cannot get line segment, segment out of line"
+msgstr ""
+
+#: ../vector/v.net.spanningtree/main.c:46
+msgid "vector, network, spanning tree"
+msgstr ""
+
+#: ../vector/v.net.spanningtree/main.c:48
+msgid "Computes minimum spanning tree for the network."
+msgstr ""
+
+#: ../vector/v.net.spanningtree/main.c:59
+msgid "Name of Arc cost column"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:58
+#, c-format
+msgid "Init costs from node %d"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:345
+msgid "vector, network, steiner tree"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:347
+msgid "Create Steiner tree for the network and given terminals"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:349
+msgid ""
+"Note that 'Minimum Steiner Tree' problem is NP-hard and heuristic algorithm "
+"is used in this module so the result may be sub optimal"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:369
+msgid "Node layer (used for terminals)"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:381
+msgid "Categories of points on terminals (layer is specified by nlayer)"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:389
+msgid "Number of steiner points (-1 for all possible)"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:453
+msgid "Not enough terminals (< 2)"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:459
+msgid "Requested number of Steiner points > than possible"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:511
+#, c-format
+msgid "Terminal at node [%d] cannot be connected to terminal at node [%d]"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:527
+#, c-format
+msgid ""
+"[%d] (not reachable) nodes removed from list of Steiner point candidates"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:532
+#, c-format
+msgid "MST costs = %f"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:538
+#, c-format
+msgid "Search for [%d]. Steiner point"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:559
+#, c-format
+msgid "Steiner point at node [%d] was added to terminals (MST costs = %f)"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:571
+msgid "No Steiner point found -> leaving cycle"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:72
+msgid "Splits net by cost isolines."
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:73
+msgid "vector, network, isolines"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:75
+msgid ""
+"Splits net to bands between cost isolines (direction from centre). Centre "
+"node must be opened (costs >= 0). Costs of centre node are used in "
+"calculation."
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:113
+msgid ""
+"Categories of centres (points on nodes) to which net will be allocated. "
+"Layer for this categories is given by nlayer option."
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:122
+msgid "Costs for isolines"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:159
+#, c-format
+msgid "Wrong iso cost: %f"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:162
+#, c-format
+msgid "Iso cost: %f less than previous"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:164
+#, c-format
+msgid "Iso cost %d: %f"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:171
+msgid "Not enough costs, everything reachable falls to first band"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:205
+msgid "Centre at closed node (costs = -1) ignored"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:224
+#, c-format
+msgid "Number of centres: %d (nlayer %d)"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:247
+#, c-format
+msgid "Calculating costs from centre %d..."
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:81
+msgid "vector, raster, attribute table"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:83
+msgid "Uploads raster values at positions of vector points to the table."
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:88
+msgid "Name of input vector points map for which to edit attribute table"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:92
+msgid "Name of existing raster map to be queried"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:101
+msgid "Column name (will be updated by raster values)"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:160 ../vector/v.to.rast/vect2rast.c:64
+#: ../vector/v.to.rast/support.c:315 ../vector/v.to.rast/support.c:467
+#, c-format
+msgid "Column <%s> not found"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:166
+msgid "Raster type is integer and column type is float"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:169
+msgid "Raster type is float and column type is integer, some data lost!!"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:249
+#, c-format
+msgid "%d points outside current region were skipped"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:253
+#, c-format
+msgid "%d points without category were skipped"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:307
+#, c-format
+msgid "More points (%d) of category %d, value set to 'NULL'"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:372
+#, c-format
+msgid "%d categories loaded from table"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:373
+#, c-format
+msgid "%d categories loaded from vector"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:374
+#, c-format
+msgid "%d categories from vector missing in table"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:375
+#, c-format
+msgid "%d duplicate categories in vector"
+msgstr ""
+
+#: ../vector/v.kcv/main.c:78
+msgid "Randomly partition points into test/train sets."
+msgstr ""
+
+#: ../vector/v.kcv/main.c:87
+msgid "Number of partitions"
+msgstr ""
+
+#: ../vector/v.kcv/main.c:97
+msgid "Name for new column to which partition number is written"
+msgstr ""
+
+#: ../vector/v.kcv/main.c:101
+msgid "Use drand48()"
+msgstr ""
+
+#: ../vector/v.kcv/main.c:174
+#, c-format
+msgid "Unable to get layer info for vector map <%s>"
+msgstr ""
+
+#: ../vector/v.kcv/main.c:198
+#, c-format
+msgid "Cannot alter table: %s"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:52
+msgid "vector, import, database, points"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:54
+msgid ""
+"Creates new vector (points) map from database table containing coordinates."
+msgstr ""
+
+#: ../vector/v.in.db/main.c:58
+msgid "Input table name"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:72
+msgid "Name of column containing x coordinate"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:77
+msgid "Name of column containing y coordinate"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:81
+msgid "Name of column containing z coordinate"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:86
+msgid "Name of column containing category number"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:87 ../vector/v.db.connect/main.c:73
+msgid "Must refer to an integer column"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:130
+#, c-format
+msgid ""
+"Output vector map, table <%s> (driver: <%s>, database: <%s>) already exists"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:141 ../vector/v.db.connect/main.c:290
+msgid "Data type of key column must be integer"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:173
+msgid "Writing features..."
+msgstr ""
+
+#: ../vector/v.in.db/main.c:180
+msgid "Key column must be integer"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:188
+msgid "x/y/z column must be integer or double"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:235
+#, c-format
+msgid "%d points written to vector map."
+msgstr ""
+
+#: ../vector/v.select/main.c:52
+msgid "vector, spatial query"
+msgstr ""
+
+#: ../vector/v.select/main.c:54
+msgid ""
+"Selects features from vector map (A) by features from other vector map (B)."
+msgstr ""
+
+#: ../vector/v.select/main.c:87
+msgid "Unknown operator"
+msgstr ""
+
+#: ../vector/v.select/main.c:124
+msgid "Output from v.select"
+msgstr ""
+
+#: ../vector/v.select/main.c:172
+#, c-format
+msgid "Unable to read line id %d from vector map <%s>"
+msgstr ""
+
+#: ../vector/v.select/main.c:278
+msgid "Processing areas..."
+msgstr ""
+
+#: ../vector/v.select/main.c:301
+#, c-format
+msgid "Unable to read area id %d from vector map <%s>"
+msgstr ""
+
+#: ../vector/v.select/main.c:446
+msgid "Writing selected features..."
+msgstr ""
+
+#: ../vector/v.select/main.c:512
+#, c-format
+msgid "Layer %d - no table"
+msgstr ""
+
+#: ../vector/v.select/main.c:527
+#, c-format
+msgid "Layer %d - unable to copy table"
+msgstr ""
+
+#: ../vector/v.select/main.c:542
+#, c-format
+msgid "%d features without category skipped"
+msgstr ""
+
+#: ../vector/v.select/main.c:545
+#, c-format
+msgid "%d features written to output."
+msgstr ""
+
+#: ../vector/v.select/args.c:45
+msgid "Operator defines required relation between features"
+msgstr ""
+
+#: ../vector/v.select/args.c:47
+msgid ""
+"A feature is written to output if the result of operation 'ainput operator "
+"binput' is true. An input feature is considered to be true, if category of "
+"given layer is defined."
+msgstr ""
+
+#: ../vector/v.select/args.c:53
+msgid "overlap;features partially or completely overlap"
+msgstr ""
+
+#: ../vector/v.select/args.c:58
+msgid ""
+"overlap;features partially or completely overlap;equals;features are "
+"spatially equals (using GEOS);disjoint;features do not spatially intersect "
+"(using GEOS);intersects;features spatially intersect (using GEOS);touches;"
+"features spatially touches (using GEOS);crosses;features spatially crosses "
+"(using GEOS);within;feature A is completely inside feature B (using GEOS);"
+"contains;feature B is completely inside feature A (using GEOS);overlaps;"
+"features spatially overlap (using GEOS);relate;feature A is spatially "
+"related to feature B (using GEOS, requires 'relate' option);"
+msgstr ""
+
+#: ../vector/v.select/args.c:75
+msgid "Intersection Matrix Pattern used for 'relate' operator"
+msgstr ""
+
+#: ../vector/v.select/args.c:84
+msgid "Do not skip features without category"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:79
+#: ../vector/lidar/v.lidar.correction/main.c:73
+msgid "vector, LIDAR"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:81
+msgid ""
+"Building contour determination and Region Growing algorithm for determining "
+"the building inside"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:86
+msgid "Input vector (v.lidar.edgedetection output"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:96
+msgid "Name of the first pulse vector map"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:103
+msgid "Threshold for cell object frequency in region growing"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:111
+msgid "Threshold for double pulse in region growing"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:166
+#: ../vector/lidar/v.surf.bspline/main.c:210
+#: ../vector/lidar/v.surf.bspline/main.c:362
+#: ../vector/lidar/v.lidar.edgedetection/main.c:193
+#: ../vector/lidar/v.lidar.edgedetection/main.c:205
+#: ../vector/lidar/v.lidar.edgedetection/main.c:255
+#: ../vector/lidar/v.lidar.correction/main.c:169
+#: ../vector/lidar/v.lidar.correction/main.c:229
+#: ../vector/lidar/v.outlier/main.c:171 ../vector/lidar/v.outlier/main.c:237
+#, c-format
+msgid "No database connection for driver <%s> is defined. Run db.connect."
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:179
+#, c-format
+msgid "Unable to open table <%s>"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:204
+msgid "Setting regions and boxes"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:249
+#: ../vector/lidar/v.surf.bspline/main.c:485
+#: ../vector/lidar/v.lidar.edgedetection/main.c:354
+#: ../vector/lidar/v.lidar.correction/main.c:334
+#: ../vector/lidar/v.outlier/main.c:332
+#, c-format
+msgid "subregion %d of %d"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:270
+#, c-format
+msgid "Rows = %d"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:271
+#, c-format
+msgid "Columns = %d"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:291
+msgid "read points in input vector"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:440
+msgid "Region Growing"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/ConvexHull.c:269
+msgid "...now exiting to system..."
+msgstr ""
+
+#: ../vector/lidar/lidarlib/zones.c:414 ../vector/lidar/lidarlib/zones.c:451
+#, c-format
+msgid "<%s> created in database."
+msgstr ""
+
+#: ../vector/lidar/lidarlib/zones.c:418 ../vector/lidar/lidarlib/zones.c:455
+#, c-format
+msgid "<%s> has not been created in database."
+msgstr ""
+
+#: ../vector/lidar/lidarlib/TcholBand.c:28
+msgid "Decomposition failed"
+msgstr ""
+
+#: ../vector/lidar/lidarlib/raster.c:80 ../vector/lidar/lidarlib/raster.c:95
+#: ../vector/lidar/lidarlib/raster.c:108 ../vector/lidar/lidarlib/raster.c:125
+#: ../vector/lidar/lidarlib/raster.c:140 ../vector/lidar/lidarlib/raster.c:153
+#: ../vector/lidar/lidarlib/raster.c:168 ../vector/lidar/lidarlib/raster.c:181
+#, c-format
+msgid "Unable to access table <%s>"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:85
+msgid "Bicubic or bilinear spline interpolation with Tykhonov regularization."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:90
+msgid ""
+"Find the best Tykhonov regularizing parameter using a \"leave-one-out\" "
+"cross validation method"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:94
+#: ../vector/lidar/v.lidar.edgedetection/main.c:84
+#: ../vector/lidar/v.lidar.correction/main.c:79
+#: ../vector/lidar/v.outlier/main.c:78
+msgid "Estimate point density and distance"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:96
+#: ../vector/lidar/v.lidar.edgedetection/main.c:86
+#: ../vector/lidar/v.lidar.correction/main.c:81
+#: ../vector/lidar/v.outlier/main.c:80
+msgid ""
+"Estimate point density and distance for the input vector points within the "
+"current region extends and quit"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:104
+msgid "Name of input vector map of sparse points"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:119
+msgid "Length of each spline step in the east-west direction"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:128
+msgid "Length of each spline step in the north-south direction"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:135
+msgid "Spline interpolation algorithm"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:144
+msgid "Tykhonov regularization parameter (affects smoothing)"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:159
+msgid "Attribute table column with values to interpolate (if layer>0)"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:172
+msgid "Choose either vector or raster output, not both"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:175
+msgid "No raster or vector or cross-validation output"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:191
+#: ../vector/lidar/v.lidar.edgedetection/main.c:173
+#: ../vector/lidar/v.lidar.correction/main.c:152
+#: ../vector/lidar/v.outlier/main.c:139
+msgid "Unable to read name of database"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:194
+#: ../vector/lidar/v.lidar.edgedetection/main.c:176
+#: ../vector/lidar/v.lidar.correction/main.c:155
+#: ../vector/lidar/v.outlier/main.c:142
+msgid "Unable to read name of driver"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:213
+#: ../vector/lidar/v.lidar.edgedetection/main.c:196
+#: ../vector/lidar/v.lidar.edgedetection/main.c:208
+#: ../vector/lidar/v.lidar.correction/main.c:172
+#: ../vector/lidar/v.outlier/main.c:174
+msgid "Old auxiliar table could not be dropped"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:223
+#: ../vector/lidar/v.surf.bspline/main.c:277
+#: ../vector/lidar/v.outlier/main.c:181
+#, c-format
+msgid "Unable to open vector map <%s> at the topological level"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:229
+msgid "Need either 3D vector or layer and column with z values"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:231
+msgid "Layer but not column with z values given"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:241
+#: ../vector/lidar/v.lidar.edgedetection/main.c:237
+#: ../vector/lidar/v.lidar.correction/main.c:200
+#: ../vector/lidar/v.outlier/main.c:196
+msgid "No points in current region!"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:254
+msgid "Cross validation didn't finish correctly"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:260
+#, c-format
+msgid "Cross validation finished for sie = %f and sin = %f"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:269
+#, c-format
+msgid "Vector map <%s> of sparse points will be interpolated"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:285
+#, c-format
+msgid ""
+"Sorry, <%s> driver is not allowed for vector output in this module. Try with "
+"a raster output or other driver."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:307
+#, c-format
+msgid "Points in input vector map <%s> will be interpolated"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:320
+#, c-format
+msgid "Cells for raster map <%s> will be interpolated"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:329
+msgid "Cannot read field info"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:350
+#, c-format
+msgid "[%d] records selected from table"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:369
+#, c-format
+msgid "Interpolation: Creating table: It was impossible to create table <%s>."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:392
+msgid ""
+"Cannot allocate memory for auxiliar matrix.Consider changing region "
+"resolution"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:416
+#: ../vector/lidar/v.lidar.edgedetection/main.c:298
+#: ../vector/lidar/v.lidar.correction/main.c:278
+#: ../vector/lidar/v.outlier/main.c:276
+#, c-format
+msgid "adjusted EW splines %d"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:417
+#: ../vector/lidar/v.lidar.edgedetection/main.c:299
+#: ../vector/lidar/v.lidar.correction/main.c:279
+#: ../vector/lidar/v.outlier/main.c:277
+#, c-format
+msgid "adjusted NS splines %d"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:590
+#, c-format
+msgid "Interpolation: (%d,%d): No record for point (cat = %d)"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:709
+msgid "No data within this subregion. Consider increasing spline step values."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:715
+msgid "Writing output..."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:731
+#: ../vector/lidar/v.lidar.edgedetection/main.c:470
+#: ../vector/lidar/v.lidar.correction/main.c:440
+#: ../vector/lidar/v.outlier/main.c:433
+msgid "Auxiliar table could not be dropped"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:80
+#, c-format
+msgid "%d are too many points. The cross validation would take too much time."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:89
+#, c-format
+msgid "%d points read in region"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:93
+msgid ""
+"Maybe, it takes too long. It will depend on how many points you are "
+"considering."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:124
+#, c-format
+msgid "CrossCorrelation: driver=%s db=%s"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:141
+#, c-format
+msgid "No records selected from table <%s> "
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:156
+#, c-format
+msgid ""
+"Too many splines (%d x %d). Consider changing spline steps \"sie=\" \"sin=\"."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:174
+#, c-format
+msgid "Beginning cross validation with lambda_i=%.4f ... (%d of %d)"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:300
+#, c-format
+msgid "Mean = %.5lf"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:301
+#, c-format
+msgid "Root Mean Square (RMS) = %.5lf"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:318
+msgid ""
+"Different number of splines and lambda_i values have been taken for the "
+"cross correlation"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:320
+#, c-format
+msgid ""
+"The minimum value for the test (rms=%lf) was obtained with: lambda_i = %.3f"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:328
+msgid "Table of results:"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:329
+#, c-format
+msgid "    lambda |       mean |        rms |\n"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:339
+msgid "No point lies into the current region"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:232
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:278
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:308
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:326
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:356
+msgid "Impossible to read from aux table"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:237
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:313
+msgid "Impossible to update aux table"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:250
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:262
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:383
+msgid "Impossible to write to aux table"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:78
+msgid "vector, LIDAR, edges"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:80
+msgid "Detects the object's edges from a LIDAR data set."
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:98
+#: ../vector/lidar/v.lidar.correction/main.c:105
+#: ../vector/lidar/v.outlier/main.c:108
+msgid "Interpolation spline step value in east direction"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:107
+#: ../vector/lidar/v.lidar.correction/main.c:113
+#: ../vector/lidar/v.outlier/main.c:116
+msgid "Interpolation spline step value in north direction"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:115
+msgid "Regularization weight in gradient evaluation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:124
+msgid "High gradient threshold for edge classification"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:133
+msgid "Low gradient threshold for edge classification"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:141
+msgid "Angle range for same direction detection"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:150
+msgid "Regularization weight in residual evaluation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:227
+#: ../vector/lidar/v.lidar.correction/main.c:190
+#: ../vector/lidar/v.outlier/main.c:186
+#, c-format
+msgid "Input vector map <%s> is not 3D!"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:260
+#, c-format
+msgid "It was impossible to create <%s>."
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:263
+#, c-format
+msgid "It was impossible to create <%s> interpolation table in database."
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:396
+msgid "Allocating memory for bilinear interpolation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:417
+#: ../vector/lidar/v.lidar.correction/main.c:403
+#: ../vector/lidar/v.outlier/main.c:393
+msgid "Bilinear interpolation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:429
+msgid "Allocating memory for bicubic interpolation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:434
+msgid "Bicubic interpolation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:446
+msgid "Point classification"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:460
+#: ../vector/lidar/v.lidar.correction/main.c:429
+#: ../vector/lidar/v.outlier/main.c:423
+msgid "No data within this subregion. Consider changing the spline step."
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:468
+#: ../vector/lidar/v.lidar.correction/main.c:438
+#, c-format
+msgid "Dropping <%s>"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:75
+msgid ""
+"Correction of the v.lidar.growing output. It is the last of the three "
+"algorithms for LIDAR filtering."
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:85
+msgid "Input observation vector map name (v.lidar.growing output)"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:88
+msgid "Output classified vector map name"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:97
+msgid "Only 'terrain' points output vector map"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:120
+msgid "Regularization weight in reclassification evaluation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:128
+msgid "High threshold for object to terrain reclassification"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:136
+msgid "Low threshold for terrain to object reclassification"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:325
+#, c-format
+msgid "nsply = %d"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:358
+#, c-format
+msgid "nsplx = %d"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:361
+msgid "read vector region map"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:366
+#, c-format
+msgid "npoints = %d, nterrain = %d"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:372
+msgid "Mean calculation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:386
+msgid "Only TERRAIN points"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:416
+msgid "Correction and creation of terrain vector"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/correction.c:96
+#: ../vector/lidar/v.lidar.correction/correction.c:130
+#: ../vector/lidar/v.lidar.correction/correction.c:154
+#: ../vector/lidar/v.lidar.correction/correction.c:166
+#: ../vector/lidar/v.lidar.correction/correction.c:190
+#: ../vector/lidar/v.outlier/outlier.c:75
+#: ../vector/lidar/v.outlier/outlier.c:112
+#: ../vector/lidar/v.outlier/outlier.c:138
+#: ../vector/lidar/v.outlier/outlier.c:151
+#: ../vector/lidar/v.outlier/outlier.c:175
+msgid "Impossible to read the database"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/correction.c:100
+#: ../vector/lidar/v.lidar.correction/correction.c:158
+#: ../vector/lidar/v.outlier/outlier.c:79
+#: ../vector/lidar/v.outlier/outlier.c:142
+msgid "Impossible to update the database"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/correction.c:110
+#: ../vector/lidar/v.lidar.correction/correction.c:118
+#: ../vector/lidar/v.lidar.correction/correction.c:213
+#: ../vector/lidar/v.outlier/outlier.c:90
+#: ../vector/lidar/v.outlier/outlier.c:99
+#: ../vector/lidar/v.outlier/outlier.c:197
+msgid "Impossible to write in the database"
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:74
+msgid "Removes outliers from vector point data."
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:92
+msgid "Name of output outlier vector map"
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:100
+msgid "Name of vector map for visualization in QGIS"
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:122
+msgid "Tykhonov regularization weight"
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:129
+msgid "Threshold for the outliers"
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:243
+#, c-format
+msgid "It was impossible to create <%s> table."
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:405
+msgid "Outlier detection"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:70
+#: ../vector/v.lrs/v.lrs.create/main.c:121
+#: ../vector/v.lrs/v.lrs.where/main.c:58
+#: ../vector/v.lrs/v.lrs.label/main.c:102
+msgid "vector, LRS, networking"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:72
+msgid ""
+"Creates points/segments from input lines, linear reference system and "
+"positions read from stdin or a file."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:80
+msgid "Output vector map where segments will be written"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:91
+#: ../vector/v.lrs/v.lrs.create/main.c:205
+#: ../vector/v.lrs/v.lrs.where/main.c:85
+#: ../vector/v.lrs/v.lrs.label/main.c:122
+msgid "Driver name for reference system table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:99
+#: ../vector/v.lrs/v.lrs.create/main.c:213
+#: ../vector/v.lrs/v.lrs.where/main.c:93
+#: ../vector/v.lrs/v.lrs.label/main.c:130
+msgid "Database name for reference system table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:107
+#: ../vector/v.lrs/v.lrs.where/main.c:101
+#: ../vector/v.lrs/v.lrs.label/main.c:138
+msgid "Name of the reference system table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:151
+#: ../vector/v.lrs/v.lrs.create/main.c:304
+#: ../vector/v.lrs/v.lrs.where/main.c:145
+#: ../vector/v.lrs/v.lrs.label/main.c:308
+msgid "Unable to open database for reference table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:179
+#: ../vector/v.lrs/v.lrs.segment/main.c:233
+#, c-format
+msgid "Cannot read input: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:191
+#, c-format
+msgid "No record in LR table for: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:195
+#, c-format
+msgid "More than one record in LR table for: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:202
+#: ../vector/v.lrs/v.lrs.segment/main.c:289
+#, c-format
+msgid "Unable to find line of cat [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:212
+#, c-format
+msgid ""
+"Cannot get point on line: cat = [%d] distance = [%f] (line length = %f)\n"
+"%s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:248
+#, c-format
+msgid ""
+"No record in LRS table for 1. point of:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:253
+#, c-format
+msgid ""
+"Using last from more offsets found for 1. point of:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:257
+#, c-format
+msgid ""
+"Requested offset for the 1. point not found, using nearest found:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:268
+#, c-format
+msgid ""
+"No record in LRS table for 2. point of:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:273
+#, c-format
+msgid ""
+"Requested offset for the 2. point not found, using nearest found:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:277
+#, c-format
+msgid ""
+"Using first from more offsets found for 2. point of:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:282
+msgid "Segment over 2 (or more) segments, not yet supported"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:299
+#, c-format
+msgid "End of segment > line length (%e) -> cut"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:308
+#, c-format
+msgid ""
+"Cannot make line segment: cat = %d : %f - %f (line length = %f)\n"
+"%s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:346
+#: ../vector/v.lrs/v.lrs.where/main.c:220
+#, c-format
+msgid "[%d] points read from input"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:347
+#, c-format
+msgid "[%d] points written to output map (%d lost)"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:349
+#, c-format
+msgid "[%d] lines read from input"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:350
+#, c-format
+msgid "[%d] lines written to output map (%d lost)"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:122
+msgid "Creates Linear Reference System"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:131
+msgid "Output vector map where oriented lines are written"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:136
+msgid "Output vector map of errors"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:141
+msgid "Input vector map containing reference points"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:149
+#: ../vector/v.lrs/v.lrs.where/main.c:79
+msgid "Point layer"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:156
+msgid "Column containing line identifiers for lines"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:163
+msgid "Column containing line identifiers for points"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:171
+msgid "Column containing milepost position for the beginning of next segment"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:180
+msgid ""
+"Column containing offset from milepost for the beginning of next segment"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:189
+msgid "Column containing milepost position for the end of previous segment"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:198
+msgid "Column containing offset from milepost for the end of previous segment"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:222
+msgid "Name of table where the reference system will be written"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:223
+msgid "New table is created by this module"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:230
+msgid "Maximum distance of point to line allowed"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:277
+msgid "Cannot get layer info for lines"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:280
+msgid "Cannot get layer info for points"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:315
+#, c-format
+msgid "Unable to drop table: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:334
+#, c-format
+msgid "Unable to select line id values from %s.%s."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:344
+msgid "Line id column must be integer"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:355
+#: ../vector/v.lrs/v.lrs.create/main.c:457
+msgid "Unable to fetch line id from line table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:407
+#, c-format
+msgid "Line [%d] without category (layer [%d])"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:427
+#, c-format
+msgid "No lines selected for line id [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:447
+#, c-format
+msgid "Unable to select point attributes from <%s>"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:478
+#, c-format
+msgid "Milepost (start) %f+%f used as %f+%f (change MP to integer)"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:500
+#, c-format
+msgid "Milepost (end) %f+%f used as %f+%f (change MP to integer)"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:526
+#, c-format
+msgid "Point [%d] without category (layer [%d])"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:573
+#, c-format
+msgid "Point [%d] cat [%d] is out of threshold (distance = %f)"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:705
+#, c-format
+msgid "End > start for point cat [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:722
+msgid "Start of 1. MP >= end of 2. MP for points' cats %[d], [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:739
+#, c-format
+msgid "Start of 1. MP >= start of 2. MP for points' cats [%d], [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:749
+#, c-format
+msgid "Distance along line identical for points' cats [%d], [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:763
+#, c-format
+msgid "Not enough points (%d) attached to the line (cat %d), line skip."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:768
+#, c-format
+msgid "Unable to guess direction for the line (cat %d), line skip."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:772
+#, c-format
+msgid "Incorrect order of points along line cat [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:822
+#, c-format
+msgid "Unable to insert reference records: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:863
+msgid "Building topology for output (out_lines) map..."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:869
+msgid "Building topology for error (err) map..."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:60
+msgid ""
+"Finds line id and real km+offset for given points in vector map using linear "
+"reference system."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:69
+msgid "Input vector map containing points"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:108
+msgid "Maximum distance to nearest line"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:221
+#, c-format
+msgid "[%d] positions found"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:223
+#, c-format
+msgid "[%d] points outside threshold"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:225
+#, c-format
+msgid "[%d] points - no record found"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:227
+#, c-format
+msgid "[%d] points - too many records found"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:103
+msgid "Creates stationing from input lines, and linear reference system"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:111
+msgid "Output vector map where stationing will be written"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:146
+msgid "Label file"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:155
+msgid "PM left, MP right, stationing left, stationing right offset"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:160
+msgid "Offset label in label x-direction in map units"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:167
+msgid "Offset label in label y-direction in map units"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:202
+msgid "Line width of text"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:203
+#: ../vector/v.lrs/v.lrs.label/main.c:211
+#: ../vector/v.lrs/v.lrs.label/main.c:221
+msgid "Only for d.label output"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:220
+msgid "Line width of highlight color"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:246
+msgid "Opaque to vector"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:247
+msgid "Only relevant if background color is selected"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:338
+#, c-format
+msgid "Unable to select records from LRS table: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:428
+msgid "No record in LR table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:432
+msgid "More than one record in LR table"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:64
+msgid "vector, reclass, attributes"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:66
+msgid ""
+"Changes vector category values for an existing vector map according to "
+"results of SQL queries or a value in attribute table column."
+msgstr ""
+
+#: ../vector/v.reclass/main.c:83
+msgid "The name of the column whose values are to be used as new categories"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:84
+msgid "The source for the new key column must be type integer or string"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:89
+msgid "Full path to the reclass rule file"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:100
+msgid "Either 'rules' or 'col' must be specified"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:224 ../vector/v.to.rast/vect2rast.c:73
+#: ../vector/v.to.rast/support.c:143 ../vector/v.to.rast/support.c:304
+#: ../vector/v.to.rast/support.c:454
+#, c-format
+msgid "No records selected from table <%s>"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:237
+msgid "Key column type is not integer"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:273
+#, c-format
+msgid "Cannot insert data: [%s]"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:310
+msgid "Column type must be integer or string"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:322
+#, c-format
+msgid "Unable to open rule file <%s>"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:338
+#, c-format
+msgid "Category %d overwritten by '%s'"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:342
+#, c-format
+msgid "Category '%s' invalid"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:346
+#, c-format
+msgid "Label '%s' overwritten by '%s'"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:352
+#, c-format
+msgid "Condition '%s' overwritten by '%s'"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:357
+#, c-format
+msgid "Unknown rule option: '%s'"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:371
+msgid "Cannot select values from database"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:387
+#, c-format
+msgid "%d previously set categories overwritten by new category %d"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:413
+msgid "Incomplete rule"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:449
+#, c-format
+msgid "%d features reclassed."
+msgstr ""
+
+#: ../vector/v.to.rast/do_lines.c:65 ../vector/v.to.rast/do_areas.c:63
+msgid "Unable to use column specified"
+msgstr ""
+
+#: ../vector/v.to.rast/do_lines.c:125
+#, c-format
+msgid "%d lines with varying height were not written to raster"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:39
+msgid "vector, raster, conversion"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:40
+msgid "Converts (rasterize) a vector map into a raster map."
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:61
+msgid "Source of raster values"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:62
+msgid ""
+"attr;read values from attribute table;cat;use category values;val;use value "
+"specified by value option;z;use z coordinate (points or contours only);dir;"
+"output as flow direction (lines only)"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:71
+msgid "Name of column for 'attr' parameter (data type must be numeric)"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:77
+msgid "Name of color definition column (with RRR:GGG:BBB entries)"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:83
+msgid "Name of column used as raster category labels"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:92
+msgid "Raster value (for use=val)"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:113
+msgid "Column parameter missing (or use value parameter)"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:118
+msgid "Column parameter cannot be combined with use of category values option"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:123
+msgid "Column parameter cannot be combined with use of value option"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:128
+msgid "Column parameter cannot be combined with use of z coordinate"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:134
+#, c-format
+msgid "Unknown option '%s'"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:39
+msgid "Loading data..."
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:44
+#, c-format
+msgid "Vector map <%s> is not 3D"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:69
+#, c-format
+msgid "Column type (%s) not supported (did you mean 'labelcolumn'?)"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:101
+#, c-format
+msgid "Unable to use column <%s>"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:119 ../vector/v.to.rast/support.c:578
+#, c-format
+msgid "Unknown use type: %d"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:132
+msgid "Unknown raster map type"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:140
+#, c-format
+msgid "Unable to process areas from vector map <%s>"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:156
+#, c-format
+msgid "Pass %d of %d:"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:164
+#, c-format
+msgid "Problem processing areas from vector map <%s>, continuing..."
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:175
+#, c-format
+msgid "Problem processing lines from vector map <%s>, continuing..."
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:200
+msgid "Creating support files for raster map..."
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:207
+msgid "Color can be updated from database only if use=attr"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:227
+#, c-format
+msgid "Converted areas: %d of %d"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:229
+#, c-format
+msgid "Converted points/lines: %d of %d"
+msgstr ""
+
+#: ../vector/v.to.rast/do_areas.c:49 ../vector/v.to.rast/do_areas.c:57
+#, c-format
+msgid "No record for area (cat = %d)"
+msgstr ""
+
+#: ../vector/v.to.rast/do_areas.c:78
+#, c-format
+msgid "Get area %d failed"
+msgstr ""
+
+#: ../vector/v.to.rast/do_areas.c:118
+msgid "Area without centroid (OK for island)"
+msgstr ""
+
+#: ../vector/v.to.rast/do_areas.c:125
+msgid "Area centroid without category"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:139 ../vector/v.to.rast/support.c:300
+#: ../vector/v.to.rast/support.c:450
+#, c-format
+msgid "Unknown column <%s> in table <%s>"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:160 ../vector/v.to.rast/support.c:326
+msgid "No records selected"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:173
+#, c-format
+msgid "Error in color definition column (%s) with cat %d: colorstring [%s]"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:176
+msgid "Color set to [200:200:200]"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:181
+#, c-format
+msgid "Error in color definition column (%s), with cat %d"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:273
+msgid "Label column was not specified, no labels will be written"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:349 ../vector/v.to.rast/support.c:496
+#, c-format
+msgid "Column type (%s) not supported"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:514
+msgid "Cannot allocate memory for row buffer"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:584
+#, c-format
+msgid "Unable to write categories for raster map <%s>"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:52
+msgid "Prints/sets DB connection for a vector map to attribute table."
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:72
+msgid "Key column name"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:79
+msgid "Field separator for shell script style output"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:85
+msgid "Print all map connection parameters and exit"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:90
+msgid "Print all map connection parameters and exit in shell script style"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:93
+msgid "Format: layer[/layer name] table key database driver"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:103
+msgid "When printing, limit to layer specified by the layer option"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:108
+msgid "Print types/names of table columns for specified layer and exit"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:115
+msgid "Overwrite connection parameter for certain layer"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:120
+msgid "Delete connection for certain layer (not the table)"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:153
+msgid "Unable to modify vector map stored in other mapset"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:170
+#, c-format
+msgid "Vector map <%s> is connected by:"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:198
+#, c-format
+msgid ""
+"layer <%d> table <%s> in database <%s> through driver <%s> with key <%s>\n"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:261
+#, c-format
+msgid "Use -o to overwrite existing link for layer <%d>"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:269 ../vector/v.db.connect/main.c:309
+#, c-format
+msgid "Table <%s> does not exist in database <%s>"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:297 ../vector/v.db.connect/main.c:315
+#, c-format
+msgid ""
+"The table <%s> is now part of vector map <%s> and may be deleted or "
+"overwritten by GRASS modules"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:339
+msgid "Select privileges were granted on the table"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:346
+msgid ""
+"For defining a new connection you have to specify these parameters: driver, "
+"database, table [, key [, layer]]"
+msgstr ""
+
+#: ../vector/v.parallel/main.c:40
+msgid "Create parallel line to input lines"
+msgstr ""
+
+#: ../vector/v.parallel/main.c:52
+msgid "Offset in map units, positive for right side, negative for left side."
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:218
+#, c-format
+msgid "Could not find a path between stops %d and %d"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:255
+msgid "Finds shortest path using timetables."
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:267
+msgid "Layer number or name with walking connections or -1"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:272
+msgid "Layer number or name with route paths or -1"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:278
+msgid "Name of column name with route ids"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:285
+msgid "Name of column name with stop timestamps"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:291
+msgid "Name of column name with stop ids"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:297
+msgid "Name of column name with walk lengths"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:345
+msgid "Could not initialize the timetables"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:421 ../vector/v.net.timetable/main.c:452
+#: ../vector/v.net.timetable/main.c:460
+#, c-format
+msgid "No stop with category: %d"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:467
+msgid "'From' and 'To' stops are the same"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:476
+msgid "No path between the stops"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:108
+msgid "Convert OGR vector layers to GRASS vector map."
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:115
+msgid "OGR datasource name"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:116
+msgid ""
+"Examples:\n"
+"\t\tESRI Shapefile: directory containing shapefiles\n"
+"\t\tMapInfo File: directory containing mapinfo files"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:131
+msgid "OGR layer name. If not given, all available layers are imported"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:133
+msgid ""
+"Examples:\n"
+"\t\tESRI Shapefile: shapefile name\n"
+"\t\tMapInfo File: mapinfo file name"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:143
+msgid "Import subregion only"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:144 ../vector/v.in.ogr/main.c:228
+msgid "Subregion"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:146
+msgid "Format: xmin,ymin,xmax,ymax - usually W,S,E,N"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:157
+msgid "Minimum size of area to be imported (square units)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:158 ../vector/v.in.ogr/main.c:179
+msgid "Min-area & snap"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:159
+msgid "Smaller areas and islands are ignored. Should be greater than snap^2"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:165
+msgid "Optionally change default input type"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:167
+msgid ""
+"point;import area centroids as points;line;import area boundaries as lines;"
+"boundary;import lines as area boundaries;centroid;import points as centroids"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:180
+msgid "'-1' for no snap"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:194
+msgid ""
+"List of column names to be used instead of original names, first is used for "
+"category column"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:201
+msgid "List available layers in data source and exit"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:210
+msgid "Do not clean polygons (not recommended)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:214 ../vector/v.random/main.c:127
+msgid "Create 3D output"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:224
+msgid "Override dataset projection (use location's projection)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:229
+msgid "Limit import to the current region"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:241
+msgid "Change column names to lowercase characters"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:258
+msgid "Available OGR Drivers:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:301
+#, c-format
+msgid "Unable to open data source <%s>"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:309
+#, c-format
+msgid "Data source contains %d layers:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:342
+#, c-format
+msgid "Vector map <%s> already exists and will be overwritten"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:386
+msgid "Select either the current region flag or the spatial option, not both"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:414
+msgid "4 parameters required for 'spatial' parameter"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:491
+msgid ""
+"Unable to convert input map projection to GRASS format; cannot create new "
+"location"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:503
+msgid ""
+"Unable to convert input map projection information to GRASS format for "
+"checking"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:533
+msgid "GRASS LOCATION PROJ_INFO is:\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:593
+#, c-format
+msgid ""
+"\n"
+"You can use the -o flag to %s to override this projection check.\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:596
+msgid ""
+"Consider generating a new location with 'location' parameter from input data "
+"set.\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:619
+#, c-format
+msgid "Using temporary vector <%s>"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:640
+#, c-format
+msgid "Layer: %s"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:711
+#, c-format
+msgid "Column name changed: '%s' -> '%s'"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:735
+#, c-format
+msgid "Writing column <%s> with fixed length %d chars (may be truncated)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:758
+#, c-format
+msgid ""
+"Width for column %s set to 255 (was not specified by OGR), some strings may "
+"be truncated!"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:770
+#, c-format
+msgid "Writing column %s with fixed length %d chars (may be truncated)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:774
+#, c-format
+msgid "Column type not supported (%s)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:789
+#, c-format
+msgid "Unable open database <%s> by driver <%s>"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:826
+#, c-format
+msgid "Counting polygons for %d features..."
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:848
+#, c-format
+msgid "Boundary splitting distance in map units: %G"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:853
+#, c-format
+msgid "Importing map %d features..."
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:955
+#, c-format
+msgid "%d %s without geometry"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:979
+msgid "Cleaning polygons, result is not guaranteed!"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:983
+#, c-format
+msgid "Snap boundaries (threshold = %.3e):"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:997
+msgid "Break polygons:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1002 ../vector/v.in.ogr/main.c:1016
+msgid "Remove duplicates:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1012
+msgid "Break boundaries:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1020
+msgid "Clean boundaries at nodes:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1027
+msgid "Merge boundaries:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1032
+msgid "Change boundary dangles to lines:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1036
+msgid "Change dangles to lines:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1042
+msgid "Change boundary bridges to lines:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1046
+msgid "Remove bridges:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1081
+#, c-format
+msgid "Find centroids for layer: %s"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1102
+msgid "Write centroids:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1152
+#, c-format
+msgid ""
+"%d areas represent more (overlapping) features, because polygons overlap in "
+"input layer(s). Such areas are linked to more than 1 row in attribute table. "
+"The number of features for those areas is stored as category in layer %d"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1162
+#, c-format
+msgid "%d input polygons\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1163
+#, c-format
+msgid "%d input polygons"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1166
+#, c-format
+msgid "Total area: %G (%d areas)\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1167
+#, c-format
+msgid "Total area: %G (%d areas)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1170
+#, c-format
+msgid "Overlapping area: %G (%d areas)\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1172
+#, c-format
+msgid "Overlapping area: %G (%d areas)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1176
+#, c-format
+msgid "Area without category: %G (%d areas)\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1178
+#, c-format
+msgid "Area without category: %G (%d areas)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1228
+msgid "Errors were encountered during the import"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1229
+#, c-format
+msgid "Try to import again, snapping with at least %g: 'snap=%g'"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1270
+msgid ""
+"Input data contains 3D features. Created vector is 2D only, use -z flag to "
+"import 3D vector"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:195
+msgid "Cannot read part of geometry"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:234 ../vector/v.in.ogr/geom.c:247
+#: ../vector/v.in.ogr/geom.c:275 ../vector/v.in.ogr/geom.c:321
+msgid "Skipping empty geometry feature"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:291
+#, c-format
+msgid "Degenerate polygon ([%d] vertices)"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:334
+#, c-format
+msgid "Degenerate island ([%d] vertices)"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:368
+msgid "Cannot calculate centroid"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:399
+msgid "No centroid written for polygon with 0 vertices"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:420
+msgid "Cannot write part of geometry"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:426
+msgid "Unknown geometry type"
+msgstr ""
+
+#: ../vector/v.net.components/main.c:69
+msgid "vector, network, components"
+msgstr ""
+
+#: ../vector/v.net.components/main.c:71
+msgid "Computes strongly and weakly connected components in the network."
+msgstr ""
+
+#: ../vector/v.net.components/main.c:85
+msgid "weak;Weakly connected components;strong;Strongly connected components;"
+msgstr ""
+
+#: ../vector/v.net.components/main.c:87
+msgid "Type of components"
+msgstr ""
+
+#: ../vector/v.net.components/main.c:91 ../vector/v.net.centrality/main.c:171
+msgid "Add points on nodes"
+msgstr ""
+
+#: ../vector/v.perturb/normalrs.c:31
+msgid "normalsv: restoration of unitialized block"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:73
+msgid "vector, geometry, statistics"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:75
+msgid "Random location perturbations of GRASS vector points"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:78
+msgid "Vector points to be spatially perturbed"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:88
+msgid "Distribution of perturbation"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:96
+msgid ""
+"Parameter(s) of distribution. If the distribution is uniform, only one "
+"parameter, the maximum, is needed. For a normal distribution, two "
+"parameters, the mean and standard deviation, are required."
+msgstr ""
+
+#: ../vector/v.perturb/main.c:106
+msgid "Minimum deviation in map units"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:113
+msgid "Seed for random number generation"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:137 ../vector/v.perturb/main.c:144
+msgid "Error scanning arguments"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:140
+msgid "Maximum of uniform distribution must be >= zero"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:147
+msgid "Standard deviation of normal distribution must be >= zero"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:232
+msgid "Cannot get db link info"
+msgstr ""
+
+#: ../vector/v.perturb/normalsv.c:29
+msgid "normalsv: save of unitialized block"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:95
+msgid "vector, network, centrality measures"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:97
+msgid ""
+"Computes degree, centrality, betweeness, closeness and eigenvector "
+"centrality measures in the network."
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:127
+msgid "Name of degree centrality column"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:128 ../vector/v.net.centrality/main.c:134
+#: ../vector/v.net.centrality/main.c:140 ../vector/v.net.centrality/main.c:146
+msgid "Columns"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:133
+msgid "Name of closeness centrality column"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:139
+msgid "Name of betweenness centrality column"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:145
+msgid "Name of eigenvector centrality column"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:154
+msgid "Maximum number of iterations to compute eigenvector centrality"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:162
+msgid "Cummulative error tolerance for eigenvector centrality"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:293
+msgid "Computing degree centrality measure"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:297
+msgid "Computing betweenness and/or closeness centrality measure"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:304
+msgid "Computing eigenvector centrality measure"
+msgstr ""
+
+#: ../vector/v.generalize/smoothing.c:86
+#: ../vector/v.generalize/smoothing.c:146
+msgid "Look ahead parameter must be odd"
+msgstr ""
+
+#: ../vector/v.generalize/smoothing.c:481
+msgid "Unable to find the inverse matrix"
+msgstr ""
+
+#: ../vector/v.generalize/smoothing.c:488
+msgid "Unable to calculate the output vectors"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:77
+msgid ""
+"vector, generalization, simplification, smoothing, displacement, network "
+"generalization"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:78
+msgid "Vector based generalization."
+msgstr ""
+
+#: ../vector/v.generalize/main.c:95
+msgid ""
+"douglas;Douglas-Peucker Algorithm;douglas_reduction;Douglas-Peucker "
+"Algorithm with reduction parameter;lang;Lang Simplification Algorithm;"
+"reduction;Vertex Reduction Algorithm eliminates points close to each other;"
+"reumann;Reumann-Witkam Algorithm;boyle;Boyle's Forward-Looking Algorithm;"
+"sliding_averaging;McMaster's Sliding Averaging Algorithm;distance_weighting;"
+"McMaster's Distance-Weighting Algorithm;chaiken;Chaiken's Algorithm;hermite;"
+"Interpolation by Cubic Hermite Splines;snakes;Snakes method for line "
+"smoothing;network;Network generalization;displacement;Displacement of lines "
+"close to each other;"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:109
+msgid "Generalization algorithm"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:116
+msgid "Maximal tolerance value"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:123
+msgid "Look-ahead parameter"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:132
+msgid "Percentage of the points in the output of 'douglas_reduction' algorithm"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:141
+msgid "Slide of computed point toward the original point"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:150
+msgid "Minimum angle between two consecutive segments in Hermite method"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:158
+msgid "Degree threshold in network generalization"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:167
+msgid "Closeness threshold in network generalization"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:175
+msgid "Betweeness threshold in network generalization"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:182
+msgid "Snakes alpha parameter"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:189
+msgid "Snakes beta parameter"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:196
+msgid "Number of iterations"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:204
+msgid "Copy attributes"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:263
+msgid "Unknown method"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:323
+msgid "Displacement..."
+msgstr ""
+
+#: ../vector/v.generalize/main.c:332
+msgid "Network generalization..."
+msgstr ""
+
+#: ../vector/v.generalize/main.c:347
+msgid "Attributes are needed for 'where' option, copying table"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:369
+#, c-format
+msgid "Generalization (%s)..."
+msgstr ""
+
+#: ../vector/v.generalize/main.c:463
+#, c-format
+msgid "Method '%s' did not preserve first point"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:468
+#, c-format
+msgid "Method '%s' did not preserve last point"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:495
+#, c-format
+msgid ""
+"%d boundaries were not modified because modification would damage topology"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:498
+#, c-format
+msgid "%d lines/boundaries were not modified due to over-simplification"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:513
+#, c-format
+msgid "Number of vertices for selected lines %s from %d to %d (%d%%)."
+msgstr ""
+
+#: ../vector/v.generalize/main.c:514
+msgid "reduced"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:514
+msgid "changed"
+msgstr ""
+
+#: ../vector/v.generalize/misc.c:208 ../vector/v.generalize/misc.c:221
+#, c-format
+msgid "'%s' must be > 0 for '%s'"
+msgstr ""
+
+#: ../vector/v.generalize/misc.c:210
+msgid "'where' and 'cats' parameters were supplied, cat will be ignored"
+msgstr ""
+
+#: ../vector/v.generalize/misc.c:216
+msgid "Unable to load data from database"
+msgstr ""
+
+#: ../vector/v.generalize/misc.c:227
+msgid "Problem loading category values"
+msgstr ""
+
+#: ../vector/v.generalize/displacement.c:197
+msgid "Inverting matrix..."
+msgstr ""
+
+#: ../vector/v.generalize/displacement.c:199
+msgid "Unable to calculate the inverse matrix"
+msgstr ""
+
+#: ../vector/v.generalize/displacement.c:202
+msgid "Resolving conflicts..."
+msgstr ""
+
+#: ../vector/v.generalize/network.c:164
+msgid "Calculating centrality measures..."
+msgstr ""
+
+#: ../vector/v.random/main.c:85
+msgid "Randomly generate a 2D/3D vector points map."
+msgstr ""
+
+#: ../vector/v.random/main.c:93
+msgid "Number of points to be created"
+msgstr ""
+
+#: ../vector/v.random/main.c:100
+msgid "Minimum z height (needs -z flag or column name)"
+msgstr ""
+
+#: ../vector/v.random/main.c:102 ../vector/v.random/main.c:111
+#: ../vector/v.random/main.c:123 ../vector/v.random/main.c:128
+msgid "3D output"
+msgstr ""
+
+#: ../vector/v.random/main.c:109
+msgid "Maximum z height (needs -z flag or column name)"
+msgstr ""
+
+#: ../vector/v.random/main.c:119
+msgid "Column name and type (i.e. INTEGER, DOUBLE PRECISION) for z values"
+msgstr ""
+
+#: ../vector/v.random/main.c:121
+msgid ""
+"If type is not given then DOUBLE PRECISION is used. Writes Z data to column "
+"instead of 3D vector."
+msgstr ""
+
+#: ../vector/v.random/main.c:132
+msgid "Use drand48() function instead of rand()"
+msgstr ""
+
+#: ../vector/v.random/main.c:142
+msgid "v.random can't create 3D vector and attribute table at same time"
+msgstr ""
+
+#: ../vector/v.random/main.c:150
+#, c-format
+msgid "Number of points must be > 0 (%d given)"
+msgstr ""
+
+#: ../vector/v.random/main.c:179
+#, c-format
+msgid "Using 'double precision' for column <%s>"
+msgstr ""
+
+#: ../vector/v.random/main.c:221
+msgid "Table should contain only two columns"
+msgstr ""
+
+#: ../vector/v.random/main.c:234
+msgid ""
+"You have created unsupported column type. This module supports only INTEGER "
+"and DOUBLE PRECISION column types."
+msgstr ""
+
+#: ../vector/v.random/main.c:264
+msgid "Generating points..."
+msgstr ""
+
+#: ../vector/v.neighbors/main.c:48
+msgid "vector, raster, aggregation"
+msgstr ""
diff --git a/locale/po/grassmods_ro.po b/locale/po/grassmods_ro.po
new file mode 100644
index 0000000..77a4866
--- /dev/null
+++ b/locale/po/grassmods_ro.po
@@ -0,0 +1,31368 @@
+# translation of grassmods_ro.po into Romanian
+# This file is distributed under the same license as the GRASS package.
+# Copyright (C) 2013 GRASS Development Team
+# Andreea Marin <andreea.marin09 yahoo.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: grassmods_ro\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-10 00:42+0200\n"
+"PO-Revision-Date: 2013-07-17 22:14+0200\n"
+"Last-Translator: Andreea Marin <andreea.marin09 yahoo.com>\n"
+"Language-Team: GRASS Translation Team <grass-translations at lists.osgeo.org>\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: ../raster/r.out.pov/main.c:121 ../raster/r.out.ppm3/main.c:57
+#: ../raster/r.out.arc/main.c:60 ../raster/r.out.ppm/main.c:54
+#: ../raster/r.out.vtk/main.c:148 ../raster/r.out.ascii/main.c:59
+#: ../raster/r.out.gridatb/main.c:44 ../raster/r.out.gdal/main.c:128
+#: ../raster/r.out.mat/main.c:64 ../raster/r.out.tiff/r.out.tiff.c:99
+#: ../raster/r.out.mpeg/main.c:384 ../raster/r.out.bin/main.c:279
+#: ../locale/scriptstrings/r.out.xyz_to_translate.c:2
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:2
+msgid "raster, export"
+msgstr "raster, export"
+
+#: ../raster/r.out.pov/main.c:123
+msgid "Converts a raster map layer into a height-field file for POVRAY."
+msgstr "Convertește harta raster într-un fișier pentru POVRAY."
+
+#: ../raster/r.out.pov/main.c:131 ../raster/r.out.ascii/main.c:70
+msgid "Name of an existing raster map"
+msgstr "Nume hartă raster existentă"
+
+#: ../raster/r.out.pov/main.c:138
+msgid "Name of output povray file (TGA height field file)"
+msgstr "Nume pentru fișierul povray de ieșire (fișier TGA cu un câmp de altitudine )"
+
+#: ../raster/r.out.pov/main.c:145
+msgid "Height-field type (0=actual heights 1=normalized)"
+msgstr "Tipul câmpului - înălțime (0=înălțimea actuală 1=normalizată)"
+
+#: ../raster/r.out.pov/main.c:151
+msgid "Elevation bias"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:157 ../raster/r.param.scale/interface.c:114
+msgid "Vertical scaling factor"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:174 ../raster/r.clump/main.c:87
+#: ../raster/r.cost/main.c:340 ../raster/r.cats/main.c:125
+#: ../raster/r.cats/main.c:146 ../raster/r.transect/main.c:119
+#: ../raster/r.mfilter.fp/main.c:126 ../raster/r.support/front/front.c:224
+#: ../raster/r.support/modcolr/modcolr.c:46 ../raster/r.composite/main.c:155
+#: ../raster/r.coin/main.c:127 ../raster/r.coin/main.c:130
+#: ../raster/r.coin/inter.c:40 ../raster/r.coin/inter.c:44
+#: ../raster/r.series/main.c:212 ../raster/r.out.ppm3/main.c:120
+#: ../raster/r.null/null.c:119 ../raster/wildfire/r.ros/main.c:322
+#: ../raster/wildfire/r.ros/main.c:335 ../raster/wildfire/r.ros/main.c:340
+#: ../raster/wildfire/r.ros/main.c:345 ../raster/wildfire/r.ros/main.c:350
+#: ../raster/wildfire/r.ros/main.c:368 ../raster/wildfire/r.ros/main.c:372
+#: ../raster/wildfire/r.ros/main.c:391 ../raster/wildfire/r.ros/main.c:395
+#: ../raster/wildfire/r.ros/main.c:408 ../raster/wildfire/r.spread/main.c:356
+#: ../raster/wildfire/r.spread/main.c:359
+#: ../raster/wildfire/r.spread/main.c:362
+#: ../raster/wildfire/r.spread/main.c:365
+#: ../raster/wildfire/r.spread/main.c:369
+#: ../raster/wildfire/r.spread/main.c:372
+#: ../raster/wildfire/r.spread/main.c:375 ../raster/r.support.stats/main.c:49
+#: ../raster/r.out.arc/main.c:112 ../raster/r.colors/main.c:306
+#: ../raster/r.colors/main.c:387 ../raster/r.out.ppm/main.c:116
+#: ../raster/r.stats/main.c:270 ../raster/r.statistics/main.c:79
+#: ../raster/r.statistics/main.c:85 ../raster/r.drain/main.c:189
+#: ../raster/r.drain/main.c:218 ../raster/r.info/main.c:118
+#: ../raster/r.param.scale/interface.c:172 ../raster/r.buffer/main.c:127
+#: ../raster/r.covar/main.c:95 ../raster/r.mfilter/main.c:121
+#: ../raster/r.out.vtk/main.c:47 ../raster/r.out.vtk/main.c:60
+#: ../raster/simwe/simlib/input.c:178 ../raster/simwe/simlib/input.c:184
+#: ../raster/simwe/simlib/input.c:189 ../raster/simwe/simlib/input.c:198
+#: ../raster/simwe/simlib/input.c:206 ../raster/simwe/simlib/input.c:212
+#: ../raster/simwe/simlib/input.c:218 ../raster/simwe/simlib/input.c:225
+#: ../raster/simwe/simlib/input.c:232 ../raster/simwe/simlib/input.c:239
+#: ../raster/simwe/simlib/input.c:246 ../raster/r.region/main.c:166
+#: ../raster/r.region/main.c:225 ../raster/r.region/main.c:348
+#: ../raster/r.mapcalc/map.c:377 ../raster/r.sun2/main.c:811
+#: ../raster/r.sun2/main.c:826 ../raster/r.sun2/main.c:843
+#: ../raster/r.sun2/main.c:857 ../raster/r.sun2/main.c:869
+#: ../raster/r.sun2/main.c:881 ../raster/r.sun2/main.c:892
+#: ../raster/r.sun2/main.c:904 ../raster/r.sun2/main.c:916
+#: ../raster/r.out.ascii/main.c:146 ../raster/r.lake/main.c:254
+#: ../raster/r.lake/main.c:265 ../raster/r.surf.idw/main.c:108
+#: ../raster/r.water.outlet/legal.c:23 ../raster/r.report/parse.c:243
+#: ../raster/r.sum/main.c:62 ../raster/r.distance/parse.c:79
+#: ../raster/r.distance/parse.c:86 ../raster/r.out.gridatb/check_ready.c:12
+#: ../raster/r.random/main.c:119 ../raster/r.random/main.c:124
+#: ../raster/r.topidx/check_ready.c:11 ../raster/r.basins.fill/main.c:82
+#: ../raster/r.basins.fill/main.c:94 ../raster/r.to.vect/main.c:114
+#: ../raster/r.grow2/main.c:187 ../raster/r.regression.line/main.c:86
+#: ../raster/r.regression.line/main.c:95 ../raster/r.out.mat/main.c:103
+#: ../raster/r.fill.dir/main.c:172 ../raster/r.walk/main.c:546
+#: ../raster/r.walk/main.c:549 ../raster/r.his/main.c:127
+#: ../raster/r.his/main.c:164 ../raster/r.his/main.c:189
+#: ../raster/r.thin/io.c:96 ../raster/r.surf.idw2/read_cell.c:19
+#: ../raster/r.resamp.rst/main.c:397 ../raster/r.resamp.rst/main.c:423
+#: ../raster/r.carve/main.c:178 ../raster/r.resamp.stats/main.c:296
+#: ../raster/r.cross/main.c:125 ../raster/r.texture/main.c:228
+#: ../raster/r.average/main.c:72 ../raster/r.average/main.c:75
+#: ../raster/r.to.rast3elev/main.c:114 ../raster/r.to.rast3elev/main.c:129
+#: ../raster/r.horizon/main.c:550 ../raster/r.median/main.c:75
+#: ../raster/r.colors.out/main.c:88 ../raster/r.profile/main.c:142
+#: ../raster/r.slope.aspect/main.c:360 ../raster/r.resamp.interp/main.c:103
+#: ../raster/r.contour/main.c:158 ../raster/r.bilinear/main.c:81
+#: ../raster/r.out.png/r.out.png.c:214 ../raster/r.out.tiff/r.out.tiff.c:166
+#: ../raster/r.resample/main.c:97 ../raster/r.kappa/stats.c:30
+#: ../raster/r.kappa/stats.c:35 ../raster/r.kappa/main.c:153
+#: ../raster/r.out.mpeg/main.c:217 ../raster/r.recode/main.c:81
+#: ../raster/r.neighbors/main.c:193 ../raster/r.patch/main.c:113
+#: ../raster/r.univar2/r.univar_main.c:216 ../raster/r.bitpattern/main.c:101
+#: ../raster/r.reclass/main.c:78 ../raster/r.surf.area/main.c:118
+#: ../raster/r.flow/io.c:65 ../raster/r.los/main.c:162
+#: ../raster/r.los/main.c:168 ../general/g.mremove/do_remove.c:50
+#: ../general/g.region/main.c:480 ../general/g.region/main.c:823
+#: ../general/g.region/main.c:831 ../doc/raster/r.example/main.c:111
+#: ../misc/m.nviz.image/surface.c:51 ../misc/m.nviz.image/surface.c:108
+#: ../display/d.legend/main.c:247 ../display/d.rgb/main.c:95
+#: ../display/d.colortable/main.c:102 ../display/d.profile/main.c:94
+#: ../display/d.what.rast/main.c:155 ../display/d.what.rast/opencell.c:13
+#: ../display/d.rast.arrow/arrow.c:195 ../display/d.rast.arrow/arrow.c:237
+#: ../display/d.rast.arrow/arrow.c:372 ../display/d.extend/main.c:60
+#: ../display/d.histogram/main.c:162 ../display/d.rast.num/number.c:153
+#: ../display/d.his/main.c:137 ../display/d.his/main.c:174
+#: ../display/d.his/main.c:199 ../display/d.nviz/main.c:185
+#: ../display/d.title/main.c:105 ../display/d.zoom/main.c:208
+#: ../display/d.rast/main.c:111 ../ps/ps.map/outl_io.c:68
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:197
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:227
+#: ../imagery/i.landsat.acca/main.c:58 ../imagery/i.landsat.acca/tools.c:127
+#: ../imagery/i.landsat.acca/algorithm.c:387 ../imagery/i.class/main.c:127
+#: ../imagery/i.modis.qc/main.c:217 ../imagery/i.his.rgb/openfiles.c:31
+#: ../imagery/i.his.rgb/openfiles.c:36 ../imagery/i.his.rgb/openfiles.c:41
+#: ../imagery/i.gensigset/parse.c:42 ../imagery/i.zc/main.c:111
+#: ../imagery/i.group/main.c:201 ../imagery/i.group/main.c:240
+#: ../imagery/i.fft/fftmain.c:108 ../imagery/i.gensig/parse.c:36
+#: ../imagery/i.pca/main.c:138 ../imagery/i.topo.corr/main.c:34
+#: ../imagery/i.rgb.his/openfiles.c:14 ../imagery/i.rgb.his/openfiles.c:16
+#: ../imagery/i.rgb.his/openfiles.c:18 ../imagery/i.landsat.toar/main.c:322
+#: ../imagery/i.landsat.toar/main.c:460 ../imagery/i.ifft/ifftmain.c:95
+#: ../imagery/i.ifft/ifftmain.c:105 ../visualization/xganim/main.c:366
+#: ../vector/v.extrude/main.c:180 ../vector/v.sample/main.c:158
+#: ../vector/v.vol.rst/main.c:606 ../vector/v.drape/main.c:245
+#: ../vector/v.what.rast/main.c:139
+#, c-format
+msgid "Raster map <%s> not found"
+msgstr "Harta raster <%s> nu este găsită"
+
+#: ../raster/r.out.pov/main.c:178 ../raster/r.clump/main.c:94
+#: ../raster/r.cost/main.c:370 ../raster/r.cost/main.c:675
+#: ../raster/r.cats/main.c:150 ../raster/r.support/front/front.c:227
+#: ../raster/r.composite/main.c:159 ../raster/r.grow.distance/main.c:209
+#: ../raster/r.out.ppm3/main.c:124 ../raster/r.null/null.c:324
+#: ../raster/r.sunmask/main.c:448 ../raster/wildfire/r.ros/main.c:475
+#: ../raster/wildfire/r.ros/main.c:483 ../raster/wildfire/r.ros/main.c:491
+#: ../raster/wildfire/r.ros/main.c:499 ../raster/wildfire/r.ros/main.c:507
+#: ../raster/wildfire/r.ros/main.c:515 ../raster/wildfire/r.ros/main.c:523
+#: ../raster/wildfire/r.ros/main.c:532 ../raster/wildfire/r.ros/main.c:540
+#: ../raster/wildfire/r.ros/main.c:549 ../raster/wildfire/r.spread/main.c:411
+#: ../raster/wildfire/r.spread/main.c:415
+#: ../raster/wildfire/r.spread/main.c:419
+#: ../raster/wildfire/r.spread/main.c:425
+#: ../raster/wildfire/r.spread/main.c:430
+#: ../raster/wildfire/r.spread/main.c:434
+#: ../raster/wildfire/r.spread/main.c:503 ../raster/r.out.arc/main.c:116
+#: ../raster/r.colors/stats.c:33 ../raster/r.out.ppm/main.c:120
+#: ../raster/r.random.cells/indep.c:134 ../raster/r.random.cells/init.c:68
+#: ../raster/r.buffer/read_map.c:42 ../raster/r.buffer/write_map.c:45
+#: ../raster/r.covar/main.c:98 ../raster/r.out.vtk/main.c:222
+#: ../raster/r.out.vtk/main.c:288 ../raster/r.out.vtk/main.c:317
+#: ../raster/r.out.vtk/main.c:364 ../raster/r.mapcalc/map3.c:510
+#: ../raster/r.out.ascii/main.c:151 ../raster/r.random.surface/main.c:54
+#: ../raster/r.random.surface/init.c:134 ../raster/r.lake/main.c:258
+#: ../raster/r.lake/main.c:269 ../raster/r.quantile/main.c:311
+#: ../raster/r.surf.idw/main.c:135 ../raster/r.sum/main.c:65
+#: ../raster/r.out.gdal/export_band.c:48
+#: ../raster/r.out.gdal/export_band.c:246 ../raster/r.random/count.c:24
+#: ../raster/r.random/count.c:30 ../raster/r.random/random.c:41
+#: ../raster/r.random/random.c:45 ../raster/r.to.vect/main.c:117
+#: ../raster/r.grow2/main.c:203 ../raster/r.regression.line/main.c:90
+#: ../raster/r.regression.line/main.c:99 ../raster/r.out.mat/main.c:108
+#: ../raster/r.walk/main.c:573 ../raster/r.walk/main.c:576
+#: ../raster/r.walk/main.c:922 ../raster/r.his/main.c:131
+#: ../raster/r.his/main.c:154 ../raster/r.his/main.c:179
+#: ../raster/r.thin/io.c:100 ../raster/r.to.rast3/main.c:366
+#: ../raster/r.surf.idw2/read_cell.c:34 ../raster/r.resamp.rst/main.c:402
+#: ../raster/r.resamp.rst/main.c:434 ../raster/r.carve/main.c:181
+#: ../raster/r.resamp.stats/main.c:329 ../raster/r.cross/main.c:129
+#: ../raster/r.texture/main.c:234 ../raster/r.to.rast3elev/main.c:160
+#: ../raster/r.profile/main.c:144 ../raster/r.resamp.interp/main.c:138
+#: ../raster/r.contour/main.c:162 ../raster/r.bilinear/main.c:94
+#: ../raster/r.out.png/r.out.png.c:217 ../raster/r.out.tiff/r.out.tiff.c:188
+#: ../raster/r.recode/recode.c:48 ../raster/r.univar2/r.univar_main.c:221
+#: ../raster/r.bitpattern/main.c:108 ../raster/r.surf.area/main.c:121
+#: ../raster/r.los/main.c:198 ../raster/r.los/main.c:209
+#: ../doc/raster/r.example/main.c:122 ../display/d.rgb/main.c:99
+#: ../display/d.profile/What.c:23 ../display/d.profile/ExtractProf.c:93
+#: ../display/d.what.rast/opencell.c:24 ../display/d.rast.arrow/arrow.c:380
+#: ../display/d.rast.num/number.c:157 ../display/d.rast.edit/cell.c:92
+#: ../display/d.his/main.c:141 ../display/d.his/main.c:164
+#: ../display/d.nviz/main.c:187 ../display/d.rast/display.c:79
+#: ../imagery/i.landsat.acca/main.c:61 ../imagery/i.landsat.acca/tools.c:130
+#: ../imagery/i.landsat.acca/algorithm.c:389
+#: ../imagery/i.cluster/open_files.c:56 ../imagery/i.modis.qc/main.c:221
+#: ../imagery/i.maxlik/open.c:41 ../imagery/i.his.rgb/openfiles.c:33
+#: ../imagery/i.his.rgb/openfiles.c:38 ../imagery/i.his.rgb/openfiles.c:43
+#: ../imagery/i.smap/shapiro/opencell.c:16
+#: ../imagery/i.gensigset/opencell.c:13 ../imagery/i.gensig/opencell.c:12
+#: ../imagery/i.pca/main.c:141 ../imagery/i.rgb.his/openfiles.c:21
+#: ../imagery/i.rgb.his/openfiles.c:23 ../imagery/i.rgb.his/openfiles.c:25
+#: ../imagery/i.landsat.toar/main.c:326 ../imagery/i.landsat.toar/main.c:465
+#: ../visualization/xganim/main.c:370 ../vector/v.extrude/main.c:184
+#: ../vector/v.sample/main.c:161 ../vector/v.vol.rst/main.c:609
+#: ../vector/v.drape/main.c:250 ../vector/v.what.rast/main.c:142
+#: ../vector/v.to.rast/support.c:265 ../vector/v.to.rast/support.c:511
+#, c-format
+msgid "Unable to open raster map <%s>"
+msgstr "Imposibil de deschis harta raster <%s>"
+
+#: ../raster/r.out.pov/main.c:183
+#, c-format
+msgid "Invalid output filename <%s>"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:186 ../raster/r.out.mat/main.c:115
+#: ../raster/r.colors.out/main.c:101 ../raster/r.out.png/r.out.png.c:233
+#, c-format
+msgid "Unable to open output file <%s>"
+msgstr "Imposibil de deschis fișierul de ieșire <%s>"
+
+#: ../raster/r.out.pov/main.c:193
+#, c-format
+msgid "Raster map is too big! Exceeds %d columns or %d rows"
+msgstr ""
+
+#: ../raster/r.out.pov/main.c:214
+msgid "Negative elevation values in input"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:47
+msgid "raster, export, VRML"
+msgstr "raster, export, VRML"
+
+#: ../raster/r.out.vrml/main.c:49
+msgid "Export a raster map to the Virtual Reality Modeling Language (VRML)"
+msgstr "Exportă hartă raster în Virtual Reality Modeling Language (VRML)"
+
+#: ../raster/r.out.vrml/main.c:56
+msgid "Name of elevation map"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:63
+msgid "Name of color file"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:70 ../misc/m.nviz.image/args.c:494
+msgid "Vertical exaggeration"
+msgstr "Exagerarea verticală"
+
+#: ../raster/r.out.vrml/main.c:77
+msgid "Name for new VRML file"
+msgstr ""
+
+#: ../raster/r.out.vrml/main.c:163
+#, c-format
+msgid "Opening %s for writing... "
+msgstr ""
+
+#: ../raster/r.out.vrml/put_grid.c:37
+msgid "Writing vertices..."
+msgstr "Scrierea vertecșilor..."
+
+#: ../raster/r.out.vrml/put_grid.c:82
+msgid "Writing color file..."
+msgstr "Scrierea fișierului de culoare..."
+
+#: ../raster/r.clump/main.c:49 ../raster/r.reclass/main.c:49
+msgid "raster, statistics, reclass"
+msgstr "raster, statistici, reclasificare"
+
+#: ../raster/r.clump/main.c:51
+msgid "Recategorizes data in a raster map by grouping cells that form physically discrete areas into unique categories."
+msgstr "Sortează datele dintr-o hartă raster în funcție de gruparea celulelor care formează areale fizice discrete într-o singură categorie."
+
+#: ../raster/r.clump/main.c:63 ../raster/r.recode/main.c:60
+msgid "Title for output raster map"
+msgstr ""
+
+#: ../raster/r.clump/main.c:68 ../raster/r.series/main.c:170
+#: ../raster/r.out.ppm3/main.c:90 ../raster/r.colors/main.c:249
+#: ../raster/r.out.ppm/main.c:69 ../raster/r.buffer/main.c:101
+#: ../raster/r.covar/main.c:67 ../raster/r.distance/parse.c:64
+#: ../raster/r.carve/main.c:116 ../raster/r.cross/main.c:100
+#: ../raster/r.compress/main.c:82 ../raster/r.contour/main.c:135
+#: ../raster/r.out.png/r.out.png.c:136 ../raster/r.neighbors/main.c:171
+#: ../raster/r.describe/main.c:107 ../imagery/i.maxlik/main.c:95
+#: ../imagery/i.smap/shapiro/parse.c:43
+msgid "Run quietly"
+msgstr ""
+
+#: ../raster/r.clump/main.c:77 ../raster/r.series/main.c:188
+#: ../raster/r.out.ppm3/main.c:102 ../raster/r.colors/main.c:258
+#: ../raster/r.buffer/main.c:110 ../raster/r.covar/main.c:75
+#: ../raster/r.random.surface/init.c:109 ../raster/r.distance/parse.c:72
+#: ../raster/r.to.vect/main.c:100 ../raster/r.rescale.eq/main.c:107
+#: ../raster/r.carve/main.c:126 ../raster/r.rescale/main.c:103
+#: ../raster/r.cross/main.c:107 ../raster/r.texture/main.c:221
+#: ../raster/r.compress/main.c:90 ../raster/r.slope.aspect/main.c:301
+#: ../raster/r.out.png/r.out.png.c:159 ../raster/r.resample/main.c:90
+#: ../raster/r.neighbors/main.c:292 ../raster/r.patch/main.c:87
+#: ../raster/r.describe/main.c:115 ../vector/v.mkgrid/main.c:141
+#: ../vector/v.qcount/main.c:117
+msgid "The '-q' flag is superseded and will be removed in future. Please use '--quiet' instead."
+msgstr ""
+
+#: ../raster/r.clump/main.c:90 ../raster/r.mode/main.c:94
+#: ../raster/r.cost/main.c:352 ../raster/r.cost/main.c:356
+#: ../raster/r.watershed/shed/com_line.c:231
+#: ../raster/r.watershed/shed/com_line.c:266
+#: ../raster/wildfire/r.spread/main.c:380
+#: ../raster/wildfire/r.spread/main.c:389
+#: ../raster/wildfire/r.spread/main.c:399 ../raster/r.in.ascii/main.c:203
+#: ../raster/r.drain/main.c:206 ../raster/r.buffer/main.c:130
+#: ../raster/r.surf.idw/main.c:112 ../raster/r.water.outlet/legal.c:10
+#: ../raster/r.random/main.c:147 ../raster/r.random/main.c:152
+#: ../raster/r.in.gdal/main.c:225 ../raster/r.in.mat/main.c:388
+#: ../raster/r.surf.gauss/main.c:77 ../raster/r.walk/main.c:554
+#: ../raster/r.walk/main.c:558 ../raster/r.surf.idw2/main.c:83
+#: ../raster/r.texture/main.c:231 ../raster/r.average/main.c:78
+#: ../raster/r.to.rast3elev/main.c:472 ../raster/r.median/main.c:77
+#: ../raster/r.slope.aspect/opennew.c:11 ../raster/r.recode/main.c:84
+#: ../raster/r.neighbors/main.c:197 ../raster/r.surf.fractal/interface.c:79
+#: ../raster/r.bitpattern/main.c:104 ../raster/r.reclass/main.c:81
+#: ../raster/r.los/main.c:173 ../general/manage/cmd/rename.c:84
+#: ../general/manage/cmd/copy.c:88 ../doc/raster/r.example/main.c:114
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:91
+#: ../imagery/i.landsat.acca/main.c:189 ../imagery/i.zc/main.c:119
+#: ../imagery/i.fft/fftmain.c:121 ../imagery/i.fft/fftmain.c:124
+#: ../imagery/i.landsat.toar/main.c:476 ../imagery/i.ifft/ifftmain.c:116
+#: ../vector/v.kernel/main.c:323 ../vector/v.surf.idw/main.c:137
+#: ../vector/v.to.rast3/main.c:69 ../vector/v.edit/main.c:87
+#: ../vector/v.in.ogr/main.c:337
+#, c-format
+msgid "<%s> is an illegal file name"
+msgstr ""
+
+#: ../raster/r.clump/main.c:98 ../raster/r.in.arc/main.c:154
+#: ../raster/r.composite/main.c:192 ../raster/r.in.xyz/main.c:498
+#: ../raster/r.series/main.c:250 ../raster/r.null/null.c:329
+#: ../raster/r.sunmask/main.c:450 ../raster/r.in.ascii/main.c:206
+#: ../raster/r.buffer/write_map.c:40 ../raster/r.mapcalc/map.c:507
+#: ../raster/r.mapcalc/map3.c:580 ../raster/r.sun2/main.c:1164
+#: ../raster/r.sun2/main.c:1171 ../raster/r.sun2/main.c:1178
+#: ../raster/r.sun2/main.c:1185 ../raster/r.sun2/main.c:1192
+#: ../raster/r.sun2/main.c:1199 ../raster/r.random.surface/save.c:23
+#: ../raster/r.lake/main.c:229 ../raster/r.lake/main.c:318
+#: ../raster/r.surf.idw/main.c:147 ../raster/r.random/random.c:55
+#: ../raster/r.basins.fill/main.c:106 ../raster/r.in.gdal/main.c:774
+#: ../raster/r.in.gdal/main.c:779 ../raster/r.in.gdal/main.c:796
+#: ../raster/r.circle/dist.c:127 ../raster/r.grow2/main.c:209
+#: ../raster/r.in.mat/main.c:430 ../raster/r.thin/io.c:168
+#: ../raster/r.surf.idw2/main.c:111 ../raster/r.carve/main.c:189
+#: ../raster/r.resamp.stats/main.c:341 ../raster/r.cross/main.c:145
+#: ../raster/r.texture/main.c:309 ../raster/r.li/r.li.daemon/daemon.c:132
+#: ../raster/r.slope.aspect/opennew.c:19 ../raster/r.resamp.interp/main.c:148
+#: ../raster/r.bilinear/main.c:104 ../raster/r.patch/main.c:144
+#: ../raster/r.surf.fractal/write_rast.c:58 ../raster/r.bitpattern/main.c:125
+#: ../raster/r.surf.random/randsurf.c:28 ../raster/r.surf.random/randsurf.c:32
+#: ../raster/r.flow/io.c:173 ../raster/r.flow/io.c:208
+#: ../raster/r.los/main.c:203 ../doc/raster/r.example/main.c:141
+#: ../raster3d/r3.to.rast/main.c:183 ../imagery/i.landsat.acca/tools.c:140
+#: ../imagery/i.landsat.acca/algorithm.c:234
+#: ../imagery/i.landsat.acca/algorithm.c:397 ../imagery/i.modis.qc/main.c:235
+#: ../imagery/i.maxlik/open.c:74 ../imagery/i.his.rgb/openfiles.c:15
+#: ../imagery/i.his.rgb/openfiles.c:17 ../imagery/i.his.rgb/openfiles.c:19
+#: ../imagery/i.smap/shapiro/opencell.c:30 ../imagery/i.topo.corr/main.c:58
+#: ../imagery/i.rgb.his/openfiles.c:29 ../imagery/i.rgb.his/openfiles.c:31
+#: ../imagery/i.rgb.his/openfiles.c:33 ../imagery/i.landsat.toar/main.c:479
+#: ../imagery/i.ifft/ifftmain.c:219 ../vector/v.kernel/main.c:328
+#: ../vector/v.surf.idw/main.c:264 ../vector/lidar/v.surf.bspline/main.c:317
+#: ../vector/v.to.rast/vect2rast.c:125 ../vector/v.to.rast/vect2rast.c:129
+#: ../vector/v.neighbors/main.c:96
+#, c-format
+msgid "Unable to create raster map <%s>"
+msgstr "Imposibil de creat harta raster<%s>"
+
+#: ../raster/r.clump/main.c:120
+#, c-format
+msgid "%d clumps."
+msgstr ""
+
+#: ../raster/r.clump/clump.c:98
+#, c-format
+msgid "Pass %d..."
+msgstr ""
+
+#: ../raster/r.clump/clump.c:101
+#, c-format
+msgid "Unable to read raster map row %d "
+msgstr "Imposibil de citit rândul hărții raster %d "
+
+#: ../raster/r.clump/clump.c:238
+#, c-format
+msgid "Failed writing raster map row %d"
+msgstr "Scrierea rândului hății raster a eșuat %d"
+
+#: ../raster/r.in.arc/main.c:59 ../raster/r.in.gridatb/main.c:41
+#: ../raster/r.in.poly/main.c:29 ../raster/r.in.gdal/main.c:79
+#: ../raster/r.in.mat/main.c:92 ../raster/r.external/main.c:520
+#: ../raster/r.in.bin/main.c:234
+#: ../locale/scriptstrings/r.in.srtm_to_translate.c:2
+msgid "raster, import"
+msgstr "raster, import"
+
+#: ../raster/r.in.arc/main.c:61
+msgid "Converts an ESRI ARC/INFO ascii raster file (GRID) into a (binary) raster map layer."
+msgstr "Convertește un fișier raster ascii ESRI ARC/INFO (GRID) într-un strat raster (binar)."
+
+#: ../raster/r.in.arc/main.c:69
+msgid "ARC/INFO ASCII raster file (GRID) to be imported"
+msgstr "Fișier raster (GRID) ARC/INFO ASCII  pentru a fi importat"
+
+#: ../raster/r.in.arc/main.c:80 ../raster/r.in.xyz/main.c:185
+msgid "Storage type for resultant raster map"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:87 ../raster/r.in.poly/main.c:44
+#: ../raster/r.in.ascii/main.c:85 ../raster/r.in.gdal/main.c:121
+#: ../raster/r.external/main.c:550 ../raster/r.in.bin/main.c:277
+msgid "Title for resultant raster map"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:94 ../raster/r.in.ascii/main.c:92
+msgid "Multiplier for ASCII data"
+msgstr ""
+
+#: ../raster/r.in.arc/main.c:114 ../raster/r.in.ascii/main.c:128
+#: ../raster/r.in.ascii/main.c:155 ../raster/r.resamp.rst/main.c:616
+#: ../raster/r.resamp.rst/main.c:628 ../raster/r.resamp.rst/main.c:641
+#: ../raster/r.resamp.rst/main.c:655 ../raster/r.resamp.rst/main.c:668
+#: ../raster/r.resamp.rst/main.c:681 ../general/g.setproj/get_stp.c:162
+#: ../general/g.setproj/get_stp.c:165 ../general/g.setproj/get_stp.c:282
+#: ../general/g.setproj/get_stp.c:286 ../display/d.text/main.c:193
+#: ../display/d.text.new/main.c:417 ../display/d.title/main.c:119
+#: ../vector/v.in.ascii/in.c:248 ../vector/v.surf.rst/main.c:646
+#: ../vector/v.surf.rst/main.c:655 ../vector/v.surf.rst/main.c:664
+#: ../vector/v.surf.rst/main.c:674 ../vector/v.surf.rst/main.c:683
+#: ../vector/v.surf.rst/main.c:692
+#, c-format
+msgid "Unable to open temporary file <%s>"
+msgstr "Imposibil de a deschide temporar fișierul <%s>"
+
+#: ../raster/r.in.arc/main.c:124 ../raster/r.in.xyz/main.c:470
+#: ../raster/r.in.mat/main.c:144 ../display/d.linegraph/linegraph.c:193
+#: ../display/d.linegraph/linegraph.c:204 ../vector/v.net.path/path.c:49
+#: ../vector/v.segment/main.c:92 ../vector/v.lrs/v.lrs.segment/main.c:131
+#, c-format
+msgid "Unable to open input file <%s>"
+msgstr "Imposibil de a deschide fișierul de intrare <%s>"
+
+#: ../raster/r.in.arc/main.c:127 ../raster/r.in.ascii/main.c:185
+msgid "Can't get cell header"
+msgstr "Nu se poate obține antetul celulei"
+
+#: ../raster/r.in.arc/main.c:132 ../raster/r.in.ascii/main.c:190
+#: ../raster/r.out.tiff/r.out.tiff.c:173 ../vector/v.digit/driver.c:82
+msgid "Can't set window"
+msgstr "Nu se poate seta fereastra"
+
+#: ../raster/r.in.arc/main.c:135 ../raster/r.in.ascii/main.c:193
+#: ../raster/r.horizon/main.c:623
+#, c-format
+msgid "OOPS: rows changed from %d to %d"
+msgstr "OOPS: rânduri schimbate din %d în %d"
+
+#: ../raster/r.in.arc/main.c:138 ../raster/r.in.ascii/main.c:196
+#: ../raster/r.horizon/main.c:627
+#, c-format
+msgid "OOPS: cols changed from %d to %d"
+msgstr "OOPS: coloane schimbate din %d în %d"
+
+#: ../raster/r.in.arc/main.c:161 ../raster/r.in.ascii/main.c:212
+#, c-format
+msgid "Data conversion failed at row %d, col %d"
+msgstr "Conversia datelor a eșuat la rândul %d, coloana %d"
+
+#: ../raster/r.in.arc/main.c:228
+msgid "Failed to copy file"
+msgstr "Eșuare în copierea fișierului"
+
+#: ../raster/r.in.arc/gethead.c:88
+msgid "Illegal line in header"
+msgstr ""
+
+#: ../raster/r.in.arc/gethead.c:160 ../raster/r.in.ascii/gethead.c:251
+#, c-format
+msgid "Duplicate \"%s\" field in header"
+msgstr ""
+
+#: ../raster/r.in.arc/gethead.c:165
+#, c-format
+msgid "Illegal \"%s\" value in header: \"%s\""
+msgstr ""
+
+#: ../raster/r.in.arc/gethead.c:173 ../raster/r.in.ascii/gethead.c:264
+#, c-format
+msgid "\"%s\" field missing from header"
+msgstr ""
+
+#: ../raster/r.mode/main.c:50 ../raster/r.coin/main.c:66
+#: ../raster/r.support.stats/main.c:39 ../raster/r.stats/main.c:103
+#: ../raster/r.statistics/main.c:42 ../raster/r.covar/main.c:53
+#: ../raster/r.quantile/main.c:254 ../raster/r.report/main.c:64
+#: ../raster/r.sum/main.c:46 ../raster/r.surf.gauss/main.c:46
+#: ../raster/r.regression.line/main.c:42 ../raster/r.cross/main.c:75
+#: ../raster/r.texture/main.c:74 ../raster/r.average/main.c:51
+#: ../raster/r.median/main.c:46 ../raster/r.kappa/main.c:67
+#: ../raster/r.neighbors/main.c:108 ../raster/r.univar2/r.univar_main.c:97
+#: ../raster/r.surf.area/main.c:86
+#: ../locale/scriptstrings/r.univar.sh_to_translate.c:2
+msgid "raster, statistics"
+msgstr "raster, statistici"
+
+#: ../raster/r.mode/main.c:52
+msgid "Finds the mode of values in a cover map within areas assigned the same category value in a user-specified base map."
+msgstr ""
+
+#: ../raster/r.mode/main.c:58
+msgid "Base map to be reclassified"
+msgstr ""
+
+#: ../raster/r.mode/main.c:65
+msgid "Coverage map"
+msgstr ""
+
+#: ../raster/r.mode/main.c:72
+msgid "Output map"
+msgstr ""
+
+#: ../raster/r.mode/main.c:86
+#, c-format
+msgid "%s: base raster map not found"
+msgstr "%s: harta raster de bază nu a fost găsită"
+
+#: ../raster/r.mode/main.c:91
+#, c-format
+msgid "%s: cover raster map not found"
+msgstr "%s: harta raster de acoperire nu a fost găsită"
+
+#: ../raster/r.mode/main.c:97
+#, c-format
+msgid "%s: base map and output map must be different"
+msgstr "%s: harta raster de bază și cea de ieșire trebuie să fie diferite"
+
+#: ../raster/r.mode/main.c:101
+#, c-format
+msgid "%s: Unable to read category labels"
+msgstr "%s: Imposibil de citit etichetele categoriilor"
+
+#: ../raster/r.mode/read_stats.c:14
+msgid "reading r.stats output"
+msgstr ""
+
+#: ../raster/r.cost/main.c:128 ../raster/r.walk/main.c:177
+msgid "raster, cost surface, cumulative costs"
+msgstr "raster, costul suprafeței, costuri cumulate"
+
+#: ../raster/r.cost/main.c:130
+msgid "Creates a raster map showing the cumulative cost of moving between different geographic locations on an input raster map whose cell category values represent cost."
+msgstr "Crează o hartă raster care arată costul cumulat a deplasării dintre locații geografice diferite pe o hartă raster a cărui celule are valori ce reprezintă costul."
+
+#: ../raster/r.cost/main.c:137
+msgid "Name of raster map containing grid cell cost information"
+msgstr ""
+
+#: ../raster/r.cost/main.c:147 ../raster/r.walk/main.c:214
+msgid "Name of output raster map to contain movement directions"
+msgstr ""
+
+#: ../raster/r.cost/main.c:152
+msgid "Name of starting vector points map"
+msgstr ""
+
+#: ../raster/r.cost/main.c:153 ../raster/r.cost/main.c:165
+#: ../raster/r.cost/main.c:174 ../raster/r.cost/main.c:224
+#: ../raster/r.drain/main.c:140 ../raster/r.drain/main.c:146
+msgid "Start"
+msgstr ""
+
+#: ../raster/r.cost/main.c:158
+msgid "Name of stop vector points map"
+msgstr ""
+
+#: ../raster/r.cost/main.c:159 ../raster/r.cost/main.c:183
+msgid "Stop"
+msgstr "Oprește"
+
+#: ../raster/r.cost/main.c:164
+msgid "Name of starting raster points map"
+msgstr ""
+
+#: ../raster/r.cost/main.c:173
+msgid "Map grid coordinates of a starting point (E,N)"
+msgstr ""
+
+#: ../raster/r.cost/main.c:182
+msgid "Map grid coordinates of a stopping point (E,N)"
+msgstr ""
+
+#: ../raster/r.cost/main.c:192
+msgid "Optional maximum cumulative cost"
+msgstr ""
+
+#: ../raster/r.cost/main.c:201 ../raster/r.walk/main.c:260
+msgid "Cost assigned to null cells. By default, null cells are excluded"
+msgstr ""
+
+#: ../raster/r.cost/main.c:210 ../raster/r.in.xyz/main.c:235
+#: ../raster/r.walk/main.c:268
+msgid "Percent of map to keep in memory"
+msgstr ""
+
+#: ../raster/r.cost/main.c:215 ../raster/r.walk/main.c:310
+msgid "Use the 'Knight's move'; slower, but more accurate"
+msgstr ""
+
+#: ../raster/r.cost/main.c:219
+msgid "Keep null values in output raster map"
+msgstr ""
+
+#: ../raster/r.cost/main.c:223 ../raster/r.walk/main.c:318
+msgid "Start with values in raster map"
+msgstr ""
+
+#: ../raster/r.cost/main.c:229 ../raster/wildfire/r.ros/main.c:301
+#: ../raster/wildfire/r.spreadpath/main.c:110 ../display/d.vect/main.c:314
+msgid "Run verbosely"
+msgstr ""
+
+#: ../raster/r.cost/main.c:238 ../raster/wildfire/r.ros/main.c:314
+#: ../raster/wildfire/r.spread/main.c:255 ../raster/r.in.mat/main.c:125
+#: ../raster/r.out.mat/main.c:90 ../raster/r.out.tiff/r.out.tiff.c:144
+#: ../display/d.vect/main.c:367 ../display/d.mon/pgms/release.c:36
+#: ../visualization/nviz/src/nviz_init.c:157
+msgid "The '-v' flag is superseded and will be removed in future. Please use '--verbose' instead."
+msgstr ""
+
+#: ../raster/r.cost/main.c:256 ../raster/wildfire/r.spread/main.c:338
+#: ../raster/r.water.outlet/main.c:85 ../raster/r.walk/main.c:339
+msgid "Unable to read current window parameters"
+msgstr ""
+
+#: ../raster/r.cost/main.c:290
+msgid "Must specify exactly one of start_points, start_rast or coordinate"
+msgstr ""
+
+#: ../raster/r.cost/main.c:295 ../raster/r.cost/main.c:614
+#: ../raster/r.cost/main.c:720
+msgid "No start points"
+msgstr ""
+
+#: ../raster/r.cost/main.c:302 ../raster/r.walk/main.c:368
+#, c-format
+msgid "Inappropriate maximum cost: %d"
+msgstr ""
+
+#: ../raster/r.cost/main.c:306 ../raster/r.walk/main.c:372
+#, c-format
+msgid "Inappropriate percent memory: %d"
+msgstr ""
+
+#: ../raster/r.cost/main.c:319 ../raster/r.drain/main.c:284
+#: ../raster/r.region/main.c:237 ../raster/r.carve/main.c:172
+#: ../general/g.mremove/do_remove.c:34 ../general/g.region/main.c:548
+#: ../doc/vector/v.example/main.c:73 ../misc/m.nviz.image/vector.c:81
+#: ../display/d.path/main.c:193 ../display/d.thematic.area/main.c:211
+#: ../display/d.vect/main.c:451 ../display/d.extend/main.c:97
+#: ../display/d.what.vect/main.c:148 ../display/d.extract/main.c:98
+#: ../display/d.vect.chart/main.c:246 ../display/d.zoom/main.c:245
+#: ../vector/v.kernel/main.c:275 ../vector/v.extrude/main.c:144
+#: ../vector/v.label/main.c:270 ../vector/v.delaunay2/main.c:117
+#: ../vector/v.out.dxf/main.c:69 ../vector/v.transform/main.c:307
+#: ../vector/v.surf.rst/main.c:565 ../vector/v.info/main.c:103
+#: ../vector/v.category/main.c:226 ../vector/v.out.ogr/main.c:196
+#: ../vector/v.out.svg/main.c:141 ../vector/v.sample/main.c:152
+#: ../vector/v.type/main.c:202 ../vector/v.net/main.c:143
+#: ../vector/v.net/main.c:158 ../vector/v.convert/old2new.c:26
+#: ../vector/v.convert/att.c:30 ../vector/v.buffer2/main.c:311
+#: ../vector/v.net.salesman/main.c:171 ../vector/v.build.polylines/main.c:145
+#: ../vector/v.net.path/main.c:131 ../vector/v.out.pov/main.c:94
+#: ../vector/v.to.points/main.c:244 ../vector/v.label.sa/labels.c:60
+#: ../vector/v.clean/main.c:241 ../vector/v.db.select/main.c:132
+#: ../vector/v.voronoi/vo_main.c:158 ../vector/v.voronoi/dt_main.c:77
+#: ../vector/v.vect.stats/main.c:252 ../vector/v.vect.stats/main.c:259
+#: ../vector/v.univar/main.c:161 ../vector/v.class/main.c:95
+#: ../vector/v.drape/main.c:261 ../vector/v.buffer/main.c:365
+#: ../vector/v.extract/main.c:193 ../vector/v.segment/main.c:99
+#: ../vector/v.hull/main.c:300 ../vector/v.distance/main.c:303
+#: ../vector/v.qcount/main.c:128 ../vector/v.to.db/parse.c:128
+#: ../vector/v.overlay/main.c:225 ../vector/v.what/main.c:151
+#: ../vector/v.normal/main.c:128 ../vector/v.edit/main.c:146
+#: ../vector/v.net.alloc/main.c:143 ../vector/v.net.steiner/main.c:428
+#: ../vector/v.net.iso/main.c:181 ../vector/v.what.rast/main.c:120
+#: ../vector/v.kcv/main.c:132 ../vector/v.select/main.c:103
+#: ../vector/lidar/v.lidar.growing/main.c:129
+#: ../vector/lidar/v.surf.bspline/main.c:219
+#: ../vector/lidar/v.surf.bspline/main.c:273
+#: ../vector/lidar/v.lidar.edgedetection/main.c:217
+#: ../vector/lidar/v.lidar.correction/main.c:182
+#: ../vector/lidar/v.outlier/main.c:156
+#: ../vector/v.lrs/v.lrs.segment/main.c:138
+#: ../vector/v.lrs/v.lrs.create/main.c:250
+#: ../vector/v.lrs/v.lrs.create/main.c:257
+#: ../vector/v.lrs/v.lrs.where/main.c:127
+#: ../vector/v.lrs/v.lrs.where/main.c:135
+#: ../vector/v.lrs/v.lrs.label/main.c:286 ../vector/v.reclass/main.c:108
+#: ../vector/v.to.rast/vect2rast.c:37 ../vector/v.db.connect/main.c:140
+#: ../vector/v.perturb/main.c:154 ../vector/v.generalize/main.c:290
+#, c-format
+msgid "Vector map <%s> not found"
+msgstr "Harta vectorială <%s> nu a fost găsită"
+
+#: ../raster/r.cost/main.c:324
+msgid "Assigning negative cost to null cell. Null cells excluded."
+msgstr ""
+
+#: ../raster/r.cost/main.c:402 ../raster/r.walk/main.c:682
+msgid "Creating some temporary files..."
+msgstr "Crează câteva fișiere temporare..."
+
+#: ../raster/r.cost/main.c:435 ../raster/r.cost/main.c:687
+#: ../raster/r.series/main.c:214 ../raster/r.grow.distance/main.c:259
+#: ../raster/r.colors/stats.c:41 ../raster/r.colors/stats.c:107
+#: ../raster/r.surf.idw/main.c:685 ../raster/r.surf.idw2/read_cell.c:38
+#, c-format
+msgid "Reading raster map <%s>..."
+msgstr "Citirea hărții raster <%s>..."
+
+#: ../raster/r.cost/main.c:447 ../raster/r.cost/main.c:691
+#: ../raster/r.cost/main.c:1039 ../raster/r.cost/main.c:1072
+#: ../raster/r.cost/main.c:1105 ../raster/r.null/null.c:340
+#: ../raster/r.sunmask/main.c:481 ../raster/r.colors/stats.c:46
+#: ../raster/r.colors/stats.c:113 ../raster/r.out.ppm/main.c:188
+#: ../raster/r.buffer/read_map.c:63 ../raster/r.buffer/write_map.c:61
+#: ../raster/r.lake/main.c:288 ../raster/r.lake/main.c:293
+#: ../raster/r.out.gdal/export_band.c:90
+#: ../raster/r.out.gdal/export_band.c:121
+#: ../raster/r.out.gdal/export_band.c:152
+#: ../raster/r.out.gdal/export_band.c:397
+#: ../raster/r.out.gdal/export_band.c:430
+#: ../raster/r.out.gdal/export_band.c:463 ../raster/r.topidx/file_io.c:77
+#: ../raster/r.walk/main.c:737 ../raster/r.walk/main.c:796
+#: ../raster/r.walk/main.c:940 ../raster/r.walk/main.c:1514
+#: ../raster/r.walk/main.c:1549 ../raster/r.walk/main.c:1584
+#: ../raster/r.profile/read_rast.c:45 ../raster/r.profile/read_rast.c:73
+#: ../raster/r.profile/read_rast.c:101 ../raster/r.patch/main.c:156
+#: ../raster/r.patch/main.c:163 ../raster/r.bitpattern/main.c:135
+#: ../raster/r.los/main.c:264 ../raster/r.los/main.c:272
+#: ../doc/raster/r.example/main.c:154 ../imagery/i.landsat.acca/tools.c:155
+#: ../imagery/i.landsat.acca/tools.c:159 ../imagery/i.landsat.acca/tools.c:163
+#: ../imagery/i.landsat.acca/algorithm.c:252
+#: ../imagery/i.landsat.acca/algorithm.c:411
+#: ../imagery/i.landsat.acca/algorithm.c:414
+#: ../imagery/i.gensigset/get_train.c:36 ../imagery/i.gensig/get_train.c:32
+#: ../vector/v.what.rast/main.c:276 ../vector/v.what.rast/main.c:281
+#: ../vector/v.to.rast/support.c:523
+#, c-format
+msgid "Unable to read raster map <%s> row %d"
+msgstr "Imposibil de citit harta raster <%s> rândul %d"
+
+#: ../raster/r.cost/main.c:461 ../raster/r.cost/main.c:479
+#: ../raster/r.cost/main.c:498
+#, c-format
+msgid "Negative cell value found at row %d, col %d. Setting negative value to null_cost value"
+msgstr ""
+
+#: ../raster/r.cost/main.c:517
+msgid "Initializing output..."
+msgstr ""
+
+#: ../raster/r.cost/main.c:540 ../raster/r.walk/main.c:880
+msgid "Initializing directional output "
+msgstr ""
+
+#: ../raster/r.cost/main.c:581 ../raster/r.drain/main.c:290
+msgid "Failed to guess site file format"
+msgstr ""
+
+#: ../raster/r.cost/main.c:631
+msgid "Failed to guess site file format\n"
+msgstr ""
+
+#: ../raster/r.cost/main.c:685 ../raster/r.texture/h_measure.c:770
+#: ../imagery/i.smap/bouman/interp.c:69
+msgid "Unable to allocate memory"
+msgstr ""
+
+#: ../raster/r.cost/main.c:735 ../raster/r.walk/main.c:982
+msgid "Specified starting location outside database window"
+msgstr ""
+
+#: ../raster/r.cost/main.c:751
+msgid "Finding cost path..."
+msgstr ""
+
+#: ../raster/r.cost/main.c:1001
+msgid "No data"
+msgstr ""
+
+#: ../raster/r.cost/main.c:1005 ../raster/r.walk/main.c:1475
+msgid "Error, ct == pres_cell"
+msgstr ""
+
+#: ../raster/r.cost/main.c:1025 ../raster/r.composite/main.c:199
+#: ../raster/r.random.cells/indep.c:137 ../raster/r.drain/main.c:466
+#: ../raster/r.drain/main.c:519 ../raster/r.random.surface/save.c:100
+#: ../imagery/i.smap/shapiro/write_img.c:12
+#, c-format
+msgid "Writing raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.cost/main.c:1133 ../raster/r.walk/main.c:1611
+#, c-format
+msgid "Writing movement direction file %s..."
+msgstr ""
+
+#: ../raster/r.cost/main.c:1187
+#, c-format
+msgid "Peak cost value: %f."
+msgstr ""
+
+#: ../raster/r.cost/main.c:1209 ../raster/r.walk/main.c:1697
+#, c-format
+msgid "Illegal x coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.cost/main.c:1211 ../raster/r.walk/main.c:1699
+#, c-format
+msgid "Illegal y coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.cost/main.c:1215 ../raster/r.walk/main.c:1703
+#, c-format
+msgid "Warning, ignoring point outside window: %.4f,%.4f"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:58
+#, c-format
+msgid "NULL value computed (row %d, col %d)"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:146
+#, c-format
+msgid "Unable to find row %d, col %d: %f"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:185
+msgid "Illegal delete request"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:403
+msgid "Bad start cell"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:417
+#, c-format
+msgid "%s %f-%f lower cost higher or equal"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:423
+#, c-format
+msgid "%s lower above pointer wrong"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:430
+#, c-format
+msgid "%s %f-%f higher cost lower"
+msgstr ""
+
+#: ../raster/r.cost/btree.c:436
+#, c-format
+msgid "%s higher above pointer wrong"
+msgstr ""
+
+#: ../raster/r.cats/cats.c:35
+#, c-format
+msgid "Cannot read header of raster map <%s> in <%s>"
+msgstr "Nu s-a putut citi antetul hărții raster <%s> în <%s>"
+
+#: ../raster/r.cats/cats.c:43
+#, c-format
+msgid "Cannot open cell file of raster map <%s> in <%s>"
+msgstr "Nu s-a putut deschide fișierul de celule pentru harta raster <%s> în <%s>"
+
+#: ../raster/r.cats/cats.c:51
+#, c-format
+msgid "Reading <%s> in <%s>"
+msgstr "Citirea <%s> în <%s>"
+
+#: ../raster/r.cats/main.c:51
+msgid "raster, category"
+msgstr "raster, categorie"
+
+#: ../raster/r.cats/main.c:53
+msgid "Manages category values and labels associated with user-specified raster map layers."
+msgstr "Gestionează categorii de valori și etichete asociate cu o hartă raster specificată de utilizator."
+
+#: ../raster/r.cats/main.c:66
+msgid "Comma separated value list"
+msgstr ""
+
+#: ../raster/r.cats/main.c:67
+msgid "Example: 1.4,3.8,13"
+msgstr "Examplu: 1.4,3.8,13"
+
+#: ../raster/r.cats/main.c:72 ../raster/r.stats/main.c:119
+#: ../raster/r.distance/parse.c:50 ../db/base/select.c:214
+#: ../locale/scriptstrings/r.tileset_to_translate.c:13
+#: ../vector/v.db.select/main.c:64 ../vector/v.vect.stats/main.c:201
+msgid "Output field separator"
+msgstr ""
+
+#: ../raster/r.cats/main.c:78 ../raster/r.support/front/front.c:114
+msgid "Raster map from which to copy category table"
+msgstr ""
+
+#: ../raster/r.cats/main.c:84
+msgid "File containing category label rules (or \"-\" to read from stdin)"
+msgstr ""
+
+#: ../raster/r.cats/main.c:91
+msgid "Default label or format string for dynamic labeling"
+msgstr ""
+
+#: ../raster/r.cats/main.c:93
+msgid "Used when no explicit label exists for the category"
+msgstr ""
+
+#: ../raster/r.cats/main.c:101
+msgid "Dynamic label coefficients"
+msgstr ""
+
+#: ../raster/r.cats/main.c:103
+msgid "Two pairs of category multiplier and offsets, for $1 and $2"
+msgstr ""
+
+#: ../raster/r.cats/main.c:136 ../raster/r.support/front/front.c:125
+#, c-format
+msgid "Raster map <%s> not found in current mapset"
+msgstr "Harta raster <%s> nu a fost găsită în mapset-ul curent"
+
+#: ../raster/r.cats/main.c:155 ../raster/r.cats/main.c:213
+#: ../raster/r.support/front/front.c:230 ../raster/r.statistics/main.c:91
+#: ../raster/r.mapcalc/map.c:92 ../raster/r.mapcalc/map3.c:186
+#: ../raster/r.report/parse.c:264 ../display/d.title/main.c:112
+#, c-format
+msgid "Unable to read category file of raster map <%s@%s>"
+msgstr "Imposibil de citit fișierul de categorii al hărții raster <%s@%s>"
+
+#: ../raster/r.cats/main.c:159
+#, c-format
+msgid "Category table for <%s> set from <%s>"
+msgstr "Tabelul de categorii pentru <%s> setat din <%s>"
+
+#: ../raster/r.cats/main.c:177 ../raster/r.out.ppm3/main.c:149
+#: ../raster/r.out.arc/main.c:133 ../raster/r.out.ascii/main.c:172
+#: ../raster/r.profile/main.c:157 ../raster/r.recode/main.c:93
+#: ../general/g.pnmcomp/main.c:241 ../general/g.pnmcomp/main.c:258
+#: ../general/g.transform/main.c:281 ../display/d.nviz/main.c:204
+#: ../vector/v.out.ascii/out.c:169 ../vector/v.out.vtk/main.c:176
+#, c-format
+msgid "Unable to open file <%s>"
+msgstr "Imposibil de deschis fișierul <%s>"
+
+#: ../raster/r.cats/main.c:197 ../raster/r.cats/main.c:243
+#, c-format
+msgid "Cannot create category file for <%s>"
+msgstr "Nu s-a putut crea fișier de categorie pentru <%s>"
+
+#: ../raster/r.cats/main.c:252
+#, c-format
+msgid "Unable to read category file of raster map <%s> in <%s>"
+msgstr "Imposibil de citit fișierul de categorii al hărții raster <%s> din <%s>"
+
+#: ../raster/r.cats/main.c:268
+msgid "The map is floating point! Ignoring cats list, using vals list"
+msgstr ""
+
+#: ../raster/r.cats/main.c:285
+msgid "vals argument is required for floating point map!"
+msgstr ""
+
+#: ../raster/r.transect/main.c:54
+msgid "raster, transect"
+msgstr "raster, transect"
+
+#: ../raster/r.transect/main.c:56
+msgid "Outputs raster map layer values lying along user defined transect line(s)."
+msgstr "Afișează valorile stratului raster situate de-a lungul liniei transect definită de utilizator."
+
+#: ../raster/r.transect/main.c:60
+msgid "Raster map to be queried"
+msgstr ""
+
+#: ../raster/r.transect/main.c:76
+msgid "Transect definition"
+msgstr "Definire transect"
+
+#: ../raster/r.transect/main.c:85 ../raster/r.what/main.c:117
+#: ../raster3d/r3.out.ascii/main.c:98
+msgid "Char string to represent no data cell"
+msgstr ""
+
+#: ../raster/r.transect/main.c:97 ../raster/r.profile/main.c:97
+msgid "Output easting and northing in first two columns of four column output"
+msgstr ""
+
+#: ../raster/r.transect/main.c:155
+#, c-format
+msgid "End coordinate: %.15g, %.15g"
+msgstr "Coordonate finale: %.15g, %.15g"
+
+#: ../raster/r.mfilter.fp/getrow.c:12 ../raster/r.mfilter/getrow.c:12
+#, c-format
+msgid "Cannot read raster row %d"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getrow.c:23 ../raster/r.mfilter/getrow.c:23
+msgid "Error reading temporary file"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:27 ../raster/r.mfilter/getfilt.c:26
+#, c-format
+msgid "Cannot open filter file '%s'"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:47 ../raster/r.mfilter/getfilt.c:46
+msgid "Illegal filter matrix size specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:50 ../raster/r.mfilter/getfilt.c:49
+msgid "Even filter matrix size specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:72 ../raster/r.mfilter/getfilt.c:71
+msgid "Illegal filter matrix"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:80 ../raster/r.mfilter.fp/getfilt.c:107
+#: ../raster/r.mfilter.fp/getfilt.c:124 ../raster/r.mfilter/getfilt.c:79
+#: ../raster/r.mfilter/getfilt.c:105 ../raster/r.mfilter/getfilt.c:122
+msgid "Filter file format error"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:83 ../raster/r.mfilter/getfilt.c:82
+msgid "Duplicate filter divisor specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:101 ../raster/r.mfilter/getfilt.c:99
+msgid "Illegal divisor matrix"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:110 ../raster/r.mfilter/getfilt.c:108
+msgid "Duplicate filter type specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:117 ../raster/r.mfilter/getfilt.c:115
+msgid "Illegal filter type specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:127 ../raster/r.mfilter/getfilt.c:125
+msgid "Duplicate filter start specified"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:135 ../raster/r.mfilter/getfilt.c:133
+#, c-format
+msgid "Filter start %s ignored, using UL"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/getfilt.c:157 ../raster/r.mfilter/getfilt.c:155
+msgid "Illegal filter file format"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/perform.c:38 ../raster/r.param.scale/open_files.c:26
+#: ../raster/r.mfilter/perform.c:38 ../raster/r.topidx/file_io.c:17
+#: ../imagery/i.cca/main.c:185
+#, c-format
+msgid "Cannot open raster map <%s>"
+msgstr "Nu s-a putut deschide harta raster <%s>"
+
+#: ../raster/r.mfilter.fp/perform.c:43 ../raster/r.mfilter.fp/perform.c:54
+#: ../raster/r.mfilter/perform.c:43 ../raster/r.mfilter/perform.c:54
+msgid "Unable to create temporary file"
+msgstr "Imposibil de creat fișierul temporar"
+
+#: ../raster/r.mfilter.fp/perform.c:84 ../raster/r.param.scale/open_files.c:32
+#: ../raster/r.param.scale/open_files.c:36 ../raster/r.mfilter/perform.c:84
+#: ../raster/r.topidx/file_io.c:96 ../raster/r.reclass/reclass.c:235
+#: ../imagery/i.cca/main.c:191
+#, c-format
+msgid "Cannot create raster map <%s>"
+msgstr "Nu s-a putut crea harta raster <%s>"
+
+#: ../raster/r.mfilter.fp/perform.c:87 ../raster/r.mfilter/perform.c:87
+#, c-format
+msgid "Writing raster map <%s>"
+msgstr "Scrierea hărții raster <%s>"
+
+#: ../raster/r.mfilter.fp/main.c:58 ../raster/r.mfilter/main.c:51
+#: ../raster/r.bitpattern/main.c:62
+msgid "raster, map algebra"
+msgstr "raster, algebra hărții"
+
+#: ../raster/r.mfilter.fp/main.c:59
+msgid "Raster map matrix filter."
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:70
+msgid "Name of filter file"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:78 ../raster/r.mfilter/main.c:71
+msgid "Number of times to repeat the filter"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:84 ../raster/r.mfilter/main.c:78
+msgid "Output raster map title"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:91 ../raster/r.mfilter/main.c:85
+#: ../raster/r.report/parse.c:95 ../raster/r.rescale.eq/main.c:98
+#: ../raster/r.grow2/main.c:167 ../raster/r.texture/main.c:111
+#: ../raster/r.slope.aspect/main.c:263 ../raster/r.resample/main.c:79
+#: ../raster/r.kappa/main.c:102 ../raster/r.patch/main.c:72
+#: ../raster/r.bitpattern/main.c:87 ../doc/raster/r.example/main.c:96
+#: ../imagery/i.cluster/main.c:163 ../vector/v.sample/main.c:129
+#: ../vector/v.kcv/main.c:106 ../vector/v.perturb/main.c:117
+msgid "Quiet"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:101
+msgid "Apply filter only to null data values"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:109 ../raster/r.out.ppm/main.c:81
+#: ../raster/r.mfilter/main.c:104 ../raster/r.kappa/main.c:125
+msgid "The '-q' flag is superseded and will be removed in future. Please use '--quiet' instead"
+msgstr ""
+
+#: ../raster/r.mfilter.fp/main.c:138 ../raster/r.mfilter/main.c:133
+msgid "Raster map too small for the size of the filter"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:70
+#, c-format
+msgid "Edit header for [%s]\n"
+msgstr "Editează antet pentru [%s]\n"
+
+#: ../raster/r.support/modhead/modhead.c:73
+#, c-format
+msgid "[%s] cannot be found!"
+msgstr "[%s] nu poate fi găsit!"
+
+#: ../raster/r.support/modhead/modhead.c:76
+msgid "For what layer shall the header file be edited? "
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:86
+#, c-format
+msgid "[%s] is a reclass of [%s] - cannot edit header! Run support on [%s]."
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:90
+#, c-format
+msgid "[%s] is a reclass of [%s in %s] - cannot edit header!"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:96
+#, c-format
+msgid "Cannot open raster map [%s]!"
+msgstr "Nu s-a putut deschide harta raster [%s]!"
+
+#: ../raster/r.support/modhead/modhead.c:101
+#, c-format
+msgid "Raster file [%s] is empty."
+msgstr "Fișierul raster [%s] este gol."
+
+#: ../raster/r.support/modhead/modhead.c:103
+#, c-format
+msgid "Error reading raster map [%s]."
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:191
+#, c-format
+msgid "cellhd compression: %d\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:192
+#, c-format
+msgid "3.0 compression %sindicated\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:194
+#, c-format
+msgid "Pre 3.0 compression %sindicated\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:201
+#, c-format
+msgid "[%s] appears to be compressed. Is it? "
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:207
+msgid "Please indicate the type of compression:\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:208
+msgid "  1. Pre 3.0 compression\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:209
+msgid "  2. 3.0 compression\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:245
+#, c-format
+msgid "The header for [%s] says the file is not compressed. "
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:247
+msgid "The file appears to be compressed.\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:248
+#: ../raster/r.support/modhead/modhead.c:257
+msgid "Most likely the header is wrong, but I want you to decide.\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:254
+#, c-format
+msgid "The header for [%s] says the file is compressed. "
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:256
+msgid "The file does NOT appear to be compressed.\n"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:271
+#, c-format
+msgid "Header indicates %d row%s in the raster map, but the actual file format indicates %d row%s"
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:303
+#, c-format
+msgid "Unable to write header for [%s]."
+msgstr ""
+
+#: ../raster/r.support/modhead/modhead.c:305
+#, c-format
+msgid "Header for raster map [%s] updated."
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:24
+#, c-format
+msgid "Please enter the following information for [%s]:"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:29
+msgid "        Number of rows"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:30
+msgid "        Number of cols"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:32
+msgid "        Number of bytes per cell"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:33
+msgid "        Floating point map"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:51
+#, c-format
+msgid "rows * cols * bytes per cell must be same as file size (%lu)"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:55
+msgid "If you need help figuring them out, just hit ESC"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:76
+msgid "** Negative values not allowed!"
+msgstr ""
+
+#: ../raster/r.support/modhead/ask_format.c:79
+msgid "** Positive values only please!"
+msgstr ""
+
+#: ../raster/r.support/modhead/hitreturn.c:12
+msgid ""
+"\n"
+"hit RETURN to continue -->"
+msgstr ""
+
+#: ../raster/r.support/modhist/modhist.c:38
+msgid "Which raster map needs an updated history? "
+msgstr ""
+
+#: ../raster/r.support/modhist/modhist.c:47
+#, c-format
+msgid "Raster file [%s] not found. Exiting."
+msgstr ""
+
+#: ../raster/r.support/modhist/modhist.c:52
+#, c-format
+msgid "History file for [%s] updated."
+msgstr ""
+
+#: ../raster/r.support/modhist/modhist.c:54
+#, c-format
+msgid "History file for [%s] not updated."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:54 ../raster/r.info/main.c:69
+#: ../raster/r.region/main.c:54 ../raster/r.describe/main.c:59
+msgid "raster, metadata"
+msgstr "raster, metadate"
+
+#: ../raster/r.support/front/front.c:55
+msgid "Allows creation and/or modification of raster map layer support files."
+msgstr "Permite crearea și/sau modificarea fișierelor suport a hărților raster."
+
+#: ../raster/r.support/front/front.c:65
+msgid "Text to use for map title"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:73
+msgid "Text to append to the next line of the map's metadata file"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:79
+msgid "Text to use for map data units"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:85
+msgid "Text to use for map vertical datum"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:92
+msgid "Text to use for data source, line 1"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:99
+msgid "Text to use for data source, line 2"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:107
+msgid "Text to use for data description or keyword(s)"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:143
+msgid "Not enough room in history file"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:234
+#, c-format
+msgid "cats table for [%s] set to %s"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:248
+#, c-format
+msgid "Edit header for [%s]? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:250
+#, c-format
+msgid ""
+"\n"
+"NOTE: [%s] is a reclass of [%s in %s]"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:264
+msgid "Canceling from edit header."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:271
+#, c-format
+msgid "Edit the category file for [%s]? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:281
+#, c-format
+msgid "Create/Update the color table for [%s]? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:292
+#, c-format
+msgid "Edit the history file for [%s]? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:302
+#, c-format
+msgid ""
+"\n"
+"The null file for [%s] may indicate that some cells contain\n"
+" no data. If the null file for [%s] doesn't exist, zero cells in\n"
+" it are treated by GRASS application programs as no data."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:308
+#, c-format
+msgid ""
+"\n"
+"Do you want to create/reset the null file for [%s] so that null cell values are considered valid data? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:317 ../raster/r.support/front/front.c:354
+#, c-format
+msgid "[%s] is a reclass of another map. Exiting."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:329
+#, c-format
+msgid "Writing new null file for [%s]... "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:334
+#, c-format
+msgid "Error writing null row [%d]."
+msgstr ""
+
+#: ../raster/r.support/front/front.c:346
+#, c-format
+msgid ""
+"\n"
+"Do you want to delete the null file for [%s]\n"
+"(all zero cells will then be considered no data)? "
+msgstr ""
+
+#: ../raster/r.support/front/front.c:360
+#, c-format
+msgid "Removing null file for [%s]...\n"
+msgstr ""
+
+#: ../raster/r.support/front/front.c:367 ../display/d.what.vect/main.c:172
+msgid "Done."
+msgstr ""
+
+#: ../raster/r.support/front/check.c:29
+#, c-format
+msgid "Update the statistics (histogram, range) for [%s]? "
+msgstr ""
+
+#: ../raster/r.support/front/check.c:35
+#, c-format
+msgid ""
+"\n"
+"  Updating statistics for [%s]"
+msgstr ""
+
+#: ../raster/r.support/front/check.c:77
+#, c-format
+msgid ""
+"   Updating the number of categories for [%s]\n"
+"\n"
+msgstr ""
+
+#: ../raster/r.support/front/hitreturn.c:15
+msgid ""
+"\n"
+"Hit RETURN to continue -->"
+msgstr ""
+
+#: ../raster/r.support/modcats/modcats.c:46
+msgid "Which vector map needs updated categories?"
+msgstr ""
+
+#: ../raster/r.support/modcats/modcats.c:49
+msgid "Which raster map needs updated categories?"
+msgstr ""
+
+#: ../raster/r.support/modcats/modcats.c:53
+#: ../raster/r.support/modcats/modcats.c:62
+#, c-format
+msgid "%s map <%s> not found"
+msgstr ""
+
+#: ../raster/r.support/modcats/modcats.c:74
+#: ../raster/r.support/modcats/modcats.c:81
+#, c-format
+msgid "Category file for <%s> not updated"
+msgstr ""
+
+#: ../raster/r.support/modcats/modcats.c:92
+#, c-format
+msgid "Category file for <%s> updated"
+msgstr ""
+
+#: ../raster/r.support/modcolr/modcolr.c:38
+msgid "Which raster map needs a color table"
+msgstr ""
+
+#: ../raster/r.support/modcolr/modcolr.c:54
+#, c-format
+msgid "Color table for <%s> updated"
+msgstr ""
+
+#: ../raster/r.watershed/seg/main.c:84 ../raster/r.watershed/seg/main.c:95
+#: ../raster/r.watershed/ram/main.c:79 ../raster/r.watershed/ram/main.c:95
+#, c-format
+msgid "SECTION %d: Closing Maps."
+msgstr ""
+
+#: ../raster/r.watershed/seg/main.c:93 ../raster/r.watershed/ram/main.c:93
+#, c-format
+msgid "SECTION %d: Watershed determination."
+msgstr ""
+
+#: ../raster/r.watershed/seg/usage.c:9 ../raster/r.watershed/ram/usage.c:9
+#, c-format
+msgid ""
+"USAGE for basin delineation:\n"
+"%s -4 el=elevation_map t=swale_threshold [ov=overland_flow_map] [dr=drain_direction_map] [de=depression_map] [ac=accumulation_map] [di=display_map] ba=watershed_basin_map [se=stream_segment_map]\n"
+"\n"
+"USAGE for ARMSED FILE creation:\n"
+"%s [-4] el=elevation_map t=swale_threshold [ov=overland_flow_map] [dr=drain_direction_map] [de=depression_map] [ac=accumulation_map] [di=display_map] [ba=watershed_basin_map] [se=stream_segment_map] ha=half_basin_map ar=ARMSED_file_name\n"
+"\n"
+"USAGE for slope length determination:\n"
+"%s [-4] el=elevation_map t=swale_threshold [dr=drain_direction_map] [de=depression_map] [ac=accumulation_map] [di=display_map] [ms=max_slope_length] [ob=overland_blocking_map] [S=slope_steepness_map] LS=length_slope_map [r=rill_erosion_map] [sd=slope_deposition value or map]"
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:114
+#, c-format
+msgid "SECTION 1 beginning: Initiating Variables. %d sections total."
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:150
+msgid "Maximum memory to be used was smaller than 3 MB, set to default = 300 MB."
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:191
+#: ../raster/r.watershed/ram/init_vars.c:150
+msgid "unable to open elevation map layer"
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:278
+#: ../raster/r.watershed/ram/init_vars.c:241
+msgid "unable to open depression map layer"
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:307
+#: ../raster/r.watershed/ram/init_vars.c:258
+msgid "unable to open blocking map layer"
+msgstr ""
+
+#: ../raster/r.watershed/seg/init_vars.c:366
+#: ../raster/r.watershed/ram/init_vars.c:303
+#, c-format
+msgid "SECTION 1b (of %1d): Determining Offmap Flow."
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_astar.c:30
+#: ../raster/r.watershed/ram/do_astar.c:26
+msgid "SECTION 2: A * Search."
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_astar.c:161
+#: ../raster/r.watershed/ram/do_astar.c:160
+msgid "heapsize too large"
+msgstr ""
+
+#: ../raster/r.watershed/seg/sg_factor.c:12
+#: ../raster/r.watershed/ram/sg_factor.c:13
+msgid "SECTION 4: RUSLE LS and/or S factor determination."
+msgstr ""
+
+#: ../raster/r.watershed/seg/close_maps.c:28
+#: ../raster/r.watershed/ram/close_maps.c:30
+#: ../raster/r.watershed/ram/close_maps.c:165
+msgid "unable to open new accum map layer."
+msgstr ""
+
+#: ../raster/r.watershed/seg/close_maps.c:44
+#: ../raster/r.watershed/ram/close_maps.c:66
+#: ../raster/r.watershed/ram/close_maps.c:153
+#: ../raster/r.watershed/ram/close_maps.c:186
+#: ../raster/r.watershed/ram/close_maps.c:211
+#: ../raster/r.watershed/ram/close_maps.c:231
+#: ../raster/r.watershed/ram/close_maps.c:251
+msgid "Close failed."
+msgstr ""
+
+#: ../raster/r.watershed/seg/close_maps.c:52
+msgid "unable to open flow accumulation map layer"
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_cum.c:17 ../raster/r.watershed/ram/do_cum.c:16
+msgid "SECTION 3: Accumulating Surface Flow with SFD."
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_cum.c:121
+#: ../raster/r.watershed/ram/do_cum.c:117
+msgid "SECTION 3: Accumulating Surface Flow with MFD."
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_cum.c:326
+#: ../raster/r.watershed/ram/do_cum.c:312
+#, c-format
+msgid "MFD: cumulative proportion of flow distribution not 1.0 but %f"
+msgstr ""
+
+#: ../raster/r.watershed/seg/do_cum.c:385
+#: ../raster/r.watershed/ram/do_cum.c:367
+#, c-format
+msgid "MFD: A * path already processed when distributing flow: %d of %d cells"
+msgstr ""
+
+#: ../raster/r.watershed/ram/init_vars.c:103
+#, c-format
+msgid "SECTION 1a (of %1d): Initiating Memory."
+msgstr ""
+
+#: ../raster/r.watershed/ram/init_vars.c:218
+msgid "unable to open runoff map layer"
+msgstr ""
+
+#: ../raster/r.watershed/ram/init_vars.c:275
+msgid "unable to open rill map layer"
+msgstr ""
+
+#: ../raster/r.watershed/ram/close_maps.c:142
+msgid "unable to open new aspect map layer."
+msgstr ""
+
+#: ../raster/r.watershed/ram/close_maps.c:201
+msgid "unable to open new LS factor map layer."
+msgstr ""
+
+#: ../raster/r.watershed/ram/close_maps.c:219
+msgid "unable to open new slope length map layer."
+msgstr ""
+
+#: ../raster/r.watershed/ram/close_maps.c:241
+msgid "unable to open new S factor map layer."
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:8
+#, c-format
+msgid "%s provides a text-based user-interface to the %s program."
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:10
+#, c-format
+msgid "%s also allows the user to prepare a report of map layers for each"
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:12
+#, c-format
+msgid "watershed basin determined in %s.\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:14
+#, c-format
+msgid "%s will help the user determine which options to use for the"
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:16
+#, c-format
+msgid "%s program.  %s will then ask for map layers that will be"
+msgstr ""
+
+#: ../raster/r.watershed/shed/intro.c:18
+#, c-format
+msgid "divided by basin. %s will then run %s and create the report."
+msgstr ""
+
+#: ../raster/r.watershed/shed/valid.c:24
+msgid "accum file missing in valid_basins()"
+msgstr ""
+
+#: ../raster/r.watershed/shed/valid.c:28
+msgid "unable to open accum file in valid_basins()"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:12
+msgid ""
+"\n"
+"\n"
+"Please indicate which map layers you wish to use in the lumped"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:13
+msgid "parameter hydrologic/soil erosion model.  Continue inputing cell map"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:14
+msgid "layers, one at a time, until all desired map layers are in."
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:15
+#, c-format
+msgid "You can have %s include a list of categories in each."
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:17
+#, c-format
+msgid ""
+"\n"
+"Hit <return> at the map prompt to continue with %s"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:36
+#, c-format
+msgid ""
+"\n"
+"The output from %s will be divided into watershed"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:38
+msgid "basins.  There are two possible methods of tabulating the information:"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:39
+msgid "1) by only including data pertaining to the basin itself, or 2) using"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:40
+msgid "data from the basin, and all basins upstream of it."
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:43
+msgid ""
+"\n"
+"Would you like the data organized:"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:44
+msgid ""
+"1) Basin only\n"
+"2) Upstream only\n"
+"3) Both\n"
+"OR 0) to cancel program"
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:45
+#, c-format
+msgid ""
+"\n"
+"Your choice: "
+msgstr ""
+
+#: ../raster/r.watershed/shed/basin_maps.c:69
+#: ../raster/r.watershed/shed/basin_maps.c:73
+#, c-format
+msgid ""
+"\n"
+"OK, %s should start running now using the following form:\n"
+"%s"
+msgstr ""
+
+#: ../raster/r.watershed/shed/main.c:41
+msgid "Slow version of water analysis program starting now"
+msgstr ""
+
+#: ../raster/r.watershed/shed/main.c:46 ../raster/r.watershed/shed/main.c:55
+#, c-format
+msgid "<<%s>> command line failed"
+msgstr ""
+
+#: ../raster/r.watershed/shed/main.c:72
+msgid "unable to open output file"
+msgstr ""
+
+#: ../raster/r.watershed/shed/read.c:23
+msgid "unable to open basin/half basin map"
+msgstr ""
+
+#: ../raster/r.watershed/shed/file_in.c:15
+msgid "unable to open ARMSED file"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:23
+msgid ""
+"\n"
+"This set of questions will organize the command line for the"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:24
+#, c-format
+msgid "%s program to run properly for your application."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:26
+#, c-format
+msgid "The first question is whether you want %s to run"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:28
+#, c-format
+msgid "in its fast mode or its slow mode.  If you run %s"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:30
+msgid "in the fast mode, the computer will finish about 10 times faster"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:31
+msgid "than in the slow mode, but will not allow other programs to run"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:32
+msgid "at the same time.  The fast mode also places all of the data into"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:33
+msgid "RAM, which limits the size of window that can be run.  The slow"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:34
+msgid "mode uses disk space in the same hard disk partition as where GRASS is"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:35
+msgid "stored.  Thus, if the program does not work in the slow mode, you will"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:36
+msgid "need to remove unnecessary files from that partition.  The slow mode"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:37
+#, c-format
+msgid "will allow other processes to run concurrently with %s.\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:69
+#: ../raster/r.watershed/shed/com_line.c:182
+msgid ""
+"\n"
+"If you hit <return> by itself for the next question, this"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:70
+#: ../raster/r.watershed/shed/com_line.c:183
+msgid "program will terminate."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:81
+#, c-format
+msgid ""
+"\n"
+"One of the options for %s is a `depression map'.  A"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:83
+msgid "depression map indicates all the locations in the current map window where"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:84
+msgid "water accumulates and does not leave by the edge of the map. Lakes without"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:85
+msgid "outlet streams and sinkholes are examples of `depressions'.  If you wish to"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:86
+msgid "have a depression map, prepare a map where non-zero values indicate the"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:87
+msgid "locations where depressions occur.\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:88
+msgid "Hit <return> by itself for the next question if there is no depression map."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:99
+#, c-format
+msgid ""
+"\n"
+"The %s program will divide the elevation map into a number of"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:101
+msgid "watershed basins.  The number of watershed basins is indirectly determined"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:102
+msgid "by the `basin threshold' value.  The basin threshold is the area necessary for"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:103
+#, c-format
+msgid "%s to define a unique watershed basin.  This area only applies to"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:105
+msgid "`exterior drainage basins'.  An exterior drainage basin does not have any"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:106
+msgid "drainage basins flowing into it.  Interior drainage basin size is determined"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:107
+msgid "by the surface flow going into stream segments between stream interceptions."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:108
+#, c-format
+msgid "Thus interior drainage basins can be of any size.  The %s program"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:110
+msgid "also allows the user to relate basin size to potential overland flow"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:111
+msgid "(i.e., areas with low infiltration capacities will need smaller areas to"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:112
+msgid "develop stream channels than neighboring areas with high infiltration rates)."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:113
+msgid "The user can create a map layer with potential overland flow values, and"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:114
+#, c-format
+msgid "%s will accumulate those values instead of area.\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:116
+msgid "What unit of measure will you use for the basin threshold:"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:119
+msgid " 1) acres,          2) meters sq., 3) miles sq., 4) hectares,"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:120
+msgid " 5) kilometers sq., 6) map cells,  7) overland flow units"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:121
+#, c-format
+msgid "Choose 1-7 or 0 to exit this program: "
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:131
+msgid ""
+"\n"
+"How large an area (or how many overland flow units) must a drainage basin"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:132
+#, c-format
+msgid "be for it to be an exterior drainage basin: "
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:201
+#, c-format
+msgid ""
+"\n"
+"%s must create a map layer of watershed basins"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:203
+#: ../raster/r.watershed/shed/com_line.c:224
+#, c-format
+msgid "before %s can run properly."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:222
+#, c-format
+msgid ""
+"\n"
+"%s must create a file of watershed basin relationships"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:228
+#: ../raster/r.watershed/shed/com_line.c:263
+#, c-format
+msgid ""
+"\n"
+"Please name this file:"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:257
+#, c-format
+msgid ""
+"\n"
+"%s will generate a lot of output.  Indicate a file"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:259
+#, c-format
+msgid "name for %s to send the output to."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:277
+#, c-format
+msgid ""
+"\n"
+"The accumulation map from %s must be present for"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:279
+#, c-format
+msgid "%s to work properly."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:290
+#, c-format
+msgid ""
+"\n"
+"%s can produce several maps not necessary for"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:292
+#, c-format
+msgid "%s to function (stream channels, overland flow aspect, and"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:294
+#, c-format
+msgid "a display version of the accumulation map).  %s also has the"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:296
+msgid "ability to generate several variables in the Revised Universal Soil Loss"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:297
+msgid "Equation (Rusle): Slope Length (LS), and Slope Steepness (S).\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:348
+msgid ""
+"\n"
+"The Slope Length factor (LS) and Slope Steepness (S) are influenced by"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:349
+#, c-format
+msgid "disturbed land.  %s reflects this with an optional map layer or value"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:351
+msgid "where the value indicates the percent of disturbed (barren) land in that cell."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:352
+msgid "Type <return> if you do not have a disturbed land map layer."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:364
+msgid ""
+"\n"
+"Type the value indicating the percent of disturbed land.  This value will"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:365
+msgid "be used for every cell in the current region."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:368
+#, c-format
+msgid ""
+"\n"
+"Input value here [0-100]: "
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:379
+msgid ""
+"\n"
+"Overland surface flow only occurs for a set distance before swales form."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:380
+#, c-format
+msgid "Because of digital terrain model limitations, %s cannot pick up"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:382
+#, c-format
+msgid "these swales.  %s allows for an input (warning: kludge factor)"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:384
+msgid "that prevents the surface flow distance from getting too long.  Normally,"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:385
+msgid "maximum slope length is around 600 feet (about 183 meters)."
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:400
+msgid ""
+"\n"
+"Roads, ditches, changes in ground cover, and other factors will stop"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:401
+msgid "slope length.  You may input a raster map indicating the locations of these"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:402
+msgid "blocking factors.\n"
+msgstr ""
+
+#: ../raster/r.watershed/shed/com_line.c:403
+msgid "Hit <return> by itself for the next question if there is no blocking map."
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:56 ../raster/r.drain/main.c:108
+#: ../raster/r.gwflow/main.c:189 ../raster/r.lake/main.c:150
+#: ../raster/r.water.outlet/main.c:47 ../raster/r.topidx/main.c:37
+#: ../raster/r.basins.fill/main.c:53 ../raster/r.topmodel/main.c:55
+#: ../raster/r.fill.dir/main.c:84 ../raster/r.carve/main.c:77
+#: ../raster/r.flow/calc.c:411
+msgid "raster, hydrology"
+msgstr "raster, hidrologie"
+
+#: ../raster/r.watershed/front/main.c:57
+msgid "Watershed basin analysis program."
+msgstr "Program de analiză a bazinelor hidrografice."
+
+#: ../raster/r.watershed/front/main.c:61
+msgid "Input map: elevation on which entire analysis is based"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:62 ../raster/r.watershed/front/main.c:68
+#: ../raster/r.watershed/front/main.c:74 ../raster/r.watershed/front/main.c:83
+#: ../raster/r.watershed/front/main.c:90
+#: ../raster/r.watershed/front/main.c:151
+#: ../raster/r.watershed/front/main.c:159 ../raster/r.sun2/main.c:245
+#: ../raster/r.sun2/main.c:254 ../raster/r.sun2/main.c:263
+#: ../raster/r.sun2/main.c:272 ../raster/r.sun2/main.c:280
+#: ../raster/r.sun2/main.c:289 ../raster/r.sun2/main.c:299
+#: ../raster/r.sun2/main.c:309 ../raster/r.sun2/main.c:319
+#: ../raster/r.sun2/main.c:329 ../raster/r.sun2/main.c:338
+#: ../raster/r.sun2/main.c:347 ../raster/r.sun2/main.c:356
+#: ../raster/r.sun2/main.c:364 ../raster/r.sun2/main.c:372
+#: ../raster/r.horizon/main.c:226 ../raster/r.horizon/main.c:235
+#: ../raster/r.horizon/main.c:243 ../raster/r.horizon/main.c:251
+#: ../raster/r.horizon/main.c:259 ../raster/r.horizon/main.c:267
+#: ../raster/r.horizon/main.c:275 ../raster/r.horizon/main.c:283
+#: ../raster/r.horizon/main.c:291 ../raster/r.sun/main.c:207
+#: ../raster/r.sun/main.c:216 ../raster/r.sun/main.c:226
+#: ../raster/r.sun/main.c:235 ../raster/r.sun/main.c:243
+#: ../raster/r.sun/main.c:255 ../raster/r.sun/main.c:263
+#: ../raster/r.sun/main.c:275 ../raster/r.sun/main.c:282
+#: ../raster/r.sun/main.c:294 ../raster/r.sun/main.c:303
+msgid "Input_options"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:66
+msgid "Input map: locations of real depressions"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:72
+msgid "Input map: amount of overland flow per cell"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:79
+msgid "Input map or value: percent of disturbed land, for USLE"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:88
+msgid "Input map: terrain blocking overland surface flow, for USLE"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:95
+msgid "Output map: number of cells that drain through each cell"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:97
+#: ../raster/r.watershed/front/main.c:103
+#: ../raster/r.watershed/front/main.c:110
+#: ../raster/r.watershed/front/main.c:116
+#: ../raster/r.watershed/front/main.c:123
+#: ../raster/r.watershed/front/main.c:130
+#: ../raster/r.watershed/front/main.c:137
+#: ../raster/r.watershed/front/main.c:143 ../raster/r.sun2/main.c:381
+#: ../raster/r.sun2/main.c:390 ../raster/r.sun2/main.c:399
+#: ../raster/r.sun2/main.c:408 ../raster/r.sun2/main.c:417
+#: ../raster/r.sun2/main.c:426 ../raster/r.resamp.rst/main.c:183
+#: ../raster/r.resamp.rst/main.c:191 ../raster/r.resamp.rst/main.c:199
+#: ../raster/r.resamp.rst/main.c:207 ../raster/r.resamp.rst/main.c:215
+#: ../raster/r.resamp.rst/main.c:223 ../raster/r.resamp.rst/main.c:287
+#: ../raster/r.horizon/main.c:300 ../raster/r.horizon/main.c:310
+#: ../raster/r.horizon/main.c:318 ../raster/r.sun/main.c:312
+#: ../raster/r.sun/main.c:321 ../raster/r.sun/main.c:330
+#: ../raster/r.sun/main.c:339 ../raster/r.sun/main.c:348
+#: ../vector/v.vol.rst/main.c:362 ../vector/v.vol.rst/main.c:379
+#: ../vector/v.vol.rst/main.c:389 ../vector/v.vol.rst/main.c:398
+#: ../vector/v.vol.rst/main.c:407 ../vector/v.vol.rst/main.c:416
+#: ../vector/v.vol.rst/main.c:425
+msgid "Output_options"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:101
+msgid "Output map: drainage direction"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:108
+msgid "Output map: unique label for each watershed basin"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:114
+msgid "Output map: stream segments"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:121
+msgid "Output map: each half-basin is given a unique value"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:128
+msgid "Output map: useful for visual display of results"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:135
+msgid "Output map: slope length and steepness (LS) factor for USLE"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:141
+msgid "Output map: slope steepness (S) factor for USLE"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:148
+msgid "Input value: minimum size of exterior watershed basin"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:156
+msgid "Input value: maximum length of surface flow, for USLE"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:166
+msgid "Convergence factor for MFD (1-10)"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:168
+msgid "1 = most diverging flow, 10 = most converging flow. Recommended: 5"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:175
+msgid "Maximum memory to be used with -m flag (in MB)"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:179
+msgid "Enable MFD flow (default is SFD (D8))"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:181
+msgid "SFD: single flow direction, MFD: multiple flow direction"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:186
+msgid "Allow only horizontal and vertical flow of water"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:191
+msgid "Enable disk swap memory option: Operation is slow"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:193
+msgid "Only needed if memory requirements exceed available RAM; see manual on how to calculate memory requirements"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:198
+msgid "Use positive flow accumulation even for likely underestimates"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:200
+msgid "See manual for a detailed description of flow accumulation output"
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:217
+msgid "Sorry, you must choose an output map."
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:233
+msgid ""
+"Sorry, if any of the following options are set:\n"
+"    basin, stream, half.basin, length.slope, or slope.steepness\n"
+"    you MUST provide a value for the basin threshold parameter."
+msgstr ""
+
+#: ../raster/r.watershed/front/main.c:388
+#, c-format
+msgid "Subprocess failed with exit code %d"
+msgstr ""
+
+#: ../raster/r.composite/main.c:72
+msgid "raster, composite"
+msgstr "raster, compoziție"
+
+#: ../raster/r.composite/main.c:74
+msgid "Combines red, green and blue raster maps into a single composite raster map."
+msgstr "Combină roșu, verde și albastru într-o singură hartă raster."
+
+#: ../raster/r.composite/main.c:88 ../raster/r.out.ppm3/main.c:65
+#, c-format
+msgid "Name of raster map to be used for <%s>"
+msgstr ""
+
+#: ../raster/r.composite/main.c:100
+msgid "Number of levels to be used for each component"
+msgstr ""
+
+#: ../raster/r.composite/main.c:101 ../raster/r.composite/main.c:119
+msgid "Levels"
+msgstr ""
+
+#: ../raster/r.composite/main.c:116
+#, c-format
+msgid "Number of levels to be used for <%s>"
+msgstr ""
+
+#: ../raster/r.composite/main.c:126
+msgid "Dither"
+msgstr ""
+
+#: ../raster/r.composite/main.c:130
+msgid "Use closest color"
+msgstr ""
+
+#: ../raster/r.composite/main.c:167 ../raster/r.lake/main.c:407
+#, c-format
+msgid "Unable to read color file of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.composite/main.c:210
+#, c-format
+msgid "Error reading raster map <%s>"
+msgstr ""
+
+#: ../raster/r.composite/main.c:258 ../doc/raster/r.example/main.c:181
+#, c-format
+msgid "Failed writing raster map <%s>"
+msgstr ""
+
+#: ../raster/r.composite/main.c:273 ../raster/r.in.gdal/main.c:1013
+#: ../raster/r.circle/dist.c:155 ../raster/r.recode/main.c:112
+#: ../raster/r.surf.fractal/main.c:39
+#, c-format
+msgid "Raster map <%s> created."
+msgstr "Harta raster <%s> creată."
+
+#: ../raster/r.composite/main.c:297
+msgid "Creating color table for output raster map..."
+msgstr ""
+
+#: ../raster/r.coin/main.c:68
+msgid "Tabulates the mutual occurrence (coincidence) of categories for two raster map layers."
+msgstr "Cataloghează apariția reciprocă (coincidență) a categoriilor pentru două straturi raster."
+
+#: ../raster/r.coin/main.c:76
+msgid "Name of first raster map"
+msgstr ""
+
+#: ../raster/r.coin/main.c:83
+msgid "Name of second raster map"
+msgstr ""
+
+#: ../raster/r.coin/main.c:89
+msgid "Unit of measure"
+msgstr "Unitate de măsură"
+
+#: ../raster/r.coin/main.c:91
+msgid "c(ells), p(ercent), x(percent of category [column]), y(percent of category [row]), a(cres), h(ectares), k(square kilometers), m(square miles)"
+msgstr ""
+
+#: ../raster/r.coin/main.c:98
+msgid "Wide report, 132 columns (default: 80)"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:34
+msgid "GIS Coincidence Tabulation Facility\n"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:35
+msgid "This utility will allow you to compare the coincidence of two map layers\n"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:52
+msgid "The report can be made in one of 8 units."
+msgstr ""
+
+#: ../raster/r.coin/inter.c:53
+msgid "Please choose a unit by entering one of the following letter codes:"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:55
+msgid "     'c': cells"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:56
+msgid "     'p': percent cover of region"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:57
+#, c-format
+msgid "     'x': percent of '%s' category (column)"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:58
+#, c-format
+msgid "     'y': percent of '%s' category (row)"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:59
+msgid "     'a': acres"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:60
+msgid "     'h': hectares"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:61
+msgid "     'k': square kilometers"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:62
+msgid "     'm': square miles\n"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:63
+msgid "     'Q': quit"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:95
+#, c-format
+msgid "Do you wish to save this report in a file? (y/n) [n] "
+msgstr ""
+
+#: ../raster/r.coin/inter.c:103
+#, c-format
+msgid ""
+"Enter the file name or path\n"
+"> "
+msgstr ""
+
+#: ../raster/r.coin/inter.c:108
+#, c-format
+msgid "'%s' being saved\n"
+msgstr ""
+
+#: ../raster/r.coin/inter.c:117
+#, c-format
+msgid "Do you wish to print this report (requires Unix lpr command)? (y/n) [n] "
+msgstr ""
+
+#: ../raster/r.coin/inter.c:126
+#, c-format
+msgid ""
+"Do you wish it printed in 80 or 132 columns?\n"
+"> "
+msgstr ""
+
+#: ../raster/r.coin/inter.c:142
+#, c-format
+msgid "Do you wish to run this report with a different unit of measure? (y/n) [y] "
+msgstr ""
+
+#: ../raster/r.coin/print_coin.c:44
+#, c-format
+msgid "Preparing report ..."
+msgstr ""
+
+#: ../raster/r.coin/make_coin.c:44
+#, c-format
+msgid "Tabulating Coincidence between '%s' and '%s'"
+msgstr ""
+
+#: ../raster/r.coin/make_coin.c:54
+msgid "Unable to create any tempfiles"
+msgstr ""
+
+#: ../raster/r.coin/make_coin.c:58
+msgid "Unable to run r.stats"
+msgstr "Imposibil de rulat r.stats"
+
+#: ../raster/r.coin/make_coin.c:67
+msgid "Unexpected output from r.stats"
+msgstr "Ieșire neașteptată din r.stats"
+
+#: ../raster/r.coin/make_coin.c:78
+msgid "Unable to open tempfile"
+msgstr "Imposibil de deschis tempfile"
+
+#: ../raster/r.in.xyz/main.c:159
+msgid "raster, import, LIDAR"
+msgstr "raster, import, LIDAR"
+
+#: ../raster/r.in.xyz/main.c:161
+msgid "Create a raster map from an assemblage of many coordinates using univariate statistics."
+msgstr "Crează hartă raster dintr-un ansamblu de coordonate folosind statistici univariate."
+
+#: ../raster/r.in.xyz/main.c:165
+msgid "ASCII file containing input data (or \"-\" to read from stdin)"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:173
+msgid "Statistic to use for raster values"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:177 ../raster/r.in.xyz/main.c:243
+#: ../raster/r.in.xyz/main.c:252
+msgid "Statistic"
+msgstr "Statistici"
+
+#: ../raster/r.in.xyz/main.c:188 ../raster/r.in.xyz/main.c:197
+#: ../raster/r.in.xyz/main.c:205 ../raster/r.in.xyz/main.c:213
+#: ../raster/simwe/r.sim.sediment/main.c:119
+#: ../raster/simwe/r.sim.sediment/main.c:124
+#: ../raster/simwe/r.sim.sediment/main.c:129
+#: ../raster/simwe/r.sim.sediment/main.c:134
+#: ../raster/simwe/r.sim.sediment/main.c:140
+#: ../raster/simwe/r.sim.sediment/main.c:146
+#: ../raster/simwe/r.sim.sediment/main.c:152
+#: ../raster/simwe/r.sim.sediment/main.c:158
+#: ../raster/simwe/r.sim.sediment/main.c:166
+#: ../raster/simwe/r.sim.water/main.c:126
+#: ../raster/simwe/r.sim.water/main.c:131
+#: ../raster/simwe/r.sim.water/main.c:136
+#: ../raster/simwe/r.sim.water/main.c:143
+#: ../raster/simwe/r.sim.water/main.c:152
+#: ../raster/simwe/r.sim.water/main.c:159
+#: ../raster/simwe/r.sim.water/main.c:168
+#: ../raster/simwe/r.sim.water/main.c:174
+#: ../raster/simwe/r.sim.water/main.c:182
+#: ../raster/simwe/r.sim.water/main.c:189 ../vector/v.out.ogr/main.c:108
+#: ../vector/v.out.ogr/main.c:128 ../vector/v.edit/args.c:103
+#: ../vector/v.edit/args.c:212
+msgid "Input"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:196
+msgid "Column number of x coordinates in input file (first column is 1)"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:204
+msgid "Column number of y coordinates in input file"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:212
+msgid "Column number of data values in input file"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:220
+msgid "Filter range for z data (min,max)"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:227
+msgid "Scale to apply to z data"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:242
+msgid "pth percentile of the values"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:251
+msgid "Discard <trim> percent of the smallest and <trim> percent of the largest observations"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:256
+msgid "Scan data file for extent then exit"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:261
+msgid "In scan mode, print using shell script style"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:265
+msgid "Ignore broken lines"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:291
+msgid "Please specify a reasonable column number."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:302
+msgid "Invalid zrange"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:389
+msgid "Unable to calculate percentile without the pth option specified!"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:401
+msgid "Unable to calculate trimmed mean without the trim option specified!"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:477
+msgid "If input is not from a file it is only possible to perform a single pass."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:483
+msgid "zrange will not be taken into account during scan"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:521
+msgid "Reading data ..."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:528 ../raster/r.in.poly/poly2rast.c:56
+#, c-format
+msgid "Pass #%d (of %d) ..."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:599 ../raster/r.in.xyz/main.c:607
+#: ../raster/r.in.xyz/main.c:1103 ../raster/r.in.xyz/main.c:1111
+#, c-format
+msgid ""
+"Not enough data columns. Incorrect delimiter or column number? Found the following character(s) in row %lu:\n"
+"[%s]"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:603 ../raster/r.in.xyz/main.c:1107
+msgid "Line ignored as requested"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:622 ../raster/r.in.xyz/main.c:1141
+#, c-format
+msgid "Bad y-coordinate line %lu column %d. <%s>"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:629 ../raster/r.in.xyz/main.c:1126
+#, c-format
+msgid "Bad x-coordinate line %lu column %d. <%s>"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:636 ../raster/r.in.xyz/main.c:1156
+#, c-format
+msgid "Bad z-coordinate line %lu column %d. <%s>"
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:718
+msgid "Writing to map ..."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:1014
+#, c-format
+msgid "Writing map, row %d"
+msgstr "Scrierea hărții, rândul %d"
+
+#: ../raster/r.in.xyz/main.c:1061
+#, c-format
+msgid "%lu points found in region."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:1088
+msgid "Scanning data ..."
+msgstr ""
+
+#: ../raster/r.in.xyz/main.c:1176
+#, c-format
+msgid "Range:     min         max\n"
+msgstr ""
+
+#: ../raster/r.series/main.c:101 ../raster/r.resamp.stats/main.c:290
+#, c-format
+msgid "Unknown method <%s>"
+msgstr ""
+
+#: ../raster/r.series/main.c:133
+msgid "raster, series"
+msgstr ""
+
+#: ../raster/r.series/main.c:135
+msgid "Makes each output cell value a function of the values assigned to the corresponding cells in the input raster map layers."
+msgstr "Face fiecare valoare a celulei rezultate în funcție de valorile corespunzătoare celulelor din harta raster de intrare."
+
+#: ../raster/r.series/main.c:149
+msgid "Aggregate operation"
+msgstr "Operațiune de agregare"
+
+#: ../raster/r.series/main.c:156
+msgid "Quantile to calculate for method=quantile"
+msgstr ""
+
+#: ../raster/r.series/main.c:164
+msgid "Threshold to calculate for method=threshold"
+msgstr ""
+
+#: ../raster/r.series/main.c:176
+msgid "Ignore values outside this range"
+msgstr ""
+
+#: ../raster/r.series/main.c:180 ../raster/r.resamp.stats/main.c:277
+msgid "Propagate NULLs"
+msgstr ""
+
+#: ../raster/r.series/main.c:202 ../imagery/i.group/main.c:102
+msgid "No input raster map(s) specified"
+msgstr "Nici o hartă raster de intrare specificată"
+
+#: ../raster/r.series/main.c:217 ../raster/r.neighbors/main.c:216
+#: ../ps/ps.map/outl_io.c:72
+#, c-format
+msgid "Unable to open raster map <%s> in mapset <%s>"
+msgstr "Imposibil de deschis harta raster <%s> în mapset <%s>"
+
+#: ../raster/r.series/main.c:228
+msgid "output= and method= must have the same number of values"
+msgstr ""
+
+#: ../raster/r.series/main.c:261 ../raster/r.slope.aspect/main.c:568
+#: ../raster/r.patch/main.c:152
+msgid "Percent complete..."
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:148 ../raster/r.circle/dist.c:51
+#: ../raster/r.grow2/main.c:128 ../raster/r.digit/main.c:45
+#: ../raster/r.patch/main.c:53
+msgid "raster, geometry"
+msgstr "raster, geometrie"
+
+#: ../raster/r.grow.distance/main.c:150
+msgid "Generates a raster map layer of distance to features in input layer."
+msgstr "Generează un strat raster pentru distanța dintre trăsături în stratul de intrare."
+
+#: ../raster/r.grow.distance/main.c:157
+msgid "Name for distance output map"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:162
+msgid "Name for value output map"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:168 ../raster/r.grow2/main.c:148
+msgid "Metric"
+msgstr "Metric"
+
+#: ../raster/r.grow.distance/main.c:174
+msgid "Output distances in meters instead of map units"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:184
+msgid "At least one of distance= and value= must be given"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:199
+msgid "metric=geodesic is only valid for lat/lon"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:205 ../raster/r.grow2/main.c:199
+#, c-format
+msgid "Unknown metric: [%s]."
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:220
+#, c-format
+msgid "Unable to create distance map <%s>"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:226
+#, c-format
+msgid "Unable to create value map <%s>"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:232
+#, c-format
+msgid "Unable to create temporary file <%s>"
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:307
+msgid "Writing output raster maps..."
+msgstr ""
+
+#: ../raster/r.grow.distance/main.c:364 ../raster/r.colors/main.c:390
+#: ../raster/r.colors.out/main.c:91
+#, c-format
+msgid "Unable to read color table for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.out.ppm3/main.c:59
+msgid "Converts 3 GRASS raster layers (R,G,B) to a PPM image file at the pixel resolution of the CURRENTLY DEFINED REGION."
+msgstr "Convertește 3 straturi raster GRASS (R,G,B) într-un fișier imagine PPM cu rezoluția pixelului a REGIUNII CURENTE DEFINITĂ."
+
+#: ../raster/r.out.ppm3/main.c:85
+msgid "Name for new PPM file. (use out=- for stdout)"
+msgstr ""
+
+#: ../raster/r.out.ppm3/main.c:94
+msgid "Add comments to describe the region"
+msgstr ""
+
+#: ../raster/r.out.ppm3/main.c:109 ../raster/r.out.ppm/main.c:110
+#, c-format
+msgid "rows = %d, cols = %d"
+msgstr "rânduri = %d, coloane = %d"
+
+#: ../raster/r.out.ppm3/main.c:131 ../raster/r.his/main.c:142
+#: ../raster/r.his/main.c:161 ../raster/r.his/main.c:186
+#: ../display/d.legend/main.c:250 ../display/d.rgb/main.c:105
+#: ../display/d.histogram/main.c:165 ../display/d.rast.num/number.c:278
+#: ../display/d.rast.edit/cell.c:51 ../display/d.his/main.c:152
+#: ../display/d.his/main.c:171 ../display/d.his/main.c:196
+#: ../display/d.rast/display.c:21
+#, c-format
+msgid "Color file for <%s> not available"
+msgstr "Fișierul de culoare pentru <%s> nu este disponibil"
+
+#: ../raster/r.out.ppm3/main.c:176
+msgid "Converting ... "
+msgstr "Convertire ... "
+
+#: ../raster/r.null/null.c:58
+msgid "raster, null data"
+msgstr "raster, date nule"
+
+#: ../raster/r.null/null.c:59
+msgid "Manages NULL-values of given raster map."
+msgstr "Gestionează valorile nule pentru o hartă raster dată."
+
+#: ../raster/r.null/null.c:62
+msgid "Name of raster map for which to edit null file"
+msgstr ""
+
+#: ../raster/r.null/null.c:70 ../raster3d/base/r3.null.main.c:66
+msgid "List of cell values to be set to NULL"
+msgstr ""
+
+#: ../raster/r.null/null.c:71 ../raster/r.null/null.c:79
+#: ../general/g.proj/main.c:190
+msgid "Modify"
+msgstr ""
+
+#: ../raster/r.null/null.c:78 ../raster3d/base/r3.null.main.c:73
+msgid "The value to replace the null value by"
+msgstr ""
+
+#: ../raster/r.null/null.c:83
+msgid "Only do the work if the map is floating-point"
+msgstr ""
+
+#: ../raster/r.null/null.c:84 ../raster/r.null/null.c:89
+#: ../raster/r.null/null.c:95
+msgid "Check"
+msgstr "Verifică"
+
+#: ../raster/r.null/null.c:88
+msgid "Only do the work if the map is integer"
+msgstr ""
+
+#: ../raster/r.null/null.c:94
+msgid "Only do the work if the map doesn't have a NULL-value bitmap file"
+msgstr ""
+
+#: ../raster/r.null/null.c:100
+msgid "Create NULL-value bitmap file validating all data cells"
+msgstr ""
+
+#: ../raster/r.null/null.c:104
+msgid "Remove NULL-value bitmap file"
+msgstr ""
+
+#: ../raster/r.null/null.c:105
+#: ../locale/scriptstrings/r.mask_to_translate.c:11
+msgid "Remove"
+msgstr "Elimină"
+
+#: ../raster/r.null/null.c:123
+#, c-format
+msgid "Raster map <%s> is a reclass of map <%s@%s>. Consider to generate a copy with r.mapcalc. Exiting."
+msgstr ""
+
+#: ../raster/r.null/null.c:129
+#, c-format
+msgid "Raster map <%s> is not in your mapset <%s>"
+msgstr ""
+
+#: ../raster/r.null/null.c:136
+#, c-format
+msgid "%s is illegal entry for null"
+msgstr ""
+
+#: ../raster/r.null/null.c:143
+#, c-format
+msgid "Raster map <%s> already has a null bitmap file"
+msgstr ""
+
+#: ../raster/r.null/null.c:147
+#, c-format
+msgid "<%s> is integer raster map (CELL)"
+msgstr ""
+
+#: ../raster/r.null/null.c:151
+#, c-format
+msgid "<%s> is integer raster map (CELL). Using null=%d."
+msgstr ""
+
+#: ../raster/r.null/null.c:157
+#, c-format
+msgid "<%s> is floating pointing raster map"
+msgstr ""
+
+#: ../raster/r.null/null.c:163 ../raster/r.topidx/file_io.c:21
+#: ../raster/r.texture/main.c:240 ../raster/r.out.tiff/r.out.tiff.c:169
+#: ../raster/r.bitpattern/main.c:114 ../imagery/i.rectify/main.c:294
+#: ../imagery/i.rectify/main.c:300 ../imagery/i.landsat.toar/main.c:328
+#: ../imagery/i.landsat.toar/main.c:468
+#, c-format
+msgid "Unable to read header of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.null/null.c:175
+#, c-format
+msgid "Writing new null file for raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.null/null.c:182
+#, c-format
+msgid "Error writing null row %d"
+msgstr ""
+
+#: ../raster/r.null/null.c:187 ../raster/r.null/null.c:200
+#, c-format
+msgid "Raster map <%s> modified."
+msgstr "Harta raster <%s> modificată."
+
+#: ../raster/r.null/null.c:194
+#, c-format
+msgid "Removing null file for raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.null/null.c:264
+#, c-format
+msgid "%s: %s: illegal value spec"
+msgstr ""
+
+#: ../raster/r.null/null.c:266 ../raster3d/base/mask_functions.c:100
+#, c-format
+msgid "%s: illegal value spec"
+msgstr ""
+
+#: ../raster/r.null/null.c:333
+#, c-format
+msgid "Writing new data for raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.null/null.c:348 ../raster/r.buffer/write_map.c:78
+#: ../raster/r.texture/main.c:356 ../raster/r.texture/main.c:360
+#: ../raster/r.texture/main.c:367 ../raster/r.proj/main.c:445
+#: ../raster/r.proj.seg/main.c:513 ../raster/r.los/main.c:380
+#: ../imagery/i.landsat.acca/tools.c:291
+#: ../imagery/i.landsat.acca/algorithm.c:362
+#, c-format
+msgid "Failed writing raster map <%s> row %d"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:115 ../raster/r.horizon/main.c:177
+msgid "raster, sun position"
+msgstr "raster, poziția soarelui"
+
+#: ../raster/r.sunmask/main.c:116
+msgid "Calculates cast shadow areas from sun position and elevation raster map."
+msgstr "Calculează zonele umbrite în funcție de poziția soarelui și harta raster de elevație."
+
+#: ../raster/r.sunmask/main.c:117
+msgid "Either exact sun position (A) is specified, or date/time to calculate the sun position (B) by r.sunmask itself."
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:131
+msgid "Altitude of the sun above horizon, degrees (A)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:132 ../raster/r.sunmask/main.c:141
+#: ../raster/r.sunmask/main.c:208 ../raster/r.sunmask/main.c:218
+msgid "Position"
+msgstr "Poziție"
+
+#: ../raster/r.sunmask/main.c:140
+msgid "Azimuth of the sun from the north, degrees (A)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:147
+msgid "Year (B)"
+msgstr "An (B)"
+
+#: ../raster/r.sunmask/main.c:149 ../raster/r.sunmask/main.c:157
+#: ../raster/r.sunmask/main.c:165 ../raster/r.sunmask/main.c:173
+#: ../raster/r.sunmask/main.c:181 ../raster/r.sunmask/main.c:189
+#: ../raster/r.sunmask/main.c:198
+msgid "Time"
+msgstr "Timp"
+
+#: ../raster/r.sunmask/main.c:155
+msgid "Month (B)"
+msgstr "Lună (B)"
+
+#: ../raster/r.sunmask/main.c:163
+msgid "Day (B)"
+msgstr "Zi (B)"
+
+#: ../raster/r.sunmask/main.c:171
+msgid "Hour (B)"
+msgstr "Oră (B)"
+
+#: ../raster/r.sunmask/main.c:179
+msgid "Minutes (B)"
+msgstr "Minute (B)"
+
+#: ../raster/r.sunmask/main.c:187
+msgid "Seconds (B)"
+msgstr "Secunde (B)"
+
+#: ../raster/r.sunmask/main.c:196
+msgid "Timezone"
+msgstr "Fusul orar"
+
+#: ../raster/r.sunmask/main.c:197
+msgid "East positive, offset from GMT, also use to adjust daylight savings"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:206
+msgid "Easting coordinate (point of interest)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:207 ../raster/r.sunmask/main.c:217
+msgid "Default: map center"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:216
+msgid "Northing coordinate (point of interest)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:222
+msgid "Don't ignore zero elevation"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:227
+msgid "Verbose output (also print out sun position etc.)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:231
+msgid "Calculate sun position only and exit"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:232 ../raster/r.sunmask/main.c:238
+#: ../raster/r.stats/main.c:147 ../raster/r.stats/main.c:152
+#: ../raster/r.stats/main.c:157 ../raster/r.stats/main.c:163
+#: ../raster/r.stats/main.c:168 ../raster/r.stats/main.c:173
+#: ../raster/r.stats/main.c:178 ../raster/r.stats/main.c:183
+#: ../raster/r.out.gdal/main.c:133 ../raster/r.in.gdal/main.c:145
+#: ../raster/r.external/main.c:571 ../general/g.proj/main.c:77
+#: ../general/g.proj/main.c:83 ../general/g.proj/main.c:89
+#: ../general/g.proj/main.c:95 ../general/g.proj/main.c:101
+#: ../general/g.proj/main.c:112 ../general/g.proj/main.c:117
+#: ../general/g.mlist/main.c:140 ../general/g.mlist/main.c:145
+#: ../general/g.mlist/main.c:150 ../general/g.mlist/main.c:155
+#: ../general/g.mapsets/main.c:98 ../general/g.mapsets/main.c:103
+#: ../general/g.mapset/main.c:87 ../general/g.region/main.c:92
+#: ../general/g.region/main.c:98 ../general/g.region/main.c:103
+#: ../general/g.region/main.c:109 ../general/g.region/main.c:115
+#: ../general/g.region/main.c:121 ../general/g.region/main.c:127
+#: ../general/g.region/main.c:135 ../general/g.region/main.c:140
+#: ../general/g.region/main.c:146 ../general/g.region/main.c:151
+#: ../db/base/connect.c:52
+#: ../locale/scriptstrings/g.extension_to_translate.c:9
+#: ../imagery/i.group/main.c:77 ../imagery/i.group/main.c:83
+#: ../vector/v.info/main.c:75 ../vector/v.info/main.c:81
+#: ../vector/v.info/main.c:86 ../vector/v.info/main.c:91
+#: ../vector/v.info/main.c:96 ../vector/v.to.db/parse.c:104
+#: ../vector/v.to.db/parse.c:109 ../vector/v.to.db/parse.c:115
+#: ../vector/v.db.connect/main.c:81 ../vector/v.db.connect/main.c:86
+#: ../vector/v.db.connect/main.c:94 ../vector/v.db.connect/main.c:110
+msgid "Print"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:237
+msgid "Print the sun position output in shell script style"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:251
+#, c-format
+msgid "Using map center coordinates: %f %f"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:258
+msgid "Empty east coordinate specified"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:260
+msgid "Empty north coordinate specified"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:279
+msgid "Either define sun position or location/date/time parameters"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:282
+msgid "Neither sun position nor east/north, date/time/timezone definition are complete"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:286
+#, c-format
+msgid "Calculating sun position... (using solpos (V. %s) from NREL)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:291
+msgid "Using user defined sun azimuth, altitude settings (ignoring eventual other values)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:397
+msgid "Please correct settings"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:411
+#, c-format
+msgid "Time (%02i:%02i:%02i) is before sunrise (%02d:%02d:%02d)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:415
+#, c-format
+msgid "Time (%02i:%02i:%02i) is before sunrise"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:418 ../raster/r.sunmask/main.c:428
+msgid "Nothing to calculate. Please verify settings."
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:422
+#, c-format
+msgid "Time (%02i:%02i:%02i) is after sunset (%02d:%02d:%02d)"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:426
+#, c-format
+msgid "Time (%02i:%02i:%02i) is after sunset"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:437
+msgid "You already know the sun position"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:442
+#, c-format
+msgid "Option <%s> required"
+msgstr "Opțiunea <%s> este necesară"
+
+#: ../raster/r.sunmask/main.c:459
+#, c-format
+msgid "Unable to open range file for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.sunmask/main.c:475
+msgid "Calculating shadows from DEM..."
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:66
+msgid "Unable to calculate sun position in un-projected locations. Specify sunposition directly."
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:88
+#, c-format
+msgid "Specified point %f, %f outside of current region, is that intended? Anyway, it will be used."
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:98
+msgid "Unable to get projection info of current location"
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:101
+msgid "Unable to get projection units of current location"
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:104
+msgid "Unable to get projection key values of current location"
+msgstr ""
+
+#: ../raster/r.sunmask/g_solposition.c:127 ../raster/r.proj.seg/main.c:353
+#: ../raster/r.proj.seg/main.c:355 ../general/g.region/printwindow.c:281
+#: ../general/g.region/printwindow.c:289 ../general/g.region/printwindow.c:297
+#: ../general/g.region/printwindow.c:305 ../general/g.region/printwindow.c:534
+#: ../general/g.region/printwindow.c:542 ../general/g.region/printwindow.c:550
+#: ../general/g.region/printwindow.c:558 ../general/g.region/printwindow.c:676
+#: ../general/g.region/printwindow.c:684 ../general/g.region/printwindow.c:692
+#: ../general/g.region/printwindow.c:700
+msgid "Error in pj_do_proj (projection of input coordinate pair)"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:949
+#, c-format
+msgid "S_decode ==> Please fix the year: %d [1950-2050]"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:952
+#, c-format
+msgid "S_decode ==> Please fix the month: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:954
+#, c-format
+msgid "S_decode ==> Please fix the day-of-month: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:957
+#, c-format
+msgid "S_decode ==> Please fix the day-of-year: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:960
+#, c-format
+msgid "S_decode ==> Please fix the hour: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:962
+#, c-format
+msgid "S_decode ==> Please fix the minute: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:964
+#, c-format
+msgid "S_decode ==> Please fix the second: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:966
+#, c-format
+msgid "S_decode ==> Please fix the time zone: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:969
+#, c-format
+msgid "S_decode ==> Please fix the interval: %d"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:972
+#, c-format
+msgid "S_decode ==> Please fix the latitude: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:975
+#, c-format
+msgid "S_decode ==> Please fix the longitude: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:978
+#, c-format
+msgid "S_decode ==> Please fix the temperature: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:981
+#, c-format
+msgid "S_decode ==> Please fix the pressure: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:983
+#, c-format
+msgid "S_decode ==> Please fix the tilt: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:985
+#, c-format
+msgid "S_decode ==> Please fix the aspect: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:987
+#, c-format
+msgid "S_decode ==> Please fix the shadowband width: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:990
+#, c-format
+msgid "S_decode ==> Please fix the shadowband radius: %f"
+msgstr ""
+
+#: ../raster/r.sunmask/solpos00.c:993
+#, c-format
+msgid "S_decode ==> Please fix the shadowband sky factor: %f"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:212 ../raster/wildfire/r.spread/main.c:101
+#: ../raster/wildfire/r.spreadpath/main.c:72
+msgid "raster, fire"
+msgstr "raster, incendii"
+
+#: ../raster/wildfire/r.ros/main.c:214
+msgid "Generates three, or four raster map layers showing 1) the base (perpendicular) rate of spread (ROS), 2) the maximum (forward) ROS, 3) the direction of the maximum ROS, and optionally 4) the maximum potential spotting distance."
+msgstr "Generează trei sau patru straturi raster care arată 1) rata de răspândire (ROS) de bază (perpendiculară), 2) ROS maxim (înainte), 3) direcția pentru ROS maxim și opțional 4) potențialul maxim de propagare."
+
+#: ../raster/wildfire/r.ros/main.c:224
+msgid "Name of raster map containing fuel MODELs"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:231
+msgid "Name of raster map containing the 1-HOUR fuel MOISTURE (%)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:238
+msgid "Name of raster map containing the 10-HOUR fuel MOISTURE (%)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:245
+msgid "Name of raster map containing the 100-HOUR fuel MOISTURE (%)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:253
+msgid "Name of raster map containing LIVE fuel MOISTURE (%)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:260
+msgid "Name of raster map containing midflame wind VELOCITYs (ft/min)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:267
+msgid "Name of raster map containing wind DIRECTIONs (degree)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:274
+msgid "Name of raster map containing SLOPE (degree)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:281
+msgid "Name of raster map containing ASPECT (degree, anti-clockwise from E)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:288
+msgid "Name of raster map containing ELEVATION (m) (required w/ -s)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:296
+msgid "Name of raster map to contain results (several new layers)"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:305
+msgid "Also produce maximum SPOTTING distance"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:424 ../raster/wildfire/r.ros/main.c:428
+#: ../raster/wildfire/r.ros/main.c:432 ../raster/wildfire/r.ros/main.c:439
+#: ../raster/wildfire/r.spread/main.c:384
+#: ../raster/wildfire/r.spread/main.c:393
+#: ../raster/wildfire/r.spread/main.c:403
+#, c-format
+msgid "Raster map <%s> already exists in mapset <%s>, select another name"
+msgstr ""
+
+#: ../raster/wildfire/r.ros/main.c:640
+msgid "Percent Completed ... "
+msgstr "Procent completat ... "
+
+#: ../raster/wildfire/r.spread/main.c:103
+msgid "Simulates elliptically anisotropic spread on a graphics window and generates a raster map of the cumulative time of spread, given raster maps containing the rates of spread (ROS), the ROS directions and the spread origins."
+msgstr "Simulează răspândirea eliptică \"anisotropic\" pe fereastra grafică și generează o hartă raster a răspândirii cumulative în timp, care conține ratele de răspândire (ROS), direcția ROS și originile răspândirii."
+
+#: ../raster/wildfire/r.spread/main.c:108
+msgid "It optionally produces raster maps to contain backlink UTM coordinates for tracing spread paths."
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:116
+#: ../raster/wildfire/r.spread/main.c:125
+#: ../raster/wildfire/r.spread/main.c:134
+#: ../raster/wildfire/r.spread/main.c:143
+#: ../raster/wildfire/r.spread/main.c:151
+#: ../raster/wildfire/r.spread/main.c:159
+#: ../raster/wildfire/r.spread/main.c:167
+msgid "Input_maps"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:118
+msgid "Name of raster map containing MAX rate of spread (ROS) (cm/min)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:127
+msgid "Name of raster map containing DIRections of max ROS (degree)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:136
+msgid "Name of raster map containing BASE ROS (cm/min)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:145
+msgid "Name of raster map containing STARTing sources"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:153
+msgid "Name of raster map containing max SPOTting DISTance (m) (required w/ -s)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:161
+msgid "Name of raster map containing midflame Wind SPEED (ft/min) (required w/ -s)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:169
+msgid "Name of raster map containing fine Fuel MOISture of the cell receiving a spotting firebrand (%) (required w/ -s)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:177
+msgid "Basic sampling window SIZE needed to meet certain accuracy (3)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:184
+msgid "Sampling DENSity for additional COMPutin (range: 0.0 - 1.0 (0.5))"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:191
+msgid "INITial TIME for current simulation (0) (min)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:198
+msgid "Simulating time duration LAG (fill the region) (min)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:205
+msgid "Name of raster map as a display backdrop"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:212
+#: ../raster/wildfire/r.spread/main.c:220
+#: ../raster/wildfire/r.spread/main.c:228
+msgid "Output_maps"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:214
+msgid "Name of raster map to contain OUTPUT spread time (min)"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:222
+msgid "Name of raster map to contain X_BACK coordinates"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:230
+msgid "Name of raster map to contain Y_BACK coordinates"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:235
+msgid "Run VERBOSELY"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:239
+msgid "DISPLAY 'live' spread process on screen"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:243
+msgid "For wildfires: consider SPOTTING effect"
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:463
+msgid "Reading inputs..."
+msgstr ""
+
+#: ../raster/wildfire/r.spread/main.c:514 ../raster/r.sum/main.c:74
+#: ../raster/r.walk/main.c:722 ../raster/r.walk/main.c:784
+#, c-format
+msgid "Reading %s..."
+msgstr "Citirea %s..."
+
+#: ../raster/wildfire/r.spreadpath/main.c:74
+msgid "Recursively traces the least cost path backwards to cells from which the cumulative cost was determined."
+msgstr "Trasează recursiv cea mai scurtă cale la celulele de la care a fost determinat costul cumulativ."
+
+#: ../raster/wildfire/r.spreadpath/main.c:83
+msgid "Name of raster map containing back-path easting information"
+msgstr ""
+
+#: ../raster/wildfire/r.spreadpath/main.c:91
+msgid "Name of raster map containing back-path northing information"
+msgstr ""
+
+#: ../raster/wildfire/r.spreadpath/main.c:99
+msgid "The map E and N grid coordinates of starting points"
+msgstr ""
+
+#: ../raster/wildfire/r.spreadpath/main.c:106
+msgid "Name of spread path raster map"
+msgstr ""
+
+#: ../raster/r.in.gridatb/main.c:43
+msgid "Imports GRIDATB.FOR map file (TOPMODEL) into GRASS raster map"
+msgstr "Importă fișier GRIDATB.FOR (TOPMODEL) într-o hartă raster GRASS"
+
+#: ../raster/r.in.gridatb/main.c:47 ../raster/r.out.gridatb/main.c:57
+msgid "GRIDATB i/o map file"
+msgstr ""
+
+#: ../raster/r.in.gridatb/main.c:53
+#: ../locale/scriptstrings/i.in.spotvgt_to_translate.c:5
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:9
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:18
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:6
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:4
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:4
+#: ../imagery/i.ifft/ifftmain.c:83
+msgid "Name for output raster map"
+msgstr ""
+
+#: ../raster/r.in.gridatb/main.c:67
+#, c-format
+msgid "File not found: %s"
+msgstr "Fișierul nu a fost găsit: %s"
+
+#: ../raster/r.in.gridatb/file_io.c:33
+msgid "Setting window header failed"
+msgstr "Setările antetului ferestrei a eșuat"
+
+#: ../raster/r.in.gridatb/file_io.c:36 ../raster/r.out.gridatb/file_io.c:41
+msgid "Rows changed"
+msgstr "Rânduri modificate"
+
+#: ../raster/r.in.gridatb/file_io.c:39 ../raster/r.out.gridatb/file_io.c:44
+msgid "Cols changed"
+msgstr "Coloane modificate"
+
+#: ../raster/r.in.poly/poly2rast.c:36
+#, c-format
+msgid "Can't create raster map <%s>"
+msgstr "Nu s-a putut crea harta raster <%s>"
+
+#: ../raster/r.in.poly/poly2rast.c:78 ../raster/r.carve/raster.c:32
+#: ../vector/v.to.rast/vect2rast.c:182
+msgid "Writing raster map..."
+msgstr "Scrierea hărții raster..."
+
+#: ../raster/r.in.poly/main.c:31
+msgid "Creates raster maps from ASCII polygon/line/point data files."
+msgstr "Crează hărți raster din date de tip punct/linie/poligon ASCII"
+
+#: ../raster/r.in.poly/main.c:35
+msgid "Name of input file; or \"-\" to read from stdin"
+msgstr ""
+
+#: ../raster/r.in.poly/main.c:50 ../vector/v.to.rast/main.c:100
+msgid "Number of rows to hold in memory"
+msgstr ""
+
+#: ../raster/r.in.poly/main.c:59
+msgid "Minimum number of rows to hold in memory is 1"
+msgstr ""
+
+#: ../raster/r.in.poly/get_item.c:75
+#, c-format
+msgid "Illegal coordinate <%s, %s>, skipping."
+msgstr ""
+
+#: ../raster/r.in.poly/get_item.c:80
+#, c-format
+msgid "Illegal north coordinate <%s>, skipping."
+msgstr ""
+
+#: ../raster/r.in.poly/get_item.c:85
+#, c-format
+msgid "Illegal east coordinate <%s>, skipping."
+msgstr ""
+
+#: ../raster/r.what.color/main.c:88 ../raster/r.what/main.c:91
+msgid "raster, querying"
+msgstr "raster, interogare"
+
+#: ../raster/r.what.color/main.c:89
+msgid "Queries colors for a raster map layer."
+msgstr "Interoghează culorile pentru un strat raster."
+
+#: ../raster/r.what.color/main.c:97
+msgid "Name of existing raster map to query colors"
+msgstr ""
+
+#: ../raster/r.what.color/main.c:104
+msgid "Values to query colors for"
+msgstr ""
+
+#: ../raster/r.what.color/main.c:111
+msgid "Output format (printf-style)"
+msgstr ""
+
+#: ../raster/r.what.color/main.c:115
+msgid "Read values from stdin"
+msgstr ""
+
+#: ../raster/r.what.color/main.c:121
+msgid "Either \"-i\" or \"value=\" must be given"
+msgstr ""
+
+#: ../raster/r.support.stats/main.c:38
+msgid "Update raster map statistics"
+msgstr "Actualizează statistica hărții raster"
+
+#: ../raster/r.support.stats/main.c:53
+#, c-format
+msgid "Statistics for <%s> updated"
+msgstr ""
+
+#: ../raster/r.support.stats/check.c:42
+#, c-format
+msgid "Updating statistics for [%s]..."
+msgstr ""
+
+#: ../raster/r.support.stats/check.c:55
+msgid "Updating histogram range..."
+msgstr ""
+
+#: ../raster/r.support.stats/check.c:87
+#, c-format
+msgid "Updating the number of categories for [%s]..."
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:62
+msgid "Converts a raster map layer into an ESRI ARCGRID file."
+msgstr "Convertește hartă raster într-un fișier ESRI ARCGRID."
+
+#: ../raster/r.out.arc/main.c:69
+msgid "Name for output ARC-GRID map (use out=- for stdout)"
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:76
+msgid "Number of decimal places"
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:80 ../raster/r.out.ascii/main.c:104
+#: ../raster3d/r3.out.ascii/main.c:103
+msgid "Suppress printing of header information"
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:86
+msgid "List one entry per line instead of full row"
+msgstr ""
+
+#: ../raster/r.out.arc/main.c:92
+msgid "Use cell center reference in header instead of cell corner"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:42
+#, c-format
+msgid "Enter rules, \"end\" when done, \"help\" if you need it.\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:51
+#, c-format
+msgid "fp: Data range is %s to %s\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:55 ../raster/r.reclass/main.c:113
+#, c-format
+msgid "Data range is %ld to %ld\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:66
+#, c-format
+msgid ""
+"Your color rules do not cover the whole range of data!\n"
+" (rules %f to %f but data %f to %f)"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:106 ../raster/r.reclass/parse.c:40
+#, c-format
+msgid "Enter a rule in one of these formats:\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:107
+#, c-format
+msgid " val color\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:108
+#, c-format
+msgid " n%% color\n"
+msgstr " n%% culoare\n"
+
+#: ../raster/r.colors/rules.c:109
+#, c-format
+msgid " nv color\n"
+msgstr " nv culoare\n"
+
+#: ../raster/r.colors/rules.c:110
+#, c-format
+msgid " default color\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:111
+#, c-format
+msgid "color can be one of:\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:113
+#, c-format
+msgid "or an R:G:B triplet, e.g.: 0:127:255\n"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:134
+#, c-format
+msgid "bad rule (%s); rule not added"
+msgstr ""
+
+#: ../raster/r.colors/rules.c:136
+#, c-format
+msgid "bad rule (%s): [%s]"
+msgstr ""
+
+#: ../raster/r.colors/stats.c:79
+msgid "Unable to use logarithmic scaling if range includes zero"
+msgstr ""
+
+#: ../raster/r.colors/main.c:175
+#: ../locale/scriptstrings/r.colors.stddev_to_translate.c:2
+msgid "raster, color table"
+msgstr ""
+
+#: ../raster/r.colors/main.c:177
+msgid "Creates/modifies the color table associated with a raster map layer."
+msgstr "Crează/modifică tabelul de culoare asociat cu un strat raster."
+
+#: ../raster/r.colors/main.c:181 ../raster/r.out.gdal/main.c:148
+#: ../raster/r.out.gdal/main.c:184 ../raster/r.in.gdal/main.c:90
+#: ../raster/r.in.gdal/main.c:94 ../raster/r.external/main.c:527
+#: ../raster/r.external/main.c:537 ../raster/r.recode/main.c:54
+#: ../display/d.rast.num/number.c:91 ../ps/ps.map/main.c:140
+#: ../vector/v.in.ascii/in.c:57 ../vector/v.select/args.c:50
+#: ../vector/v.in.ogr/main.c:119 ../vector/v.in.ogr/main.c:123
+msgid "Required"
+msgstr "Necesar"
+
+#: ../raster/r.colors/main.c:191
+#: ../locale/scriptstrings/v.colors_to_translate.c:9
+msgid "Type of color table"
+msgstr ""
+
+#: ../raster/r.colors/main.c:193 ../raster/r.colors/main.c:207
+#: ../raster/r.colors/main.c:225 ../raster/r.colors/main.c:230
+#: ../raster/r.colors/main.c:235 ../raster/r.colors/main.c:240
+#: ../locale/scriptstrings/v.colors_to_translate.c:7
+#: ../locale/scriptstrings/v.colors_to_translate.c:10
+#: ../locale/scriptstrings/v.colors_to_translate.c:12
+#: ../locale/scriptstrings/v.colors_to_translate.c:14
+#: ../locale/scriptstrings/v.colors_to_translate.c:17
+#: ../display/d.vect/main.c:123 ../display/d.vect/main.c:133
+#: ../display/d.vect/main.c:140 ../display/d.vect/main.c:151
+#: ../display/d.vect/main.c:319 ../display/d.vect/main.c:325
+#: ../display/d.vect/main.c:345 ../display/d.rast.num/number.c:101
+#: ../display/d.rast.num/number.c:111 ../display/d.rast.num/number.c:125
+#: ../vector/v.label/main.c:153 ../vector/v.label/main.c:177
+#: ../vector/v.label/main.c:190 ../vector/v.label/main.c:196
+#: ../vector/v.label/main.c:206 ../vector/v.label.sa/main.c:149
+#: ../vector/v.label.sa/main.c:159 ../vector/v.label.sa/main.c:166
+#: ../vector/v.label.sa/main.c:176 ../vector/v.label.sa/main.c:186
+#: ../vector/v.label.sa/main.c:196 ../vector/v.label.sa/main.c:203
+msgid "Colors"
+msgstr "Culori"
+
+#: ../raster/r.colors/main.c:201
+#: ../locale/scriptstrings/v.colors_to_translate.c:11
+msgid "Raster map name from which to copy color table"
+msgstr ""
+
+#: ../raster/r.colors/main.c:206
+msgid "Path to rules file (\"-\" to read rules from stdin)"
+msgstr ""
+
+#: ../raster/r.colors/main.c:211
+msgid "Remove existing color table"
+msgstr ""
+
+#: ../raster/r.colors/main.c:216
+msgid "Only write new color table if one doesn't already exist"
+msgstr ""
+
+#: ../raster/r.colors/main.c:220
+msgid "List available rules then exit"
+msgstr ""
+
+#: ../raster/r.colors/main.c:224
+#: ../locale/scriptstrings/v.colors_to_translate.c:16
+msgid "Invert colors"
+msgstr ""
+
+#: ../raster/r.colors/main.c:229
+msgid "Logarithmic scaling"
+msgstr ""
+
+#: ../raster/r.colors/main.c:234
+msgid "Logarithmic-absolute scaling"
+msgstr ""
+
+#: ../raster/r.colors/main.c:239
+msgid "Histogram equalization"
+msgstr ""
+
+#: ../raster/r.colors/main.c:244
+msgid "Enter rules interactively"
+msgstr ""
+
+#: ../raster/r.colors/main.c:278
+msgid "No raster map specified"
+msgstr ""
+
+#: ../raster/r.colors/main.c:281
+msgid "One of \"-i\" or \"-r\" or options \"color\", \"rast\" or \"rules\" must be specified!"
+msgstr ""
+
+#: ../raster/r.colors/main.c:284
+msgid "Interactive mode is incompatible with \"color\", \"rules\", and \"raster\" options"
+msgstr ""
+
+#: ../raster/r.colors/main.c:291
+msgid "\"color\", \"rules\", and \"raster\" options are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.colors/main.c:302
+msgid "-g and -a flags are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.colors/main.c:312
+#, c-format
+msgid "Unable to remove color table of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.colors/main.c:314
+#, c-format
+msgid "Color table of raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.colors/main.c:324
+msgid "Color table exists. Exiting."
+msgstr ""
+
+#: ../raster/r.colors/main.c:344
+msgid "Color table 'random' is not supported for floating point raster map"
+msgstr ""
+
+#: ../raster/r.colors/main.c:349
+msgid "Color table 'grey.eq' is not supported for floating point raster map"
+msgstr ""
+
+#: ../raster/r.colors/main.c:356
+msgid "Color table 'grey.log' is not supported for floating point raster map"
+msgstr ""
+
+#: ../raster/r.colors/main.c:369
+#, c-format
+msgid "Unknown color request '%s'"
+msgstr ""
+
+#: ../raster/r.colors/main.c:380
+#, c-format
+msgid "Unable to load rules file <%s>"
+msgstr ""
+
+#: ../raster/r.colors/main.c:427
+#, c-format
+msgid "Color table for raster map <%s> set to '%s'"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:68
+msgid "raster, import, conversion"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:70
+msgid "Converts ASCII raster file to binary raster map layer."
+msgstr "Convertește fișier raster ASCII în strat raster binar."
+
+#: ../raster/r.in.ascii/main.c:74
+msgid "ASCII raster file to be imported. If not given reads from standard input"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:100
+msgid "String representing NULL value data cell"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:104
+msgid "Integer values are imported"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:108
+msgid "Floating point values are imported"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:112
+msgid "Double floating point values are imported"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:117
+msgid "SURFER (Golden Software) ASCII file will be imported"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:135
+#, c-format
+msgid "Wrong entry for multiplier: %s"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:158
+msgid "Unable to read input from stdin"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:165
+#, c-format
+msgid "Unable to read input from <%s>"
+msgstr ""
+
+#: ../raster/r.in.ascii/main.c:285
+msgid "Unable to write to file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:34
+msgid "input file is not a Surfer ascii grid file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:40
+msgid "error reading the column and row dimension from the Surfer grid file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:46
+msgid "error reading the X range from the Surfer grid file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:52
+msgid "error reading the Y range from the Surfer grid file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:58
+msgid "error reading the Z range from the Surfer grid file"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:105
+msgid "error getting file position"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:164
+msgid "illegal type field: using type int"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:169
+msgid "ignoring type filed in header, type is set on command line"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:176
+msgid "illegal multiplier field: using 1.0"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:181
+msgid "ignoring multiplier filed in header, multiplier is set on command line"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:189
+msgid "ignoring null filed in header, null string is set on command line"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:218
+msgid "error in ascii data format"
+msgstr ""
+
+#: ../raster/r.in.ascii/gethead.c:256
+#, c-format
+msgid "Illegal \"%s\" value in header: %s"
+msgstr ""
+
+#: ../raster/r.out.ppm/main.c:56
+msgid "Converts a GRASS raster map to a PPM image file at the pixel resolution of the currently defined region."
+msgstr "Convertește harta raster GRASS într-un fișier imagine PPM cu rezoluția pixelului a regiunii curente definită."
+
+#: ../raster/r.out.ppm/main.c:64
+msgid "Name for new PPM file (use '-' for stdout)"
+msgstr ""
+
+#: ../raster/r.out.ppm/main.c:73
+msgid "Output greyscale instead of color"
+msgstr ""
+
+#: ../raster/r.out.ppm/main.c:138
+#, c-format
+msgid "Unable to open file <%s> for write"
+msgstr "Imposbil de deschis fișierul <%s> pentru scriere"
+
+#: ../raster/r.out.ppm/main.c:167
+msgid "Converting..."
+msgstr "Convertire..."
+
+#: ../raster/r.out.ppm/main.c:250
+#, c-format
+msgid "File <%s> created"
+msgstr "Fișierul <%s> a fost creat"
+
+#: ../raster/r.random.cells/random.c:51
+#, c-format
+msgid "RAN1: j == %d shouldn't happen"
+msgstr ""
+
+#: ../raster/r.random.cells/main.c:35
+msgid "raster, random, cell"
+msgstr "raster, aleatoriu, celule"
+
+#: ../raster/r.random.cells/main.c:37
+msgid "Generates random cell values with spatial dependence."
+msgstr "Generează aleator valorile celulelor cu dependență spațială."
+
+#: ../raster/r.random.cells/init.c:34
+msgid "Maximum distance of spatial correlation (value(s) >= 0.0)"
+msgstr ""
+
+#: ../raster/r.random.cells/init.c:41
+msgid "Random seed (SEED_MIN >= value >= SEED_MAX) (default [random])"
+msgstr ""
+
+#: ../raster/r.random.cells/init.c:96
+msgid "Distance must be >= 0.0"
+msgstr ""
+
+#: ../raster/r.random.cells/init.c:115 ../raster/r.random.surface/main.c:57
+#, c-format
+msgid "Generating raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.random.cells/init.c:156 ../raster/r.random.surface/init.c:425
+#: ../imagery/i.topo.corr/main.c:52
+#, c-format
+msgid "<%s> is an illegal name"
+msgstr ""
+
+#: ../raster/r.stats/main.c:105
+msgid "Generates area statistics for raster map layers."
+msgstr "Generează statistici pentru harta raster."
+
+#: ../raster/r.stats/main.c:114 ../raster/r.univar2/r3.univar_main.c:43
+#: ../raster/r.univar2/r.univar_main.c:42 ../db/base/select.c:233
+#: ../locale/scriptstrings/r.out.xyz_to_translate.c:4
+#: ../vector/v.db.select/main.c:84
+msgid "Name for output file (if omitted or \"-\" output to stdout)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:127 ../raster/r.describe/main.c:72
+msgid "String representing no data cell value"
+msgstr ""
+
+#: ../raster/r.stats/main.c:136 ../raster/r.report/parse.c:91
+msgid "Number of fp subranges to collect stats from"
+msgstr ""
+
+#: ../raster/r.stats/main.c:142
+msgid "One cell (range) per line"
+msgstr ""
+
+#: ../raster/r.stats/main.c:146
+msgid "Print averaged values instead of intervals"
+msgstr ""
+
+#: ../raster/r.stats/main.c:151
+msgid "Print area totals"
+msgstr ""
+
+#: ../raster/r.stats/main.c:156
+msgid "Print cell counts"
+msgstr ""
+
+#: ../raster/r.stats/main.c:162
+msgid "Print APPROXIMATE percents (total percent may not be 100%)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:167
+msgid "Print category labels"
+msgstr ""
+
+#: ../raster/r.stats/main.c:172
+msgid "Print grid coordinates (east and north)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:177
+msgid "Print x and y (column and row)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:182
+msgid "Print raw indexes of fp ranges (fp maps only)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:187 ../raster/r.describe/main.c:94
+msgid "Suppress reporting of any NULLs"
+msgstr ""
+
+#: ../raster/r.stats/main.c:192
+msgid "Suppress reporting of NULLs when all values are NULL"
+msgstr ""
+
+#: ../raster/r.stats/main.c:196 ../raster/r.report/parse.c:122
+msgid "Report for cats fp ranges (fp maps only)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:200 ../raster/r.report/parse.c:127
+msgid "Read fp map as integer (use map's quant rules)"
+msgstr ""
+
+#: ../raster/r.stats/main.c:208 ../raster/r.regression.line/main.c:75
+#: ../raster/r.univar2/r3.univar_main.c:123
+#: ../raster/r.univar2/r.univar_main.c:110 ../db/base/select.c:130
+#: ../vector/v.db.select/main.c:111
+#, c-format
+msgid "Unable to open file <%s> for writing"
+msgstr ""
+
+#: ../raster/r.stats/main.c:214
+#, c-format
+msgid "'%s' must be greater than zero; using %s=255"
+msgstr ""
+
+#: ../raster/r.stats/main.c:261
+msgid "Raster map not found"
+msgstr ""
+
+#: ../raster/r.stats/main.c:284
+#, c-format
+msgid "Raster map <%s> is reading as integer map! Flag '-%c' and/or '%s' option will be ignored."
+msgstr ""
+
+#: ../raster/r.stats/main.c:301
+#, c-format
+msgid "Cats for raster map <%s> are either missing or have no explicit labels. Using %s=%d."
+msgstr ""
+
+#: ../raster/r.stats/main.c:308
+#, c-format
+msgid "Flag '-%c' was given, using cats fp ranges of raster map <%s>, ignoring '%s' option"
+msgstr ""
+
+#: ../raster/r.stats/main.c:315 ../raster/r.contour/main.c:165
+#: ../raster/r.recode/read_rules.c:19
+#, c-format
+msgid "Unable to read fp range of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.stats/main.c:342
+#, c-format
+msgid "Unable to read range for map <%s>"
+msgstr ""
+
+#: ../raster/r.stats/cell_stats.c:51
+#, c-format
+msgid "Unable to read raster <map %d of %d> row %d"
+msgstr ""
+
+#: ../raster/r.statistics/o_skew.c:97
+msgid "o_skew: No data in array"
+msgstr ""
+
+#: ../raster/r.statistics/o_average.c:33 ../raster/r.statistics/o_distrib.c:31
+#: ../raster/r.statistics/o_sum.c:35
+#, c-format
+msgid "%s: running %s command"
+msgstr ""
+
+#: ../raster/r.statistics/o_average.c:41 ../raster/r.statistics/o_distrib.c:39
+#: ../raster/r.statistics/o_sum.c:43 ../raster/r.average/main.c:102
+#, c-format
+msgid "%s: unable to open temporary file"
+msgstr ""
+
+#: ../raster/r.statistics/o_kurt.c:96
+msgid "o_kurto: No data in array"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:44
+msgid "Calculates category or object oriented statistics."
+msgstr "Calculează categorii sau statistici orientate obiect."
+
+#: ../raster/r.statistics/main.c:62
+msgid "Method of object-based statistic"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:67
+msgid "Resultant raster map (not used with 'distribution')"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:73 ../raster/r.average/main.c:66
+msgid "Cover values extracted from the category labels of the cover map"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:82 ../raster/r.statistics/main.c:88
+msgid "This module currently only works for integer (CELL) maps"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:100 ../raster/r.proj/main.c:210
+#: ../raster/r.neighbors/main.c:226 ../raster/r.proj.seg/main.c:238
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:149
+#: ../imagery/i.rectify/main.c:156 ../vector/v.vect.stats/main.c:276
+#, c-format
+msgid "<%s=%s> unknown %s"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:110
+#, c-format
+msgid "Output map <%s> ignored"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:177
+msgid "Not yet implemented!"
+msgstr ""
+
+#: ../raster/r.statistics/main.c:187
+#, c-format
+msgid "An output raster map needs to be defined with method '%s'"
+msgstr ""
+
+#: ../raster/r.statistics/o_var.c:100 ../raster/r.statistics/o_sdev.c:100
+msgid "o_var: No data in array"
+msgstr ""
+
+#: ../raster/r.statistics/o_adev.c:97
+msgid "o_adev: No data in array"
+msgstr ""
+
+#: ../raster/r.statistics/read_stats.c:20 ../raster/r.median/read_stats.c:14
+msgid "Reading r.stats output"
+msgstr ""
+
+#: ../raster/r.drain/main.c:110
+msgid "Traces a flow through an elevation model on a raster map."
+msgstr "Trasează un curs de apă printr-un model de elevație pe harta raster."
+
+#: ../raster/r.drain/main.c:120
+msgid "Name of movement direction map associated with the cost surface"
+msgstr ""
+
+#: ../raster/r.drain/main.c:131
+msgid "Output drain vector map (recommended for cost surface made using knight's move)"
+msgstr ""
+
+#: ../raster/r.drain/main.c:139
+msgid "Map coordinates of starting point(s) (E,N)"
+msgstr ""
+
+#: ../raster/r.drain/main.c:145
+msgid "Name of vector map(s) containing starting point(s)"
+msgstr ""
+
+#: ../raster/r.drain/main.c:150
+msgid "Copy input cell values on output"
+msgstr ""
+
+#: ../raster/r.drain/main.c:154
+msgid "Accumulate input values along the path"
+msgstr ""
+
+#: ../raster/r.drain/main.c:158
+msgid "Count cell numbers along the path"
+msgstr ""
+
+#: ../raster/r.drain/main.c:163
+msgid "The input surface is a cost surface (if checked, a direction surface must also be specified"
+msgstr ""
+
+#: ../raster/r.drain/main.c:175
+msgid "Directional drain selected... checking for direction raster"
+msgstr ""
+
+#: ../raster/r.drain/main.c:178
+msgid "Surface/Hydrology drain selected"
+msgstr ""
+
+#: ../raster/r.drain/main.c:184
+msgid "Direction raster not specified, if direction flag is on, a direction raster must be given"
+msgstr ""
+
+#: ../raster/r.drain/main.c:191
+#, c-format
+msgid "Direction raster found <%s>"
+msgstr ""
+
+#: ../raster/r.drain/main.c:198
+#, c-format
+msgid "Direction map <%s> should not be specified for Surface/Hydrology drains"
+msgstr ""
+
+#: ../raster/r.drain/main.c:204
+msgid "Outputting a vector path"
+msgstr ""
+
+#: ../raster/r.drain/main.c:209 ../raster/r.flow/io.c:176
+#: ../doc/vector/v.example/main.c:96 ../vector/v.in.dxf/main.c:168
+#: ../vector/v.net.connectivity/main.c:121 ../vector/v.delaunay2/main.c:126
+#: ../vector/v.net.bridge/main.c:86 ../vector/v.net.distance/main.c:146
+#: ../vector/v.buffer2/main.c:320 ../vector/v.net.path/main.c:139
+#: ../vector/v.voronoi/vo_main.c:165 ../vector/v.voronoi/dt_main.c:92
+#: ../vector/v.voronoi/dt_main.c:98 ../vector/v.net.allpairs/main.c:116
+#: ../vector/v.drape/main.c:339 ../vector/v.drape/main.c:380
+#: ../vector/v.mkgrid/main.c:223 ../vector/v.hull/main.c:334
+#: ../vector/v.net.visibility/main.c:87 ../vector/v.to.3d/main.c:88
+#: ../vector/v.net.flow/main.c:138 ../vector/v.net.flow/main.c:144
+#: ../vector/v.edit/main.c:106 ../vector/v.net.spanningtree/main.c:87
+#: ../vector/lidar/v.surf.bspline/main.c:293
+#: ../vector/lidar/v.lidar.edgedetection/main.c:245
+#: ../vector/lidar/v.lidar.correction/main.c:209
+#: ../vector/lidar/v.lidar.correction/main.c:215
+#: ../vector/lidar/v.outlier/main.c:205 ../vector/lidar/v.outlier/main.c:210
+#: ../vector/lidar/v.outlier/main.c:216 ../vector/v.net.timetable/main.c:323
+#: ../vector/v.net.components/main.c:114 ../vector/v.net.centrality/main.c:194
+#: ../vector/v.generalize/main.c:302
+#, c-format
+msgid "Unable to create vector map <%s>"
+msgstr ""
+
+#: ../raster/r.drain/main.c:227
+msgid "Specify just one of the -c, -a and -n flags"
+msgstr ""
+
+#: ../raster/r.drain/main.c:250
+msgid "Metrics allocation"
+msgstr ""
+
+#: ../raster/r.drain/main.c:261
+#, c-format
+msgid "Starting point %d is outside the current region"
+msgstr ""
+
+#: ../raster/r.drain/main.c:269 ../raster/r.drain/main.c:310
+msgid "Too many start points"
+msgstr ""
+
+#: ../raster/r.drain/main.c:316
+#, c-format
+msgid "Starting vector map <%s> contains no points in the current region"
+msgstr ""
+
+#: ../raster/r.drain/main.c:322
+msgid "No start/stop point(s) specified"
+msgstr ""
+
+#: ../raster/r.drain/main.c:397
+msgid "Calculating flow directions..."
+msgstr ""
+
+#: ../raster/r.drain/main.c:684
+#, c-format
+msgid "direction read: %lf, neighbour found: %i"
+msgstr ""
+
+#: ../raster/r.info/main.c:71
+msgid "Output basic information about a raster map layer."
+msgstr "Afișează informații de bază despre harta raster."
+
+#: ../raster/r.info/main.c:77 ../raster3d/base/r3.info.main.c:91
+msgid "Print range only"
+msgstr ""
+
+#: ../raster/r.info/main.c:82
+msgid "Print raster map resolution (NS-res, EW-res) only"
+msgstr ""
+
+#: ../raster/r.info/main.c:86
+msgid "Print raster map type only"
+msgstr ""
+
+#: ../raster/r.info/main.c:90 ../vector/v.info/main.c:85
+msgid "Print map region only"
+msgstr ""
+
+#: ../raster/r.info/main.c:94
+msgid "Print raster history instead of info"
+msgstr ""
+
+#: ../raster/r.info/main.c:98
+msgid "Print raster map data units only"
+msgstr ""
+
+#: ../raster/r.info/main.c:102
+msgid "Print raster map vertical datum only"
+msgstr ""
+
+#: ../raster/r.info/main.c:106 ../vector/v.info/main.c:90
+msgid "Print map title only"
+msgstr ""
+
+#: ../raster/r.info/main.c:111
+msgid "Print raster map timestamp (day.month.year hour:minute:seconds) only"
+msgstr ""
+
+#: ../raster/r.info/main.c:142
+msgid "Unable to read range file"
+msgstr ""
+
+#: ../raster/r.info/main.c:307 ../raster/r.info/main.c:433
+#: ../raster3d/base/r3.info.main.c:158 ../raster3d/base/r3.info.main.c:166
+#: ../raster3d/base/r3.info.main.c:172 ../raster3d/base/r3.info.main.c:177
+#: ../raster3d/base/r3.info.main.c:184 ../raster3d/base/r3.info.main.c:195
+#: ../raster3d/base/r3.info.main.c:201 ../raster3d/base/r3.info.main.c:217
+#: ../raster3d/base/r3.info.main.c:224 ../raster3d/base/r3.info.main.c:231
+#: ../raster3d/base/r3.info.main.c:236 ../raster3d/base/r3.info.main.c:241
+#: ../raster3d/base/r3.info.main.c:248 ../raster3d/base/r3.info.main.c:255
+#: ../raster3d/base/r3.info.main.c:265 ../raster3d/base/r3.info.main.c:275
+#: ../raster3d/base/r3.info.main.c:285 ../raster3d/base/r3.info.main.c:298
+#: ../raster3d/base/r3.info.main.c:308 ../raster3d/base/r3.info.main.c:313
+#: ../raster3d/base/r3.info.main.c:321 ../raster3d/base/r3.info.main.c:334
+msgid "Cannot allocate memory for string"
+msgstr ""
+
+#: ../raster/r.param.scale/process.c:73
+msgid "E-W and N-S grid resolutions are different. Taking average."
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:54
+msgid "raster, geomorphology"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:55
+msgid "Extracts terrain parameters from a DEM."
+msgstr "Extrage parametrii terenului dintr-un DEM."
+
+#: ../raster/r.param.scale/interface.c:56
+msgid "Uses a multi-scale approach by taking fitting quadratic parameters to any size window (via least squares)."
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:74
+msgid "Output raster layer containing morphometric parameter"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:78
+msgid "Slope tolerance that defines a 'flat' surface (degrees)"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:85
+msgid "Curvature tolerance that defines 'planar' surface"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:90
+#, c-format
+msgid "Size of processing window (odd number only, max: %i)"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:100
+msgid "Morphometric parameter in 'size' window to calculate"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:108
+msgid "Exponent for distance weighting (0.0-4.0)"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:120
+msgid "Constrain model through central window cell"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:163
+msgid "Morphometric parameter not recognised. Assuming 'Elevation'"
+msgstr ""
+
+#: ../raster/r.param.scale/interface.c:190
+msgid "Inappropriate window size (too big or even)"
+msgstr ""
+
+#: ../raster/r.param.scale/main.c:45
+msgid "Lat/Long location is not supported"
+msgstr ""
+
+#: ../raster/r.param.scale/write_cats.c:47
+#, c-format
+msgid "Cannot write category file for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.buffer/parse_dist.c:54
+#, c-format
+msgid "%s: %s - illegal distance specification"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:69
+msgid "raster, buffer"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:71
+msgid "Creates a raster map layer showing buffer zones surrounding cells that contain non-NULL category values."
+msgstr "Crează hartă raster care arată zonele tampon (buffer) în jurul celulelor care conțin valori ne-nule."
+
+#: ../raster/r.buffer/main.c:83
+msgid "Distance zone(s)"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:90
+msgid "Units of distance"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:96
+msgid "Ignore zero (0) data cells instead of NULL cells"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:149
+msgid "Parse distances error"
+msgstr ""
+
+#: ../raster/r.buffer/main.c:168
+#, c-format
+msgid "Pass %d (of %d)"
+msgstr ""
+
+#: ../raster/r.buffer/execute.c:34
+msgid "Finding buffer zones..."
+msgstr ""
+
+#: ../raster/r.buffer/read_map.c:53
+#, c-format
+msgid "Reading input raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.buffer/write_map.c:48
+#, c-format
+msgid "Writing output raster map <%s>..."
+msgstr ""
+
+#: ../raster/r.covar/main.c:55
+msgid "Outputs a covariance/correlation matrix for user-specified raster map layer(s)."
+msgstr "Crează matricea de covarianță/corelație pentru o hartă raster specificată de utilizator."
+
+#: ../raster/r.covar/main.c:62
+msgid "Print correlation matrix"
+msgstr ""
+
+#: ../raster/r.covar/main.c:104
+#, c-format
+msgid "%s: complete ... "
+msgstr ""
+
+#: ../raster/r.covar/main.c:129 ../imagery/i.pca/main.c:146
+msgid "No non-null values"
+msgstr ""
+
+#: ../raster/r.mfilter/main.c:52
+msgid "Performs raster map matrix filter."
+msgstr "Aplică un filtru de matrice hărții raster."
+
+#: ../raster/r.mfilter/main.c:63
+msgid "Path to filter file"
+msgstr ""
+
+#: ../raster/r.mfilter/main.c:72 ../raster/r.mfilter/main.c:96
+msgid "Filter"
+msgstr ""
+
+#: ../raster/r.mfilter/main.c:95
+msgid "Apply filter only to zero data values"
+msgstr ""
+
+#: ../raster/r.volume/main.c:57
+msgid "raster, volume"
+msgstr "raster, volum"
+
+#: ../raster/r.volume/main.c:59
+msgid "Calculates the volume of data \"clumps\", and (optionally) produces a GRASS vector points map containing the calculated centroids of these clumps."
+msgstr "Calculează volumul grupurilor de date și opțional produce hărți ale punctelor vectoriale GRASS care au calculat centroidul acestor grupuri."
+
+#: ../raster/r.volume/main.c:69
+msgid "Existing raster map representing data that will be summed within clumps"
+msgstr ""
+
+#: ../raster/r.volume/main.c:77
+msgid "Existing raster map, preferably the output of r.clump"
+msgstr ""
+
+#: ../raster/r.volume/main.c:84
+msgid "Vector points map to contain clump centroids"
+msgstr ""
+
+#: ../raster/r.volume/main.c:88
+msgid "Generate unformatted report"
+msgstr ""
+
+#: ../raster/r.volume/main.c:117
+msgid "No data map specified"
+msgstr ""
+
+#: ../raster/r.volume/main.c:128
+msgid "No clump map specified and MASK not set."
+msgstr ""
+
+#: ../raster/r.volume/main.c:133
+msgid "Unable to find data map"
+msgstr ""
+
+#: ../raster/r.volume/main.c:141
+msgid "Unable to find clump map"
+msgstr ""
+
+#: ../raster/r.volume/main.c:149
+msgid "Unable to open centroids vector points map"
+msgstr ""
+
+#: ../raster/r.volume/main.c:171
+msgid "Data or Clump file not open"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:79
+#, c-format
+msgid "RGB raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:86
+msgid "Cannot create RGB data, please provide three maps [r,g,b]"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:102
+#, c-format
+msgid "Vector cell map <%s> not found"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:109
+msgid "Cannot create vector data, please provide three maps [x,y,z]"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:149
+msgid "Converts raster maps into the VTK-Ascii format"
+msgstr "Convertește hărțile raster în format VTK-Ascii"
+
+#: ../raster/r.out.vtk/main.c:215 ../raster/r.out.vtk/main.c:280
+#: ../raster/r.out.vtk/main.c:307 ../raster/r.out.vtk/main.c:353
+#, c-format
+msgid "Open Raster file %s"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:324
+msgid "Writing VTK ImageData\n"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:334
+msgid "Wrong RGB maps. Maps should have the same type! RGB output not added!"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:371
+msgid "Writing VTK Vector Data\n"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:381
+msgid "Wrong vector maps. Maps should have the same type! Vector output not added!"
+msgstr ""
+
+#: ../raster/r.out.vtk/main.c:393
+msgid "Error closing VTK-ASCII file"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:74
+msgid "write_vtk_normal_header: Writing VTK-Header"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:107
+msgid "write_vtk_structured_elevation_header: Writing VTK-Header"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:123
+msgid "write_vtk_polygonal_elevation_header: Writing VTK-Header"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:138
+msgid "write_vtk_celldata_header: Writing VTK-DataHeader"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:147
+msgid "writeVTKPointHeader: Writing VTK-DataHeader"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:168
+msgid "write_vtk_structured_coordinates: Writing Coordinates"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:184 ../raster/r.out.vtk/writeascii.c:245
+#: ../raster/r.out.vtk/writeascii.c:357 ../raster/r.out.vtk/writeascii.c:404
+#: ../raster/r.out.vtk/writeascii.c:408 ../raster/r.out.vtk/writeascii.c:412
+#: ../raster/r.out.vtk/writeascii.c:471 ../raster/r.out.vtk/writeascii.c:475
+#: ../raster/r.out.vtk/writeascii.c:479
+#, c-format
+msgid "Unable to read row %i\n"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:227
+msgid "write_vtk_polygonal_coordinates: Writing VTK Polygonal data"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:339
+msgid "write_vtk_data: Writing VTK-Data"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:392
+msgid "write_vtk_rgb_image_data: Writing VTK-ImageData"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:429
+msgid "Wrong map values! Values should in between 0 and 255!\n"
+msgstr ""
+
+#: ../raster/r.out.vtk/writeascii.c:459
+msgid "write_vtk_vector_data: Writing VTK-vector data"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:38 ../raster3d/r3.out.vtk/parameters.c:34
+msgid "Name for VTK-ASCII output file"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:46
+msgid "Elevation raster map"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:52
+msgid "Value to represent no data cell"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:60
+msgid "Elevation (if no elevation map is specified)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:66
+msgid "Create VTK point data instead of VTK cell data (if no elevation map is given)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:76
+msgid "Three (r,g,b) raster maps to create rgb values [redmap,greenmap,bluemap]"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:86
+msgid "Three (x,y,z) raster maps to create vector values [xmap,ymap,zmap]"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:93 ../raster3d/r3.out.vtk/parameters.c:99
+#: ../vector/v.out.vtk/main.c:75
+msgid "Scale factor for elevation"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:105 ../raster/r.out.ascii/main.c:85
+#: ../display/d.rast.num/number.c:120 ../raster3d/r3.out.vtk/parameters.c:112
+#: ../vector/v.out.ascii/out.c:76 ../vector/v.out.vtk/main.c:69
+msgid "Number of significant digits (floating point only)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:111
+msgid "Use structured grid for elevation (not recommended)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:117
+msgid "Use polydata-trianglestrips for elevation grid creation"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:123
+msgid "Use polydata-vertices for elevation grid creation (to use with vtkDelauny2D)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:129
+msgid "Scale factor effects the origin (if no elevation map is given)"
+msgstr ""
+
+#: ../raster/r.out.vtk/parameters.c:135
+#: ../raster3d/r3.out.vtk/parameters.c:128 ../vector/v.out.vtk/main.c:88
+msgid "Correct the coordinates to fit the VTK-OpenGL precision"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:55
+msgid "The initial piezometric head in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:60
+msgid "Boundary condition status, 0-inactive, 1-active, 2-dirichlet"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:65
+msgid "X-part of the hydraulic conductivity tensor in [m/s]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:70
+msgid "Y-part of the hydraulic conductivity tensor in [m/s]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:75
+msgid "Water sources and sinks in [m^3/s]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:79
+msgid "Specific yield in [1/m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:84
+msgid "Recharge"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:86
+msgid "Recharge map e.g: 6*10^-9 per cell in [m^3/s*m^2]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:90
+msgid "Top surface of the aquifer in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:94
+msgid "Bottom surface of the aquifer in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:98
+msgid "The map storing the numerical result [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:104
+msgid ""
+"Calculate the groundwater filter velocity vector field [m/s]\n"
+"and write the x, and y components to maps named name_[xy]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:113
+msgid "The type of groundwater flow"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:120
+msgid "The height of the river bed in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:127
+msgid "Water level (head) of the river with leakage connection in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:134
+msgid "The leakage coefficient of the river bed in [1/s]."
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:140
+msgid "The height of the drainage bed in [m]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:147
+msgid "The leakage coefficient of the drainage bed in [1/s]"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:159
+msgid "Use a sparse matrix, only available with iterative solvers"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:191
+msgid "Numerical calculation program for transient, confined and unconfined groundwater flow in two dimensions."
+msgstr "Program de calcul numeric pentru tranzitarea, nelimitată și neînchisă a apelor subterane în două dimensiuni."
+
+#: ../raster/r.gwflow/main.c:201 ../raster/r.topidx/main.c:53
+#, c-format
+msgid "Lat/Long location is not supported by %s. Please reproject map first."
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:216
+msgid "Please provide river_head, river_leak and river_bed maps"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:228
+msgid "Please provide drain_head and drain_leak maps"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:240 ../raster3d/r3.gwflow/main.c:189
+msgid "The direct LU solver do not work with sparse matrices"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:242 ../raster3d/r3.gwflow/main.c:191
+msgid "The direct Gauss solver do not work with sparse matrices"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:244
+msgid "The direct cholesky solver do not work with sparse matrices"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:350 ../raster/r.to.rast3/main.c:236
+#: ../raster/r.li/r.li.daemon/list.c:49 ../raster3d/r3.to.rast/main.c:299
+#: ../imagery/i.ask/popup.c:174 ../imagery/i.smap/bouman/multialloc.c:115
+#: ../vector/v.net.connectivity/main.c:165
+#: ../vector/v.net.connectivity/main.c:181 ../vector/v.in.ascii/a2b.c:172
+#: ../vector/v.surf.rst/main.c:887 ../vector/v.net.distance/main.c:168
+#: ../vector/v.mapcalc/list.c:54 ../vector/v.mapcalc/list.c:501
+#: ../vector/v.net.allpairs/main.c:174 ../vector/v.mkgrid/write_grid.c:131
+#: ../vector/v.net.flow/main.c:214 ../vector/v.edit/a2b.c:198
+#: ../vector/v.net.timetable/main.c:353 ../vector/v.net.timetable/main.c:363
+#: ../vector/v.net.components/main.c:127 ../vector/v.net.centrality/main.c:265
+#: ../vector/v.net.centrality/main.c:270 ../vector/v.net.centrality/main.c:276
+#: ../vector/v.net.centrality/main.c:282 ../vector/v.net.centrality/main.c:288
+#: ../vector/v.generalize/smoothing.c:95
+#: ../vector/v.generalize/smoothing.c:152
+#: ../vector/v.generalize/smoothing.c:253
+#: ../vector/v.generalize/smoothing.c:377
+#: ../vector/v.generalize/smoothing.c:406
+#: ../vector/v.generalize/smoothing.c:410
+#: ../vector/v.generalize/smoothing.c:414
+#: ../vector/v.generalize/smoothing.c:418
+#: ../vector/v.generalize/smoothing.c:422
+#: ../vector/v.generalize/smoothing.c:426
+#: ../vector/v.generalize/smoothing.c:430 ../vector/v.generalize/matrix.c:145
+#: ../vector/v.generalize/simplification.c:33
+#: ../vector/v.generalize/simplification.c:40
+#: ../vector/v.generalize/simplification.c:309
+#: ../vector/v.generalize/simplification.c:317
+#: ../vector/v.generalize/simplification.c:341
+#: ../vector/v.generalize/network.c:94 ../vector/v.generalize/network.c:129
+#: ../vector/v.generalize/point.c:121
+msgid "Out of memory"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:360
+#, c-format
+msgid "Calculation of unconfined groundwater flow loop %i\n"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:383
+#, c-format
+msgid "Maximum difference between this and last increment: %g"
+msgstr ""
+
+#: ../raster/r.gwflow/main.c:529 ../raster3d/r3.gwflow/main.c:294
+msgid "Unable to create and solve the linear equation system"
+msgstr ""
+
+#: ../raster/r.quant/read_rules.c:49
+msgid "Old data range is empty"
+msgstr ""
+
+#: ../raster/r.quant/read_rules.c:55
+#, c-format
+msgid "Old data range is %s to %s"
+msgstr ""
+
+#: ../raster/r.quant/read_rules.c:58
+msgid "Old integer data range is empty"
+msgstr ""
+
+#: ../raster/r.quant/read_rules.c:60
+#, c-format
+msgid "Old integer data range is %d to %d"
+msgstr ""
+
+#: ../raster/r.quant/main.c:41
+msgid "raster, quantization"
+msgstr "raster, cuantificare"
+
+#: ../raster/r.quant/main.c:43
+msgid "Produces the quantization file for a floating-point map."
+msgstr "Produce fișier de cuantificare pentru ă o hartă cu numere reale."
+
+#: ../raster/r.quant/main.c:51
+msgid "Base map to take quant rules from"
+msgstr ""
+
+#: ../raster/r.quant/main.c:59
+msgid "Raster map(s) to be quantized"
+msgstr ""
+
+#: ../raster/r.quant/main.c:64
+msgid "Floating point range: dmin,dmax"
+msgstr ""
+
+#: ../raster/r.quant/main.c:72
+msgid "Integer range: min,max"
+msgstr ""
+
+#: ../raster/r.quant/main.c:79
+msgid "Truncate floating point data"
+msgstr ""
+
+#: ../raster/r.quant/main.c:83
+msgid "Round floating point data"
+msgstr ""
+
+#: ../raster/r.quant/main.c:111
+msgid "Truncating..."
+msgstr ""
+
+#: ../raster/r.quant/main.c:116
+msgid "Rounding..."
+msgstr ""
+
+#: ../raster/r.quant/main.c:144
+#, c-format
+msgid "Setting quant rules for input map(s) to (%f %f) -> (%d,%d)"
+msgstr ""
+
+#: ../raster/r.quant/main.c:154
+msgid "No rules specified. Quant table(s) not changed."
+msgstr ""
+
+#: ../raster/r.quant/main.c:164
+#, c-format
+msgid "Quant table not changed for %s"
+msgstr ""
+
+#: ../raster/r.quant/main.c:166
+#, c-format
+msgid "New quant table created for %s"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:111
+msgid "raster, sediment flow, erosion, deposition"
+msgstr "raster, debitul sedimentelor, eroziune, depozitare"
+
+#: ../raster/simwe/r.sim.sediment/main.c:113
+msgid "Sediment transport and erosion/deposition simulation using path sampling method (SIMWE)."
+msgstr "Simularea transportului de sedimente și eroziune/depozitare folosind metoda (SIMWE)."
+
+#: ../raster/simwe/r.sim.sediment/main.c:118
+#: ../raster/simwe/r.sim.water/main.c:125
+msgid "Name of the elevation raster map [m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:123
+msgid "Name of the water depth raster map [m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:128
+#: ../raster/simwe/r.sim.water/main.c:130
+msgid "Name of the x-derivatives raster map [m/m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:133
+#: ../raster/simwe/r.sim.water/main.c:135
+msgid "Name of the y-derivatives raster map [m/m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:139
+msgid "Name of the detachment capacity coefficient raster map [s/m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:145
+msgid "Name of the transport capacity coefficient raster map [s]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:151
+msgid "Name of the critical shear stress raster map [Pa]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:157
+#: ../raster/simwe/r.sim.water/main.c:173
+msgid "Name of the Mannings n raster map"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:165
+msgid "Name of the Mannings n value"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:180
+msgid "Output transport capacity raster map [kg/ms]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:181
+#: ../raster/simwe/r.sim.sediment/main.c:188
+#: ../raster/simwe/r.sim.sediment/main.c:195
+#: ../raster/simwe/r.sim.sediment/main.c:201
+#: ../raster/simwe/r.sim.sediment/main.c:208
+#: ../raster/simwe/r.sim.water/main.c:204
+#: ../raster/simwe/r.sim.water/main.c:210
+#: ../raster/simwe/r.sim.water/main.c:216
+msgid "Output"
+msgstr "Rezultat"
+
+#: ../raster/simwe/r.sim.sediment/main.c:187
+msgid "Output transp.limited erosion-deposition raster map [kg/m2s]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:194
+msgid "Output sediment concentration raster map [particle/m3]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:200
+msgid "Output sediment flux raster map [kg/ms]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:207
+msgid "Output erosion-deposition raster map [kg/m2s]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:214
+msgid "Number of walkers"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:215
+#: ../raster/simwe/r.sim.sediment/main.c:223
+#: ../raster/simwe/r.sim.sediment/main.c:232
+#: ../raster/simwe/r.sim.sediment/main.c:250
+#: ../raster/simwe/r.sim.water/main.c:233
+#: ../raster/simwe/r.sim.water/main.c:241
+#: ../raster/simwe/r.sim.water/main.c:250
+#: ../raster/simwe/r.sim.water/main.c:268
+#: ../raster/simwe/r.sim.water/main.c:277
+#: ../raster/simwe/r.sim.water/main.c:285
+#: ../raster/simwe/r.sim.water/main.c:294 ../vector/v.surf.rst/main.c:199
+#: ../vector/v.surf.rst/main.c:204 ../vector/v.surf.rst/main.c:293
+#: ../vector/v.surf.rst/main.c:301 ../vector/v.surf.rst/main.c:309
+#: ../vector/v.surf.rst/main.c:316 ../vector/v.surf.rst/main.c:324
+#: ../vector/v.surf.rst/main.c:332 ../vector/v.surf.rst/main.c:341
+#: ../vector/v.surf.rst/main.c:350 ../vector/v.surf.rst/main.c:359
+#: ../vector/v.surf.rst/main.c:368 ../vector/v.surf.rst/main.c:376
+#: ../vector/v.surf.rst/main.c:383
+msgid "Parameters"
+msgstr "Parametrii"
+
+#: ../raster/simwe/r.sim.sediment/main.c:222
+#: ../raster/simwe/r.sim.water/main.c:240
+msgid "Time used for iterations [minutes]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:231
+#: ../raster/simwe/r.sim.water/main.c:249
+msgid "Time interval for creating output maps [minutes]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:249
+#: ../raster/simwe/r.sim.water/main.c:267
+msgid "Water diffusion constant"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:331
+#: ../raster/simwe/r.sim.water/main.c:444
+msgid "More than 100 files are going to be created !!!!!"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:337
+#: ../raster/simwe/r.sim.water/main.c:450
+#, c-format
+msgid "default nwalk=%d, rwalk=%f"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:346
+#: ../raster/simwe/r.sim.water/main.c:460
+#, c-format
+msgid "Using metric conversion factor %f, step=%f"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:355
+msgid "You are not outputting any raster or site files"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:358
+#: ../raster/simwe/r.sim.water/main.c:480 ../vector/v.surf.rst/main.c:717
+#: ../vector/v.surf.rst/main.c:769
+msgid "Input failed"
+msgstr ""
+
+#: ../raster/simwe/r.sim.sediment/main.c:417
+#: ../raster/simwe/r.sim.water/main.c:527
+msgid "Cannot write raster maps"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:118
+msgid "raster, flow, hydrology"
+msgstr "raster, debit, hidrologie"
+
+#: ../raster/simwe/r.sim.water/main.c:120
+msgid "Overland flow hydrologic simulation using path sampling method (SIMWE)."
+msgstr "Simularea inundației prin metoda (SIMWE)."
+
+#: ../raster/simwe/r.sim.water/main.c:142
+msgid "Name of the rainfall excess rate (rain-infilt) raster map [mm/hr]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:151
+msgid "Rainfall excess rate unique value [mm/hr]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:158
+msgid "Name of the runoff infiltration rate raster map [mm/hr]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:167
+msgid "Runoff infiltration rate unique value [mm/hr]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:181
+msgid "Mannings n unique value"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:188
+msgid "Name of the flow controls raster map (permeability ratio 0-1)"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:203
+msgid "Output water depth raster map [m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:209
+msgid "Output water discharge raster map [m3/s]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:215
+msgid "Output simulation error raster map [m]"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:232
+msgid "Number of walkers, default is twice the no. of cells"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:276
+msgid "Threshold water depth [m] (diffusion increases after this water depth is reached)"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:284
+msgid "Diffusion increase constant"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:293
+msgid "Weighting factor for water flow velocity vector"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:298
+msgid "Time-series output"
+msgstr ""
+
+#: ../raster/simwe/r.sim.water/main.c:477
+msgid "You are not outputting any raster maps"
+msgstr ""
+
+#: ../raster/simwe/simlib/hydro.c:211
+#, c-format
+msgid "nwalk (%d) > maxw (%d)!"
+msgstr ""
+
+#: ../raster/simwe/simlib/hydro.c:431
+msgid "Unable to write raster maps"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:409
+#, c-format
+msgid "Raster map <%s> not found, and manin_val undefined, choose one to be allowed to process"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:541
+msgid "Zero value in Mannings n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:592
+msgid "Infiltration exceeds the rainfall rate everywhere! No overland flow."
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:616
+#, c-format
+msgid ""
+"Min elevation \t= %.2f m\n"
+"Max elevation \t= %.2f m\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:618
+#, c-format
+msgid "Mean Source Rate (rainf. excess or sediment) \t= %f m/s or kg/m2s \n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:620
+#, c-format
+msgid "Mean flow velocity \t= %f m/s\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:621
+#, c-format
+msgid "Mean Mannings \t= %f\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:625
+#, c-format
+msgid "Number of iterations \t= %d cells\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:626
+#, c-format
+msgid "Time step \t= %.2f s\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:628
+#, c-format
+msgid ""
+"Sigmax \t= %f\n"
+"Max velocity \t= %f m/s\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:630
+#, c-format
+msgid "Time step used \t= %.2f s\n"
+msgstr ""
+
+#: ../raster/simwe/simlib/input.c:682
+msgid "Unable to write et file"
+msgstr ""
+
+#: ../raster/r.region/main.c:56
+msgid "Sets the boundary definitions for a raster map."
+msgstr "Stabilește definițiile limită pentru o hartă raster."
+
+#: ../raster/r.region/main.c:66
+msgid "Set from current region"
+msgstr ""
+
+#: ../raster/r.region/main.c:70 ../general/g.region/main.c:80
+msgid "Set from default region"
+msgstr ""
+
+#: ../raster/r.region/main.c:81
+msgid "Raster map to change"
+msgstr ""
+
+#: ../raster/r.region/main.c:89
+msgid "Set region from named region"
+msgstr ""
+
+#: ../raster/r.region/main.c:96 ../general/g.region/main.c:181
+msgid "Set region to match this raster map"
+msgstr ""
+
+#: ../raster/r.region/main.c:102 ../general/g.region/main.c:197
+msgid "Set region to match this vector map"
+msgstr ""
+
+#: ../raster/r.region/main.c:110 ../general/g.region/main.c:206
+msgid "Set region to match this 3dview file"
+msgstr ""
+
+#: ../raster/r.region/main.c:120 ../general/g.region/main.c:216
+msgid "Value for the northern edge"
+msgstr ""
+
+#: ../raster/r.region/main.c:130 ../general/g.region/main.c:226
+msgid "Value for the southern edge"
+msgstr ""
+
+#: ../raster/r.region/main.c:140 ../general/g.region/main.c:236
+msgid "Value for the eastern edge"
+msgstr ""
+
+#: ../raster/r.region/main.c:150 ../general/g.region/main.c:246
+msgid "Value for the western edge"
+msgstr ""
+
+#: ../raster/r.region/main.c:157
+msgid "Raster map to align to"
+msgstr "Strat raster în funcție de care se reglează regiunea"
+
+#: ../raster/r.region/main.c:168 ../raster/r.region/main.c:227
+#: ../raster/r.region/main.c:350 ../general/g.region/main.c:482
+#: ../general/g.region/main.c:833 ../display/d.title/main.c:108
+#, c-format
+msgid "Unable to read header of raster map <%s@%s>"
+msgstr "Imposibil de citit antetul hărții raster <%s@%s>"
+
+#: ../raster/r.region/main.c:182 ../general/g.region/main.c:423
+#, c-format
+msgid "Region <%s> not found"
+msgstr "Regiunea <%s> nu a fost găsită"
+
+#: ../raster/r.region/main.c:184 ../general/g.region/main.c:425
+#, c-format
+msgid "Unable to read region <%s> in <%s>"
+msgstr "Imposibil de citit regiunea <%s> din <%s>"
+
+#: ../raster/r.region/main.c:195 ../general/g.region/main.c:437
+#, c-format
+msgid "3dview file <%s> not found"
+msgstr "fișierul de vizualizare 3D <%s> nu a fost găsit"
+
+#: ../raster/r.region/main.c:201 ../general/g.region/main.c:442
+#, c-format
+msgid "Unable to open 3dview file <%s> in <%s>"
+msgstr "Imposibil de deschis fișierul de vizualizare 3D <%s> din <%s>"
+
+#: ../raster/r.region/main.c:206 ../general/g.region/main.c:448
+#, c-format
+msgid "Unable to read 3dview file <%s> in <%s>"
+msgstr "Imposibil de citit fișierul de vizualizare 3D <%s> din <%s>"
+
+#: ../raster/r.region/main.c:209 ../general/g.region/main.c:451
+#, c-format
+msgid "Old 3dview file. Region <%s> not found in <%s>"
+msgstr "Fișier de vizualizare 3D vechi. Regiunea <%s> nu a fost găsită în <%s>"
+
+#: ../raster/r.region/main.c:241
+#, c-format
+msgid "Unable to open vector map <%s> in <%s>"
+msgstr "Imposibil de deschis harta vectorială <%s> din <%s>"
+
+#: ../raster/r.region/main.c:360 ../general/g.region/adjust.c:11
+#, c-format
+msgid "Invalid region: %s"
+msgstr "Regiune nevalidă: %s"
+
+#: ../raster/r.region/main.c:368
+msgid "Unable to update boundaries"
+msgstr "Imposibil de actualizat limitele"
+
+#: ../raster/r.timestamp/main.c:35
+msgid "raster, metadata, timestamp"
+msgstr "raster, metadate, timestamp"
+
+#: ../raster/r.timestamp/main.c:36
+msgid "Modifies a timestamp for a raster map."
+msgstr "Modifică timestamp pentru o hartă raster."
+
+#: ../raster/r.timestamp/main.c:37
+msgid "Print/add/remove a timestamp for a raster map."
+msgstr "Printează/adaugă/elimină timestamp pentru o hartă raster."
+
+#: ../raster/r.timestamp/main.c:46
+msgid "Datetime, datetime1/datetime2, or 'none' to remove"
+msgstr ""
+
+#: ../raster/r.timestamp/main.c:47
+msgid "Format: '15 jan 1994' (absolute) or '2 years' (relative)"
+msgstr "Format: '15 ian 1994' (absolut) sau '2 ani' (relativ)"
+
+#: ../raster/r.timestamp/main.c:82
+msgid "Invalid timestamp"
+msgstr "Timestamp nevalid"
+
+#: ../raster/r.mapcalc/map.c:83 ../raster/r.mapcalc/map3.c:177
+#, c-format
+msgid "Unable to read color file for raster map <%s@%s>"
+msgstr "Imposibil de citit fișierul de culoare pentru harta raster <%s@%s>"
+
+#: ../raster/r.mapcalc/map.c:96 ../raster/r.mapcalc/map3.c:190
+#, c-format
+msgid "Unable to create btree for raster map <%s@%s>"
+msgstr "Imposibil de creat arbore pentru harta raster <%s@%s>"
+
+#: ../raster/r.mapcalc/map.c:141 ../raster/r.mapcalc/map.c:353
+#: ../raster/r.mapcalc/map.c:394 ../raster/r.mapcalc/map.c:484
+#: ../raster/r.mapcalc/map3.c:235 ../raster/r.mapcalc/map3.c:417
+#: ../raster/r.mapcalc/map3.c:461 ../raster/r.mapcalc/map3.c:552
+#: ../raster/r.mapcalc/expression.c:356
+#, c-format
+msgid "Invalid map modifier: '%c'"
+msgstr "Modificare hartă nevalidă: '%c'"
+
+#: ../raster/r.mapcalc/map.c:234 ../raster/r.surf.idw/main.c:690
+#: ../raster/r.proj/readcell.c:27 ../raster/r.out.png/r.out.png.c:321
+#: ../imagery/i.cluster/main.c:290 ../imagery/i.maxlik/main.c:117
+#: ../imagery/i.smap/bouman/read_block.c:16
+#: ../imagery/i.gensigset/read_data.c:27
+#: ../imagery/i.gensigset/read_train.c:10 ../imagery/i.gensig/covariance.c:34
+#: ../imagery/i.gensig/read_train.c:10
+#, c-format
+msgid "Unable to read raster map row %d"
+msgstr "Imposibil de citit rândul hărții raster %d"
+
+#: ../raster/r.mapcalc/map.c:249
+#, fuzzy
+msgid "Rowio_setup failed"
+msgstr "Configurarea rândului a eșuat"
+
+#: ../raster/r.mapcalc/map.c:280 ../raster/r.mapcalc/map3.c:348
+#: ../raster/r.mapcalc/evaluate.c:91 ../raster/r.mapcalc/evaluate.c:206
+#, c-format
+msgid "Unknown type: %d"
+msgstr "Tip necunoscut: %d"
+
+#: ../raster/r.mapcalc/map.c:292
+#, fuzzy
+msgid "Rowio_get failed"
+msgstr "Obținerea rândului a eșuat"
+
+#: ../raster/r.mapcalc/map.c:309 ../raster/r.mapcalc/map3.c:367
+#, c-format
+msgid "Unable to close raster map <%s@%s>"
+msgstr "Imposibil de închis harta raster <%s@%s>"
+
+#: ../raster/r.mapcalc/map.c:442 ../imagery/i.topo.corr/main.c:38
+#, c-format
+msgid "Unable to open raster map <%s@%s>"
+msgstr "Imposibil de deschis harta raster <%s@%s>"
+
+#: ../raster/r.mapcalc/map.c:515
+msgid "Failed writing raster map row"
+msgstr "Scrierea rândului hărții raster a eșuat"
+
+#: ../raster/r.mapcalc/map.c:521 ../raster3d/base/r3.null.main.c:188
+msgid "Unable to close raster map"
+msgstr "Imposibil de închis harta raster"
+
+#: ../raster/r.mapcalc/map3.c:124 ../raster/r.mapcalc/map3.c:138
+#: ../raster/r.mapcalc/map3.c:152 ../raster/r.out.bin/main.c:53
+#: ../raster/r.out.bin/main.c:62 ../raster/r.out.bin/main.c:461
+msgid "Error writing data"
+msgstr "Eroare în scrierea datelor"
+
+#: ../raster/r.mapcalc/map3.c:605
+msgid "Unable to close output raster map"
+msgstr "Imposibil de închis harta raster de ieșire"
+
+#: ../raster/r.mapcalc/expression.c:204
+#, c-format
+msgid "Undefined variable '%s'"
+msgstr "Variabilă nedefinită '%s'"
+
+#: ../raster/r.mapcalc/expression.c:219
+#, c-format
+msgid "Invalid map <%s>"
+msgstr "Hartă nevalidă <%s>"
+
+#: ../raster/r.mapcalc/expression.c:261
+#, c-format
+msgid "Undefined function '%s'"
+msgstr "Funcție nedefinită '%s'"
+
+#: ../raster/r.mapcalc/expression.c:266
+#, c-format
+msgid "Too few arguments (%d) to function %s()"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:270
+#, c-format
+msgid "Too many arguments (%d) to function %s()"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:274
+#, c-format
+msgid "Incorrect argument types to function %s()"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:277
+#, c-format
+msgid "Internal error for function %s()"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:452
+#, c-format
+msgid "Illegal number of arguments (%d) for operator '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/expression.c:492
+#, c-format
+msgid "Format_expression_prec: unknown type: %d"
+msgstr ""
+
+#: ../raster/r.mapcalc/main.c:112
+msgid ""
+"r.mapcalc - Raster map layer data calculator\n"
+"\n"
+"usage: r.mapcalc '<map>=<expression>'\n"
+"\n"
+"r.mapcalc performs arithmetic on raster map layers.\n"
+"\n"
+"New raster map layers can be created which are arithmetic expressions\n"
+"involving existing raster map layers, integer or floating point constants,\n"
+"and functions.\n"
+" \n"
+"For more information use 'g.manual r.mapcalc'\n"
+msgstr ""
+
+#: ../raster/r.mapcalc/main.c:142
+msgid "Floating point error(s) occured in the calculation"
+msgstr ""
+
+#: ../raster/r.mapcalc/main.c:147
+msgid "Overflow occured in the calculation"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:120
+#, c-format
+msgid "Invalid type: %d"
+msgstr "Tip nevalid: %d"
+
+#: ../raster/r.mapcalc/evaluate.c:151
+#, c-format
+msgid "Too few arguments for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:155
+#, c-format
+msgid "Too many arguments for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:159
+#, c-format
+msgid "Invalid argument type for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:163
+#, c-format
+msgid "Invalid return type for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:167
+#, c-format
+msgid "Unknown type for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:170
+#, c-format
+msgid "Number of arguments for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/evaluate.c:174
+#, c-format
+msgid "Unknown error for function '%s'"
+msgstr ""
+
+#: ../raster/r.mapcalc/function.c:93
+#, c-format
+msgid "Known functions:"
+msgstr "Funcție cunoscută:"
+
+#: ../raster/r.sun2/main.c:227 ../raster/r.sun/main.c:173
+msgid "raster, sun energy"
+msgstr "raster, energia soarelui"
+
+#: ../raster/r.sun2/main.c:228 ../raster/r.sun/main.c:174
+msgid "Solar irradiance and irradiation model."
+msgstr "Iradierea solară și modelul iradierii."
+
+#: ../raster/r.sun2/main.c:230 ../raster/r.sun/main.c:176
+msgid "Computes direct (beam), diffuse and reflected solar irradiation raster maps for given day, latitude, surface and atmospheric conditions. Solar parameters (e.g. sunrise, sunset times, declination, extraterrestrial irradiance, daylight length) are saved in the map history file. Alternatively, a local time can be specified to compute solar incidence angle and/or irradiance raster maps. The shadowing effect of the topography is optionally incorporated."
+msgstr ""
+
+#: ../raster/r.sun2/main.c:244 ../raster/r.horizon/main.c:225
+#: ../raster/r.sun/main.c:206
+msgid "Name of the input elevation raster map [meters]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:253 ../raster/r.sun/main.c:215
+msgid "Name of the input aspect map (terrain aspect or azimuth of the solar panel) [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:262
+msgid "A single value of the orientation (aspect), 270 is south"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:271 ../raster/r.sun/main.c:225
+msgid "Name of the input slope raster map (terrain slope or solar panel inclination) [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:279
+msgid "A single value of inclination (slope)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:288 ../raster/r.sun/main.c:234
+msgid "Name of the Linke atmospheric turbidity coefficient input raster map [-]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:298 ../raster/r.sun/main.c:245
+msgid "A single value of the Linke atmospheric turbidity coefficient [-]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:308 ../raster/r.sun/main.c:254
+msgid "Name of the ground albedo coefficient input raster map [-]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:318 ../raster/r.sun/main.c:265
+msgid "A single value of the ground albedo coefficient [-]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:328
+msgid "Name of input raster map containing latitudes [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:337
+msgid "Name of input raster map containing longitudes [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:346
+msgid "Name of real-sky beam radiation coefficient (thick cloud) input raster map [0-1]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:355
+msgid "Name of real-sky diffuse radiation coefficient (haze) input raster map [0-1]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:363
+msgid "The horizon information input map prefix"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:371 ../raster/r.horizon/main.c:242
+msgid "Angle step size for multidirectional horizon [degrees]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:380 ../raster/r.sun/main.c:311
+msgid "Output incidence angle raster map (mode 1 only)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:389 ../raster/r.sun/main.c:320
+msgid "Output beam irradiance [W.m-2] (mode 1) or irradiation raster map [Wh.m-2.day-1] (mode 2)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:398 ../raster/r.sun/main.c:329
+msgid "Output insolation time raster map [h] (mode 2 only)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:407 ../raster/r.sun/main.c:338
+msgid "Output diffuse irradiance [W.m-2] (mode 1) or irradiation raster map [Wh.m-2.day-1] (mode 2)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:416 ../raster/r.sun/main.c:347
+msgid "Output ground reflected irradiance [W.m-2] (mode 1) or irradiation raster map [Wh.m-2.day-1] (mode 2)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:425
+msgid "Output global (total) irradiance/irradiation [W.m-2] (mode 1) or irradiance/irradiation raster map [Wh.m-2.day-1] (mode 2)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:432 ../raster/r.sun/main.c:354
+msgid "No. of day of the year (1-365)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:441 ../raster/r.sun/main.c:362
+msgid "Time step when computing all-day radiation sums [decimal hours]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:448 ../raster/r.sun/main.c:369
+msgid "Declination value (overriding the internally computed value) [radians]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:456 ../raster/r.sun/main.c:377
+msgid "Local (solar) time (to be set for mode 1 only) [decimal hours]"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:479 ../raster/r.horizon/main.c:317
+msgid "Sampling distance step coefficient (0.5-1.5)"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:487
+msgid "Read the input files in this number of chunks"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:494
+msgid "Civil time zone value, if none, the time will be local solar time"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:502 ../vector/v.buffer2/main.c:218
+#: ../vector/v.generalize/main.c:209
+msgid "This does nothing. It is retained for backwards compatibility"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:503 ../vector/v.buffer2/main.c:216
+#: ../vector/v.buffer2/main.c:228 ../vector/v.build.polylines/main.c:134
+#: ../vector/v.generalize/main.c:210
+msgid "Unused"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:509 ../raster/r.sun/main.c:382
+msgid "Incorporate the shadowing effect of terrain"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:514
+msgid "Use the low-memory version of the program"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:561
+msgid "You must give the longitude raster if you use civil time"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:564
+msgid "Error reading civil time zone value"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:567
+msgid "Invalid civil time zone value"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:592 ../raster/r.sun/main.c:408
+msgid "insol_time and incidout are incompatible options"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:597
+msgid "Error reading time step size"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:599
+msgid "Invalid time step size"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:603
+msgid "Error reading horizon step size"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:607
+msgid "The horizon step size must be greater than 0."
+msgstr ""
+
+#: ../raster/r.sun2/main.c:610
+msgid "If you use the horizon option you must also set the 'horizonstep' parameter."
+msgstr ""
+
+#: ../raster/r.sun2/main.c:616
+msgid "Time and insol_time are incompatible options"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:618
+msgid "Mode 1: instantaneous solar incidence angle & irradiance using a set local time"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:623 ../raster/r.sun/main.c:422
+msgid "incidout requires time parameter to be set"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:625 ../raster/r.sun/main.c:423
+msgid "Mode 2: integrated daily irradiation for a given day of the year"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:671
+msgid "If you use -s and no horizon rasters, numpartitions must be =1"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:683
+msgid "If you want to save memory and to use shadows, you must use pre-calculated horizons."
+msgstr ""
+
+#: ../raster/r.sun2/main.c:728 ../general/g.region/printwindow.c:247
+#: ../general/g.region/printwindow.c:503 ../general/g.region/printwindow.c:622
+#: ../display/d.where/main.c:93
+msgid "Can't get projection info of current location"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:732 ../raster/r.horizon/main.c:482
+#: ../raster/r.sun/main.c:475 ../general/g.region/printwindow.c:250
+#: ../general/g.region/printwindow.c:506 ../general/g.region/printwindow.c:625
+#: ../display/d.where/main.c:96
+msgid "Can't get projection units of current location"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:736 ../raster/r.horizon/main.c:486
+#: ../raster/r.sun/main.c:479 ../general/g.region/printwindow.c:253
+#: ../general/g.region/printwindow.c:509 ../general/g.region/printwindow.c:628
+#: ../display/d.grid/plot.c:319 ../display/d.where/main.c:99
+#: ../ps/ps.map/do_geogrid.c:272
+msgid "Can't get projection key values of current location"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:746 ../raster/r.horizon/main.c:496
+#: ../raster/r.sun/main.c:489 ../display/d.grid/plot.c:326
+#: ../display/d.grid/plot.c:353 ../display/d.where/main.c:106
+#: ../display/d.where/main.c:132 ../ps/ps.map/do_geogrid.c:278
+msgid "Unable to set up lat/long projection parameters"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:750
+msgid "latin and longin raster maps have no effect when in a Lat/Lon location"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:755
+msgid "Both latin and longin raster maps must be given, or neither"
+msgstr ""
+
+#: ../raster/r.sun2/main.c:949
+#, c-format
+msgid "Horizon file no. %d <%s> not found"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:61
+msgid "Converts a raster map layer into an ASCII text file."
+msgstr "Convertește hartă raster într-un fișier text ASCII."
+
+#: ../raster/r.out.ascii/main.c:78
+msgid "Name for output ASCII grid map (use out=- for stdout)"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:92
+msgid "Number of values printed before wrapping a line (only SURFER or MODFLOW format)"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:100
+msgid "String to represent null cell (GRASS grid only)"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:108
+msgid "Write SURFER (Golden Software) ASCII grid"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:112
+msgid "Write MODFLOW (USGS) ASCII array"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:116
+msgid "Force output of integer values"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:123
+msgid "Failed to interpret dp as an integer"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:125 ../raster3d/r3.out.vtk/main.c:391
+msgid "dp has to be from 0 to 20"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:131
+msgid "Failed to interpret width as an integer"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:137
+msgid "Both -s and -h doesn't make sense"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:140
+msgid "Use -M or -s, not both"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:181
+#, c-format
+msgid "Unable to read fp range for <%s>"
+msgstr ""
+
+#: ../raster/r.out.ascii/main.c:197
+#, c-format
+msgid "Read failed at row %d"
+msgstr ""
+
+#: ../raster/r.random.surface/save.c:219 ../imagery/i.pca/support.c:27
+#, c-format
+msgid "Unable to write color table for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.random.surface/main.c:43
+msgid "raster, random, surface"
+msgstr "raster, aleatoriu, suprafață"
+
+#: ../raster/r.random.surface/main.c:45
+msgid "Generates random surface(s) with spatial dependence."
+msgstr "Generează suprafețe aleatorii cu dependență spațială."
+
+#: ../raster/r.random.surface/init.c:40
+msgid "Name for output raster map(s)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:58
+msgid "Maximum distance of spatial correlation (value >= 0.0)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:67
+msgid "Distance decay exponent (value > 0.0)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:76
+msgid "Distance filter remains flat before beginning exponent"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:84
+msgid "Random seed (SEED_MIN >= value >= SEED_MAX) (default: random)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:91
+msgid "Maximum cell value of distribution"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:96
+msgid "Uniformly distributed cell values"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:101
+msgid "No (quiet) description during run"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:163
+#, c-format
+msgid "High (%d) must be greater than 1"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:173
+#, c-format
+msgid "Rastar map <%s> repeated, maps must be unique"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:183
+msgid "Output raster map required"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:205
+#, c-format
+msgid "Seed (%d) larger than maximum (%d)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:208 ../raster/r.random.surface/init.c:217
+#, c-format
+msgid " seed is set to %d"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:213
+#, c-format
+msgid "Seed (%d) smaller than minimum (%d)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:256
+#, c-format
+msgid "Distance value (%d): %lf must be >= 0.0"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:285
+#, c-format
+msgid "Exponent value (%lf) must be > 0.0"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:309
+#, c-format
+msgid "Flat value (%lf) must be less than distance value (%lf)"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:330
+msgid "Must have a distance value for each filter"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:362
+msgid "Must have a exponent value for each filter"
+msgstr ""
+
+#: ../raster/r.random.surface/init.c:379
+msgid "Must have a weight value for each filter"
+msgstr ""
+
+#: ../raster/r.lake/main.c:79
+#, c-format
+msgid "Failed writing output raster map row %d"
+msgstr "Scrierea rândului hărții raster de ieșire a eșuat %d"
+
+#: ../raster/r.lake/main.c:151
+msgid "Fills lake at given point to given level."
+msgstr "Umple lacul de la un punct dat pana la un anumit nivel."
+
+#: ../raster/r.lake/main.c:156
+msgid "Name of terrain raster map (DEM)"
+msgstr ""
+
+#: ../raster/r.lake/main.c:163
+msgid "Water level"
+msgstr "Nivelul apei"
+
+#: ../raster/r.lake/main.c:170
+msgid "Name for output raster map with lake"
+msgstr ""
+
+#: ../raster/r.lake/main.c:177
+msgid "Seed point coordinates"
+msgstr ""
+
+#: ../raster/r.lake/main.c:187
+msgid "Name of raster map with given starting point(s) (at least 1 cell > 0)"
+msgstr ""
+
+#: ../raster/r.lake/main.c:195
+msgid "Use negative depth values for lake raster map"
+msgstr ""
+
+#: ../raster/r.lake/main.c:200
+msgid "Overwrite seed map with result (lake) map"
+msgstr ""
+
+#: ../raster/r.lake/main.c:206
+msgid "Both seed map and coordinates cannot be specified"
+msgstr ""
+
+#: ../raster/r.lake/main.c:209
+msgid "Seed map or seed coordinates must be set!"
+msgstr ""
+
+#: ../raster/r.lake/main.c:212
+msgid "Seed coordinates and output map lake= must be set!"
+msgstr ""
+
+#: ../raster/r.lake/main.c:215
+msgid "Both lake and overwrite cannot be specified"
+msgstr ""
+
+#: ../raster/r.lake/main.c:218
+msgid "Output lake map or overwrite flag must be set!"
+msgstr ""
+
+#: ../raster/r.lake/main.c:248
+msgid "Seed point outside the current region"
+msgstr ""
+
+#: ../raster/r.lake/main.c:277
+msgid "G_malloc: out of memory"
+msgstr ""
+
+#: ../raster/r.lake/main.c:303
+msgid "Given water level at seed point is below earth surface. Increase water level or move seed point."
+msgstr ""
+
+#: ../raster/r.lake/main.c:386
+#, c-format
+msgid "Lake depth from %f to %f"
+msgstr "Adâncimea lacului de la %f la %f"
+
+#: ../raster/r.lake/main.c:387
+#, c-format
+msgid "Lake area %f square meters"
+msgstr ""
+
+#: ../raster/r.lake/main.c:388
+#, c-format
+msgid "Lake volume %f cubic meters"
+msgstr ""
+
+#: ../raster/r.lake/main.c:389
+msgid "Volume is correct only if lake depth (terrain raster map) is in meters"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:62
+msgid "Computing histogram"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:96
+msgid "Computing bins"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:133
+msgid "Binning data"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:178
+msgid "Sorting bins"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:188
+msgid "Computing quantiles"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:255
+msgid "Compute quantiles using two passes."
+msgstr "Calculează cuantile folosind două treceri."
+
+#: ../raster/r.quantile/main.c:263
+msgid "Number of quantiles"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:271
+msgid "List of percentiles"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:277
+msgid "Number of bins to use"
+msgstr ""
+
+#: ../raster/r.quantile/main.c:282
+msgid "Generate recode rules based on quantile-defined intervals."
+msgstr ""
+
+#: ../raster/r.surf.idw/main.c:69 ../raster/r.surf.idw2/main.c:60
+#: ../raster/r.surf.contour/main.c:52
+msgid "raster, interpolation"
+msgstr "raster, interpolare"
+
+#: ../raster/r.surf.idw/main.c:71
+msgid "Surface interpolation utility for raster map."
+msgstr "Utilitate de interpolare a suprafeței pentru harta raster."
+
+#: ../raster/r.surf.idw/main.c:81 ../raster/r.surf.idw2/main.c:72
+#: ../vector/v.surf.idw/main.c:113
+msgid "Number of interpolation points"
+msgstr "Numărul punctelor de interpolare"
+
+#: ../raster/r.surf.idw/main.c:86
+msgid "Output is the interpolation error"
+msgstr "Ieșirea este o eroare de interpolare"
+
+#: ../raster/r.surf.idw/main.c:92
+#, c-format
+msgid "Illegal value for '%s' (%s)"
+msgstr ""
+
+#: ../raster/r.surf.idw/main.c:233
+#, c-format
+msgid "Interpolating raster map <%s> (%d rows)... "
+msgstr "Interpolarea hărților raster <%s> (%d rânduri)... "
+
+#: ../raster/r.surf.idw/main.c:241
+msgid "Cannot read row"
+msgstr "Nu s-a putut citi rândul"
+
+#: ../raster/r.water.outlet/main.c:48
+msgid "Watershed basin creation program."
+msgstr "Program pentru crearea bazinului hidrografic."
+
+#: ../raster/r.water.outlet/main.c:55 ../raster/r.random/main.c:57
+#: ../raster/r.out.bin/main.c:289
+#: ../locale/scriptstrings/r.colors.stddev_to_translate.c:3
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:3
+#: ../locale/scriptstrings/r.out.xyz_to_translate.c:3
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:3
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:5
+#: ../imagery/i.zc/main.c:69
+msgid "Name of input raster map"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:62 ../raster/r.walk/main.c:206
+msgid "Name of raster map to contain results"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:70
+msgid "The map E grid coordinates"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:78
+msgid "The map N grid coordinates"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:92
+#, c-format
+msgid "Illegal east coordinate <%s>\n"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:97
+#, c-format
+msgid "Illegal north coordinate <%s>\n"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:104
+#, c-format
+msgid ""
+"Warning, ignoring point outside window: \n"
+"    %.4f,%.4f\n"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:121
+msgid "Unable to open drainage pointer map"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:146
+msgid "Unable to open new basin map"
+msgstr ""
+
+#: ../raster/r.water.outlet/main.c:159
+msgid "Unable to close new basin map layer"
+msgstr ""
+
+#: ../raster/r.report/stats.c:65
+#, c-format
+msgid "Unable to open result file <%s>"
+msgstr ""
+
+#: ../raster/r.report/stats.c:99 ../raster/r.kappa/stats.c:13
+msgid "Problem reading r.stats output"
+msgstr ""
+
+#: ../raster/r.report/main.c:65
+msgid "Reports statistics for raster map layers."
+msgstr "Raporturi de statistici pentru harta raster."
+
+#: ../raster/r.report/label.c:13
+msgid "Page width is too small"
+msgstr ""
+
+#: ../raster/r.report/parse.c:37
+msgid "Raster map(s) to report on"
+msgstr ""
+
+#: ../raster/r.report/parse.c:44 ../vector/v.to.db/parse.c:85
+msgid "Units"
+msgstr "Unități"
+
+#: ../raster/r.report/parse.c:46
+msgid "mi;miles;me;meters;k;kilometers;a;acres;h;hectares;c;cell counts;p;percent cover"
+msgstr ""
+
+#: ../raster/r.report/parse.c:56
+msgid "Character representing no data cell value"
+msgstr ""
+
+#: ../raster/r.report/parse.c:57 ../raster/r.report/parse.c:66
+#: ../raster/r.report/parse.c:75 ../raster/r.report/parse.c:100
+#: ../raster/r.report/parse.c:105 ../raster/r.report/parse.c:110
+msgid "Formatting"
+msgstr ""
+
+#: ../raster/r.report/parse.c:63
+#, c-format
+msgid "Page length (default: %d lines)"
+msgstr ""
+
+#: ../raster/r.report/parse.c:72
+#, c-format
+msgid "Page width (default: %d characters)"
+msgstr ""
+
+#: ../raster/r.report/parse.c:82
+msgid "Name of an output file to hold the report"
+msgstr ""
+
+#: ../raster/r.report/parse.c:99
+msgid "Suppress page headers"
+msgstr ""
+
+#: ../raster/r.report/parse.c:104
+msgid "Use formfeeds between pages"
+msgstr ""
+
+#: ../raster/r.report/parse.c:109
+msgid "Scientific format"
+msgstr ""
+
+#: ../raster/r.report/parse.c:114
+msgid "Filter out all no data cells"
+msgstr ""
+
+#: ../raster/r.report/parse.c:118
+msgid "Filter out cells where all maps have no data"
+msgstr ""
+
+#: ../raster/r.report/parse.c:170
+msgid "nsteps has to be > 0; using nsteps=255"
+msgstr ""
+
+#: ../raster/r.report/parse.c:177
+msgid "Illegal page length"
+msgstr ""
+
+#: ../raster/r.report/parse.c:184
+msgid "Illegal page width"
+msgstr ""
+
+#: ../raster/r.report/parse.c:223
+#, c-format
+msgid "Only %d unit%s allowed"
+msgstr ""
+
+#: ../raster/r.report/parse.c:256
+#, c-format
+msgid "Unable to read fp range for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.le/r.le.patch/main.c:47 ../raster/r.le/r.le.trace/main.c:57
+#: ../raster/r.le/r.le.setup/main.c:61 ../raster/r.le/r.le.pixel/main.c:45
+#: ../raster/r.li/r.li.mpa/mpa.c:38 ../raster/r.li/r.li.patchdensity/main.c:34
+#: ../raster/r.li/r.li.patchnum/main.c:35 ../raster/r.li/r.li.shape/main.c:33
+#: ../raster/r.li/r.li.padsd/padsd.c:36
+#: ../raster/r.li/r.li.edgedensity/edgedensity.c:38
+#: ../raster/r.li/r.li.padcv/padcv.c:38 ../raster/r.li/r.li.mps/mps.c:40
+#: ../raster/r.li/r.li.padrange/padrange.c:38
+#: ../raster/r.li/r.li.cwed/cwed.c:45
+msgid "raster, landscape structure analysis, patch index"
+msgstr "raster, analiza structurii peisajului, indexul parcelei"
+
+#: ../raster/r.le/r.le.patch/main.c:49
+msgid "Calculates attribute, patch size, core (interior) size, shape, fractal dimension, and perimeter measures for sets of patches in a landscape."
+msgstr "Calculează atribute, dimensiunea parcelei, dimensiunea de bază (interior), forma, dimensiunea fractală și măsoară perimetrul pentru un set de parcele a peisajului."
+
+#: ../raster/r.le/r.le.trace/main.c:59
+msgid "Displays the boundary of each r.le patch and shows how the boundary is traced, displays the attribute, size, perimeter and shape indices for each patch and saves the data in an output file."
+msgstr "Afișează limitele pentru fiecare  r.le patch și arată cum limitele sunt urmărite, afișează indici precum atributele, dimensiunea, perimetrul și forma pentru fiecare parcelă și salvează datele într-un fișier."
+
+#: ../raster/r.le/r.le.setup/main.c:63
+msgid "Interactive tool used to setup the sampling and analysis framework that will be used by the other r.le programs."
+msgstr "Instrument interactiv folosit pentru a seta prelevarea de probe și analiza cadrului care vor fi utilizate de alte r.le programs."
+
+#: ../raster/r.le/r.le.setup/main.c:67
+msgid "Raster map to use to setup sampling"
+msgstr ""
+
+#: ../raster/r.le/r.le.setup/main.c:71
+msgid "Vector map to overlay"
+msgstr ""
+
+#: ../raster/r.le/r.le.setup/sample.c:1050
+msgid "Cannot read vector"
+msgstr ""
+
+#: ../raster/r.le/r.le.pixel/main.c:47
+msgid "Contains a set of measures for attributes, diversity, texture, juxtaposition, and edge."
+msgstr "Conține un set de măsuri pentru atribute, diversitate, textură, juxtapunere și unghiuri."
+
+#: ../raster/r.sum/main.c:47
+msgid "Sums up the raster cell values."
+msgstr "Însumează valorile celulelor raster."
+
+#: ../raster/r.sum/main.c:54
+msgid "Name of incidence or density file."
+msgstr ""
+
+#: ../raster/r.distance/report.c:41
+msgid "Processing..."
+msgstr ""
+
+#: ../raster/r.distance/main.c:38
+msgid "raster, distance"
+msgstr "raster, distanță"
+
+#: ../raster/r.distance/main.c:40
+msgid "Locates the closest points between objects in two raster maps."
+msgstr "Localizează punctele mai apropiate dintre obiectele din două hărți raster."
+
+#: ../raster/r.distance/edges.c:42
+#, c-format
+msgid "Reading map %s ..."
+msgstr "Citirea hărții%s ..."
+
+#: ../raster/r.distance/parse.c:41
+msgid "Maps for computing inter-class distances"
+msgstr ""
+
+#: ../raster/r.distance/parse.c:54
+msgid "Include category labels in the output"
+msgstr ""
+
+#: ../raster/r.distance/parse.c:59
+msgid "Report zero distance if rasters are overlapping"
+msgstr ""
+
+#: ../raster/r.distance/distance.c:99
+#, c-format
+msgid "Reading maps  <%s,%s> while finding 0 distance ..."
+msgstr ""
+
+#: ../raster/r.out.gridatb/main.c:46
+msgid "Exports GRASS raster map to GRIDATB.FOR map file (TOPMODEL)"
+msgstr "Exportă hartă raster GRASS în fișier GRIDATB.FOR (TOPMODEL)"
+
+#: ../raster/r.out.gridatb/main.c:50
+msgid "Input map"
+msgstr ""
+
+#: ../raster/r.out.gridatb/main.c:63
+msgid "Overwrite output map file"
+msgstr ""
+
+#: ../raster/r.out.gridatb/file_io.c:38
+msgid "Setting window header"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:65
+#: ../raster/r.out.gdal/export_band.c:373
+msgid "Unable to allocate buffer for reading raster map"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:186
+#, c-format
+msgid "Input raster map contains cells with NULL-value (no-data). The value %d will be used to represent no-data values in the input map. You can specify a nodata value with the %s option."
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:191
+#, c-format
+msgid "Input raster map contains cells with NULL-value (no-data). The value %f will be used to represent no-data values in the input map. You can specify a nodata value with the %s option."
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:201
+#, c-format
+msgid "The default nodata value is present in rasterband <%s> and would lead to data loss. Please specify a custom nodata value with the %s parameter."
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:208
+#, c-format
+msgid "The user given nodata value %g is present in rasterband <%s> and would lead to data loss. Please specify a different nodata value with the %s parameter."
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:254
+msgid "Unable to get raster band"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:414
+#: ../raster/r.out.gdal/export_band.c:447
+#: ../raster/r.out.gdal/export_band.c:480
+msgid "Unable to write GDAL raster file"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:498
+#: ../raster/r.out.gdal/export_band.c:510
+#: ../raster/r.out.gdal/export_band.c:523
+#: ../raster/r.out.gdal/export_band.c:536
+#: ../raster/r.out.gdal/export_band.c:548
+#: ../raster/r.out.gdal/export_band.c:561
+#: ../raster/r.out.gdal/export_band.c:575 ../raster/r.out.gdal/main.c:631
+#: ../raster/r.out.gdal/main.c:643 ../raster/r.out.gdal/main.c:656
+#: ../raster/r.out.gdal/main.c:669 ../raster/r.out.gdal/main.c:681
+#: ../raster/r.out.gdal/main.c:694
+msgid "Selected GDAL datatype does not cover data range."
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:499
+#: ../raster/r.out.gdal/export_band.c:511
+#: ../raster/r.out.gdal/export_band.c:524
+#: ../raster/r.out.gdal/export_band.c:537 ../raster/r.out.gdal/main.c:632
+#: ../raster/r.out.gdal/main.c:644 ../raster/r.out.gdal/main.c:657
+#: ../raster/r.out.gdal/main.c:670
+#, c-format
+msgid "GDAL datatype: %s, range: %d - %d"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:502
+#: ../raster/r.out.gdal/export_band.c:514
+#: ../raster/r.out.gdal/export_band.c:527
+#: ../raster/r.out.gdal/export_band.c:540
+#: ../raster/r.out.gdal/export_band.c:552
+#: ../raster/r.out.gdal/export_band.c:565
+#: ../raster/r.out.gdal/export_band.c:579
+#, c-format
+msgid "Raster map <%s> range: %g - %g"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:549 ../raster/r.out.gdal/main.c:682
+#, c-format
+msgid "GDAL datatype: %s, range: %u - %u"
+msgstr ""
+
+#: ../raster/r.out.gdal/export_band.c:562
+#: ../raster/r.out.gdal/export_band.c:576 ../raster/r.out.gdal/main.c:695
+#, c-format
+msgid "GDAL datatype: %s, range: %g - %g"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:49
+#, c-format
+msgid "Supported formats:\n"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:127
+msgid "Exports GRASS raster maps into GDAL supported formats."
+msgstr "Exportă hartă raster GRASS în formate acceptate."
+
+#: ../raster/r.out.gdal/main.c:132
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:3
+msgid "List supported output formats"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:137
+msgid "Do not write GDAL standard colortable"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:138
+msgid "Only applicable to Byte or UInt16 data types."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:142
+msgid "Force raster export despite any warnings of data loss"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:143
+msgid "Overrides nodata safety check."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:147
+msgid "Name of raster map (or group) to export"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:154
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:6
+msgid "GIS format to write (case sensitive, see also -l flag)"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:175
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:7
+msgid "File type"
+msgstr "Tip fișier"
+
+#: ../raster/r.out.gdal/main.c:183
+msgid "Name for output raster file"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:190
+msgid "Creation option(s) to pass to the output format driver"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:192
+#: ../locale/scriptstrings/d.out.file_to_translate.c:21
+msgid "In the form of \"NAME=VALUE\", separate multiple entries with a comma."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:199
+msgid "Metadata key(s) and value(s) to include"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:201
+msgid "In the form of \"META-TAG=VALUE\", separate multiple entries with a comma. Not supported by all output format drivers."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:210
+msgid "Assign a specified nodata value to output bands"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:230 ../raster/r.in.gdal/main.c:219
+#: ../raster/r.proj/main.c:264 ../raster/r.proj.seg/main.c:299
+#: ../vector/v.proj/main.c:181 ../vector/v.select/main.c:90
+#: ../vector/v.in.ogr/main.c:277 ../vector/v.in.ogr/main.c:333
+#, c-format
+msgid "Required parameter <%s> not set"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:243
+#, c-format
+msgid "Raster map or group <%s> not found"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:247
+#, c-format
+msgid "No raster maps in group <%s>"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:261
+#, c-format
+msgid "Unable to get <%s> driver"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:267
+#, c-format
+msgid "Driver <%s> does not support direct writing. Using MEM driver for intermediate dataset."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:272
+msgid "Unable to get in-memory raster driver"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:276
+#, c-format
+msgid "Driver <%s> does not support creating rasters"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:352
+#, c-format
+msgid "Could not read data range of raster <%s>"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:409
+#, c-format
+msgid "Exporting to GDAL data type: %s"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:424
+msgid "Raster export would result in complete data loss, aborting."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:435
+#, c-format
+msgid "Precision loss: Raster map <%s> of type %s to be exported as %s. This can be avoided by using %s."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:446
+#, c-format
+msgid "Precision loss: The range of <%s> can not be accurately preserved with GDAL datatype Float32. This can be avoided by exporting to Int32 or Float64."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:454
+#, c-format
+msgid "Precision loss: Float32 can not preserve the DCELL precision of raster <%s>. This can be avoided by using Float64"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:482 ../raster/r.out.gdal/main.c:511
+#: ../raster/r.out.gdal/main.c:515
+msgid "Raster export aborted."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:492
+msgid "Checking GDAL data type and nodata value"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:495
+#, c-format
+msgid "Checking options for raster map <%s> (band %d)..."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:509
+msgid "Forcing raster export."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:536
+msgid "Output file name not specified"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:542
+msgid "Unable to create dataset using memory raster driver"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:551
+#, c-format
+msgid "Unable to create <%s> dataset using <%s> driver"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:566
+msgid "Unable to set geo transform"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:574
+msgid "Unable to set projection"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:580
+msgid "Exporting to GDAL raster"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:583
+#, c-format
+msgid "Exporting raster map <%s> (band %d)..."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:596
+#, c-format
+msgid "Unable to export raster map <%s>"
+msgstr "Imposibil de exportat harta raster <%s>"
+
+#: ../raster/r.out.gdal/main.c:608
+#, c-format
+msgid "Unable to create raster map <%s> using driver <%s>"
+msgstr "Imposibil de creat harta raster <%s> folosind driver <%s>"
+
+#: ../raster/r.out.gdal/main.c:635 ../raster/r.out.gdal/main.c:647
+#: ../raster/r.out.gdal/main.c:660 ../raster/r.out.gdal/main.c:673
+#: ../raster/r.out.gdal/main.c:685
+#, c-format
+msgid "Range to be exported: %f - %f"
+msgstr "Interval pentru a fi exportat: %f - %f"
+
+#: ../raster/r.out.gdal/main.c:698
+#, c-format
+msgid "Range to be exported: %g - %g"
+msgstr "Interval pentru a fi exportat: %g - %g"
+
+#: ../raster/r.out.gdal/main.c:722 ../raster/r.out.gdal/main.c:735
+#: ../raster/r.out.gdal/main.c:749 ../raster/r.out.gdal/main.c:762
+#: ../raster/r.out.gdal/main.c:777
+#, c-format
+msgid "Mismatch between metadata nodata value and actual nodata value in exported raster: specified nodata value %f gets converted to %d by selected GDAL datatype."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:725 ../raster/r.out.gdal/main.c:752
+#: ../raster/r.out.gdal/main.c:780
+#, c-format
+msgid "GDAL datatype: %s, valid range: %d - %d"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:738 ../raster/r.out.gdal/main.c:765
+#, c-format
+msgid "GDAL datatype: %s, valid range: %u - %u"
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:791
+#, c-format
+msgid "Mismatch between metadata nodata value and actual nodata value in exported raster: specified nodata value %g gets converted to %g by selected GDAL datatype."
+msgstr ""
+
+#: ../raster/r.out.gdal/main.c:794
+#, c-format
+msgid "GDAL datatype: %s, valid range: %g - %g"
+msgstr ""
+
+#: ../raster/r.random/count.c:74
+msgid "Collecting Stats..."
+msgstr ""
+
+#: ../raster/r.random/count.c:78
+#, c-format
+msgid "Cannot read raster row [%d]"
+msgstr ""
+
+#: ../raster/r.random/count.c:82
+#, c-format
+msgid "Cannot read cover raster row [%d]"
+msgstr ""
+
+#: ../raster/r.random/count.c:131
+msgid "Programmer error in get_stats/switch"
+msgstr ""
+
+#: ../raster/r.random/random.c:74 ../raster/r.to.vect/main.c:159
+#: ../raster/r.contour/main.c:185 ../doc/vector/v.example/main.c:128
+#: ../display/d.thematic.area/plot1.c:202 ../display/d.vect/area.c:60
+#: ../display/d.vect/plot1.c:211 ../display/d.vect/attr.c:45
+#: ../display/d.vect.chart/plot.c:44 ../ps/ps.map/catval.c:54
+#: ../ps/ps.map/catval.c:116 ../ps/ps.map/catval.c:182
+#: ../vector/v.in.dxf/write_vect.c:198 ../vector/v.extrude/main.c:168
+#: ../vector/v.label/main.c:282 ../vector/v.transform/trans_digit.c:64
+#: ../vector/v.in.ascii/in.c:317 ../vector/v.surf.rst/main.c:607
+#: ../vector/v.info/main.c:217 ../vector/v.out.ogr/main.c:634
+#: ../vector/v.out.ascii/b2a.c:52 ../vector/v.out.svg/main.c:162
+#: ../vector/v.sample/main.c:207 ../vector/v.net.distance/main.c:196
+#: ../vector/v.vol.rst/main.c:590 ../vector/v.vol.rst/user1.c:97
+#: ../vector/v.buffer2/main.c:334 ../vector/v.patch/main.c:132
+#: ../vector/v.patch/main.c:162 ../vector/v.patch/main.c:274
+#: ../vector/v.patch/main.c:332 ../vector/v.in.sites/main.c:163
+#: ../vector/v.net.path/path.c:96 ../vector/v.to.points/main.c:285
+#: ../vector/v.label.sa/labels.c:83 ../vector/v.db.select/main.c:155
+#: ../vector/v.db.select/main.c:286 ../vector/v.surf.idw/read_sites.c:39
+#: ../vector/v.net.allpairs/main.c:141 ../vector/v.drape/main.c:293
+#: ../vector/v.buffer/main.c:387 ../vector/v.mkgrid/main.c:237
+#: ../vector/v.extract/main.c:291 ../vector/v.out.vtk/writeVTK.c:640
+#: ../vector/v.to.rast3/main.c:86 ../vector/v.distance/main.c:364
+#: ../vector/v.distance/main.c:401 ../vector/v.to.db/query.c:89
+#: ../vector/v.to.db/update.c:46 ../vector/v.in.dwg/main.c:194
+#: ../vector/v.to.3d/trans3.c:54 ../vector/v.to.3d/trans2.c:52
+#: ../vector/v.overlay/main.c:202 ../vector/v.overlay/main.c:353
+#: ../vector/v.net.flow/main.c:157 ../vector/v.normal/main.c:141
+#: ../vector/v.edit/select.c:521 ../vector/v.what.rast/main.c:133
+#: ../vector/v.kcv/main.c:181 ../vector/v.in.db/main.c:119
+#: ../vector/lidar/v.surf.bspline/main.c:335
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:128
+#: ../vector/v.lrs/v.lrs.create/main.c:287
+#: ../vector/v.lrs/v.lrs.create/main.c:295 ../vector/v.reclass/main.c:127
+#: ../vector/v.to.rast/vect2rast.c:56 ../vector/v.to.rast/support.c:129
+#: ../vector/v.to.rast/support.c:293 ../vector/v.to.rast/support.c:443
+#: ../vector/v.db.connect/main.c:218 ../vector/v.db.connect/main.c:326
+#: ../vector/v.net.timetable/main.c:93 ../vector/v.net.components/main.c:137
+#: ../vector/v.net.centrality/main.c:220 ../vector/v.random/main.c:168
+#, c-format
+msgid "Unable to open database <%s> by driver <%s>"
+msgstr "Imposibil de deschis baza de date <%s> cu driver-ul <%s>"
+
+#: ../raster/r.random/random.c:100
+msgid "Cannot create new table"
+msgstr "Nu s-a putut crea un tabel nou"
+
+#: ../raster/r.random/random.c:110
+#, c-format
+msgid "Writing raster map <%s> and vector map <%s> ..."
+msgstr "Scrierea hărții raster <%s> și a hărții vectoriale<%s> ..."
+
+#: ../raster/r.random/random.c:113
+#, c-format
+msgid "Writing raster map <%s> ..."
+msgstr "Scrierea hărții raster <%s> ..."
+
+#: ../raster/r.random/random.c:115
+#, c-format
+msgid "Writing vector map <%s> ..."
+msgstr "Scrierea hărții vectoriale <%s> ..."
+
+#: ../raster/r.random/random.c:129
+#, c-format
+msgid "Cannot read raster row [%d] from raster map <%s>"
+msgstr "Nu s-a putut citi rândul rasterului [%d] din harta <%s>"
+
+#: ../raster/r.random/random.c:135
+#, c-format
+msgid "Cannot read raster row [%d] from cover raster map <%s>"
+msgstr "Nu s-a putut citi rândul rasterului [%d] din harta de acoperire <%s>"
+
+#: ../raster/r.random/random.c:194 ../vector/v.digit/attr.c:157
+#: ../vector/v.net.distance/main.c:256 ../vector/v.net.path/path.c:309
+#: ../vector/v.net.allpairs/main.c:241 ../vector/v.net.flow/main.c:244
+#: ../vector/v.net.timetable/main.c:134 ../vector/v.net.timetable/main.c:156
+#: ../vector/v.net.components/main.c:38 ../vector/v.net.centrality/main.c:69
+#, c-format
+msgid "Cannot insert new record: %s"
+msgstr "Nu s-a putut insera o înregistrare nouă: %s"
+
+#: ../raster/r.random/random.c:246
+#, c-format
+msgid "Only [%ld] random points created"
+msgstr "Doar [%ld] puncte aletoriu create"
+
+#: ../raster/r.random/main.c:51 ../raster/r.surf.random/main.c:44
+msgid "raster, random"
+msgstr "raster, aleatoriu"
+
+#: ../raster/r.random/main.c:53
+msgid "Creates a raster map layer and vector point map containing randomly located points."
+msgstr "Crează strat raster și puncte vectoriale care conțin puncte localizate aleatoriu."
+
+#: ../raster/r.random/main.c:62 ../raster/r.median/main.c:58
+msgid "Name of cover raster map"
+msgstr "Numele hărții raster de acoperire"
+
+#: ../raster/r.random/main.c:69
+msgid "The number of points to allocate"
+msgstr "Numărul de puncte alocate"
+
+#: ../raster/r.random/main.c:81
+msgid "Generate points also for NULL category"
+msgstr "Generează puncte doar pentru categoriile NULE"
+
+#: ../raster/r.random/main.c:86
+msgid "Report information about input raster and exit"
+msgstr "Realizează raport cu informații despre rasterul de intrare și după aceea închide"
+
+#: ../raster/r.random/main.c:90
+msgid "Generate vector points as 3D points"
+msgstr "Generează puncte vectoriale ca puncte 3D"
+
+#: ../raster/r.random/main.c:94 ../vector/v.in.ascii/in.c:161
+msgid "Do not build topology in points mode"
+msgstr ""
+
+#: ../raster/r.random/main.c:95
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:18
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:20
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:23
+#: ../vector/v.transform/main.c:116 ../vector/v.in.ascii/in.c:84
+#: ../vector/v.in.ascii/in.c:91 ../vector/v.in.ascii/in.c:103
+#: ../vector/v.in.ascii/in.c:113 ../vector/v.in.ascii/in.c:123
+#: ../vector/v.in.ascii/in.c:133 ../vector/v.in.ascii/in.c:157
+#: ../vector/v.in.ascii/in.c:162 ../vector/v.in.ascii/in.c:168
+#: ../vector/v.out.ascii/out.c:67 ../vector/v.out.ascii/out.c:77
+#: ../vector/v.out.ascii/out.c:84 ../vector/v.out.ascii/out.c:97
+msgid "Points"
+msgstr "Puncte"
+
+#: ../raster/r.random/main.c:142
+#, c-format
+msgid "Note: one (or both) of %s and %s must be specified"
+msgstr ""
+
+#: ../raster/r.random/main.c:160
+#, c-format
+msgid "<%s=%s> invalid percentage"
+msgstr "<%s=%s> procent nevalid"
+
+#: ../raster/r.random/main.c:167
+#, c-format
+msgid "<%s=%s> invalid number of points"
+msgstr "<%s=%s> număr nevalid de puncte"
+
+#: ../raster/r.random/main.c:180
+#, c-format
+msgid "There aren't [%ld] cells in the current region"
+msgstr "Nu sunt [%ld] celule în regiunea curentă"
+
+#: ../raster/r.random/main.c:183
+#, c-format
+msgid "There aren't [%ld] non-NULL cells in the current region"
+msgstr "Nu sunt [%ld] celule NENULE în regiunea curentă"
+
+#: ../raster/r.random/main.c:188
+msgid "There are no valid locations in the current region"
+msgstr "Nu sunt locații valide în regiunea curentă"
+
+#: ../raster/r.topidx/main.c:39
+msgid "Creates topographic index map from elevation raster map."
+msgstr "Crează harta indicelului topografic dintr-o hartă raster de elevație."
+
+#: ../raster/r.topidx/main.c:42
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:3
+msgid "Input elevation map"
+msgstr "Harta de elevație de intrare"
+
+#: ../raster/r.topidx/main.c:46
+msgid "Output topographic index map"
+msgstr "Indexul topografic al hărții de ieșire"
+
+#: ../raster/r.topidx/file_io.c:37
+#, c-format
+msgid "The current region resolution [%s x %s] is finer than the input map's resolution [%s x %s]. The current region resolution must be identical to, or coarser than, the input map's resolution."
+msgstr ""
+
+#: ../raster/r.topidx/file_io.c:44
+msgid "Reading elevation map..."
+msgstr "Citirea hărții de elevație..."
+
+#: ../raster/r.topidx/file_io.c:98
+msgid "Writing topographic index map..."
+msgstr "Scrierea indexului topografic al hărții..."
+
+#: ../raster/r.basins.fill/main.c:55
+msgid "Generates watershed subbasins raster map."
+msgstr "Generează harta raster a subbazinelor hidrografice."
+
+#: ../raster/r.basins.fill/main.c:59
+msgid "Name of input coded stream network raster map"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:63
+msgid "Name of input thinned ridge network raster map"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:72
+msgid "Number of passes through the dataset"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:99 ../raster/r.in.gdal/main.c:233
+#, c-format
+msgid "Raster map <%s> already exists"
+msgstr "Harta raster <%s> există deja"
+
+#: ../raster/r.basins.fill/main.c:131
+msgid "Forward sweep complete"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:148
+msgid "Reverse sweep complete"
+msgstr ""
+
+#: ../raster/r.basins.fill/main.c:155 ../raster/r.cross/main.c:194
+#: ../raster/r.resample/main.c:152
+#, c-format
+msgid "Creating support files for <%s>..."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:81
+msgid "Import GDAL supported raster file into a binary raster map layer."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:87
+msgid "Raster file to be imported"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:100
+msgid "Band to select (default is all bands)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:106 ../raster/r.proj.seg/main.c:194
+msgid "Cache size (MiB)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:113
+msgid "Name of location to read projection from for GCPs transformation"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:122 ../raster/r.external/main.c:551
+#: ../imagery/i.landsat.toar/main.c:88 ../imagery/i.landsat.toar/main.c:108
+#: ../imagery/i.landsat.toar/main.c:118 ../imagery/i.landsat.toar/main.c:127
+#: ../imagery/i.landsat.toar/main.c:135 ../imagery/i.landsat.toar/main.c:144
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ../raster/r.in.gdal/main.c:128 ../vector/v.in.ogr/main.c:186
+msgid "Name for new location to create"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:134 ../raster/r.external/main.c:556
+msgid "Override projection (use location's projection)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:138 ../raster/r.external/main.c:560
+#: ../vector/v.in.ogr/main.c:234
+msgid "Extend region extents based on new dataset"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:140 ../raster/r.external/main.c:562
+#: ../vector/v.in.ogr/main.c:236
+msgid "Also updates the default region if in the PERMANENT mapset"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:144 ../raster/r.external/main.c:570
+#: ../vector/v.in.ogr/main.c:205
+msgid "List supported formats and exit"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:150
+msgid "Force Lat/Lon maps to fit into geographic coordinates (90N,S; 180E,W)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:155
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:11
+msgid "Keep band numbers instead of using band color names"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:176
+msgid "You have to specify a target location different from output location"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:180
+msgid "The '-l' flag only works in Lat/Lon locations"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:198
+msgid "Available GDAL Drivers:"
+msgstr " Drivere GDAL disponibile:"
+
+#: ../raster/r.in.gdal/main.c:222 ../raster/r.external/main.c:601
+msgid "Name for output raster map not specified"
+msgstr "Numele pentru harta raster de ieșire nu este specificat"
+
+#: ../raster/r.in.gdal/main.c:230
+#, c-format
+msgid "Raster map <%s> already exists and will be overwritten"
+msgstr "Harta raster <%s> există deja și va fi suprascrisă"
+
+#: ../raster/r.in.gdal/main.c:250
+msgid "The polynomial rectification used in i.rectify does not work well with NOAA/AVHRR data. Try using gdalwarp with thin plate spline rectification instead. (-tps)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:266
+msgid "Input raster map is flipped or rotated - cannot import. You may use 'gdalwarp' to transform the map to North-up."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:308
+msgid "Map bounds have been constrained to geographic coordinates. You will almost certainly want to check map bounds and resolution with r.info and reset them with r.region before going any further."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:328
+msgid "Unable to convert input map projection to GRASS format; cannot create new location."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:334 ../general/g.proj/create.c:15
+#, c-format
+msgid "Location <%s> created"
+msgstr "Locația <%s> creată"
+
+#: ../raster/r.in.gdal/main.c:341 ../raster/r.external/main.c:83
+msgid "Unable to convert input raster map projection information to GRASS format for checking"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:357 ../raster/r.external/main.c:99
+#: ../vector/v.in.ogr/main.c:518
+msgid "Over-riding projection check"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:367 ../raster/r.external/main.c:107
+#: ../vector/v.in.ogr/main.c:527
+msgid ""
+"Projection of dataset does not appear to match current location.\n"
+"\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:372 ../raster/r.external/main.c:112
+msgid "Location PROJ_INFO is:\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:383 ../raster/r.external/main.c:123
+msgid "Dataset PROJ_INFO is:\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:419 ../raster/r.external/main.c:150
+#: ../vector/v.in.ogr/main.c:543 ../vector/v.in.ogr/main.c:550
+msgid "Import dataset PROJ_INFO is:\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:441
+msgid ""
+"\n"
+"You can use the -o flag to r.in.gdal to override this check and use the location definition for the dataset.\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:444 ../raster/r.external/main.c:175
+msgid "Consider generating a new location from the input dataset using the 'location' parameter.\n"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:449 ../raster/r.external/main.c:180
+#: ../vector/v.in.ogr/main.c:601
+msgid "Projection of input dataset and current location appear to match"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:455 ../raster/r.external/main.c:630
+msgid "Proceeding with import..."
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:481 ../raster/r.external/main.c:645
+#, c-format
+msgid "Selected band (%d) does not exist"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:560
+#, c-format
+msgid "Copying %d GCPS in points file for <%s>"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:565
+msgid "GCPs have the following OpenGIS WKT Coordinate System:"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:572
+msgid "Re-projecting GCPs table:"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:573
+#, c-format
+msgid "* Input projection for GCP table: %s"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:575
+#, c-format
+msgid "* Output projection for GCP table: %s"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:592
+#, c-format
+msgid "Error in pj_do_proj (can't re-projection GCP %i)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:633 ../raster/r.external/main.c:264
+#: ../vector/v.in.ogr/main.c:1263
+msgid "Default region for this location updated"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:636 ../raster/r.external/main.c:267
+#: ../vector/v.in.ogr/main.c:1266
+msgid "Region for the current mapset updated"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:664
+msgid "Unable to translate projection key values of input GCPs"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:680
+msgid "Unable to get projection info of target location"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:682
+msgid "Unable to get projection units of target location"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:684
+msgid "Unable to get projection key values of target location"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:687
+#: ../imagery/i.ortho.photo/i.photo.rectify/target.c:31
+#: ../imagery/i.rectify/target.c:32
+#, c-format
+msgid "Mapset <%s> in target location <%s> - "
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:689 ../raster/r.proj/main.c:245
+#: ../raster/r.proj.seg/main.c:280
+#: ../imagery/i.ortho.photo/i.photo.rectify/target.c:32
+#: ../imagery/i.rectify/target.c:33
+msgid "permission denied"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:690 ../raster/r.proj/main.c:246
+#: ../raster/r.proj.seg/main.c:281
+#: ../imagery/i.ortho.photo/i.photo.rectify/target.c:32
+#: ../imagery/i.rectify/target.c:33
+msgid "not found"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:989
+#, c-format
+msgid "Setting grey color table for <%s> (8bit, full range)"
+msgstr ""
+
+#: ../raster/r.in.gdal/main.c:1002
+#, c-format
+msgid "Setting grey color table for <%s> (16bit, image range)"
+msgstr ""
+
+#: ../raster/r.to.vect/lines_io.c:76
+msgid "write_line:  found half a loop!"
+msgstr ""
+
+#: ../raster/r.to.vect/lines_io.c:128
+#, c-format
+msgid ""
+"write_line: line terminated unexpectedly\n"
+"  previous (%d) point %p (%d,%d,%d) %p %p"
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:69
+msgid "Extracting lines..."
+msgstr "Extragerea liniilor..."
+
+#: ../raster/r.to.vect/lines.c:493
+msgid ""
+"Raster map is not thinned properly.\n"
+"Please run r.thin."
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:567
+msgid "join_lines: p front pointer not NULL!"
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:573
+msgid "join_lines: q front pointer not NULL!"
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:591
+msgid "extend line:  p is NULL"
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:617
+msgid "extend_lines: p front pointer not NULL!"
+msgstr ""
+
+#: ../raster/r.to.vect/lines.c:624
+msgid "extend_lines: q back pointer not NULL!"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:51
+msgid "raster, conversion, vectorization"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:52
+msgid "Converts a raster map into a vector map layer."
+msgstr "Convertește harta raster în hartă vectorială."
+
+#: ../raster/r.to.vect/main.c:65
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:6
+#: ../vector/v.net.bridge/main.c:63 ../vector/v.vect.stats/main.c:145
+#: ../vector/v.to.db/parse.c:36
+msgid "Feature type"
+msgstr "Tipul trăsăturii"
+
+#: ../raster/r.to.vect/main.c:69
+msgid "Smooth corners of area features"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:74
+msgid "Use raster values as categories instead of unique sequence (CELL only)"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:75 ../raster/r.to.vect/main.c:82
+#: ../vector/v.digit/line.c:86 ../vector/v.digit/attr.c:539
+#: ../vector/v.digit/attr.c:575 ../vector/v.transform/main.c:185
+#: ../vector/v.transform/main.c:196 ../vector/v.to.rast/main.c:72
+#: ../vector/v.to.rast/main.c:78 ../vector/v.to.rast/main.c:84
+#: ../vector/v.in.ogr/main.c:196 ../vector/v.in.ogr/main.c:219
+#: ../vector/v.in.ogr/main.c:242
+msgid "Attributes"
+msgstr "Atribute"
+
+#: ../raster/r.to.vect/main.c:80
+msgid "Write raster values as z coordinate. Table is not created. Currently supported only for points."
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:87
+msgid "Do not build vector topology (use with care for massive point export)"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:92
+msgid "Quiet - Do not show progress"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:110
+msgid "z flag is supported only for points"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:124
+msgid "Raster is not CELL, '-v' flag ignored, raster values will be written to the table."
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:195 ../vector/v.in.dxf/write_vect.c:218
+#: ../vector/v.in.ascii/in.c:386 ../vector/v.in.sites/main.c:170
+#: ../vector/v.mkgrid/main.c:255 ../vector/v.lrs/v.lrs.create/main.c:326
+#: ../vector/v.random/main.c:193
+#, c-format
+msgid "Unable to create table: %s"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:199 ../vector/v.mkgrid/main.c:259
+#: ../vector/v.overlay/main.c:530
+msgid "Unable to create index"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:204 ../raster/r.contour/main.c:206
+#: ../vector/v.in.dxf/write_vect.c:223 ../vector/v.in.ascii/in.c:395
+#: ../vector/v.sample/main.c:223 ../vector/v.convert/att.c:90
+#: ../vector/v.in.sites/main.c:179 ../vector/v.to.points/main.c:306
+#: ../vector/v.mkgrid/main.c:263 ../vector/v.distance/main.c:840
+#: ../vector/v.in.dwg/main.c:228 ../vector/v.overlay/main.c:535
+#: ../vector/v.reclass/main.c:302 ../vector/v.in.ogr/main.c:807
+#: ../vector/v.random/main.c:204
+#, c-format
+msgid "Unable to grant privileges on table <%s>"
+msgstr ""
+
+#: ../raster/r.to.vect/main.c:274
+#, c-format
+msgid "Unable to insert into table: %s"
+msgstr ""
+
+#: ../raster/r.to.vect/areas_io.c:105
+#, c-format
+msgid ""
+"Line terminated unexpectedly\n"
+"previous (%d) point %p (%d,%d,%d) %p %p"
+msgstr ""
+
+#: ../raster/r.to.vect/areas_io.c:371 ../raster/r.to.vect/util.c:156
+#: ../vector/v.in.ogr/main.c:939 ../vector/v.random/main.c:300
+#, c-format
+msgid "Cannot insert new row: %s"
+msgstr ""
+
+#: ../raster/r.to.vect/areas.c:119
+msgid "Extracting areas..."
+msgstr ""
+
+#: ../raster/r.to.vect/points.c:35
+msgid "Extracting points..."
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:57
+msgid "Simulates TOPMODEL which is a physically based hydrologic model."
+msgstr "Simulează TOPMODEL, care este un model hidrologic bazat pe fizică."
+
+#: ../raster/r.topmodel/main.c:63
+msgid "(i)   Basin map created by r.water.outlet (MASK)"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:70
+msgid "(i)   Elevation map"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:77
+msgid "(o)   Depressionless elevation map"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:85
+msgid "(o)   Direction map for depressionless elevation map"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:92
+msgid "(o/i) Basin elevation map (MASK applied)"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:100
+msgid "(o)   Topographic index ln(a/tanB) map (MASK applied)"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:108
+msgid "(i)   Number of topographic index classes"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:116
+msgid "(o/i) Topographic index statistics file"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:122
+msgid "(i)   TOPMODEL Parameters file"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:129
+msgid "(i)   Rainfall and potential evapotranspiration data file"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:135
+msgid "(o)   Output file"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:141
+msgid "(i)   OPTIONAL Observed flow file"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:148
+msgid "(i)   OPTIONAL Output for given time step"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:155
+msgid "(i)   OPTIONAL Output for given topographic index class"
+msgstr ""
+
+#: ../raster/r.topmodel/main.c:163
+msgid "Input data given for (o/i)"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:53
+msgid "Creates a raster map containing concentric rings around a given point."
+msgstr "Crează o hartă raster care conține inele concentrice în jurul punctelor date."
+
+#: ../raster/r.circle/dist.c:63
+msgid "The coordinate of the center (east,north)"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:69
+msgid "Minimum radius for ring/circle map (in meters)"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:75
+msgid "Maximum radius for ring/circle map (in meters)"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:81
+msgid "Data value multiplier"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:85
+msgid "Generate binary raster map"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:108
+msgid "Please specify a radius in which min < max"
+msgstr ""
+
+#: ../raster/r.circle/dist.c:116
+msgid "Please specify min and/or max radius when using the binary flag"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:52 ../raster/r.rescale/main.c:50
+msgid "raster, rescale"
+msgstr "raster, redimensionare"
+
+#: ../raster/r.rescale.eq/main.c:54
+msgid "Rescales histogram equalized the range of category values in a raster map layer."
+msgstr "Redimensionează histograma egalizată cu gama de valori din stratul raster."
+
+#: ../raster/r.rescale.eq/main.c:64 ../raster/r.rescale/main.c:61
+msgid "The name of the raster map to be rescaled"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:72 ../raster/r.rescale/main.c:69
+msgid "The input data range to be rescaled (default: full range of input map)"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:79 ../raster/r.rescale/main.c:76
+msgid "The resulting raster map name"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:86 ../raster/r.rescale/main.c:83
+msgid "The output data range"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:93 ../raster/r.rescale/main.c:90
+msgid "Title for new raster map"
+msgstr ""
+
+#: ../raster/r.rescale.eq/main.c:146
+#, c-format
+msgid "Rescale %s[%d,%d] to %s[%d,%d]"
+msgstr ""
+
+#: ../raster/r.rescale.eq/get_stats.c:19 ../raster/r.rescale/get_range.c:25
+#, c-format
+msgid "Reading %s ..."
+msgstr ""
+
+#: ../raster/r.grow2/main.c:130
+msgid "Generates a raster map layer with contiguous areas grown by one cell."
+msgstr "Generează o hartă raster cu areale continuu dezvoltate după o singură celulă."
+
+#: ../raster/r.grow2/main.c:141
+msgid "Radius of buffer in raster cells"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:157
+msgid "Value to write for input cells which are non-NULL (-1 => NULL)"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:163
+msgid "Value to write for \"grown\" cells"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:212 ../raster/r.average/main.c:82
+#, c-format
+msgid "Error reading category file for <%s>"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:217
+#, c-format
+msgid "Error in reading color file for <%s>"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:301
+#, c-format
+msgid "Error writing category file for <%s>"
+msgstr ""
+
+#: ../raster/r.grow2/main.c:305
+#, c-format
+msgid "Error writing color file for <%s>"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:94
+msgid "Imports a binary MAT-File(v4) to a GRASS raster."
+msgstr "Importă un fișier binar MAT-File(v4) la un raster GRASS."
+
+#: ../raster/r.in.mat/main.c:103
+msgid "Name of an existing MAT-File(v4)"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:110
+msgid "Name for the output raster map (override)"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:115 ../raster/r.out.mat/main.c:81
+#: ../raster/r.out.tiff/r.out.tiff.c:136
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:3
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:3
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:3
+msgid "Verbose mode"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:168
+msgid "Reading MAT-File..."
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:194
+msgid "Array contains no data"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:199
+msgid "Array contains imaginary data"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:205
+msgid "Invalid array name"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:225
+msgid "Invalid 'map_name' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:235
+msgid "Error reading 'map_name' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:246
+msgid "Invalid 'map_northern_edge' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:255
+msgid "Invalid 'map_southern_edge' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:264
+msgid "Invalid 'map_eastern_edge' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:273
+msgid "Invalid 'map_western_edge' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:281
+msgid "Invalid 'map_title' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:291
+msgid "Error reading 'map_title' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:304
+msgid "Invalid 'map_data' array"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:330 ../raster/r.in.mat/main.c:468
+#: ../raster/r.in.mat/main.c:550
+msgid "Please contact the GRASS development team"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:335
+#, c-format
+msgid "Skipping unknown array '%s'"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:363
+#, c-format
+msgid "No 'map_data' array found in <%s>"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:370
+#, c-format
+msgid "Setting map name to <%s> which overrides <%s>"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:377
+#, c-format
+msgid "Setting map name to <%s>"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:381
+msgid "No 'map_name' array found; using <MatFile>"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:394
+msgid "Missing bound"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:398
+msgid "Using default bounds"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:414
+#, c-format
+msgid "Map <%s> bounds set to:"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:415 ../raster/r.out.mat/main.c:198
+#, c-format
+msgid "northern edge=%f"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:416 ../raster/r.out.mat/main.c:199
+#, c-format
+msgid "southern edge=%f"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:417 ../raster/r.out.mat/main.c:200
+#, c-format
+msgid "eastern edge=%f"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:418 ../raster/r.out.mat/main.c:201
+#, c-format
+msgid "western edge=%f"
+msgstr ""
+
+#: ../raster/r.in.mat/main.c:419 ../raster/r.out.mat/main.c:202
+#, c-format
+msgid "nsres=%f"
+msgstr "nsrez=%f"
+
+#: ../raster/r.in.mat/main.c:420 ../raster/r.out.mat/main.c:203
+#, c-format
+msgid "ewres=%f"
+msgstr "evrez=%f"
+
+#: ../raster/r.in.mat/main.c:421 ../raster/r.out.mat/main.c:204
+#, c-format
+msgid "rows=%d"
+msgstr "rânduri=%d"
+
+#: ../raster/r.in.mat/main.c:422 ../raster/r.out.mat/main.c:205
+#, c-format
+msgid "cols=%d"
+msgstr "coloane=%d"
+
+#: ../raster/r.in.mat/main.c:433
+msgid "Writing new raster map..."
+msgstr "Scrierea unei hărți raster noi..."
+
+#: ../raster/r.in.mat/main.c:491
+#, c-format
+msgid "Writing raster map, row %d"
+msgstr "Scrierea unei hărți raster noi, rândul %d"
+
+#: ../raster/r.surf.gauss/main.c:48
+msgid "GRASS module to produce a raster map layer of gaussian deviates whose mean and standard deviation can be expressed by the user. It uses a gaussian random number generator."
+msgstr "Modul GRASS pentru a produce o hartă raster a deviației gaussiene a căror deviație standard și medie pot fi exprimate de utilizator. Folosește o generare aleatorie gaussiană de numere."
+
+#: ../raster/r.surf.gauss/main.c:55
+msgid "Name of the output random surface"
+msgstr ""
+
+#: ../raster/r.surf.gauss/main.c:59
+msgid "Distribution mean"
+msgstr "Distribuția medie"
+
+#: ../raster/r.surf.gauss/main.c:65
+msgid "Standard deviation"
+msgstr "Deviația standard"
+
+#: ../raster/r.regression.line/main.c:44
+msgid "Calculates linear regression from two raster maps: y = a + b*x."
+msgstr "Calculează regresia lineară din două hărți raster: y = a + b*x."
+
+#: ../raster/r.regression.line/main.c:49
+msgid "Map for x coefficient"
+msgstr "Hartă pentru coeficientul x"
+
+#: ../raster/r.regression.line/main.c:53
+msgid "Map for y coefficient"
+msgstr "Hartă pentru coeficientul y"
+
+#: ../raster/r.regression.line/main.c:59
+msgid "ASCII file for storing regression coefficients (output to screen if file not specified)."
+msgstr ""
+
+#: ../raster/r.regression.line/main.c:63 ../general/g.region/main.c:150
+#: ../locale/scriptstrings/i.oif_to_translate.c:9
+msgid "Print in shell script style"
+msgstr ""
+
+#: ../raster/r.regression.line/main.c:67
+msgid "Slower but accurate (applies to FP maps only"
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:65
+msgid "Exports a GRASS raster to a binary MAT-File."
+msgstr "Exportă raster GRASS în fișier binar MAT-File."
+
+#: ../raster/r.out.mat/main.c:76
+msgid "Name for the output binary MAT-File"
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:137
+#, c-format
+msgid "Exporting <%s>"
+msgstr ""
+
+#: ../raster/r.out.mat/main.c:197
+msgid "Using the Current Region settings:"
+msgstr "Folosește setările regiunii curente:"
+
+#: ../raster/r.out.mat/main.c:272
+msgid "Exporting raster as integer values"
+msgstr "Exportă raster ca valori întregi"
+
+#: ../raster/r.out.mat/main.c:277
+msgid "Exporting raster as floating point values"
+msgstr "Exportă raster ca valori de puncte în virgulă mobilă"
+
+#: ../raster/r.out.mat/main.c:282
+msgid "Exporting raster as double FP values"
+msgstr "Exportă raster ca valori duble FP"
+
+#: ../raster/r.out.mat/main.c:325
+msgid "Reading in map ... "
+msgstr "Citirea în hartă ..."
+
+#: ../raster/r.out.mat/main.c:339
+msgid "Writing out map..."
+msgstr "Scrierea hărții..."
+
+#: ../raster/r.out.mat/main.c:399
+#, c-format
+msgid "%ld bytes written to '%s'"
+msgstr ""
+
+#: ../raster/r.fill.dir/wtrshed.c:94
+#, c-format
+msgid "wtrshed pass %d"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:86
+msgid "Filters and generates a depressionless elevation map and a flow direction map from a given elevation raster map."
+msgstr "Filtrează și generează o harta de elevație a depresiunilor și o hartă a direcției de scurgere dintr-un raster dat."
+
+#: ../raster/r.fill.dir/main.c:91
+msgid "Name of existing raster map containing elevation surface"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:98
+msgid "Output elevation raster map after filling"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:105
+msgid "Output direction raster map"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:112
+msgid "Output raster map of problem areas"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:119
+msgid "Output aspect direction format (agnps, answers, or grass)"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:127
+msgid "Find unresolved areas only"
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:212
+msgid "Reading map..."
+msgstr "Citirea hărții..."
+
+#: ../raster/r.fill.dir/main.c:220
+msgid "Filling sinks..."
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:224
+msgid "Determining flow directions for ambiguous cases..."
+msgstr ""
+
+#: ../raster/r.fill.dir/main.c:237
+msgid "Repeat to get the final directions..."
+msgstr ""
+
+#: ../raster/r.fill.dir/resolve.c:135
+#, c-format
+msgid "Downward pass %d"
+msgstr ""
+
+#: ../raster/r.fill.dir/resolve.c:172
+#, c-format
+msgid "Upward pass %d"
+msgstr ""
+
+#: ../raster/r.fill.dir/dopolys.c:83
+#, c-format
+msgid "Found %d unresolved areas"
+msgstr ""
+
+#: ../raster/r.walk/main.c:179
+msgid "Outputs a raster map layer showing the anisotropic cumulative cost of moving between different geographic locations on an input elevation raster map layer whose cell category values represent elevation combined with an input raster map layer whose cell values represent friction cost."
+msgstr "Crează o hartă raster care arată costul cumulat anisotropic al deplasării dintre locații geografice diferite pe o hartă raster de elevație ale cărui celule are valori ce reprezintă elevația combinată cu stratul raster de intrare, cel din urmă având valori ale celulelor ce reprezintă costul de frecare."
+
+#: ../raster/r.walk/main.c:191
+msgid "Name of elevation input raster map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:199
+msgid "Name of input raster map containing friction costs"
+msgstr ""
+
+#: ../raster/r.walk/main.c:221
+msgid "Starting points vector map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:228
+msgid "Stop points vector map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:236
+msgid "The map E and N grid coordinates of a starting point (E,N)"
+msgstr ""
+
+#: ../raster/r.walk/main.c:244
+msgid "The map E and N grid coordinates of a stopping point (E,N)"
+msgstr ""
+
+#: ../raster/r.walk/main.c:252
+msgid "An optional maximum cumulative cost"
+msgstr ""
+
+#: ../raster/r.walk/main.c:277
+msgid "Number of the segment to create (segment library)"
+msgstr ""
+
+#: ../raster/r.walk/main.c:287
+msgid "Coefficients for walking energy formula parameters a,b,c,d"
+msgstr ""
+
+#: ../raster/r.walk/main.c:296
+msgid "Lambda coefficients for combining walking energy and friction cost"
+msgstr ""
+
+#: ../raster/r.walk/main.c:305
+msgid "Slope factor determines travel energy cost per height step"
+msgstr ""
+
+#: ../raster/r.walk/main.c:314
+msgid "Keep null values in output map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:377
+#, c-format
+msgid "Missing required value: got %d instead of 4"
+msgstr ""
+
+#: ../raster/r.walk/main.c:381
+#, c-format
+msgid "Walking costs are a=%lf b=%lf c=%lf d=%lf"
+msgstr ""
+
+#: ../raster/r.walk/main.c:386 ../raster/r.walk/main.c:394
+#: ../raster/r.walk/main.c:401
+#, c-format
+msgid "Missing required value: %d"
+msgstr ""
+
+#: ../raster/r.walk/main.c:389
+#, c-format
+msgid "Lambda is %lf"
+msgstr ""
+
+#: ../raster/r.walk/main.c:397
+#, c-format
+msgid "Slope_factor is %lf"
+msgstr ""
+
+#: ../raster/r.walk/main.c:404
+#, c-format
+msgid "Nseg is %d"
+msgstr ""
+
+#: ../raster/r.walk/main.c:410
+msgid "Null cells excluded from cost evaluation."
+msgstr ""
+
+#: ../raster/r.walk/main.c:414
+msgid "Input null cell will be retained into output map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:426
+#, c-format
+msgid "Unable to find starting vector <%s> "
+msgstr ""
+
+#: ../raster/r.walk/main.c:473
+#, c-format
+msgid "Unable to find stop vector <%s>"
+msgstr ""
+
+#: ../raster/r.walk/main.c:512
+msgid "Warning: assigning negative cost to null cell. Null cells excluded."
+msgstr ""
+
+#: ../raster/r.walk/main.c:584 ../raster/r.walk/main.c:586
+#, c-format
+msgid "Unable to read %s"
+msgstr ""
+
+#: ../raster/r.walk/main.c:591
+msgid "Map with different projection"
+msgstr ""
+
+#: ../raster/r.walk/main.c:603
+msgid "DTM_Source map is: Integer cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:606
+msgid "DTM_Source map is: Floating point (float) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:609
+msgid "DTM_Source map is: Floating point (double) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:612 ../raster/r.walk/main.c:627
+#: ../raster/r.walk/main.c:664
+#, c-format
+msgid " %d rows, %d cols"
+msgstr " %d rânduri, %d coloane"
+
+#: ../raster/r.walk/main.c:618
+msgid "COST_Source map is: Integer cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:621
+msgid "COST_Source map is: Floating point (float) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:624
+msgid "COST_Source map is: Floating point (double) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:655
+msgid "Output map is: Integer cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:658
+msgid "Output map is: Floating point (float) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:661
+msgid "Output map is: Floating point (double) cell type"
+msgstr ""
+
+#: ../raster/r.walk/main.c:666
+#, c-format
+msgid " EW resolution %s (%lf)"
+msgstr "Rezoluția EV %s (%lf)"
+
+#: ../raster/r.walk/main.c:668
+#, c-format
+msgid " NS resolution %s (%lf)"
+msgstr "Rezoluția NS %s (%lf)"
+
+#: ../raster/r.walk/main.c:852
+msgid "Initializing output "
+msgstr ""
+
+#: ../raster/r.walk/main.c:860 ../raster/r.walk/main.c:889
+msgid "Unable to allocate memory for segment fbuff == NULL"
+msgstr ""
+
+#: ../raster/r.walk/main.c:917
+#, c-format
+msgid "Raster output map <%s> not found (no start_points given)"
+msgstr ""
+
+#: ../raster/r.walk/main.c:932
+#, c-format
+msgid "Memory allocation error on reading start points from raster map %s"
+msgstr ""
+
+#: ../raster/r.walk/main.c:935
+#, c-format
+msgid "Reading %s... "
+msgstr "Citirea %s... "
+
+#: ../raster/r.walk/main.c:999
+msgid "Finding cost path"
+msgstr ""
+
+#: ../raster/r.walk/main.c:1471
+msgid "End of map!"
+msgstr ""
+
+#: ../raster/r.walk/main.c:1497
+#, c-format
+msgid "Writing output raster map %s... "
+msgstr ""
+
+#: ../raster/r.walk/main.c:1501
+msgid "Will copy input map null values into output map"
+msgstr ""
+
+#: ../raster/r.walk/main.c:1508
+msgid ""
+"Integer cell type.\n"
+"Writing..."
+msgstr ""
+
+#: ../raster/r.walk/main.c:1543
+msgid ""
+"Float cell type.\n"
+"Writing..."
+msgstr ""
+
+#: ../raster/r.walk/main.c:1578
+msgid ""
+"Double cell type.\n"
+"Writing..."
+msgstr ""
+
+#: ../raster/r.walk/main.c:1628
+#, c-format
+msgid "Peak cost value: %f"
+msgstr ""
+
+#: ../raster/r.his/main.c:63
+msgid "raster, color transformation"
+msgstr "raster, transformare de culoare"
+
+#: ../raster/r.his/main.c:65
+msgid "Generates red, green and blue raster map layers combining hue, intensity and saturation (HIS) values from user-specified input raster map layers."
+msgstr "Generează straturi raster roșu, verde, albastru în combinație cu valorile nuanței, intensității și saturației (HIS) dintr-un strat raster specificat de utilizator."
+
+#: ../raster/r.his/main.c:74 ../display/d.his/main.c:76
+msgid "Name of layer to be used for HUE"
+msgstr "Numele stratului care va fi folosit pentru NUANȚĂ"
+
+#: ../raster/r.his/main.c:81 ../display/d.his/main.c:83
+msgid "Name of layer to be used for INTENSITY"
+msgstr "Numele stratului care va fi folosit pentru INTENSITATE"
+
+#: ../raster/r.his/main.c:88 ../display/d.his/main.c:90
+msgid "Name of layer to be used for SATURATION"
+msgstr "Numele stratului care va fi folosit pentru SATURAÈšIE"
+
+#: ../raster/r.his/main.c:95
+msgid "Name of output layer to be used for RED"
+msgstr "Numele stratului care va fi folosit pentru ROȘU"
+
+#: ../raster/r.his/main.c:102
+msgid "Name of output layer to be used for GREEN"
+msgstr "Numele stratului care va fi folosit pentru VERDE"
+
+#: ../raster/r.his/main.c:109
+msgid "Name of output layer to be used for BLUE"
+msgstr "Numele stratului care va fi folosit pentru ALBASTRU"
+
+#: ../raster/r.his/main.c:113 ../display/d.his/main.c:101
+msgid "Respect NULL values while drawing"
+msgstr "Respectă valorile NULE în timpul desenării"
+
+#: ../raster/r.his/main.c:243
+msgid "Error reading 'hue' map"
+msgstr "Eroare în citirea hărții de 'nuanță' "
+
+#: ../raster/r.his/main.c:247
+msgid "Error reading 'intensity' map"
+msgstr "Eroare în citirea hărții de 'intensitate' "
+
+#: ../raster/r.his/main.c:251
+msgid "Error reading 'saturation' map"
+msgstr "Eroare în citirea hărții de 'saturație' "
+
+#: ../raster/r.thin/io.c:105
+#, c-format
+msgid "File %s -- %d rows X %d columns"
+msgstr "Fișier %s -- %d rânduri X %d coloane"
+
+#: ../raster/r.thin/io.c:115
+#, c-format
+msgid "%s: Unable to create temporary file <%s> -- errno = %d"
+msgstr "%s: Imposibil de creat fișier temporar <%s> -- errno = %d"
+
+#: ../raster/r.thin/io.c:124 ../raster/r.thin/io.c:136
+#: ../raster/r.thin/io.c:147
+#, c-format
+msgid "%s: Error writing temporary file"
+msgstr "%s: Eroare în scrierea fișierului temporar"
+
+#: ../raster/r.thin/io.c:131
+#, c-format
+msgid "%s: Error reading from raster map <%s> in mapset <%s>"
+msgstr "%s: Eroare în citirea din harta raster <%s> din mapset-ul <%s>"
+
+#: ../raster/r.thin/io.c:173
+#, c-format
+msgid "Output file %d rows X %d columns"
+msgstr "Fișierul de ieșire %d rânduri X %d coloane"
+
+#: ../raster/r.thin/io.c:174
+#, c-format
+msgid "Window %d rows X %d columns"
+msgstr "Fereastra %d rânduri X %d coloane"
+
+#: ../raster/r.thin/main.c:55
+msgid "raster, thin"
+msgstr "raster, subțiere"
+
+#: ../raster/r.thin/main.c:57
+msgid "Thins non-zero cells that denote linear features in a raster map."
+msgstr "Subțiază celulele ne-nule care par că aparțin trăsăturilor lineare dintr-o hartă raster."
+
+#: ../raster/r.thin/main.c:69
+msgid "Maximal number of iterations"
+msgstr "Număr maxim de iterații"
+
+#: ../raster/r.thin/thin_lines.c:67
+#, c-format
+msgid "%s: Unable to find bounding box for lines"
+msgstr "%s: Imposibil de găsit caseta de încadrare pentru linii"
+
+#: ../raster/r.thin/thin_lines.c:70
+#, c-format
+msgid "Bounding box:  l = %d, r = %d, t = %d, b = %d"
+msgstr "Caseta de încadrare:  s = %d, d = %d, s = %d, j = %d"
+
+#: ../raster/r.thin/thin_lines.c:119
+#, c-format
+msgid "Pass number %d"
+msgstr ""
+
+#: ../raster/r.thin/thin_lines.c:170
+#, c-format
+msgid "Deleted %d  pixels "
+msgstr "Pixeli șterși %d  "
+
+#: ../raster/r.thin/thin_lines.c:174
+msgid "Thinning completed successfully."
+msgstr "Subțiere finalizată cu succes."
+
+#: ../raster/r.thin/thin_lines.c:176
+msgid "Thinning not completed, consider to increase 'iterations' parameter."
+msgstr "Subțierea nu a fost finalizată, se consideră ca trebuie crescut parametrul de 'itinerații' "
+
+#: ../raster/r.to.rast3/main.c:58 ../raster/r.to.rast3elev/main.c:183
+msgid "Could not close the map"
+msgstr "Nu s-a putut închide harta"
+
+#: ../raster/r.to.rast3/main.c:77
+#, fuzzy
+msgid "2d raster maps which represent the slices"
+msgstr "hărți raster 2d care reprezint felii/părți"
+
+#: ../raster/r.to.rast3/main.c:83
+msgid "Use 3D raster mask (if exists) with output map"
+msgstr "Utilizați mască raster 3D (dacă există) cu hartă de ieșire"
+
+#: ../raster/r.to.rast3/main.c:117
+msgid "Could not get raster row"
+msgstr "Nu s-a putut obține rândul raster"
+
+#: ../raster/r.to.rast3/main.c:194
+msgid "raster, volume, conversion"
+msgstr "raster, volum, conversie"
+
+#: ../raster/r.to.rast3/main.c:196
+#, fuzzy
+msgid "Converts 2D raster map slices to one 3D raster volume map."
+msgstr "Convertește părți de hărți raster 2D într-o hartă raster de volum 3D."
+
+#: ../raster/r.to.rast3/main.c:208
+msgid "No output map"
+msgstr "Nici o hartă de ieșire"
+
+#: ../raster/r.to.rast3/main.c:222 ../raster/r.to.rast3elev/main.c:462
+msgid "The 2D and 3D region settings are different. I will use the 3D region settings to adjust the 2D region."
+msgstr "Setările regiunilor 2D și 3D sunt diferite. Vor fi utilizate parametrii regiunii 3D pentru ajustarea regiunii 2D."
+
+#: ../raster/r.to.rast3/main.c:239 ../raster3d/r3.cross.rast/main.c:349
+#: ../raster3d/r3.to.rast/main.c:302
+msgid "Illegal output file name"
+msgstr "Nume de fișier ilegal"
+
+#: ../raster/r.to.rast3/main.c:260
+msgid "Cell file not found"
+msgstr "Fișierul de celule nu a fost găsit"
+
+#: ../raster/r.to.rast3/main.c:268
+#, c-format
+msgid "Open raster map %s - one time for each depth (%d/%d)"
+msgstr "Deschide harta raster %s - o dată pentru fiecare adâncime (%d/%d)"
+
+#: ../raster/r.to.rast3/main.c:281
+msgid "Input maps have to be from the same type. CELL, FCELL or DCELL!"
+msgstr "Hărțile de intrare trebuie să fie de același tip. CELL, FCELL sau DCELL!"
+
+#: ../raster/r.to.rast3/main.c:285 ../raster/r.to.rast3elev/main.c:498
+msgid "Creating 3D raster map"
+msgstr "Crearea hărții raster 3D"
+
+#: ../raster/r.to.rast3/main.c:309 ../raster/r.to.rast3elev/main.c:483
+msgid "Error opening 3d raster map"
+msgstr "Eroare în deschiderea hărții raster 3d"
+
+#: ../raster/r.to.rast3/main.c:341 ../raster/r.to.rast3elev/main.c:546
+msgid "Error closing 3d raster map"
+msgstr "Eroare în închiderea hărții raster 3d"
+
+#: ../raster/r.to.rast3/main.c:378 ../raster/r.to.rast3elev/main.c:171
+msgid "Unable to close input map"
+msgstr "Imposibil de închis harta de intrare"
+
+#: ../raster/r.surf.idw2/main.c:61
+msgid "Surface generation program."
+msgstr "Program pentru generarea suprafeței."
+
+#: ../raster/r.surf.idw2/main.c:80
+msgid "Lat/long databases not supported by r.surf.idw2. Use r.surf.idw instead!"
+msgstr "Baza de date lat/long nu este acceptată de r.surf.idw2. Utilizați r.surf.idw!"
+
+#: ../raster/r.surf.idw2/main.c:87 ../vector/v.surf.idw/main.c:141
+#, c-format
+msgid "%s=%s - illegal number of interpolation points"
+msgstr "%s=%s - număr ilegal de puncte de interpolare"
+
+#: ../raster/r.surf.idw2/main.c:96
+#, c-format
+msgid "%s: no data points found"
+msgstr "%s: datele punctuale nu au fost găsite"
+
+#: ../raster/r.surf.idw2/main.c:114
+#, c-format
+msgid "Interpolating raster map <%s>... %d rows... "
+msgstr "Interpolarea hărții raster <%s>... %d rânduri... "
+
+#: ../raster/r.surf.idw2/main.c:123
+msgid "Cannot get row"
+msgstr "Nu s-a putut obține rândul"
+
+#: ../raster/r.resamp.rst/main.c:156 ../raster/r.resamp.stats/main.c:259
+#: ../raster/r.resamp.interp/main.c:72 ../raster/r.bilinear/main.c:42
+#: ../raster/r.resample/main.c:54
+msgid "raster, resample"
+msgstr "raster, reeșantionare"
+
+#: ../raster/r.resamp.rst/main.c:158
+msgid "Reinterpolates and optionally computes topographic analysis from input raster map to a new raster map (possibly with different resolution) using regularized spline with tension and smoothing."
+msgstr "Reinterpolează și opțional calculează analiza topografică de la harta raster de intrare la noua hartă raster (posibil cu rezoluție diferită) folosind metoda regularized spline with tension și netezirea."
+
+#: ../raster/r.resamp.rst/main.c:169
+msgid "Desired east-west resolution"
+msgstr "Rezoluția est-vest dorită"
+
+#: ../raster/r.resamp.rst/main.c:175
+msgid "Desired north-south resolution"
+msgstr "Rezoluția nord-sud dorită"
+
+#: ../raster/r.resamp.rst/main.c:182
+msgid "Output z-file (elevation) map"
+msgstr "Stratul Z (altitudine) rezultat"
+
+#: ../raster/r.resamp.rst/main.c:190
+msgid "Output slope map (or fx)"
+msgstr "Stratul pantei rezultat (sau fx)"
+
+#: ../raster/r.resamp.rst/main.c:198
+msgid "Output aspect map (or fy)"
+msgstr "Stratul orientării rezultat (sau fy)"
+
+#: ../raster/r.resamp.rst/main.c:206
+msgid "Output profile curvature map (or fxx)"
+msgstr "Stratul curburii în profil rezultat (sau fxx)"
+
+#: ../raster/r.resamp.rst/main.c:214
+msgid "Output tangential curvature map (or fyy)"
+msgstr "Stratul curburii tangențiale rezultat (sau fyy)"
+
+#: ../raster/r.resamp.rst/main.c:222
+msgid "Output mean curvature map (or fxy)"
+msgstr "Stratul curburii medii rezultat (sau fxy)"
+
+#: ../raster/r.resamp.rst/main.c:230
+msgid "Name of raster map containing smoothing"
+msgstr "Numele hărții raster care conține netezirea"
+
+#: ../raster/r.resamp.rst/main.c:231 ../raster/r.resamp.rst/main.c:239
+#: ../raster/r.resamp.rst/main.c:247 ../raster/r.resamp.rst/main.c:255
+#: ../raster/r.resamp.rst/main.c:263 ../raster/r.slope.aspect/main.c:181
+#: ../raster/r.slope.aspect/main.c:191 ../raster/r.slope.aspect/main.c:249
+#: ../raster/r.slope.aspect/main.c:258 ../raster/r.slope.aspect/main.c:269
+#: ../raster/r.in.bin/main.c:251 ../raster/r.in.bin/main.c:256
+#: ../raster/r.in.bin/main.c:285 ../raster/r.in.bin/main.c:346
+#: ../general/g.mapset/main.c:58 ../general/g.mapset/main.c:66
+#: ../general/g.mapset/main.c:76 ../db/base/connect.c:62
+#: ../db/base/connect.c:66 ../db/base/connect.c:77 ../db/base/connect.c:87
+#: ../imagery/i.cluster/main.c:105 ../imagery/i.cluster/main.c:121
+#: ../imagery/i.cluster/main.c:129 ../imagery/i.cluster/main.c:138
+#: ../imagery/i.cluster/main.c:146 ../imagery/i.cluster/main.c:154
+#: ../imagery/i.landsat.toar/main.c:152 ../imagery/i.landsat.toar/main.c:161
+#: ../imagery/i.landsat.toar/main.c:171 ../imagery/i.landsat.toar/main.c:180
+#: ../vector/v.vol.rst/main.c:261 ../vector/v.vol.rst/main.c:269
+#: ../vector/v.vol.rst/main.c:277 ../vector/v.vol.rst/main.c:310
+#: ../vector/v.vol.rst/main.c:319 ../vector/v.vol.rst/main.c:328
+#: ../vector/v.vol.rst/main.c:337 ../vector/v.vol.rst/main.c:346
+#: ../vector/v.vol.rst/main.c:354 ../vector/v.surf.idw/main.c:115
+#: ../vector/v.surf.idw/main.c:123 ../vector/v.surf.idw/main.c:131
+#: ../vector/lidar/v.surf.bspline/main.c:120
+#: ../vector/lidar/v.surf.bspline/main.c:129
+#: ../vector/lidar/v.surf.bspline/main.c:138
+#: ../vector/lidar/v.surf.bspline/main.c:146
+#: ../vector/lidar/v.surf.bspline/main.c:153
+#: ../vector/lidar/v.surf.bspline/main.c:160
+#: ../vector/lidar/v.lidar.edgedetection/main.c:99
+#: ../vector/lidar/v.lidar.edgedetection/main.c:108
+#: ../vector/lidar/v.lidar.edgedetection/main.c:117
+#: ../vector/lidar/v.lidar.edgedetection/main.c:126
+#: ../vector/lidar/v.lidar.edgedetection/main.c:135
+#: ../vector/lidar/v.lidar.edgedetection/main.c:143
+#: ../vector/lidar/v.lidar.edgedetection/main.c:152
+#: ../vector/v.db.connect/main.c:60 ../vector/v.db.connect/main.c:65
+msgid "Settings"
+msgstr "Setări"
+
+#: ../raster/r.resamp.rst/main.c:238
+msgid "Name of raster map to be used as mask"
+msgstr "Numele hărții raster care va fi utilizată ca mască"
+
+#: ../raster/r.resamp.rst/main.c:246
+msgid "Rows/columns overlap for segmentation"
+msgstr "Rândurile/ coloanele se suprapun pentru segementare"
+
+#: ../raster/r.resamp.rst/main.c:254
+msgid "Multiplier for z-values"
+msgstr "Multiplicator pentru valorile Z"
+
+#: ../raster/r.resamp.rst/main.c:262
+msgid "Spline tension value"
+msgstr "Valoarea spline tension"
+
+#: ../raster/r.resamp.rst/main.c:269
+msgid "Anisotropy angle (in degrees)"
+msgstr "Unghiul de anizotropie (în grade)"
+
+#: ../raster/r.resamp.rst/main.c:270 ../raster/r.resamp.rst/main.c:277
+msgid "Anisotropy"
+msgstr "Anizotropie"
+
+#: ../raster/r.resamp.rst/main.c:276 ../vector/v.surf.rst/main.c:382
+msgid "Anisotropy scaling factor"
+msgstr "Factorul de scalare anizotropic"
+
+#: ../raster/r.resamp.rst/main.c:281
+msgid "Use dnorm independent tension"
+msgstr "Folosește o tensiune independentă dnorm"
+
+#: ../raster/r.resamp.rst/main.c:286 ../vector/v.surf.rst/main.c:209
+msgid "Output partial derivatives instead of topographic parameters"
+msgstr "Afișează derivate parțiale în loc de parametrii topografici"
+
+#: ../raster/r.resamp.rst/main.c:293 ../general/g.setproj/main.c:107
+msgid "Retrieving and setting region failed"
+msgstr "Recuperarea și configurarea regiunii au eșuat"
+
+#: ../raster/r.resamp.rst/main.c:321
+msgid "Cannot read ew_res value"
+msgstr "Nu s-a putut citi valoarea ew_res"
+
+#: ../raster/r.resamp.rst/main.c:324
+msgid "Cannot read ns_res value"
+msgstr "Nu s-a putut citi valoarea ns_res"
+
+#: ../raster/r.resamp.rst/main.c:327
+msgid "Invalid value for tension"
+msgstr "Valoare nevalidă pentru tensiune"
+
+#: ../raster/r.resamp.rst/main.c:330
+msgid "Invalid value for zmult"
+msgstr "Valoare nevalidă pentru zmult"
+
+#: ../raster/r.resamp.rst/main.c:333
+msgid "Invalid value for overlap"
+msgstr "Valoare nevalidă pentru acoperire"
+
+#: ../raster/r.resamp.rst/main.c:337
+msgid "Invalid value for theta"
+msgstr "Valoare nevalidă pentru theta"
+
+#: ../raster/r.resamp.rst/main.c:341
+msgid "Invalid value for scalex"
+msgstr "Valoare nevalidă pentru scalex"
+
+#: ../raster/r.resamp.rst/main.c:343
+msgid "When using anisotropy both theta and scalex must be specified"
+msgstr "Când utilizați anizotropia trebuie specificate theta și scalex"
+
+#: ../raster/r.resamp.rst/main.c:366 ../vector/v.surf.rst/main.c:520
+msgid "Not enough memory for az"
+msgstr "Memorie insuficientă pentru az"
+
+#: ../raster/r.resamp.rst/main.c:371 ../vector/v.surf.rst/main.c:525
+msgid "Not enough memory for adx"
+msgstr "Memorie insuficientă pentru adx"
+
+#: ../raster/r.resamp.rst/main.c:375 ../vector/v.surf.rst/main.c:529
+msgid "Not enough memory for ady"
+msgstr "Memorie insuficientă pentru ady"
+
+#: ../raster/r.resamp.rst/main.c:380 ../vector/v.surf.rst/main.c:534
+msgid "Not enough memory for adxx"
+msgstr "Memorie insuficientă pentru adxx"
+
+#: ../raster/r.resamp.rst/main.c:384 ../vector/v.surf.rst/main.c:538
+msgid "Not enough memory for adyy"
+msgstr "Memorie insuficientă pentru adyy"
+
+#: ../raster/r.resamp.rst/main.c:388 ../vector/v.surf.rst/main.c:542
+msgid "Not enough memory for adxy"
+msgstr "Memorie insuficientă pentru adxy"
+
+#: ../raster/r.resamp.rst/main.c:405 ../raster/r.resamp.rst/main.c:428
+#: ../raster/r.los/main.c:177 ../raster/r.los/main.c:182
+#, c-format
+msgid "[%s]: Cannot read map header"
+msgstr "[%s]: Nu s-a putut citi antetul hărții"
+
+#: ../raster/r.resamp.rst/main.c:408
+#, c-format
+msgid "[%s]: Map is the wrong resolution"
+msgstr "[%s]: Harta are rezoluția greșită"
+
+#: ../raster/r.resamp.rst/main.c:416
+msgid "Smoothing values can not be negative or NULL"
+msgstr "Valorile de netezire nu pot avea valori negative sau NULE"
+
+#: ../raster/r.resamp.rst/main.c:431
+msgid "Input map resolution differs from current region resolution!"
+msgstr "Rezoluția din stratul de intrare nu se potrivește cu rezoluția regiunii curente!"
+
+#: ../raster/r.resamp.rst/main.c:451
+msgid "Processing all selected output files will require"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:452
+#, c-format
+msgid "%d bytes of disk space for temp files."
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:477
+#, c-format
+msgid "Cannot get row %d (error = %d)"
+msgstr "Nu s-a putut obține rândul %d (eroare = %d)"
+
+#: ../raster/r.resamp.rst/main.c:487
+msgid "Maximum value of a raster map is NULL."
+msgstr "Valoarea maximă a hărții raster este NULĂ."
+
+#: ../raster/r.resamp.rst/main.c:515
+msgid "Temporarily changing the region to desired resolution ..."
+msgstr "Configurarea temporară a regiunii la rezoluția dorită ..."
+
+#: ../raster/r.resamp.rst/main.c:521
+msgid "Changing back to the original region ..."
+msgstr "ÃŽnapoi la regiune original ..."
+
+#: ../raster/r.resamp.rst/main.c:523
+msgid "Cannot set region to back to the initial region !!!"
+msgstr "Nu s-a putut reconfigura regiune pe regiune inițială!"
+
+#: ../raster/r.resamp.rst/main.c:527 ../raster/r.resample/main.c:137
+#: ../vector/v.surf.rst/main.c:622 ../vector/v.surf.rst/main.c:773
+msgid "Percent complete: "
+msgstr "Procent complet:"
+
+#: ../raster/r.resamp.rst/main.c:539
+#, c-format
+msgid "dnorm in mainc after grid before out1= %f"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:556
+#, c-format
+msgid "dnorm in mainc after grid before out2= %f"
+msgstr ""
+
+#: ../raster/r.resamp.rst/main.c:607 ../vector/v.surf.rst/main.c:638
+msgid "Not enough memory for zero_array_cell"
+msgstr "Memorie insuficientă pentru zero_array_cell"
+
+#: ../raster/r.resamp.rst/main.c:622 ../raster/r.resamp.rst/main.c:635
+#: ../raster/r.resamp.rst/main.c:648 ../raster/r.resamp.rst/main.c:662
+#: ../raster/r.resamp.rst/main.c:675 ../raster/r.resamp.rst/main.c:688
+#: ../vector/v.surf.rst/main.c:650 ../vector/v.surf.rst/main.c:659
+#: ../vector/v.surf.rst/main.c:668 ../vector/v.surf.rst/main.c:678
+#: ../vector/v.surf.rst/main.c:687 ../vector/v.surf.rst/main.c:696
+msgid "Not enough disk space -- cannot write files"
+msgstr "Nu este suficient spațiu pe disc -- nu s-a putut scrie fișierele"
+
+#: ../raster/r.carve/main.c:78
+msgid "Takes vector stream data, transforms it to raster and subtracts depth from the output DEM."
+msgstr "Sunt luate datele vectoriale privind cursul de apă, le transformă în raster și scade adâncimea dintr-un DEM."
+
+#: ../raster/r.carve/main.c:83
+msgid "Name of input raster elevation map"
+msgstr "Numele rasterului sursă pentru altitudine "
+
+#: ../raster/r.carve/main.c:88
+msgid "Name of vector input map containing stream(s)"
+msgstr ""
+
+#: ../raster/r.carve/main.c:96
+msgid "Name for output vector map for adjusted stream points"
+msgstr ""
+
+#: ../raster/r.carve/main.c:101
+msgid "Stream width (in meters). Default is raster cell width"
+msgstr ""
+
+#: ../raster/r.carve/main.c:107
+msgid "Additional stream depth (in meters)"
+msgstr ""
+
+#: ../raster/r.carve/main.c:111
+msgid "No flat areas allowed in flow direction"
+msgstr ""
+
+#: ../raster/r.carve/main.c:148
+#, c-format
+msgid "Invalid width value '%s' - using default."
+msgstr "Valoare lățimii nevalidă '%s' - utilizare implicită."
+
+#: ../raster/r.carve/main.c:162
+#, c-format
+msgid "Invalid depth value '%s' - using default."
+msgstr "Valoare adâncimii nevalidă '%s' - utilizare implicită."
+
+#: ../raster/r.carve/main.c:231
+msgid "lat/lon projection not supported at this time."
+msgstr "proiecția lat/lon nu este acceptată in acest moment."
+
+#: ../raster/r.carve/enforce_ds.c:81
+msgid "Processing lines... "
+msgstr "Procesarea liniilor..."
+
+#: ../raster/r.carve/enforce_ds.c:173
+msgid "Vect runs out of region and re-enters - this case is not yet implemented."
+msgstr ""
+
+#: ../raster/r.carve/lobf.c:74
+msgid "trying to divide by zero...no unique solution for system...skipping..."
+msgstr ""
+
+#: ../raster/r.carve/raster.c:12 ../raster/r.texture/main.c:261
+#: ../raster/r.out.tiff/r.out.tiff.c:283 ../imagery/i.zc/main.c:167
+msgid "Reading raster map..."
+msgstr "Citirea hărții raster...."
+
+#: ../raster/r.rescale/main.c:52
+msgid "Rescales the range of category values in a raster map layer."
+msgstr "Redimensionează seria de valori pentru un strat raster."
+
+#: ../raster/r.rescale/main.c:95
+msgid "Quietly"
+msgstr ""
+
+#: ../raster/r.rescale/main.c:141
+#, c-format
+msgid "Rescale %s[%ld,%ld] to %s[%ld,%ld]"
+msgstr "Rescalare %s[%ld,%ld] to %s[%ld,%ld]"
+
+#: ../raster/r.resamp.stats/main.c:261
+msgid "Resamples raster map layers to a coarser grid using aggregation."
+msgstr "Re-eșanționează straturi raster într-un grid mai grosier folosind agregarea."
+
+#: ../raster/r.resamp.stats/main.c:271
+msgid "Aggregation method"
+msgstr "Metoda de agregare"
+
+#: ../raster/r.resamp.stats/main.c:281
+msgid "Weight according to area (slower)"
+msgstr ""
+
+#: ../raster/r.resamp.stats/main.c:374 ../raster/r.resamp.interp/main.c:320
+#, c-format
+msgid "Unable to read color table for %s"
+msgstr "Imposibil de citit tabelul de culoare pentru %s"
+
+#: ../raster/r.resamp.stats/main.c:378 ../raster/r.resamp.interp/main.c:323
+#, c-format
+msgid "Unable to write color table for %s"
+msgstr "Imposibil de scris tabelul de culoare pentru %s"
+
+#: ../raster/r.cross/main.c:77
+msgid "Creates a cross product of the category values from multiple raster map layers."
+msgstr "Crează produse intersectate a categoriilor de valori din straturi multiple de rastere."
+
+#: ../raster/r.cross/main.c:86
+#, c-format
+msgid "Names of 2-%d input raster maps"
+msgstr "Numele a două 2-%d hărți raster de intrare"
+
+#: ../raster/r.cross/main.c:95
+msgid "Non-zero data only"
+msgstr "Doar datele nenule"
+
+#: ../raster/r.cross/main.c:122
+#, c-format
+msgid "More than %d files not allowed"
+msgstr "Mai mult de %d fișiere nu sunt permise"
+
+#: ../raster/r.cross/main.c:140
+msgid "Must specify 2 or more input maps"
+msgstr "Trebuie specificate 2 sau mai multe hărți de intrare"
+
+#: ../raster/r.cross/main.c:161
+#, c-format
+msgid "%s: STEP 2 ..."
+msgstr "%s: PASUL 2 ..."
+
+#: ../raster/r.cross/main.c:204
+#, c-format
+msgid "%ld categories"
+msgstr "%ld categorii"
+
+#: ../raster/r.cross/renumber.c:32
+#, c-format
+msgid "%s: STEP 3 ... "
+msgstr "%s: PASUL 3 ..."
+
+#: ../raster/r.cross/cross.c:52
+#, c-format
+msgid "%s: STEP 1 ... "
+msgstr "%s: PASUL 1 ..."
+
+#: ../raster/r.texture/main.c:76
+msgid "Generate images with textural features from a raster map."
+msgstr "Generează imagini cu trăsături texturale dintr-o hartă raster."
+
+#: ../raster/r.texture/main.c:87
+msgid "Prefix for output raster map(s)"
+msgstr "Prefix pentru harta raster de ieșire"
+
+#: ../raster/r.texture/main.c:94
+msgid "The size of sliding window (odd and >= 3)"
+msgstr ""
+
+#: ../raster/r.texture/main.c:104
+msgid "The distance between two samples (>= 1)"
+msgstr ""
+
+#: ../raster/r.texture/main.c:122
+msgid "Angular Second Moment"
+msgstr ""
+
+#: ../raster/r.texture/main.c:123 ../raster/r.texture/main.c:128
+#: ../raster/r.texture/main.c:133 ../raster/r.texture/main.c:138
+#: ../raster/r.texture/main.c:143 ../raster/r.texture/main.c:148
+#: ../raster/r.texture/main.c:153 ../raster/r.texture/main.c:158
+#: ../raster/r.texture/main.c:163 ../raster/r.texture/main.c:168
+#: ../raster/r.texture/main.c:173 ../raster/r.texture/main.c:178
+#: ../raster/r.texture/main.c:183 ../raster/r.texture/main.c:188
+msgid "Features"
+msgstr "Trăsături"
+
+#: ../raster/r.texture/main.c:127
+msgid "Contrast"
+msgstr "Contrast"
+
+#: ../raster/r.texture/main.c:132
+msgid "Correlation"
+msgstr "Corelație"
+
+#: ../raster/r.texture/main.c:137
+msgid "Variance"
+msgstr "Varianță"
+
+#: ../raster/r.texture/main.c:142
+msgid "Inverse Diff Moment"
+msgstr ""
+
+#: ../raster/r.texture/main.c:147
+msgid "Sum Average"
+msgstr ""
+
+#: ../raster/r.texture/main.c:152
+msgid "Sum Variance"
+msgstr ""
+
+#: ../raster/r.texture/main.c:157
+msgid "Sum Entropy"
+msgstr ""
+
+#: ../raster/r.texture/main.c:162
+msgid "Entropy"
+msgstr ""
+
+#: ../raster/r.texture/main.c:167
+msgid "Difference Variance"
+msgstr ""
+
+#: ../raster/r.texture/main.c:172
+msgid "Difference Entropy"
+msgstr ""
+
+#: ../raster/r.texture/main.c:177
+msgid "Measure of Correlation-1"
+msgstr ""
+
+#: ../raster/r.texture/main.c:182
+msgid "Measure of Correlation-2"
+msgstr ""
+
+#: ../raster/r.texture/main.c:187
+msgid "Max Correlation Coeff"
+msgstr ""
+
+#: ../raster/r.texture/main.c:216
+msgid "Nothing to compute. Use at least one of the flags."
+msgstr ""
+
+#: ../raster/r.texture/main.c:373
+#, c-format
+msgid "Calculated measure #%d <%s> (56 measures available)"
+msgstr ""
+
+#: ../raster/r.texture/h_measure.c:84
+msgid "Negative or no data pixel found. This module is not yet able to process no data holes in a map, please fill with r.fillnulls or other algorithms"
+msgstr ""
+
+#: ../raster/r.texture/h_measure.c:88
+#, c-format
+msgid "Too many categories (found: %i, max: %i). Try to rescale or reclassify the map"
+msgstr ""
+
+#: ../raster/r.texture/h_measure.c:937
+#, c-format
+msgid "Too many iterations to required to find %s - giving up"
+msgstr ""
+
+#: ../raster/r.average/main.c:53
+msgid "Finds the average of values in a cover map within areas assigned the same category value in a user-specified base map."
+msgstr ""
+
+#: ../raster/r.average/main.c:93
+#, c-format
+msgid "%s: ERROR running %s command"
+msgstr ""
+
+#: ../raster/r.li/r.li.mpa/mpa.c:37
+msgid "Calculates mean pixel attribute index on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.mpa/mpa.c:45 ../raster/r.li/r.li.renyi/renyi.c:54
+#: ../raster/r.li/r.li.patchdensity/main.c:42
+#: ../raster/r.li/r.li.patchnum/main.c:43
+#: ../raster/r.li/r.li.richness/richness.c:47
+#: ../raster/r.li/r.li.shape/main.c:41 ../raster/r.li/r.li.padsd/padsd.c:42
+#: ../raster/r.li/r.li.edgedensity/edgedensity.c:46
+#: ../raster/r.li/r.li.pielou/pielou.c:67 ../raster/r.li/r.li.padcv/padcv.c:44
+#: ../raster/r.li/r.li.shannon/shannon.c:46 ../raster/r.li/r.li.mps/mps.c:47
+#: ../raster/r.li/r.li.simpson/simpson.c:47
+#: ../raster/r.li/r.li.dominance/dominance.c:46
+#: ../raster/r.li/r.li.padrange/padrange.c:44
+#: ../raster/r.li/r.li.cwed/cwed.c:53
+msgid "Configuration file"
+msgstr ""
+
+#: ../raster/r.li/r.li.renyi/renyi.c:44
+msgid "Calculates Renyi's diversity index on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.renyi/renyi.c:46 ../raster/r.li/r.li.pielou/pielou.c:59
+#: ../raster/r.li/r.li.shannon/shannon.c:38
+#: ../raster/r.li/r.li.simpson/simpson.c:39
+#: ../raster/r.li/r.li.dominance/dominance.c:38
+msgid "raster, landscape structure analysis, diversity index"
+msgstr ""
+
+#: ../raster/r.li/r.li.renyi/renyi.c:62
+msgid "Alpha value is the order of the generalized entropy"
+msgstr ""
+
+#: ../raster/r.li/r.li.patchdensity/main.c:33
+msgid "Calculates patch density index on a raster map, using a 4 neighbour algorithm"
+msgstr "Calculează densitatea parcelelor pe o hartă raster, folosind algoritmul celor 4 vecini"
+
+#: ../raster/r.li/r.li.daemon/worker.c:66
+#, c-format
+msgid "CHILD[pid = %i] cannot open raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/worker.c:104
+#: ../raster/r.li/r.li.daemon/worker.c:111
+#, c-format
+msgid "CHILD[pid = %i] cannot open receive channel"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/worker.c:140
+#: ../raster/r.li/r.li.daemon/worker.c:150
+#, c-format
+msgid "CHILD[pid = %i]: unable to open <%s> mask ... continuing without!"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:82
+msgid "Error in pipe creation"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:90
+#, c-format
+msgid "Error opening channel %i"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:137
+msgid "Cannot create random access file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:145
+#, c-format
+msgid "Cannot create %s/.r.li/ directory"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:149
+#, c-format
+msgid "Cannot create %s/.r.li/output/ directory"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:247
+#: ../raster/r.li/r.li.daemon/daemon.c:270
+#, c-format
+msgid "r.li.worker (pid %i) exited with abnormal status: %i"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:250
+#: ../raster/r.li/r.li.daemon/daemon.c:273
+#, c-format
+msgid "r.li.worker (pid %i) terminated successfully"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:255
+#, c-format
+msgid "Cannot close %s file (PIPE)"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:257
+#, c-format
+msgid "Cannot delete %s file (PIPE)"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:278
+#, c-format
+msgid "Cannot close %s file (PIPE2)"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:280
+#, c-format
+msgid "Cannot delete %s file (PIPE2)"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:299
+msgid "Cannot close receive channel file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:302
+#, c-format
+msgid "Cannot delete %s file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:321
+#, c-format
+msgid "Cannot find configuration file <%s>"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:328
+#: ../raster/r.li/r.li.daemon/daemon.c:332
+msgid "Cannot read setup file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:336
+msgid "Unable to parse configuration file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:346
+msgid "Cannot read raster header file"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:489
+msgid "Irregular maskedoverlay areas definition"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:492
+#, c-format
+msgid "The configuration file can be used only with \t\t\t%s rasterfile"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:499
+msgid "Illegal configuration file (sample area)"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:533
+msgid "Too many units to place"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:602
+msgid "Too many strats for raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:636
+msgid "Illegal areas disposition"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/daemon.c:705
+msgid "Cannot make lseek"
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/ipc.c:48
+#, c-format
+msgid ""
+"\t\t\t\tAREA MESSAGE: \n"
+" \t\t\t\taid = %i \n"
+" \t\t\t\tx = %i \n"
+" \t\t\t\ty = %i \n"
+" \t\t\t\trl = %i \n"
+" \t\t\t\tcl = %i \n"
+" "
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/ipc.c:57
+#, c-format
+msgid ""
+" \t\t\t\tMASKEDAREA MESSAGE: \n"
+" \t\t\t\taid = %i \n"
+" \t\t\t\tx = %i \n"
+" \t\t\t\ty = %i \n"
+" \t\t\t\trl = %i \n"
+" \t\t\t\tcl = %i \n"
+" \t\t\t\tmask = %s \n"
+" "
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/ipc.c:68
+#, c-format
+msgid ""
+" \t\t\t\tDONE MESSAGE: \n"
+" \t\t\t\taid = %i \n"
+" \t\t\t\tpid = %i \n"
+" \t\t\t\tresult = %f \n"
+" "
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/ipc.c:75
+#, c-format
+msgid ""
+" \t\t\t\tERROR MESSAGE: \n"
+" \t\t\t\taid = %i \n"
+" \t\t\t\tpid = %i \n"
+" "
+msgstr ""
+
+#: ../raster/r.li/r.li.daemon/ipc.c:81
+#, c-format
+msgid ""
+" \t\t\t\tTERM MESSAGE: \n"
+" \t\t\t\tpid = %i \n"
+" "
+msgstr ""
+
+#: ../raster/r.li/r.li.patchnum/main.c:34
+msgid "Calculates patch number index on a raster map, using a 4 neighbour algorithm."
+msgstr "Calculează numărul de parcele pe o hartă raster, folosind algoritmul celor 4 vecini"
+
+#: ../raster/r.li/r.li.richness/richness.c:37
+#: ../raster/r.li/r.li.dominance/dominance.c:36
+msgid "Calculates dominance's diversity index on a raster map"
+msgstr "Calculează indicele diversității dominante pe o hartă raster"
+
+#: ../raster/r.li/r.li.richness/richness.c:39
+msgid "raster, landscape structure analysis, dominance index"
+msgstr ""
+
+#: ../raster/r.li/r.li.shape/main.c:32
+msgid "Calculates shape index on a raster map"
+msgstr "Calculează indicele de formă pe o hartă raster"
+
+#: ../raster/r.li/r.li.padsd/padsd.c:35
+msgid "Calculates standard deviation of patch area a raster map"
+msgstr "Calculează deviația standard a parcelei pe o hartă raster"
+
+#: ../raster/r.li/r.li.edgedensity/edgedensity.c:37
+msgid "Calculates edge density index on a raster map, using a 4 neighbour algorithm"
+msgstr "Calculează indicele densității marginii pe o hartă raster, folosind algoritmul celor 4 vecini "
+
+#: ../raster/r.li/r.li.pielou/pielou.c:57
+msgid "Calculates Pielou's diversity index on a raster map"
+msgstr ""
+
+#: ../raster/r.li/r.li.padcv/padcv.c:37
+msgid "Calculates coefficient of variation of patch area on a raster map"
+msgstr "Calculează coeficientul de variație a parcelei pe o hartă raster"
+
+#: ../raster/r.li/r.li.shannon/shannon.c:36
+msgid "Calculates Shannon's diversity index on a raster map"
+msgstr "Calculează indicele diversității Shannon pe o hartă raster"
+
+#: ../raster/r.li/r.li.mps/mps.c:39
+msgid "Calculates mean patch size index on a raster map, using a 4 neighbour algorithm"
+msgstr "Calculează dimensiunea medie a parcelei pe o hartă raster, folosind algoritmul celor 4 vecini"
+
+#: ../raster/r.li/r.li.simpson/simpson.c:37
+msgid "Calculates Simpson's diversity index on a raster map"
+msgstr "Calculează indicele diversității Shannon pe o hartă raster"
+
+#: ../raster/r.li/r.li.padrange/padrange.c:37
+msgid "Calculates range of patch area size on a raster map"
+msgstr "Calculează dimensiunea rândurilor parcelei pe o hartă raster"
+
+#: ../raster/r.li/r.li.cwed/cwed.c:44
+msgid "Calculates contrast weighted edge density index on a raster map"
+msgstr "Calculează constratul ponderat al indicelului densității marginii pe o hartă raster"
+
+#: ../raster/r.what/main.c:93
+msgid "Queries raster map layers on their category values and category labels."
+msgstr "Interoghează straturi raster pe categorii de valori și etichete."
+
+#: ../raster/r.what/main.c:101
+msgid "Name of existing raster map(s) to query"
+msgstr ""
+
+#: ../raster/r.what/main.c:108
+msgid "Size of point cache"
+msgstr ""
+
+#: ../raster/r.what/main.c:110 ../raster/r.what/main.c:148
+#: ../display/d.legend/main.c:104 ../display/d.legend/main.c:113
+#: ../display/d.legend/main.c:121 ../display/d.legend/main.c:142
+#: ../display/d.legend/main.c:151 ../display/d.legend/main.c:161
+#: ../display/d.legend/main.c:166 ../display/d.legend/main.c:171
+#: ../display/d.legend/main.c:176 ../display/d.legend/main.c:181
+#: ../vector/v.buffer/main.c:279 ../vector/v.buffer/main.c:287
+#: ../vector/v.buffer/main.c:294 ../vector/v.buffer/main.c:304
+msgid "Advanced"
+msgstr "Avansat"
+
+#: ../raster/r.what/main.c:127 ../vector/v.what/main.c:69
+msgid "Coordinates for query"
+msgstr ""
+
+#: ../raster/r.what/main.c:131
+msgid "Output header row"
+msgstr ""
+
+#: ../raster/r.what/main.c:135
+msgid "Show the category labels of the grid cell(s)"
+msgstr ""
+
+#: ../raster/r.what/main.c:139
+msgid "Output color values as RRR:GGG:BBB"
+msgstr ""
+
+#: ../raster/r.what/main.c:143
+msgid "Output integer category values, not cell values"
+msgstr ""
+
+#: ../raster/r.what/main.c:147
+msgid "Turn on cache reporting"
+msgstr ""
+
+#: ../raster/r.what/main.c:194
+#, c-format
+msgid "%s: can only do up to %d raster maps, sorry\n"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:138
+msgid "The number of input and elevation maps is not equal"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:211
+msgid "The value to fill the upper cells, default is null"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:218
+msgid "The value to fill the lower cells, default is null"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:223
+msgid "Use the input map values to fill the upper cells"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:228
+msgid "Use the input map values to fill the lower cells"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:232 ../raster3d/r3.cross.rast/main.c:110
+#: ../raster3d/r3.out.ascii/main.c:107 ../raster3d/r3.to.rast/main.c:90
+msgid "Use 3D raster mask (if exists) with input map"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:276
+msgid "Could not get raster row from input map"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:278
+msgid "Could not get raster row from elev map"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:326 ../raster/r.to.rast3elev/main.c:360
+msgid "Error writing 3D raster double data"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:400
+msgid "raster, raster3d, voxel, conversion"
+msgstr "raster, raster3d, voxel, conversie"
+
+#: ../raster/r.to.rast3elev/main.c:402
+msgid "Creates a 3D volume map based on 2D elevation and value raster maps."
+msgstr "Crează volum 3D bazat pe elevație 2D și valoare hartă raster."
+
+#: ../raster/r.to.rast3elev/main.c:433
+msgid "The upper value is not valid"
+msgstr ""
+
+#: ../raster/r.to.rast3elev/main.c:444
+msgid "The lower value is not valid"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:179
+msgid "Horizon angle computation from a digital elevation model."
+msgstr "Calculează unghiul de orizont dintr-un model digital al elevației."
+
+#: ../raster/r.horizon/main.c:181
+msgid "Computes horizon angle height from a digital elevation model. The module has two different modes of operation:  1. Computes the entire horizon around a single point whose coordinates are given with the 'coord' option. The horizon height (in radians). 2. Computes one or more raster maps of the horizon height in a single direction.  The input for this is the angle (in degrees), which is measured  counterclockwise with east=0, north=90 etc. The output is the horizon height in radians."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:234
+msgid "Direction in which you want to know the horizon height"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:250
+msgid "For horizon rasters, read from the DEM an extra buffer around the present region"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:258
+msgid "For horizon rasters, read from the DEM an extra buffer eastward the present region"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:266
+msgid "For horizon rasters, read from the DEM an extra buffer westward the present region"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:274
+msgid "For horizon rasters, read from the DEM an extra buffer northward the present region"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:282
+msgid "For horizon rasters, read from the DEM an extra buffer southward the present region"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:290
+msgid "The maximum distance to consider when finding the horizon height"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:299
+msgid "Prefix of the horizon raster output maps"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:309
+msgid "Coordinate for which you want to calculate the horizon"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:324
+msgid "Write output in degrees (default is radians)"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:361
+msgid "You didn't specify a direction value or step size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:367
+msgid "You didn't specify a horizon raster name. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:378
+msgid "You didn't specify an angle step size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:392
+msgid "Could not read bufferzone size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:398
+msgid "Could not read east bufferzone size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:404
+msgid "Could not read west bufferzone size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:411
+msgid "Could not read south bufferzone size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:420
+msgid "Could not read north bufferzone size. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:426
+msgid "Could not read maximum distance. Aborting."
+msgstr ""
+
+#: ../raster/r.horizon/main.c:479 ../raster/r.sun/main.c:472
+msgid "Can't get projection info of current location: please set latitude via 'lat' or 'latin' option!"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:618 ../raster/r.sun/main.c:734
+#: ../raster/r.sun/main.c:741 ../raster/r.sun/main.c:748
+#: ../raster/r.sun/main.c:755 ../raster/r.sun/main.c:762
+#, c-format
+msgid "Unable to create raster map %s"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:815 ../raster/r.horizon/main.c:833
+#: ../raster/r.sun/main.c:1345 ../display/d.grid/plot.c:203
+#: ../display/d.grid/plot.c:209 ../display/d.grid/plot.c:259
+#: ../display/d.grid/plot.c:265 ../display/d.grid/plot.c:404
+#: ../display/d.grid/plot.c:420 ../display/d.grid/plot.c:437
+#: ../display/d.grid/plot.c:454 ../ps/ps.map/do_geogrid.c:87
+#: ../ps/ps.map/do_geogrid.c:92 ../ps/ps.map/do_geogrid.c:116
+#: ../ps/ps.map/do_geogrid.c:121 ../ps/ps.map/do_geogrid.c:191
+#: ../ps/ps.map/do_geogrid.c:230 ../ps/ps.map/do_geogrid.c:306
+#: ../ps/ps.map/do_geogrid.c:322 ../ps/ps.map/do_geogrid.c:339
+#: ../ps/ps.map/do_geogrid.c:356 ../ps/ps.map/do_geogrid.c:412
+#: ../ps/ps.map/do_geogrid.c:418 ../ps/ps.map/do_geogrid.c:422
+#: ../ps/ps.map/do_geogrid.c:430 ../ps/ps.map/do_geogrid.c:434
+msgid "Error in pj_do_proj"
+msgstr ""
+
+#: ../raster/r.horizon/main.c:1134
+#, c-format
+msgid "Calculating map %01d of %01d (angle %lf, raster map <%s>)"
+msgstr ""
+
+#: ../raster/r.median/main.c:48
+msgid "Finds the median of values in a cover map within areas assigned the same category value in a user-specified base map."
+msgstr ""
+
+#: ../raster/r.median/main.c:54
+msgid "Name of base raster map"
+msgstr ""
+
+#: ../raster/r.median/main.c:71
+#, c-format
+msgid "Base raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.median/main.c:79
+#, c-format
+msgid "Base map and output map <%s> must be different"
+msgstr ""
+
+#: ../raster/r.median/main.c:82
+#, c-format
+msgid "Unable to read category labels of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.compress/main.c:64
+msgid "raster, map management"
+msgstr ""
+
+#: ../raster/r.compress/main.c:65
+msgid "Compresses and decompresses raster maps."
+msgstr "Comprimă și decomprimă hărți raster."
+
+#: ../raster/r.compress/main.c:73 ../display/d.what.rast/main.c:81
+msgid "Name of existing raster map(s)"
+msgstr ""
+
+#: ../raster/r.compress/main.c:77
+msgid "Uncompress the map"
+msgstr ""
+
+#: ../raster/r.compress/main.c:117
+#, c-format
+msgid "[%s] not found"
+msgstr ""
+
+#: ../raster/r.compress/main.c:123
+#, c-format
+msgid "[%s] is a reclass file of map <%s> in mapset <%s> - can't uncompress"
+msgstr ""
+
+#: ../raster/r.compress/main.c:125
+#, c-format
+msgid "[%s] is a reclass file of map <%s> in mapset <%s> - can't compress"
+msgstr ""
+
+#: ../raster/r.compress/main.c:130
+#, c-format
+msgid "[%s] is a GDAL-linked map - can't (un)compress"
+msgstr ""
+
+#: ../raster/r.compress/main.c:172
+#, c-format
+msgid "DONE: uncompressed file is %lu bytes smaller"
+msgstr ""
+
+#: ../raster/r.compress/main.c:173
+#, c-format
+msgid "DONE: compressed file is %lu bytes smaller"
+msgstr ""
+
+#: ../raster/r.compress/main.c:177
+#, c-format
+msgid "DONE: uncompressed file is %lu bytes bigger"
+msgstr ""
+
+#: ../raster/r.compress/main.c:178
+#, c-format
+msgid "DONE: compressed file is %lu bytes bigger"
+msgstr ""
+
+#: ../raster/r.compress/main.c:200
+#, c-format
+msgid "[%s] already uncompressed"
+msgstr ""
+
+#: ../raster/r.compress/main.c:204
+#, c-format
+msgid "[%s] already compressed"
+msgstr ""
+
+#: ../raster/r.compress/main.c:208
+#, c-format
+msgid ""
+"\n"
+"%sCOMPRESS [%s]"
+msgstr ""
+
+#: ../raster/r.colors.out/main.c:63
+msgid "raster, export, color table"
+msgstr "raster, export, tabel de culoare"
+
+#: ../raster/r.colors.out/main.c:65
+msgid "Exports the color table associated with a raster map layer."
+msgstr "Exportă tabelul de culoare asociat cu un strat raster."
+
+#: ../raster/r.colors.out/main.c:71
+msgid "Path to output rules file"
+msgstr ""
+
+#: ../raster/r.colors.out/main.c:72
+msgid "\"-\" to write to stdout"
+msgstr ""
+
+#: ../raster/r.colors.out/main.c:77
+msgid "Output values as percentages"
+msgstr ""
+
+#: ../raster/r.proj/bordwalk.c:182 ../raster/r.proj.seg/bordwalk.c:182
+msgid "Input raster map is outside current region"
+msgstr ""
+
+#: ../raster/r.proj/main.c:130 ../raster/r.proj.seg/main.c:139
+msgid "raster, projection, transformation"
+msgstr ""
+
+#: ../raster/r.proj/main.c:132 ../raster/r.proj.seg/main.c:141
+msgid "Re-projects a raster map from one location to the current location."
+msgstr "Reproiectează harta raster de la o locație în locația curentă."
+
+#: ../raster/r.proj/main.c:135 ../raster/r.proj.seg/main.c:144
+msgid "Name of input raster map to re-project"
+msgstr ""
+
+#: ../raster/r.proj/main.c:137 ../raster/r.proj/main.c:154
+#: ../raster/r.proj/main.c:163 ../raster/r.proj.seg/main.c:146
+#: ../raster/r.proj.seg/main.c:163 ../raster/r.proj.seg/main.c:172
+#: ../vector/v.proj/main.c:70 ../vector/v.proj/main.c:87
+#: ../vector/v.proj/main.c:96 ../vector/v.net.flow/main.c:87
+#: ../vector/v.net.flow/main.c:92 ../vector/v.net.flow/main.c:98
+msgid "Source"
+msgstr "Sursa"
+
+#: ../raster/r.proj/main.c:143 ../raster/r.proj.seg/main.c:152
+msgid "Location containing input raster map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:151 ../raster/r.proj.seg/main.c:160
+msgid "Mapset containing input raster map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:160 ../raster/r.proj.seg/main.c:169
+#: ../vector/v.proj/main.c:93
+msgid "Path to GRASS database of input location"
+msgstr ""
+
+#: ../raster/r.proj/main.c:167 ../raster/r.proj.seg/main.c:176
+msgid "Name for output raster map (default: input)"
+msgstr ""
+
+#: ../raster/r.proj/main.c:168 ../raster/r.proj/main.c:179
+#: ../raster/r.proj/main.c:186 ../raster/r.proj.seg/main.c:177
+#: ../raster/r.proj.seg/main.c:188 ../raster/r.proj.seg/main.c:201
+#: ../raster/r.proj.seg/main.c:215 ../raster/r.proj.seg/main.c:221
+#: ../vector/v.proj/main.c:101 ../vector/v.proj/main.c:113
+msgid "Target"
+msgstr "Destinația"
+
+#: ../raster/r.proj/main.c:178 ../raster/r.proj.seg/main.c:187
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:124
+#: ../imagery/i.rectify/main.c:136
+msgid "Interpolation method to use"
+msgstr ""
+
+#: ../raster/r.proj/main.c:185 ../raster/r.proj.seg/main.c:200
+msgid "Resolution of output map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:190 ../raster/r.proj.seg/main.c:205
+msgid "List raster maps in input location and exit"
+msgstr ""
+
+#: ../raster/r.proj/main.c:194 ../raster/r.proj.seg/main.c:209
+msgid "Do not perform region cropping optimization"
+msgstr ""
+
+#: ../raster/r.proj/main.c:217 ../raster/r.proj.seg/main.c:245
+#: ../vector/v.proj/main.c:132
+#, c-format
+msgid "option <%s>: <%s> exists."
+msgstr "opțiunea <%s>: <%s> există."
+
+#: ../raster/r.proj/main.c:222 ../raster/r.proj.seg/main.c:251
+#: ../vector/v.proj/main.c:149
+msgid "Input and output locations can not be the same"
+msgstr ""
+
+#: ../raster/r.proj/main.c:228 ../raster/r.proj.seg/main.c:263
+msgid "Unable to get projection info of output raster map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:231 ../raster/r.proj.seg/main.c:266
+msgid "Unable to get projection units of output raster map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:234 ../raster/r.proj.seg/main.c:269
+msgid "Unable to get projection key values of output raster map"
+msgstr ""
+
+#: ../raster/r.proj/main.c:243 ../raster/r.proj.seg/main.c:278
+#, c-format
+msgid "Mapset <%s> in input location <%s> - %s"
+msgstr ""
+
+#: ../raster/r.proj/main.c:252 ../raster/r.proj.seg/main.c:287
+#: ../vector/v.proj/main.c:169
+#, c-format
+msgid "Checking location <%s> mapset <%s>"
+msgstr "Verifică locația <%s> mapset <%s>"
+
+#: ../raster/r.proj/main.c:267 ../raster/r.proj.seg/main.c:302
+#, c-format
+msgid "Raster map <%s> in location <%s> in mapset <%s> not found"
+msgstr "Harta raster <%s> din locația <%s> , mapset <%s> nu a fost găsită"
+
+#: ../raster/r.proj/main.c:275 ../raster/r.proj.seg/main.c:310
+msgid "Unable to get projection info of input map"
+msgstr "Imposibil de obținut informații despre proiecție pentru harta de intrare"
+
+#: ../raster/r.proj/main.c:278 ../raster/r.proj.seg/main.c:313
+msgid "Unable to get projection units of input map"
+msgstr "Imposibil de obținut unitățile proiecției pentru harta de intrare"
+
+#: ../raster/r.proj/main.c:281 ../raster/r.proj.seg/main.c:316
+msgid "Unable to get projection key values of input map"
+msgstr "Imposibil de obținut valorile cheie ale proiecției pentru harta de intrare"
+
+#: ../raster/r.proj/main.c:296 ../raster/r.proj.seg/main.c:330
+msgid "Unable to work with unprojected data (xy location)"
+msgstr "Imposibil de lucrat cu date neproiectate (locație xy)"
+
+#: ../raster/r.proj/main.c:370 ../raster/r.proj.seg/main.c:438
+msgid "Input:"
+msgstr "Intrare:"
+
+#: ../raster/r.proj/main.c:371 ../raster/r.proj/main.c:382
+#: ../raster/r.proj.seg/main.c:439 ../raster/r.proj.seg/main.c:450
+#, c-format
+msgid "Cols: %d (%d)"
+msgstr "Coloane: %d (%d)"
+
+#: ../raster/r.proj/main.c:372 ../raster/r.proj/main.c:383
+#: ../raster/r.proj.seg/main.c:440 ../raster/r.proj.seg/main.c:451
+#, c-format
+msgid "Rows: %d (%d)"
+msgstr "Rânduri: %d (%d)"
+
+#: ../raster/r.proj/main.c:373 ../raster/r.proj/main.c:384
+#: ../raster/r.proj.seg/main.c:441 ../raster/r.proj.seg/main.c:452
+#, c-format
+msgid "North: %f (%f)"
+msgstr "Nord: %f (%f)"
+
+#: ../raster/r.proj/main.c:374 ../raster/r.proj/main.c:385
+#: ../raster/r.proj.seg/main.c:442 ../raster/r.proj.seg/main.c:453
+#, c-format
+msgid "South: %f (%f)"
+msgstr "Sud: %f (%f)"
+
+#: ../raster/r.proj/main.c:375 ../raster/r.proj/main.c:386
+#: ../raster/r.proj.seg/main.c:443 ../raster/r.proj.seg/main.c:454
+#, c-format
+msgid "West: %f (%f)"
+msgstr "Vest: %f (%f)"
+
+#: ../raster/r.proj/main.c:376 ../raster/r.proj/main.c:387
+#: ../raster/r.proj.seg/main.c:444 ../raster/r.proj.seg/main.c:455
+#, c-format
+msgid "East: %f (%f)"
+msgstr "Est: %f (%f)"
+
+#: ../raster/r.proj/main.c:377 ../raster/r.proj/main.c:388
+#: ../raster/r.proj.seg/main.c:445 ../raster/r.proj.seg/main.c:456
+#, c-format
+msgid "EW-res: %f"
+msgstr "EV-rez: %f"
+
+#: ../raster/r.proj/main.c:378 ../raster/r.proj/main.c:389
+#: ../raster/r.proj.seg/main.c:446 ../raster/r.proj.seg/main.c:457
+#, c-format
+msgid "NS-res: %f"
+msgstr "NS-rez: %f"
+
+#: ../raster/r.proj/main.c:381 ../raster/r.proj.seg/main.c:449
+msgid "Output:"
+msgstr "Ieșire:"
+
+#: ../raster/r.proj/main.c:417 ../raster/r.proj.seg/main.c:485
+msgid "Projecting..."
+msgstr "Proiectare..."
+
+#: ../raster/r.proj/readcell.c:22 ../raster/r.proj.seg/readcell.c:63
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:70
+#: ../imagery/i.rectify/readcell.c:61
+msgid "Allocating memory and reading input map..."
+msgstr "Alocare de memorie și citirea hărții de intrare..."
+
+#: ../raster/r.sun/main.c:274
+msgid "Name of the latitudes input raster map [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun/main.c:284
+msgid "A single value of latitude [decimal degrees]"
+msgstr ""
+
+#: ../raster/r.sun/main.c:293
+msgid "Name of real-sky beam radiation coefficient raster map [-]"
+msgstr ""
+
+#: ../raster/r.sun/main.c:302
+msgid "Name of real-sky diffuse radiation coefficient raster map [-]"
+msgstr ""
+
+#: ../raster/r.sun/main.c:416
+msgid "time and insol_time are incompatible options"
+msgstr ""
+
+#: ../raster/r.sun/main.c:417
+msgid "Mode 1: instantaneous solar incidence angle & irradiance given a set local time"
+msgstr ""
+
+#: ../raster/r.sun/main.c:527
+#, c-format
+msgid "elevin raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:530
+#, c-format
+msgid "aspin raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:533
+#, c-format
+msgid "slopein raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:546
+#, c-format
+msgid "linkein raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:558
+#, c-format
+msgid "albedo raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:570
+#, c-format
+msgid "latin raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:582
+#, c-format
+msgid "coefbh raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:594
+#, c-format
+msgid "coefdh raster map <%s> not found"
+msgstr ""
+
+#: ../raster/r.sun/main.c:770
+#, c-format
+msgid "rows changed from %d to %d"
+msgstr ""
+
+#: ../raster/r.sun/main.c:773
+#, c-format
+msgid "cols changed from %d to %d"
+msgstr ""
+
+#: ../raster/r.profile/main.c:53
+msgid "raster, profile"
+msgstr "raster, profil"
+
+#: ../raster/r.profile/main.c:55
+msgid "Outputs the raster map layer values lying on user-defined line(s)."
+msgstr "Afișează valorile stratului raster situate de-a lungul liniei definită de utilizator."
+
+#: ../raster/r.profile/main.c:66
+msgid "Name of file for output (use output=- for stdout)"
+msgstr ""
+
+#: ../raster/r.profile/main.c:74
+msgid "Profile coordinate pairs"
+msgstr ""
+
+#: ../raster/r.profile/main.c:81
+msgid "Resolution along profile (default = current region resolution)"
+msgstr ""
+
+#: ../raster/r.profile/main.c:88
+msgid "Character to represent no data cell"
+msgstr ""
+
+#: ../raster/r.profile/main.c:92
+msgid "Interactively select End-Points"
+msgstr ""
+
+#: ../raster/r.profile/main.c:102
+msgid "Output RRR:GGG:BBB color values for each profile point"
+msgstr ""
+
+#: ../raster/r.profile/main.c:121
+#, c-format
+msgid "Illegal resolution! [%g]"
+msgstr ""
+
+#: ../raster/r.profile/main.c:130
+#, c-format
+msgid "Using resolution [%g]"
+msgstr ""
+
+#: ../raster/r.profile/main.c:176
+msgid "Output Format:"
+msgstr ""
+
+#: ../raster/r.profile/main.c:179
+#, c-format
+msgid "[Easting] [Northing] [Along Track Dist.(m)] [Elevation]"
+msgstr ""
+
+#: ../raster/r.profile/main.c:181
+#, c-format
+msgid "[Along Track Dist.(m)] [Elevation]"
+msgstr ""
+
+#: ../raster/r.profile/main.c:183
+msgid " [RGB Color]"
+msgstr ""
+
+#: ../raster/r.profile/main.c:193
+#, c-format
+msgid "Invalid coordinates %s %s"
+msgstr ""
+
+#: ../raster/r.profile/main.c:209
+#, c-format
+msgid "Use mouse to select Start Point\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:214
+#, c-format
+msgid ""
+"\n"
+"Use mouse to draw profile line\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:215
+#, c-format
+msgid "Buttons:\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:216
+#, c-format
+msgid "Left:   Mark next point\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:217
+#, c-format
+msgid "Middle: Mark next point\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:218
+#, c-format
+msgid ""
+"Right:  Finish profile and exit\n"
+"\n"
+msgstr ""
+
+#: ../raster/r.profile/main.c:305
+#, c-format
+msgid "Approx. transect length [%f] m"
+msgstr ""
+
+#: ../raster/r.profile/main.c:308
+msgid "Endpoint coordinates are outside of current region settings"
+msgstr ""
+
+#: ../raster/r.profile/input.c:29 ../raster/r.profile/input.c:46
+#: ../raster/r.profile/input.c:59
+msgid "One coordinate pair per line, please"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:155
+msgid "raster, terrain"
+msgstr "raster, teren"
+
+#: ../raster/r.slope.aspect/main.c:156
+msgid "Generates raster maps of slope, aspect, curvatures and partial derivatives from a elevation raster map."
+msgstr "Generează hărți raster ale pantei, orientării, curburii și derivatelor parțiale dintr-o hartă raster de elevație."
+
+#: ../raster/r.slope.aspect/main.c:158
+msgid "Aspect is calculated counterclockwise from east."
+msgstr "Orientarea este calculată în invers acelor de ceasornic pornind din est."
+
+#: ../raster/r.slope.aspect/main.c:165
+msgid "Name for output slope raster map"
+msgstr "Nume de ieșire pentru harta raster pantă "
+
+#: ../raster/r.slope.aspect/main.c:166 ../raster/r.slope.aspect/main.c:172
+#: ../raster/r.slope.aspect/main.c:198 ../raster/r.slope.aspect/main.c:205
+#: ../raster/r.slope.aspect/main.c:212 ../raster/r.slope.aspect/main.c:219
+#: ../raster/r.slope.aspect/main.c:226 ../raster/r.slope.aspect/main.c:233
+#: ../raster/r.slope.aspect/main.c:240 ../vector/v.surf.rst/main.c:210
+#: ../vector/v.surf.rst/main.c:228 ../vector/v.surf.rst/main.c:234
+#: ../vector/v.surf.rst/main.c:240 ../vector/v.surf.rst/main.c:246
+#: ../vector/v.surf.rst/main.c:252 ../vector/v.surf.rst/main.c:258
+#: ../vector/v.surf.rst/main.c:266 ../vector/v.surf.rst/main.c:273
+#: ../vector/v.surf.rst/main.c:280 ../vector/v.surf.rst/main.c:287
+msgid "Outputs"
+msgstr "Ieșiri"
+
+#: ../raster/r.slope.aspect/main.c:171
+msgid "Name for output aspect raster map"
+msgstr "Nume de ieșire pentru harta raster orientare "
+
+#: ../raster/r.slope.aspect/main.c:180
+msgid "Format for reporting the slope"
+msgstr "Format de ieșire pentru pantă"
+
+#: ../raster/r.slope.aspect/main.c:190
+msgid "Type of output aspect and slope maps"
+msgstr "Tip de ieșire pentru hărțile de pantă și orientare"
+
+#: ../raster/r.slope.aspect/main.c:197
+msgid "Name for output profile curvature raster map"
+msgstr "Nume de ieșire pentru harta raster profilul curburii"
+
+#: ../raster/r.slope.aspect/main.c:204
+msgid "Name for output tangential curvature raster map"
+msgstr "Nume de ieșire pentru harta raster curbura tangențială"
+
+#: ../raster/r.slope.aspect/main.c:211
+msgid "Name for output first order partial derivative dx (E-W slope) raster map"
+msgstr "Nume de ieșire pentru harta raster derivata parțială de ordin 1 dx (panta E-V)"
+
+#: ../raster/r.slope.aspect/main.c:218
+msgid "Name for output first order partial derivative dy (N-S slope) raster map"
+msgstr "Nume de ieșire pentru harta raster derivata parțială de ordin 1 dx (panta N-S)"
+
+#: ../raster/r.slope.aspect/main.c:225
+msgid "Name for output second order partial derivative dxx raster map"
+msgstr "Nume de ieșire pentru harta raster derivata parțială de ordin 2 dxx"
+
+#: ../raster/r.slope.aspect/main.c:232
+msgid "Name for output second order partial derivative dyy raster map"
+msgstr "Nume de ieșire pentru harta raster derivata parțială de ordin 2 dyy"
+
+#: ../raster/r.slope.aspect/main.c:239
+msgid "Name for output second order partial derivative dxy raster map"
+msgstr "Nume de ieșire pentru harta raster derivata parțială de ordin 2 dxy"
+
+#: ../raster/r.slope.aspect/main.c:245
+msgid "Multiplicative factor to convert elevation units to meters"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:254
+msgid "Minimum slope val. (in percent) for which aspect is computed"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:268
+msgid "Do not align the current region to the elevation layer"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:329
+#, c-format
+msgid "%s=%s - must be a positive number"
+msgstr "%s=%s - trebuie să fie un număr pozitiv"
+
+#: ../raster/r.slope.aspect/main.c:335
+#, c-format
+msgid "%s=%s - must be a non-negative number"
+msgstr "%s=%s - trebuie să fie un număr nenegativ"
+
+#: ../raster/r.slope.aspect/main.c:350
+#, c-format
+msgid "You must specify at least one of the parameters: <%s>, <%s>, <%s>, <%s>, <%s>, <%s>, <%s>, <%s> or <%s>"
+msgstr "Trebuie să specificați cel puțin unul dintre parametrii: <%s>, <%s>, <%s>, <%s>, <%s>, <%s>, <%s>, <%s> or <%s>"
+
+#: ../raster/r.slope.aspect/main.c:380
+#, c-format
+msgid "Wrong raster type: %s"
+msgstr "Tip raster greșit: %s"
+
+#: ../raster/r.slope.aspect/main.c:410
+#: ../imagery/i.ortho.photo/i.photo.rectify/angle.c:67
+#, c-format
+msgid "Converting units to meters, factor=%.6f"
+msgstr "Convertirea unităților în metri, factor=%.6f"
+
+#: ../raster/r.slope.aspect/main.c:992
+#, c-format
+msgid "Elevation products for mapset <%s> in <%s>"
+msgstr "Produse de elevație pentru mapset-ul <%s> din <%s>"
+
+#: ../raster/r.slope.aspect/main.c:1011
+#, c-format
+msgid "Min computed aspect %.4f, max computed aspect %.4f"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1077
+#, c-format
+msgid "Aspect raster map <%s> complete"
+msgstr "Harta raster orientare <%s> completă"
+
+#: ../raster/r.slope.aspect/main.c:1119
+#, c-format
+msgid "Min computed slope %.4f, max computed slope %.4f"
+msgstr ""
+
+#: ../raster/r.slope.aspect/main.c:1174
+#, c-format
+msgid "Slope raster map <%s> complete"
+msgstr "Harta raster pantă <%s> completă"
+
+#: ../raster/r.slope.aspect/main.c:1249
+#, c-format
+msgid "Profile curve raster map <%s> complete"
+msgstr "Harta raster curbura în profil <%s> completă"
+
+#: ../raster/r.slope.aspect/main.c:1279
+#, c-format
+msgid "Tangential curve raster map <%s> complete"
+msgstr "Harta raster curbura tangențială <%s> completă"
+
+#: ../raster/r.slope.aspect/main.c:1307
+#, c-format
+msgid "E-W slope raster map <%s> complete"
+msgstr "Harta raster panta E-V <%s> completă"
+
+#: ../raster/r.slope.aspect/main.c:1335
+#, c-format
+msgid "N-S slope raster map <%s> complete"
+msgstr "Harta raster panta N-S <%s> completă"
+
+#: ../raster/r.slope.aspect/main.c:1363
+#, c-format
+msgid "Dxx raster map <%s> complete"
+msgstr "Harta raster dxx <%s> completă"
+
+#: ../raster/r.slope.aspect/main.c:1391
+#, c-format
+msgid "Dyy raster map <%s> complete"
+msgstr "Harta raster dyy <%s> completă"
+
+#: ../raster/r.slope.aspect/main.c:1419
+#, c-format
+msgid "Dxy raster map <%s> complete"
+msgstr "Harta raster dxy <%s> completă"
+
+#: ../raster/r.resamp.interp/main.c:74
+msgid "Resamples raster map layers to a finer grid using interpolation."
+msgstr "Re-eșanționează straturi raster într-un grid mai fin folosind interpolarea."
+
+#: ../raster/r.resamp.interp/main.c:83
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:7
+msgid "Interpolation method"
+msgstr "Metoda de interpolare"
+
+#: ../raster/r.resamp.interp/main.c:97 ../imagery/i.topo.corr/main.c:197
+#, c-format
+msgid "Invalid method: %s"
+msgstr "Metodă nevalidă: %s"
+
+#: ../raster/r.contour/main.c:91
+msgid "raster, DEM, contours, vector"
+msgstr "raster, DEM, curbe de nivel, vector"
+
+#: ../raster/r.contour/main.c:92
+msgid "Produces a vector map of specified contours from a raster map."
+msgstr "Produce harta vectorială a curbelor de nivel dintr-o hartă raster."
+
+#: ../raster/r.contour/main.c:104
+msgid "List of contour levels"
+msgstr ""
+
+#: ../raster/r.contour/main.c:110
+msgid "Minimum contour level"
+msgstr ""
+
+#: ../raster/r.contour/main.c:116
+msgid "Maximum contour level"
+msgstr ""
+
+#: ../raster/r.contour/main.c:122
+msgid "Increment between contour levels"
+msgstr ""
+
+#: ../raster/r.contour/main.c:130
+msgid "Minimum number of points for a contour line (0 -> no limit)"
+msgstr ""
+
+#: ../raster/r.contour/main.c:138
+msgid "Suppress single crossing error messages"
+msgstr ""
+
+#: ../raster/r.contour/main.c:147
+msgid "The '-q' and '-n' flag is superseded and will be removed in future. Please use '--quiet' instead."
+msgstr ""
+
+#: ../raster/r.contour/main.c:152
+msgid "Neither \"levels\" nor \"step\" parameter specified."
+msgstr ""
+
+#: ../raster/r.contour/main.c:196 ../vector/v.surf.rst/main.c:613
+#: ../vector/v.net.distance/main.c:208 ../vector/v.convert/att.c:80
+#: ../vector/v.net.path/path.c:109 ../vector/v.to.points/main.c:295
+#: ../vector/v.net.allpairs/main.c:153 ../vector/v.distance/main.c:835
+#: ../vector/v.in.dwg/main.c:219 ../vector/v.overlay/main.c:525
+#: ../vector/v.net.flow/main.c:168 ../vector/v.net.timetable/main.c:103
+#: ../vector/v.in.ogr/main.c:796 ../vector/v.net.components/main.c:147
+#: ../vector/v.net.centrality/main.c:240
+#, c-format
+msgid "Unable to create table: '%s'"
+msgstr ""
+
+#: ../raster/r.contour/main.c:201 ../vector/v.in.dxf/write_vect.c:225
+#: ../vector/v.in.ascii/in.c:505 ../vector/v.convert/att.c:85
+#: ../vector/v.in.sites/main.c:174 ../vector/v.to.points/main.c:300
+#: ../vector/v.in.dwg/main.c:223 ../vector/v.reclass/main.c:297
+#: ../vector/v.in.ogr/main.c:801
+#, c-format
+msgid "Unable to create index for table <%s>, key <%s>"
+msgstr ""
+
+#: ../raster/r.contour/main.c:224 ../vector/v.convert/att.c:110
+#: ../vector/v.to.points/main.c:63 ../vector/v.overlay/line_area.c:218
+#: ../vector/v.overlay/area_area.c:345
+#, c-format
+msgid "Unable to insert new record: '%s'"
+msgstr ""
+
+#: ../raster/r.contour/main.c:244 ../vector/v.generalize/displacement.c:79
+msgid "Reading data..."
+msgstr ""
+
+#: ../raster/r.contour/main.c:270
+#, c-format
+msgid "Range of data: min=%f, max=%f"
+msgstr ""
+
+#: ../raster/r.contour/main.c:272
+msgid "Range of data: empty"
+msgstr ""
+
+#: ../raster/r.contour/main.c:299 ../raster/r.contour/main.c:303
+msgid "This step value is not allowed"
+msgstr ""
+
+#: ../raster/r.contour/main.c:327
+#, c-format
+msgid "Range of levels: min = %f, max = %f"
+msgstr ""
+
+#: ../raster/r.contour/main.c:356
+msgid "Displacing data..."
+msgstr ""
+
+#: ../raster/r.contour/cont.c:81
+#, c-format
+msgid "Writing vector contours (total levels %d)..."
+msgstr ""
+
+#: ../raster/r.contour/cont.c:211
+#, c-format
+msgid "%d crossings founds"
+msgstr ""
+
+#: ../raster/r.contour/cont.c:262
+msgid "Illegal edge number"
+msgstr ""
+
+#: ../raster/r.contour/cont.c:370
+msgid "Edge number out of range"
+msgstr ""
+
+#: ../raster/r.bilinear/main.c:44
+msgid "Bilinear interpolation utility for raster map layers."
+msgstr "Utilitate de interpolare bilineară pentru straturile raster."
+
+#: ../raster/r.bilinear/main.c:54 ../raster/r.bilinear/main.c:61
+msgid "Specific input value to be assigned to the north and/or south poles for longitude-latitude grids"
+msgstr ""
+
+#: ../raster/r.bilinear/main.c:67
+msgid "This module is deprecated. Please use 'r.resamp.interp' instead."
+msgstr ""
+
+#: ../raster/r.digit/digitize.c:49
+msgid "Quit without creating a map?? "
+msgstr ""
+
+#: ../raster/r.digit/main.c:47
+msgid "Interactive tool used to draw and save vector features on a graphics monitor using a pointing device (mouse) and save to a raster map."
+msgstr "Instrument interactiv utilizat pentru desenarea și salvarea trăsăturilor vectoriale pe un monitor grafic folosind un dispozitiv de indicare (mouse) și salvează harta raster."
+
+#: ../raster/r.digit/main.c:56 ../vector/v.digit/main.c:120
+msgid "Display commands to be used for canvas backdrop (separated by ';')"
+msgstr ""
+
+#: ../raster/r.digit/main.c:79
+msgid "No graphics device selected!"
+msgstr ""
+
+#: ../raster/r.digit/main.c:98
+msgid "No map created"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:31
+#, c-format
+msgid "Please choose one of the following\n"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:32
+#, c-format
+msgid "   A define an area\n"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:33
+#, c-format
+msgid "   C define a circle\n"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:34
+#, c-format
+msgid "   L define a line\n"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:35
+#, c-format
+msgid "   X exit (and create map)\n"
+msgstr ""
+
+#: ../raster/r.digit/get_type.c:36
+#, c-format
+msgid "   Q quit (without creating map)\n"
+msgstr ""
+
+#: ../raster/r.digit/get_label.c:31
+#, c-format
+msgid "Enter the category number for this %s: "
+msgstr ""
+
+#: ../raster/r.digit/get_label.c:46
+#, c-format
+msgid "Enter a label for category %ld [%s] "
+msgstr ""
+
+#: ../raster/r.digit/get_label.c:68
+msgid "Look ok? "
+msgstr ""
+
+#: ../raster/r.surf.contour/main.c:54
+msgid "Surface generation program from rasterized contours."
+msgstr "Program pentru generarea suprafeței din curbe de nivel rasterizate."
+
+#: ../raster/r.surf.contour/main.c:61
+msgid "Name of existing raster map containing contours"
+msgstr ""
+
+#: ../raster/r.surf.contour/main.c:68
+msgid "Output elevation raster map"
+msgstr ""
+
+#: ../raster/r.surf.contour/main.c:72
+msgid "Unused; retained for compatibility purposes, will be removed in future"
+msgstr ""
+
+#: ../raster/r.surf.contour/main.c:77
+msgid "Invoke slow, but memory frugal operation (generally not needed, will be removed in future)"
+msgstr ""
+
+#: ../raster/r.external/main.c:54
+#, c-format
+msgid "Supported Formats:\n"
+msgstr ""
+
+#: ../raster/r.external/main.c:172
+msgid ""
+"\n"
+"You can use the -o flag to r.external to override this check and use the location definition for the dataset.\n"
+msgstr ""
+
+#: ../raster/r.external/main.c:202
+msgid "Input raster map is rotated - cannot import. You may use 'gdalwarp' to transform the map to North-up."
+msgstr ""
+
+#: ../raster/r.external/main.c:310
+msgid "Complex types not supported"
+msgstr ""
+
+#: ../raster/r.external/main.c:325
+#, c-format
+msgid "Copying color table for %s"
+msgstr ""
+
+#: ../raster/r.external/main.c:343
+#, c-format
+msgid "Setting grey color table for <%s> (full 8bit range)"
+msgstr ""
+
+#: ../raster/r.external/main.c:349
+#, c-format
+msgid "Setting grey color table for <%s> (data range)"
+msgstr ""
+
+#: ../raster/r.external/main.c:363
+#, c-format
+msgid "Unable to create cell/%s file"
+msgstr ""
+
+#: ../raster/r.external/main.c:372
+#, c-format
+msgid "Unable to create fcell/%s file"
+msgstr ""
+
+#: ../raster/r.external/main.c:404
+#, c-format
+msgid "Unable to create cell_misc/%s/gdal file"
+msgstr ""
+
+#: ../raster/r.external/main.c:407
+#, c-format
+msgid "Error writing cell_misc/%s/gdal file"
+msgstr ""
+
+#: ../raster/r.external/main.c:432
+#, c-format
+msgid "Unable to create cell_misc/%s/f_format file"
+msgstr ""
+
+#: ../raster/r.external/main.c:435
+#, c-format
+msgid "Error writing cell_misc/%s/f_format file"
+msgstr ""
+
+#: ../raster/r.external/main.c:450
+msgid "Unable to write quant file"
+msgstr ""
+
+#: ../raster/r.external/main.c:483
+#, c-format
+msgid "Creating support files for %s"
+msgstr ""
+
+#: ../raster/r.external/main.c:496
+#, c-format
+msgid "Link to raster map <%s> created"
+msgstr ""
+
+#: ../raster/r.external/main.c:522
+msgid "Link GDAL supported raster file to a binary raster map layer."
+msgstr ""
+
+#: ../raster/r.external/main.c:525
+msgid "Raster file to be linked"
+msgstr ""
+
+#: ../raster/r.external/main.c:531
+msgid "Name of non-file GDAL data source"
+msgstr ""
+
+#: ../raster/r.external/main.c:543
+msgid "Band to select (default: all)"
+msgstr ""
+
+#: ../raster/r.external/main.c:566
+msgid "Require exact range"
+msgstr ""
+
+#: ../raster/r.external/main.c:595
+msgid "Name for input source not specified"
+msgstr ""
+
+#: ../raster/r.external/main.c:598
+msgid "input= and source= are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.external/main.c:623
+msgid "Unable to set window"
+msgstr ""
+
+#: ../raster/r.external/main.c:634
+#, c-format
+msgid "Imagery group <%s> already exists and will be overwritten."
+msgstr ""
+
+#: ../raster/r.external/main.c:677
+#, c-format
+msgid "Imagery group <%s> created"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:110
+msgid "raster, export, png"
+msgstr "rester, export, png"
+
+#: ../raster/r.out.png/r.out.png.c:112
+msgid "Export GRASS raster as non-georeferenced PNG image."
+msgstr "Exportă raster GRASS ca imagine PNG negeoreferențiată."
+
+#: ../raster/r.out.png/r.out.png.c:119
+msgid "Name for new PNG file (use out=- for stdout)"
+msgstr "Nume pentru fișierul nou PNG (utilizare de ieșire=- pentru stdout)"
+
+#: ../raster/r.out.png/r.out.png.c:127
+msgid "Compression level of PNG file"
+msgstr "Nivel de compresie pentru fișierul PNG"
+
+#: ../raster/r.out.png/r.out.png.c:128
+msgid "(0 = none, 1 = fastest, 9 = best)"
+msgstr "(0 = nimic, 1 = cel mai rapid, 9 = cel mai bun)"
+
+#: ../raster/r.out.png/r.out.png.c:140
+msgid "Make NULL cells transparent"
+msgstr "Face celulele nule transparente"
+
+#: ../raster/r.out.png/r.out.png.c:144
+msgid "Output world file"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:196 ../display/d.graph/do_graph.c:112
+#: ../display/d.graph/do_graph.c:393 ../display/d.graph/do_graph.c:408
+#: ../display/d.graph/main.c:103 ../display/d.text/main.c:147
+#: ../display/d.paint.labels/color.c:66 ../display/d.text.freetype/main.c:842
+#: ../display/d.rast/display.c:32
+#, c-format
+msgid "[%s]: No such color"
+msgstr "[%s]: Nici o astfel de culoare"
+
+#: ../raster/r.out.png/r.out.png.c:285
+#, c-format
+msgid "Converting <%s>..."
+msgstr "Convertire <%s>..."
+
+#: ../raster/r.out.png/r.out.png.c:300 ../raster/r.univar2/r.univar_main.c:183
+#, c-format
+msgid "Raster <%s> type mismatch"
+msgstr "Raster <%s>nepotrivire de tip"
+
+#: ../raster/r.out.png/r.out.png.c:452
+msgid "Writing world file"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:455 ../raster/r.out.tiff/r.out.tiff.c:417
+msgid "Got null file name"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:457 ../raster/r.out.tiff/r.out.tiff.c:419
+msgid "Got null region struct"
+msgstr ""
+
+#: ../raster/r.out.png/r.out.png.c:459
+msgid "Unable to open world file for writing"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:101
+msgid "Exports a GRASS raster map to a 8/24bit TIFF image file at the pixel resolution of the currently defined region."
+msgstr "Exportă hartă raster GRASS în imagine TIFF 8/24bit TIFF cu rezoluția pixelului a regiunii definite curent."
+
+#: ../raster/r.out.tiff/r.out.tiff.c:111
+msgid "Name for new TIFF file"
+msgstr "Nume pentru fișier nou TIFF"
+
+#: ../raster/r.out.tiff/r.out.tiff.c:118
+msgid "TIFF file compression"
+msgstr "Compresia fișierului TIFF"
+
+#: ../raster/r.out.tiff/r.out.tiff.c:123
+msgid "TIFF Palette output (8bit instead of 24bit)."
+msgstr "Paleta de ieșire TIFF (8 biți în loc de 24 biți)"
+
+#: ../raster/r.out.tiff/r.out.tiff.c:127
+msgid "Output TIFF world file"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:131
+msgid "Output Tiled TIFF"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:177
+#, c-format
+msgid "Raster map <%s> in mapset <%s> is a floating point map. Decimal values will be rounded to integer!"
+msgstr "Harta raster <%s> din mapset-ul <%s> este o hartă punctuală în virgulă mobilă. Valorile zecimale vor fi rotunjite la întregi!"
+
+#: ../raster/r.out.tiff/r.out.tiff.c:183
+msgid "Color map for palette must have less than 256 colors for the available range of data"
+msgstr "Tabela de culori pentru hartă trebuie sa aibă o paletă cu mai puțin de 256 culori pentru gama disponibilă pentru date"
+
+#: ../raster/r.out.tiff/r.out.tiff.c:198
+#, c-format
+msgid "Unable to open TIFF file <%s>"
+msgstr "Nu s-a putut deschide fișierul TIFF <%s>"
+
+#: ../raster/r.out.tiff/r.out.tiff.c:414
+msgid "Writing TIFF World file"
+msgstr ""
+
+#: ../raster/r.out.tiff/r.out.tiff.c:422
+msgid "Unable to open TIFF world file for writing"
+msgstr ""
+
+#: ../raster/r.resample/main.c:56
+msgid "GRASS raster map layer data resampling capability."
+msgstr "Capacitatea de re-eșantionare a datelor raster GRASS."
+
+#: ../raster/r.resample/main.c:65
+msgid "Name of an input layer"
+msgstr ""
+
+#: ../raster/r.resample/main.c:72
+msgid "Name of an output layer"
+msgstr ""
+
+#: ../raster/r.resample/main.c:165
+msgid "Creating new cats file..."
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:49 ../raster/r.in.bin/main.c:58
+#: ../raster/r.in.bin/main.c:510
+msgid "Error reading data"
+msgstr "Eroare în citirea datei"
+
+#: ../raster/r.in.bin/main.c:236
+msgid "Import a binary raster file into a GRASS raster map."
+msgstr "Importă fișier raster binar într-o hartă raster GRASS."
+
+#: ../raster/r.in.bin/main.c:241
+msgid "Import as floating-point data (default: integer)"
+msgstr "Importă ca date în virgulă mobilă (implicit: întreg)"
+
+#: ../raster/r.in.bin/main.c:246
+msgid "Import as double-precision floating-point data (default: integer)"
+msgstr "Importă ca date în virgulă mobilă cu dublă precizie (implicit: întreg)"
+
+#: ../raster/r.in.bin/main.c:250
+msgid "Signed data (two's complement)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:255
+msgid "Byte Swap the Data During Import"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:260
+msgid "Get region info from GMT style header"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:261 ../raster/r.in.bin/main.c:301
+#: ../raster/r.in.bin/main.c:309 ../raster/r.in.bin/main.c:317
+#: ../raster/r.in.bin/main.c:325 ../raster/r.in.bin/main.c:332
+#: ../raster/r.in.bin/main.c:339 ../general/g.region/main.c:158
+#: ../general/g.region/main.c:218 ../general/g.region/main.c:228
+#: ../general/g.region/main.c:238 ../general/g.region/main.c:248
+#: ../general/g.region/main.c:257 ../general/g.region/main.c:266
+#: ../general/g.region/main.c:344 ../general/g.region/main.c:355
+msgid "Bounds"
+msgstr "Margine"
+
+#: ../raster/r.in.bin/main.c:267
+msgid "Binary raster file to be imported"
+msgstr "Fișier raster binar pentru a fi importat"
+
+#: ../raster/r.in.bin/main.c:284 ../raster/r.out.bin/main.c:310
+msgid "Number of bytes per cell"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:292 ../raster/r.out.bin/main.c:317
+msgid "Output byte order"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:300
+msgid "Northern limit of geographic region (outer edge)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:308
+msgid "Southern limit of geographic region (outer edge)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:316
+msgid "Eastern limit of geographic region (outer edge)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:324
+msgid "Western limit of geographic region (outer edge)"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:331
+msgid "Number of rows"
+msgstr "Număr de rânduri"
+
+#: ../raster/r.in.bin/main.c:338
+msgid "Number of columns"
+msgstr "Număr de coloane"
+
+#: ../raster/r.in.bin/main.c:345
+msgid "Set Value to NULL"
+msgstr "Setează Valoare la NUL"
+
+#: ../raster/r.in.bin/main.c:366
+msgid "order= and -b are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:381
+msgid "-f and -d are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:385
+#, c-format
+msgid "-f incompatible with bytes=%d; must be 4 or 8"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:393
+#, c-format
+msgid "-d incompatible with bytes=%d; must be 8"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:400
+msgid "bytes= required for integer data"
+msgstr "octeți= necesită date întregi"
+
+#: ../raster/r.in.bin/main.c:404
+msgid "Integer input doesn't support size=8 in this build"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:408
+msgid "bytes= must be 1, 2, 4 or 8"
+msgstr "octeți= trebuie să fie 1, 2, 4 sau 8"
+
+#: ../raster/r.in.bin/main.c:421
+msgid "Either -h or rows= and cols= must be given"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:426
+msgid "Either all or none of north=, south=, east= and west= must be given"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:433 ../display/d.grid/main.c:201
+#, c-format
+msgid "Illegal north coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:435
+#, c-format
+msgid "Illegal south coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:437 ../display/d.grid/main.c:195
+#, c-format
+msgid "Illegal east coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:439
+#, c-format
+msgid "Illegal west coordinate <%s>"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:445
+#, c-format
+msgid "Unable to open <%s>"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:464
+#, c-format
+msgid "East-West (ewres: %f) and North-South (nwres: %f) resolution differ significantly. Did you assign east= and west= correctly?"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:487
+msgid "File Size %"
+msgstr ""
+
+#: ../raster/r.in.bin/main.c:489
+msgid "Bytes do not match file size"
+msgstr ""
+
+#: ../raster/r.kappa/calc_kappa.c:32
+#, c-format
+msgid "Cannot open file <%s> to write kappa and relevant parameters"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:69
+msgid "Calculate error matrix and kappa parameter for accuracy assessment of classification result."
+msgstr "Calculează eroare matricii și parametrul kappa pentru evaluarea acurateții rezultatului de clasificare."
+
+#: ../raster/r.kappa/main.c:75
+msgid "Name of raster map containing classification result"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:80
+msgid "Name of raster map containing reference classes"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:85
+msgid "Name for output file containing error matrix and kappa"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:91
+msgid "Title for error matrix and kappa"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:96
+msgid "Wide report"
+msgstr ""
+
+#: ../raster/r.kappa/main.c:97
+msgid "132 columns (default: 80)"
+msgstr "132 coloane (implicit: 80)"
+
+#: ../raster/r.kappa/main.c:106
+msgid "No header in the report"
+msgstr ""
+
+#: ../raster/r.kappa/prt_hdr.c:17
+#, c-format
+msgid "Cannot open file <%s> to write header"
+msgstr ""
+
+#: ../raster/r.kappa/prt_mat.c:39
+#, c-format
+msgid "Cannot open file <%s> to write cats and counts (error matrix)"
+msgstr ""
+
+#: ../raster/r.kappa/prt_label.c:16
+#, c-format
+msgid "Can't open file <%s> to write label"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:88
+msgid "Either mpeg_encode or ppmtompeg must be installed"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:213
+msgid "Reading file"
+msgstr "Citirea fișierului"
+
+#: ../raster/r.out.mpeg/main.c:282 ../raster/r.out.mpeg/main.c:312
+msgid "mpeg_encode ERROR"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:346 ../visualization/xganim/main.c:544
+msgid "Error reading wildcard"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:385
+msgid "Raster File Series to MPEG Conversion."
+msgstr "Convertește serii de fișiere raster în MPEG."
+
+#: ../raster/r.out.mpeg/main.c:396 ../visualization/xganim/main.c:600
+#, c-format
+msgid "Raster file(s) for View%d"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:406
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:8
+msgid "Name for output file"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:416
+msgid "Quality factor (1 = highest quality, lowest compression)"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:420
+msgid "Quiet - suppress progress report"
+msgstr ""
+
+#: ../raster/r.out.mpeg/main.c:425
+msgid ""
+"Convert on the fly, use less disk space\n"
+"\t(requires r.out.ppm with stdout option)"
+msgstr ""
+
+#: ../raster/r.out.mpeg/write.c:81 ../raster/r.out.mpeg/write.c:178
+msgid "Size mismatch error!"
+msgstr ""
+
+#: ../raster/r.out.mpeg/write.c:139 ../raster/r.out.mpeg/write.c:181
+msgid "Unable to open output file"
+msgstr ""
+
+#: ../raster/r.out.mpeg/write.c:215
+msgid "Unable to create temporary files."
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:24
+#, c-format
+msgid "Data range of raster map <%s> is empty"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:31
+#, c-format
+msgid "Data range of raster map <%s> is %s to %s (entire map)"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:36
+#, c-format
+msgid "Unable to read range of raster map <%s>"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:41
+#, c-format
+msgid "Integer data range of raster map <%s> is empty"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:44
+#, c-format
+msgid "Integer data range of raster mao <%s> is %d to %d"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:63
+msgid "Enter the rule or 'help' for the format description"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:87
+msgid "Enter a rule in one of these formats:"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:89
+msgid "old_low:old_high:new_low:new_high"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:90
+msgid "old_low:old_high:new_val      (i.e. new_high == new_low)"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:91
+msgid "*:old_val:new_val             (interval [inf, old_val])"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:92
+msgid "old_val:*:new_val             (interval [old_val, inf])"
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:94
+msgid "When finished type \"end\"."
+msgstr ""
+
+#: ../raster/r.recode/read_rules.c:134
+#, c-format
+msgid "'%s' is not a valid rule"
+msgstr ""
+
+#: ../raster/r.recode/main.c:41
+msgid "raster, recode category"
+msgstr ""
+
+#: ../raster/r.recode/main.c:42
+msgid "Recodes categorical raster maps."
+msgstr "Recodează categorii de hărți raster."
+
+#: ../raster/r.recode/main.c:45
+msgid "Name of raster map to be recoded"
+msgstr ""
+
+#: ../raster/r.recode/main.c:52
+msgid "File containing recode rules"
+msgstr ""
+
+#: ../raster/r.recode/main.c:53
+msgid "\"-\" to read from stdin"
+msgstr ""
+
+#: ../raster/r.recode/main.c:64
+msgid "Align the current region to the input raster map"
+msgstr ""
+
+#: ../raster/r.recode/main.c:68
+msgid "Force output to 'double' raster map type (DCELL)"
+msgstr ""
+
+#: ../raster/r.recode/main.c:87 ../raster/r.reclass/main.c:85
+msgid "Input map can NOT be the same as output map"
+msgstr ""
+
+#: ../raster/r.recode/main.c:99
+#, c-format
+msgid "No rules specified. Raster map <%s> not created."
+msgstr ""
+
+#: ../raster/r.recode/main.c:102 ../raster/r.reclass/main.c:144
+msgid "No rules specified"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:110
+msgid "Makes each cell category value a function of the category values assigned to the cells around it, and stores new cell values in an output raster map layer."
+msgstr "Face fiecare valoare a celulei în funcție de valorile de categorii atribuite celulelor din jurul ei și stochează valorile celulei într-o hartă raster de ieșire."
+
+#: ../raster/r.neighbors/main.c:133
+msgid "Neighborhood operation"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:134 ../raster/r.neighbors/main.c:142
+#: ../raster/r.neighbors/main.c:176
+msgid "Neighborhood"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:140
+msgid "Neighborhood size"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:149
+msgid "Title of the output raster map"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:156
+msgid "File containing weights"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:162
+msgid "Sigma (in cells) for Gaussian filter"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:166
+msgid "Do not align output with the input"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:175
+msgid "Use circular neighborhood"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:183
+msgid "Neighborhood size must be positive"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:185
+msgid "Neighborhood size must be odd"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:189
+msgid "weight= and -c are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:201
+msgid "weight= and gauss= are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.neighbors/main.c:255
+#, c-format
+msgid "Method %s not compatible with Gaussian filter"
+msgstr ""
+
+#: ../raster/r.neighbors/readweights.c:18
+#, c-format
+msgid "Unable to open weights file %s"
+msgstr ""
+
+#: ../raster/r.neighbors/readweights.c:23
+#, c-format
+msgid "Error reading weights file %s"
+msgstr ""
+
+#: ../raster/r.patch/main.c:55
+msgid "Creates a composite raster map layer by using known category values from one (or more) map layer(s) to fill in areas of \"no data\" in another map layer."
+msgstr "Crează o compoziție de hartă raster folosind valorile de categorii cunoscute de la unul (sau mai multe) straturi pentru a umple arealele cu \"no data\" într-o altă hartă."
+
+#: ../raster/r.patch/main.c:62
+msgid "Name of raster maps to be patched together"
+msgstr ""
+
+#: ../raster/r.patch/main.c:65
+msgid "Name for resultant raster map"
+msgstr ""
+
+#: ../raster/r.patch/main.c:77
+msgid "Use zero (0) for transparency instead of NULL"
+msgstr ""
+
+#: ../raster/r.patch/main.c:102
+msgid "The minimum number of input raster maps is two"
+msgstr ""
+
+#: ../raster/r.patch/main.c:139
+msgid "One or more input raster maps not found"
+msgstr ""
+
+#: ../raster/r.patch/main.c:181
+#, c-format
+msgid "Creating support files for raster map <%s>"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:38
+msgid "3D Raster map used for zoning, must be of type CELL"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:53
+#: ../raster/r.univar2/r.univar_main.c:52
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:9
+#: ../vector/v.univar/main.c:124
+msgid "Percentile to calculate (requires extended statistics flag)"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:56
+#: ../raster/r.univar2/r.univar_main.c:55
+msgid "Special characters: space, comma, tab"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:61
+#: ../raster/r.univar2/r.univar_main.c:60 ../vector/v.univar/main.c:128
+#: ../vector/v.what/main.c:89
+msgid "Print the stats in shell script style"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:65
+#: ../raster/r.univar2/r.univar_main.c:64
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:4
+#: ../vector/v.univar/main.c:132
+msgid "Calculate extended statistics"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:69
+#: ../raster/r.univar2/r.univar_main.c:68
+msgid "Table output format instead of standard output format"
+msgstr ""
+
+#: ../raster/r.univar2/r3.univar_main.c:100 ../raster3d/r3.stats/main.c:568
+msgid "raster3d, voxel, statistics"
+msgstr "raster3d, voxel, statistici"
+
+#: ../raster/r.univar2/r3.univar_main.c:102
+msgid "Calculates univariate statistics from the non-null 3d cells of a raster3d map."
+msgstr "Calculează statistici univariate din celulele 3D nenule ale hărții raster3d."
+
+#: ../raster/r.univar2/r3.univar_main.c:147
+#: ../raster/r.univar2/r3.univar_main.c:186
+#: ../general/g.mremove/do_remove.c:55 ../general/g.region/main.c:508
+#: ../raster3d/base/r3.mask.main.c:78 ../raster3d/base/r3.null.main.c:106
+#: ../raster3d/r3.cross.rast/main.c:284 ../raster3d/r3.stats/main.c:611
+#: ../raster3d/r3.out.vtk/main.c:143 ../raster3d/r3.out.vtk/main.c:153
+#: ../raster3d/r3.out.v5d/main.c:307 ../raster3d/r3.out.ascii/main.c:259
+#: ../raster3d/r3.to.rast/main.c:228
+#, c-format
+msgid "3D raster map <%s> not found"
+msgstr "Harta raster 3D <%s> nu a fost găsită"
+
+#: ../raster/r.univar2/r3.univar_main.c:154
+#: ../raster/r.univar2/r3.univar_main.c:193 ../raster3d/base/r3.mask.main.c:84
+#: ../raster3d/base/r3.info.main.c:128 ../raster3d/base/r3.null.main.c:113
+#: ../raster3d/r3.cross.rast/main.c:318 ../raster3d/r3.stats/main.c:618
+#: ../raster3d/r3.out.vtk/main.c:209 ../raster3d/r3.out.vtk/main.c:293
+#: ../raster3d/r3.out.vtk/main.c:517 ../raster3d/r3.out.v5d/main.c:312
+#: ../raster3d/r3.out.ascii/main.c:268
+#, c-format
+msgid "Unable to open 3D raster map <%s>"
+msgstr "Imposibil de deschis harta raster 3D <%s>"
+
+#: ../raster/r.univar2/r3.univar_main.c:163
+msgid "Unable to load 3D raster range"
+msgstr "Imposibil de încărcat gama raster 3D"
+
+#: ../raster/r.univar2/r.univar_main.c:37
+msgid "Raster map used for zoning, must be of type CELL"
+msgstr ""
+
+#: ../raster/r.univar2/r.univar_main.c:99
+msgid "Calculates univariate statistics from the non-null cells of a raster map."
+msgstr "Calculează statistici univariate din celule ne-nule ale hărții raster."
+
+#: ../raster/r.univar2/r.univar_main.c:274
+#: ../raster/r.univar2/r.univar_main.c:277
+#, c-format
+msgid "Reading row %d"
+msgstr "Citirea rândului %d"
+
+#: ../raster/r.out.bin/main.c:139
+#, c-format
+msgid "Header File = %s"
+msgstr "Fișier antet  = %s"
+
+#: ../raster/r.out.bin/main.c:144 ../raster/r.out.bin/main.c:228
+#: ../raster/r.out.bin/main.c:407
+#, c-format
+msgid "Unable to create file <%s>"
+msgstr "Imposibil de creat fișierul <%s>"
+
+#: ../raster/r.out.bin/main.c:223
+#, c-format
+msgid "World File = %s"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:280
+msgid "Exports a GRASS raster map to a binary array."
+msgstr "Exportă harta raster GRASS ca un șir binar."
+
+#: ../raster/r.out.bin/main.c:296
+msgid "Name for output binary map (use output=- for stdout)"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:303
+msgid "Value to write out for null"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:322
+msgid "Generate integer output"
+msgstr "Generează întreg de ieșire"
+
+#: ../raster/r.out.bin/main.c:326
+msgid "Generate floating-point output"
+msgstr "Generează virgulă mobilă de ieșire"
+
+#: ../raster/r.out.bin/main.c:330
+msgid "Export array with GMT compatible header"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:334
+msgid "Generate BIL world and header files"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:338
+msgid "Byte swap output"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:344
+msgid "Invalid value for null (integers only)"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:366
+msgid "order= and -s are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:375
+msgid "-i and -f are mutually exclusive"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:394
+msgid "Floating-point output requires bytes=4 or bytes=8"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:398
+msgid "Integer output doesn't support bytes=8 in this build"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:412
+msgid "GMT grid doesn't support 64-bit integers"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:418
+msgid "Creating BIL support files..."
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:435
+#, c-format
+msgid "Exporting raster as floating values (bytes=%d)"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:437
+msgid "Writing GMT float format ID=1"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:440
+#, c-format
+msgid "Exporting raster as integer values (bytes=%d)"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:442
+msgid "Writing GMT integer format ID=2"
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:445
+msgid "Using the current region settings..."
+msgstr ""
+
+#: ../raster/r.out.bin/main.c:446
+#, c-format
+msgid "north=%f"
+msgstr "nord=%f"
+
+#: ../raster/r.out.bin/main.c:447
+#, c-format
+msgid "south=%f"
+msgstr "sousud=%f"
+
+#: ../raster/r.out.bin/main.c:448
+#, c-format
+msgid "east=%f"
+msgstr "est=%f"
+
+#: ../raster/r.out.bin/main.c:449
+#, c-format
+msgid "west=%f"
+msgstr "vest=%f"
+
+#: ../raster/r.out.bin/main.c:450
+#, c-format
+msgid "r=%d"
+msgstr "r=%d"
+
+#: ../raster/r.out.bin/main.c:451
+#, c-format
+msgid "c=%d"
+msgstr "c=%d"
+
+#: ../raster/r.proj.seg/main.c:214
+msgid "Print input map's bounds in the current projection and exit"
+msgstr ""
+
+#: ../raster/r.proj.seg/main.c:220
+msgid "Print input map's bounds in the current projection and exit (shell style)"
+msgstr ""
+
+#: ../raster/r.proj.seg/main.c:253
+msgid "Input and output locations are the same"
+msgstr ""
+
+#: ../raster/r.proj.seg/main.c:349
+#, c-format
+msgid "Input map <%s@%s> in location <%s>:"
+msgstr ""
+
+#: ../raster/r.proj.seg/readcell.c:57
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:62
+#: ../imagery/i.rectify/readcell.c:55
+msgid "Unable to open temporary file"
+msgstr ""
+
+#: ../raster/r.proj.seg/readcell.c:81
+msgid "Error reading input"
+msgstr ""
+
+#: ../raster/r.proj.seg/readcell.c:90 ../raster/r.proj.seg/readcell.c:129
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:98
+#: ../imagery/i.rectify/readcell.c:87 ../imagery/i.rectify/readcell.c:126
+msgid "Error writing segment file"
+msgstr ""
+
+#: ../raster/r.proj.seg/readcell.c:117
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:128
+#: ../imagery/i.rectify/readcell.c:114
+msgid "Internal error: cache miss on fully-cached map"
+msgstr ""
+
+#: ../raster/r.proj.seg/readcell.c:126
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:137
+#: ../imagery/i.rectify/readcell.c:123
+msgid "Error seeking on segment file"
+msgstr ""
+
+#: ../raster/r.surf.fractal/process.c:53
+msgid "Unable to allocate data buffer. Check current region with g.region."
+msgstr ""
+
+#: ../raster/r.surf.fractal/spec_syn.c:61
+msgid "Preliminary surface calculations..."
+msgstr ""
+
+#: ../raster/r.surf.fractal/spec_syn.c:120
+#, c-format
+msgid "Calculating surface %d (of %d)..."
+msgstr ""
+
+#: ../raster/r.surf.fractal/interface.c:36
+msgid "raster, DEM, fractal"
+msgstr ""
+
+#: ../raster/r.surf.fractal/interface.c:38
+msgid "Creates a fractal surface of a given fractal dimension."
+msgstr "Crează o suprafață fractal pentru o dimensiune fractală dată."
+
+#: ../raster/r.surf.fractal/interface.c:49
+msgid "Fractal dimension of surface (2 < D < 3)"
+msgstr ""
+
+#: ../raster/r.surf.fractal/interface.c:56
+msgid "Number of intermediate images to produce"
+msgstr ""
+
+#: ../raster/r.surf.fractal/interface.c:88
+#, c-format
+msgid "Fractal dimension of %.2lf must be between 2 and 3."
+msgstr ""
+
+#: ../raster/r.bitpattern/main.c:63
+msgid "Compares bit patterns with a raster map."
+msgstr "Compară modelul 'parte cu parte' cu harta raster."
+
+#: ../raster/r.bitpattern/main.c:75
+msgid "Bit pattern position(s)"
+msgstr ""
+
+#: ../raster/r.bitpattern/main.c:81
+msgid "Bit pattern value"
+msgstr ""
+
+#: ../raster/r.bitpattern/main.c:151
+#, c-format
+msgid "Unable to write to <%s>"
+msgstr ""
+
+#: ../raster/r.reclass/reclass.c:49 ../raster/r.reclass/reclass.c:109
+msgid "Too many categories"
+msgstr ""
+
+#: ../raster/r.reclass/reclass.c:214
+#, c-format
+msgid "Cannot read header file of <%s@%s>"
+msgstr ""
+
+#: ../raster/r.reclass/reclass.c:229
+#, c-format
+msgid "Cannot create reclass file of <%s>"
+msgstr ""
+
+#: ../raster/r.reclass/reclass.c:242
+#, c-format
+msgid "Cannot create category file of <%s>"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:51
+msgid "Creates a new map layer whose category values are based upon a reclassification of the categories in an existing raster map layer."
+msgstr "Crează un strat nou ale cărui valori sunt bazate pe reclasificarea categoriilor din stratul raster existent."
+
+#: ../raster/r.reclass/main.c:56
+msgid "Raster map to be reclassified"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:63
+msgid "File containing reclass rules"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:71
+msgid "Title for the resulting raster map"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:91
+#, c-format
+msgid "Cannot open rules file <%s>"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:105
+#, c-format
+msgid "Enter rule(s), \"end\" when done, \"help\" if you need it\n"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:107
+#, c-format
+msgid "Data range is %.7g to %.7g\n"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:110
+#, c-format
+msgid "Data range is %.15g to %.15g\n"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:121
+#, c-format
+msgid "Illegal reclass rule -"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:122
+#, c-format
+msgid " ignored\n"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:125
+msgid " - invalid reclass rule"
+msgstr ""
+
+#: ../raster/r.reclass/main.c:141
+#, c-format
+msgid "No rules specified. Raster map <%s> not created"
+msgstr ""
+
+#: ../raster/r.reclass/parse.c:41
+msgid "poor quality"
+msgstr ""
+
+#: ../raster/r.reclass/parse.c:43
+msgid "medium quality"
+msgstr ""
+
+#: ../raster/r.reclass/parse.c:58
+msgid "Can't have null on the left-hand side of the rule"
+msgstr ""
+
+#: ../raster/r.reclass/parse.c:87 ../raster/r.reclass/parse.c:99
+msgid "Can't have null on the right-hand side of the rule"
+msgstr ""
+
+#: ../raster/r.reclass/parse.c:195
+#, c-format
+msgid "%f rounded up to %d\n"
+msgstr ""
+
+#: ../raster/r.surf.random/main.c:46
+msgid "Produces a raster map of uniform random deviates whose range can be expressed by the user."
+msgstr "Produce o hartă raster a deviației aleatorii uniforme a cărui interval poate fi exprimat de către utilizator."
+
+#: ../raster/r.surf.random/main.c:53
+msgid "Minimum random value"
+msgstr ""
+
+#: ../raster/r.surf.random/main.c:59
+msgid "Maximum random value"
+msgstr ""
+
+#: ../raster/r.surf.random/main.c:65
+#, fuzzy
+msgid "Create an integer raster map"
+msgstr "Crează o hartă raster "
+
+#: ../raster/r.surf.random/main.c:79
+#, c-format
+msgid "Raster map <%s> generated."
+msgstr "Harta raster <%s> a fost generată."
+
+#: ../raster/r.surf.area/main.c:87
+msgid "Surface area estimation for rasters."
+msgstr "Estimarea arealului de suprafață pentru rastere."
+
+#: ../raster/r.surf.area/main.c:95
+msgid "Raster file for surface"
+msgstr "Fișierul raster pentru suprafață"
+
+#: ../raster/r.surf.area/main.c:102
+msgid "Vertical scale"
+msgstr "Scara verticală"
+
+#: ../raster/r.flow/io.c:68
+#, c-format
+msgid "Unable to get header for %s"
+msgstr ""
+
+#: ../raster/r.flow/io.c:85
+msgid "Reading input files: elevation"
+msgstr ""
+
+#: ../raster/r.flow/io.c:89
+msgid "Elevation file's resolution differs from current region resolution"
+msgstr ""
+
+#: ../raster/r.flow/io.c:101
+msgid "Reading input files: aspect"
+msgstr ""
+
+#: ../raster/r.flow/io.c:104
+msgid "Resolution of aspect file differs from current region resolution"
+msgstr ""
+
+#: ../raster/r.flow/io.c:118
+msgid "Reading input files: barrier"
+msgstr ""
+
+#: ../raster/r.flow/io.c:146
+#, c-format
+msgid "Cannot create segment file %s"
+msgstr ""
+
+#: ../raster/r.flow/io.c:151
+#, c-format
+msgid "Cannot format segment file %s"
+msgstr ""
+
+#: ../raster/r.flow/io.c:157
+#, c-format
+msgid "Cannot open segment file %s"
+msgstr ""
+
+#: ../raster/r.flow/io.c:203
+msgid "Cannot reset current region"
+msgstr ""
+
+#: ../raster/r.flow/io.c:205
+msgid "Writing density file"
+msgstr ""
+
+#: ../raster/r.flow/io.c:228
+#, c-format
+msgid "Unable to find file %s"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:47
+msgid "Precomputing: e/w distances"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:49
+msgid "Precomputing: quantization tolerances"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:52
+msgid "Precomputing: inverted elevations"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:56
+msgid "Precomputing: interpolated border elevations"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:62
+msgid "Precomputing: re-oriented aspects"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:66
+msgid "Precomputing: aspects"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:110
+#, c-format
+msgid ""
+"Resolution too unbalanced:\n"
+"atan2(%f deg, %f deg) =%f < %f tolerance\n"
+"please resample input map"
+msgstr ""
+
+#: ../raster/r.flow/precomp.c:115
+#, c-format
+msgid "Resolution too unbalanced (%f x %f); please resample input map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:303
+msgid "Calculating maps ..."
+msgstr ""
+
+#: ../raster/r.flow/calc.c:408
+msgid "Unable to get current region"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:413
+msgid "Construction of slope curves (flowlines), flowpath lengths, and flowline densities (upslope areas) from a raster digital elevation model (DEM)."
+msgstr "Construiește curbe de pante (linii de scurgere), lungimea cursului și densitatea cursurilor de scurgere (în amonte) dintr-un model digital al elevației (DEM)."
+
+#: ../raster/r.flow/calc.c:451
+msgid "Input elevation raster map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:458
+msgid "Input aspect raster map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:465
+msgid "Input barrier raster map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:472
+msgid "Number of cells between flowlines"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:480
+msgid "Maximum number of segments per flowline"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:488
+msgid "Output flowline vector map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:495
+msgid "Output flowpath length raster map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:502
+msgid "Output flowline density raster map"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:507
+msgid "Compute upslope flowlines instead of default downhill flowlines"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:511
+msgid "3-D lengths instead of 2-D"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:515
+msgid "Use less memory, at a performance penalty"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:533
+msgid "You must select one or more output maps (flout, lgout, dsout)"
+msgstr ""
+
+#: ../raster/r.flow/calc.c:549
+msgid "lat/long projection not supported by r.flow. Please use 'r.watershed' for calculating flow accumulation."
+msgstr ""
+
+#: ../raster/r.flow/mem.c:39
+#, c-format
+msgid "Unable to write segment file for %s"
+msgstr ""
+
+#: ../raster/r.describe/main.c:61
+msgid "Prints terse list of category values found in a raster map layer."
+msgstr "Printează lista categoriilor de valori găsite în harta raster."
+
+#: ../raster/r.describe/main.c:80
+msgid "Number of quantization steps"
+msgstr ""
+
+#: ../raster/r.describe/main.c:86
+msgid "Print the output one value per line"
+msgstr ""
+
+#: ../raster/r.describe/main.c:90
+msgid "Only print the range of the data"
+msgstr ""
+
+#: ../raster/r.describe/main.c:98
+msgid "Use the current region"
+msgstr ""
+
+#: ../raster/r.describe/main.c:102
+msgid "Read fp map as integer"
+msgstr ""
+
+#: ../raster/r.describe/main.c:126
+#, c-format
+msgid "%s = %s -- must be greater than zero"
+msgstr ""
+
+#: ../raster/r.describe/main.c:137
+#, c-format
+msgid "%s: [%s] not found"
+msgstr ""
+
+#: ../raster/r.los/main.c:82
+msgid "raster, viewshed"
+msgstr ""
+
+#: ../raster/r.los/main.c:83
+msgid "Line-of-sight raster analysis program."
+msgstr "Program de analiză raster a liniei de vedere."
+
+#: ../raster/r.los/main.c:97
+msgid "Coordinate identifying the viewing position"
+msgstr ""
+
+#: ../raster/r.los/main.c:102
+msgid "Binary (1/0) raster map to use as a mask"
+msgstr ""
+
+#: ../raster/r.los/main.c:109
+msgid "Viewing position height above the ground"
+msgstr ""
+
+#: ../raster/r.los/main.c:117
+msgid "Maximum distance from the viewing point (meters)"
+msgstr ""
+
+#: ../raster/r.los/main.c:123
+msgid "Consider earth curvature (current ellipsoid)"
+msgstr ""
+
+#: ../raster/r.los/main.c:150
+msgid "Lat/Long support is not (yet) implemented for this module."
+msgstr ""
+
+#: ../raster/r.los/main.c:155
+msgid "Specified observer coordinate is outside current region bounds."
+msgstr ""
+
+#: ../raster/r.los/main.c:211
+msgid "Pattern map should be a binary 0/1 CELL map"
+msgstr ""
+
+#: ../raster/r.los/main.c:245
+msgid "Problem to obtain current ellipsoid parameters, using sphere (6370997.0)"
+msgstr ""
+
+#: ../raster/r.los/main.c:250
+#, c-format
+msgid "Using maximum distance from the viewing point (meters): %f"
+msgstr ""
+
+#: ../general/g.setproj/proj.c:168
+#, c-format
+msgid "Unrecognized 'ask' value in proj-parms.table: %s"
+msgstr ""
+
+#: ../general/g.setproj/proj.c:178
+#, c-format
+msgid "Unrecognized default value in proj-parms.table: %s"
+msgstr ""
+
+#: ../general/g.setproj/main.c:78 ../general/g.proj/main.c:63
+msgid "general, projection"
+msgstr "general, proiecție"
+
+#: ../general/g.setproj/main.c:80
+msgid "Interactively reset the location's projection settings."
+msgstr "Restabilește interactiv parametrii proiecției locației."
+
+#: ../general/g.setproj/main.c:87
+msgid "You must be in the PERMANENT mapset to run g.setproj"
+msgstr ""
+
+#: ../general/g.setproj/main.c:100
+msgid "PERMANENT: permission denied"
+msgstr ""
+
+#: ../general/g.setproj/main.c:104
+msgid "Current region cannot be set"
+msgstr ""
+
+#: ../general/g.setproj/main.c:134
+msgid "Would you still like to change some of the parameters?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:136
+msgid "The projection information will not be updated"
+msgstr ""
+
+#: ../general/g.setproj/main.c:147
+#, c-format
+msgid ""
+"Zone in default geographic region definition: %d\n"
+" is different from zone in PROJ_INFO file: %d"
+msgstr ""
+
+#: ../general/g.setproj/main.c:157
+msgid "XY-location cannot be projected"
+msgstr ""
+
+#: ../general/g.setproj/main.c:191
+msgid "Unknown projection"
+msgstr ""
+
+#: ../general/g.setproj/main.c:197
+#, c-format
+msgid "Projection %s is not specified in the file 'proj-parms.table'"
+msgstr ""
+
+#: ../general/g.setproj/main.c:204
+msgid "Do you wish to specify a geodetic datum for this location?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:213
+#, c-format
+msgid "The current datum is %s (%s)"
+msgstr ""
+
+#: ../general/g.setproj/main.c:216
+msgid "Do you wish to change the datum (or datum transformation parameters)?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:224
+msgid "The datum information has not been changed"
+msgstr ""
+
+#: ../general/g.setproj/main.c:287
+#, c-format
+msgid "The current ellipsoid is %s"
+msgstr ""
+
+#: ../general/g.setproj/main.c:289
+msgid "Do you want to change ellipsoid parameter?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:293
+msgid "The ellipse information has not been changed"
+msgstr ""
+
+#: ../general/g.setproj/main.c:310
+#, c-format
+msgid "The radius is currently %f"
+msgstr ""
+
+#: ../general/g.setproj/main.c:311
+msgid "Do you want to change the radius?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:313 ../general/g.setproj/main.c:319
+msgid "Enter radius for the sphere in meters"
+msgstr ""
+
+#: ../general/g.setproj/main.c:335
+msgid "Invalid input ellipsoid"
+msgstr ""
+
+#: ../general/g.setproj/main.c:446
+#, c-format
+msgid "The UTM zone is now set to %d"
+msgstr ""
+
+#: ../general/g.setproj/main.c:449
+msgid "Do you want to change the UTM zone?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:450
+msgid "UTM zone information has not been updated"
+msgstr ""
+
+#: ../general/g.setproj/main.c:455
+msgid "But if you change zone, all the existing data will be interpreted by projection software. GRASS will not automatically re-project or even change the headers for existing maps."
+msgstr ""
+
+#: ../general/g.setproj/main.c:460
+msgid "Would you still like to change the UTM zone?"
+msgstr ""
+
+#: ../general/g.setproj/main.c:496
+#, c-format
+msgid "Error writing PROJ_INFO file <%s>"
+msgstr ""
+
+#: ../general/g.setproj/main.c:570
+#, c-format
+msgid "Enter plural form of units [meters]: "
+msgstr ""
+
+#: ../general/g.setproj/main.c:602
+#, c-format
+msgid "Enter singular for unit: "
+msgstr ""
+
+#: ../general/g.setproj/main.c:610
+#, c-format
+msgid "Enter conversion factor from %s to meters: "
+msgstr ""
+
+#: ../general/g.setproj/main.c:635
+#, c-format
+msgid "Error writing into UNITS output file <%s>"
+msgstr ""
+
+#: ../general/g.setproj/main.c:642
+msgid "Unable to write to DEFAULT_WIND region file"
+msgstr ""
+
+#: ../general/g.setproj/main.c:644
+#, c-format
+msgid ""
+"\n"
+"Projection information has been recorded for this location\n"
+"\n"
+msgstr ""
+
+#: ../general/g.setproj/main.c:646
+msgid "The geographic region information in WIND is now obsolete"
+msgstr ""
+
+#: ../general/g.setproj/main.c:647
+msgid "Run g.region -d to update it"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:43
+msgid "This should not happen see your system admin"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:99
+msgid "Unable to open FIPS code file"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:125
+#, c-format
+msgid "No match of fips state %d county %d"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:179
+msgid "Reading sf key_value temp file"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:212
+msgid "Invalid State FIPS code"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:302
+msgid "Reading cf key_value temp file"
+msgstr ""
+
+#: ../general/g.setproj/get_stp.c:336
+msgid "Invalid County FIPS code"
+msgstr ""
+
+#: ../general/g.dirseps/main.c:36
+msgid "Internal GRASS utility for converting directory separator characters."
+msgstr ""
+
+#: ../general/g.message/main.c:33
+msgid "general, scripts"
+msgstr "general, scripturi"
+
+#: ../general/g.message/main.c:35
+msgid "Prints a message, warning, progress info, or fatal error in the GRASS way."
+msgstr ""
+
+#: ../general/g.message/main.c:37
+msgid "This module should be used in scripts for messages served to user."
+msgstr ""
+
+#: ../general/g.message/main.c:41 ../general/g.message/main.c:46
+#: ../general/g.message/main.c:51 ../general/g.message/main.c:56
+msgid "Type"
+msgstr "Tip"
+
+#: ../general/g.message/main.c:42
+msgid "Print message as warning"
+msgstr ""
+
+#: ../general/g.message/main.c:47
+msgid "Print message as fatal error"
+msgstr ""
+
+#: ../general/g.message/main.c:52
+msgid "Print message as debug message"
+msgstr ""
+
+#: ../general/g.message/main.c:57
+msgid "Print message as progress info"
+msgstr ""
+
+#: ../general/g.message/main.c:61 ../general/g.message/main.c:66
+#: ../general/g.message/main.c:80
+msgid "Level"
+msgstr "Nivel"
+
+#: ../general/g.message/main.c:62
+msgid "Print message in all but full quiet mode"
+msgstr ""
+
+#: ../general/g.message/main.c:67
+msgid "Print message only in verbose mode"
+msgstr ""
+
+#: ../general/g.message/main.c:74
+msgid "Text of the message to be printed"
+msgstr ""
+
+#: ../general/g.message/main.c:83
+msgid "Level to use for debug messages"
+msgstr ""
+
+#: ../general/g.message/main.c:91
+msgid "Select only one message level"
+msgstr ""
+
+#: ../general/g.message/main.c:104
+msgid "Unable to parse input message"
+msgstr ""
+
+#: ../general/g.access/main.c:37 ../general/g.mlist/main.c:65
+#: ../general/g.ask/main.c:40 ../general/g.findetc/main.c:28
+#: ../general/g.filename/main.c:39 ../general/manage/cmd/rename.c:40
+#: ../general/manage/cmd/remove.c:99 ../general/manage/cmd/list.c:41
+#: ../general/manage/cmd/copy.c:39 ../general/g.findfile/main.c:35
+#: ../general/g.mremove/main.c:58 ../general/g.tempfile/main.c:36
+msgid "general, map management"
+msgstr ""
+
+#: ../general/g.access/main.c:39
+msgid "Controls access to the current mapset for other users on the system."
+msgstr "Controlează accesul la mapsetul curent pentru alți utilizatori ai sistemului."
+
+#: ../general/g.access/main.c:46
+msgid "Access for group"
+msgstr ""
+
+#: ../general/g.access/main.c:53
+msgid "Access for others"
+msgstr ""
+
+#: ../general/g.access/main.c:59
+msgid "UNIX filesystem access controls are not supported by MS-Windows"
+msgstr ""
+
+#: ../general/g.access/main.c:67
+msgid "Access to the PERMANENT mapset must be open, nothing changed"
+msgstr ""
+
+#: ../general/g.access/main.c:71
+msgid "Unable to determine mapset permissions"
+msgstr ""
+
+#: ../general/g.access/set_perms.c:26
+msgid "Unable to change mapset permissions"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:11 ../general/g.access/exp_perms.c:29
+msgid "have"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:12
+msgid "read "
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:15
+msgid "Everyone"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:16
+msgid "has"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:19
+msgid "Only users in your group"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:22
+msgid "Only users outside your group"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:25
+msgid "Only you"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:31
+#, c-format
+msgid "%s %s %s %saccess to mapset %s"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:32
+msgid "will"
+msgstr ""
+
+#: ../general/g.access/exp_perms.c:32
+msgid "now"
+msgstr ""
+
+#: ../general/g.proj/datumtrans.c:47
+#, c-format
+msgid "Invalid datum code <%s>"
+msgstr ""
+
+#: ../general/g.proj/datumtrans.c:77
+#, c-format
+msgid "Datum set to <%s>"
+msgstr ""
+
+#: ../general/g.proj/datumtrans.c:79
+#, c-format
+msgid "Ellipsoid set to <%s>"
+msgstr ""
+
+#: ../general/g.proj/main.c:66
+msgid "Prints and manipulates GRASS projection information files (in various co-ordinate system descriptions)."
+msgstr "Printează și manipulează fișierele de informații cu privire la proiecția GRASS (diverse descrieri la sistemului de coordonate)."
+
+#: ../general/g.proj/main.c:69
+msgid "Can also be used to create new GRASS locations."
+msgstr ""
+
+#: ../general/g.proj/main.c:72
+msgid "Prints and manipulates GRASS projection information files."
+msgstr ""
+
+#: ../general/g.proj/main.c:79
+msgid "Print projection information in conventional GRASS format"
+msgstr ""
+
+#: ../general/g.proj/main.c:85
+msgid "Print projection information in shell script style"
+msgstr ""
+
+#: ../general/g.proj/main.c:91
+msgid "Verify datum information and print transformation parameters"
+msgstr ""
+
+#: ../general/g.proj/main.c:97
+msgid "Print projection information in PROJ.4 format"
+msgstr ""
+
+#: ../general/g.proj/main.c:103
+msgid "Print 'flat' output with no linebreaks (applies to WKT and PROJ.4 output)"
+msgstr ""
+
+#: ../general/g.proj/main.c:113
+msgid "Print projection information in WKT format"
+msgstr ""
+
+#: ../general/g.proj/main.c:119
+msgid "Use ESRI-style format (applies to WKT output only)"
+msgstr ""
+
+#: ../general/g.proj/main.c:126 ../general/g.proj/main.c:135
+#: ../general/g.proj/main.c:145 ../general/g.proj/main.c:155
+msgid "Specification"
+msgstr ""
+
+#: ../general/g.proj/main.c:127
+msgid "Name of georeferenced data file to read projection information from"
+msgstr ""
+
+#: ../general/g.proj/main.c:136
+msgid "Name of ASCII file containing a WKT projection description"
+msgstr ""
+
+#: ../general/g.proj/main.c:138 ../general/g.proj/main.c:147
+msgid "'-' for standard input"
+msgstr ""
+
+#: ../general/g.proj/main.c:146
+msgid "PROJ.4 projection description"
+msgstr "Descrierea proiecției PROJ.4 "
+
+#: ../general/g.proj/main.c:156
+msgid "EPSG projection code"
+msgstr "Codul de proiecție EPSG"
+
+#: ../general/g.proj/main.c:164 ../general/g.proj/main.c:177
+#: ../general/g.proj/main.c:183
+msgid "Datum"
+msgstr "DatumDatum"
+
+#: ../general/g.proj/main.c:166
+msgid "Datum (overrides any datum specified in input co-ordinate system)"
+msgstr ""
+
+#: ../general/g.proj/main.c:168
+msgid "Accepts standard GRASS datum codes, or \"list\" to list and exit"
+msgstr ""
+
+#: ../general/g.proj/main.c:178
+msgid "Index number of datum transform parameters"
+msgstr ""
+
+#: ../general/g.proj/main.c:179
+msgid "\"0\" for unspecified or \"-1\" to list and exit"
+msgstr ""
+
+#: ../general/g.proj/main.c:185
+msgid "Force override of datum transformation information in input co-ordinate system"
+msgstr ""
+
+#: ../general/g.proj/main.c:191
+msgid "Create new projection files (modifies current location)"
+msgstr ""
+
+#: ../general/g.proj/main.c:199 ../general/g.mapset/main.c:82
+#: ../locale/scriptstrings/r.mask_to_translate.c:4
+#: ../locale/scriptstrings/r.mask_to_translate.c:6
+#: ../locale/scriptstrings/r.mask_to_translate.c:8
+msgid "Create"
+msgstr "Crează"
+
+#: ../general/g.proj/main.c:200
+msgid "Name of new location to create"
+msgstr ""
+
+#: ../general/g.proj/main.c:216
+#, c-format
+msgid "Only one of '%s', '%s', '%s' or '%s' options may be specified"
+msgstr ""
+
+#: ../general/g.proj/main.c:259
+msgid "Projection files missing"
+msgstr ""
+
+#: ../general/g.proj/main.c:279
+#, c-format
+msgid "Only one of -%c, -%c, -%c, -%c, -%c or -%c flags may be specified"
+msgstr ""
+
+#: ../general/g.proj/main.c:306
+#, c-format
+msgid "No output format specified, define one of flags -%c, -%c, -%c, or -%c"
+msgstr ""
+
+#: ../general/g.proj/main.c:310
+#, c-format
+msgid "No output format specified, define one of flags -%c, -%c, or -%c"
+msgstr ""
+
+#: ../general/g.proj/create.c:17
+#, c-format
+msgid "Unable to create location <%s>: %s"
+msgstr ""
+
+#: ../general/g.proj/create.c:20
+#, c-format
+msgid "Unable to create projection files: %s"
+msgstr ""
+
+#: ../general/g.proj/create.c:24
+msgid "Unspecified error while creating new location"
+msgstr ""
+
+#: ../general/g.proj/create.c:26
+#, c-format
+msgid ""
+"You can switch to the new location by\n"
+"`%s=%s`"
+msgstr ""
+
+#: ../general/g.proj/create.c:36
+#, c-format
+msgid "You must select the PERMANENT mapset before updating the current location's projection (current mapset is <%s>)."
+msgstr ""
+
+#: ../general/g.proj/create.c:63
+msgid "Default region was updated to the new projection, but if you have multiple mapsets `g.region -d` should be run in each to update the region from the default"
+msgstr ""
+
+#: ../general/g.proj/create.c:67
+msgid "Projection information updated"
+msgstr ""
+
+#: ../general/g.proj/input.c:91
+msgid "Error reading WKT projection description"
+msgstr ""
+
+#: ../general/g.proj/input.c:98
+#, c-format
+msgid "Unable to open file '%s' for reading"
+msgstr ""
+
+#: ../general/g.proj/input.c:143
+msgid "Can't parse PROJ.4-style parameter string"
+msgstr ""
+
+#: ../general/g.proj/input.c:181
+msgid "Unable to translate EPSG code"
+msgstr ""
+
+#: ../general/g.proj/input.c:218
+msgid "Trying to open with OGR..."
+msgstr ""
+
+#: ../general/g.proj/input.c:226 ../general/g.proj/input.c:245
+msgid "...succeeded."
+msgstr ""
+
+#: ../general/g.proj/input.c:239
+msgid "Trying to open with GDAL..."
+msgstr ""
+
+#: ../general/g.proj/input.c:254
+#, c-format
+msgid "Could not read georeferenced file %s using either OGR nor GDAL"
+msgstr ""
+
+#: ../general/g.proj/input.c:259
+#, c-format
+msgid "Read of file %s was successful, but it did not contain projection information. 'XY (unprojected)' will be used"
+msgstr ""
+
+#: ../general/g.proj/output.c:182
+#, c-format
+msgid "%s: Unable to convert to WKT"
+msgstr ""
+
+#: ../general/g.mlist/main.c:67
+msgid "Lists available GRASS data base files of the user-specified data type optionally using the search pattern."
+msgstr "Listează fișierele de bază disponibile GRASS specificate de utilizator folosind modulul de căutare."
+
+#: ../general/g.mlist/main.c:97
+msgid "Map name search pattern (default: all)"
+msgstr ""
+
+#: ../general/g.mlist/main.c:98 ../general/g.mlist/main.c:106
+#: ../general/g.mlist/main.c:129 ../general/g.mlist/main.c:135
+msgid "Pattern"
+msgstr "Model"
+
+#: ../general/g.mlist/main.c:105
+msgid "Map name exclusion pattern (default: none)"
+msgstr ""
+
+#: ../general/g.mlist/main.c:115
+msgid "One-character output separator, newline, comma, space, or tab"
+msgstr ""
+
+#: ../general/g.mlist/main.c:123 ../general/manage/cmd/list.c:72
+msgid "Mapset to list (default: current search path)"
+msgstr ""
+
+#: ../general/g.mlist/main.c:128 ../general/g.mremove/main.c:66
+msgid "Use basic regular expressions instead of wildcards"
+msgstr ""
+
+#: ../general/g.mlist/main.c:134 ../general/g.mremove/main.c:71
+msgid "Use extended regular expressions instead of wildcards"
+msgstr ""
+
+#: ../general/g.mlist/main.c:139
+msgid "Print data types"
+msgstr ""
+
+#: ../general/g.mlist/main.c:144
+msgid "Print fully-qualified map names (including mapsets)"
+msgstr ""
+
+#: ../general/g.mlist/main.c:149
+msgid "Pretty printing in human readable format"
+msgstr ""
+
+#: ../general/g.mlist/main.c:154 ../general/manage/cmd/list.c:76
+msgid "Verbose listing (also list map titles)"
+msgstr ""
+
+#: ../general/g.mlist/main.c:163 ../general/g.mremove/main.c:104
+msgid "-r and -e are mutually exclusive"
+msgstr ""
+
+#: ../general/g.mlist/main.c:172 ../general/g.mlist/main.c:183
+#: ../general/g.mremove/main.c:130
+#, c-format
+msgid "Unable to compile regular expression %s"
+msgstr ""
+
+#: ../general/g.mlist/read_list.c:144 ../general/g.mremove/read_list.c:144
+#, c-format
+msgid ""
+"Format error: <%s>\n"
+"Line: %d\n"
+"%s"
+msgstr ""
+
+#: ../general/g.gui/main.c:36 ../general/g.pnmcomp/main.c:281
+msgid "general, gui"
+msgstr "general, gui"
+
+#: ../general/g.gui/main.c:38
+msgid "Launches a GRASS graphical user interface (GUI) session."
+msgstr ""
+
+#: ../general/g.gui/main.c:43
+msgid "GUI type"
+msgstr "Tip GUI"
+
+#: ../general/g.gui/main.c:44
+msgid "Default value: GRASS_GUI if defined, otherwise wxpython"
+msgstr ""
+
+#: ../general/g.gui/main.c:45
+msgid "wxpython;wxPython based GUI - wxGUI;tcltk;Tcl/Tk based GUI - GIS Manager (gis.m);oldtcltk;Old Tcl/Tk based GUI - Display Manager (d.m);text;command line interface only"
+msgstr ""
+
+#: ../general/g.gui/main.c:54
+msgid "Name of workspace file"
+msgstr ""
+
+#: ../general/g.gui/main.c:58
+msgid "Update default GUI setting"
+msgstr ""
+
+#: ../general/g.gui/main.c:63
+msgid "Do not launch GUI after updating the default GUI setting"
+msgstr ""
+
+#: ../general/g.gui/main.c:90
+#, c-format
+msgid "<%s> is now the default GUI"
+msgstr ""
+
+#: ../general/g.gui/main.c:103
+#, c-format
+msgid "Launching '%s' GUI in the background, please wait ..."
+msgstr ""
+
+#: ../general/g.gui/main.c:107
+msgid "The old d.m GUI is not available for WinGRASS"
+msgstr ""
+
+#: ../general/g.version/main.c:41
+msgid "general, version"
+msgstr "general, versiuni"
+
+#: ../general/g.version/main.c:42
+msgid "Displays version and copyright information."
+msgstr "Afișează versiunea și informațiile privind drepturile de autor."
+
+#: ../general/g.version/main.c:46
+msgid "Print also the copyright message"
+msgstr ""
+
+#: ../general/g.version/main.c:50
+msgid "Print also the GRASS build information"
+msgstr ""
+
+#: ../general/g.version/main.c:55
+msgid "Print also the GIS library revision number and time"
+msgstr ""
+
+#: ../general/g.version/main.c:59
+msgid "Print info in shell script style (including SVN revision number)"
+msgstr ""
+
+#: ../general/g.filename/main.c:40
+msgid "Prints GRASS data base file names."
+msgstr ""
+
+#: ../general/g.filename/main.c:48 ../general/g.findfile/main.c:48
+msgid "Name of an element"
+msgstr ""
+
+#: ../general/g.filename/main.c:54
+msgid "Name of a database file"
+msgstr ""
+
+#: ../general/g.filename/main.c:60
+msgid "Name of a mapset (default: current)"
+msgstr ""
+
+#: ../general/manage/cmd/rename.c:42
+msgid "Renames data base element files in the user's current mapset."
+msgstr "Redenumește fișierele de bază în mapsetul curent."
+
+#: ../general/manage/cmd/rename.c:57
+#, c-format
+msgid "%s file(s) to be renamed"
+msgstr "%s fișiere pentru a fi redenumite"
+
+#: ../general/manage/cmd/rename.c:75
+#, c-format
+msgid "%s <%s> not found"
+msgstr "%s <%s> nu a fost găsit"
+
+#: ../general/manage/cmd/rename.c:79
+#, c-format
+msgid "<%s> already exists in mapset <%s>"
+msgstr "<%s> deja există în mapset <%s>"
+
+#: ../general/manage/cmd/rename.c:89
+#, c-format
+msgid "%s=%s,%s: files could be the same, no rename possible"
+msgstr "%s=%s,%s: fișierele ar putea fi la fel, nu este posibilă redenumirea"
+
+#: ../general/manage/cmd/rename.c:99
+msgid "Renaming reclass maps"
+msgstr ""
+
+#: ../general/manage/cmd/remove.c:38 ../general/g.mremove/check_reclass.c:14
+#, c-format
+msgid "[%s@%s] is a base map for [%s]. Remove forced."
+msgstr "[%s@%s] este o hartă de bază pentru [%s]. Eliminare forțată."
+
+#: ../general/manage/cmd/remove.c:41 ../general/g.mremove/check_reclass.c:18
+#, c-format
+msgid "[%s@%s] is a base map. Remove reclassed map first: %s"
+msgstr "[%s@%s] este o hartă de bază. Elimină prima dată harta reclasificată: %s"
+
+#: ../general/manage/cmd/remove.c:63 ../general/manage/cmd/remove.c:76
+#: ../general/g.mremove/check_reclass.c:41
+#: ../general/g.mremove/check_reclass.c:55
+#, c-format
+msgid "Removing information about reclassed map from [%s@%s] failed"
+msgstr "Eliminarea informațiilor despre harta reclasificată din [%s@%s] a eșuat"
+
+#: ../general/manage/cmd/remove.c:101 ../general/g.mremove/main.c:60
+msgid "Removes data base element files from the user's current mapset."
+msgstr "Elimină fișierele de bază din mapsetul curent."
+
+#: ../general/manage/cmd/remove.c:106
+msgid "Force remove"
+msgstr "Eliminare forțată"
+
+#: ../general/manage/cmd/remove.c:120 ../general/g.mremove/main.c:96
+#, c-format
+msgid "%s file(s) to be removed"
+msgstr "%s fișiere pentru a fi eliminate"
+
+#: ../general/manage/cmd/list.c:43
+msgid "Lists available GRASS data base files of the user-specified data type."
+msgstr "Listează fișierele de bază disponibile GRASS specificate de utilizator."
+
+#: ../general/manage/cmd/copy.c:41
+msgid "Copies available data files in the user's current mapset search path and location to the appropriate element directories under the user's current mapset."
+msgstr "Copiază fișiere de date disponibile în calea de căutare și locația celui mai apropiat director sub care a fost creat mapsetul curent."
+
+#: ../general/manage/cmd/copy.c:58
+#, c-format
+msgid "%s file(s) to be copied"
+msgstr "%s fișiere pentru a fi copiate"
+
+#: ../general/manage/cmd/copy.c:74
+#, c-format
+msgid "<%s> not found"
+msgstr "<%s> nu a fost găsit"
+
+#: ../general/manage/cmd/copy.c:79
+#, c-format
+msgid "%s=%s,%s: files are the same, no copy required"
+msgstr "%s=%s,%s: fișierele sunt la fel, nici o copiere nu este necesară"
+
+#: ../general/manage/cmd/copy.c:84
+#, c-format
+msgid "<%s> already exists"
+msgstr "<%s> există deja"
+
+#: ../general/g.findfile/main.c:37
+msgid "Searches for GRASS data base files and sets variables for the shell."
+msgstr ""
+
+#: ../general/g.findfile/main.c:54
+msgid "Name of an existing map"
+msgstr ""
+
+#: ../general/g.findfile/main.c:60
+msgid "Name of a mapset"
+msgstr ""
+
+#: ../general/g.findfile/main.c:65
+msgid "Don't add quotes"
+msgstr ""
+
+#: ../general/g.findfile/main.c:79
+#, c-format
+msgid "Parameter 'file' contains reference to <%s> mapset, but mapset parameter <%s> does not correspond"
+msgstr ""
+
+#: ../general/g.mapsets/dsply_maps.c:23
+#, c-format
+msgid "Available mapsets:"
+msgstr ""
+
+#: ../general/g.mapsets/dsply_maps.c:33
+#, c-format
+msgid "** no mapsets **\n"
+msgstr "** nici un mapset **\n"
+
+#: ../general/g.mapsets/main.c:59
+msgid "general, settings, search path"
+msgstr "general, setări, caută cale"
+
+#: ../general/g.mapsets/main.c:60
+msgid "Modifies the user's current mapset search path."
+msgstr "Modifică calea de căutare a utilizatorului mapset-ului curent."
+
+#: ../general/g.mapsets/main.c:61
+msgid "Affects the user's access to data existing under the other mapsets in the current location."
+msgstr "Afectează accesul utilizatorului la datele existente în cadrul altor mapset-uri din locația curentă."
+
+#: ../general/g.mapsets/main.c:69
+msgid "Name(s) of existing mapset(s)"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:70 ../general/g.mapsets/main.c:79
+#: ../general/g.mapsets/main.c:88
+msgid "Search path"
+msgstr "Caută cale"
+
+#: ../general/g.mapsets/main.c:78
+msgid "Name(s) of existing mapset(s) to add to search path"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:87
+msgid "Name(s) of existing mapset(s) to remove from search path"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:91
+#: ../locale/scriptstrings/m.proj_to_translate.c:7
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:6
+#: ../locale/scriptstrings/r.out.xyz_to_translate.c:5
+msgid "Field separator"
+msgstr ""
+
+#: ../general/g.mapsets/main.c:92
+msgid "Special characters: newline, space, comma, tab"
+msgstr "Caractere speciale: linie nouă, spațiu, virgulă, tab"
+
+#: ../general/g.mapsets/main.c:97
+msgid "List all available mapsets in alphabetical order"
+msgstr "Listează toate mapset-urile valabile în ordine alfabetică"
+
+#: ../general/g.mapsets/main.c:102
+msgid "Print mapsets in current search path"
+msgstr "Printează mapset-urile în calea de căutare curentă"
+
+#: ../general/g.mapsets/main.c:107
+msgid "Show mapset selection dialog"
+msgstr "Arată caseta de selectare mapset"
+
+#: ../general/g.mapsets/main.c:132 ../general/g.mapsets/main.c:161
+#, c-format
+msgid "Mapset <%s> not found"
+msgstr "Mapset-ul <%s> nu a fost găsit"
+
+#: ../general/g.mapsets/main.c:163
+#, c-format
+msgid "Mapset <%s> added to search path"
+msgstr "Mapset <%s> adăugat la calea de căutare"
+
+#: ../general/g.mapsets/main.c:189
+#, c-format
+msgid "Mapset <%s> removed from search path"
+msgstr "Mapset <%s> eliminat din calea de căutare"
+
+#: ../general/g.mapsets/main.c:222
+msgid "Cannot open SEARCH_PATH for write"
+msgstr "Nu s-a putut deschide CAUTÄ‚_CALE pentru scriere"
+
+#: ../general/g.mapsets/dsply_path.c:30
+#, c-format
+msgid "Your mapset search list:\n"
+msgstr "Lista de căutare mapset:\n"
+
+#: ../general/g.mapsets/dsply_path.c:38
+#, c-format
+msgid "<%s> not found in mapset list"
+msgstr "<%s> nu a fost găsit în lista mapset"
+
+#: ../general/g.mremove/main.c:76
+#: ../locale/scriptstrings/db.dropcol_to_translate.c:3
+#: ../locale/scriptstrings/db.droptable_to_translate.c:3
+msgid "Force removal (required for actual deletion of files)"
+msgstr "Forțează eliminarea (necesară pentru ștergea actuală a fișierelor)"
+
+#: ../general/g.mremove/main.c:80
+msgid "Remove base maps"
+msgstr "Elimină hărțile de bază"
+
+#: ../general/g.mremove/main.c:107
+msgid "The following files would be deleted:"
+msgstr "Următoarele fișiere vor fi șterse:"
+
+#: ../general/g.mremove/main.c:158
+msgid "You must use the force flag to actually remove them. Exiting."
+msgstr "Trebuie să utilizați parametrul de forțare pentru a le elimina. Ieșire."
+
+#: ../general/g.mremove/do_remove.c:21
+#, c-format
+msgid "Removing %s <%s>"
+msgstr "Eliminarea %s <%s>"
+
+#: ../general/g.mremove/do_remove.c:42 ../general/g.mremove/do_remove.c:84
+msgid "couldn't be removed"
+msgstr "nu a putut fi eliminat"
+
+#: ../general/g.mremove/do_remove.c:62
+#, c-format
+msgid "%s: couldn't be removed"
+msgstr "%s: nu a putut fi eliminat"
+
+#: ../general/g.mremove/do_remove.c:67 ../general/g.mremove/do_remove.c:89
+#, c-format
+msgid "%s: missing"
+msgstr "%s: lipsă"
+
+#: ../general/g.mremove/do_remove.c:71 ../general/g.mremove/do_remove.c:93
+#, c-format
+msgid "%s: removed"
+msgstr "%s: eliminat"
+
+#: ../general/g.mremove/do_remove.c:100
+#, c-format
+msgid "<%s> nothing removed"
+msgstr "<%s> nimic de eliminat"
+
+#: ../general/g.mapset/main.c:48 ../general/g.region/main.c:72
+#: ../general/g.gisenv/main.c:38
+msgid "general, settings"
+msgstr "general, setări"
+
+#: ../general/g.mapset/main.c:49
+msgid "Changes current mapset."
+msgstr "Schimbă mapset-ul curent."
+
+#: ../general/g.mapset/main.c:50
+msgid "Optionally create new mapset or list available mapsets in given location."
+msgstr "Crează opțional un mapset nou sau liste cu mapset-uri valabile în locația dată."
+
+#: ../general/g.mapset/main.c:57
+msgid "Name of mapset where to switch"
+msgstr ""
+
+#: ../general/g.mapset/main.c:65
+msgid "Location name (not location path)"
+msgstr "Numele locației (nu calea locației)"
+
+#: ../general/g.mapset/main.c:75
+msgid "GIS data directory (full path to the directory where the new location is)"
+msgstr "Directorul datelor GIS (calea către directorul unde noua locație este)"
+
+#: ../general/g.mapset/main.c:80
+msgid "Create mapset if it doesn't exist"
+msgstr "Crează mapset în cazul în care acesta nu există"
+
+#: ../general/g.mapset/main.c:86
+msgid "List available mapsets"
+msgstr "Listă cu mapset-uri valabile"
+
+#: ../general/g.mapset/main.c:93
+msgid "Either mapset= or -l must be used"
+msgstr "Oricare mapset= sau -l trebuie utilizat"
+
+#: ../general/g.mapset/main.c:139
+#, c-format
+msgid "<%s> is already the current mapset"
+msgstr "<%s> există deja în mapsetul curent"
+
+#: ../general/g.mapset/main.c:147
+msgid "You don't have permission to use this mapset"
+msgstr "Nu aveți permisiunea de a utiliza acest mapset"
+
+#: ../general/g.mapset/main.c:156
+msgid "The mapset does not exist. Use -c flag to create it."
+msgstr "Mapset-ul nu există. Utilizați parametrul -c pentru a-l crea."
+
+#: ../general/g.mapset/main.c:165
+msgid "Unable to read GIS_LOCK environment variable"
+msgstr "Imposibil de citit variabila GIS_LOCK"
+
+#: ../general/g.mapset/main.c:179
+#, c-format
+msgid "%s is currently running GRASS in selected mapset or lock file cannot be checked"
+msgstr "%s este în curs de rulare GRASS în mapset-ul selectat sau fișierele blocate nu pot fi verificate"
+
+#: ../general/g.mapset/main.c:183
+msgid "Erasing monitors..."
+msgstr ""
+
+#: ../general/g.mapset/main.c:199
+msgid "Cleaning up temporary files..."
+msgstr ""
+
+#: ../general/g.mapset/main.c:213
+msgid "Your shell continues to use the history for the old mapset"
+msgstr ""
+
+#: ../general/g.mapset/main.c:217
+#, c-format
+msgid ""
+"You can switch the history by commands:\n"
+"history -w; history -r %s/.bash_history; HISTFILE=%s/.bash_history"
+msgstr ""
+
+#: ../general/g.mapset/main.c:222
+#, c-format
+msgid ""
+"You can switch the history by commands:\n"
+"history -S; history -L %s/.history; setenv histfile=%s/.history"
+msgstr ""
+
+#: ../general/g.mapset/main.c:228
+#, c-format
+msgid "Your current mapset is <%s>"
+msgstr ""
+
+#: ../general/g.region/main.c:74
+msgid "Manages the boundary definitions for the geographic region."
+msgstr "Gestionați definirea limitelor pentru regiunea geografică."
+
+#: ../general/g.region/main.c:81 ../general/g.region/main.c:87
+#: ../general/g.region/main.c:175 ../general/g.region/main.c:182
+#: ../general/g.region/main.c:191 ../general/g.region/main.c:198
+#: ../general/g.region/main.c:208
+msgid "Existing"
+msgstr "Ieșire"
+
+#: ../general/g.region/main.c:85
+msgid "Save as default region"
+msgstr ""
+
+#: ../general/g.region/main.c:86
+msgid "Only possible from the PERMANENT mapset"
+msgstr ""
+
+#: ../general/g.region/main.c:91
+msgid "Print the current region"
+msgstr ""
+
+#: ../general/g.region/main.c:96
+msgid "Print the current region in lat/long using the current ellipsoid/datum"
+msgstr ""
+
+#: ../general/g.region/main.c:102
+msgid "Print the current region extent"
+msgstr ""
+
+#: ../general/g.region/main.c:108
+msgid "Print the current region map center coordinates"
+msgstr ""
+
+#: ../general/g.region/main.c:114
+msgid "Print the current region in GMT style"
+msgstr ""
+
+#: ../general/g.region/main.c:120
+msgid "Print the current region in WMS style"
+msgstr ""
+
+#: ../general/g.region/main.c:126
+msgid "Print region resolution in meters (geodesic)"
+msgstr ""
+
+#: ../general/g.region/main.c:131
+msgid "Print the convergence angle (degrees CCW)"
+msgstr ""
+
+#: ../general/g.region/main.c:133
+msgid "The difference between the projection's grid north and true north, measured at the center coordinates of the current region."
+msgstr ""
+
+#: ../general/g.region/main.c:139
+msgid "Print also 3D settings"
+msgstr ""
+
+#: ../general/g.region/main.c:145
+msgid "Print the maximum bounding box in lat/long on WGS84"
+msgstr ""
+
+#: ../general/g.region/main.c:156
+msgid "Align region to resolution (default = align to bounds, works only for 2D resolution)"
+msgstr ""
+
+#: ../general/g.region/main.c:162
+msgid "Do not update the current region"
+msgstr ""
+
+#: ../general/g.region/main.c:163 ../general/g.region/main.c:366
+#: ../vector/v.label/main.c:91 ../vector/v.label/main.c:96
+#: ../vector/v.label/main.c:171 ../vector/v.label/main.c:184
+msgid "Effects"
+msgstr ""
+
+#: ../general/g.region/main.c:173
+msgid "Set current region from named region"
+msgstr ""
+
+#: ../general/g.region/main.c:189
+msgid "Set region to match this 3D raster map (both 2D and 3D values)"
+msgstr ""
+
+#: ../general/g.region/main.c:256
+msgid "Value for the top edge"
+msgstr ""
+
+#: ../general/g.region/main.c:265
+msgid "Value for the bottom edge"
+msgstr ""
+
+#: ../general/g.region/main.c:274
+msgid "Number of rows in the new region"
+msgstr ""
+
+#: ../general/g.region/main.c:275 ../general/g.region/main.c:284
+#: ../general/g.region/main.c:294 ../general/g.region/main.c:304
+#: ../general/g.region/main.c:314 ../general/g.region/main.c:324
+#: ../general/g.region/main.c:333
+msgid "Resolution"
+msgstr ""
+
+#: ../general/g.region/main.c:283
+msgid "Number of columns in the new region"
+msgstr ""
+
+#: ../general/g.region/main.c:293
+msgid "Grid resolution 2D (both north-south and east-west)"
+msgstr ""
+
+#: ../general/g.region/main.c:303
+msgid "3D grid resolution (north-south, east-west and top-bottom)"
+msgstr ""
+
+#: ../general/g.region/main.c:312
+msgid "North-south grid resolution 2D"
+msgstr ""
+
+#: ../general/g.region/main.c:322
+msgid "East-west grid resolution 2D"
+msgstr ""
+
+#: ../general/g.region/main.c:332
+msgid "Top-bottom grid resolution 3D"
+msgstr ""
+
+#: ../general/g.region/main.c:342
+msgid "Shrink region until it meets non-NULL data from this raster map"
+msgstr ""
+
+#: ../general/g.region/main.c:353
+msgid "Adjust region cells to cleanly align with this raster map"
+msgstr ""
+
+#: ../general/g.region/main.c:364
+msgid "Save current region settings in named region file"
+msgstr ""
+
+#: ../general/g.region/main.c:511
+#, c-format
+msgid "Unable to read header of 3D raster map <%s@%s>"
+msgstr "Imposibil de citit antetul hărții raster 3D <%s@%s>"
+
+#: ../general/g.region/main.c:554
+#, c-format
+msgid "Unable to open vector map <%s@%s>"
+msgstr "Imposibil de deschis harta vectorială <%s@%s>"
+
+#: ../general/g.region/main.c:836
+#, c-format
+msgid "Raster map <%s@%s>: %s"
+msgstr "Harta raster <%s@%s>: %s"
+
+#: ../general/g.region/main.c:842
+#, c-format
+msgid "<%s> is an illegal region name"
+msgstr "<%s> este un nume de regiune ilegal"
+
+#: ../general/g.region/main.c:846
+#, c-format
+msgid "Unable to set region <%s>"
+msgstr "Imposibil de setat regiunea <%s>"
+
+#: ../general/g.region/main.c:852
+msgid "Unable to update current region"
+msgstr "Imposibil de actualizat regiunea curentă"
+
+#: ../general/g.region/main.c:860
+msgid "Unable to change default region. The current mapset is not <PERMANENT>."
+msgstr "Imposibil de modificat regiunea implicită. Mapsetul curent nu este <PERMANENT>."
+
+#: ../general/g.region/main.c:877
+#, c-format
+msgid "Invalid input <%s=%s>"
+msgstr "Intrare nevalidă <%s=%s>"
+
+#: ../general/g.region/main.c:898
+msgid "format"
+msgstr "format"
+
+#: ../general/g.region/zoom.c:23
+#, c-format
+msgid "Unable to open raster map <%s> in <%s>"
+msgstr "Imposibil de deschis harta raster <%s> in <%s>"
+
+#: ../general/g.region/zoom.c:35
+#, c-format
+msgid "Could not read from <%s>"
+msgstr "Nu s-a putut citi din <%s>"
+
+#: ../general/g.region/printwindow.c:263 ../general/g.region/printwindow.c:516
+#: ../general/g.region/printwindow.c:647
+msgid "Unable to update lat/long projection parameters"
+msgstr "Imposibil de actualizat parametrii proiecției lat/long"
+
+#: ../general/g.region/printwindow.c:410
+msgid "You are already in Lat/Long. Use the -p flag instead."
+msgstr "Sunteți deja în Lat/Long. Utilizați parametrul -p."
+
+#: ../general/g.region/printwindow.c:412
+msgid "You are in a simple XY location, projection to Lat/Lon is not possible. Use the -p flag instead."
+msgstr "Sunteți într-o locație simplă XY, proiectarea în Lat/Lon nu este posibilă. Utilizați parametrul -p."
+
+#: ../general/g.region/printwindow.c:637
+msgid "WGS84 output not possible as this location does not contain datum transformation parameters. Try running g.setproj."
+msgstr "Imposibil de proiectat datele în WGS84 atât timp cât locația nu conține parametrii de transformare a datumului. Încercați rularea g.setproj."
+
+#: ../general/g.region/printwindow.c:783
+msgid "Lat/Long calculations are not possible from a simple XY system"
+msgstr "Calcularea Lat/Long nu este posibilă în sistemul simplu XY"
+
+#: ../general/g.pnmcomp/main.c:37
+#, c-format
+msgid "Invalid color: %s"
+msgstr "Culoare nevalidă: %s"
+
+#: ../general/g.pnmcomp/main.c:53
+msgid "Error reading PPM file"
+msgstr "Eroare în citirea fișierului PPM"
+
+#: ../general/g.pnmcomp/main.c:68 ../general/g.pnmcomp/main.c:73
+#: ../general/g.pnmcomp/main.c:82 ../general/g.pnmcomp/main.c:133
+#: ../general/g.pnmcomp/main.c:146
+msgid "Invalid PPM file"
+msgstr "Fișier PPM nevalid"
+
+#: ../general/g.pnmcomp/main.c:95
+#, c-format
+msgid "File <%s> not found"
+msgstr "Fișierul <%s> nu a fost găsit"
+
+#: ../general/g.pnmcomp/main.c:103
+msgid "Expecting PPM but got PGM"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:108
+msgid "Expecting PGM but got PPM"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:111
+#, c-format
+msgid "Invalid magic number: 'P%c'"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:124 ../general/g.pnmcomp/main.c:141
+msgid "Invalid PGM file"
+msgstr "Fișier PGM nevalid"
+
+#: ../general/g.pnmcomp/main.c:246
+msgid "Error writing PPM file"
+msgstr "Eroare în scrierea fișierului PPM"
+
+#: ../general/g.pnmcomp/main.c:263
+msgid "Error writing PGM file"
+msgstr "Eroare în scrierea fișierului PGM"
+
+#: ../general/g.pnmcomp/main.c:289
+msgid "Names of input files"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:296
+msgid "Names of mask files"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:303
+msgid "Layer opacities"
+msgstr "Opacitatea stratului"
+
+#: ../general/g.pnmcomp/main.c:309
+msgid "Name of output file"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:316
+msgid "Name of output mask file"
+msgstr ""
+
+#: ../general/g.pnmcomp/main.c:323
+msgid "Image width"
+msgstr "Lățimea imaginii"
+
+#: ../general/g.pnmcomp/main.c:329
+msgid "Image height"
+msgstr "Înălțimea imaginii"
+
+#: ../general/g.pnmcomp/main.c:334 ../display/d.path/main.c:116
+#: ../vector/v.label/main.c:188 ../vector/v.label.sa/main.c:170
+#: ../vector/v.lrs/v.lrs.label/main.c:228
+msgid "Background color"
+msgstr "Culoarea de fundal"
+
+#: ../general/g.gisenv/main.c:40
+msgid "Outputs and modifies the user's current GRASS variable settings."
+msgstr "Afișează și modifică setările variabilelor ale utilizatorului GRASS curent."
+
+#: ../general/g.gisenv/main.c:45
+msgid "GRASS variable to get"
+msgstr "Variabila GRASS pentru obținere"
+
+#: ../general/g.gisenv/main.c:52
+msgid "GRASS variable to set"
+msgstr "Variabila GRASS pentru setare"
+
+#: ../general/g.gisenv/main.c:61
+msgid "Where GRASS variable is stored"
+msgstr "Unde variabila GRASS este stocată"
+
+#: ../general/g.gisenv/main.c:66
+msgid "Use shell syntax (for \"eval\")"
+msgstr ""
+
+#: ../general/g.gisenv/main.c:70
+msgid "Don't use shell syntax"
+msgstr ""
+
+#: ../general/g.gisenv/main.c:76
+msgid "-s and -n are mutually exclusive"
+msgstr ""
+
+#: ../general/g.transform/main.c:97
+#, c-format
+msgid "Not enough points, %d are required"
+msgstr ""
+
+#: ../general/g.transform/main.c:101
+#, c-format
+msgid "Error conducting transform (%d)"
+msgstr ""
+
+#: ../general/g.transform/main.c:199
+msgid "Poorly placed control points"
+msgstr ""
+
+#: ../general/g.transform/main.c:201
+msgid "Insufficient memory"
+msgstr "Memorie insuficientă"
+
+#: ../general/g.transform/main.c:203
+msgid "Parameter error"
+msgstr "Eroare de parametru"
+
+#: ../general/g.transform/main.c:205
+msgid "No active control points"
+msgstr "Nici un punct de control activ"
+
+#: ../general/g.transform/main.c:300
+#, c-format
+msgid "Invalid coordinates: [%s]"
+msgstr "Coordonate nevalide: [%s]"
+
+#: ../general/g.transform/main.c:320
+msgid "general, transformation, GCP"
+msgstr "general, transformare, GCP"
+
+#: ../general/g.transform/main.c:322
+msgid "Computes a coordinate transformation based on the control points."
+msgstr "Calculează transformări de coordonate bazate pe punctele de control."
+
+#: ../general/g.transform/main.c:331
+msgid "Rectification polynomial order"
+msgstr ""
+
+#: ../general/g.transform/main.c:339
+msgid "idx;point index;src;source coordinates;dst;destination coordinates;fwd;forward coordinates (destination);rev;reverse coordinates (source);fxy;forward coordinates difference (destination);rxy;reverse coordinates difference (source);fd;forward error (destination);rd;reverse error (source)"
+msgstr ""
+
+#: ../general/g.transform/main.c:349 ../vector/v.out.ascii/out.c:63
+msgid "Output format"
+msgstr ""
+
+#: ../general/g.transform/main.c:353
+msgid "Display summary information"
+msgstr ""
+
+#: ../general/g.transform/main.c:359
+msgid "File containing coordinates to transform (\"-\" to read from stdin)"
+msgstr ""
+
+#: ../general/g.transform/main.c:360
+msgid "Local x,y coordinates to target east,north"
+msgstr ""
+
+#: ../general/g.transform/main.c:364
+msgid "Reverse transform of coords file or coeff. dump"
+msgstr ""
+
+#: ../general/g.transform/main.c:365
+msgid "Target east,north coordinates to local x,y"
+msgstr ""
+
+#: ../general/g.transform/main.c:369
+msgid "Display transform matrix coefficients"
+msgstr ""
+
+#: ../sites/s.out.ascii/main.c:47 ../sites/s.in.ascii/main.c:50
+msgid "sites"
+msgstr ""
+
+#: ../db/base/databases.c:52 ../db/base/dropdb.c:43 ../db/base/droptable.c:44
+#: ../db/base/createdb.c:43 ../db/base/execute.c:61 ../db/base/tables.c:46
+#: ../db/base/columns.c:45 ../db/base/select.c:67 ../db/base/describe.c:52
+#: ../doc/vector/v.example/main.c:123 ../display/d.thematic.area/main.c:230
+#: ../display/d.vect/main.c:470 ../vector/v.out.ogr/main.c:629
+#: ../vector/v.out.ascii/b2a.c:46 ../vector/v.out.svg/main.c:155
+#: ../vector/v.in.sites/main.c:158 ../vector/v.drape/main.c:288
+#: ../vector/v.extract/main.c:286 ../vector/v.out.vtk/writeVTK.c:635
+#: ../vector/v.edit/select.c:514 ../vector/v.db.connect/main.c:212
+#: ../vector/v.db.connect/main.c:278
+#, c-format
+msgid "Unable to start driver <%s>"
+msgstr "Imposibil de pornit driver-ul<%s>"
+
+#: ../db/base/databases.c:56
+msgid "Unable to list databases"
+msgstr "Imposibil de listat baza de date"
+
+#: ../db/base/databases.c:85
+msgid "Location name"
+msgstr "Numele locației"
+
+#: ../db/base/databases.c:90 ../db/base/dropdb.c:71 ../db/base/droptable.c:78
+#: ../db/base/createdb.c:71
+msgid "database, SQL"
+msgstr "bază de date, SQL"
+
+#: ../db/base/databases.c:92
+msgid "List all databases for a given driver and location."
+msgstr "Listează toate bazele de date pentru un driver și locație dată."
+
+#: ../db/base/dropdb.c:72
+msgid "Removes a database."
+msgstr "Elimină baza de date."
+
+#: ../db/base/droptable.c:79
+msgid "Removes a table from database."
+msgstr "Elimină tabel din baza de date."
+
+#: ../db/base/createdb.c:72
+msgid "Creates an empty database."
+msgstr "Crează o bază de date goală."
+
+#: ../db/base/execute.c:68 ../db/base/tables.c:51 ../db/base/select.c:73
+#: ../db/base/describe.c:57 ../display/d.thematic.area/main.c:235
+#: ../display/d.vect/main.c:475 ../vector/v.convert/att.c:73
+#, c-format
+msgid "Unable to open database <%s>"
+msgstr "Imposibil de deschis baza de date <%s>"
+
+#: ../db/base/execute.c:78 ../db/base/execute.c:86
+#, c-format
+msgid "Error while executing: '%s'"
+msgstr "Eroare în timpul executării: '%s'"
+
+#: ../db/base/execute.c:112 ../db/base/copy.c:37 ../db/base/select.c:255
+msgid "database, attribute table, SQL"
+msgstr "bază de date, tabel de atribute, SQL"
+
+#: ../db/base/execute.c:113
+msgid "Executes any SQL statement."
+msgstr "Execută orice declarație SQL."
+
+#: ../db/base/execute.c:117
+msgid "Name of file containing SQL statements"
+msgstr "Numele fișierului care conține declarația SQL"
+
+#: ../db/base/execute.c:118 ../vector/v.to.db/parse.c:47
+#: ../vector/v.to.db/parse.c:99
+msgid "Query"
+msgstr "Interogare"
+
+#: ../db/base/execute.c:119
+msgid "If not given or '-' read from standard input"
+msgstr ""
+
+#: ../db/base/execute.c:123 ../db/base/execute.c:128
+#: ../vector/v.in.db/main.c:63 ../vector/v.in.db/main.c:67
+msgid "Connection"
+msgstr "Conexiune"
+
+#: ../db/base/execute.c:134
+msgid "Ignore SQL errors and continue"
+msgstr "Ignoră erorile SQL și continuă"
+
+#: ../db/base/tables.c:87
+msgid "Print tables and exit"
+msgstr "Printează tabelele și ieși"
+
+#: ../db/base/tables.c:91
+msgid "System tables instead of user tables"
+msgstr "Tabele de sistem în loc de tabele de utilizator"
+
+#: ../db/base/tables.c:95 ../db/base/columns.c:92 ../db/base/drivers.c:73
+#: ../db/base/describe.c:125 ../locale/scriptstrings/db.test_to_translate.c:2
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:2
+#: ../locale/scriptstrings/db.dropcol_to_translate.c:2
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:2
+#: ../locale/scriptstrings/db.droptable_to_translate.c:2
+msgid "database, attribute table"
+msgstr "bază de date, tabel de atribute"
+
+#: ../db/base/tables.c:96
+msgid "Lists all tables for a given database."
+msgstr "Listează toate tabelele pentru o bază de date dată."
+
+#: ../db/base/connect.c:45
+msgid "database, attribute table, connection settings"
+msgstr "bază de date, tabel de atribute, setările conexiunii"
+
+#: ../db/base/connect.c:47
+msgid "Prints/sets general DB connection for current mapset and exits."
+msgstr "Printează/setează conexiunea generală BD pentru mapsetul curent și după aceea ieși."
+
+#: ../db/base/connect.c:51
+msgid "Print current connection parameters and exit"
+msgstr "Printează parametrii conexiunii curente și ieși"
+
+#: ../db/base/connect.c:57
+msgid "Check connection parameters, set if uninitialized, and exit"
+msgstr ""
+
+#: ../db/base/connect.c:74
+msgid "Database schema"
+msgstr "Schema bazei de date"
+
+#: ../db/base/connect.c:75
+msgid "Do not use this option if schemas are not supported by driver/database server"
+msgstr "Nu utilizați această opțiune dacă schemele nu sunt acceptate de driver/serverul bazei de date"
+
+#: ../db/base/connect.c:85
+msgid "Default group of database users to which select privilege is granted"
+msgstr ""
+
+#: ../db/base/connect.c:121
+msgid "Database connection not defined. Run db.connect."
+msgstr "Conexiunea bazei de date nu este definită. Rulați db.connect."
+
+#: ../db/base/connect.c:141
+#, c-format
+msgid ""
+"Default driver / database set to:\n"
+"driver: %s\n"
+"database: %s"
+msgstr ""
+"Driver implicit / baza de date setată la:\n"
+"driver: %s\n"
+"baza de date: %s"
+
+#: ../db/base/connect.c:148
+msgid "Default driver is not set"
+msgstr "Driver-ul implicit nu este setat "
+
+#: ../db/base/connect.c:151
+msgid "Default database is not set"
+msgstr "Baza de date implicită nu este setată"
+
+#: ../db/base/columns.c:93
+msgid "List all columns for a given table."
+msgstr "Listează toate coloanele pentru un tabel dat."
+
+#: ../db/base/copy.c:38
+msgid "Copy a table."
+msgstr "Copiază un tabel."
+
+#: ../db/base/copy.c:40
+msgid "Either 'from_table' (optionally with 'where') can be used or 'select' option, but not 'from_table' and 'select' at the same time."
+msgstr ""
+
+#: ../db/base/copy.c:46
+msgid "Input driver name"
+msgstr ""
+
+#: ../db/base/copy.c:52
+msgid "Input database name"
+msgstr ""
+
+#: ../db/base/copy.c:59
+msgid "Input table name (only, if 'select' is not used)"
+msgstr ""
+
+#: ../db/base/copy.c:65
+msgid "Output driver name"
+msgstr ""
+
+#: ../db/base/copy.c:71
+msgid "Output database name"
+msgstr ""
+
+#: ../db/base/copy.c:78
+msgid "Output table name"
+msgstr ""
+
+#: ../db/base/copy.c:87
+msgid "Full select statement (only, if 'from_table' and 'where' is not used)"
+msgstr ""
+
+#: ../db/base/copy.c:88
+msgid "E.g.: SELECT dedek FROM starobince WHERE obec = 'Frimburg'"
+msgstr ""
+
+#: ../db/base/copy.c:96
+msgid "Cannot combine 'from_table' and 'select' options"
+msgstr ""
+
+#: ../db/base/copy.c:114
+msgid "Either 'from_table' or 'select' option must be given."
+msgstr ""
+
+#: ../db/base/copy.c:117
+msgid "Cannot combine 'select' and 'where' options"
+msgstr ""
+
+#: ../db/base/copy.c:127
+msgid "Copy table failed"
+msgstr "Copierea tabelului a eșuat"
+
+#: ../db/base/drivers.c:41
+msgid "Error trying to read dbmscap file"
+msgstr ""
+
+#: ../db/base/drivers.c:65
+msgid "Full output"
+msgstr ""
+
+#: ../db/base/drivers.c:69
+msgid "Print drivers and exit"
+msgstr "Printează drivere și ieși"
+
+#: ../db/base/drivers.c:74
+msgid "Lists all database drivers."
+msgstr "Listează toate driverele bazei de date."
+
+#: ../db/base/select.c:93
+#, c-format
+msgid "Test %s."
+msgstr "Test %s."
+
+#: ../db/base/select.c:93 ../imagery/i.ortho.photo/i.photo.rectify/report.c:10
+#: ../imagery/i.rectify/report.c:10
+msgid "failed"
+msgstr "eșuat"
+
+#: ../db/base/select.c:93
+msgid "succeeded"
+msgstr ""
+
+#: ../db/base/select.c:205
+msgid "SQL select statement"
+msgstr "Declarația Select SQL "
+
+#: ../db/base/select.c:207
+msgid "For example: 'select * from rybniky where kapri = 'hodne'"
+msgstr "De exemplu: 'select * from rybniky where kapri = 'hodne'"
+
+#: ../db/base/select.c:211
+msgid "Name of file with sql statement"
+msgstr ""
+
+#: ../db/base/select.c:215 ../db/base/select.c:221 ../db/base/select.c:228
+#: ../db/base/select.c:238 ../db/base/select.c:247
+#: ../vector/v.db.select/main.c:65 ../vector/v.db.select/main.c:71
+#: ../vector/v.db.select/main.c:78 ../vector/v.db.select/main.c:94
+#: ../vector/v.db.select/main.c:99
+msgid "Format"
+msgstr "Format"
+
+#: ../db/base/select.c:219 ../vector/v.db.select/main.c:69
+msgid "Output vertical record separator"
+msgstr ""
+
+#: ../db/base/select.c:227 ../vector/v.db.select/main.c:77
+msgid "Null value indicator"
+msgstr ""
+
+#: ../db/base/select.c:237 ../vector/v.db.select/main.c:93
+msgid "Do not include column names in output"
+msgstr ""
+
+#: ../db/base/select.c:242
+msgid "Describe query only (don't run it)"
+msgstr ""
+
+#: ../db/base/select.c:246 ../vector/v.db.select/main.c:98
+msgid "Vertical output (instead of horizontal)"
+msgstr ""
+
+#: ../db/base/select.c:251
+msgid "Only test query, do not execute"
+msgstr ""
+
+#: ../db/base/select.c:256
+msgid "Selects data from attribute table (performs SQL query statement(s))."
+msgstr "Selectează date din tabela de atribute (efectuează declarație de interogare SQL)"
+
+#: ../db/base/describe.c:63 ../doc/vector/v.example/main.c:134
+#: ../vector/v.in.ascii/in.c:408 ../vector/v.info/main.c:222
+#: ../vector/v.out.ogr/main.c:639 ../vector/v.out.svg/main.c:168
+#: ../vector/v.patch/main.c:139 ../vector/v.patch/main.c:177
+#: ../vector/v.drape/main.c:299 ../vector/v.out.vtk/writeVTK.c:644
+#: ../vector/v.reclass/main.c:174 ../vector/v.db.connect/main.c:223
+#: ../vector/v.random/main.c:214
+#, c-format
+msgid "Unable to describe table <%s>"
+msgstr "Nu s-a putut descrie tabelul<%s>"
+
+#: ../db/base/describe.c:104
+msgid "Print column names only instead of full column descriptions"
+msgstr "Printează doar numele coloanelor care conțin descrierea completă a acestora"
+
+#: ../db/base/describe.c:109
+msgid "Print table structure"
+msgstr "Printează structura tabelului"
+
+#: ../db/base/describe.c:126
+msgid "Describes a table in detail."
+msgstr "Descrie în detaliu un tabel."
+
+#: ../db/db.login/main.c:43
+msgid "database, connection settings"
+msgstr "baza de date, setările cenexiunii"
+
+#: ../db/db.login/main.c:44
+msgid "Sets user/password for driver/database."
+msgstr "Setarea utilizator/parolă pentru driver/baza de date."
+
+#: ../db/db.login/main.c:60
+msgid "Username"
+msgstr "Nume utilizator"
+
+#: ../db/db.login/main.c:67
+msgid "Password"
+msgstr "Parolă"
+
+#: ../db/db.login/main.c:83
+#, c-format
+msgid ""
+"\n"
+"Enter database password for connection\n"
+"<%s:%s:user=%s>\n"
+msgstr ""
+"\n"
+"Introduceți parola bazei de date pentru conexiune\n"
+"<%s:%s:user=%s>\n"
+
+#: ../db/db.login/main.c:85
+#, c-format
+msgid "Hit RETURN to cancel request\n"
+msgstr ""
+
+#: ../db/db.login/main.c:93
+msgid "Exiting. Not changing current settings"
+msgstr "Ieșire. Nici o schimbare a setărilor curente"
+
+#: ../db/db.login/main.c:97
+msgid "New password set"
+msgstr "Setează parolă nouă"
+
+#: ../db/db.login/main.c:106
+msgid "Unable to set user/password"
+msgstr "Nu s-a putut seta utilizator/parolă"
+
+#: ../db/db.login/main.c:110
+msgid "The password was stored in file"
+msgstr "Parola a fost stocată în fișier"
+
+#: ../db/drivers/ogr/fetch.c:132 ../db/drivers/ogr/describe.c:165
+msgid "Unknown type"
+msgstr "Tip necunoscut"
+
+#: ../db/drivers/ogr/describe.c:94
+#, c-format
+msgid "OGR driver: column '%s', OGR type %d  is not supported"
+msgstr "Driver OGR: coloana '%s', tip OGR %d nu este acceptat"
+
+#: ../db/drivers/ogr/describe.c:157
+#, c-format
+msgid "column '%s', type 'string': unknown width -> stored as varchar(250) some data may be lost"
+msgstr "coloana '%s', tip 'string': lățime necunoscută -> stocată ca varchar(250) anumite date pot fi pierdute"
+
+#: ../db/drivers/sqlite/main.c:47
+#, c-format
+msgid "Busy SQLITE db, already waiting for %d seconds..."
+msgstr "SQLITE db ocupată, deja așteptarea este de %d secunde..."
+
+#: ../db/drivers/sqlite/db.c:85
+msgid "Unable to open database: "
+msgstr "Imposibil de deschis baza de date:"
+
+#: ../db/drivers/sqlite/db.c:110
+msgid "SQLite database connection is still busy"
+msgstr "Conexiunea bazei de date SQLite este încă ocupată"
+
+#: ../db/drivers/sqlite/describe.c:191
+#, c-format
+msgid "SQLite driver: column '%s', SQLite type %d  is not supported"
+msgstr "Driver SQLite: coloana '%s', tip SQLite %d  nu este acceptat"
+
+#: ../db/drivers/mysql/cursor.c:46
+msgid "Cannot allocate cursor."
+msgstr "Nu s-a putut aloca cursor."
+
+#: ../db/drivers/mysql/cursor.c:55
+msgid "Cannot ad new token."
+msgstr "Nu s-a putut adăuga un nou simbol."
+
+#: ../db/drivers/mysql/error.c:29
+msgid "DBMI-MySQL driver error:\n"
+msgstr "Eroare driver DBMI-MySQL:\n"
+
+#: ../db/drivers/mysql/fetch.c:34
+msgid "Cursor not found"
+msgstr "Cursorul nu a fost găsit"
+
+#: ../db/drivers/mysql/fetch.c:52
+msgid "Cursor position is not supported by MySQL driver"
+msgstr "Poziția cursorului nu este acceptată de driver MySQL"
+
+#: ../db/drivers/mysql/fetch.c:190
+msgid "Cannot scan timestamp: "
+msgstr "Nu s-a putut scana timestamp:"
+
+#: ../db/drivers/mysql/fetch.c:198
+msgid "Unknown timestamp format: "
+msgstr "Format timestamp necunoscut:"
+
+#: ../db/drivers/mysql/fetch.c:212
+msgid "Cannot scan date: "
+msgstr "Nu s-a putut scana data:"
+
+#: ../db/drivers/mysql/fetch.c:225
+msgid "Cannot scan time: "
+msgstr "Nu s-a putut scana timpul:"
+
+#: ../db/drivers/mysql/fetch.c:240
+msgid "Cannot scan datetime: "
+msgstr "Nu s-a putut scana datetime:"
+
+#: ../db/drivers/mysql/listtab.c:36
+msgid "Cannot get list of tables:\n"
+msgstr "Nu s-a putut obține lista de tabele:\n"
+
+#: ../db/drivers/mysql/db.c:67
+msgid "Cannot connect to MySQL: "
+msgstr "Nu s-a putut conecta la MySQL:"
+
+#: ../db/drivers/mysql/db.c:83
+msgid "Cannot parse MySQL embedded database name"
+msgstr "Nu s-a putut analiza numele bazei de date MySQL integrate"
+
+#: ../db/drivers/mysql/db.c:99
+msgid "Cannot initialize MySQL embedded server"
+msgstr "Nu s-a putut inițializa serverul MySQL integrat"
+
+#: ../db/drivers/mysql/db.c:118
+msgid "Cannot connect to MySQL embedded server: "
+msgstr "Nu s-a putut conecta la serverul MySQL integrat:"
+
+#: ../db/drivers/mysql/parse.c:60
+msgid "Wrong port number in MySQL database definition: "
+msgstr "Număr de port greșit în definirea bazei de date MySQL:"
+
+#: ../db/drivers/mysql/parse.c:71 ../db/drivers/postgres/parse.c:55
+msgid "'user' in database definition is not supported, use db.login"
+msgstr "'utilizator' în definirea bazei de date nu este acceptat, utilizați db.login"
+
+#: ../db/drivers/mysql/parse.c:75 ../db/drivers/postgres/parse.c:59
+msgid "'password' in database definition is not supported, use db.login"
+msgstr "'parola' în definirea bazei de date nu este acceptată, utilizați db.login"
+
+#: ../db/drivers/mysql/parse.c:79
+msgid "Unknown option in database definition for "
+msgstr "Opțiune necunoscută în definirea bazei de date pentru"
+
+#: ../db/drivers/mysql/select.c:43
+msgid "Cannot select data: \n"
+msgstr "Nu s-a putut selecta data: \n"
+
+#: ../db/drivers/mysql/describe.c:120
+#, c-format
+msgid "MySQL driver: column '%s', type %d is not supported"
+msgstr "Driver MySQL: coloana '%s', tip de date %d nu este acceptat"
+
+#: ../db/drivers/mysql/describe.c:126
+#, c-format
+msgid "column '%s' : type BIGINT is stored as integer (4 bytes) some data may be damaged"
+msgstr "coloana '%s' : tipul BIGINT este stocat ca întreg (4 bytes) unele date vor fi deteriorate"
+
+#: ../db/drivers/postgres/fetch.c:172
+msgid "Cannot recognize boolean value"
+msgstr "Nu se poate recunoaște valoarea boolean"
+
+#: ../db/drivers/postgres/parse.c:63
+msgid "Unknown option in database definition for PostgreSQL: "
+msgstr "Opțiune necunoscută în definirea bazei de date pentru PostgreSQL: "
+
+#: ../db/drivers/postgres/describe.c:103
+#, c-format
+msgid "pg driver: PostGIS column '%s', type 'geometry'  will not be converted"
+msgstr "driver pg: Coloana PostGIS '%s', tipul 'geometrie'  nu va fi convertit"
+
+#: ../db/drivers/postgres/describe.c:109
+#, c-format
+msgid "pg driver: column '%s', type %d  is not supported"
+msgstr "driver pg: coloana '%s', tipul %d  nu este acceptat"
+
+#: ../db/drivers/postgres/describe.c:116
+#, c-format
+msgid "column '%s' : type int8 (bigint) is stored as integer (4 bytes) some data may be damaged"
+msgstr ""
+
+#: ../db/drivers/postgres/describe.c:120
+#, c-format
+msgid "column '%s' : type character varying is stored as varchar(250) some data may be lost"
+msgstr ""
+
+#: ../db/drivers/postgres/describe.c:126
+#, c-format
+msgid "column '%s' : type bool (boolean) is stored as char(1), values: 0 (false), 1 (true)"
+msgstr ""
+
+#: ../doc/raster/r.example/main.c:85
+msgid "raster, keyword2, keyword3"
+msgstr "raster, cuvint cheie2, cuvant cheie3"
+
+#: ../doc/raster/r.example/main.c:86
+msgid "My first raster module"
+msgstr ""
+
+#: ../doc/raster/r.example/main.c:127
+#, c-format
+msgid "Unable to read file header of <%s>"
+msgstr "Imposibil de citit antetul fișierului <%s>"
+
+#: ../doc/vector/v.example/main.c:50
+msgid "vector, keyword2, keyword3"
+msgstr "vector, cuvint cheie2, cuvant cheie3"
+
+#: ../doc/vector/v.example/main.c:51
+msgid "My first vector module"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:79
+msgid "Unable to set predetermined vector open level"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:85 ../display/d.what.vect/main.c:126
+#: ../vector/v.net.connectivity/main.c:115 ../vector/v.surf.rst/main.c:569
+#: ../vector/v.surf.rst/main.c:724 ../vector/v.surf.rst/main.c:813
+#: ../vector/v.info/main.c:113 ../vector/v.net.bridge/main.c:80
+#: ../vector/v.out.ascii/out.c:154 ../vector/v.support/main.c:135
+#: ../vector/v.net.distance/main.c:140 ../vector/v.net/main.c:164
+#: ../vector/v.buffer2/main.c:316 ../vector/v.net.allpairs/main.c:110
+#: ../vector/v.hull/main.c:307 ../vector/v.net.visibility/main.c:82
+#: ../vector/v.net.visibility/main.c:94 ../vector/v.to.3d/main.c:72
+#: ../vector/v.net.flow/main.c:132 ../vector/v.edit/main.c:166
+#: ../vector/v.net.spanningtree/main.c:81
+#: ../vector/lidar/v.lidar.growing/main.c:141
+#: ../vector/lidar/v.lidar.growing/main.c:145
+#: ../vector/lidar/v.lidar.edgedetection/main.c:223
+#: ../vector/lidar/v.lidar.correction/main.c:186
+#: ../vector/v.net.timetable/main.c:317 ../vector/v.net.components/main.c:108
+#: ../vector/v.net.centrality/main.c:188 ../vector/v.generalize/main.c:295
+#, c-format
+msgid "Unable to open vector map <%s>"
+msgstr "Imposibil de deschis harta vectorială <%s>"
+
+#: ../doc/vector/v.example/main.c:103 ../display/d.thematic.area/plot1.c:196
+#: ../display/d.vect/area.c:54 ../display/d.vect/plot1.c:205
+#: ../display/d.vect.chart/plot.c:38 ../vector/v.extrude/main.c:163
+#: ../vector/v.info/main.c:208 ../vector/v.out.ascii/b2a.c:40
+#: ../vector/v.sample/main.c:167 ../vector/v.buffer2/main.c:329
+#: ../vector/v.db.select/main.c:149 ../vector/v.vect.stats/main.c:303
+#: ../vector/v.vect.stats/main.c:379 ../vector/v.univar/main.c:209
+#: ../vector/v.surf.idw/read_sites.c:34 ../vector/v.drape/main.c:271
+#: ../vector/v.extract/main.c:278 ../vector/v.distance/main.c:359
+#: ../vector/v.distance/main.c:395 ../vector/v.to.3d/trans3.c:47
+#: ../vector/v.to.3d/trans2.c:45 ../vector/v.overlay/main.c:345
+#: ../vector/v.edit/select.c:507 ../vector/v.what.rast/main.c:127
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:119
+#: ../vector/v.reclass/main.c:122 ../vector/v.to.rast/vect2rast.c:51
+#: ../vector/v.to.rast/support.c:124 ../vector/v.to.rast/support.c:285
+#: ../vector/v.to.rast/support.c:435 ../vector/v.db.connect/main.c:208
+#: ../vector/v.generalize/misc.c:163
+#, c-format
+msgid "Database connection not defined for layer %d"
+msgstr "Conexiunea bazei de date nu este definită pentru stratul %d"
+
+#: ../doc/vector/v.example/main.c:167
+#, c-format
+msgid "Unable to get attribute data for cat %d"
+msgstr "Imposibil de obținut datele atribut pentru cat %d"
+
+#: ../doc/vector/v.example/main.c:176
+#, c-format
+msgid "Error while retrieving database record for cat %d"
+msgstr ""
+
+#: ../doc/vector/v.example/main.c:209
+#, c-format
+msgid "Unable to copy attribute table to vector map <%s>"
+msgstr "Imposibil de copiat tabela de atribute la harta vectorială <%s>"
+
+#: ../misc/m.cogo/main.c:225
+msgid "miscellaneous, distance"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:226
+msgid "A simple utility for converting bearing and distance measurements to coordinates and vice versa."
+msgstr "O utilitate simplă de convertire a direcției și a măsurătorilor de distanță la coordonate și viceversa."
+
+#: ../misc/m.cogo/main.c:228
+msgid "It assumes a cartesian coordinate system"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:232
+msgid "Lines are labelled"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:236
+msgid "Suppress warnings"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:241
+msgid "Convert from coordinates to bearing and distance"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:256
+msgid "Starting coordinate pair"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:266
+#, c-format
+msgid "Couldn't open COGO file <%s>"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:275
+#, c-format
+msgid "Couldn't open output file <%s>"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:305 ../misc/m.cogo/main.c:308
+msgid "Converting starting coordinate pair"
+msgstr ""
+
+#: ../misc/m.cogo/main.c:324
+#, c-format
+msgid "Input parse error on line %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/cplane.c:40
+#, c-format
+msgid "Cutting plane number <%d> not found"
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:49 ../visualization/nviz/src/nviz_init.c:53
+msgid "visualization, raster, vector, raster3d"
+msgstr "vizualizare, raster, vector, raster3d"
+
+#: ../misc/m.nviz.image/main.c:50
+msgid "Creates a 3D rendering of GIS data."
+msgstr "Crează redarea 3D a datelor de GIS."
+
+#: ../misc/m.nviz.image/main.c:51
+msgid "Renders surfaces (raster data), 2D/3D vector data, and volumes (3D raster data) in 3D."
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:134
+#, c-format
+msgid "Vertical exaggeration not given, using calculated value %.0f"
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:146
+#, c-format
+msgid "Viewpoint height not given, using calculated value %.0f"
+msgstr ""
+
+#: ../misc/m.nviz.image/main.c:229
+msgid "Unsupported output format"
+msgstr "Format de ieșiere neacceptat"
+
+#: ../misc/m.nviz.image/main.c:231 ../imagery/i.cluster/main.c:346
+#, c-format
+msgid "File <%s> created."
+msgstr "Fișier <%s> creat."
+
+#: ../misc/m.nviz.image/surface.c:68
+#, c-format
+msgid "Missing topography attribute for surface %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/surface.c:129 ../misc/m.nviz.image/volume.c:144
+#, c-format
+msgid "Color attribute not defined, using default <%s>"
+msgstr ""
+
+#: ../misc/m.nviz.image/surface.c:134
+#, c-format
+msgid "Missing color attribute for surface %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/surface.c:211
+#, c-format
+msgid "Surface id %d doesn't exist"
+msgstr ""
+
+#: ../misc/m.nviz.image/surface.c:258 ../misc/m.nviz.image/surface.c:265
+#, c-format
+msgid "Unable to set draw mode for surface id %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:42 ../misc/m.nviz.image/volume.c:125
+#, c-format
+msgid "3d raster map <%s> not found"
+msgstr "harta raster 3D <%s> nu a fost găsită"
+
+#: ../misc/m.nviz.image/volume.c:92 ../misc/m.nviz.image/volume.c:231
+#, c-format
+msgid "Error tokenize '%s'"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:99 ../misc/m.nviz.image/volume.c:247
+#, c-format
+msgid "Volume set number %d is not available"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:105
+#, c-format
+msgid "Unable to add isosurface (volume set %d)"
+msgstr "Imposibil de adăugat izosuprafață (volumul setat %d)"
+
+#: ../misc/m.nviz.image/volume.c:113 ../misc/m.nviz.image/volume.c:131
+#: ../misc/m.nviz.image/volume.c:139 ../misc/m.nviz.image/volume.c:155
+#: ../misc/m.nviz.image/volume.c:162 ../misc/m.nviz.image/volume.c:173
+#: ../misc/m.nviz.image/volume.c:180
+#, c-format
+msgid "Unable to set isosurface (%d) attribute (%d) of volume %d"
+msgstr "Imposibil de setat atributele (%d) izosuprafeței (%d) volumului %d"
+
+#: ../misc/m.nviz.image/volume.c:242
+#, c-format
+msgid "Wrong name for axis: %s"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:253
+#, c-format
+msgid "Unable to add slice (volume set %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:266
+#, c-format
+msgid "Unable to set slice (%d) position of volume %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/volume.c:271
+#, c-format
+msgid "Unable to set slice (%d) transparency of volume %d"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:51
+msgid "Use draw mode for all loaded surfaces"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:52 ../misc/m.nviz.image/args.c:130
+#: ../misc/m.nviz.image/args.c:139 ../misc/m.nviz.image/args.c:146
+#: ../misc/m.nviz.image/args.c:152 ../misc/m.nviz.image/args.c:160
+#: ../misc/m.nviz.image/args.c:169 ../misc/m.nviz.image/args.c:179
+#: ../misc/m.nviz.image/args.c:187 ../misc/m.nviz.image/args.c:197
+#: ../misc/m.nviz.image/args.c:205 ../misc/m.nviz.image/args.c:215
+msgid "Surfaces"
+msgstr "Suprafețe"
+
+#: ../misc/m.nviz.image/args.c:89
+msgid "Name for output image file (without extension)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:90 ../misc/m.nviz.image/args.c:104
+#: ../misc/m.nviz.image/args.c:114
+msgid "Image"
+msgstr "Imagine"
+
+#: ../misc/m.nviz.image/args.c:102
+#: ../locale/scriptstrings/d.out.file_to_translate.c:4
+msgid "Graphics file format"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:112
+msgid "Size (width, height) of output image"
+msgstr "Dimensiunea (lățime, înălțime) pentru imaginea rezultată"
+
+#: ../misc/m.nviz.image/args.c:129
+msgid "Name of raster map(s) for elevation"
+msgstr "Numele hărții raster pentru elevație"
+
+#: ../misc/m.nviz.image/args.c:138
+msgid "Elevation value(s)"
+msgstr "Valori pentru elevație"
+
+#: ../misc/m.nviz.image/args.c:145
+msgid "Name of raster map(s) for color"
+msgstr "Numele hărții raster pentru culoare"
+
+#: ../misc/m.nviz.image/args.c:151
+msgid "Color value(s)"
+msgstr "Valori pentru culoare"
+
+#: ../misc/m.nviz.image/args.c:159
+msgid "Name of raster map(s) for mask"
+msgstr "Numele hărții raster pentru mască"
+
+#: ../misc/m.nviz.image/args.c:168
+msgid "Name of raster map(s) for transparency"
+msgstr "Numele hărții raster pentru transparență"
+
+#: ../misc/m.nviz.image/args.c:178
+msgid "Transparency value(s)"
+msgstr "Valori pentru transparență"
+
+#: ../misc/m.nviz.image/args.c:186
+msgid "Name of raster map(s) for shininess"
+msgstr "Numele hărții raster pentru strălucire"
+
+#: ../misc/m.nviz.image/args.c:196
+msgid "Shininess value(s)"
+msgstr "Valori pentru strălucire"
+
+#: ../misc/m.nviz.image/args.c:204
+msgid "Name of raster map(s) for emission"
+msgstr "Numele hărții raster pentru emisii"
+
+#: ../misc/m.nviz.image/args.c:214
+msgid "Emission value(s)"
+msgstr "Valori pentru emisii"
+
+#: ../misc/m.nviz.image/args.c:228
+msgid "Draw mode"
+msgstr "Modul de desenare"
+
+#: ../misc/m.nviz.image/args.c:231 ../misc/m.nviz.image/args.c:242
+#: ../misc/m.nviz.image/args.c:253 ../misc/m.nviz.image/args.c:265
+#: ../misc/m.nviz.image/args.c:277 ../misc/m.nviz.image/args.c:286
+#: ../misc/m.nviz.image/args.c:296 ../misc/m.nviz.image/args.c:526
+#: ../misc/m.nviz.image/args.c:538
+msgid "Draw"
+msgstr "Desenează"
+
+#: ../misc/m.nviz.image/args.c:240
+msgid "Fine resolution"
+msgstr "Rezoluție fină"
+
+#: ../misc/m.nviz.image/args.c:251
+msgid "Coarse resolution"
+msgstr "Rezoluție grosieră"
+
+#: ../misc/m.nviz.image/args.c:262
+msgid "Draw style"
+msgstr "Stilul de desenare"
+
+#: ../misc/m.nviz.image/args.c:274
+msgid "Shading"
+msgstr "Umbrirea"
+
+#: ../misc/m.nviz.image/args.c:283
+msgid "Wire color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:295
+msgid "Surface position"
+msgstr "Poziția suprafeței"
+
+#: ../misc/m.nviz.image/args.c:307
+msgid "Name of line vector overlay map(s)"
+msgstr "Numele liniei vectoriale suprapusă hărții"
+
+#: ../misc/m.nviz.image/args.c:308 ../misc/m.nviz.image/args.c:319
+#: ../misc/m.nviz.image/args.c:330 ../misc/m.nviz.image/args.c:342
+#: ../misc/m.nviz.image/args.c:352 ../misc/m.nviz.image/args.c:364
+msgid "Vector lines"
+msgstr "Linii vectoriale"
+
+#: ../misc/m.nviz.image/args.c:318
+msgid "Vector line width"
+msgstr "Lățimea liniei vectoriale"
+
+#: ../misc/m.nviz.image/args.c:327
+msgid "Vector line color"
+msgstr "Culoarea liniei vectoriale"
+
+#: ../misc/m.nviz.image/args.c:339
+msgid "Vector line display mode"
+msgstr "Modul de afișare a liniei vectoriale"
+
+#: ../misc/m.nviz.image/args.c:351
+msgid "Vector line height"
+msgstr "Înălțimea liniei vectoriale"
+
+#: ../misc/m.nviz.image/args.c:363
+msgid "Vector lines position"
+msgstr "Poziția liniei vectoriale"
+
+#: ../misc/m.nviz.image/args.c:375
+msgid "Name of point vector overlay map(s)"
+msgstr "Numele punctului vectorial suprapusă hărții"
+
+#: ../misc/m.nviz.image/args.c:376 ../misc/m.nviz.image/args.c:387
+#: ../misc/m.nviz.image/args.c:399 ../misc/m.nviz.image/args.c:410
+#: ../misc/m.nviz.image/args.c:423 ../misc/m.nviz.image/args.c:433
+msgid "Vector points"
+msgstr "puncte vectoriale"
+
+#: ../misc/m.nviz.image/args.c:386
+msgid "Icon size"
+msgstr "Dimensiunea imaginii"
+
+#: ../misc/m.nviz.image/args.c:398
+msgid "Icon width"
+msgstr "Lățimea imaginii"
+
+#: ../misc/m.nviz.image/args.c:407
+msgid "Icon color"
+msgstr "Culoarea imaginii"
+
+#: ../misc/m.nviz.image/args.c:419
+#, fuzzy
+msgid "Icon marker"
+msgstr "Marker-ul imaginii"
+
+#: ../misc/m.nviz.image/args.c:432
+msgid "Vector points position"
+msgstr "Poziția punctelor vectoriale"
+
+#: ../misc/m.nviz.image/args.c:449
+msgid "Viewpoint position (x,y model coordinates)"
+msgstr "Poziția punctului de vizualizare (model de coordonate x,y)"
+
+#: ../misc/m.nviz.image/args.c:450 ../misc/m.nviz.image/args.c:461
+#: ../misc/m.nviz.image/args.c:471 ../misc/m.nviz.image/args.c:483
+#: ../misc/m.nviz.image/args.c:504
+msgid "Viewpoint"
+msgstr "Punct de vizualizare"
+
+#: ../misc/m.nviz.image/args.c:460
+msgid "Viewpoint height (in map units)"
+msgstr "Înălțimea punctului de vizualizare (în unități de hartă)"
+
+#: ../misc/m.nviz.image/args.c:470
+msgid "Viewpoint field of view (in degrees)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:482
+msgid "Viewpoint twist angle (in degrees)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:503
+msgid "Focus to point on surface (from SW corner in map units)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:513 ../misc/m.nviz.image/args.c:548
+#: ../misc/m.nviz.image/args.c:560 ../misc/m.nviz.image/args.c:570
+#: ../misc/m.nviz.image/args.c:578 ../misc/m.nviz.image/args.c:586
+#: ../misc/m.nviz.image/args.c:595 ../misc/m.nviz.image/args.c:605
+#: ../misc/m.nviz.image/args.c:613 ../misc/m.nviz.image/args.c:623
+#: ../misc/m.nviz.image/args.c:635 ../misc/m.nviz.image/args.c:645
+#: ../misc/m.nviz.image/args.c:656
+msgid "Volumes"
+msgstr "Volume"
+
+#: ../misc/m.nviz.image/args.c:523
+msgid "Volume draw mode"
+msgstr "Modul de desenare a volumului"
+
+#: ../misc/m.nviz.image/args.c:535
+msgid "Volume shading"
+msgstr "Umbrirea volumului"
+
+#: ../misc/m.nviz.image/args.c:547
+msgid "Volume position"
+msgstr "Poziția volumului"
+
+#: ../misc/m.nviz.image/args.c:558
+msgid "Volume resolution"
+msgstr "Rezoluția volumului"
+
+#: ../misc/m.nviz.image/args.c:569
+msgid "Isosurface level"
+msgstr "Nivelul izosuprafeței"
+
+#: ../misc/m.nviz.image/args.c:577
+msgid "Name of volume for isosurface color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:585
+msgid "Isosurface color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:594
+msgid "Name of 3D raster map(s) for isosurface transparency"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:604
+msgid "Transparency value(s)for isosurfaces"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:612
+msgid "Name of 3D raster map(s) for shininess"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:622
+msgid "Shininess value(s) for isosurfaces"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:634
+msgid "Volume slice parallel to given axis (x, y, z)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:644
+msgid "Volume slice position"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:655
+msgid "Volume slice transparency"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:671
+msgid "Cutting plane index (0-5)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:672 ../misc/m.nviz.image/args.c:681
+#: ../misc/m.nviz.image/args.c:690 ../misc/m.nviz.image/args.c:701
+#: ../misc/m.nviz.image/args.c:712
+msgid "Cutting planes"
+msgstr "Planuri de tăiere"
+
+#: ../misc/m.nviz.image/args.c:680
+msgid "Cutting plane x,y,z coordinates"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:691
+msgid "Cutting plane rotation along the vertical axis"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:702
+msgid "Cutting plane tilt"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:713
+msgid "Cutting plane color (between two surfaces)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:727
+msgid "Light position (x,y,z model coordinates)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:728 ../misc/m.nviz.image/args.c:734
+#: ../misc/m.nviz.image/args.c:743 ../misc/m.nviz.image/args.c:753
+msgid "Lighting"
+msgstr "Iluminare"
+
+#: ../misc/m.nviz.image/args.c:733
+msgid "Light color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:742
+msgid "Light brightness"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:752
+msgid "Light ambient"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:764
+msgid "nw;North-West edge;ne;North-East edge;sw;South-West edge;se;South-East edge"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:768
+msgid "Fringe edges"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:769 ../misc/m.nviz.image/args.c:775
+#: ../misc/m.nviz.image/args.c:784
+#, fuzzy
+msgid "Fringe"
+msgstr "Franjuri"
+
+#: ../misc/m.nviz.image/args.c:774
+msgid "Fringe color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:783
+msgid "Fringe elevation"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:796
+msgid "Place north arrow at given position \t(in screen coordinates from bottom left corner)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:798 ../misc/m.nviz.image/args.c:807
+#: ../misc/m.nviz.image/args.c:814
+msgid "Decoration"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:806
+msgid "North arrow size (in map units)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:813
+msgid "North arrow color"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:862
+#, c-format
+msgid "At least one <%s> or <%s> required"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:876 ../misc/m.nviz.image/args.c:906
+#: ../misc/m.nviz.image/args.c:912 ../misc/m.nviz.image/args.c:918
+#: ../misc/m.nviz.image/args.c:924 ../misc/m.nviz.image/args.c:930
+#: ../misc/m.nviz.image/args.c:936
+#, c-format
+msgid "Inconsistent number of attributes (<%s/%s> %d: <%s> %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:947
+#, c-format
+msgid "Inconsistent number of attributes (<%s> %d: <%s> %d x 3)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:952 ../misc/m.nviz.image/args.c:957
+#: ../misc/m.nviz.image/args.c:968 ../misc/m.nviz.image/args.c:975
+#: ../misc/m.nviz.image/args.c:982 ../misc/m.nviz.image/args.c:989
+#: ../misc/m.nviz.image/args.c:996 ../misc/m.nviz.image/args.c:1028
+#, c-format
+msgid "Inconsistent number of attributes (<%s> %d: <%s> %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:1012 ../misc/m.nviz.image/args.c:1021
+#, c-format
+msgid "Inconsistent number of attributes (<%s> %d: <%s> %d, <%s> %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:1034
+#, c-format
+msgid "Inconsistent number of attributes (<%s> %d: <%s> %d x 6)"
+msgstr ""
+
+#: ../misc/m.nviz.image/args.c:1045
+#, c-format
+msgid "Inconsistent number of attributes (<%s/%s> %d: <%s> %d, <%s> %d)"
+msgstr ""
+
+#: ../misc/m.nviz.image/vector.c:179
+msgid "Unknown icon marker"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:1
+msgid "Imports Mapgen or Matlab-ASCII vector maps into GRASS."
+msgstr "Importă hartă vectorială Mapgen sau Matlab-ASCII în GRASS."
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:2
+#: ../locale/scriptstrings/v.convert.all_to_translate.c:2
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:2
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:2
+#: ../vector/v.in.dxf/main.c:60 ../vector/v.in.ascii/in.c:48
+#: ../vector/v.in.dwg/main.c:65 ../vector/v.in.ogr/main.c:106
+msgid "vector, import"
+msgstr "vector, import"
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:3
+msgid "Input map is in Matlab format"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:4
+msgid "Create a 3D vector points map from 3 column Matlab data"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:5
+msgid "Name of input file in Mapgen/Matlab format"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.mapgen_to_translate.c:6
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:10
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:11
+msgid "Name for output vector map (omit for display to stdout)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split.frame_to_translate.c:1
+msgid "Split the display into subframes."
+msgstr ""
+
+#: ../locale/scriptstrings/d.split.frame_to_translate.c:2
+msgid "Number of subframes"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split.frame_to_translate.c:3
+msgid "Split horizontally not vertically"
+msgstr ""
+
+#: ../locale/scriptstrings/d.monsize_to_translate.c:1
+msgid "Selects/starts specified monitor at specified size"
+msgstr ""
+
+#: ../locale/scriptstrings/d.monsize_to_translate.c:2
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:2
+#: ../locale/scriptstrings/d.resize_to_translate.c:2
+#: ../locale/scriptstrings/d.split_to_translate.c:2
+#: ../display/d.frame/frame.c:60 ../display/d.erase/main.c:32
+#: ../display/d.colorlist/main.c:35 ../display/d.extend/main.c:31
+#: ../display/d.font/main.c:46 ../display/d.font.freetype/main.c:59
+msgid "display, setup"
+msgstr "afișare, configurare"
+
+#: ../locale/scriptstrings/d.monsize_to_translate.c:3
+msgid "Display monitor to start"
+msgstr ""
+
+#: ../locale/scriptstrings/d.monsize_to_translate.c:4
+msgid "Width in pixels of new display monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.monsize_to_translate.c:5
+msgid "Height in pixels of new display monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:1
+msgid "Moves displayed maps to another monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:3
+msgid "clear target monitor before moving"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:4
+msgid "stay with source monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:5
+msgid "kill source monitor after moving"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:6
+msgid "Target monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.mvmon_to_translate.c:7
+msgid "Source monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.resize_to_translate.c:1
+msgid "Resizes active display monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.resize_to_translate.c:3
+msgid "New width for window"
+msgstr ""
+
+#: ../locale/scriptstrings/d.resize_to_translate.c:4
+msgid "New height for window"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:1
+msgid "Calculates new grid3D volume from r3.mapcalc expression."
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:2
+msgid "A (grid3D file)"
+msgstr "A (fișier grid3D)"
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:3
+msgid "B (grid3D file)"
+msgstr "B (fișier grid3D)"
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:4
+msgid "C (grid3D file)"
+msgstr "C (fișier grid3D)"
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:5
+msgid "D (grid3D file)"
+msgstr "D (fișier grid3D)"
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:6
+msgid "E (grid3D file)"
+msgstr "E (fișier grid3D)"
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:7
+msgid "F (grid3D file)"
+msgstr "F (fișier grid3D)"
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:8
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:8
+msgid "Formula (e.g. A-B or A*C+B)"
+msgstr "FormulĂ (de ex. A-B sau A*C+B)"
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:9
+msgid "Name for output grid3D volume"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:10
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:10
+msgid "Show help"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:11
+msgid "Expert mode (enter a set of r3.mapcalc expressions)"
+msgstr ""
+
+#: ../locale/scriptstrings/r3.mapcalculator_to_translate.c:12
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:12
+msgid "Do not overwrite existing map"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gns_to_translate.c:1
+msgid "Imports US-NGA GEOnet Names Server (GNS) country files into a GRASS vector points map."
+msgstr "Importă fișiere de țară US-NGA GEOnet Names Server (GNS) într-o hartă vectorială punctuală GRASS."
+
+#: ../locale/scriptstrings/v.in.gns_to_translate.c:2
+#: ../locale/scriptstrings/v.in.geonames_to_translate.c:2
+msgid "vector, import, gazetteer"
+msgstr "vector, import, dicționar geografic"
+
+#: ../locale/scriptstrings/v.in.gns_to_translate.c:3
+msgid "Uncompressed GNS file from NGA (with .txt extension)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gns_to_translate.c:4
+#: ../locale/scriptstrings/v.in.geonames_to_translate.c:4
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:6
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:4
+#: ../locale/scriptstrings/v.centroids_to_translate.c:4
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:5
+#: ../locale/scriptstrings/v.in.wfs_to_translate.c:4
+msgid "Name for output vector map"
+msgstr "Nume pentru harta vectorială de ieșire"
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:1
+msgid "Set color rules for features in a vector using a numeric attribute column."
+msgstr "Stabilește reguli de culoare a trasăturilor vectoriale folosind o coloană de atribute numerice."
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:2
+msgid "vector, color table"
+msgstr "vector, tabel de culoare"
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:3
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:6
+#: ../locale/scriptstrings/v.report_to_translate.c:5
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:3
+#: ../locale/scriptstrings/v.centroids_to_translate.c:3
+#: ../vector/v.hull/main.c:278
+msgid "Name of input vector map"
+msgstr "Nume pentru harta vectorială de intrare"
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:4
+msgid "Name of column containing numeric data"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:5
+msgid "Layer number of data column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:6
+msgid "Name of color column to populate"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:8
+msgid "Manually set range (min,max)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:13
+msgid "Path to rules file"
+msgstr ""
+
+#: ../locale/scriptstrings/v.colors_to_translate.c:15
+msgid "Save placeholder raster map for use with d.legend"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:1
+msgid "Removes existing attribute table of a vector map."
+msgstr "Elimină tabela de atribute existentă a hărții vectoriale."
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:2
+#: ../locale/scriptstrings/v.db.join_to_translate.c:2
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:2
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:2
+#: ../locale/scriptstrings/v.db.update_to_translate.c:2
+#: ../locale/scriptstrings/v.db.dropcol_to_translate.c:2
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:2
+#: ../locale/scriptstrings/v.db.renamecol_to_translate.c:2
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:2
+#: ../vector/v.db.select/main.c:53 ../vector/v.vect.stats/main.c:128
+#: ../vector/v.distance/main.c:114 ../vector/v.to.db/main.c:33
+#: ../vector/v.db.connect/main.c:50
+msgid "vector, database, attribute table"
+msgstr "vector, bază de date, tabel de atribute"
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:3
+msgid "Force removal (required for actual deletion of table)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:4
+msgid "Vector map from which to remove attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:5
+msgid "Name of existing attribute table (default: vector map name)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.droptable_to_translate.c:6
+msgid "Layer from which to drop linked attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/d.shadedmap_to_translate.c:1
+msgid "Drapes a color raster over a shaded relief map using d.his"
+msgstr ""
+
+#: ../locale/scriptstrings/d.shadedmap_to_translate.c:2
+msgid "Name of shaded relief or aspect map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.shadedmap_to_translate.c:3
+msgid "Name of raster to drape over relief map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.shadedmap_to_translate.c:4
+msgid "Percent to brighten"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:1
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:1
+msgid "Calculates univariate statistics on selected table column for a GRASS vector map."
+msgstr "Calculează statistici univariate pe coloana tabelului selectat pentru o hartă vectorială GRASS."
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:2
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:2
+#: ../vector/v.univar/main.c:93 ../vector/v.class/main.c:45
+#: ../vector/v.qcount/main.c:69 ../vector/v.normal/main.c:79
+#: ../vector/v.kcv/main.c:76 ../vector/lidar/v.outlier/main.c:73
+#: ../vector/v.random/main.c:84
+msgid "vector, statistics"
+msgstr "vector, statistici"
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:3
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:3
+msgid "Extended statistics (quartiles and 90th percentile)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:4
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:4
+msgid "Name of data table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:5
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:5
+msgid "Column on which to calculate statistics (must be numeric)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:6
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:6
+msgid "Database/directory for table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:7
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:7
+msgid "Database driver"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.univar_to_translate.c:8
+#: ../locale/scriptstrings/v.univar.sh_to_translate.c:8
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:13
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:47
+msgid "WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:1
+msgid "Joins a database table to a vector map table."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:3
+msgid "Vector map to which to join other table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:4
+msgid "Layer where to join"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:5
+msgid "Join column in map table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:6
+msgid "Other table name"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.join_to_translate.c:7
+msgid "Join column in other table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.convert.all_to_translate.c:1
+msgid "Converts all older versions of GRASS vector maps in current mapset to current format."
+msgstr "Convertește toate hărțile vectoriale din versiunile vechi de GRASS din mapset-ul curent în formatul actual."
+
+#: ../locale/scriptstrings/v.convert.all_to_translate.c:3
+msgid "run non-interactively"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:1
+msgid "Import waypoints, routes, and tracks from a GPS receiver or GPS download file into a vector map."
+msgstr "Importă punctele de referință, rutele și traseele dintr-un dispozitiv GPS sau descarcă fișierul GPS intr-o hartă vectorială."
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:2
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:2
+msgid "vector, import, GPS"
+msgstr "vector, import, GPS"
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:4
+msgid "Import waypoints"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:5
+msgid "Import routes"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:6
+msgid "Import track"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:7
+msgid "Force vertices of track or route data as points"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:8
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:10
+msgid "Do not attempt projection transform from WGS84"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:9
+msgid "Device or file used to import data"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:11
+msgid "Format of GPS input data (use gpsbabel supported formats)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.gpsbabel_to_translate.c:12
+msgid "Projection of input data (PROJ.4 style), if not set Lat/Lon WGS84 is assumed"
+msgstr ""
+
+#: ../locale/scriptstrings/db.test_to_translate.c:1
+msgid "Test database driver, database must exist and set by db.connect."
+msgstr "Testare driver bază de date; baza de date trebuie să existe și să fie conectată prin db.connect."
+
+#: ../locale/scriptstrings/db.test_to_translate.c:3
+msgid "Test name"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.srtm_to_translate.c:1
+msgid "Import SRTM HGT files into GRASS"
+msgstr "Importă fișiere SRTM HGT în GRASS"
+
+#: ../locale/scriptstrings/r.in.srtm_to_translate.c:3
+msgid "SRTM input tile (file without .hgt.zip extension)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.srtm_to_translate.c:4
+msgid "Output raster map (default: input tile)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.srtm_to_translate.c:5
+msgid "Input is a 1-arcsec tile (default: 3-arcsec)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:1
+msgid "Displays spectral response at user specified locations in group or images."
+msgstr "Afișează răspunsul spectral în locațiile specificate de utilizator din grup sau imagini."
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:2
+msgid "imagery, raster, multispectral"
+msgstr "imagini, raster, multispectral"
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:3
+msgid "Group input"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:4
+msgid "Raster input maps"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:5
+msgid "Write output to PNG image"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:6
+msgid "Use image list and not group"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:7
+msgid "Select multiple points"
+msgstr ""
+
+#: ../locale/scriptstrings/i.spectral_to_translate.c:8
+msgid "Show pick coordinates instead of numbering in the legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.redraw_to_translate.c:1
+msgid "Redraws the current display frame in the GRASS monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.redraw_to_translate.c:2
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:2
+#: ../display/d.mon/cmd/main.c:49 ../visualization/ximgview/main.c:270
+msgid "display"
+msgstr "afișare"
+
+#: ../locale/scriptstrings/d.redraw_to_translate.c:3
+msgid "Redraw all frames"
+msgstr ""
+
+#: ../locale/scriptstrings/d.redraw_to_translate.c:4
+msgid "Do not preserve individual regions when redrawing all frames"
+msgstr ""
+
+#: ../locale/scriptstrings/g.manual_to_translate.c:1
+msgid "Display the HTML man pages of GRASS"
+msgstr "Afișează principala pagină HTML a GRASS"
+
+#: ../locale/scriptstrings/g.manual_to_translate.c:2
+msgid "general, manual, help"
+msgstr "general, manual, ajutor"
+
+#: ../locale/scriptstrings/g.manual_to_translate.c:3
+msgid "Display index"
+msgstr ""
+
+#: ../locale/scriptstrings/g.manual_to_translate.c:4
+msgid "Display as MAN text page instead of HTML page in browser"
+msgstr ""
+
+#: ../locale/scriptstrings/g.manual_to_translate.c:5
+msgid "Manual entry to be displayed"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.geonames_to_translate.c:1
+msgid "Imports geonames.org country files into a GRASS vector points map."
+msgstr "Importă fișierele de țară geonames.org într-o hartă vectorială punctuală GRASS."
+
+#: ../locale/scriptstrings/v.in.geonames_to_translate.c:3
+msgid "Uncompressed geonames file from (with .txt extension)"
+msgstr ""
+
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:1
+msgid "Exports attribute tables into various formats."
+msgstr "Exportă tabela de atribute în formate diferite."
+
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:3
+msgid "GRASS table name"
+msgstr ""
+
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:4
+msgid "Table file to be exported or DB connection string"
+msgstr ""
+
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:5
+msgid "Table format"
+msgstr ""
+
+#: ../locale/scriptstrings/db.out.ogr_to_translate.c:6
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:5
+msgid "Name for output table"
+msgstr ""
+
+#: ../locale/scriptstrings/i.in.spotvgt_to_translate.c:1
+msgid "Import of SPOT VGT NDVI file into a raster map"
+msgstr "Importă un fișier SPOT VGT NDVI într-o hartă raster"
+
+#: ../locale/scriptstrings/i.in.spotvgt_to_translate.c:2
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:2
+msgid "raster, imagery, import"
+msgstr "raster, imagini, import"
+
+#: ../locale/scriptstrings/i.in.spotvgt_to_translate.c:3
+msgid "Also import quality map (SM status map layer) and filter NDVI map"
+msgstr ""
+
+#: ../locale/scriptstrings/i.in.spotvgt_to_translate.c:4
+msgid "existing SPOT VGT NDVI HDF file (0001_NDV.HDF)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:1
+msgid "Fills no-data areas in raster maps using spline interpolation."
+msgstr "Umple arealele fără date din harta raster folosind interpolarea spline."
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:2
+msgid "raster, elevation, interpolation"
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:3
+msgid "Name of input raster map in which to fill nulls"
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:4
+msgid "Name for output raster map with nulls filled by interpolation"
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:5
+msgid "Spline tension parameter"
+msgstr ""
+
+#: ../locale/scriptstrings/r.fillnulls_to_translate.c:6
+msgid "Spline smoothing parameter"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.sites.all_to_translate.c:1
+msgid "Converts all old GRASS < Ver5.7 sites maps in current mapset to vector maps."
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.sites.all_to_translate.c:2
+msgid "sites, vector, import"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.sites.all_to_translate.c:3
+msgid "Run non-interactively"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:1
+msgid "Performs auto-balancing of colors for LANDSAT images."
+msgstr "Efectuează balansul-auto a culorilor pentru imaginile LANDSAT."
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:2
+msgid "raster, imagery, colors"
+msgstr "raster, imagini, culori"
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:3
+msgid "LANDSAT red channel"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:4
+msgid "LANDSAT green channel"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:5
+msgid "LANDSAT blue channel"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:6
+msgid "Cropping intensity (upper brightness level)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:7
+msgid "Extend colors to full range of data on each channel"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:8
+msgid "Preserve relative colors, adjust brightness only"
+msgstr ""
+
+#: ../locale/scriptstrings/i.landsat.rgb_to_translate.c:9
+msgid "Reset to standard color range"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:1
+msgid "Exports a vector map to a GPS receiver or file format supported by GpsBabel."
+msgstr "Exportă hartă vectorială la un dispozitiv GPS sau format de fișier acceptat de GpsBabel"
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:2
+msgid "vector, export, GPS"
+msgstr "vector, export, GPS"
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:3
+msgid "Export as waypoints"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:4
+msgid "Export as routes"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:5
+msgid "Export as tracks"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:7
+msgid "Feature type(s)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:8
+msgid "Name for output file or GPS device"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:9
+msgid "GpsBabel supported output format"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:10
+#: ../locale/scriptstrings/v.report_to_translate.c:6
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:17
+#: ../locale/scriptstrings/v.centroids_to_translate.c:6
+#: ../vector/v.out.vtk/main.c:83
+msgid "Layer number"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:11
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:5
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:6
+msgid "A single vector map can be connected to multiple database tables. This number determines which table to use."
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:12
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:15
+msgid "Subset"
+msgstr ""
+
+#: ../locale/scriptstrings/v.out.gpsbabel_to_translate.c:14
+msgid "Example: income < 1000 and inhab >= 10000"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:1
+msgid "Draws polar diagram of angle map such as aspect or flow directions"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:2
+#: ../locale/scriptstrings/d.correlate_to_translate.c:2
+msgid "display, diagram"
+msgstr "afișare, diagramă"
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:3
+msgid "Name of raster angle map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:4
+msgid "Pixel value to be interpreted as undefined (different from NULL)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:5
+msgid "Name of optional EPS output file"
+msgstr ""
+
+#: ../locale/scriptstrings/d.polar_to_translate.c:6
+msgid "Plot using Xgraph"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:1
+msgid "Adds one or more columns to the attribute table connected to a given vector map."
+msgstr "Adaugă una sau mai multe coloane la tabela de atribute conectată la o anumită hartă vectorială."
+
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:3
+msgid "Name of vector map for which to edit attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:4
+msgid "Layer number where to add column(s)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:6
+msgid "Name and type of the new column(s) ('name type [,name type, ...]')"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addcol_to_translate.c:7
+msgid "Data types depend on database backend, but all support VARCHAR(), INT, DOUBLE PRECISION and DATE"
+msgstr ""
+
+#: ../locale/scriptstrings/db.dropcol_to_translate.c:1
+msgid "Drops a column from selected attribute table"
+msgstr "Șterge coloana de atribute selectată dintr-un tabel"
+
+#: ../locale/scriptstrings/db.dropcol_to_translate.c:4
+msgid "Table from which to drop attribute column"
+msgstr ""
+
+#: ../locale/scriptstrings/db.dropcol_to_translate.c:5
+msgid "Name of the column"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:1
+msgid "Tasseled Cap (Kauth Thomas) transformation for LANDSAT-TM data"
+msgstr "Transformarea Tasseled Cap (Kauth Thomas) pentru datele LANDSAT-TM"
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:2
+msgid "raster, imagery"
+msgstr "raster, imagini"
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:3
+msgid "use transformation rules for LANDSAT-4"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:4
+msgid "use transformation rules for LANDSAT-5"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:5
+msgid "use transformation rules for LANDSAT-7"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:6
+msgid "raster input map (LANDSAT channel 1)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:7
+msgid "raster input map (LANDSAT channel 2)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:8
+msgid "raster input map (LANDSAT channel 3)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:9
+msgid "raster input map (LANDSAT channel 4)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:10
+msgid "raster input map (LANDSAT channel 5)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:11
+msgid "raster input map (LANDSAT channel 7)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.tasscap_to_translate.c:12
+msgid "raster output TC maps prefix"
+msgstr ""
+
+#: ../locale/scriptstrings/r.pack_to_translate.c:1
+msgid "Packs up a raster map and support files for copying."
+msgstr "Împachetează harta raster și fișierele suport pentru copiere."
+
+#: ../locale/scriptstrings/r.pack_to_translate.c:2
+#: ../locale/scriptstrings/r.unpack_to_translate.c:2
+msgid "raster, copying"
+msgstr "raster, copiere"
+
+#: ../locale/scriptstrings/r.pack_to_translate.c:3
+msgid "Name of raster map to pack up"
+msgstr ""
+
+#: ../locale/scriptstrings/r.pack_to_translate.c:4
+msgid "Name for output file (default is input-map.pack)"
+msgstr ""
+
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:1
+msgid "Imports attribute tables in various formats."
+msgstr "Importă tabele de atribute în formate diferite."
+
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:3
+msgid "Table file to be imported or DB connection string"
+msgstr ""
+
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:4
+msgid "Table name of SQL DB table"
+msgstr ""
+
+#: ../locale/scriptstrings/db.in.ogr_to_translate.c:6
+msgid "Name for auto-generated unique key column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:1
+msgid "Creates and connects a new attribute table to a given layer of an existing vector map."
+msgstr "Crează și conectează o tabelă de atribute nouă la un anumit strat a hărții vectoriale existente."
+
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:3
+msgid "Vector map for which to add new attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:4
+msgid "Name of new attribute table (default: vector map name)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:5
+msgid "Layer where to add new attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.addtable_to_translate.c:6
+msgid "Name and type of the new column(s) (types depend on database backend, but all support VARCHAR(), INT, DOUBLE PRECISION and DATE)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:1
+msgid "Import E00 file into a vector map."
+msgstr "Importă fișier E00 într-o hartă vectorială."
+
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:4
+msgid "E00 file"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.e00_to_translate.c:5
+msgid "Input type point, line or area"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:1
+msgid "Download waypoints, routes, and tracks from a Garmin GPS receiver into a vector map."
+msgstr "Descarcă punctele de referință, rutele și traseele dintr-un dispozitiv GarminGPS intr-o hartă vectorială."
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:4
+msgid "Download Waypoints from GPS"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:5
+msgid "Download Routes from GPS"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:6
+msgid "Download Track from GPS"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:7
+msgid "Force import of track or route data as points"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:8
+msgid "Use gardump instead of gpstrans as the download program"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:9
+msgid "Import track in 3D (gardump only)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.garmin_to_translate.c:12
+msgid "Port Garmin receiver is connected to"
+msgstr ""
+
+#: ../locale/scriptstrings/r.li.setup_to_translate.c:1
+msgid "Configuration editor for r.li.'index'"
+msgstr "Editor de configurare pentru r.li.'index'"
+
+#: ../locale/scriptstrings/r.li.setup_to_translate.c:2
+msgid "raster, landscape structure analysis"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:1
+msgid "Calculate new raster map from a r.mapcalc expression."
+msgstr ""
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:2
+msgid "A"
+msgstr "A"
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:3
+msgid "B"
+msgstr "B"
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:4
+msgid "C"
+msgstr "C"
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:5
+msgid "D"
+msgstr "D"
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:6
+msgid "E"
+msgstr "E"
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:7
+msgid "F"
+msgstr "F"
+
+#: ../locale/scriptstrings/r.mapcalculator_to_translate.c:11
+msgid "Expert mode (enter a set of r.mapcalc expressions)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:1
+msgid "Produces tilings of the source projection for use in the destination region and projection."
+msgstr "Produce o mozaicare a proiecției sursă pentru folosirea în regiunea și proiecția de destinație."
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:2
+msgid "raster, tiling"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:3
+msgid "Produces shell script output"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:4
+msgid "Produces web map server query string output"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:5
+msgid "Name of region to use instead of current region for bounds and resolution"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:6
+msgid "Source projection"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:7
+#: ../locale/scriptstrings/r.tileset_to_translate.c:9
+msgid "Conversion factor from units to meters in source projection"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:8
+msgid "Destination projection, defaults to this location's projection"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:10
+msgid "Maximum number of columns for a tile in the source projection"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:11
+msgid "Maximum number of rows for a tile in the source projection"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:12
+msgid "Number of cells tiles should overlap in each direction"
+msgstr ""
+
+#: ../locale/scriptstrings/r.tileset_to_translate.c:14
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:50
+msgid "Verbosity level"
+msgstr ""
+
+#: ../locale/scriptstrings/v.report_to_translate.c:1
+msgid "Reports geometry statistics for vectors."
+msgstr "Raportează statistici geometrice pentru vectori."
+
+#: ../locale/scriptstrings/v.report_to_translate.c:2
+msgid "vector, report, statistics"
+msgstr "vector, raport, statistici"
+
+#: ../locale/scriptstrings/v.report_to_translate.c:3
+msgid "Reverse sort the result"
+msgstr ""
+
+#: ../locale/scriptstrings/v.report_to_translate.c:4
+msgid "Sort the result"
+msgstr ""
+
+#: ../locale/scriptstrings/v.report_to_translate.c:7
+msgid "Value to calculate"
+msgstr ""
+
+#: ../locale/scriptstrings/v.report_to_translate.c:8
+msgid "mi(les),f(eet),me(ters),k(ilometers),a(cres),h(ectares),p(ercent)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:1
+msgid "Dissolves boundaries between adjacent areas sharing a common category number or attribute."
+msgstr "Se dizolvă limitele dintre arealele adiacente un număr comun de categorii sau atribute."
+
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:2
+msgid "vector, area, dissolve"
+msgstr "vector, areal, dizolvare"
+
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:5
+msgid "Layer number. If -1, all layers are extracted."
+msgstr ""
+
+#: ../locale/scriptstrings/v.dissolve_to_translate.c:7
+msgid "Name of column used to dissolve common boundaries"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:1
+msgid "Creates a MASK for limiting raster operation."
+msgstr "Crează o MASCĂ pentru limitarea operației raster."
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:2
+msgid "raster, mask"
+msgstr "raster, mască"
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:3
+msgid "Raster map to use as MASK"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:5
+msgid "Category values to use for MASK (format: 1 2 3 thru 7 *)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:7
+msgid "Create inverse MASK from specified 'maskcats' list"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:9
+msgid "Overwrite existing MASK"
+msgstr ""
+
+#: ../locale/scriptstrings/r.mask_to_translate.c:10
+msgid "Remove existing MASK (overrides other options)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:1
+msgid "Displays thematic vector map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:2
+msgid "display, vector, thematic, legend"
+msgstr "afișare, vector, tematic, legendă"
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:3
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:44
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:48
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:51
+msgid "Files"
+msgstr "Fișiere"
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:4
+#: ../display/d.zoom/main.c:100
+msgid "Name of vector map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:5
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:7
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:9
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:11
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:13
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:16
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:25
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:46
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:53
+msgid "Theme"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:8
+msgid "Name of attribute column to use for thematic display (must be numeric)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:10
+msgid "Type of thematic display"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:12
+msgid "Thematic divisions of data for display"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:14
+msgid "Break points for custom breaks option"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:15
+msgid "Separate values by spaces (0 10 20 30 ...)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:19
+msgid "Vector point icon for point data"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:21
+msgid "Icon size for point data"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:22
+msgid "Minimum icon size/line width for graduated points/lines)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:24
+msgid "Maximum icon size/line width for graduated points and lines"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:26
+msgid "Number of classes for interval theme (integer)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:27
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:30
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:33
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:36
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:39
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:55
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:57
+#: ../display/d.grid/main.c:82 ../display/d.grid/main.c:87
+#: ../display/d.grid/main.c:93
+msgid "Color"
+msgstr "Culoare"
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:28
+msgid "Color scheme for graduated color mapping"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:29
+msgid "Select 'single_color' for graduated point/line display"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:31
+msgid "Color for graduated points map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:32
+msgid "GRASS named color or R:G:B triplet. Set color scheme to single color"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:34
+msgid "Color for graduated lines or point/area outlines"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:35
+msgid "GRASS named color or R:G:B triplet. Set color scheme to single color."
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:37
+msgid "Beginning color for custom color gradient"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:38
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:41
+msgid "Must be expressed as R:G:B triplet"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:40
+msgid "Ending color for custom color gradient"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:42
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:59
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:61
+msgid "Misc"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:43
+msgid "Select x11 display monitor for legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:45
+msgid "Save thematic map commands to group file for GIS Manager"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:49
+msgid "Root for the name of psmap instruction files to be in current directory"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:50
+msgid "If not set, no psmap instruction files will be created)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:52
+msgid "Name of group file where thematic map commands will be saved"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:54
+msgid "Create graphic legend in x11 display monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:56
+msgid "Only draw fills (no outlines) for areas and points"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:58
+msgid "Update color values to GRASSRGB column in attribute table"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:60
+msgid "Output legend for GIS Manager (for scripting use only)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.vect.thematic_to_translate.c:62
+msgid "Use math notation brackets in legend"
+msgstr ""
+
+#: ../locale/scriptstrings/r.colors.stddev_to_translate.c:1
+msgid "Set color rules based on stddev from a map's mean value."
+msgstr "Setează reguli de culoare bazate pe stddev din valorile medii ale hărții."
+
+#: ../locale/scriptstrings/r.colors.stddev_to_translate.c:4
+msgid "Color using standard deviation bands"
+msgstr ""
+
+#: ../locale/scriptstrings/r.colors.stddev_to_translate.c:5
+msgid "Force center at zero"
+msgstr ""
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:1
+msgid "Mosaics up to 4 images and extends colormap; creates map *.mosaic"
+msgstr "Mozaic de până la 4 imagini și extiderea hărții de culoare; crează hartă *.mozaic"
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:2
+msgid "raster, imagery, mosaicking"
+msgstr "raster, imagini, mozaicare"
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:3
+msgid "1st map for mosaic (top of image stack)."
+msgstr ""
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:4
+msgid "2nd map for mosaic."
+msgstr ""
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:5
+msgid "3rd map for mosaic."
+msgstr ""
+
+#: ../locale/scriptstrings/i.image.mosaic_to_translate.c:6
+msgid "4th map for mosaic."
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:1
+msgid "Downloads and imports data from WMS servers."
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:2
+msgid "wms"
+msgstr "wms"
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:3
+#: ../vector/v.in.dxf/main.c:82 ../vector/v.in.dwg/main.c:96
+msgid "List available layers and exit"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:4
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:8
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:17
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:21
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:23
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:25
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:27
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:29
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:31
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:33
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:35
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:38
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:49
+msgid "Request"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:5
+msgid "Skip to downloading (to resume downloads faster)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:6
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:10
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:40
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:42
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:44
+msgid "Download"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:7
+msgid "Don't request transparent data"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:9
+msgid "Clean existing data out of download directory"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:12
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:14
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:19
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:46
+msgid "Import"
+msgstr "Importă"
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:13
+msgid "Don't reproject the data, just patch it"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:15
+msgid "Use GET method instead of POST data method"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:16
+msgid "This may be needed to connect to servers which lack POST capability"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:20
+msgid "Mapserver to request data from"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:22
+msgid "Layers to request from map server"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:24
+msgid "Styles to request from map server"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:26
+msgid "Source projection to request from server"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:28
+msgid "Image format requested from the server"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:30
+msgid "Addition query options for server"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:32
+msgid "Maximum columns to request at a time"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:34
+msgid "Maximum rows to request at a time"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:36
+msgid "Additional options for r.tileset"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:37
+msgid "Named region to request data for. Current region used if omitted"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:39
+msgid "Folder to save downloaded data to"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:41
+msgid "Additional options for wget"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:43
+msgid "Additional options for curl"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:45
+msgid "Reprojection method to use"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:47
+msgid "Filename to save capabilities XML file to"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.wms_to_translate.c:48
+msgid "Requires list available layers flag"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:1
+msgid "Updates a column in the attribute table connected to a vector map."
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:3
+msgid "Vector map to edit the attribute table for"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:4
+msgid "Layer to which the table to be changed is connected"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:5
+msgid "Column to update"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:6
+msgid "Literal value to update the column with"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:7
+msgid "Varchar values must be in single quotes, e.g. 'grass'"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:8
+msgid "Name of attribute column to query"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:9
+msgid "Can be a combination of columns, e.g. col1+col2"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.update_to_translate.c:10
+msgid "WHERE conditions for update, without 'where' keyword (e.g. cat=1 or col1/col2>1)"
+msgstr ""
+
+#: ../locale/scriptstrings/db.droptable_to_translate.c:1
+msgid "Drops an attribute table."
+msgstr "Șterge tabela de atribute."
+
+#: ../locale/scriptstrings/db.droptable_to_translate.c:4
+msgid "Table to drop"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:1
+msgid "Convert coordinates from one projection to another (cs2cs frontend)."
+msgstr "Convertește coordonatele dintr-o proiecție în alta  (interfață cs2cs)"
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:2
+msgid "miscellaneous, projection"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:3
+msgid "Input coordinate file (omit to read from stdin)"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:4
+#: ../locale/scriptstrings/m.proj_to_translate.c:6
+#: ../locale/scriptstrings/m.proj_to_translate.c:8
+#: ../locale/scriptstrings/m.proj_to_translate.c:18
+#: ../locale/scriptstrings/m.proj_to_translate.c:20
+msgid "Files & format"
+msgstr "Fișiere & format"
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:5
+msgid "Output coordinate file (omit to send to stdout)"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:9
+msgid "Input projection parameters (PROJ.4 style)"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:10
+#: ../locale/scriptstrings/m.proj_to_translate.c:12
+#: ../locale/scriptstrings/m.proj_to_translate.c:14
+#: ../locale/scriptstrings/m.proj_to_translate.c:16
+msgid "Projections"
+msgstr "Proiecții"
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:11
+msgid "Output projection parameters (PROJ.4 style)"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:13
+msgid "Use LL WGS84 as input and current location as output projection"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:15
+msgid "Use current location as input and LL WGS84 as output projection"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:17
+msgid "Output long/lat in decimal degrees, or other projections with many decimal places"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:19
+msgid "Script style output in CSV format respecting the field separator settings"
+msgstr ""
+
+#: ../locale/scriptstrings/m.proj_to_translate.c:21
+msgid "Verbose mode (print projection parameters and filenames to stderr)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.dropcol_to_translate.c:1
+msgid "Drops a column from the attribute table connected to a given vector map."
+msgstr "Șterge o coloană din tabela de atribute conectată la o anumită hartă vectorială."
+
+#: ../locale/scriptstrings/v.db.dropcol_to_translate.c:3
+msgid "Vector map for which to drop attribute column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.dropcol_to_translate.c:4
+msgid "Layer where to drop column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.dropcol_to_translate.c:5
+msgid "Name of the column to drop"
+msgstr ""
+
+#: ../locale/scriptstrings/d.m_to_translate.c:1
+msgid "Display manager for GRASS"
+msgstr ""
+
+#: ../locale/scriptstrings/d.m_to_translate.c:2
+msgid "Name of .dmrc settings file"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:1
+msgid "Georeference, rectify and import Terra-ASTER imagery and relative DEM's using gdalwarp."
+msgstr "Georeferențiază, rectifică și importă imaginii Terra-ASTER și DEM folosind gdalwarp."
+
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:3
+msgid "Input ASTER image to be georeferenced & rectified"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:4
+msgid "ASTER imagery processing type (Level 1A, Level 1B, or relative DEM)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.in.aster_to_translate.c:5
+msgid "L1A or L1B band to translate (1, 2, 3n, 3b, 4-14). Can only translate a single band"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:1
+msgid "Displays a raster map and its legend on a graphics window"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:3
+#: ../display/d.legend/main.c:180
+msgid "Flip legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:4
+msgid "Omit entries with missing label"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:5
+#: ../display/d.legend/main.c:175
+msgid "Draw smooth gradient"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:6
+msgid "Name of raster map to display"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:7
+msgid "Number of lines to appear in the legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:8
+msgid "Name of raster map to generate legend from"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:9
+msgid "Name of raster map to print in legend"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.leg_to_translate.c:10
+msgid "Position of vertical map-legend separator (in percent)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:1
+msgid "Calculates univariate statistics from a raster map based on vector polygons and uploads statistics to new attribute columns."
+msgstr "Calculează statistici univariate dintr-o hartă raster bazată pe poligoane vectoriale și încarcă statisticile în coloane noi de atribute."
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:2
+msgid "vector, raster, statistics"
+msgstr "vector, raster, statistici"
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:3
+msgid "Continue if upload column(s) already exist"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:5
+msgid "Name of vector polygon map"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:6
+msgid "A single vector map can be connected to multiple database tables. This number determines which table to use"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:7
+msgid "Name of raster map to calculate statistics from"
+msgstr ""
+
+#: ../locale/scriptstrings/v.rast.stats_to_translate.c:8
+msgid "Column prefix for new attribute columns"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:1
+msgid "Divides active display into two frames & displays maps/executes commands in each frame."
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:3
+msgid "Enter raster map to display in 1st frame"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:4
+msgid "Enter command to execute in 1st frame"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:5
+msgid "Enter raster map to display in 2nd frame"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:6
+msgid "Enter command to execute in 2nd frame"
+msgstr ""
+
+#: ../locale/scriptstrings/d.split_to_translate.c:7
+msgid "How to split display"
+msgstr ""
+
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:1
+msgid "Reclasses a raster map greater or less than user specified area size (in hectares)."
+msgstr "Reclasifică o hartă raster la o dimensiune mai mare sau egală cu valoarea specificată (în hectare) de utilizator."
+
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:2
+msgid "raster, statistics, aggregation"
+msgstr "raster, statistici, agregare"
+
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:5
+msgid "Lesser value option that sets the <= area size limit [hectares]"
+msgstr ""
+
+#: ../locale/scriptstrings/r.reclass.area_to_translate.c:6
+msgid "Greater value option that sets the >= area size limit [hectares]"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:1
+msgid "Uploads vector values at positions of vector points to the table."
+msgstr "Încarcă valorile vectorilor în pozițiile punctelor vectoriale din tabel."
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:3
+msgid "Vector map to modify"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:4
+msgid "Layer in the vector to be modified"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:5
+msgid "Column to be updated with the query result"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:6
+msgid "Vector map to be queried"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:7
+msgid "Layer of the query vector containing data"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:8
+msgid "Column to be queried"
+msgstr ""
+
+#: ../locale/scriptstrings/v.what.vect_to_translate.c:9
+msgid "Maximum query distance in map units"
+msgstr ""
+
+#: ../locale/scriptstrings/gis.m_to_translate.c:1
+msgid "GIS manager for GRASS"
+msgstr ""
+
+#: ../locale/scriptstrings/gis.m_to_translate.c:2
+msgid "Name of GIS manager settings file (.grc)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.gpsdrive_to_translate.c:1
+msgid "Export display monitor to a GpsDrive compatible backdrop image"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.gpsdrive_to_translate.c:2
+msgid "display, export, GPS"
+msgstr "afișare, export, GPS"
+
+#: ../locale/scriptstrings/d.out.gpsdrive_to_translate.c:3
+msgid "name for new map image (lives in ~/.gpsdrive/maps/)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.gpsdrive_to_translate.c:4
+msgid "Make JPEG instead of PNG image"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:1
+msgid "Slide show of GRASS raster/vector maps."
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:2
+#, fuzzy
+msgid "display, slideshow"
+msgstr "afișare, afișare slide"
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:3
+msgid "Show vector maps rather than raster maps"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:4
+msgid "Map prefix. Specify character(s) to view selected maps only"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:5
+msgid "Map number show across the monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:6
+msgid "Map number show down the monitor"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:7
+msgid "Mapsets to use. Specify multiple mapsets comma separated"
+msgstr ""
+
+#: ../locale/scriptstrings/d.slide.show_to_translate.c:8
+msgid "Number of seconds to pause between slides"
+msgstr ""
+
+#: ../locale/scriptstrings/v.build.all_to_translate.c:1
+msgid "Rebuilds topology on all vector maps in the current mapset."
+msgstr "Reconstruiește topologie pentru toate hărțile vectoriale din mapset-ul curent."
+
+#: ../locale/scriptstrings/v.build.all_to_translate.c:2
+#: ../vector/v.info/main.c:265 ../vector/v.clean/test/topocheck.c:42
+msgid "vector"
+msgstr "vector"
+
+#: ../locale/scriptstrings/v.centroids_to_translate.c:1
+msgid "Adds missing centroids to closed boundaries."
+msgstr "Adaugă centroizi pentru a închide limitele."
+
+#: ../locale/scriptstrings/v.centroids_to_translate.c:2
+msgid "vector, centroid, area"
+msgstr "vector, centroid, areal"
+
+#: ../locale/scriptstrings/v.centroids_to_translate.c:5
+msgid "Action to be taken"
+msgstr ""
+
+#: ../locale/scriptstrings/v.centroids_to_translate.c:7
+msgid "Category number starting value"
+msgstr ""
+
+#: ../locale/scriptstrings/v.centroids_to_translate.c:8
+#: ../vector/v.category/main.c:114
+msgid "Category increment"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:1
+msgid "Import ASCII x,y[,z] coordinates as a series of lines."
+msgstr "Importă coordonate ASCII x,y[,z] ca serii de linii."
+
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:3
+msgid "Create a 3D line from 3 column data"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.lines_to_translate.c:4
+msgid "Name of input file (or \"-\" to read from stdin)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:1
+msgid "Brovey transform to merge multispectral and high-res panchromatic channels"
+msgstr "Transformarea Brovey pentru a fuziona canele multispectral și pancromatic de rezoluție înaltă"
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:2
+msgid "imagery, fusion, Brovey"
+msgstr "imagini, fuziune, Brovey"
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:3
+msgid "LANDSAT sensor"
+msgstr "Senzor LANDSAT "
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:4
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:6
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:8
+msgid "Sensor"
+msgstr "Senzor"
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:5
+msgid "QuickBird sensor"
+msgstr "Senzor QuickBird "
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:7
+msgid "SPOT sensor"
+msgstr "Senzor SPOT"
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:9
+msgid "Name of input raster map (green: tm2 | qbird_green | spot1)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:10
+msgid "Name of input raster map (NIR: tm4 | qbird_nir | spot2)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:11
+msgid "Name of input raster map (MIR; tm5 | qbird_red | spot3)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:12
+msgid "Name of input raster map (etmpan | qbird_pan | spotpan)"
+msgstr ""
+
+#: ../locale/scriptstrings/i.fusion.brovey_to_translate.c:13
+msgid "Name for output raster map prefix (e.g. 'brov')"
+msgstr ""
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:1
+msgid "Calculates Optimum-Index-Factor table for LANDSAT TM bands 1-5, & 7"
+msgstr "Calculează Indicele de Factor Optim pentru benzile 1-5,  & 7 LANDSAT TM"
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:2
+msgid "raster, imagery, statistics"
+msgstr "raster, imagini, stratistici"
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:3
+msgid "LANDSAT TM band 1."
+msgstr "LANDSAT TM banda 1."
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:4
+msgid "LANDSAT TM band 2."
+msgstr "LANDSAT TM banda 2."
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:5
+msgid "LANDSAT TM band 3."
+msgstr "LANDSAT TM banda 3."
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:6
+msgid "LANDSAT TM band 4."
+msgstr "LANDSAT TM banda 4."
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:7
+msgid "LANDSAT TM band 5."
+msgstr "LANDSAT TM banda 5."
+
+#: ../locale/scriptstrings/i.oif_to_translate.c:8
+msgid "LANDSAT TM band 7."
+msgstr "LANDSAT TM banda 7."
+
+#: ../locale/scriptstrings/d.correlate_to_translate.c:1
+msgid "Prints a graph of the correlation between data layers (in pairs)."
+msgstr ""
+
+#: ../locale/scriptstrings/d.correlate_to_translate.c:3
+#: ../locale/scriptstrings/d.correlate_to_translate.c:4
+#: ../locale/scriptstrings/d.correlate_to_translate.c:5
+#: ../locale/scriptstrings/d.correlate_to_translate.c:6
+msgid "raster input map"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:1
+msgid "Tool to maintain GRASS extensions in local GRASS installation."
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:2
+msgid "Downloads, installs extensions from GRASS Addons SVN repository into local GRASS installation or removes installed extensions."
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:3
+msgid "general, extensions"
+msgstr "general, extensii"
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:4
+msgid "Name of extension to install/remove"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:5
+#: ../vector/v.net/main.c:69
+msgid "Operation to be performed"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:6
+msgid "SVN Addons repository URL"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:7
+msgid "Prefix where to install extension"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:8
+msgid "List available modules in the GRASS Addons SVN repository"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:10
+msgid "Install system-wide (may need system administrator rights)"
+msgstr ""
+
+#: ../locale/scriptstrings/g.extension_to_translate.c:11
+msgid "Install system-wide using sudo"
+msgstr ""
+
+#: ../locale/scriptstrings/r.out.xyz_to_translate.c:1
+msgid "Export a raster map to a text file as x,y,z values based on cell centers."
+msgstr "Exportă hartă raster în fișier text ca valori x,y,z bazate doar pe centrul celulelor."
+
+#: ../locale/scriptstrings/r.univar.sh_to_translate.c:1
+msgid "calculates univariate statistics from a GRASS raster map"
+msgstr ""
+
+#: ../locale/scriptstrings/r.univar.sh_to_translate.c:3
+msgid "extended statistics (quartiles and percentile)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.univar.sh_to_translate.c:4
+#: ../display/d.legend/main.c:92 ../display/d.zoom/main.c:90
+msgid "Name of raster map"
+msgstr ""
+
+#: ../locale/scriptstrings/r.univar.sh_to_translate.c:5
+msgid "Percentile to calculate (requires -e flag)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.in.wfs_to_translate.c:1
+msgid "Import GetFeature from WFS"
+msgstr "Importă GetFeature prin WFS"
+
+#: ../locale/scriptstrings/v.in.wfs_to_translate.c:2
+msgid "vector, import, wfs"
+msgstr "vector, import, wfs"
+
+#: ../locale/scriptstrings/v.in.wfs_to_translate.c:3
+msgid "GetFeature URL starting with 'http'"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.png_to_translate.c:1
+msgid "Saves active display monitor to PNG file in home directory"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.png_to_translate.c:2
+#: ../locale/scriptstrings/d.out.file_to_translate.c:2
+msgid "display, export"
+msgstr "afișare, export"
+
+#: ../locale/scriptstrings/d.out.png_to_translate.c:3
+msgid "Name of PNG file"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.png_to_translate.c:4
+msgid "Resolution of output file (single=1, double=2, quad=4)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.renamecol_to_translate.c:1
+msgid "Renames a column in the attribute table connected to a given vector map."
+msgstr "Redenumește o coloană din tabela de atribute conectată la o anumită hartă vectorială."
+
+#: ../locale/scriptstrings/v.db.renamecol_to_translate.c:3
+msgid "Vector map for which to rename attribute column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.renamecol_to_translate.c:4
+msgid "Layer where to rename column"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.renamecol_to_translate.c:5
+msgid "Old and new name of the column (old,new)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:1
+msgid "Blends color components of two raster maps by a given ratio."
+msgstr "Amestecați componentele de culaore a două hărți raster pe baza unei rații date."
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:2
+msgid "raster"
+msgstr "raster"
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:3
+msgid "Name of first raster map for blending"
+msgstr ""
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:4
+msgid "Name of second raster map for blending"
+msgstr ""
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:5
+msgid "Base name for red, green and blue output maps containing the blend"
+msgstr ""
+
+#: ../locale/scriptstrings/r.blend_to_translate.c:6
+msgid "Percentage weight of first map for color blending"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:1
+msgid "Saves the contents of the active display monitor to a graphics file."
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:3
+msgid "Name for output file (do NOT add extension)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:5
+msgid "Dimensions of output file versus current window size"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:6
+msgid "(same=1, double size=2, quadruple size=4)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:7
+#: ../locale/scriptstrings/d.out.file_to_translate.c:9
+#: ../locale/scriptstrings/d.out.file_to_translate.c:12
+#: ../locale/scriptstrings/d.out.file_to_translate.c:15
+#: ../locale/scriptstrings/d.out.file_to_translate.c:28
+#: ../locale/scriptstrings/d.out.file_to_translate.c:30
+msgid "Images"
+msgstr "Imagini"
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:8
+msgid "Width and height of output image (overrides resolution setting)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:10
+msgid "Compression for PNG files"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:11
+msgid "(0=none, 1=fastest, 9=most; lossless, only time vs. filesize)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:13
+msgid "File size/quality for JPEG files"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:14
+msgid "(10=smallest/worst, 100=largest/best)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:16
+msgid "Paper size for PostScript output"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:17
+#: ../locale/scriptstrings/d.out.file_to_translate.c:19
+#: ../locale/scriptstrings/d.out.file_to_translate.c:32
+msgid "PostScript"
+msgstr "PostScript"
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:18
+msgid "PostScript level (only limits functionality!)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:20
+msgid "GeoTIFF creation option(s)"
+msgstr "Opțiune de creare GeoTIFF"
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:22
+#: ../locale/scriptstrings/d.out.file_to_translate.c:25
+#: ../locale/scriptstrings/d.out.file_to_translate.c:34
+msgid "GeoTIFF"
+msgstr "GeoTIFF"
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:23
+msgid "GeoTIFF metadata key(s) and value(s) to add"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:24
+msgid "In the form of \"META-TAG=VALUE\", separate multiple entries with a comma."
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:26
+msgid "Set background color to black (white default)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:27
+msgid "Set transparent background"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:29
+msgid "Use the Cario driver to render images"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:31
+msgid "Set paper orientation to landscape (for PostScript output)"
+msgstr ""
+
+#: ../locale/scriptstrings/d.out.file_to_translate.c:33
+msgid "Do not crop away margins"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:1
+msgid "Creates shaded relief map from an elevation map (DEM)."
+msgstr "Crează harta reliefului umbrit dintr-o hartă a elevației (DEM)."
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:2
+#: ../locale/scriptstrings/r.plane_to_translate.c:2
+msgid "raster, elevation"
+msgstr "raster, elevație"
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:4
+msgid "Output shaded relief map name"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:5
+msgid "Altitude of the sun in degrees above the horizon"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:6
+msgid "Azimuth of the sun in degrees to the east of north"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:7
+msgid "Factor for exaggerating relief"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:8
+msgid "Scale factor for converting horizontal units to elevation units"
+msgstr ""
+
+#: ../locale/scriptstrings/r.shaded.relief_to_translate.c:9
+msgid "Set scaling factor (applies to lat./long. locations only, none: scale=1)"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:1
+msgid "Reconnects vectors to a new database."
+msgstr "Reconectează vectorii la o baza de date nouă."
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:3
+msgid "Name of old database"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:4
+msgid "The database must be in form printed by v.db.connect -g, i.e. with substituted variables"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:5
+msgid "Name of new database"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:6
+msgid "Old schema"
+msgstr ""
+
+#: ../locale/scriptstrings/v.db.reconnect.all_to_translate.c:7
+msgid "New schema"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:1
+msgid "Creates raster plane map given dip (inclination), aspect (azimuth) and one point."
+msgstr "Crează un pan de hartă raster cu un anumit dip (înclinație), orientare (azimut) și un punct."
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:3
+msgid "Name of raster plane to be created"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:4
+msgid "Dip of plane. Value must be between -90 and 90 degrees"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:5
+msgid "Azimuth of the plane. Value must be between 0 and 360 degrees"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:6
+msgid "Easting coordinate of a point on the plane"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:7
+msgid "Northing coordinate of a point on the plane"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:8
+msgid "Elevation coordinate of a point on the plane"
+msgstr ""
+
+#: ../locale/scriptstrings/r.plane_to_translate.c:9
+msgid "Type of the raster map to be created"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:1
+#: ../display/d.rast.edit/main.c:61
+msgid "Interactively edit cell values in a raster map."
+msgstr "Editează interactiv valorile celulelor dintr-un raster."
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:2
+#: ../display/d.colortable/main.c:62 ../display/d.what.rast/main.c:52
+#: ../display/d.rast.arrow/arrow.c:110 ../display/d.colors/main.c:50
+#: ../display/d.rast.num/number.c:84 ../display/d.rast.edit/main.c:59
+#: ../display/d.rast/main.c:51
+msgid "display, raster"
+msgstr "afișare, raster"
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:5
+msgid "Name of aspect raster map"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:6
+msgid "Width of display canvas"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:7
+msgid "Height of display canvas"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:8
+msgid "Minimum size of each cell"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:9
+msgid "Maximum number of rows to load"
+msgstr ""
+
+#: ../locale/scriptstrings/d.rast.edit_to_translate.c:10
+msgid "Maximum number of columns to load"
+msgstr ""
+
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:1
+msgid "Exports GRASS raster into GDAL supported formats."
+msgstr ""
+
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:4
+msgid "Region sensitive output"
+msgstr ""
+
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:9
+msgid "Creation option to the output format driver. Multiple options may be listed"
+msgstr ""
+
+#: ../locale/scriptstrings/r.out.gdal.sh_to_translate.c:10
+msgid "Metadata key passed on the output dataset if possible"
+msgstr ""
+
+#: ../locale/scriptstrings/r.unpack_to_translate.c:1
+msgid "Unpacks a raster map packed with r.pack."
+msgstr "Despachetează o hartă raster, care a fost împachetatp cu r.pack."
+
+#: ../locale/scriptstrings/r.unpack_to_translate.c:3
+msgid "Name of input pack file"
+msgstr ""
+
+#: ../locale/scriptstrings/r.unpack_to_translate.c:4
+msgid "Name for output raster map (default: taken from input file internals)"
+msgstr ""
+
+#: ../locale/scriptstrings/r.unpack_to_translate.c:5
+msgid "Override projection check (use current location's projection)"
+msgstr ""
+
+#: ../display/d.path/main.c:50
+msgid "display, networking"
+msgstr "afișare, rețea"
+
+#: ../display/d.path/main.c:52
+msgid "Finds shortest path for selected starting and ending node."
+msgstr ""
+
+#: ../display/d.path/main.c:59 ../vector/v.net.salesman/main.c:110
+#: ../vector/v.net.path/main.c:50 ../vector/v.net.alloc/main.c:75
+#: ../vector/v.net.steiner/main.c:359 ../vector/v.net.iso/main.c:85
+msgid "Arc type"
+msgstr ""
+
+#: ../display/d.path/main.c:66 ../display/d.rhumbline/main.c:55
+#: ../display/d.geodesic/main.c:56
+msgid "Starting and ending coordinates"
+msgstr ""
+
+#: ../display/d.path/main.c:71 ../vector/v.net/main.c:82
+#: ../vector/v.net.salesman/main.c:114 ../vector/v.net.path/main.c:55
+#: ../vector/v.net.alloc/main.c:80 ../vector/v.net.steiner/main.c:364
+#: ../vector/v.net.iso/main.c:89
+msgid "Arc layer"
+msgstr ""
+
+#: ../display/d.path/main.c:76 ../vector/v.net/main.c:88
+#: ../vector/v.net.path/main.c:60 ../vector/v.net.alloc/main.c:85
+#: ../vector/v.net.iso/main.c:94
+msgid "Node layer"
+msgstr ""
+
+#: ../display/d.path/main.c:82 ../vector/v.net.distance/main.c:113
+#: ../vector/v.net.path/main.c:73
+msgid "Arc forward/both direction(s) cost column"
+msgstr ""
+
+#: ../display/d.path/main.c:88 ../vector/v.net.distance/main.c:118
+#: ../vector/v.net.path/main.c:79
+msgid "Arc backward direction cost column"
+msgstr ""
+
+#: ../display/d.path/main.c:94 ../vector/v.net.path/main.c:85
+msgid "Node cost column"
+msgstr ""
+
+#: ../display/d.path/main.c:100 ../display/d.extract/main.c:65
+msgid "Original line color"
+msgstr ""
+
+#: ../display/d.path/main.c:102 ../display/d.path/main.c:110
+#: ../display/d.path/main.c:118 ../display/d.path/main.c:128
+msgid "Rendering"
+msgstr ""
+
+#: ../display/d.path/main.c:108 ../display/d.extract/main.c:71
+msgid "Highlight color"
+msgstr ""
+
+#: ../display/d.path/main.c:123 ../vector/v.net.distance/main.c:123
+#: ../vector/v.net.salesman/main.c:136 ../vector/v.net.path/main.c:102
+#: ../vector/v.net.allpairs/main.c:89 ../vector/v.net.alloc/main.c:117
+#: ../vector/v.net.spanningtree/main.c:64 ../vector/v.net.steiner/main.c:394
+#: ../vector/v.net.iso/main.c:127 ../vector/v.net.centrality/main.c:167
+msgid "Use geodesic calculation for longitude-latitude locations"
+msgstr ""
+
+#: ../display/d.path/main.c:127
+msgid "Render bold lines"
+msgstr ""
+
+#: ../display/d.path/main.c:143 ../display/d.rhumbline/main.c:85
+#: ../display/d.geodesic/main.c:83
+msgid "No coordinates given"
+msgstr ""
+
+#: ../display/d.path/main.c:146 ../display/d.path/main.c:150
+#, c-format
+msgid "%s - illegal x value"
+msgstr ""
+
+#: ../display/d.path/main.c:148 ../display/d.path/main.c:152
+#, c-format
+msgid "%s - illegal y value"
+msgstr ""
+
+#: ../display/d.path/main.c:159 ../display/d.graph/main.c:96
+#: ../display/d.frame/list.c:23 ../display/d.frame/select.c:36
+#: ../display/d.frame/frame.c:129 ../display/d.frame/frame.c:183
+#: ../display/d.frame/frame.c:223 ../display/d.rhumbline/main.c:108
+#: ../display/d.legend/main.c:265 ../display/d.rgb/main.c:83
+#: ../display/d.grid/main.c:206 ../display/d.linegraph/linegraph.c:251
+#: ../display/d.thematic.area/main.c:396 ../display/d.erase/main.c:58
+#: ../display/d.vect/main.c:377 ../display/d.geodesic/main.c:105
+#: ../display/d.where/main.c:144 ../display/d.text/main.c:132
+#: ../display/d.colortable/main.c:145 ../display/d.info/main.c:74
+#: ../display/d.profile/main.c:134 ../display/d.what.rast/main.c:116
+#: ../display/d.rast.arrow/arrow.c:245 ../display/d.extend/main.c:41
+#: ../display/d.text.new/main.c:295 ../display/d.what.vect/main.c:160
+#: ../display/d.ask/main.c:61 ../display/d.barscale/main.c:134
+#: ../display/d.paint.labels/main.c:90 ../display/d.histogram/main.c:181
+#: ../display/d.rast.num/number.c:132 ../display/d.font/main.c:86
+#: ../display/d.menu/main.c:108 ../display/d.his/main.c:117
+#: ../display/d.text.freetype/main.c:310 ../display/d.extract/main.c:79
+#: ../display/d.vect.chart/main.c:257 ../display/d.nviz/main.c:250
+#: ../display/d.measure/main.c:87 ../display/d.zoom/main.c:158
+#: ../display/d.zoom/main.c:293 ../display/d.zoom/redraw.c:39
+#: ../display/d.rast/main.c:114 ../display/d.font.freetype/main.c:103
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:97
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:81
+#: ../imagery/i.class/main.c:90 ../imagery/i.points/main.c:123
+#: ../vector/v.label/main.c:234
+msgid "No graphics device selected"
+msgstr ""
+
+#: ../display/d.path/main.c:185 ../vector/v.net.distance/main.c:153
+#: ../vector/v.net.path/main.c:120 ../vector/v.net.allpairs/main.c:122
+#: ../vector/v.net.spanningtree/main.c:93
+#: ../vector/v.net.centrality/main.c:201
+msgid "The current projection is not longitude-latitude"
+msgstr ""
+
+#: ../display/d.path/select.c:35
+msgid ""
+"\n"
+"Mouse Buttons:"
+msgstr ""
+
+#: ../display/d.path/select.c:36
+#, c-format
+msgid "Left:   Select From\n"
+msgstr ""
+
+#: ../display/d.path/select.c:37
+#, c-format
+msgid "Middle: Select To\n"
+msgstr ""
+
+#: ../display/d.path/select.c:38
+#, c-format
+msgid ""
+"Right:  Quit\n"
+"\n"
+msgstr ""
+
+#: ../display/d.path/select.c:65 ../display/d.path/select.c:242
+#: ../display/d.path/select.c:259
+#, c-format
+msgid "Node %d: %f %f\n"
+msgstr ""
+
+#: ../display/d.path/select.c:149 ../display/d.path/select.c:280
+#, c-format
+msgid "Destination unreachable\n"
+msgstr ""
+
+#: ../display/d.path/select.c:153 ../display/d.path/select.c:283
+#, c-format
+msgid "Costs on the network = %f\n"
+msgstr ""
+
+#: ../display/d.path/select.c:154 ../display/d.path/select.c:284
+#, c-format
+msgid ""
+"  Distance to the network = %f, distance from the network = %f\n"
+"\n"
+msgstr ""
+
+#: ../display/d.graph/do_graph.c:54 ../display/d.graph/do_graph.c:83
+#, c-format
+msgid "Problem parsing coordinates [%s]"
+msgstr ""
+
+#: ../display/d.graph/do_graph.c:105
+msgid "Unable to read color"
+msgstr ""
+
+#: ../display/d.graph/do_graph.c:136 ../display/d.graph/do_graph.c:213
+#: ../display/d.graph/do_graph.c:234 ../display/d.graph/do_graph.c:292
+#: ../display/d.graph/do_graph.c:363 ../display/d.graph/graphics.c:60
+#, c-format
+msgid "Problem parsing command [%s]"
+msgstr ""
+
+#: ../display/d.graph/do_graph.c:415 ../imagery/i.vpoints/plot.c:61
+#: ../imagery/i.vpoints/plot.c:143
+msgid "Cannot read symbol, cannot display points"
+msgstr ""
+
+#: ../display/d.graph/main.c:54 ../display/d.legend/main.c:86
+#: ../display/d.grid/main.c:51 ../display/d.linegraph/linegraph.c:113
+#: ../display/d.thematic.area/main.c:78 ../display/d.text/main.c:66
+#: ../display/d.mapgraph/main.c:48 ../display/d.text.new/main.c:142
+#: ../display/d.barscale/main.c:56 ../display/d.text.freetype/main.c:138
+#: ../display/d.vect.chart/main.c:63 ../display/d.title/main.c:45
+msgid "display, cartography"
+msgstr "afișare, cartografie"
+
+#: ../display/d.graph/main.c:56
+msgid "Program for generating and displaying simple graphics on the display monitor."
+msgstr ""
+
+#: ../display/d.graph/main.c:63
+msgid "Name of file containing graphics commands, if not given reads from standard input"
+msgstr ""
+
+#: ../display/d.graph/main.c:71
+msgid "Color to draw with, either a standard GRASS color or R:G:B triplet"
+msgstr ""
+
+#: ../display/d.graph/main.c:78
+msgid "Coordinates are given in map units"
+msgstr ""
+
+#: ../display/d.graph/main.c:89
+#, c-format
+msgid "Graph file <%s> not found"
+msgstr ""
+
+#: ../display/d.graph/main.c:119 ../display/d.legend/main.c:268
+#: ../display/d.text/main.c:152 ../display/d.info/main.c:103
+#: ../display/d.info/main.c:129 ../display/d.rast.arrow/arrow.c:248
+#: ../display/d.text.new/main.c:309 ../display/d.barscale/main.c:137
+#: ../display/d.paint.labels/main.c:124 ../display/d.rast.num/number.c:166
+#: ../display/d.text.freetype/main.c:316
+msgid "No current window"
+msgstr ""
+
+#: ../display/d.graph/main.c:122 ../display/d.legend/main.c:271
+#: ../display/d.text/main.c:155 ../display/d.info/main.c:105
+#: ../display/d.info/main.c:131 ../display/d.rast.arrow/arrow.c:251
+#: ../display/d.text.new/main.c:312 ../display/d.barscale/main.c:140
+#: ../display/d.paint.labels/main.c:127 ../display/d.rast.num/number.c:169
+#: ../display/d.text.freetype/main.c:318
+msgid "Current window not available"
+msgstr ""
+
+#: ../display/d.graph/main.c:125 ../display/d.info/main.c:113
+#: ../display/d.info/main.c:138 ../display/d.rast.arrow/arrow.c:264
+#: ../display/d.barscale/main.c:163 ../display/d.paint.labels/main.c:137
+#: ../display/d.rast.num/number.c:184
+msgid "Getting screen window"
+msgstr ""
+
+#: ../display/d.frame/select.c:41
+#, c-format
+msgid "Error choosing frame [%s]\n"
+msgstr ""
+
+#: ../display/d.frame/select.c:51
+#, c-format
+msgid ""
+"\n"
+"Buttons:\n"
+msgstr ""
+
+#: ../display/d.frame/select.c:52
+#, c-format
+msgid "Left:   Select frame\n"
+msgstr ""
+
+#: ../display/d.frame/select.c:53
+#, c-format
+msgid "Middle: Keep original frame\n"
+msgstr ""
+
+#: ../display/d.frame/select.c:54
+#, c-format
+msgid "Right:  Accept frame\n"
+msgstr ""
+
+#: ../display/d.frame/frame.c:62
+msgid "Manages display frames on the user's graphics monitor."
+msgstr ""
+
+#: ../display/d.frame/frame.c:66
+msgid "Create a new frame"
+msgstr ""
+
+#: ../display/d.frame/frame.c:70
+msgid "Select a frame"
+msgstr ""
+
+#: ../display/d.frame/frame.c:74 ../display/d.erase/main.c:47
+msgid "Remove all frames and erase the screen"
+msgstr ""
+
+#: ../display/d.frame/frame.c:78
+msgid "Print name of current frame"
+msgstr ""
+
+#: ../display/d.frame/frame.c:82
+msgid "Print names of all frames"
+msgstr ""
+
+#: ../display/d.frame/frame.c:86
+msgid "List map names displayed in GRASS monitor"
+msgstr ""
+
+#: ../display/d.frame/frame.c:90
+msgid "Debugging output"
+msgstr ""
+
+#: ../display/d.frame/frame.c:95
+msgid "name"
+msgstr ""
+
+#: ../display/d.frame/frame.c:98
+msgid "Frame to be created/selected"
+msgstr ""
+
+#: ../display/d.frame/frame.c:102
+msgid "bottom,top,left,right"
+msgstr ""
+
+#: ../display/d.frame/frame.c:107
+msgid "Where to place the frame, values in percent (implies -c)"
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:45 ../display/d.geodesic/main.c:45
+msgid "display, distance"
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:47
+msgid "Displays the rhumbline joining two user-specified points, in the active frame on the user's graphics monitor."
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:61 ../display/d.geodesic/main.c:62
+msgid "Line color"
+msgstr "Culoarea liniei"
+
+#: ../display/d.rhumbline/main.c:70 ../display/d.legend/main.c:95
+#: ../display/d.grid/main.c:92 ../display/d.barscale/main.c:88
+#: ../vector/v.label/main.c:152 ../vector/v.label.sa/main.c:144
+#: ../vector/v.lrs/v.lrs.label/main.c:193
+msgid "Text color"
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:79 ../display/d.geodesic/main.c:78
+#, c-format
+msgid "Location is not %s"
+msgstr ""
+
+#: ../display/d.rhumbline/main.c:89 ../display/d.rhumbline/main.c:93
+#: ../display/d.rhumbline/main.c:98 ../display/d.rhumbline/main.c:102
+#: ../display/d.geodesic/main.c:87 ../display/d.geodesic/main.c:91
+#: ../display/d.geodesic/main.c:95 ../display/d.geodesic/main.c:99
+#, c-format
+msgid "%s - illegal longitude"
+msgstr ""
+
+#: ../display/d.legend/main.c:88
+msgid "Displays a legend for a raster map in the active frame of the graphics monitor."
+msgstr ""
+
+#: ../display/d.legend/main.c:103
+msgid "Number of text lines (useful for truncating long legends)"
+msgstr ""
+
+#: ../display/d.legend/main.c:112
+msgid "Thinning factor (thin=10 gives cats 0,10,20...)"
+msgstr ""
+
+#: ../display/d.legend/main.c:120
+msgid "Number of text labels for smooth gradient legend"
+msgstr ""
+
+#: ../display/d.legend/main.c:130
+msgid "Size and placement as percentage of screen coordinates (0,0 is lower left)"
+msgstr ""
+
+#: ../display/d.legend/main.c:140
+msgid "List of discrete category numbers/values for legend"
+msgstr ""
+
+#: ../display/d.legend/main.c:150
+msgid "Use a subset of the map range for the legend (min,max)"
+msgstr ""
+
+#: ../display/d.legend/main.c:156
+msgid "Use mouse to size & place legend"
+msgstr ""
+
+#: ../display/d.legend/main.c:160
+msgid "Do not show category labels"
+msgstr ""
+
+#: ../display/d.legend/main.c:165
+msgid "Do not show category numbers"
+msgstr ""
+
+#: ../display/d.legend/main.c:170
+msgid "Skip categories with no label"
+msgstr ""
+
+#: ../display/d.legend/main.c:260 ../display/d.histogram/main.c:168
+#: ../ps/ps.map/ps_clrtbl.c:39
+#, c-format
+msgid "Category file for <%s> not available"
+msgstr ""
+
+#: ../display/d.legend/main.c:331
+msgid "Legend box lies outside of frame. Text may not display properly."
+msgstr ""
+
+#: ../display/d.legend/main.c:335
+msgid "Drawing horizontal legend as box width exceeds height"
+msgstr ""
+
+#: ../display/d.legend/main.c:346
+#, c-format
+msgid "Range information for <%s> not available (run r.support)"
+msgstr ""
+
+#: ../display/d.legend/main.c:351
+msgid "Input map contains no data"
+msgstr ""
+
+#: ../display/d.legend/main.c:364 ../display/d.legend/main.c:522
+msgid "Color range exceeds lower limit of actual data"
+msgstr ""
+
+#: ../display/d.legend/main.c:370 ../display/d.legend/main.c:526
+msgid "Color range exceeds upper limit of actual data"
+msgstr ""
+
+#: ../display/d.legend/main.c:427
+#, c-format
+msgid "use=%s out of range [%d,%d] (extend with range= ?)"
+msgstr ""
+
+#: ../display/d.legend/main.c:468
+msgid "Nothing to draw! (no categories with labels? out of range?)"
+msgstr ""
+
+#: ../display/d.legend/main.c:478
+msgid "Forcing a smooth legend: too many categories for current window height"
+msgstr ""
+
+#: ../display/d.legend/main.c:508 ../display/d.histogram/main.c:171
+#, c-format
+msgid "Range information for <%s> not available"
+msgstr ""
+
+#: ../display/d.legend/main.c:533
+#, c-format
+msgid "use=%s out of range [%.3f, %.3f] (extend with range= ?)"
+msgstr ""
+
+#: ../display/d.legend/main.c:895
+msgid "Nothing to draw! (no categories with labels?)"
+msgstr ""
+
+#: ../display/d.rgb/main.c:54
+msgid "display, raster, RGB"
+msgstr ""
+
+#: ../display/d.rgb/main.c:56
+msgid "Displays three user-specified raster maps as red, green, and blue overlays in the active graphics frame."
+msgstr ""
+
+#: ../display/d.rgb/main.c:61 ../display/d.rast/main.c:88
+msgid "Overlay (non-null values only)"
+msgstr ""
+
+#: ../display/d.rgb/main.c:65 ../display/d.erase/main.c:52
+msgid "Don't add to list of commands in monitor"
+msgstr ""
+
+#: ../display/d.rgb/main.c:70
+#, c-format
+msgid "Name of raster map to be used for '%s'"
+msgstr ""
+
+#: ../display/d.rgb/main.c:119
+msgid "Error reading row of data"
+msgstr ""
+
+#: ../display/d.grid/main.c:53
+msgid "Overlays a user-specified grid in the active display frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.grid/main.c:61
+msgid "Size of grid to be drawn"
+msgstr ""
+
+#: ../display/d.grid/main.c:62
+msgid "In map units or DDD:MM:SS format. Example: \"1000\" or \"0:10\""
+msgstr ""
+
+#: ../display/d.grid/main.c:71
+msgid "Lines of the grid pass through this coordinate"
+msgstr ""
+
+#: ../display/d.grid/main.c:77
+msgid "Grid line width"
+msgstr ""
+
+#: ../display/d.grid/main.c:81
+msgid "Grid color"
+msgstr "Culoarea gridului"
+
+#: ../display/d.grid/main.c:86 ../vector/v.label/main.c:194
+#: ../vector/v.label.sa/main.c:190 ../vector/v.lrs/v.lrs.label/main.c:237
+msgid "Border color"
+msgstr ""
+
+#: ../display/d.grid/main.c:101
+msgid "Font size for gridline coordinate labels"
+msgstr ""
+
+#: ../display/d.grid/main.c:106
+msgid "Draw geographic grid (referenced to current ellipsoid)"
+msgstr ""
+
+#: ../display/d.grid/main.c:111
+msgid "Draw geographic grid (referenced to WGS84 ellipsoid)"
+msgstr ""
+
+#: ../display/d.grid/main.c:115
+msgid "Draw '+' marks instead of grid lines"
+msgstr ""
+
+#: ../display/d.grid/main.c:119
+msgid "Draw '.' marks instead of grid lines"
+msgstr ""
+
+#: ../display/d.grid/main.c:123
+msgid "Draw fiducial marks instead of grid lines"
+msgstr ""
+
+#: ../display/d.grid/main.c:127
+msgid "Disable grid drawing"
+msgstr ""
+
+#: ../display/d.grid/main.c:128 ../display/d.grid/main.c:133
+#: ../display/d.grid/main.c:138
+msgid "Disable"
+msgstr "Dezactivează"
+
+#: ../display/d.grid/main.c:132
+msgid "Disable border drawing"
+msgstr ""
+
+#: ../display/d.grid/main.c:137
+msgid "Disable text drawing"
+msgstr ""
+
+#: ../display/d.grid/main.c:147
+msgid "Both grid and border drawing are disabled"
+msgstr ""
+
+#: ../display/d.grid/main.c:151
+msgid "Geo-Grid option is not available for LL projection"
+msgstr ""
+
+#: ../display/d.grid/main.c:153
+msgid "Geo-Grid option is not available for XY projection"
+msgstr ""
+
+#: ../display/d.grid/main.c:172
+msgid "Choose a single mark style"
+msgstr ""
+
+#: ../display/d.grid/main.c:184
+#, c-format
+msgid "Invalid geo-grid size <%s>"
+msgstr ""
+
+#: ../display/d.grid/main.c:189
+#, c-format
+msgid "Invalid grid size <%s>"
+msgstr ""
+
+#: ../display/d.grid/fiducial.c:64
+msgid "Reading symbol"
+msgstr ""
+
+#: ../display/d.grid/plot.c:340
+msgid ""
+"WGS84 grid output not possible as this location does not contain\n"
+"datum transformation parameters. Try running g.setproj."
+msgstr ""
+
+#: ../display/d.grid/plot.c:512
+msgid "Error in pj_do_proj1"
+msgstr ""
+
+#: ../display/d.grid/plot.c:518
+msgid "Error in pj_do_proj2"
+msgstr ""
+
+#: ../display/d.grid/plot.c:522
+msgid "Error in pj_do_proj3"
+msgstr ""
+
+#: ../display/d.grid/plot.c:530
+msgid "Error in pj_do_proj5"
+msgstr ""
+
+#: ../display/d.grid/plot.c:534
+msgid "Error in pj_do_proj6"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:115
+msgid "Generates and displays simple line graphs in the active graphics monitor display frame."
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:119
+msgid "Name of data file for X axis of graph"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:125
+msgid "Name of data file(s) for Y axis of graph"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:132
+msgid "Path to file location"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:139
+msgid "Color for Y data"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:148
+msgid "Color for axis, tics, numbers, and title"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:156
+msgid "Title for X data"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:163
+msgid "Title for Y data"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:170
+msgid "Title for Graph"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:209
+msgid "Maximum of 10 Y data files exceeded"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:238
+#, c-format
+msgid "Only <%d> colors given for <%d> lines"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:290
+#, c-format
+msgid "Y input file <%s> contains %s data points than the X input file"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:295
+#, c-format
+msgid "The last %d point(s) will be ignored"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:355
+#, c-format
+msgid "Problem reading X data file at line %d"
+msgstr ""
+
+#: ../display/d.linegraph/linegraph.c:366
+#, c-format
+msgid "Problem reading <%s> data file at line %d"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:80
+msgid "Displays a thematic vector area map in the active frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:90
+msgid "Data to be classified: column name or expression"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:97
+msgid "Class breaks, without minimum and maximum"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:105 ../vector/v.class/main.c:68
+msgid "Algorithm to use for classification"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:106 ../vector/v.class/main.c:69
+msgid "int;simple intervals;std;standard deviations;qua;quantiles;equ;equiprobable (normal distribution);"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:117 ../vector/v.class/main.c:80
+msgid "Number of classes to define"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:124
+msgid "Colors (one per class)."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:129
+msgid "Layer number. If -1, all layers are displayed."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:130 ../display/d.thematic.area/main.c:133
+#: ../display/d.vect/main.c:103 ../display/d.vect/main.c:109
+#: ../display/d.vect/main.c:112 ../display/d.vect/main.c:115
+#: ../display/d.vect/main.c:333 ../display/d.rast/main.c:66
+#: ../display/d.rast/main.c:75 ../display/d.rast/main.c:94
+#: ../vector/v.surf.rst/main.c:193 ../vector/v.surf.rst/main.c:219
+#: ../vector/v.surf.rst/main.c:222 ../vector/v.category/main.c:94
+#: ../vector/v.category/main.c:99 ../vector/v.category/main.c:103
+#: ../vector/v.out.ascii/out.c:80 ../vector/v.out.ascii/out.c:87
+#: ../vector/v.buffer2/main.c:160 ../vector/v.buffer2/main.c:163
+#: ../vector/v.net.allpairs/main.c:67 ../vector/v.net.allpairs/main.c:69
+#: ../vector/v.net.allpairs/main.c:71 ../vector/v.extract/main.c:107
+#: ../vector/v.extract/main.c:117 ../vector/v.extract/main.c:123
+#: ../vector/v.extract/main.c:127 ../vector/v.extract/main.c:130
+#: ../vector/v.extract/main.c:138 ../vector/v.extract/main.c:148
+#: ../vector/v.edit/args.c:42 ../vector/v.edit/args.c:47
+#: ../vector/v.edit/args.c:125 ../vector/v.edit/args.c:129
+#: ../vector/v.edit/args.c:138 ../vector/v.edit/args.c:147
+#: ../vector/v.edit/args.c:156 ../vector/v.edit/args.c:159
+#: ../vector/v.edit/args.c:173 ../vector/v.edit/args.c:202
+#: ../vector/v.select/args.c:16 ../vector/v.select/args.c:21
+#: ../vector/v.select/args.c:30 ../vector/v.select/args.c:35
+#: ../vector/v.select/args.c:89 ../vector/v.reclass/main.c:76
+#: ../vector/v.reclass/main.c:79 ../vector/v.to.rast/main.c:45
+#: ../vector/v.to.rast/main.c:50 ../vector/v.in.ogr/main.c:135
+#: ../vector/v.in.ogr/main.c:149 ../vector/v.in.ogr/main.c:171
+#: ../vector/v.net.centrality/main.c:107 ../vector/v.net.centrality/main.c:109
+msgid "Selection"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:139 ../display/d.thematic.area/main.c:147
+msgid "Boundaries"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:140
+msgid "Boundary width"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:146
+msgid "Boundary color"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:157 ../display/d.vect/main.c:303
+msgid "Rendering method for filled polygons"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:159
+msgid "d;use the display library basic functions (features: polylines);c;use the display library clipping functions (features: clipping);l;use the display library culling functions (features: culling, polylines)"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:167
+msgid "File in which to save d.graph instructions for legend display"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:173 ../display/d.vect.chart/main.c:148
+msgid "Create legend information and send to stdout"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:178
+msgid "When printing legend info , include extended statistical info from classification algorithm"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:182
+msgid "Do not draw map, only output the legend"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:195
+#, c-format
+msgid "Invalid rendering method <%s>"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:217
+#, c-format
+msgid "%s: You must build topology on vector map. Run v.build."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:224
+msgid "'layer' must be > 0"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:226 ../display/d.vect/main.c:466
+#: ../display/d.what.vect/what.c:446 ../vector/v.db.connect/main.c:175
+#, c-format
+msgid "Database connection not defined"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:250
+#, c-format
+msgid "Data (%s) not numeric. Column must be numeric."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:254
+#: ../display/d.thematic.area/plot1.c:225
+#: ../display/d.thematic.area/plot1.c:253 ../display/d.vect/area.c:93
+#: ../display/d.vect/area.c:136 ../display/d.vect/plot1.c:243
+#: ../display/d.vect/plot1.c:284 ../display/d.vect/plot1.c:327
+#: ../display/d.vect/plot1.c:370
+#, c-format
+msgid "Cannot select data (%s) from table"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:317 ../display/d.vect/main.c:427
+#, c-format
+msgid "Unknown color: [%s]"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:328
+msgid "You gave both manual breaks and a classification algorithm or a number of classes. The manual breaks have precedence and will thus be used."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:365
+msgid "You must either give classbreaks or a classification algorithm"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:378
+#, c-format
+msgid ""
+"Not enough colors or error in color specifications.\n"
+"Need %i colors."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:383
+#, c-format
+msgid "Error interpreting color %s"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:401 ../display/d.vect/main.c:583
+msgid "Plotting ..."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:408 ../display/d.vect/main.c:591
+msgid "The bounding box of the map is outside the current region, nothing drawn."
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:457
+#, c-format
+msgid ""
+"\n"
+"Total number of records: %.0f\n"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:459
+#, c-format
+msgid "Classification of %s into %i classes\n"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:461 ../vector/v.class/main.c:195
+#, c-format
+msgid "Using algorithm: *** %s ***\n"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:463 ../vector/v.class/main.c:196
+#, c-format
+msgid "Mean: %f\tStandard deviation = %f\n"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:467
+#, c-format
+msgid "Last chi2 = %f\n"
+msgstr ""
+
+#: ../display/d.thematic.area/main.c:470 ../vector/v.class/main.c:203
+#, c-format
+msgid "Stdev multiplied by %.4f to define step\n"
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:210 ../display/d.vect/plot1.c:222
+msgid "Color definition column not specified"
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:220
+#, c-format
+msgid "Color definition column (%s) not a string. Column must be of form RRR:GGG:BBB where RGB values range 0-255."
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:238 ../display/d.vect/area.c:113
+#: ../display/d.vect/plot1.c:261
+msgid "Line width column not specified."
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:249 ../display/d.vect/area.c:128
+#, c-format
+msgid "Line width column (%s) not a number."
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:294 ../display/d.vect/topo.c:39
+#, c-format
+msgid ""
+"\n"
+"ERROR: vector map - can't read\n"
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:369
+#, c-format
+msgid "Error in color definition column (%s), element %d with cat %d: colorstring [%s]"
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:376
+#, c-format
+msgid "Error in color definition column (%s), element %d with cat %d"
+msgstr ""
+
+#: ../display/d.thematic.area/plot1.c:444 ../display/d.vect/area.c:369
+#: ../display/d.vect/plot1.c:587
+#, c-format
+msgid "Error in line width column (%s), element %d with cat %d: line width [%d]"
+msgstr ""
+
+#: ../display/d.erase/main.c:34
+msgid "Erase the contents of the active display frame with user defined color"
+msgstr ""
+
+#: ../display/d.erase/main.c:42
+msgid "Color to erase with, either a standard GRASS color or R:G:B triplet (separated by colons)"
+msgstr ""
+
+#: ../display/d.erase/main.c:62 ../display/d.colortable/main.c:147
+#: ../display/d.measure/main.c:90
+msgid "No current frame"
+msgstr ""
+
+#: ../display/d.erase/main.c:64 ../display/d.colortable/main.c:149
+#: ../display/d.measure/main.c:93
+msgid "Current frame not available"
+msgstr ""
+
+#: ../display/d.vect/dir.c:31 ../display/d.vect/label.c:28
+#: ../display/d.vect/attr.c:53
+msgid "Can't read vector map"
+msgstr ""
+
+#: ../display/d.vect/main.c:78 ../display/d.what.vect/main.c:54
+#: ../display/d.extract/main.c:50
+msgid "display, vector"
+msgstr ""
+
+#: ../display/d.vect/main.c:79
+msgid "Displays user-specified vector map in the active graphics frame."
+msgstr ""
+
+#: ../display/d.vect/main.c:91
+msgid "Display"
+msgstr "Afișare"
+
+#: ../display/d.vect/main.c:92
+msgid "shape;Display geometry of features;cat;Display category numbers of features;topo;Display topology information (nodes, edges);dir;Display direction of linear features;attr;Display selected attribute based on 'attrcol';zcoor;Display z-coordinate of features (only for 3D vector maps)"
+msgstr ""
+
+#: ../display/d.vect/main.c:107
+msgid "Layer number (if -1, all layers are displayed)"
+msgstr ""
+
+#: ../display/d.vect/main.c:122
+msgid "Feature color"
+msgstr ""
+
+#: ../display/d.vect/main.c:126 ../display/d.vect/main.c:136
+#: ../display/d.vect/main.c:239 ../display/d.vect/main.c:249
+msgid "Either a standard GRASS color, R:G:B triplet, or \"none\""
+msgstr ""
+
+#: ../display/d.vect/main.c:132
+msgid "Area fill color"
+msgstr ""
+
+#: ../display/d.vect/main.c:141
+msgid "Name of color definition column (for use with -a flag)"
+msgstr ""
+
+#: ../display/d.vect/main.c:149
+msgid "Type of color table (for use with -z flag)"
+msgstr ""
+
+#: ../display/d.vect/main.c:158 ../display/d.vect/main.c:163
+#: ../display/d.vect/main.c:171
+msgid "Lines"
+msgstr ""
+
+#: ../display/d.vect/main.c:159
+msgid "Line width"
+msgstr "Lățimea liniei"
+
+#: ../display/d.vect/main.c:165
+msgid "Name of column for line widths (these values will be scaled by wscale)"
+msgstr ""
+
+#: ../display/d.vect/main.c:172
+msgid "Scale factor for wcolumn"
+msgstr ""
+
+#: ../display/d.vect/main.c:180 ../display/d.vect/main.c:190
+#: ../display/d.vect/main.c:197 ../display/d.vect/main.c:203
+msgid "Symbols"
+msgstr "Simboluri"
+
+#: ../display/d.vect/main.c:184
+msgid "Point and centroid symbol"
+msgstr ""
+
+#: ../display/d.vect/main.c:191
+msgid "Symbol size"
+msgstr ""
+
+#: ../display/d.vect/main.c:193
+msgid "When used with the size_column option this becomes the scale factor"
+msgstr ""
+
+#: ../display/d.vect/main.c:199
+msgid "Name of numeric column containing symbol size"
+msgstr ""
+
+#: ../display/d.vect/main.c:205
+msgid "Name of numeric column containing symbol rotation angle"
+msgstr ""
+
+#: ../display/d.vect/main.c:207
+msgid "Measured in degrees CCW from east"
+msgstr ""
+
+#: ../display/d.vect/main.c:212 ../display/d.vect/main.c:219
+#: ../display/d.vect/main.c:227 ../display/d.vect/main.c:235
+#: ../display/d.vect/main.c:245 ../display/d.vect/main.c:255
+#: ../display/d.vect/main.c:261 ../display/d.vect/main.c:267
+#: ../display/d.vect/main.c:275
+msgid "Labels"
+msgstr ""
+
+#: ../display/d.vect/main.c:214
+msgid "Layer number for labels (default: the given layer number)"
+msgstr ""
+
+#: ../display/d.vect/main.c:220
+msgid "Name of column to be displayed"
+msgstr ""
+
+#: ../display/d.vect/main.c:226
+msgid "Label color"
+msgstr ""
+
+#: ../display/d.vect/main.c:229
+msgid "Either a standard color name or R:G:B triplet"
+msgstr ""
+
+#: ../display/d.vect/main.c:236
+msgid "Label background color"
+msgstr ""
+
+#: ../display/d.vect/main.c:246
+msgid "Label border color"
+msgstr ""
+
+#: ../display/d.vect/main.c:256
+msgid "Label size (pixels)"
+msgstr ""
+
+#: ../display/d.vect/main.c:262 ../display/d.text.new/main.c:221
+#: ../display/d.text.freetype/main.c:168 ../vector/v.label/main.c:123
+msgid "Font name"
+msgstr ""
+
+#: ../display/d.vect/main.c:270
+msgid "Label horizontal justification"
+msgstr ""
+
+#: ../display/d.vect/main.c:278
+msgid "Label vertical justification"
+msgstr ""
+
+#: ../display/d.vect/main.c:285
+msgid "Minimum region size (average from height and width) when map is displayed"
+msgstr ""
+
+#: ../display/d.vect/main.c:293
+msgid "Maximum region size (average from height and width) when map is displayed"
+msgstr ""
+
+#: ../display/d.vect/main.c:305
+msgid "g;use the libgis render functions (features: clipping);r;use the raster graphics library functions (features: polylines);d;use the display library basic functions (features: polylines);c;use the display library clipping functions (features: clipping);l;use the display library culling functions (features: culling, polylines)"
+msgstr ""
+
+#: ../display/d.vect/main.c:321
+msgid "Get colors from map table column (of form RRR:GGG:BBB)"
+msgstr ""
+
+#: ../display/d.vect/main.c:327
+msgid "Random colors according to category number (or layer number if 'layer=-1' is given)"
+msgstr ""
+
+#: ../display/d.vect/main.c:334
+msgid "Use values from 'cats' option as feature id"
+msgstr ""
+
+#: ../display/d.vect/main.c:339
+msgid "Don't add to list of vectors and commands in monitor (it won't be drawn if the monitor is refreshed)"
+msgstr ""
+
+#: ../display/d.vect/main.c:344
+msgid "Colorize polygons according to z height"
+msgstr ""
+
+#: ../display/d.vect/main.c:387 ../display/d.paint.labels/main.c:102
+msgid "Region size is lower than minreg, nothing displayed."
+msgstr ""
+
+#: ../display/d.vect/main.c:396 ../display/d.paint.labels/main.c:111
+msgid "Region size is greater than maxreg, nothing displayed."
+msgstr ""
+
+#: ../display/d.vect/main.c:411
+msgid "The '-c' and '-a' flags cannot be used together, the '-c' flag will be ignored!"
+msgstr ""
+
+#: ../display/d.vect/main.c:442
+#, c-format
+msgid "Unknown color: '%s'"
+msgstr ""
+
+#: ../display/d.vect/main.c:463 ../vector/v.surf.rst/main.c:450
+#: ../vector/v.univar/main.c:205 ../vector/v.extract/main.c:274
+msgid "'layer' must be > 0 for 'where'."
+msgstr ""
+
+#: ../display/d.vect/main.c:490
+msgid "'layer' must be > 0 for 'cats'."
+msgstr ""
+
+#: ../display/d.vect/main.c:494
+#, c-format
+msgid "%d errors in cat option"
+msgstr ""
+
+#: ../display/d.vect/main.c:625
+msgid "Unable to display areas, topology not available"
+msgstr ""
+
+#: ../display/d.vect/main.c:630
+msgid "Unable to display lines by id, topology not available"
+msgstr ""
+
+#: ../display/d.vect/main.c:673
+msgid "Unable to display topology, not available"
+msgstr ""
+
+#: ../display/d.vect/area.c:72
+msgid "Color definition column not specified."
+msgstr ""
+
+#: ../display/d.vect/area.c:83 ../display/d.vect/plot1.c:233
+#, c-format
+msgid "Color definition column ('%s') not a string. Column must be of form 'RRR:GGG:BBB' where RGB values range 0-255. You can use '%s' module to define color rules. Unable to colorize features."
+msgstr ""
+
+#: ../display/d.vect/area.c:302
+#, c-format
+msgid "Error in color definition column (%s), area %d with cat %d: colorstring [%s]"
+msgstr ""
+
+#: ../display/d.vect/area.c:308
+#, c-format
+msgid "Error in color definition column (%s), area %d with cat %d"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:276
+#, c-format
+msgid "Line width column (%s) is not numeric."
+msgstr ""
+
+#: ../display/d.vect/plot1.c:304
+msgid "Symbol size column not specified."
+msgstr ""
+
+#: ../display/d.vect/plot1.c:319
+#, c-format
+msgid "Symbol size column (%s) is not numeric."
+msgstr ""
+
+#: ../display/d.vect/plot1.c:347
+msgid "Symbol rotation column not specified."
+msgstr ""
+
+#: ../display/d.vect/plot1.c:362
+#, c-format
+msgid "Symbol rotation column (%s) is not numeric."
+msgstr ""
+
+#: ../display/d.vect/plot1.c:388 ../display/d.vect/plot1.c:689
+msgid "Unable to read symbol, unable to display points"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:419 ../vector/v.label/main.c:297
+#: ../vector/v.info/main.c:388 ../vector/v.label.sa/labels.c:146
+#: ../vector/v.to.3d/trans3.c:82 ../vector/v.to.3d/trans2.c:81
+msgid "Unable to read vector map"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:511
+#, c-format
+msgid "Error in color definition column '%s', feature id %d with cat %d: colorstring '%s'"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:519
+#, c-format
+msgid "Error in color definition column '%s', feature id %d with cat %d"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:641
+#, c-format
+msgid "Error in symbol size column (%s), element %d with cat %d: symbol size [%f]"
+msgstr ""
+
+#: ../display/d.vect/plot1.c:729
+#, c-format
+msgid "Error in color definition column '%s': %d features affected"
+msgstr ""
+
+#: ../display/d.vect/attr.c:30
+msgid "attrcol not specified, cannot display attributes"
+msgstr ""
+
+#: ../display/d.vect/attr.c:110 ../display/d.vect.chart/plot.c:85
+#: ../vector/v.in.db/main.c:163
+#, c-format
+msgid "Unable to open select cursor: '%s'"
+msgstr ""
+
+#: ../display/d.vect/attr.c:129
+#, c-format
+msgid "No attribute found for cat %d: %s"
+msgstr ""
+
+#: ../display/d.geodesic/main.c:47
+msgid "Displays a geodesic line, tracing the shortest distance between two geographic points along a great circle, in a longitude/latitude data set."
+msgstr ""
+
+#: ../display/d.geodesic/main.c:70
+msgid "Text color or \"none\""
+msgstr ""
+
+#: ../display/d.where/main.c:42
+msgid "display, position, querying"
+msgstr ""
+
+#: ../display/d.where/main.c:44
+msgid "Identifies the geographic coordinates associated with point locations in the active frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.where/main.c:49
+msgid "One mouse click only"
+msgstr ""
+
+#: ../display/d.where/main.c:53
+msgid "Output lat/long in decimal degree"
+msgstr ""
+
+#: ../display/d.where/main.c:58
+msgid "Output lat/long referenced to current ellipsoid"
+msgstr ""
+
+#: ../display/d.where/main.c:63
+msgid "Output lat/long referenced to WGS84 ellipsoid using datum transformation parameters defined in current location (if available)"
+msgstr ""
+
+#: ../display/d.where/main.c:69
+msgid "Output frame coordinates of current display monitor (percentage)"
+msgstr ""
+
+#: ../display/d.where/main.c:77
+msgid "Ambiguous request for lat/long ellipsoids"
+msgstr ""
+
+#: ../display/d.where/main.c:80
+msgid "Please specify a lat/long ellipsoid with -l or -w"
+msgstr ""
+
+#: ../display/d.where/main.c:122
+msgid ""
+"WGS84 output not possible as this location does not contain\n"
+"datum transformation parameters. Try running g.setproj."
+msgstr ""
+
+#: ../display/d.text/main.c:68 ../display/d.text.new/main.c:144
+msgid "Draws text in the active display frame on the graphics monitor using the current font."
+msgstr ""
+
+#: ../display/d.text/main.c:77 ../display/d.text.new/main.c:159
+msgid "Height of letters in percentage of available frame height"
+msgstr ""
+
+#: ../display/d.text/main.c:85 ../display/d.text.new/main.c:167
+#: ../display/d.text.freetype/main.c:192
+msgid "Text color, either a standard GRASS color or R:G:B triplet"
+msgstr ""
+
+#: ../display/d.text/main.c:94 ../display/d.text.new/main.c:184
+msgid "The screen line number on which text will begin to be drawn"
+msgstr ""
+
+#: ../display/d.text/main.c:103 ../display/d.text.new/main.c:192
+msgid "Screen position at which text will begin to be drawn (percentage, [0,0] is lower left)"
+msgstr ""
+
+#: ../display/d.text/main.c:110 ../display/d.text.new/main.c:208
+#: ../display/d.text.freetype/main.c:217
+msgid "Rotation angle in degrees (counter-clockwise)"
+msgstr ""
+
+#: ../display/d.text/main.c:114 ../display/d.text.new/main.c:251
+#: ../display/d.text.freetype/main.c:236
+msgid "Use bold text"
+msgstr ""
+
+#: ../display/d.text/main.c:122 ../display/d.text.new/main.c:275
+msgid "Please choose only one placement method"
+msgstr ""
+
+#: ../display/d.text/main.c:177
+#, c-format
+msgid "value [%.0f,%.0f] out of range [0-100]"
+msgstr ""
+
+#: ../display/d.colortable/main.c:64
+msgid "Displays the color table associated with a raster map layer."
+msgstr ""
+
+#: ../display/d.colortable/main.c:68
+msgid "Name of raster map whose color table is to be displayed"
+msgstr ""
+
+#: ../display/d.colortable/main.c:76
+msgid "Color of lines separating the colors of the color table"
+msgstr ""
+
+#: ../display/d.colortable/main.c:82
+msgid "Number of lines to appear in the color table"
+msgstr ""
+
+#: ../display/d.colortable/main.c:88
+msgid "Number of columns to appear in the color table"
+msgstr ""
+
+#: ../display/d.colortable/main.c:93
+msgid "Don't draw a collar showing the NULL color in FP maps"
+msgstr ""
+
+#: ../display/d.colortable/main.c:118
+#, c-format
+msgid "<%s> is a floating point map. Ignoring [lines] and drawing continuous color ramp"
+msgstr ""
+
+#: ../display/d.colortable/main.c:132
+#, c-format
+msgid "<%s> is a floating point map. Ignoring [cols] and drawing continuous color ramp"
+msgstr ""
+
+#: ../display/d.colortable/main.c:141
+#, c-format
+msgid "R_color file for [%s] not available"
+msgstr ""
+
+#: ../display/d.colortable/main.c:143
+#, c-format
+msgid "Range file for [%s] not available"
+msgstr ""
+
+#: ../display/d.colortable/main.c:156
+msgid "Data range is empty"
+msgstr ""
+
+#: ../display/d.mapgraph/main.c:50
+msgid "Generates and displays simple graphics on map layers drawn in the active graphics monitor display frame."
+msgstr ""
+
+#: ../display/d.mapgraph/main.c:57
+msgid "Unix file containg graphing instructions, if not given reads from standard input"
+msgstr ""
+
+#: ../display/d.mapgraph/main.c:67
+msgid "Color to draw with, either a standard GRASS color or R:G:B triplet (separated by colons)"
+msgstr ""
+
+#: ../display/d.info/main.c:34 ../display/d.save/main.c:79
+msgid "display, metadata"
+msgstr ""
+
+#: ../display/d.info/main.c:36
+msgid "Display information about the active display monitor"
+msgstr ""
+
+#: ../display/d.info/main.c:41
+msgid "Display screen rectangle (left, right, top, bottom)"
+msgstr ""
+
+#: ../display/d.info/main.c:45
+msgid "Display screen dimensions (width, height)"
+msgstr ""
+
+#: ../display/d.info/main.c:49
+msgid "Display active frame rectangle"
+msgstr ""
+
+#: ../display/d.info/main.c:53
+msgid "Display screen rectangle of current region"
+msgstr ""
+
+#: ../display/d.info/main.c:58
+msgid "Display geographic coordinates and resolution of entire screen"
+msgstr ""
+
+#: ../display/d.info/main.c:62
+msgid "Display number of colors"
+msgstr ""
+
+#: ../display/d.info/main.c:111 ../display/d.info/main.c:136
+#: ../display/d.rast.arrow/arrow.c:257 ../display/d.barscale/main.c:156
+#: ../display/d.paint.labels/main.c:130 ../display/d.rast.num/number.c:176
+#: ../display/d.rast.edit/cell.c:35
+msgid "Setting map window"
+msgstr ""
+
+#: ../display/d.info/main.c:115 ../display/d.info/main.c:140
+#: ../display/d.what.rast/main.c:137 ../display/d.rast.arrow/arrow.c:266
+#: ../display/d.barscale/main.c:165 ../display/d.paint.labels/main.c:139
+#: ../display/d.rast.num/number.c:186
+msgid "Error in calculating conversions"
+msgstr ""
+
+#: ../display/d.profile/Range.c:87
+msgid "one moment ..."
+msgstr ""
+
+#: ../display/d.profile/What.c:29
+msgid "Error reading raster map"
+msgstr ""
+
+#: ../display/d.profile/main.c:61
+msgid "display, raster, profile"
+msgstr ""
+
+#: ../display/d.profile/main.c:63
+msgid "Interactive profile plotting utility with optional output."
+msgstr ""
+
+#: ../display/d.profile/main.c:71
+msgid "Raster map to be profiled"
+msgstr ""
+
+#: ../display/d.profile/main.c:78
+msgid "Optional display raster"
+msgstr ""
+
+#: ../display/d.profile/main.c:85
+msgid "Output profile data to file(s) with prefix 'name'"
+msgstr ""
+
+#: ../display/d.profile/main.c:106
+#, c-format
+msgid "Display raster [%s] not found. Using profile raster."
+msgstr ""
+
+#: ../display/d.profile/main.c:130
+msgid ""
+"\n"
+"\n"
+"Use mouse to choose action"
+msgstr ""
+
+#: ../display/d.profile/main.c:199 ../display/d.profile/main.c:393
+msgid "Use 'd.frame -e' to remove left over frames"
+msgstr ""
+
+#: ../display/d.profile/main.c:283
+msgid "Error opening cell-file"
+msgstr ""
+
+#: ../display/d.profile/main.c:285
+msgid "Error reading from cell-file"
+msgstr ""
+
+#: ../display/d.profile/main.c:287
+msgid "Mysterious window inconsistancy error"
+msgstr ""
+
+#: ../display/d.profile/main.c:430
+#, c-format
+msgid "%s: Couldn't open raster <%s@%s>"
+msgstr ""
+
+#: ../display/d.profile/main.c:434
+#, c-format
+msgid "%s: Couldn't read color table for <%s@%s>"
+msgstr ""
+
+#: ../display/d.profile/utils.c:8
+#, c-format
+msgid "%s: 'is_null_value()' got NULL pointer!"
+msgstr ""
+
+#: ../display/d.profile/utils.c:11
+#, c-format
+msgid "%s: 'is_null_value()' got negative column index"
+msgstr ""
+
+#: ../display/d.profile/utils.c:22
+#, c-format
+msgid "%s: 'is_null_value()' Unknown RASTER_MAP_TYPE '%d'"
+msgstr ""
+
+#: ../display/d.what.rast/what.c:57
+msgid "You are clicking outside the map"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:54
+msgid "Allows the user to interactively query the category contents of multiple raster map layers at user specified locations within the current geographic region."
+msgstr ""
+
+#: ../display/d.what.rast/main.c:89
+msgid "Field separator (terse mode only)"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:94 ../display/d.what.vect/main.c:74
+msgid "Identify just one location"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:98 ../display/d.what.vect/main.c:89
+msgid "Terse output. For parsing by programs"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:103
+msgid "Print out col/row for the entire map in grid resolution of the region"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:119 ../display/d.his/main.c:120
+msgid "No current graphics window"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:122 ../display/d.his/main.c:123
+msgid "Current graphics window not available"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:128
+msgid "Setting graphics window"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:131
+msgid "Can't set current graphics window"
+msgstr ""
+
+#: ../display/d.what.rast/main.c:135
+msgid "Getting graphics window coordinates"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:112
+msgid "Draws arrows representing cell aspect direction for a raster map containing aspect data."
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:121
+msgid "Name of raster aspect map to be displayed"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:129
+msgid "Type of existing raster aspect map"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:137
+msgid "Color for drawing arrows"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:145
+msgid "Color for drawing grid or \"none\""
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:153
+msgid "Color for drawing X's (Null values)"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:161
+msgid "Color for showing unknown information"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:168
+msgid "Draw arrow every Nth grid cell"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:177
+msgid "Raster map containing values used for arrow length"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:184
+msgid "Scale factor for arrows (magnitude map)"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:224
+msgid "Illegal value for scale factor"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:228
+msgid "Illegal value for skip factor"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:233
+msgid "Magnitude is only supported for GRASS and compass aspect maps."
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:240
+msgid "Scale option requires magnitude_map"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:260 ../display/d.barscale/main.c:159
+#: ../display/d.paint.labels/main.c:133 ../display/d.rast.num/number.c:179
+#: ../display/d.rast.edit/cell.c:38
+msgid "Current window not settable"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:313
+msgid "Problem reading range file"
+msgstr ""
+
+#: ../display/d.rast.arrow/arrow.c:368
+msgid "No raster map exists in the current window"
+msgstr ""
+
+#: ../display/d.extend/main.c:52
+msgid "No raster or vector map displayed"
+msgstr ""
+
+#: ../display/d.text.new/main.c:150 ../display/d.text.freetype/main.c:146
+msgid "Text to display"
+msgstr ""
+
+#: ../display/d.text.new/main.c:175
+msgid "Text background color, either a standard GRASS color or R:G:B triplet"
+msgstr ""
+
+#: ../display/d.text.new/main.c:200 ../display/d.text.freetype/main.c:209
+msgid "Text alignment"
+msgstr ""
+
+#: ../display/d.text.new/main.c:215 ../display/d.text.freetype/main.c:224
+msgid "Line spacing"
+msgstr ""
+
+#: ../display/d.text.new/main.c:227
+msgid "Path to font file"
+msgstr ""
+
+#: ../display/d.text.new/main.c:235
+msgid "Text encoding (only applicable to TrueType fonts)"
+msgstr ""
+
+#: ../display/d.text.new/main.c:239
+msgid "Use mouse to interactively place text"
+msgstr ""
+
+#: ../display/d.text.new/main.c:243 ../display/d.text.freetype/main.c:228
+msgid "Screen position in pixels ([0,0] is top left)"
+msgstr ""
+
+#: ../display/d.text.new/main.c:247 ../display/d.text.freetype/main.c:232
+msgid "Screen position in geographic coordinates"
+msgstr ""
+
+#: ../display/d.text.new/main.c:255 ../display/d.text.freetype/main.c:240
+msgid "Use radians instead of degrees for rotation"
+msgstr ""
+
+#: ../display/d.text.new/main.c:259 ../display/d.text.freetype/main.c:244
+msgid "Font size is height in pixels"
+msgstr ""
+
+#: ../display/d.text.new/main.c:263
+msgid "Ignored (compatibility with d.text.freetype)"
+msgstr ""
+
+#: ../display/d.text.new/main.c:345
+msgid "Invalid coordinates"
+msgstr ""
+
+#: ../display/d.text.new/main.c:413
+#, c-format
+msgid ""
+"\n"
+"Please enter text instructions.  Enter EOF (ctrl-d) on last line to quit\n"
+msgstr ""
+
+#: ../display/d.text.new/main.c:612
+#, c-format
+msgid "[%s]: No such color. Use '%s'"
+msgstr ""
+
+#: ../display/d.text.new/main.c:632
+#, c-format
+msgid "Click!\n"
+msgstr ""
+
+#: ../display/d.text.new/main.c:633
+#, c-format
+msgid " Left:    Place text here\n"
+msgstr ""
+
+#: ../display/d.text.new/main.c:634
+#, c-format
+msgid " Right:   Quit\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:179 ../display/d.what.vect/what.c:181
+#: ../vector/v.what/what.c:112 ../vector/v.what/what.c:114
+#, c-format
+msgid "Nothing Found.\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:237
+#, c-format
+msgid "Line: %d  Type: %s  Left: %d  Right: %d  "
+msgstr ""
+
+#: ../display/d.what.vect/what.c:241 ../vector/v.what/what.c:169
+#: ../vector/v.what/what.c:224
+#, c-format
+msgid "Length: %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:257
+#, c-format
+msgid "  Node[%d]: %d  Number of lines: %d  Coordinates: %.6f, %.6f, %.6f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:266
+#, c-format
+msgid "    Line: %5d  Angle: %.8f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:275
+#, c-format
+msgid "length %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:295 ../vector/v.what/what.c:238
+#, c-format
+msgid "Point height: %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:313 ../vector/v.what/what.c:255
+#, c-format
+msgid "Line height: %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:322
+#, c-format
+msgid "Line height min: %f max: %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:343
+#, c-format
+msgid "Area height: %f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:352
+#, c-format
+msgid "Area\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:374
+#, c-format
+msgid "Area: %d  Number of isles: %d\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:379
+#, c-format
+msgid "  Isle[%d]: %d\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:386
+#, c-format
+msgid "Island: %d  In area: %d\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:393 ../display/d.what.vect/what.c:401
+#, c-format
+msgid "Size - Sq Meters: %.3f\t\tHectares: %.3f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:397 ../display/d.what.vect/what.c:405
+#, c-format
+msgid "           Acres: %.3f\t\tSq Miles: %.4f\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:433
+#, c-format
+msgid ""
+"Layer: %d\n"
+"category: %d\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:458
+#, c-format
+msgid ""
+"driver: %s\n"
+"database: %s\n"
+"table: %s\n"
+"key column: %s\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:523
+#, c-format
+msgid ""
+"\n"
+"Click mouse button on desired location\n"
+"\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:528
+#, c-format
+msgid "Buttons\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:529
+#, c-format
+msgid " Left:  what's here\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:531
+#, c-format
+msgid " Middle: toggle flash color\n"
+msgstr ""
+
+#: ../display/d.what.vect/what.c:536
+#, c-format
+msgid " Right: quit\n"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:56
+msgid "Allows the user to interactively query a vector map layer at user-selected locations within the current geographic region."
+msgstr ""
+
+#: ../display/d.what.vect/main.c:85
+msgid "Name of existing vector map"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:94
+msgid "Print information as plain text to terminal window"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:98 ../vector/v.what/main.c:81
+msgid "Print topological information (debugging)"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:102
+msgid "Enable flashing (slower)"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:106
+msgid "Open form in edit mode"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:151
+#, c-format
+msgid "%s: You must build topology on vector map"
+msgstr ""
+
+#: ../display/d.what.vect/main.c:154 ../vector/v.what/main.c:162
+#: ../vector/v.select/main.c:143
+msgid "Building spatial index..."
+msgstr ""
+
+#: ../display/d.what.vect/openvect.c:11
+#, c-format
+msgid "warning: %s - vector map not found\n"
+msgstr ""
+
+#: ../display/d.ask/main.c:36
+msgid "display, map management"
+msgstr ""
+
+#: ../display/d.ask/main.c:38
+msgid "Prompts the user to select a GRASS data base file from among files displayed in a menu on the graphics monitor."
+msgstr ""
+
+#: ../display/d.ask/main.c:46
+msgid "Database element, one word description"
+msgstr ""
+
+#: ../display/d.ask/main.c:52
+msgid "Short user prompt message"
+msgstr ""
+
+#: ../display/d.ask/main.c:85
+#, c-format
+msgid "** no %s files found **\n"
+msgstr ""
+
+#: ../display/d.ask/main.c:86
+#, c-format
+msgid "Click here to CONTINUE\n"
+msgstr ""
+
+#: ../display/d.barscale/main.c:57
+msgid "Displays a barscale on the graphics monitor."
+msgstr ""
+
+#: ../display/d.barscale/main.c:61
+msgid "Use mouse to interactively place scale"
+msgstr ""
+
+#: ../display/d.barscale/main.c:65
+msgid "Use feet/miles instead of meters"
+msgstr ""
+
+#: ../display/d.barscale/main.c:69
+msgid "Draw a line scale instead of a bar scale"
+msgstr ""
+
+#: ../display/d.barscale/main.c:73
+msgid "Write text on top of the scale, not to the right"
+msgstr ""
+
+#: ../display/d.barscale/main.c:77
+msgid "Draw a north arrow only"
+msgstr ""
+
+#: ../display/d.barscale/main.c:81
+msgid "Draw a scale bar only"
+msgstr ""
+
+#: ../display/d.barscale/main.c:98
+msgid "The screen coordinates for top-left corner of label ([0,0] is top-left of frame)"
+msgstr ""
+
+#: ../display/d.barscale/main.c:106
+msgid "Font size"
+msgstr ""
+
+#: ../display/d.barscale/main.c:114
+#, c-format
+msgid "%s does not work with a latitude-longitude location"
+msgstr ""
+
+#: ../display/d.barscale/main.c:122
+msgid "Choose either -n or -s flag"
+msgstr ""
+
+#: ../display/d.paint.labels/do_labels.c:142
+#, c-format
+msgid "Error: %s\n"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:46
+msgid "display, paint labels"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:48
+msgid "Displays text labels (created with v.label) to the active frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:54
+msgid "Ignore rotation setting and draw horizontally"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:61
+msgid "Name of label file"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:68
+msgid "Minimum region size (diagonal) when labels are displayed"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:75
+msgid "Maximum region size (diagonal) when labels are displayed"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:87
+#, c-format
+msgid "Label file <%s> not found"
+msgstr ""
+
+#: ../display/d.paint.labels/main.c:121 ../vector/v.lrs/v.lrs.label/main.c:299
+#, c-format
+msgid "Unable to open label file <%s>"
+msgstr ""
+
+#: ../display/d.histogram/main.c:71
+msgid "display, histogram, statistics"
+msgstr ""
+
+#: ../display/d.histogram/main.c:73
+msgid "Displays a histogram in the form of a pie or bar chart for a user-specified raster map."
+msgstr ""
+
+#: ../display/d.histogram/main.c:77
+msgid "Raster map for which histogram will be displayed"
+msgstr ""
+
+#: ../display/d.histogram/main.c:81
+msgid "Indicate if a pie or bar chart is desired"
+msgstr ""
+
+#: ../display/d.histogram/main.c:90
+msgid "Color for text and axes"
+msgstr ""
+
+#: ../display/d.histogram/main.c:98
+msgid "Indicate if cell counts or map areas should be displayed"
+msgstr ""
+
+#: ../display/d.histogram/main.c:108
+msgid "Number of steps to divide the data range into (fp maps only)"
+msgstr ""
+
+#: ../display/d.histogram/main.c:115
+msgid "Display information for null cells"
+msgstr ""
+
+#: ../display/d.histogram/main.c:119
+msgid "Gather the histogram quietly"
+msgstr ""
+
+#: ../display/d.histogram/main.c:124
+msgid "Report for ranges defined in cats file (fp maps only)"
+msgstr ""
+
+#: ../display/d.histogram/main.c:149
+#, c-format
+msgid "Invalid number of steps: %s"
+msgstr ""
+
+#: ../display/d.histogram/main.c:154
+msgid "When -C flag is set, the nsteps argument is ignored"
+msgstr ""
+
+#: ../display/d.rast.num/number.c:86
+msgid "Overlays cell category values on a raster map layer displayed to the graphics monitor."
+msgstr ""
+
+#: ../display/d.rast.num/number.c:100
+msgid "Color for drawing grid, or \"none\""
+msgstr ""
+
+#: ../display/d.rast.num/number.c:110
+msgid "Color for drawing text"
+msgstr ""
+
+#: ../display/d.rast.num/number.c:124
+msgid "Get text color from cell color value"
+msgstr ""
+
+#: ../display/d.rast.num/number.c:138
+msgid "No raster map exists in current window"
+msgstr ""
+
+#: ../display/d.rast.num/number.c:209
+#, c-format
+msgid ""
+"Current region size: %d rows X %d cols\n"
+"Your current region setting may be too large. Cells displayed on your graphics window may be too small for cell category number to be visible."
+msgstr ""
+
+#: ../display/d.rast.num/number.c:216
+msgid "Aborting (region larger then 200 rows X 200 cols is not allowed)"
+msgstr ""
+
+#: ../display/d.rast.edit/cell.c:43
+msgid "Can't clear current graphics window"
+msgstr ""
+
+#: ../display/d.rast.edit/cell.c:86 ../display/d.rast/display.c:75
+msgid "Cannot use current window"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Get_w_line.c:35
+#: ../display/drivers/XDRIVER/Get_w_pointer.c:21
+#: ../display/drivers/XDRIVER/Get_w_box.c:34
+msgid "Monitor: interactive command in redraw"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Serve_Xevent.c:125
+#, c-format
+msgid "Monitor: waitpid: expected %d but got %d"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Serve_Xevent.c:331
+msgid "Monitor: XGetWMName failed"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Serve_Xevent.c:336
+msgid "Monitor: XGetWMName: bad result"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Graph_set.c:110
+#, c-format
+msgid "found %d visuals of type TrueColor"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Graph_set.c:112
+msgid "searching for highest bit depth"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Graph_set.c:128
+#, c-format
+msgid "selected %d bit depth"
+msgstr ""
+
+#: ../display/drivers/XDRIVER/Graph_set.c:188
+#, c-format
+msgid "using default visual which is %s"
+msgstr ""
+
+#: ../display/d.font/main.c:48 ../display/d.font.freetype/main.c:61
+msgid "Selects the font in which text will be displayed on the user's graphics monitor."
+msgstr ""
+
+#: ../display/d.font/main.c:56
+msgid "Choose new current font"
+msgstr ""
+
+#: ../display/d.font/main.c:63
+msgid "Path to Freetype-compatible font including file name"
+msgstr ""
+
+#: ../display/d.font/main.c:71 ../display/d.font.freetype/main.c:75
+msgid "Character encoding"
+msgstr ""
+
+#: ../display/d.font/main.c:75
+msgid "List fonts"
+msgstr ""
+
+#: ../display/d.font/main.c:79
+msgid "List fonts verbosely"
+msgstr ""
+
+#: ../display/d.font/main.c:105
+#, c-format
+msgid "Unable to access font path %s: %s"
+msgstr ""
+
+#: ../display/d.font/main.c:109
+#, c-format
+msgid "Font path %s is not a file"
+msgstr ""
+
+#: ../display/d.font/main.c:126
+#, c-format
+msgid "Font name <%s> is invalid. Check font name or consider running 'g.mkfontcap'"
+msgstr ""
+
+#: ../display/d.save/main.c:81
+msgid "Creates a list of commands for recreating screen graphics."
+msgstr ""
+
+#: ../display/d.save/main.c:86
+msgid "Name of frame(s) to save"
+msgstr ""
+
+#: ../display/d.save/main.c:126
+msgid "List of object numbers to remove which are displayed after \"#\". -1 for the last object."
+msgstr ""
+
+#: ../display/d.save/main.c:134
+msgid "List of object numbers to move (\"from\" to \"to\"). remove= option will be done first, if any."
+msgstr ""
+
+#: ../display/d.save/main.c:143
+msgid "Save current frame"
+msgstr ""
+
+#: ../display/d.save/main.c:148
+msgid "Save all the frames"
+msgstr ""
+
+#: ../display/d.save/main.c:154
+msgid "Only map objects without extra header and tailer"
+msgstr ""
+
+#: ../display/d.save/main.c:162
+msgid "No monitor selected"
+msgstr ""
+
+#: ../display/d.save/main.c:481 ../display/d.save/main.c:516
+#, c-format
+msgid "Unknown item type in pad: %s"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:51
+msgid "To establish and control use of a graphics display monitor."
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:57
+msgid "Name of graphics monitor to start"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:63
+msgid "Name of graphics monitor to stop"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:69
+msgid "Name of graphics monitor to select"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:75
+msgid "Name of graphics monitor to unlock"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:79
+msgid "List all monitors"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:83
+msgid "List all monitors (with current status)"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:87
+msgid "Print name of currently selected monitor"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:91
+msgid "Release currently selected monitor"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:96
+msgid "Do not automatically select when starting"
+msgstr ""
+
+#: ../display/d.mon/cmd/main.c:134
+#, c-format
+msgid "Problem selecting %s. Will try once more"
+msgstr ""
+
+#: ../display/d.mon/pgms/start.c:68 ../display/d.mon/pgms/select.c:18
+#, c-format
+msgid "Usage:  %s monitor_name"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:33 ../display/d.mon/pgms/release.c:41
+#, c-format
+msgid "%s: -%c unrecognized option"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:49
+#, c-format
+msgid "Usage: %s [-f] monitor_name"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:70
+#, c-format
+msgid "Monitor '%s' terminated"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:73
+#, c-format
+msgid "Error - Monitor '%s' was not running"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:76 ../display/d.mon/pgms/release.c:74
+#: ../display/d.mon/pgms/select.c:27
+#, c-format
+msgid "No such monitor as <%s>"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:79
+#, c-format
+msgid "Error - Monitor '%s' in use by another user"
+msgstr ""
+
+#: ../display/d.mon/pgms/stop.c:82
+msgid "Error - Locking mechanism failed"
+msgstr ""
+
+#: ../display/d.mon/pgms/release.c:68
+#, c-format
+msgid "Monitor <%s> released"
+msgstr ""
+
+#: ../display/d.mon/pgms/release.c:71
+#, c-format
+msgid "Monitor <%s> in use by another user"
+msgstr ""
+
+#: ../display/d.mon/pgms/release.c:77
+msgid "Failed testing lock mechanism"
+msgstr ""
+
+#: ../display/d.mon/pgms/release.c:88
+#, c-format
+msgid "Usage:  %s [-fv] [name]"
+msgstr ""
+
+#: ../display/d.menu/main.c:66
+msgid "display, menu"
+msgstr ""
+
+#: ../display/d.menu/main.c:68
+msgid "Creates and displays a menu within the active frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.menu/main.c:77
+msgid "Sets the color of the menu background"
+msgstr ""
+
+#: ../display/d.menu/main.c:85
+msgid "Sets the color of the menu text"
+msgstr ""
+
+#: ../display/d.menu/main.c:93
+msgid "Sets the color dividing lines of text"
+msgstr ""
+
+#: ../display/d.menu/main.c:101
+msgid "Sets the menu text size (in percent)"
+msgstr ""
+
+#: ../display/d.menu/main.c:113 ../display/d.menu/main.c:119
+#: ../display/d.menu/main.c:125
+#, c-format
+msgid "Don't know the color %s"
+msgstr ""
+
+#: ../display/d.menu/main.c:186
+msgid "Menu must contain a title and at least one option"
+msgstr ""
+
+#: ../display/d.his/main.c:65
+msgid "display, color transformation"
+msgstr ""
+
+#: ../display/d.his/main.c:67
+msgid "Displays the result obtained by combining hue, intensity, and saturation (his) values from user-specified input raster map layers."
+msgstr ""
+
+#: ../display/d.his/main.c:95
+msgid "Percent to brighten intensity channel"
+msgstr ""
+
+#: ../display/d.his/main.c:219
+msgid "Error reading hue data"
+msgstr ""
+
+#: ../display/d.his/main.c:224
+msgid "Error reading intensity data"
+msgstr ""
+
+#: ../display/d.his/main.c:229
+msgid "Error reading saturation data"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:140
+msgid "Draws text in the graphics monitor's active display frame using TrueType fonts."
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:154
+msgid "Screen position (percentage, [0,0] is bottom left)"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:176
+msgid "Path to TrueType font (including file name)"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:201
+msgid "Height of letters (in percent of available frame height)"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:248
+msgid "Command mode (Compatibility with d.text)"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:255
+msgid "Either text or -c should be given"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:260
+msgid "Choose only one coordinate system for placement"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:265 ../display/d.text.freetype/main.c:268
+#: ../display/d.text.freetype/main.c:606
+msgid "No font selected"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:277 ../display/d.text.freetype/main.c:440
+#, c-format
+msgid "Invalid font: %s"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:327 ../vector/v.label.sa/labels.c:92
+msgid "Unable to initialise FreeType"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:331 ../display/d.text.freetype/main.c:458
+msgid "Unable to create face"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:334 ../display/d.text.freetype/main.c:461
+#: ../display/d.text.freetype/main.c:478
+msgid "Unable to set size"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:349 ../display/d.text.freetype/main.c:568
+msgid "Unable to create text conversion context"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:351 ../display/d.text.freetype/main.c:570
+msgid "Text conversion error"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:415
+msgid "Unable to write the temporary file"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:435
+msgid "No predefined font"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:451
+#, c-format
+msgid "%s: Unable to read font"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:645
+#, c-format
+msgid "%s: Unable to read FreeType definition file; use the default"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:651
+#, c-format
+msgid "%s: No FreeType definition file"
+msgstr ""
+
+#: ../display/d.text.freetype/main.c:655
+#, c-format
+msgid "%s: Unable to read FreeType definition file"
+msgstr ""
+
+#: ../display/d.extract/main.c:52
+msgid "Selects and extracts vectors with mouse into new vector map."
+msgstr ""
+
+#: ../display/d.extract/main.c:117
+msgid "Copying tables..."
+msgstr ""
+
+#: ../display/d.extract/main.c:125
+msgid "Cannot get db link info -> cannot copy table."
+msgstr ""
+
+#: ../display/d.extract/extract.c:44
+msgid "Select vector(s) with mouse"
+msgstr ""
+
+#: ../display/d.extract/extract.c:45
+msgid " - L: draw box with left mouse button to select"
+msgstr ""
+
+#: ../display/d.extract/extract.c:46
+msgid " - M: draw box with middle mouse button to remove from display"
+msgstr ""
+
+#: ../display/d.extract/extract.c:47
+msgid " - R: quit and save selected vectors to new map\n"
+msgstr ""
+
+#: ../display/d.extract/extract.c:49
+msgid "L: add  M: remove  R: quit and save\n"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:65
+msgid "Displays charts of vector data in the active frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:82
+msgid "Chart type"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:83 ../display/d.vect.chart/main.c:97
+#: ../display/d.vect.chart/main.c:105 ../display/d.vect.chart/main.c:112
+#: ../display/d.vect.chart/main.c:120 ../display/d.vect.chart/main.c:129
+#: ../display/d.vect.chart/main.c:135
+msgid "Chart properties"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:90
+msgid "Attribute columns containing data"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:96
+msgid "Column used for pie chart size"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:104
+msgid "Size of chart (diameter for pie, total width for bar)"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:111
+msgid "Scale for size (to get size in pixels)"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:118
+msgid "Outline color"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:127
+msgid "Colors used to fill charts"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:134
+msgid "Center the bar chart around a data point"
+msgstr ""
+
+#: ../display/d.vect.chart/main.c:143
+msgid "Maximum value used for bar plot reference"
+msgstr ""
+
+#: ../display/d.nviz/main.c:69
+msgid "display, visualization, raster, vector, raster3d"
+msgstr ""
+
+#: ../display/d.nviz/main.c:70
+msgid "Creates fly-through script to run in NVIZ."
+msgstr ""
+
+#: ../display/d.nviz/main.c:75
+msgid "Name of output script"
+msgstr ""
+
+#: ../display/d.nviz/main.c:81
+msgid "Prefix of output images (default = NVIZ)"
+msgstr ""
+
+#: ../display/d.nviz/main.c:89
+msgid "Route coordinates (east,north)"
+msgstr ""
+
+#: ../display/d.nviz/main.c:95
+msgid "Camera layback distance (in map units)"
+msgstr ""
+
+#: ../display/d.nviz/main.c:101
+msgid "Camera height above terrain"
+msgstr ""
+
+#: ../display/d.nviz/main.c:107
+msgid "Number of frames"
+msgstr ""
+
+#: ../display/d.nviz/main.c:113
+msgid "Start frame number (default=0)"
+msgstr ""
+
+#: ../display/d.nviz/main.c:118
+msgid "Interactively select route"
+msgstr ""
+
+#: ../display/d.nviz/main.c:122
+msgid "Full render -- Save images"
+msgstr ""
+
+#: ../display/d.nviz/main.c:126
+msgid "Fly at constant elevation (ht)"
+msgstr ""
+
+#: ../display/d.nviz/main.c:131
+msgid "Include command in the script to output a KeyFrame file"
+msgstr ""
+
+#: ../display/d.nviz/main.c:135
+msgid "Render images off-screen"
+msgstr ""
+
+#: ../display/d.nviz/main.c:139
+msgid "Enable vector and sites drawing"
+msgstr ""
+
+#: ../display/d.nviz/main.c:147
+msgid "Either -i flag and/or route parameter must be used"
+msgstr ""
+
+#: ../display/d.nviz/main.c:171
+msgid "Off-screen only available with full render mode"
+msgstr ""
+
+#: ../display/d.nviz/main.c:282
+msgid "You must select more than one point"
+msgstr ""
+
+#: ../display/d.nviz/main.c:300
+msgid "You must select at least four points"
+msgstr ""
+
+#: ../display/d.nviz/main.c:317
+#, c-format
+msgid "You must provide at least four points %d"
+msgstr ""
+
+#: ../display/d.nviz/main.c:391
+#, c-format
+msgid "Created NVIZ script <%s>."
+msgstr ""
+
+#: ../display/d.nviz/main.c:538
+msgid "Skipping this point, selected point is outside region. Perhaps the camera setback distance puts it beyond the edge?"
+msgstr ""
+
+#: ../display/d.measure/main.c:49
+msgid "display, geometry"
+msgstr ""
+
+#: ../display/d.measure/main.c:51
+msgid "Measures the lengths and areas of features drawn by the user in the active display frame on the graphics monitor."
+msgstr ""
+
+#: ../display/d.measure/main.c:57
+msgid "Line color 1"
+msgstr ""
+
+#: ../display/d.measure/main.c:65
+msgid "Line color 2"
+msgstr ""
+
+#: ../display/d.measure/main.c:73
+msgid "Suppress clear screen"
+msgstr ""
+
+#: ../display/d.measure/main.c:77
+msgid "Output in meters only"
+msgstr ""
+
+#: ../display/d.measure/main.c:81
+msgid "Output in kilometers as well"
+msgstr ""
+
+#: ../display/d.title/main.c:47
+msgid "Create a TITLE for a raster map in a form suitable for display with d.text."
+msgstr ""
+
+#: ../display/d.title/main.c:58
+msgid "Sets the text color"
+msgstr ""
+
+#: ../display/d.title/main.c:66
+msgid "Sets the text size as percentage of the frame's height"
+msgstr ""
+
+#: ../display/d.title/main.c:70
+msgid "Draw title on current display"
+msgstr ""
+
+#: ../display/d.title/main.c:74
+msgid "Do a fancier title"
+msgstr ""
+
+#: ../display/d.title/main.c:79
+msgid "Do a simple title"
+msgstr ""
+
+#: ../display/d.title/main.c:97
+msgid "Title can be fancy or simple, not both"
+msgstr ""
+
+#: ../display/d.title/main.c:100
+msgid "No map name given"
+msgstr ""
+
+#: ../display/d.zoom/main.c:57
+msgid "display, zoom"
+msgstr ""
+
+#: ../display/d.zoom/main.c:59
+msgid "Allows the user to change the current geographic region settings interactively, with a mouse."
+msgstr ""
+
+#: ../display/d.zoom/main.c:108
+msgid "Magnification: >1.0 zooms in, <1.0 zooms out"
+msgstr ""
+
+#: ../display/d.zoom/main.c:118
+msgid "Full menu (zoom + pan) & Quit menu"
+msgstr ""
+
+#: ../display/d.zoom/main.c:122
+msgid "Pan mode"
+msgstr ""
+
+#: ../display/d.zoom/main.c:126
+msgid "Handheld mode"
+msgstr ""
+
+#: ../display/d.zoom/main.c:130
+msgid "Just redraw given maps using default colors"
+msgstr ""
+
+#: ../display/d.zoom/main.c:134
+msgid "Return to previous zoom"
+msgstr "Revenire la zoom-ul anterior"
+
+#: ../display/d.zoom/main.c:145
+msgid "Please choose only one mode of operation"
+msgstr ""
+
+#: ../display/d.zoom/main.c:162
+msgid "ERROR: can not get \"list\" items"
+msgstr ""
+
+#: ../display/d.zoom/main.c:163
+msgid "-j flag forced"
+msgstr ""
+
+#: ../display/d.zoom/main.c:196
+msgid "No map is displayed in GRASS monitor"
+msgstr ""
+
+#: ../display/d.zoom/main.c:298
+#, c-format
+msgid "%d raster%s, %d vector%s\n"
+msgstr ""
+
+#: ../display/d.zoom/main.c:307
+msgid "No previous zoom available"
+msgstr ""
+
+#: ../display/d.zoom/main.c:311
+msgid "Returning to previous zoom"
+msgstr ""
+
+#: ../display/d.zoom/main.c:352
+msgid "Zooming complete."
+msgstr ""
+
+#: ../display/d.zoom/pan.c:17 ../display/d.zoom/zoom.c:15
+#, c-format
+msgid ""
+"\n"
+"\n"
+"Buttons:\n"
+msgstr ""
+
+#: ../display/d.zoom/pan.c:18
+#, c-format
+msgid "Left:   Pan\n"
+msgstr ""
+
+#: ../display/d.zoom/pan.c:19
+#, c-format
+msgid "Right:  Quit\n"
+msgstr ""
+
+#: ../display/d.zoom/zoom.c:16
+#, c-format
+msgid "Left:   Zoom menu\n"
+msgstr ""
+
+#: ../display/d.zoom/zoom.c:17
+#, c-format
+msgid "Middle: Pan\n"
+msgstr ""
+
+#: ../display/d.zoom/zoom.c:18
+#, c-format
+msgid "Right:  Quit menu\n"
+msgstr ""
+
+#: ../display/d.zoom/zoom.c:40
+#, c-format
+msgid ""
+"This region now saved as current region.\n"
+"\n"
+msgstr ""
+
+#: ../display/d.zoom/zoom.c:42
+#, c-format
+msgid "Note: run 'd.erase' for the new region to affect the graphics.\n"
+msgstr ""
+
+#: ../display/d.rast/main.c:52
+msgid "Displays user-specified raster map in the active graphics frame."
+msgstr ""
+
+#: ../display/d.rast/main.c:57 ../imagery/i.class/main.c:62
+msgid "Name of raster map to be displayed"
+msgstr ""
+
+#: ../display/d.rast/main.c:65
+msgid "List of categories to be displayed (INT maps)"
+msgstr ""
+
+#: ../display/d.rast/main.c:74
+msgid "List of values to be displayed (FP maps)"
+msgstr ""
+
+#: ../display/d.rast/main.c:83
+msgid "Background color (for null)"
+msgstr ""
+
+#: ../display/d.rast/main.c:84 ../display/d.rast/main.c:89
+msgid "Null cells"
+msgstr ""
+
+#: ../display/d.rast/main.c:93
+msgid "Invert catlist"
+msgstr ""
+
+#: ../display/d.rast/main.c:99
+msgid "Don't add to list of rasters and commands in monitor"
+msgstr ""
+
+#: ../display/d.rast/main.c:119
+msgid "Ignoring catlist: map is floating point (please use 'val=')"
+msgstr ""
+
+#: ../display/d.rast/main.c:125
+msgid "Ignoring vallist: map is integer (please use 'cat=')"
+msgstr ""
+
+#: ../display/d.font.freetype/main.c:68
+msgid "Font name or pathname of TTF file"
+msgstr ""
+
+#: ../display/d.font.freetype/main.c:173
+msgid "Setting release of FreeType"
+msgstr ""
+
+#: ../raster3d/base/r3.timestamp.main.c:43 ../raster3d/base/r3.mask.main.c:153
+#: ../raster3d/base/r3.info.main.c:78 ../raster3d/base/r3.null.main.c:205
+#: ../raster3d/r3.cross.rast/main.c:270 ../raster3d/r3.mkdspf/main.c:75
+#: ../raster3d/r3.to.rast/main.c:215 ../raster3d/r3.gwflow/main.c:169
+msgid "raster3d, voxel"
+msgstr ""
+
+#: ../raster3d/base/r3.timestamp.main.c:45
+msgid "Print/add/remove a timestamp for a 3D raster map"
+msgstr "Printează/adaugă/elimină timestamp pentru o hartă raster 3D"
+
+#: ../raster3d/base/r3.timestamp.main.c:52
+msgid "Input grid3 filename"
+msgstr ""
+
+#: ../raster3d/base/r3.timestamp.main.c:59
+msgid "Datetime, datetime1/datetime2, or none"
+msgstr ""
+
+#: ../raster3d/base/r3.timestamp.main.c:74
+#, c-format
+msgid "Grid3 <%s> not found %s"
+msgstr ""
+
+#: ../raster3d/base/mask_functions.c:82
+#, c-format
+msgid "Adding rule: %lf - %lf"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:44
+msgid "3D raster map with reference values"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:52
+msgid "List of cell values to be masked out"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:95
+msgid "Unable to open 3D raster mask file"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:124
+msgid "makeMask: error flushing tiles in cube"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:129
+msgid "makeMask: error flushing all tiles"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:137
+msgid "Unable to close 3D raster mask file"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:139
+#, c-format
+msgid "Unable to close raster map <%s>"
+msgstr ""
+
+#: ../raster3d/base/r3.mask.main.c:155
+msgid "Establishes the current working 3D raster mask."
+msgstr "Stabilește o mască 3D pentru rasterul curent."
+
+#: ../raster3d/base/r3.mask.main.c:159
+msgid ""
+"Cannot create mask file: G3D_MASK already exists!\n"
+" Use 'g.remove rast3d=G3D_MASK' to remove the existing mask."
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:80
+msgid "Outputs basic information about a user-specified 3D raster map layer."
+msgstr "Transmite informații de bază despre harta raster 3D specificată de utilizator."
+
+#: ../raster3d/base/r3.info.main.c:87
+msgid "Name of input 3D raster map"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:96
+msgid "Print 3D raster map resolution (NS-res, EW-res, TB-res) only"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:100
+msgid "Print 3D raster map type (float/double) only"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:104
+msgid "Print 3D raster map region only"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:108
+msgid "Print 3D raster history instead of info"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:113
+msgid "Print 3D raster map timestamp (day.month.year hour:minute:seconds) only"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:121
+#, c-format
+msgid "3D Raster map <%s> not found"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:287 ../raster3d/base/r3.info.main.c:349
+#, c-format
+msgid "Unable to read range of 3D raster map <%s>"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:404
+msgid "Error while reading history file"
+msgstr ""
+
+#: ../raster3d/base/r3.info.main.c:425 ../raster3d/r3.cross.rast/main.c:404
+#: ../raster3d/r3.out.vtk/errorHandling.c:67 ../raster3d/r3.gwflow/main.c:415
+#, c-format
+msgid "Unable to close 3D raster map <%s>"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:58
+msgid "3d raster map for which to modify null values"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:88
+msgid "Illegal value for null"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:125
+msgid "modifyNull: error opening tmp file"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:174
+msgid "modifyNull: error flushing tiles in cube"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:180
+msgid "modifyNull: error flushing all tiles"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:190
+msgid "modifyNull: Unable to close tmp file"
+msgstr ""
+
+#: ../raster3d/base/r3.null.main.c:207
+msgid "Explicitly create the 3D NULL-value bitmap file."
+msgstr "Crează în mod explicit un fișier bitmap cu valorile 3D nule."
+
+#: ../raster3d/r3.cross.rast/main.c:55 ../raster3d/r3.in.ascii/main.c:287
+#: ../raster3d/r3.out.vtk/main.c:254 ../raster3d/r3.out.vtk/main.c:339
+#: ../raster3d/r3.out.v5d/main.c:54 ../raster3d/r3.out.v5d/main.c:326
+#: ../raster3d/r3.out.ascii/main.c:58 ../raster3d/r3.out.ascii/main.c:300
+#: ../raster3d/r3.to.rast/main.c:55 ../raster3d/r3.to.rast/main.c:390
+#: ../raster3d/r3.in.v5d/main.c:218
+msgid "Unable to close 3D raster map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:77 ../raster3d/r3.cross.rast/main.c:392
+#: ../raster3d/r3.to.rast/main.c:194
+msgid "Unable to close output map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:91
+msgid "Input 3D raster map for cross section."
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:98
+msgid "2D elevation map used to create the cross section map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:105
+msgid "Resulting cross section 2D raster map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:162
+msgid "Unable to get elevation raster row"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:230 ../raster3d/r3.cross.rast/main.c:237
+#: ../raster3d/r3.to.rast/main.c:152 ../raster3d/r3.to.rast/main.c:159
+msgid "Unable to write raster row"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:272
+msgid "Creates cross section 2D raster map from 3D raster map based on 2D elevation map."
+msgstr "Crează secțiune transversală pentru harta raster 2D dintr-o hartă raster 3D, bazată pe harta de elevație 2D."
+
+#: ../raster3d/r3.cross.rast/main.c:298
+msgid "The 2D and 3D region settings are different. Using the 3D raster map settings to adjust the 2D region."
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:333
+msgid "Elevation map not found"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:338
+msgid "Unable to open elevation map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:352
+msgid "Output map already exists. Will be overwritten!"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:358 ../raster3d/r3.cross.rast/main.c:364
+msgid "Unable to create raster map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:394
+msgid "Unable to close elevation map"
+msgstr ""
+
+#: ../raster3d/r3.cross.rast/main.c:399
+msgid "Wrong 3D raster map datatype! Unable to create raster map."
+msgstr ""
+
+#: ../raster3d/r3.stats/main.c:569
+msgid "Generates volume statistics for 3D raster maps."
+msgstr "Generează statistici de volume pentru harta raster 3D."
+
+#: ../raster3d/r3.stats/main.c:580
+msgid "Number of subranges to collect stats from"
+msgstr ""
+
+#: ../raster3d/r3.stats/main.c:586
+msgid "Calculate statistics based on equal value groups"
+msgstr ""
+
+#: ../raster3d/r3.stats/main.c:606
+msgid "The number of subranges has to be equal or greater than 1"
+msgstr ""
+
+#: ../raster3d/r3.stats/main.c:665
+msgid "Sort non-null values"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:79
+msgid "ASCII raster map to be imported"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:90
+msgid "String representing NULL value data cell (use 'none' if no such value)"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:175
+#, c-format
+msgid "Loading data ...  (%dx%dx%d)"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:192
+msgid "End of file reached while still loading data."
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:205
+msgid "Invalid value detected"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:222
+#, c-format
+msgid "Data exists in input file after fully importing expected data.  [%.4f ...]"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:253 ../raster3d/r3.in.v5d/main.c:191
+msgid "raster3d, voxel, import"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:255
+msgid "Converts a 3D ASCII raster text file into a (binary) 3D raster map layer."
+msgstr "Convertește fișier text raster 3D ASCII într-o hartă raster 3D."
+
+#: ../raster3d/r3.in.ascii/main.c:281 ../raster3d/r3.in.v5d/main.c:213
+msgid "Unable to open 3D raster map"
+msgstr ""
+
+#: ../raster3d/r3.in.ascii/main.c:297
+msgid "Unable to close ASCII file"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:99
+#, c-format
+msgid "Could not open map %s"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:118
+msgid "Specify top and bottom map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:125
+#, c-format
+msgid "Top cell map <%s> not found"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:134
+#, c-format
+msgid "Bottom cell map <%s> not found"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:157
+msgid "Please provide three RGB 3D raster maps"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:167
+#, c-format
+msgid "3D vector map <%s> not found"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:171
+msgid "Please provide three 3D raster maps for the xyz-vector maps [x,y,z]"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:178
+msgid "No 3D raster data, RGB or xyz-vector maps are provided. Will only write the geometry"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:211
+msgid "No RGB Data will be created"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:295
+msgid "No vector data will be created"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:376 ../raster3d/r3.out.v5d/main.c:286
+#: ../raster3d/r3.out.ascii/main.c:244
+msgid "raster3d, voxel, export"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:378
+msgid "Converts 3D raster maps into the VTK-ASCII format."
+msgstr "Convertește hartă raster 3D în format VTK-ASCII."
+
+#: ../raster3d/r3.out.vtk/main.c:389
+msgid "failed to interpret dp as an integer"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:451 ../raster3d/r3.to.rast/main.c:267
+msgid "The 2D and 3D region settings are different. Using the 2D window settings to adjust the 2D part of the 3D region."
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:489
+msgid "Unable to close top raster map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:494
+msgid "Unable to close bottom raster map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:546
+msgid "Unable to close 3D raster map, the VTK file may be incomplete"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/main.c:561
+msgid "Unable to close VTK-ASCII file"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/errorHandling.c:52
+msgid "Unable to close input raster map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/errorHandling.c:107
+msgid "Unable to close input raster maps"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKData.c:122
+msgid "write_vtk_points: Writing point coordinates"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKData.c:131
+msgid "Unable to read top raster row \n"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKData.c:135
+msgid "Unable to read bottom raster row \n"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKData.c:256
+msgid "write_vtk_unstructured_grid_cells: Writing the cells"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKData.c:429
+#: ../raster3d/r3.out.vtk/writeVTKData.c:462
+msgid "Wrong 3D raster map values: Values should in between 0 and 255\n"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:30
+msgid "G3D map(s) to be converted to VTK-ASCII data format"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:41
+msgid "Float value to represent no data cell/points"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:47
+msgid "Create VTK pointdata instead of VTK celldata (celldata is default)"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:56
+msgid "top surface 2D raster map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:65
+msgid "bottom surface 2D raster map"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:71
+msgid "Create 3d elevation output with a top and a bottom surface, both raster maps are required."
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:82
+msgid "Three (R,G,B) 3D raster maps to create RGB values [redmap,greenmap,bluemap]"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:92
+msgid "Three (x,y,z) 3D raster maps to create vector values [xmap,ymap,zmap]"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:117 ../raster3d/r3.gwflow/main.c:136
+msgid "Use 3D raster mask (if exists) with input maps"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/parameters.c:122
+msgid "Scale factor effects the origin"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKHead.c:39
+msgid "write_vtk_structured_point_header: Writing VTKStructuredPoint-Header"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKHead.c:95
+msgid "write_vtk_structured_grid_header: Writing VTKStructuredGrid-Header"
+msgstr ""
+
+#: ../raster3d/r3.out.vtk/writeVTKHead.c:116
+msgid "write_vtk_unstructured_grid_header: Writing VTKUnstructuredGrid-Header"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:72
+msgid "3D raster map to be converted to Vis5D (V5D) file"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:79
+msgid "Name for V5D output file"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:149
+#, c-format
+msgid "Vis5D allows %d columns, %d columns found"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:152
+#, c-format
+msgid "Vis5D allows %d rows, %d rows found"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:259
+#, c-format
+msgid "Unable to create V5D file <%s>"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:264
+msgid "Failed writing V5D file"
+msgstr ""
+
+#: ../raster3d/r3.out.v5d/main.c:288
+msgid "Exports GRASS 3D raster map to 3-dimensional Vis5D file."
+msgstr "Exportă hartă raster GRASS 3D în fișier tridimensional Vis5D."
+
+#: ../raster3d/r3.out.v5d/main.c:295
+msgid "Use map coordinates instead of xyz coordinates"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:77
+msgid "Creates a display file from an existing grid3 file according to specified threshold levels."
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:85
+msgid "Name of an existing 3d raster map"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:91
+msgid "Name of output display file"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:98
+msgid "List of thresholds for isosurfaces"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:104
+msgid "Minimum isosurface level"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:110
+msgid "Maximum isosurface level"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:116
+msgid "Positive increment between isosurface levels"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:123
+msgid "Number of isosurface threshold levels"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:127
+msgid "Suppress progress report & min/max information"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:131
+msgid "Use flat shading rather than gradient"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:139
+#, c-format
+msgid "Region from getWindow: %d %d %d"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:151
+#, c-format
+msgid "Not able to find grid3 file for [%s]"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:163
+#, c-format
+msgid "Error opening grid3 file [%s]"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:166
+#, c-format
+msgid "Error reading range for [%s]"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:195
+#, c-format
+msgid "Error opening display file [%s]"
+msgstr ""
+
+#: ../raster3d/r3.mkdspf/main.c:216
+#, c-format
+msgid "Writing %s from %s..."
+msgstr ""
+
+#: ../raster3d/r3.out.ascii/main.c:76
+msgid "3D raster map to be converted to ASCII"
+msgstr ""
+
+#: ../raster3d/r3.out.ascii/main.c:83
+msgid "Name for ASCII output file"
+msgstr ""
+
+#: ../raster3d/r3.out.ascii/main.c:92
+msgid "Number of decimal places for floats"
+msgstr ""
+
+#: ../raster3d/r3.out.ascii/main.c:246
+msgid "Converts a 3D raster map layer into an ASCII text file."
+msgstr "Convertește hartă raster 3D în fișier text ASCII."
+
+#: ../raster3d/r3.out.ascii/main.c:305
+msgid "Unable to close new ASCII file"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:79
+msgid "3D raster map(s) to be converted to 2D raster slices"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:85
+msgid "Basename for resultant raster slice maps"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:95
+msgid "Use the same resolution as the input 3D raster map for the 2D outputmaps, independent of the current region settings"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:216
+msgid "Converts 3D raster maps to 2D raster maps"
+msgstr "Convertește hartă raster 3D în hartă raster 2D"
+
+#: ../raster3d/r3.to.rast/main.c:225
+#, c-format
+msgid "Open 3D raster map <%s>"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:243 ../raster3d/r3.to.rast/main.c:284
+#, c-format
+msgid "Error opening 3D raster map <%s>"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:304
+#, c-format
+msgid "Creating %i raster maps"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:310
+#, c-format
+msgid "Raster map %i Filename: %s"
+msgstr ""
+
+#: ../raster3d/r3.to.rast/main.c:313
+#, c-format
+msgid "Raster map %d Filename: %s already exists. Will be overwritten!"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:55
+msgid "Input 3D raster map with initial piezometric heads in [m]"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:63
+msgid "The status for each cell, = 0 - inactive, 1 - active, 2 - dirichlet"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:71
+msgid "The x-part of the hydraulic conductivity tensor in [m/s]"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:79
+msgid "The y-part of the hydraulic conductivity tensor in [m/s]"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:87
+msgid "The z-part of the hydraulic conductivity tensor in [m/s]"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:94
+msgid "Sources and sinks in [m^3/s]"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:101
+msgid "Specific yield in 1/m"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:108
+msgid "Recharge raster map in m^3/s"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:116
+msgid "The piezometric head result of the numerical calculation will be written to this map"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:123
+msgid ""
+"Calculate the groundwater distance velocity vector field \n"
+"and write the x, y, and z components to maps named name_[xyz].\n"
+"Name is basename for the new 3D raster maps."
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:141
+msgid "Use a sparse linear equation system, only available with iterative solvers"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:171
+msgid "Calculates numerically transient, confined groundwater flow in three dimensions."
+msgstr "Calculează numeric scurgerea apei subterane tranzitorie în trei dimensiuni."
+
+#: ../raster3d/r3.gwflow/main.c:193
+msgid "The direct Cholesky solver do not work with sparse matrices"
+msgstr ""
+
+#: ../raster3d/r3.gwflow/main.c:371
+#, c-format
+msgid "Unable to create 3D raster map <%s>"
+msgstr ""
+
+#: ../raster3d/r3.in.v5d/main.c:193
+msgid "Imports 3-dimensional Vis5D files (i.e. the V5D file with 1 variable and 1 time step)."
+msgstr "Importă fișier 3D Vis5D (ex. fișier V5D cu o variabilă și cel mai scurt timp)"
+
+#: ../ps/ps.map/do_psfiles.c:20
+#, c-format
+msgid "Reading PostScript include file <%s> ..."
+msgstr ""
+
+#: ../ps/ps.map/do_labels.c:43
+#, c-format
+msgid "Can't open label file <%s> in mapset <%s>"
+msgstr ""
+
+#: ../ps/ps.map/do_labels.c:47
+#, c-format
+msgid "Reading labels file <%s in %s> ..."
+msgstr ""
+
+#: ../ps/ps.map/do_labels.c:65
+#, c-format
+msgid "Can't open temporary label file <%s>"
+msgstr ""
+
+#: ../ps/ps.map/do_labels.c:68
+msgid "Reading text file ..."
+msgstr ""
+
+#: ../ps/ps.map/do_labels.c:161
+msgid "Text labels: 'fontsize' given so ignoring 'size'"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:48 ../ps/ps.map/r_vlegend.c:49
+#: ../ps/ps.map/r_colortable.c:61
+msgid "illegal where request"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:67 ../ps/ps.map/ps_outline.c:86
+#: ../ps/ps.map/r_header.c:65 ../ps/ps.map/getgrid.c:61
+#: ../ps/ps.map/getgrid.c:85 ../ps/ps.map/getgrid.c:171
+#: ../ps/ps.map/getgrid.c:195
+msgid "Unsupported color request"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:69 ../ps/ps.map/ps_outline.c:88
+#: ../ps/ps.map/r_header.c:67 ../ps/ps.map/main.c:399
+#: ../ps/ps.map/getgrid.c:63 ../ps/ps.map/getgrid.c:87
+#: ../ps/ps.map/getgrid.c:173 ../ps/ps.map/getgrid.c:197
+msgid "illegal color request"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:81
+msgid "illegal bgcolor request"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:93 ../ps/ps.map/r_vlegend.c:86
+msgid "illegal border color request"
+msgstr ""
+
+#: ../ps/ps.map/r_info.c:103
+msgid "illegal mapinfo sub-request"
+msgstr ""
+
+#: ../ps/ps.map/r_vlegend.c:97
+msgid "illegal vlegend sub-request"
+msgstr ""
+
+#: ../ps/ps.map/makeprocs.c:29
+#, c-format
+msgid "Unable to open prolog <%s>"
+msgstr ""
+
+#: ../ps/ps.map/ps_outline.c:42
+#, c-format
+msgid "Outlining areas in raster map <%s in %s> ..."
+msgstr ""
+
+#: ../ps/ps.map/ps_outline.c:99 ../ps/ps.map/r_colortable.c:69
+msgid "illegal width request"
+msgstr ""
+
+#: ../ps/ps.map/ps_outline.c:106
+msgid "illegal outline sub-request"
+msgstr ""
+
+#: ../ps/ps.map/eps.c:19
+#, c-format
+msgid "Can't open eps file <%s>"
+msgstr ""
+
+#: ../ps/ps.map/eps.c:38
+#, c-format
+msgid "Bounding box in eps file <%s> was not found"
+msgstr ""
+
+#: ../ps/ps.map/r_header.c:77
+msgid "illegal header sub-request"
+msgstr ""
+
+#: ../ps/ps.map/scale.c:137
+msgid "PSmap: do_scale(): shouldn't happen"
+msgstr ""
+
+#: ../ps/ps.map/ps_vlines.c:55 ../ps/ps.map/ps_vareas.c:163
+#: ../ps/ps.map/ps_vpoints.c:71
+msgid "Cannot load data from table"
+msgstr ""
+
+#: ../ps/ps.map/ps_vlines.c:83 ../ps/ps.map/ps_vareas.c:66
+#: ../ps/ps.map/ps_vareas.c:77 ../ps/ps.map/ps_vpoints.c:127
+msgid "Read error in vector map"
+msgstr ""
+
+#: ../ps/ps.map/ps_vlines.c:118 ../ps/ps.map/ps_vareas.c:101
+#: ../ps/ps.map/ps_vpoints.c:164 ../ps/ps.map/ps_vpoints.c:175
+#: ../ps/ps.map/ps_vpoints.c:199 ../ps/ps.map/ps_vpoints.c:240
+#: ../ps/ps.map/ps_vpoints.c:250
+#, c-format
+msgid "No record for category [%d]"
+msgstr ""
+
+#: ../ps/ps.map/ps_vlines.c:124 ../ps/ps.map/ps_vareas.c:107
+#: ../ps/ps.map/ps_vpoints.c:205
+#, c-format
+msgid "Invalid RGB color definition in column <%s> for category [%d]"
+msgstr ""
+
+#: ../ps/ps.map/catval.c:49 ../ps/ps.map/catval.c:111
+#: ../ps/ps.map/catval.c:177 ../vector/v.label/main.c:278
+#: ../vector/v.vol.rst/user1.c:93 ../vector/v.label.sa/labels.c:80
+#: ../vector/v.class/main.c:105 ../vector/v.buffer/main.c:383
+#: ../vector/v.to.rast3/main.c:82
+msgid "Unable to get layer info for vector map"
+msgstr ""
+
+#: ../ps/ps.map/catval.c:64
+msgid "Column type not supported (must be string)"
+msgstr ""
+
+#: ../ps/ps.map/catval.c:67 ../ps/ps.map/catval.c:132
+#: ../ps/ps.map/catval.c:199 ../vector/v.sample/main.c:185
+#: ../vector/v.univar/main.c:331 ../vector/v.surf.idw/read_sites.c:52
+#: ../vector/v.class/main.c:126 ../vector/v.buffer/main.c:397
+#: ../vector/v.to.rast3/main.c:96 ../vector/v.normal/main.c:154
+#: ../vector/lidar/v.surf.bspline/main.c:348
+msgid "Unable to select data from table"
+msgstr ""
+
+#: ../ps/ps.map/catval.c:129
+msgid "Size column type must be numeric"
+msgstr ""
+
+#: ../ps/ps.map/catval.c:196
+msgid "Rotation column type must be numeric"
+msgstr ""
+
+#: ../ps/ps.map/main.c:100
+msgid "postscript, map, printing"
+msgstr ""
+
+#: ../ps/ps.map/main.c:101
+msgid "Produces hardcopy PostScript map output."
+msgstr ""
+
+#: ../ps/ps.map/main.c:105
+msgid "Rotate plot 90 degrees"
+msgstr ""
+
+#: ../ps/ps.map/main.c:106 ../ps/ps.map/main.c:118 ../ps/ps.map/main.c:148
+#: ../ps/ps.map/main.c:156
+msgid "Output settings"
+msgstr "Setările de ieșire"
+
+#: ../ps/ps.map/main.c:111
+msgid "List paper formats ( name width height left right top bottom(margin) )"
+msgstr ""
+
+#: ../ps/ps.map/main.c:112 ../ps/ps.map/main.c:124
+msgid "Utility"
+msgstr ""
+
+#: ../ps/ps.map/main.c:117
+msgid "Create EPS (Encapsulated PostScript) instead of PostScript file"
+msgstr ""
+
+#: ../ps/ps.map/main.c:123
+msgid "Describe map-box's position on the page and exit (inches from top-left of paper)"
+msgstr ""
+
+#: ../ps/ps.map/main.c:129
+msgid "File containing mapping instructions"
+msgstr ""
+
+#: ../ps/ps.map/main.c:130
+msgid "Use '-' to enter instructions from keyboard"
+msgstr ""
+
+#: ../ps/ps.map/main.c:138
+msgid "PostScript output file"
+msgstr ""
+
+#: ../ps/ps.map/main.c:147
+msgid "Scale of the output map, e.g. 1:25000 (default: Auto-sized to fit page)"
+msgstr ""
+
+#: ../ps/ps.map/main.c:154
+msgid "Number of copies to print"
+msgstr ""
+
+#: ../ps/ps.map/main.c:247
+#, c-format
+msgid "Using <%s> from the command line is depreciated. Please use the <%s> mapping instruction instead. The parameter <%s> will be removed in future versions of GRASS."
+msgstr ""
+
+#: ../ps/ps.map/main.c:255 ../ps/ps.map/main.c:559
+msgid "illegal scale request"
+msgstr ""
+
+#: ../ps/ps.map/main.c:261
+msgid "illegal copies request"
+msgstr ""
+
+#: ../ps/ps.map/main.c:273
+#, c-format
+msgid ""
+"ERROR: Required parameter <%s> not set:\n"
+"\t(%s)\n"
+msgstr ""
+
+#: ../ps/ps.map/main.c:288
+msgid "Current region cannot be set."
+msgstr ""
+
+#: ../ps/ps.map/main.c:297
+msgid "Data exists after final 'end' instruction!"
+msgstr ""
+
+#: ../ps/ps.map/main.c:330
+msgid "GRASS environment variable GRASS_VERBOSE is overwritten by VERBOSE mapping instruction. This mapping instruction is superseded and will be removed in future versions of GRASS. Please use --verbose instead."
+msgstr ""
+
+#: ../ps/ps.map/main.c:337
+msgid "Cannot set GRASS_VERBOSE variable."
+msgstr ""
+
+#: ../ps/ps.map/main.c:394
+msgid "no raster map selected yet"
+msgstr ""
+
+#: ../ps/ps.map/main.c:410
+msgid "illegal value list"
+msgstr ""
+
+#: ../ps/ps.map/main.c:738
+#, c-format
+msgid "PostScript file '%s' successfully written."
+msgstr ""
+
+#: ../ps/ps.map/do_plt.c:41
+msgid "Reading point/line file ..."
+msgstr ""
+
+#: ../ps/ps.map/do_plt.c:147 ../ps/ps.map/ps_vpoints.c:87
+msgid "Cannot read symbol, using default icon"
+msgstr ""
+
+#: ../ps/ps.map/ps_clrtbl.c:35 ../ps/ps.map/ps_fclrtbl.c:46
+#, c-format
+msgid "Creating color table for <%s in %s>..."
+msgstr ""
+
+#: ../ps/ps.map/ps_clrtbl.c:44 ../ps/ps.map/ps_fclrtbl.c:69
+msgid "Unable to read colors for colorbar"
+msgstr ""
+
+#: ../ps/ps.map/ps_clrtbl.c:54
+msgid "Your cats/ file is invalid. A cats/ file with categories and labels is required for 'colortable' when using categorical legends; see the r.category help page. Colortable creation has been skipped."
+msgstr ""
+
+#: ../ps/ps.map/ps_clrtbl.c:69 ../ps/ps.map/ps_fclrtbl.c:92
+#: ../ps/ps.map/ps_fclrtbl.c:97
+msgid "Colorbar y location beyond page margins. Adjusting."
+msgstr ""
+
+#: ../ps/ps.map/ps_clrtbl.c:75 ../ps/ps.map/ps_fclrtbl.c:103
+#: ../ps/ps.map/ps_fclrtbl.c:108
+msgid "Colorbar x location beyond page margins. Adjusting."
+msgstr ""
+
+#: ../ps/ps.map/r_vpoints.c:244
+#, c-format
+msgid "The mapping instruction <%s> will be renamed to <%s> in future versions of GRASS. Please use <%s> instead."
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:77
+msgid "illegal height request"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:94
+msgid "illegal range request"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:110
+msgid "illegal columns request"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:129
+msgid "Unsupported color request (colortable)"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:131
+msgid "illegal color request (colortable)"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:158
+msgid "illegal colortable sub-request"
+msgstr ""
+
+#: ../ps/ps.map/r_colortable.c:169
+msgid "No raster selected for colortable!"
+msgstr ""
+
+#: ../ps/ps.map/ps_vpoints.c:181
+#, c-format
+msgid "Attribute is of invalid size [%.3f] for category [%d]"
+msgstr ""
+
+#: ../ps/ps.map/getgrid.c:95 ../ps/ps.map/getgrid.c:206
+msgid "illegal numbers request"
+msgstr ""
+
+#: ../ps/ps.map/getgrid.c:126 ../ps/ps.map/getgrid.c:234
+msgid "illegal grid width request"
+msgstr ""
+
+#: ../ps/ps.map/getgrid.c:132
+msgid "illegal request (grid)"
+msgstr ""
+
+#: ../ps/ps.map/getgrid.c:240
+msgid "illegal request (geogrid)"
+msgstr ""
+
+#: ../ps/ps.map/ps_raster.c:43
+msgid "Can't create temporary PostScript mask file."
+msgstr ""
+
+#: ../ps/ps.map/ps_raster.c:103
+#, c-format
+msgid "Reading raster map <%s in %s> ..."
+msgstr ""
+
+#: ../ps/ps.map/ps_raster.c:106
+#, c-format
+msgid "Reading raster maps in group <%s> ..."
+msgstr ""
+
+#: ../ps/ps.map/r_group.c:31
+msgid "Can't get group information"
+msgstr ""
+
+#: ../ps/ps.map/r_plt.c:158
+msgid "Can't open eps file"
+msgstr ""
+
+#: ../ps/ps.map/do_vectors.c:34
+#, c-format
+msgid "Reading vector map <%s in %s> ..."
+msgstr ""
+
+#: ../ps/ps.map/do_vectors.c:139
+#, c-format
+msgid "Reading vector points file <%s in %s> ..."
+msgstr ""
+
+#: ../ps/ps.map/do_masking.c:23
+msgid "Can't open temporary PostScript mask file."
+msgstr ""
+
+#: ../ps/ps.map/ps_fclrtbl.c:51
+msgid "Range information not available (run r.support)"
+msgstr ""
+
+#: ../ps/ps.map/ps_fclrtbl.c:64
+msgid "A floating point colortable must contain a range of values"
+msgstr ""
+
+#: ../ps/ps.map/map_setup.c:88
+#, c-format
+msgid "Scale set to %s."
+msgstr ""
+
+#: ../ps/ps.map/read_cfg.c:64
+#, c-format
+msgid "Paper '%s' not found, using defaults"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/curses.c:22
+#: ../imagery/i.class/curses.c:22
+#, c-format
+msgid "make_window(%d,%d,%d,%d): illegal screen values."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/curses.c:148
+#: ../imagery/i.class/curses.c:153
+#, c-format
+msgid "%s"
+msgstr "%s"
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:53
+#: ../imagery/i.ortho.photo/menu/menu.c:43
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:62
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:86
+#: ../imagery/i.ortho.photo/i.photo.target/main.c:46
+#: ../imagery/i.ortho.photo/i.photo.init/main.c:44
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:55
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:54
+msgid "imagery, orthorectify"
+msgstr "imagini, ortorectificare"
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:54
+msgid "Creates control points on an image to be ortho-rectified."
+msgstr "Crează puncte de control pe o imagine pentru a fi ortorectificată."
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:62
+#: ../imagery/i.group/main.c:58
+msgid "Name of imagery group"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:66
+msgid "Name of image to be rectified which will be initially drawn on screen"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:72
+msgid "Name of a map from target mapset which will be initially drawn on screen"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:102
+#: ../imagery/i.ortho.photo/i.photo.init/main.c:64
+#, c-format
+msgid "Group [%s] not found"
+msgstr "Grupul [%s] nu a fost găsit"
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:114
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:98
+#, c-format
+msgid "No camera reference file selected for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:118
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:102
+#, c-format
+msgid "Bad format in camera file for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:125
+#, c-format
+msgid "No initial camera exposure station for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:129
+#, c-format
+msgid "Bad format in initial camera exposure station for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:143
+#, c-format
+msgid "No photo points for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:145
+#, c-format
+msgid "Poorly placed photo points for group [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:167
+msgid "Computing equations ..."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:202
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:233
+#, c-format
+msgid "Unable to read raster header of <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:302
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:195
+#: ../imagery/i.vpoints/main.c:254 ../imagery/i.points/main.c:248
+#, c-format
+msgid "ERROR: %s"
+msgstr "EROARE: %s"
+
+#: ../imagery/i.ortho.photo/i.photo.2target/main.c:304
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:197
+#: ../imagery/i.vpoints/main.c:256 ../imagery/i.points/main.c:250
+#, c-format
+msgid "WARNING: %s (click mouse to continue)"
+msgstr "ATENÈšIE: %s (click pe mouse pentru a continua)"
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:44
+#, c-format
+msgid "Could not read REF file for group [%s]"
+msgstr "Nu s-a putut citi fișierul REF pentru grupul [%s]"
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:45
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:50
+#, c-format
+msgid "Orthorectification cancelled"
+msgstr "Ortorectificare anulată"
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:49
+#, c-format
+msgid "No files in this group!"
+msgstr "Nici un fișier în acest grup!"
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:61
+msgid ""
+"\n"
+"Rectify all images in the group? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:71
+#, c-format
+msgid ""
+"\n"
+"Rectify image <%s>? "
+msgstr ""
+"\n"
+"Rectificați imaginea <%s>? "
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:84
+#, c-format
+msgid ""
+"\n"
+"No images selected, orthorectification cancelled."
+msgstr ""
+"\n"
+"Nici o imagine selectată, ortorectificare anulată."
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:99
+msgid "Enter an extension to be appended to rectified maps:"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:109
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:278
+#: ../imagery/i.rectify/main.c:266
+#, c-format
+msgid "Extension <%s> is illegal"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:110
+msgid ""
+"\n"
+"Choose another extension? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:112
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:144
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:285
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:294
+#: ../imagery/i.rectify/main.c:273
+#, c-format
+msgid "Orthorectification cancelled."
+msgstr "Ortorectificare anulată."
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:122
+msgid ""
+"\n"
+"Compute local camera angle? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:132
+msgid "Enter a name for the camera angle map:"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:141
+#, c-format
+msgid "Map name <%s> is illegal"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:142
+msgid ""
+"\n"
+"Choose another name? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:156
+msgid ""
+"\n"
+"Overwrite maps in target location/mapset? "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:224
+#, c-format
+msgid "Please select one of the following interpolation methods\n"
+msgstr "Selectați una din următoarele metode de interpolare\n"
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:225
+#, c-format
+msgid " 1. nearest neighbor\n"
+msgstr " 1. cel mai apropiat vecin\n"
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:226
+#, c-format
+msgid " 2. bilinear\n"
+msgstr " 2. bilinear\n"
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:227
+#, c-format
+msgid " 3. bicubic\n"
+msgstr " 3. bicubic\n"
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:228
+#, c-format
+msgid " 4. bilinear with fallback\n"
+msgstr " 4. bilinear cu rezervă\n"
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:229
+#, c-format
+msgid " 5. bicubic with fallback\n"
+msgstr " 5. bicubic cu rezervă\n"
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:291
+#, c-format
+msgid "Enter amount of memory to use in MB, or\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:293
+#, c-format
+msgid "RETURN   use %d MB to keep all data in RAM\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/i.photo.rectify.c:295
+#, c-format
+msgid "RETURN   use %d MB\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/menu.c:44
+msgid "Menu driver for the photo imagery programs."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/menu.c:48
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:68
+#: ../imagery/i.ortho.photo/i.photo.target/main.c:52
+#: ../imagery/i.ortho.photo/i.photo.init/main.c:52
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:61
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:60
+msgid "Name of imagery group for ortho-rectification"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/menu.c:62
+#, c-format
+msgid "Pre-selected group <%s> not found"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/menu.c:68
+msgid "Enter imagery group for ortho-rectification"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/menu/menu.c:74
+#, c-format
+msgid "Group [%s] contains no files"
+msgstr "Grupul [%s] nu conține nici un fișier"
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:64
+msgid "Interactively select or modify the target elevation model."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:91
+#, c-format
+msgid "Target information for group [%s] missing\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:98
+#, c-format
+msgid "Target location [%s] not found\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:127
+#, c-format
+msgid "Mapset [%s] in target location [%s] - "
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:128
+msgid "permission denied\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:128
+msgid "not found\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.elev/main.c:131
+msgid "Please select a target for group"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:13
+#, c-format
+msgid ""
+"Control Z Point file for group [%s] in [%s] \n"
+" \n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:16
+msgid "Computing equations..."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:22
+msgid "Poorly placed Control Points!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:23
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:28
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:52
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:58
+msgid "Can not generate the transformation equation.\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:24
+msgid "Run OPTION 7 of i.ortho.photo again!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:27
+msgid "No active Control Points!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:29
+msgid "Run OPTION 7 of i.ortho.photo!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:45
+#, c-format
+msgid ""
+"Reference Point file for group [%s] in [%s] \n"
+" \n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:51
+msgid "Poorly placed Reference Points!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:53
+msgid "Run OPTION 5 of i.ortho.photo again!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:57
+msgid "No active Reference Points!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/cp.c:59
+msgid "Run OPTION 5 of i.ortho.photo!\n"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/report.c:10
+#: ../imagery/i.rectify/report.c:10
+msgid "complete"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/report.c:20
+#: ../imagery/i.rectify/report.c:20
+#, c-format
+msgid "%d rows, %d cols (%ld cells) completed in"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/report.c:23
+#: ../imagery/i.rectify/report.c:23
+#, c-format
+msgid "%d:%02d:%02ld hours"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/report.c:25
+#: ../imagery/i.rectify/report.c:25
+#, c-format
+msgid "%d:%02ld minutes"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/report.c:27
+#: ../imagery/i.rectify/report.c:27
+#, c-format
+msgid "%.1f cells per minute"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/rectify.c:46
+#: ../imagery/i.rectify/rectify.c:43
+#, c-format
+msgid "Rectify <%s@%s> (location <%s>)"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/rectify.c:50
+#: ../imagery/i.rectify/rectify.c:47
+#, c-format
+msgid "into  <%s@%s> (location <%s>) ..."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/rectify.c:84
+#, c-format
+msgid "No elevation available at row = %d, col = %d"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/rectify.c:131
+#: ../imagery/i.rectify/rectify.c:109
+#, c-format
+msgid "Raster map <%s@%s>: projection don't match current settings"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/rectify.c:137
+#: ../imagery/i.rectify/rectify.c:115
+#, c-format
+msgid "Raster map <%s@%s>: zone don't match current settings"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:88
+msgid "Orthorectifies an image by using the image to photo coordinate transformation matrix."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:100
+#: ../imagery/i.rectify/main.c:106
+msgid "Output raster map(s) suffix"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:106
+#: ../imagery/i.rectify/main.c:118
+msgid "Target resolution (ignored if -c flag used)"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:114
+#: ../imagery/i.rectify/main.c:126
+msgid "Amount of memory to use in MB"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:129
+msgid "Raster map with camera angle relative to ground surface"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:134
+#: ../imagery/i.rectify/main.c:141
+msgid "Use current region settings in target location (def.=calculate smallest area)"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:138
+#: ../imagery/i.rectify/main.c:145
+msgid "Rectify all raster maps in group"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:177
+#, c-format
+msgid "Group <%s> not found"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:181
+#, c-format
+msgid "Could not read REF file for group <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:184
+#: ../imagery/i.rectify/main.c:191
+#, c-format
+msgid "Group <%s> contains no raster maps; run i.group"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:238
+#, c-format
+msgid "No camera reference file selected for group <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:242
+#, c-format
+msgid "Bad format in camera file for group <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:248
+#, c-format
+msgid "Bad format in initial exposure station file for group <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:281
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:290
+#: ../imagery/i.rectify/main.c:269
+msgid "The following raster map already exists in"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:282
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:291
+#: ../imagery/i.rectify/main.c:270
+#, c-format
+msgid "target LOCATION %s, MAPSET %s:"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:309
+#: ../imagery/i.rectify/main.c:288
+msgid "Target resolution must be > 0, ignored"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:316
+#: ../imagery/i.rectify/main.c:306
+#, c-format
+msgid "Using region: N=%f S=%f, E=%f W=%f"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:324
+#, c-format
+msgid "No target elevation model selected for group <%s>"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:383
+#: ../imagery/i.rectify/main.c:321
+#, c-format
+msgid "Input raster map <%s> does not exist in group <%s>."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:385
+#: ../imagery/i.rectify/main.c:323
+msgid "Try:"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/main.c:390
+#: ../imagery/i.rectify/main.c:328
+msgid "Exit!"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/target.c:13
+#: ../imagery/i.rectify/target.c:14
+#, c-format
+msgid "Target information for group <%s> missing"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/target.c:19
+#: ../imagery/i.rectify/target.c:20
+#, c-format
+msgid "Target location <%s> not found"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/angle.c:36
+msgid "Calculating camera angle to local surface..."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/angle.c:51
+#: ../imagery/i.ortho.photo/i.photo.rectify/exec.c:43
+msgid "Could not open elevation raster"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.rectify/readcell.c:140
+msgid "Error reading segment file"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.target/main.c:48
+msgid "Interactively select or modify the imagery group target."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.target/main.c:66
+#, c-format
+msgid "Group [%s] targeted for location [%s], mapset [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.init/main.c:46
+msgid "Interactively creates or modifies entries in a camera initial exposure station file for imagery group referenced by a sub-block."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:57
+msgid "Interactively select and modify the imagery group camera reference file."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:68
+msgid "Name of camera reference file to use"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:84
+msgid "Enter a camera reference file to be used with this imagery group"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.camera/main.c:101
+#, c-format
+msgid "Group [%s] in location [%s] mapset [%s] now has camera file [%s]"
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:56
+msgid "Interactively mark fiducial or reseau points on an image."
+msgstr ""
+
+#: ../imagery/i.ortho.photo/i.photo.2image/main.c:86
+#, c-format
+msgid "Image Group [%s] not found"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:74
+#, c-format
+msgid "Input raster map <%s> is not floating point (process DN using i.landsat.toar to radiance first)"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:106
+msgid "Performs Landsat TM/ETM+ Automatic Cloud Cover Assessment (ACCA)."
+msgstr "Evaluează automat acoperirea cu nori a imaginilor Landsat TM/ETM+ (ACCA)."
+
+#: ../imagery/i.landsat.acca/main.c:107
+msgid "imagery, landsat, acca"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:111 ../imagery/i.landsat.toar/main.c:71
+msgid "Base name of input raster bands"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:112 ../imagery/i.landsat.toar/main.c:72
+msgid "Example: 'B.' for B.1, B.2, ..."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:122
+msgid "B56composite (step 6)"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:129
+msgid "B45ratio: Desert detection (step 10)"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:137
+msgid "Number of classes in the cloud temperature histogram"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:139 ../imagery/i.landsat.acca/main.c:154
+#: ../imagery/i.landsat.acca/main.c:160 ../imagery/i.landsat.acca/main.c:165
+msgid "Cloud settings"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:143
+msgid "Data is Landsat-5 TM"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:144
+msgid "I.e. Thermal band is '.6' not '.61')"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:149
+msgid "Apply post-processing filter to remove small holes"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:153
+msgid "Always use cloud signature (step 14)"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:159
+msgid "Bypass second-pass processing, and merge warm (not ambiguous) and cold clouds"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/main.c:164
+msgid "Include a category for cloud shadows"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/tools.c:142
+msgid "Filling small holes in clouds..."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:124
+msgid "Preliminary scene analysis:"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:125
+#, c-format
+msgid "* Desert index: %.2lf"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:126
+#, c-format
+msgid "* Snow cover: %.2lf %%"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:127
+#, c-format
+msgid "* Cloud cover: %.2lf %%"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:128
+msgid "* Temperature of clouds:"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:129
+#, c-format
+msgid "** Maximum: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:130
+#, c-format
+msgid "** Mean (%s cloud): %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:132
+#, c-format
+msgid "** Minimum: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:142
+msgid "Histogram cloud signature:"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:148
+#, c-format
+msgid "* Mean temperature: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:149
+#, c-format
+msgid "* Standard deviation: %.2lf"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:150
+#, c-format
+msgid "* Skewness: %.2lf"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:151
+#, c-format
+msgid "* Histogram classes: %d"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:163
+#, c-format
+msgid "* 98.75 percentile: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:164
+#, c-format
+msgid "* 97.50 percentile: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:165
+#, c-format
+msgid "* 83.50 percentile: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:186
+msgid "Maximum temperature:"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:187
+#, c-format
+msgid "* Cold cloud: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:188
+#, c-format
+msgid "* Warm cloud: %.2lf K"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:193
+msgid "Result: Scene with clouds"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:200
+msgid "Result: Scene cloud free"
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:238
+msgid "Processing first pass..."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:400
+msgid "Removing ambiguous pixels..."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:402
+msgid "Pass two processing..."
+msgstr ""
+
+#: ../imagery/i.landsat.acca/algorithm.c:448
+#, c-format
+msgid "Cannot write to raster map <%s>"
+msgstr ""
+
+#: ../imagery/i.vpoints/main.c:94 ../imagery/i.points/main.c:96
+msgid "imagery, geometry"
+msgstr ""
+
+#: ../imagery/i.vpoints/main.c:96
+msgid "Set registration points for an imagery group from a vector map or keyboard entry."
+msgstr ""
+
+#: ../imagery/i.vpoints/main.c:104 ../imagery/i.points/main.c:105
+msgid "Name of imagery group to be registered"
+msgstr ""
+
+#: ../imagery/i.vpoints/main.c:127 ../imagery/i.points/main.c:130
+#, c-format
+msgid "[%s] Only local groups may be used"
+msgstr ""
+
+#: ../imagery/i.vpoints/main.c:136 ../imagery/i.vpoints/main.c:140
+#: ../imagery/i.points/main.c:139 ../imagery/i.points/main.c:143
+#, c-format
+msgid "Group [%s] contains no maps, run i.group"
+msgstr ""
+
+#: ../imagery/i.cluster/print4.c:16
+#, c-format
+msgid "class centroids (sum/count=mean)\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print4.c:18
+#, c-format
+msgid "band %d"
+msgstr ""
+
+#: ../imagery/i.cluster/print3.c:16
+#, c-format
+msgid ""
+"\n"
+"initial means for each band\n"
+"\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print3.c:19
+#, c-format
+msgid "class %-3d "
+msgstr ""
+
+#: ../imagery/i.cluster/print2.c:18
+#, c-format
+msgid ""
+"\n"
+"class means/stddev for each band\n"
+"\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print2.c:22
+#, c-format
+msgid "class %d (%d)\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print2.c:23
+#, c-format
+msgid "  means "
+msgstr ""
+
+#: ../imagery/i.cluster/print2.c:28
+#, c-format
+msgid "  stddev"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:80
+msgid "imagery, classification, signatures"
+msgstr "imagini, clasificare, signaturi"
+
+#: ../imagery/i.cluster/main.c:82
+msgid "Generates spectral signatures for land cover types in an image using a clustering algorithm."
+msgstr "Generează signaturi spectrale pentru tipurile de acoperire a terenului intr-o imagine folosind un algoritm de grupare."
+
+#: ../imagery/i.cluster/main.c:85
+msgid "The resulting signature file is used as input for i.maxlik, to generate an unsupervised image classification."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:97 ../imagery/i.gensigset/parse.c:21
+#: ../imagery/i.gensig/parse.c:22
+msgid "Name for output file containing result signatures"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:104
+msgid "Initial number of classes"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:112
+msgid "Name of file containing initial signatures"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:120
+msgid "Sampling intervals (by row and col); default: ~10,000 pixels"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:127
+msgid "Maximum number of iterations"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:136
+msgid "Percent convergence"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:144
+msgid "Cluster separation"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:152
+msgid "Minimum number of pixels in a class"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:159
+msgid "Name for output file containing final report"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:182
+#, c-format
+msgid "Illegal number of initial classes (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:193
+#, c-format
+msgid "Illegal value(s) of sample intervals (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:207
+#, c-format
+msgid "Illegal value of iterations (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:213
+#, c-format
+msgid "Illegal value of convergence (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:218
+#, c-format
+msgid "Illegal value of separation (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:223
+#, c-format
+msgid "Illegal value of min_size (%s)"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:234
+#, c-format
+msgid "Unable to create report file <%s>"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:242
+#, c-format
+msgid ""
+"#################### CLUSTER (%s) ####################\n"
+"\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:244
+#, c-format
+msgid "Location: %s\n"
+msgstr "Locație: %s\n"
+
+#: ../imagery/i.cluster/main.c:245
+#, c-format
+msgid "Mapset:   %s\n"
+msgstr "Mapset:   %s\n"
+
+#: ../imagery/i.cluster/main.c:246
+#, c-format
+msgid "Group:    %s\n"
+msgstr "Grup:    %s\n"
+
+#: ../imagery/i.cluster/main.c:247
+#, c-format
+msgid "Subgroup: %s\n"
+msgstr "Subgrup: %s\n"
+
+#: ../imagery/i.cluster/main.c:249
+#, c-format
+msgid " %s\n"
+msgstr " %s\n"
+
+#: ../imagery/i.cluster/main.c:252
+#, c-format
+msgid "Result signature file: %s\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:254
+#, c-format
+msgid "Region\n"
+msgstr "Regiune\n"
+
+#: ../imagery/i.cluster/main.c:255
+#, c-format
+msgid "  North: %12.2f  East: %12.2f\n"
+msgstr "  Nord: %12.2f  Est: %12.2f\n"
+
+#: ../imagery/i.cluster/main.c:257
+#, c-format
+msgid "  South: %12.2f  West: %12.2f\n"
+msgstr "  Sud: %12.2f  Vest: %12.2f\n"
+
+#: ../imagery/i.cluster/main.c:259
+#, c-format
+msgid "  Res:   %12.2f  Res:  %12.2f\n"
+msgstr "  Rez:   %12.2f  Rez:  %12.2f\n"
+
+#: ../imagery/i.cluster/main.c:261
+#, c-format
+msgid "  Rows:  %12d  Cols: %12d  Cells: %d\n"
+msgstr "  Rânduri:  %12d  Coloane: %12d  Celule: %d\n"
+
+#: ../imagery/i.cluster/main.c:263
+#, c-format
+msgid "Mask: %s\n"
+msgstr "Mască: %s\n"
+
+#: ../imagery/i.cluster/main.c:265
+#, c-format
+msgid "Cluster parameters\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:266
+#, c-format
+msgid " Number of initial classes:    %d"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:268
+#, c-format
+msgid " [from signature file %s]"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:270
+#, c-format
+msgid " Minimum class size:           %d\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:271
+#, c-format
+msgid " Minimum class separation:     %f\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:272
+#, c-format
+msgid " Percent convergence:          %f\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:273
+#, c-format
+msgid " Maximum number of iterations: %d\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:275
+#, c-format
+msgid " Row sampling interval:        %d\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:276
+#, c-format
+msgid " Col sampling interval:        %d\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:285 ../imagery/i.gensigset/read_data.c:19
+#: ../imagery/i.ifft/ifftmain.c:144
+msgid "Reading raster maps..."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:297
+msgid "Out of Memory. Please run again and choose a smaller sample size."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:303
+#, c-format
+msgid "Sample size: %d points\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:306
+msgid "Not enough sample points. Please run again and choose a larger sample size."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:310
+msgid "Not enough non-zero sample data points. Check your current region (and mask)."
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:323
+#, c-format
+msgid ""
+"\n"
+"########## final results #############\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:324
+#, c-format
+msgid "%d classes (convergence=%.1f%%)\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:335
+#, c-format
+msgid "Unable to create signature file <%s> for group <%s>, subsgroup <%s>"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:340
+#, c-format
+msgid ""
+"\n"
+"\n"
+"#################### CLASSES ####################\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:341
+#, c-format
+msgid ""
+"\n"
+"%d classes, %.2f%% points stable\n"
+msgstr ""
+
+#: ../imagery/i.cluster/main.c:343
+#, c-format
+msgid ""
+"\n"
+"######## CLUSTER END (%s) ########\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print5.c:15
+#, c-format
+msgid ""
+"\n"
+"class separability matrix\n"
+"\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print1.c:12
+#, c-format
+msgid ""
+"means and standard deviations for %d band%s\n"
+"\n"
+msgstr ""
+
+#: ../imagery/i.cluster/print1.c:14
+#, c-format
+msgid " means  "
+msgstr ""
+
+#: ../imagery/i.cluster/print1.c:18
+#, c-format
+msgid " stddev "
+msgstr ""
+
+#: ../imagery/i.cluster/print6.c:11
+#, c-format
+msgid "class distribution"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:17 ../imagery/i.maxlik/open.c:16
+#: ../imagery/i.smap/shapiro/parse.c:58 ../imagery/i.gensigset/parse.c:45
+#: ../imagery/i.gensig/parse.c:39
+#, c-format
+msgid "Group <%s> not found in current mapset"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:21 ../imagery/i.maxlik/open.c:19
+#: ../imagery/i.smap/shapiro/parse.c:61 ../imagery/i.gensigset/parse.c:48
+#: ../imagery/i.gensig/parse.c:42
+#, c-format
+msgid "Subgroup <%s> in group <%s> not found"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:33
+#, c-format
+msgid "Raster map <%s> do not exists in subgroup <%s>"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:38
+msgid "No raster maps found"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:42
+#, c-format
+msgid "Subgroup <%s> doesn't have any raster maps"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:45
+#, c-format
+msgid "Subgroup <%s> only has 1 raster map"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:46
+msgid "Subgroup must have at least 2 raster maps"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:64
+#, c-format
+msgid "Unable to open seed signature file <%s>"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:70 ../imagery/i.maxlik/open.c:54
+#: ../imagery/i.smap/shapiro/read_sig.c:23
+#, c-format
+msgid "Unable to read signature file <%s>"
+msgstr ""
+
+#: ../imagery/i.cluster/open_files.c:74 ../imagery/i.maxlik/open.c:58
+#, c-format
+msgid "<%s> has too many signatures (limit is 255)"
+msgstr ""
+
+#: ../imagery/i.cluster/checkpt.c:16
+#, c-format
+msgid "using seed means (%d files)\n"
+msgstr ""
+
+#: ../imagery/i.cluster/checkpt.c:28
+#, c-format
+msgid ""
+"\n"
+"######## iteration %d ###########\n"
+msgstr ""
+
+#: ../imagery/i.cluster/checkpt.c:30
+#, c-format
+msgid "%d classes, %.2f%% points stable\n"
+msgstr ""
+
+#: ../imagery/i.cluster/checkpt.c:40
+#, c-format
+msgid "Iteration %.2d: convergence %.2f%% (%s elapsed, %s left)"
+msgstr ""
+
+#: ../imagery/i.class/analyze_sig.c:12
+msgid "Cannot analyze until region is completed."
+msgstr ""
+
+#: ../imagery/i.class/readbands.c:12
+msgid "Error reading raster map in function readbands."
+msgstr ""
+
+#: ../imagery/i.class/draw_reg.c:89
+#, c-format
+msgid ""
+"\n"
+"Orig:(x1 y1), (x2 y2) = (%d %d), (%d %d)"
+msgstr ""
+
+#: ../imagery/i.class/draw_reg.c:97
+#, c-format
+msgid ""
+"\n"
+"New:(x1 y1), (x2 y2) = (%d %d), (%d %d)"
+msgstr ""
+
+#: ../imagery/i.class/save_reg.c:14
+msgid "Region is not complete, can not save."
+msgstr ""
+
+#: ../imagery/i.class/main.c:53
+msgid "imagery, classification"
+msgstr ""
+
+#: ../imagery/i.class/main.c:55
+msgid "Generates spectral signatures for an image by allowing the user to outline regions of interest."
+msgstr "Generează signaturi spectrale pentru o imagine, permițând utilizatorului să evidențieze regiunile de interes."
+
+#: ../imagery/i.class/main.c:58
+msgid "The resulting signature file can be used as input for i.maxlik or as a seed signature file for i.cluster."
+msgstr ""
+
+#: ../imagery/i.class/main.c:72 ../imagery/i.cca/main.c:93
+msgid "Name of input imagery subgroup"
+msgstr ""
+
+#: ../imagery/i.class/main.c:77
+msgid "File to contain result signatures"
+msgstr ""
+
+#: ../imagery/i.class/main.c:82
+msgid "File containing input signatures (seed)"
+msgstr ""
+
+#: ../imagery/i.class/main.c:94
+msgid "You have a mask set. Unset mask and run again"
+msgstr ""
+
+#: ../imagery/i.class/main.c:103 ../imagery/i.group/main.c:110
+#: ../imagery/i.target/main.c:79
+msgid "Group must exist in the current mapset"
+msgstr ""
+
+#: ../imagery/i.class/main.c:213
+#, c-format
+msgid "** The following raster maps in subgroup [%s] do not exist:"
+msgstr ""
+
+#: ../imagery/i.class/main.c:222
+#, c-format
+msgid "Subgroup [%s] does not have any files"
+msgstr ""
+
+#: ../imagery/i.class/main.c:223 ../imagery/i.class/main.c:227
+msgid "The subgroup must have at least 2 files to run"
+msgstr ""
+
+#: ../imagery/i.class/main.c:226
+#, c-format
+msgid "Subgroup [%s] only has 1 file"
+msgstr ""
+
+#: ../imagery/i.class/main.c:232
+msgid "Unable to read cell header for first band file"
+msgstr ""
+
+#: ../imagery/i.class/main.c:237
+msgid ""
+"\n"
+"RESULT SIGNATURE"
+msgstr ""
+
+#: ../imagery/i.class/main.c:242
+#, c-format
+msgid "Unable to open output signature file '%s'"
+msgstr ""
+
+#: ../imagery/i.class/main.c:249
+msgid ""
+"\n"
+"SEED SIGNATURES"
+msgstr ""
+
+#: ../imagery/i.class/main.c:254
+#, c-format
+msgid "Unable to read signature file [%s]"
+msgstr ""
+
+#: ../imagery/i.class/main.c:257
+#, c-format
+msgid "** Unable to read signature file [%s] **"
+msgstr ""
+
+#: ../imagery/i.class/main.c:264
+#, c-format
+msgid "%s has too many signatures"
+msgstr ""
+
+#: ../imagery/i.class/add_point.c:22
+#, c-format
+msgid "Can't mark another point.  Only %d points allowed.  Sorry."
+msgstr ""
+
+#: ../imagery/i.class/remove_mask.c:15
+msgid "Error while removing the old MASK cell map."
+msgstr ""
+
+#: ../imagery/i.class/band_files.c:22
+msgid "Unable to open band files."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:50 ../imagery/i.class/signature.c:55
+msgid "Unable to allocate space for signature statistics."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:82
+msgid "prepare_signature: outline has odd number of points."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:113
+#, c-format
+msgid "prepare_signature: scan line %d has odd number of points."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:123
+msgid "signature: perimeter points out of order."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:132
+msgid "prepare_signature: data error."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:234
+msgid "Unknown Menu selection in show_signature()."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:276
+msgid "Unable to open the cell map MASK."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:278
+msgid "Unable to allocate the cell buffer in display_signature()."
+msgstr ""
+
+#: ../imagery/i.class/signature.c:310
+msgid "Did not find input cell map MASK."
+msgstr ""
+
+#: ../imagery/i.class/complete_reg.c:12
+msgid "Too few points for region.  Must have at least 3 points."
+msgstr ""
+
+#: ../imagery/i.class/complete_reg.c:14
+msgid "Area already completed."
+msgstr ""
+
+#: ../imagery/i.class/erase_reg.c:10
+msgid "Can not erase an undefined region."
+msgstr ""
+
+#: ../imagery/i.class/outline.c:57
+msgid "Absurd polygon."
+msgstr ""
+
+#: ../imagery/i.class/outline.c:99
+msgid "Outlined area is too large."
+msgstr ""
+
+#: ../imagery/i.class/restore_reg.c:15
+msgid "No region is saved, can not restore."
+msgstr ""
+
+#: ../imagery/i.class/redisplay.c:56
+msgid "No zoom window is defined."
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:90
+msgid "QC, Quality Control, surface reflectance, Modis"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:92
+msgid "Extracts quality control parameters from Modis QC layers."
+msgstr "Extrage parametrii de control de calitate din stratele QC Modis."
+
+#: ../imagery/i.modis.qc/main.c:98
+msgid "Name of input surface reflectance QC layer [bit array]"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:103
+msgid "Name for output QC type classification layer"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:109
+msgid "Name of MODIS product type"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:110
+msgid "mod09Q1;surf. refl. 250m 8-days;mod09A1;surf. refl. 500m 8-days;mod09A1s;surf. refl. 500m 8-days, State QA;mod11A1;LST 1Km daily (Day/Night);mod11A2;LST 1Km 8-days (Day/Night);"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:122
+msgid "Name of QC type to extract"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:123
+msgid "adjcorr;mod09: Adjacency Correction;atcorr;mod09: Atmospheric Correction;cloud;mod09: Cloud State;data_quality;mod09: Band-Wise Data Quality Flag;diff_orbit_from_500m;mod09: 250m Band is at Different Orbit than 500m;modland_qa_bits;mod09: MODIS Land General Quality Assessment;mandatory_qa_11A1;mod11A1: MODIS Land General Quality Assessment;data_quality_flag_11A1;mod11A1: Detailed Quality Indications;emis_error_11A1;mod11A1: Average Emissivity Error Classes;lst_error_11A1;mod11A1: Average LST Error Classes;data_quality_flag_11A2;mod11A2: Detailed Quality Indications;emis_error_11A2;mod11A2: Average Emissivity Error Classes;mandatory_qa_11A2;mod11A2: MODIS Land General Quality Assessment;lst_error_11A2;mod11A2: Average LST Error Classes;aerosol_quantity;mod09A1s: StateQA Internal Snow Mask;brdf_correction_performed;mod09A1s: StateQA Internal Snow Mask;cirrus_detected;mod09A1s: StateQA Internal Snow Mask;cloud_shadow;mod09A1s: StateQA Internal Snow Mask;cloud_state;mod09A1s: StateQA Internal Snow Mask;internal_clou_algorithm;mod09A1s: StateQA Internal Snow Mask;internal_fire_algorithm;mod09A1s: StateQA Internal Snow Mask;internal_snow_mask;mod09A1s: StateQA Internal Snow Mask;land_water;mod09A1s: StateQA Internal Snow Mask;mod35_snow_ice;mod09A1s: StateQA Internal Snow Mask;pixel_adjacent_to_cloud;mod09A1s: StateQA Internal Snow Mask;"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:157
+msgid "Band number of Modis product (mod09Q1=[1,2],mod09A1=[1-7])"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:158
+msgid "1;mod09Q1/A1 Band 1: Red;2;mod09Q1/A1 Band 2: NIR;3;mod09A1 Band 3: Blue;4;mod09A1 Band 4: Green;5;mod09A1 Band 5: SWIR 1;6;mod09A1 Band 6: SWIR 2;7;mod09A1 Band 7: SWIR 3;"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:181
+msgid "This flag is only available for MOD09Q1 @ 250m products"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:185
+msgid "Band number out of allowed range [1-7]"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:187
+msgid "mod09Q1 product only has 2 bands"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:194
+msgid "This flag is only available for MOD11A1 @ 1Km products"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:200
+msgid "This flag is only available for MOD11A2 @ 1Km products"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:213
+msgid "This flag is only available for MOD09A1s @ 500m products"
+msgstr ""
+
+#: ../imagery/i.modis.qc/main.c:354
+msgid "Unknown flag name, please check spelling"
+msgstr ""
+
+#: ../imagery/i.ask/popup.c:239
+#, c-format
+msgid "name=%s\n"
+msgstr ""
+
+#: ../imagery/i.ask/popup.c:240
+#, c-format
+msgid "mapset=%s\n"
+msgstr ""
+
+#: ../imagery/i.ask/popup.c:241
+#, c-format
+msgid "fullname=%s\n"
+msgstr ""
+
+#: ../imagery/i.ask/main.c:26
+#, c-format
+msgid "usage: %s file [prompt %%x %%y]\n"
+msgstr ""
+
+#: ../imagery/i.maxlik/invert.c:28
+#, c-format
+msgid "Signature %d is not valid (ill-conditioned) - ignored"
+msgstr ""
+
+#: ../imagery/i.maxlik/invert.c:31
+#, c-format
+msgid "Signature %d is not valid (singular) - ignored"
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:63
+msgid "imagery, classification, MLC"
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:65
+msgid "Classifies the cell spectral reflectances in imagery data."
+msgstr "Clasifică celule de reflectanță spectrală dintr-o imagine."
+
+#: ../imagery/i.maxlik/main.c:67
+msgid "Classification is based on the spectral signature information generated by either i.cluster, i.class, or i.gensig."
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:79 ../imagery/i.smap/shapiro/parse.c:21
+msgid "Name of file containing signatures"
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:80
+msgid "Generated by either i.cluster, i.class, or i.gensig"
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:85
+msgid "Name for raster map holding classification results"
+msgstr ""
+
+#: ../imagery/i.maxlik/main.c:91
+msgid "Name for raster map holding reject threshold results"
+msgstr ""
+
+#: ../imagery/i.maxlik/open.c:26
+#, c-format
+msgid "Subgroup <%s> of group <%s> doesn't have any raster maps. The subgroup must have at least 2 raster maps."
+msgstr ""
+
+#: ../imagery/i.maxlik/open.c:29
+#, c-format
+msgid "Subgroup <%s> of group <%s> only has 1 raster map. The subgroup must have at least 2 raster maps."
+msgstr ""
+
+#: ../imagery/i.maxlik/open.c:48
+#, c-format
+msgid "Unable to open signature file <%s>"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:45 ../imagery/i.rgb.his/r2hmain.c:45
+msgid "imagery, color transformation, RGB, HIS"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:47
+msgid "Transforms raster maps from HIS (Hue-Intensity-Saturation) color space to RGB (Red-Green-Blue) color space."
+msgstr "Transformă harta raster din sistemul HIS (Valoare-Intensitate-Saturație) în sistemul de culori RGB (Roșu-Verde-Albastru)."
+
+#: ../imagery/i.his.rgb/h2rmain.c:53
+msgid "Name of input raster map (hue)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:57
+msgid "Name of input raster map (intensity)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:61
+msgid "Name of input raster map (saturation)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:65
+msgid "Name for output raster map (red)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:69
+msgid "Name for output raster map (green)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:73
+msgid "Name for output raster map (blue)"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:95 ../imagery/i.rgb.his/r2hmain.c:93
+#, c-format
+msgid "Unable to read raster map row %ld"
+msgstr ""
+
+#: ../imagery/i.his.rgb/h2rmain.c:104 ../imagery/i.rgb.his/r2hmain.c:102
+#, c-format
+msgid "Failed writing raster map row %ld"
+msgstr ""
+
+#: ../imagery/i.his.rgb/openfiles.c:23 ../imagery/i.his.rgb/openfiles.c:25
+#: ../imagery/i.his.rgb/openfiles.c:27 ../imagery/i.rgb.his/openfiles.c:37
+#: ../imagery/i.rgb.his/openfiles.c:39 ../imagery/i.rgb.his/openfiles.c:41
+msgid "Unable to allocate the input row buffer"
+msgstr ""
+
+#: ../imagery/i.smap/bouman/interp.c:38
+msgid "pyramid constructed."
+msgstr ""
+
+#: ../imagery/i.smap/bouman/interp.c:237
+msgid "Invalid parameter values"
+msgstr ""
+
+#: ../imagery/i.smap/bouman/segment.c:70
+msgid "Number of classes must be < 256"
+msgstr ""
+
+#: ../imagery/i.smap/bouman/segment.c:95
+#, c-format
+msgid "Processing rows %d-%d (of %d)..."
+msgstr ""
+
+#: ../imagery/i.smap/bouman/model.c:39
+#, c-format
+msgid "Nonsymetric covariance for class %d subclass %d"
+msgstr ""
+
+#: ../imagery/i.smap/bouman/model.c:49
+#, c-format
+msgid "Nonpositive eigenvalues for class %d subclass %d"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/main.c:38 ../imagery/i.gensigset/main.c:40
+msgid "imagery, classification, supervised, SMAP"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/main.c:40
+msgid "Performs contextual image classification using sequential maximum a posteriori (SMAP) estimation."
+msgstr "Efectuează o clasificare contextuală a imagii folosind estimarea maximă secvențială posterioară (SMAP)."
+
+#: ../imagery/i.smap/shapiro/openfiles.c:15
+#: ../imagery/i.smap/shapiro/read_sig.c:13
+#: ../imagery/i.gensigset/openfiles.c:15 ../imagery/i.gensig/openfiles.c:16
+#, c-format
+msgid "Unable to read REF file for subgroup <%s> in group <%s>"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/openfiles.c:19
+#: ../imagery/i.smap/shapiro/read_sig.c:17
+#, c-format
+msgid "Subgroup <%s> in group <%s> contains no raster maps"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/parse.c:22
+msgid "Generated by i.gensigset"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/parse.c:31
+msgid "Size of submatrix to process at one time"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/parse.c:39
+msgid "Use maximum likelihood estimation (instead of smap)"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/read_sig.c:27
+#, c-format
+msgid "Signature file <%s> is invalid"
+msgstr ""
+
+#: ../imagery/i.smap/shapiro/read_sig.c:30
+#, c-format
+msgid "Signature file <%s> is empty"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:75
+#, c-format
+msgid "Not enough pixels in class %d"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:85
+#, c-format
+msgid "Too many subclasses for class index %d"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:87
+#, c-format
+msgid "Number of subclasses set to %d"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:102
+#, c-format
+msgid "Combining subclasses (%d,%d)..."
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:312
+#, c-format
+msgid "Subsignature %d only contains %f pixels"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:547
+msgid "Unreliable clustering. Try a smaller initial number of clusters"
+msgstr ""
+
+#: ../imagery/i.gensigset/subcluster.c:556
+#, c-format
+msgid "Removed a singular subsignature number %d (%d remain)"
+msgstr ""
+
+#: ../imagery/i.gensigset/get_train.c:32 ../imagery/i.gensig/get_train.c:28
+msgid "Finding training classes..."
+msgstr ""
+
+#: ../imagery/i.gensigset/get_train.c:57 ../imagery/i.gensig/get_train.c:53
+#, c-format
+msgid "Training class %d only has one cell - this class will be ignored"
+msgstr ""
+
+#: ../imagery/i.gensigset/get_train.c:62 ../imagery/i.gensig/get_train.c:58
+msgid "Training map has no classes"
+msgstr ""
+
+#: ../imagery/i.gensigset/get_train.c:78 ../imagery/i.gensig/get_train.c:73
+msgid "1 class found"
+msgstr ""
+
+#: ../imagery/i.gensigset/get_train.c:80 ../imagery/i.gensig/get_train.c:75
+#, c-format
+msgid "%d classes found"
+msgstr ""
+
+#: ../imagery/i.gensigset/main.c:42
+msgid "Generates statistics for i.smap from raster map."
+msgstr "Generează statistici pentru i.smap dintr-o hartă raster."
+
+#: ../imagery/i.gensigset/main.c:52
+#, c-format
+msgid "Clustering class %d (%d pixels)..."
+msgstr ""
+
+#: ../imagery/i.gensigset/main.c:55
+#, c-format
+msgid "Number of subclasses is %d"
+msgstr ""
+
+#: ../imagery/i.gensigset/openfiles.c:19 ../imagery/i.gensig/openfiles.c:20
+#, c-format
+msgid "Subgroup <%s> in group <%s> contains no raster maps."
+msgstr ""
+
+#: ../imagery/i.gensigset/write_sig.c:13 ../imagery/i.gensig/write_sig.c:15
+#, c-format
+msgid "Unable to create signature file <%s>"
+msgstr ""
+
+#: ../imagery/i.gensigset/write_sig.c:16 ../imagery/i.gensig/write_sig.c:18
+msgid "Writing signatures..."
+msgstr ""
+
+#: ../imagery/i.gensigset/parse.c:13 ../imagery/i.gensig/parse.c:14
+msgid "Ground truth training map"
+msgstr ""
+
+#: ../imagery/i.gensigset/parse.c:27
+msgid "Maximum number of sub-signatures in any class"
+msgstr ""
+
+#: ../imagery/i.gensigset/parse.c:52
+#, c-format
+msgid "Illegal number of sub-signatures (%s)"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:57
+msgid "imagery, edges"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:59
+msgid "Zero-crossing \"edge detection\" raster function for image processing."
+msgstr "Funcția raster \"detectarea marginilor\" fără trecere pentru procesarea imaginii."
+
+#: ../imagery/i.zc/main.c:78
+msgid "Zero crossing raster map"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:86
+msgid "x-y extent of the Gaussian filter"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:94
+msgid "Sensitivity of Gaussian filter"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:102
+msgid "Number of azimuth directions categorized"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:123
+msgid "Threshold less than or equal to zero not allowed"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:129
+msgid "Width less than or equal to zero not allowed"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:133
+msgid "Fewer than 1 orientation classes not allowed"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:147
+#, c-format
+msgid "Power 2 values : %d rows %d columns"
+msgstr ""
+
+#: ../imagery/i.zc/main.c:157
+msgid "Initializing data..."
+msgstr ""
+
+#: ../imagery/i.zc/main.c:170 ../imagery/i.fft/fftmain.c:170
+msgid "Error while reading input raster map."
+msgstr ""
+
+#: ../imagery/i.zc/main.c:188
+msgid "Writing transformed data to file..."
+msgstr ""
+
+#: ../imagery/i.zc/main.c:209
+msgid "Transform successful"
+msgstr ""
+
+#: ../imagery/i.points/main.c:98
+msgid "Mark ground control points on image to be rectified."
+msgstr ""
+
+#: ../imagery/i.group/main.c:52 ../imagery/i.target/main.c:45
+msgid "imagery, map management"
+msgstr ""
+
+#: ../imagery/i.group/main.c:54
+msgid "Creates, edits, and lists groups and subgroups of imagery files."
+msgstr ""
+
+#: ../imagery/i.group/main.c:64
+msgid "Name of imagery sub-group"
+msgstr ""
+
+#: ../imagery/i.group/main.c:68
+msgid "Name of raster map(s) to include in group"
+msgstr ""
+
+#: ../imagery/i.group/main.c:72
+msgid "Remove selected files from specified group"
+msgstr ""
+
+#: ../imagery/i.group/main.c:76
+msgid "List files from specified (sub)group (fancy)"
+msgstr ""
+
+#: ../imagery/i.group/main.c:82
+msgid "List files from specified (sub)group (shell script style)"
+msgstr ""
+
+#: ../imagery/i.group/main.c:120 ../imagery/i.group/main.c:141
+msgid "Specified group does not exist in current mapset"
+msgstr ""
+
+#: ../imagery/i.group/main.c:124
+#, c-format
+msgid "Removing raster maps from subgroup <%s>..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:129
+#, c-format
+msgid "Removing raster maps from group <%s>..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:164
+#, c-format
+msgid "Group <%s> does not yet exist. Creating..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:168 ../imagery/i.group/main.c:177
+#, c-format
+msgid "Adding raster maps to group <%s>..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:172
+#, c-format
+msgid "Adding raster maps to subgroup <%s>..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:203
+#, c-format
+msgid "Adding raster map <%s> to group"
+msgstr ""
+
+#: ../imagery/i.group/main.c:209
+#, c-format
+msgid "Raster map <%s> exists in group. Skipping..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:243
+#, c-format
+msgid "Adding raster map <%s> to subgroup"
+msgstr ""
+
+#: ../imagery/i.group/main.c:249
+#, c-format
+msgid "Raster map <%s> exists in subgroup. Skipping..."
+msgstr ""
+
+#: ../imagery/i.group/main.c:298
+#, c-format
+msgid "Removing raster map <%s> from group"
+msgstr ""
+
+#: ../imagery/i.group/main.c:315 ../imagery/i.group/main.c:374
+msgid "No raster map removed"
+msgstr ""
+
+#: ../imagery/i.group/main.c:357
+#, c-format
+msgid "Removing raster map <%s> from subgroup"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:74 ../imagery/i.ifft/ifftmain.c:68
+msgid "imagery, FFT"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:76
+msgid "Fast Fourier Transform (FFT) for image processing."
+msgstr "Transformarea Fourier Rapid (FFT) pentru procesarea imaginii."
+
+#: ../imagery/i.fft/fftmain.c:84
+msgid "Name for output real part arrays stored as raster map"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:88
+msgid "Name for output imaginary part arrays stored as raster map"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:96
+msgid "Range of values in output display files"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:115
+msgid "Raster MASK found, consider to remove (see man-page). Will continue..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:129
+msgid "Range less than or equal to zero not allowed"
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:166
+#, c-format
+msgid "Reading the raster map <%s>..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:182
+msgid "Starting FFT..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:201 ../imagery/i.ifft/ifftmain.c:172
+msgid "Rotating data..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:225
+msgid "Writing transformed data..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:231
+msgid "Writing viewable versions of transformed data..."
+msgstr ""
+
+#: ../imagery/i.fft/fftmain.c:274
+msgid " "
+msgstr ""
+
+#: ../imagery/i.fft/save_fft.c:17 ../imagery/i.fft/save_fft.c:22
+msgid "Unable to open file in the 'cell_misc' directory"
+msgstr ""
+
+#: ../imagery/i.gensig/covariance.c:26
+msgid "Calculating class covariance matrices..."
+msgstr ""
+
+#: ../imagery/i.gensig/main.c:39
+msgid "imagery, classification, supervised, MLC"
+msgstr ""
+
+#: ../imagery/i.gensig/main.c:41
+msgid "Generates statistics for i.maxlik from raster map."
+msgstr "Generează statistici pentru i.maxlik dintr-o hartă raster."
+
+#: ../imagery/i.gensig/check.c:21
+#, c-format
+msgid "Signature %d not invertible"
+msgstr ""
+
+#: ../imagery/i.gensig/check.c:27
+#, c-format
+msgid "Signature %d unable to get eigen values"
+msgstr ""
+
+#: ../imagery/i.gensig/check.c:33
+#, c-format
+msgid "Signature %d not positive definite"
+msgstr ""
+
+#: ../imagery/i.gensig/means.c:24
+msgid "Calculating class means..."
+msgstr ""
+
+#: ../imagery/i.find/main.c:63
+#, c-format
+msgid "usage: %s location mapset element file."
+msgstr ""
+
+#: ../imagery/i.find/main.c:83
+msgid "Unable to open temp file."
+msgstr ""
+
+#: ../imagery/i.pca/main.c:66
+msgid "imagery, image transformation, PCA"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:67
+msgid "Principal components analysis (PCA) for image processing."
+msgstr "Analiza componentelor principale (PCA) pentru procesarea imaginii."
+
+#: ../imagery/i.pca/main.c:72
+msgid "Name of two or more input raster maps"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:75
+msgid "Base name for output raster maps"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:77
+msgid "A numerical suffix will be added for each component map"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:90
+msgid "Rescaling range for output maps"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:92
+msgid "For no rescaling use 0,0"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:93
+msgid "Rescale"
+msgstr "Redimensionează"
+
+#: ../imagery/i.pca/main.c:97
+msgid "Normalize (center and scale) input maps"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:107
+msgid "Sorry, at least 2 input bands must be provided"
+msgstr ""
+
+#: ../imagery/i.pca/main.c:218
+msgid "Scale range length should be > 0. Using default values: 0,255."
+msgstr ""
+
+#: ../imagery/i.pca/main.c:264
+msgid "Computing covariance matrix..."
+msgstr ""
+
+#: ../imagery/i.pca/main.c:373
+#, c-format
+msgid "Rescaling to range %d,%d..."
+msgstr ""
+
+#: ../imagery/i.pca/main.c:381
+msgid "Calculating principal components..."
+msgstr ""
+
+#: ../imagery/i.pca/support.c:44
+msgid "Eigen values, (vectors), and [percent importance]:"
+msgstr ""
+
+#: ../imagery/i.rectify/get_wind.c:113
+#, c-format
+msgid "Region N=%f S=%f E=%f W=%f"
+msgstr "Regiune N=%f S=%f E=%f V=%f"
+
+#: ../imagery/i.rectify/get_wind.c:115
+#, c-format
+msgid "Resolution EW=%f NS=%f"
+msgstr "Rezoluție EV=%f NS=%f"
+
+#: ../imagery/i.rectify/cp.c:15
+#, c-format
+msgid "Control Point file for group <%s@%s> - "
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:21
+#, c-format
+msgid "Not enough active control points for current order, %d are required."
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:25
+msgid "Poorly placed control points."
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:26
+msgid " Can not generate the transformation equation."
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:29
+msgid "Not enough memory to solve for transformation equation"
+msgstr ""
+
+#: ../imagery/i.rectify/cp.c:32
+msgid "Invalid order"
+msgstr ""
+
+#: ../imagery/i.rectify/main.c:90
+msgid "imagery, rectify"
+msgstr "imagini, rectificare"
+
+#: ../imagery/i.rectify/main.c:92
+msgid "Rectifies an image by computing a coordinate transformation for each pixel in the image based on the control points."
+msgstr "Rectifică o imagine în funcție de calculul transformării coordonatelor fiecărui pixel din imagine, pe baza punctelor de control."
+
+#: ../imagery/i.rectify/main.c:112
+msgid "Rectification polynom order (1-3)"
+msgstr ""
+
+#: ../imagery/i.rectify/main.c:183
+#, c-format
+msgid "Invalid order (%d); please enter 1 to %d"
+msgstr ""
+
+#: ../imagery/i.rectify/main.c:188
+#, c-format
+msgid "Group <%s> does not exist"
+msgstr ""
+
+#: ../imagery/i.rectify/target.c:35
+msgid "Please run i.target for group."
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:84
+msgid "Computes topographic correction of reflectance."
+msgstr "Calculează corecția topografică a reflectanței."
+
+#: ../imagery/i.topo.corr/main.c:86
+msgid "imagery, terrain, topographic correction"
+msgstr "imagini, teren, corecție topografică"
+
+#: ../imagery/i.topo.corr/main.c:94
+msgid "Name of reflectance raster maps to be corrected topographically"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:98
+msgid "Name (flag -i) or prefix for output raster maps"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:102
+msgid "Name of input base raster map (elevation or illumination)"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:108
+msgid "Solar zenith in degrees"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:114
+msgid "Solar azimuth in degrees (only if flag -i)"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:121
+msgid "Topographic correction method"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:126
+msgid "Output sun illumination terrain model"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:132
+msgid "Solar azimuth is necessary to calculate illumination terrain model"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:135
+msgid "Reflectance maps are necessary to make topographic correction"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:167
+msgid "Elevation raster map of unknown type"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:201
+msgid "Illumination model is of CELL type"
+msgstr ""
+
+#: ../imagery/i.topo.corr/main.c:208
+#, c-format
+msgid "Reflectance of raster map <%s> is not of DCELL type - ignored"
+msgstr ""
+
+#: ../imagery/i.topo.corr/correction.c:100
+#, c-format
+msgid "Minnaert constant = %lf"
+msgstr ""
+
+#: ../imagery/i.topo.corr/correction.c:105
+#, c-format
+msgid "C-factor constant = %lf (a=%.4f; m=%.4f)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:47
+msgid "Transforms raster maps from RGB (Red-Green-Blue) color space to HIS (Hue-Intensity-Saturation) color space."
+msgstr "Transformă harta raster din sistemul de culori RGB (Roșu-Verde-Albastru) în sistemul HIS (Valoare-Intensitate-Saturație)."
+
+#: ../imagery/i.rgb.his/r2hmain.c:53
+msgid "Name of input raster map (red)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:57
+msgid "Name of input raster map (green)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:61
+msgid "Name of input raster map (blue)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:65
+msgid "Name for output raster map (hue)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:69
+msgid "Name for output raster map (intensity)"
+msgstr ""
+
+#: ../imagery/i.rgb.his/r2hmain.c:73
+msgid "Name for output raster map (saturation)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:64
+msgid "Calculates top-of-atmosphere radiance or reflectance and temperature for Landsat MSS/TM/ETM+."
+msgstr "Calculează radianța sau reflectanța atmosferei înalte și temperatura pentru Landsat MSS/TM/ETM+."
+
+#: ../imagery/i.landsat.toar/main.c:66
+msgid "imagery, landsat, top-of-atmosphere reflectance, dos-type simple atmospheric correction"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:78
+msgid "Prefix for output raster maps"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:80
+msgid "Example: 'B.toar.' generates B.toar.1, B.toar.2, ..."
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:87
+msgid "Name of Landsat metadata file (.met or MTL.txt)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:93
+msgid "Spacecraft sensor"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:95
+msgid "Required only if 'metfile' not given (recommended for sanity)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:98
+msgid "mss1;Landsat_1 MSS;mss2;Landsat_2 MSS;mss3;Landsat_3 MSS;mss4;Landsat_4 MSS;mss5;Landsat_5 MSS;tm4;Landsat_4 TM;tm5;Landsat_5 TM;tm7;Landsat_7 ETM+;ot8;Landsat_8 OLI/TIRS"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:115 ../imagery/i.landsat.toar/main.c:116
+msgid "Atmospheric correction method"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:125
+msgid "Image acquisition date (yyyy-mm-dd)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:126 ../imagery/i.landsat.toar/main.c:134
+#: ../imagery/i.landsat.toar/main.c:143 ../imagery/i.landsat.toar/main.c:151
+msgid "Required only if 'metfile' not given"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:133
+msgid "Sun elevation in degrees"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:142
+msgid "Image creation date (yyyy-mm-dd)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:150
+msgid "Gain (H/L) of all Landsat ETM+ bands (1-5,61,62,7,8)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:158
+msgid "Percent of solar radiance in path radiance"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:159 ../imagery/i.landsat.toar/main.c:169
+msgid "Required only if 'method' is any DOS"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:168
+msgid "Minimum pixels to consider digital number as dark object"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:177
+msgid "Rayleigh atmosphere (diffuse sky irradiance)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:178
+msgid "Required only if 'method' is DOS3"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:186
+msgid "Output at-sensor radiance instead of reflectance for all bands"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:191
+msgid "Input raster maps use as extension the number of the band instead the code"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:213 ../imagery/i.landsat.toar/main.c:221
+#, c-format
+msgid "Illegal date format: [%s] (yyyy-mm-dd)"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:241
+msgid "Failed to identify satellite"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:252
+#, c-format
+msgid "Lacking '%s' and/or '%s' for this satellite"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:259
+msgid "Landsat-7 requires band gain with 9 (H/L) data"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:280
+#, c-format
+msgid "Unknown satellite type (defined by '%s')"
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:452
+msgid "Calculating..."
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:488
+#, c-format
+msgid "Writing %s of <%s> to <%s>..."
+msgstr ""
+
+#: ../imagery/i.landsat.toar/main.c:489
+msgid "radiance"
+msgstr "radianță"
+
+#: ../imagery/i.landsat.toar/main.c:491
+msgid "temperature"
+msgstr "temperatură"
+
+#: ../imagery/i.landsat.toar/main.c:492
+msgid "reflectance"
+msgstr "reflectanță"
+
+#: ../imagery/i.landsat.toar/landsat_met.c:81
+#, c-format
+msgid "Metadata file <%s> not found"
+msgstr "Fișierul de metadate <%s> nu a fost găsit"
+
+#: ../imagery/i.ifft/ifftmain.c:70
+msgid "Inverse Fast Fourier Transform (IFFT) for image processing."
+msgstr "Transformarea Invers Fourier Rapid (IFFT) pentru procesarea imaginii."
+
+#: ../imagery/i.ifft/ifftmain.c:75
+msgid "Name of input raster map (image fft, real part)"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:79
+msgid "Name of input raster map (image fft, imaginary part"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:101
+msgid "Unable to open real-image in the 'cell_misc' directory. Raster map probably wasn't created by i.fft"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:111
+msgid "Unable to open imaginary-image in the 'cell_misc' directory. Raster map probably wasn't created by i.fft"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:134
+#, c-format
+msgid "Power 2 values: %d rows %d columns"
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:151
+msgid "Masking raster maps..."
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:211
+msgid "Starting Inverse FFT..."
+msgstr ""
+
+#: ../imagery/i.ifft/ifftmain.c:225
+msgid "Writing data..."
+msgstr ""
+
+#: ../imagery/i.ifft/orig_wind.c:27
+msgid "The real and imaginary original windows did not match"
+msgstr ""
+
+#: ../imagery/i.cca/transform.c:18
+msgid "Unable to allocate cell buffers."
+msgstr ""
+
+#: ../imagery/i.cca/transform.c:24
+msgid "Error reading cell map during transform."
+msgstr ""
+
+#: ../imagery/i.cca/transform.c:46
+msgid "Error writing cell map during transform."
+msgstr ""
+
+#: ../imagery/i.cca/transform.c:51
+msgid "Transform completed.\n"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:84
+msgid "imagery, statistics"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:86
+msgid "Canonical components analysis (cca) program for image processing."
+msgstr "Programul de analiză canonică a componentelor (cca) pentru procesarea imaginilor."
+
+#: ../imagery/i.cca/main.c:99
+msgid "File containing spectral signatures"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:102
+msgid "Output raster map prefix name"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:108
+#, c-format
+msgid "Illegal group name <%s>"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:111
+#, c-format
+msgid "Illegal subgroup name <%s>"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:114
+#, c-format
+msgid "Illegal signature file name <%s>"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:117
+#, c-format
+msgid "Illegal output file name <%s>"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:122
+msgid "Unknown imagery group."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:125
+msgid "Unable to find subgroup reference information."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:131
+msgid "Unable to open the signature file"
+msgstr ""
+
+#: ../imagery/i.cca/main.c:135
+msgid "Error while reading the signatures file."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:140
+msgid "Need at least two signatures in signature file."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:145
+#, c-format
+msgid ""
+"Subgroup too large.  Maximum number of bands is %d\n"
+"."
+msgstr ""
+
+#: ../imagery/i.cca/main.c:207
+#, c-format
+msgid "The output cell map <%s.%d> has values outside the 0-255 range."
+msgstr ""
+
+#: ../imagery/i.target/main.c:47
+msgid "Targets an imagery group to a GRASS location and mapset."
+msgstr "Vizarea grupului de imagini pentru locația și mapsetul GRASS."
+
+#: ../imagery/i.target/main.c:56
+msgid "Name of imagery target location"
+msgstr ""
+
+#: ../imagery/i.target/main.c:62
+msgid "Name of target mapset"
+msgstr ""
+
+#: ../imagery/i.target/main.c:67
+msgid "Set current location and mapset as target for of imagery group"
+msgstr ""
+
+#: ../imagery/i.target/main.c:89 ../imagery/i.target/main.c:106
+#: ../imagery/i.target/main.c:115
+#, c-format
+msgid "Group <%s> targeted for location [%s], mapset [%s]"
+msgstr ""
+
+#: ../imagery/i.target/main.c:92
+#, c-format
+msgid "Group <%s> has no target"
+msgstr ""
+
+#: ../imagery/i.target/main.c:100
+msgid ""
+"Use either the Current Mapset and Location Flag (-c)\n"
+" OR\n"
+" manually enter the variables"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:55
+msgid "nviz - Visualization and animation tool for GRASS data."
+msgstr "nviz - Instrument de vizualizare și animație pentru datele GRASS."
+
+#: ../visualization/nviz/src/nviz_init.c:60
+msgid "Name of raster map(s) for Elevation"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:61
+#: ../visualization/nviz/src/nviz_init.c:70
+#: ../visualization/nviz/src/nviz_init.c:97
+msgid "Raster"
+msgstr "Raster"
+
+#: ../visualization/nviz/src/nviz_init.c:69
+msgid "Name of raster map(s) for Color"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:78
+msgid "Name of vector lines/areas overlay map(s)"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:79
+#: ../visualization/nviz/src/nviz_init.c:88
+msgid "Vector"
+msgstr "Vector"
+
+#: ../visualization/nviz/src/nviz_init.c:87
+msgid "Name of vector points overlay file(s)"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:96
+msgid "Name of existing 3d raster map"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:101
+msgid "Quickstart - Do not load any data"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:106
+msgid "Exit after completing script launched from the command line"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:111
+msgid "Start in Demo mode (skip the \"please wait\" message)"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:115
+msgid "Verbose module output"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:121
+msgid "Set alternative panel path"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:127
+msgid "Execute script file at startup"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:133
+msgid "Load previously saved state file"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:287
+msgid "Number of elevation files does not match number of colors files"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:298
+msgid "Loading data failed"
+msgstr ""
+
+#: ../visualization/nviz/src/nviz_init.c:411
+msgid "Entering script mode ..."
+msgstr ""
+
+#: ../visualization/ximgview/main.c:62
+msgid "Unable to open display"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:82
+msgid "Unable to get window attributes"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:238
+msgid "Unable to open image file"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:241
+msgid "Unable to read BMP header"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:244
+msgid "Invalid BMP header"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:250
+msgid "Unable to map image file"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:271
+msgid "View BMP images from the PNG driver."
+msgstr ""
+
+#: ../visualization/ximgview/main.c:279
+msgid "Image file"
+msgstr ""
+
+#: ../visualization/ximgview/main.c:286
+msgid "Percentage of CPU time to use"
+msgstr ""
+
+#: ../visualization/ximgview/color.c:90 ../visualization/ximgview/color.c:288
+#: ../visualization/xganim/Clr_table.c:94
+#: ../visualization/xganim/Clr_table.c:292
+#: ../visualization/xganim/Clr_table.c:318
+#, c-format
+msgid "Unknown visual class [%d]."
+msgstr ""
+
+#: ../visualization/ximgview/color.c:239
+#: ../visualization/xganim/Clr_table.c:243
+msgid "Unable to get sufficient gray shades."
+msgstr ""
+
+#: ../visualization/ximgview/color.c:256
+#: ../visualization/xganim/Clr_table.c:260
+msgid "Unable to get sufficient colors."
+msgstr ""
+
+#: ../visualization/ximgview/color.c:269
+#: ../visualization/xganim/Clr_table.c:273
+msgid "Using private colormap for DirectColor visual."
+msgstr ""
+
+#: ../visualization/xganim/main.c:362
+#, c-format
+msgid "Reading file [%s]..."
+msgstr ""
+
+#: ../visualization/xganim/main.c:384
+msgid "Unable to determine raster cell type"
+msgstr ""
+
+#: ../visualization/xganim/main.c:388
+msgid "Unable to read color file"
+msgstr ""
+
+#: ../visualization/xganim/main.c:393
+msgid "Unable to read raster row"
+msgstr ""
+
+#: ../vector/v.in.dxf/add_lwpolyline.c:33 ../vector/v.in.dxf/add_3dface.c:29
+#: ../vector/v.in.dxf/add_polyline.c:90 ../vector/v.in.dxf/add_text.c:35
+#: ../vector/v.in.dxf/add_line.c:28 ../vector/v.in.dxf/add_point.c:27
+#: ../vector/v.in.dxf/add_circle.c:32 ../vector/v.in.dxf/add_arc.c:36
+#, c-format
+msgid "Layer %d: %s\n"
+msgstr "Strat %d: %s\n"
+
+#: ../vector/v.in.dxf/add_polyline.c:45
+msgid "vertices following flag missing"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:62
+msgid "Converts files in DXF format to GRASS vector map format."
+msgstr "Convertește fișierele din format DXF în format hartă vectorială GRASS."
+
+#: ../vector/v.in.dxf/main.c:66
+msgid "Ignore the map extent of DXF file"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:70
+msgid "Do not create attribute tables"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:74 ../vector/v.edit/args.c:216
+#: ../vector/v.random/main.c:136
+msgid "Do not build topology"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:78
+msgid "Import polyface meshes as 3D wire frame"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:83 ../vector/v.in.dxf/main.c:89
+#: ../vector/v.in.dxf/main.c:94 ../vector/v.in.dxf/main.c:108
+msgid "DXF layers"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:88 ../vector/v.in.dwg/main.c:84
+msgid "Invert selection by layers (don't import layers in list)"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:93
+msgid "Import all objects into one layer"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:97
+msgid "Name of input DXF file"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:107 ../vector/v.in.dwg/main.c:79
+msgid "List of layers to import"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:122
+#, c-format
+msgid "Unable to open DXF file <%s>"
+msgstr "Imposibil de deschis fișierul DXF <%s>"
+
+#: ../vector/v.in.dxf/main.c:157
+#, c-format
+msgid "Option <%s>: <%s> exists."
+msgstr "Opțiunea <%s>: <%s> există."
+
+#: ../vector/v.in.dxf/main.c:162
+#, c-format
+msgid "Use '%s' option to change vector map name"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:189
+msgid "Building topology failed"
+msgstr ""
+
+#: ../vector/v.in.dxf/main.c:195
+msgid "Failed to import DXF file!"
+msgstr ""
+
+#: ../vector/v.in.dxf/read_dxf.c:57
+msgid "end of file while looking for HEADER"
+msgstr ""
+
+#: ../vector/v.in.dxf/write_vect.c:58 ../vector/v.in.ascii/points.c:405
+#: ../vector/v.in.sites/main.c:240 ../vector/v.mkgrid/main.c:309
+#, c-format
+msgid "Unable to insert new record: %s"
+msgstr ""
+
+#: ../vector/v.in.dxf/write_vect.c:78
+msgid "No DXF layers found!"
+msgstr ""
+
+#: ../vector/v.in.dxf/write_vect.c:87
+msgid "Following DXF layers found:"
+msgstr ""
+
+#: ../vector/v.in.dxf/write_vect.c:91
+#, c-format
+msgid "Layer %d: %s"
+msgstr "Strat %d: %s"
+
+#: ../vector/v.in.dxf/write_vect.c:230
+#, c-format
+msgid "Unable to add database link for vector map <%s>"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:67
+#, c-format
+msgid "\tScore Value=%f\tsmoothing parameter (standard deviation)=%f"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:106
+msgid "vector, kernel density"
+msgstr "vector, densitate kernel"
+
+#: ../vector/v.kernel/main.c:108
+msgid "Generates a raster density map from vector point data using a moving kernel or optionally generates a vector density map on a vector network."
+msgstr "Generează harta densității de tip raster din puncte vectoriale folosind mutarea kernel sau opțional generează harta densității de tip vector pe o rețea vectorială."
+
+#: ../vector/v.kernel/main.c:112
+msgid "Input vector with training points"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:116
+msgid "Input network vector map"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:124
+msgid "Output raster/vector map"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:130
+msgid "Standard deviation in map units"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:136
+msgid "Discretization error in map units"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:143
+msgid "Maximum length of segment on network"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:150
+msgid "Maximum distance from point to network"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:157
+msgid "Multiply the density result by this number"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:164
+msgid "Node method"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:168
+msgid "none;No method applied at nodes with more than 2 arcs;split;Equal split (Okabe 2009) applied at nodes;"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:175
+msgid "Kernel function"
+msgstr "Funcția Kernel "
+
+#: ../vector/v.kernel/main.c:183
+msgid "Try to calculate an optimal standard deviation with 'stddeviation' taken as maximum (experimental)"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:188
+msgid "Only calculate optimal standard deviation and exit (no map is written)"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:193
+msgid "In network mode, normalize values by sum of density multiplied by length of each segment. Integral over the output map then gives 1.0 * mult"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:198
+msgid "In network mode, multiply the result by number of input points."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:203
+msgid "Verbose module output (retained for backwards compatibility)"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:225
+msgid "Unknown node method"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:243
+msgid "Unknown kernel function"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:249
+msgid "Optimal standard deviation calculation is supported only for node method 'none' and kernel function 'gaussian'."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:253
+msgid "Optimal standard deviation calculation is supported only for kernel function 'gaussian'."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:290
+#, c-format
+msgid "Network input map <%s> not found"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:317
+#, c-format
+msgid "%d points outside threshold"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:345
+#, c-format
+msgid "Automatic choice of smoothing parameter (standard deviation), maximum possible value of standard deviation is set to %f"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:352
+#, c-format
+msgid "Using maximum distance between points: %f"
+msgstr ""
+
+#: ../vector/v.kernel/main.c:366
+#, c-format
+msgid "Number of input points: %d."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:367
+#, c-format
+msgid "%d distances read from the map."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:370
+#, c-format
+msgid "Distances between all points are beyond %e (4 * standard deviation), unable to calculate optimal value."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:381
+#, c-format
+msgid "Optimal smoothing parameter (standard deviation): %f."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:408
+#, c-format
+msgid ""
+"\n"
+"Writing output vector map using smooth parameter=%f."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:410 ../vector/v.kernel/main.c:517
+#, c-format
+msgid ""
+"\n"
+"Normalising factor=%f."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:515
+#, c-format
+msgid ""
+"\n"
+"Writing output raster map using smooth parameter=%f."
+msgstr ""
+
+#: ../vector/v.kernel/main.c:524
+msgid "Unable to read MASK"
+msgstr "Imposibil de citit MASCA"
+
+#: ../vector/v.kernel/main.c:551
+#, c-format
+msgid "Maximum value in output: %e."
+msgstr ""
+
+#: ../vector/v.kernel/function.c:220
+msgid "Dimension > 2 supported only by gaussian function"
+msgstr ""
+
+#: ../vector/v.digit/centre.c:54
+msgid "Select tool"
+msgstr "Intrument de selectare"
+
+#: ../vector/v.digit/var.c:80 ../vector/v.digit/var.c:101
+#: ../vector/v.digit/var.c:122
+#, c-format
+msgid "Cannot set variable code = %d"
+msgstr ""
+
+#: ../vector/v.digit/var.c:143
+#, c-format
+msgid "Cannot get type of variable %s"
+msgstr ""
+
+#: ../vector/v.digit/var.c:164
+#, c-format
+msgid "Cannot get code of variable %s"
+msgstr ""
+
+#: ../vector/v.digit/var.c:184
+#, c-format
+msgid "Cannot get name of variable %d"
+msgstr ""
+
+#: ../vector/v.digit/var.c:199 ../vector/v.digit/var.c:215
+#: ../vector/v.digit/var.c:231
+#, c-format
+msgid "Cannot get value of variable code = %d"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:35
+msgid "Split line:"
+msgstr ""
+
+#: ../vector/v.digit/vertex.c:36 ../vector/v.digit/vertex.c:56
+#: ../vector/v.digit/vertex.c:152 ../vector/v.digit/vertex.c:373
+#: ../vector/v.digit/vertex.c:516 ../vector/v.digit/vertex.c:570
+#: ../vector/v.digit/vertex.c:669 ../vector/v.digit/line.c:481
+#: ../vector/v.digit/line.c:566 ../vector/v.digit/line.c:620
+#: ../vector/v.digit/line.c:705 ../vector/v.digit/attr.c:403
+msgid "Select"
+msgstr "Selectează"
+
+#: ../vector/v.digit/vertex.c:36 ../vector/v.digit/vertex.c:56
+#: ../vector/v.digit/vertex.c:131 ../vector/v.digit/vertex.c:152
+#: ../vector/v.digit/vertex.c:200 ../vector/v.digit/vertex.c:220
+#: ../vector/v.digit/vertex.c:304 ../vector/v.digit/vertex.c:325
+#: ../vector/v.digit/vertex.c:373 ../vector/v.digit/vertex.c:471
+#: ../vector/v.digit/vertex.c:516 ../vector/v.digit/vertex.c:570
+#: ../vector/v.digit/vertex.c:633 ../vector/v.digit/vertex.c:669
+#: ../vector/v.digit/line.c:140 ../vector/v.digit/line.c:224
+#: ../vector/v.digit/line.c:481 ../vector/v.digit/line.c:564
+#: ../vector/v.digit/line.c:566 ../vector/v.digit/line.c:620
+#: ../vector/v.digit/line.c:671 ../vector/v.digit/line.c:705
+#: ../vector/v.digit/attr.c:192 ../vector/v.digit/attr.c:302
+#: ../vector/v.digit/attr.c:398 ../vector/v.digit/attr.c:403
+#: ../vector/v.digit/attr.c:407 ../vector/v.digit/attr.c:463
+msgid "Quit tool"
+msgstr "ÃŽnchide intrument"
+
+#: ../vector/v.digit/vertex.c:130 ../vector/v.digit/vertex.c:303
+#: ../vector/v.digit/line.c:564
+msgid "Confirm and select next"
+msgstr "Confirmă și selectează următorul"
+
+#: ../vector/v.digit/vertex.c:130 ../vector/v.digit/vertex.c:303
+#: ../vector/v.digit/vertex.c:471 ../vector/v.digit/vertex.c:633
+#: ../vector/v.digit/line.c:481 ../vector/v.digit/line.c:564
+#: ../vector/v.digit/line.c:566 ../vector/v.digit/line.c:671
+msgid "Unselect"
+msgstr "Deselectează"
+
+#: ../vector/v.digit/vertex.c:199
+msgid "Remove vertex:"
+msgstr "Elimină vertex:"
+
+#: ../vector/v.digit/vertex.c:200 ../vector/v.digit/vertex.c:220
+#: ../vector/v.digit/vertex.c:325
+msgid "Select vertex"
+msgstr "Selectează vertex:"
+
+#: ../vector/v.digit/vertex.c:372
+msgid "Add vertex:"
+msgstr "Adaugă vertex:"
+
+#: ../vector/v.digit/vertex.c:471
+msgid "New vertex"
+msgstr "Vertex nou"
+
+#: ../vector/v.digit/vertex.c:569
+msgid "Move vertex:"
+msgstr "Mută vertex:"
+
+#: ../vector/v.digit/vertex.c:633 ../vector/v.digit/line.c:671
+msgid "New location"
+msgstr "Locație nouă"
+
+#: ../vector/v.digit/line.c:55
+msgid "Form"
+msgstr ""
+
+#: ../vector/v.digit/line.c:64
+msgid "New record was created.<BR>"
+msgstr "Înregistrarea nouă a fost creată.<BR>"
+
+#: ../vector/v.digit/line.c:68
+msgid "Record for this category already existed.<BR>"
+msgstr ""
+
+#: ../vector/v.digit/line.c:138
+#, c-format
+msgid "Digitize new %s:"
+msgstr ""
+
+#: ../vector/v.digit/line.c:140 ../vector/v.digit/line.c:224
+#: ../vector/v.digit/line.c:253
+msgid "New point"
+msgstr "Punct nou"
+
+#: ../vector/v.digit/line.c:191
+msgid "Out of memory! Point not added."
+msgstr ""
+
+#: ../vector/v.digit/line.c:246
+msgid "Less than 2 points for line -> nothing written"
+msgstr ""
+
+#: ../vector/v.digit/line.c:253
+msgid "Undo last point"
+msgstr ""
+
+#: ../vector/v.digit/line.c:253 ../vector/v.digit/line.c:337
+#: ../vector/v.digit/line.c:386
+msgid "Close line"
+msgstr "ÃŽnchide linia"
+
+#: ../vector/v.digit/line.c:337 ../vector/v.digit/line.c:386
+#: ../vector/v.digit/line.c:407
+msgid "New Point"
+msgstr "Punct nou"
+
+#: ../vector/v.digit/line.c:337 ../vector/v.digit/line.c:386
+msgid "Undo Last Point"
+msgstr ""
+
+#: ../vector/v.digit/line.c:407
+msgid "Delete line and exit"
+msgstr ""
+
+#: ../vector/v.digit/line.c:480
+msgid "Delete point, line, boundary, or centroid:"
+msgstr ""
+
+#: ../vector/v.digit/line.c:619
+msgid "Move point, line, boundary, or centroid:"
+msgstr ""
+
+#: ../vector/v.digit/form.c:97
+msgid "db connection was not set by form"
+msgstr ""
+
+#: ../vector/v.digit/form.c:108 ../vector/v.digit/generate.c:77
+msgid "Cannot open driver"
+msgstr "Nu s-a putut deschide driver"
+
+#: ../vector/v.digit/form.c:120 ../vector/v.digit/generate.c:89
+msgid "Cannot open database"
+msgstr "Nu s-a putut deschide baza de date"
+
+#: ../vector/v.digit/form.c:133
+msgid "Cannot describe table"
+msgstr "Nu s-a putut descrie tabelul"
+
+#: ../vector/v.digit/form.c:162
+msgid "Cannot find column type"
+msgstr "Nu s-a putut găsi tipul de coloană"
+
+#: ../vector/v.digit/form.c:199
+#, c-format
+msgid "Could not set Tcl system encoding to '%s' (%s)"
+msgstr ""
+
+#: ../vector/v.digit/form.c:228
+msgid "Could not convert UTF to external."
+msgstr ""
+
+#: ../vector/v.digit/form.c:256
+msgid "Cannot update table"
+msgstr "Nu s-a putut actualiza tabelul"
+
+#: ../vector/v.digit/c_face.c:183 ../vector/v.digit/c_face.c:241
+#, c-format
+msgid "Cannot open driver %s"
+msgstr "Nu s-a putut deschide driver-ul %s"
+
+#: ../vector/v.digit/c_face.c:189 ../vector/v.digit/c_face.c:251
+#, c-format
+msgid "Cannot open database %s"
+msgstr "Nu s-a putut deschide baza de date %s"
+
+#: ../vector/v.digit/c_face.c:242
+msgid "Cannot open driver "
+msgstr "Nu s-a putut deschide driver"
+
+#: ../vector/v.digit/c_face.c:252 ../vector/v.digit/attr.c:137
+#: ../vector/v.digit/attr.c:650
+#, c-format
+msgid "Cannot open database %s by driver %s"
+msgstr "Nu s-a putut deschide baza de date %s cu driver-ul %s"
+
+#: ../vector/v.digit/c_face.c:269 ../vector/v.vol.rst/main.c:596
+#, c-format
+msgid "Cannot create table: %s"
+msgstr "Nu s-a putut crea tabelul: %s"
+
+#: ../vector/v.digit/c_face.c:270
+msgid "Cannot create table: "
+msgstr "Nu s-a putut crea tabelul: "
+
+#: ../vector/v.digit/c_face.c:282 ../vector/v.sample/main.c:219
+#: ../vector/v.net.distance/main.c:212 ../vector/v.net.path/path.c:113
+#: ../vector/v.net.flow/main.c:172 ../vector/v.db.connect/main.c:331
+#: ../vector/v.net.timetable/main.c:107 ../vector/v.net.components/main.c:151
+#: ../vector/v.net.centrality/main.c:244
+msgid "Cannot create index"
+msgstr "Nu s-a putut crea indexul"
+
+#: ../vector/v.digit/c_face.c:283
+msgid "Cannot create index:\n"
+msgstr "Nu s-a putut crea indexul:\n"
+
+#: ../vector/v.digit/c_face.c:294 ../vector/v.db.connect/main.c:336
+#, c-format
+msgid "Cannot grant privileges on table %s"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:295
+msgid "Cannot grant privileges on table:\n"
+msgstr ""
+
+#: ../vector/v.digit/c_face.c:312
+msgid "Cannot add database link to vector, link for given field probably already exists."
+msgstr ""
+
+#: ../vector/v.digit/main.c:107
+msgid "vector, editing, digitization"
+msgstr ""
+
+#: ../vector/v.digit/main.c:109
+msgid "Interactive editing and digitization of vector maps."
+msgstr "Editarea și vectorizarea interactivă a hărților vectoriale."
+
+#: ../vector/v.digit/main.c:124
+msgid "Create new file if it does not exist."
+msgstr ""
+
+#: ../vector/v.digit/main.c:161
+msgid "New empty map created."
+msgstr ""
+
+#: ../vector/v.digit/main.c:165
+#, c-format
+msgid "Map <%s> does not exist in current mapset. Add flag -n to create a new map."
+msgstr ""
+
+#: ../vector/v.digit/generate.c:78
+#, c-format
+msgid "Cannot open driver '%s'<BR>"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:91
+#, c-format
+msgid "Cannot open database '%s' by driver '%s'<BR>"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:106
+msgid "Cannot open select cursor"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:110
+#, c-format
+msgid "Cannot open select cursor:<BR>'%s'<BR>on database '%s' by driver '%s'<BR>"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:121
+msgid "Cannot fetch next record"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:130
+msgid "No database record"
+msgstr ""
+
+#: ../vector/v.digit/generate.c:223
+#, c-format
+msgid "<HR>   Assume data encoding as:<BR><BR><SELECT NAME=%s SIZE=4><HR><BR>"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:26
+msgid "Zoom by window"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:27 ../vector/v.digit/zoom.c:44
+#: ../vector/v.digit/zoom.c:75
+msgid "1. corner"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:27 ../vector/v.digit/zoom.c:44
+#: ../vector/v.digit/zoom.c:75 ../vector/v.digit/zoom.c:158
+msgid "Quit"
+msgstr "ÃŽnchide"
+
+#: ../vector/v.digit/zoom.c:44
+msgid "2. corner"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:157
+msgid "Pan"
+msgstr "Deplasare în zona de afișare"
+
+#: ../vector/v.digit/zoom.c:158
+msgid "New center"
+msgstr ""
+
+#: ../vector/v.digit/zoom.c:247
+#, c-format
+msgid "Cannot find window '%s'"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:94
+msgid "Cannot create new record."
+msgstr ""
+
+#: ../vector/v.digit/attr.c:127
+msgid "Database table for this layer is not defined"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:145 ../vector/v.digit/attr.c:659
+#, c-format
+msgid "Cannot select record from table %s"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:191
+msgid "Display categories:"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:192 ../vector/v.digit/attr.c:463
+msgid "Select line"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:301 ../vector/v.digit/attr.c:406
+msgid "Copy attributes:"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:302 ../vector/v.digit/attr.c:407
+msgid "Select source object"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:396 ../vector/v.digit/attr.c:402
+msgid "Select the target object"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:397
+msgid "Conform and select next"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:397
+msgid "Deselect Target"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:403
+msgid "Deselect Source"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:462
+msgid "Display attributes:"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:536 ../vector/v.voronoi/vo_main.c:339
+#: ../vector/v.extract/main.c:461 ../vector/v.generalize/misc.c:159
+#, c-format
+msgid "Layer %d"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:542
+#, c-format
+msgid "layer: %d<BR>category: %d<BR>"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:549
+msgid "Database connection not defined<BR>"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:553
+#, c-format
+msgid "driver: %s<BR>database: %s<BR>table: %s<BR>key column: %s<BR>"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:571
+#, c-format
+msgid "Line %d"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:577
+msgid "No categories"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:668
+#, c-format
+msgid "There are no more features with category %d (layer %d) in the map, but there is record in the table. Delete this record?"
+msgstr ""
+
+#: ../vector/v.digit/attr.c:680
+#, c-format
+msgid "Cannot delete record: %s"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:69
+msgid "vector, geometry, 3D"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:71
+msgid "Extrudes flat vector object to 3D with defined height."
+msgstr "Extrudarea obiectului vectorial plat la 3D în funcție de înălțimea definită."
+
+#: ../vector/v.extrude/main.c:75
+msgid "Trace elevation"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:78
+msgid "Name of input 2D vector map"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:81
+msgid "Name of resulting 3D vector map"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:85 ../vector/v.transform/main.c:141
+msgid "Shifting value for z coordinates"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:93
+msgid "Elevation raster for height extraction"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:100
+msgid "Fixed height for 3D vector objects"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:105
+msgid "Name of attribute column with object heights"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:119
+#, c-format
+msgid "One of '%s' or '%s' parameters must be set"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:194
+msgid "Extruding areas..."
+msgstr ""
+
+#: ../vector/v.extrude/main.c:204 ../vector/v.out.svg/main.c:236
+#, c-format
+msgid "Skipping area %d without centroid"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:219
+#, c-format
+msgid "Cannot select attributes for area %d"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:258
+msgid "Extruding vector primitives..."
+msgstr ""
+
+#: ../vector/v.extrude/main.c:291
+#, c-format
+msgid "Cannot select attributes for area #%d"
+msgstr ""
+
+#: ../vector/v.extrude/main.c:309
+#, c-format
+msgid "Column <%s>: invalid data type"
+msgstr ""
+
+#: ../vector/v.label/main.c:61 ../vector/v.label.sa/main.c:54
+msgid "vector, paint labels"
+msgstr ""
+
+#: ../vector/v.label/main.c:63
+msgid "Creates paint labels for a vector map from attached attributes."
+msgstr "Crează etichete de culoare pentru harta vectorială în funcție de atribute."
+
+#: ../vector/v.label/main.c:68 ../vector/v.label.sa/main.c:107
+msgid "Name for new paint-label file"
+msgstr ""
+
+#: ../vector/v.label/main.c:70
+msgid "If not given the name of the input map is used"
+msgstr ""
+
+#: ../vector/v.label/main.c:79 ../vector/v.label.sa/main.c:103
+msgid "Name of attribute column to be used for labels"
+msgstr ""
+
+#: ../vector/v.label/main.c:90
+msgid "Rotate labels to align with lines"
+msgstr ""
+
+#: ../vector/v.label/main.c:95
+msgid "Curl labels along lines"
+msgstr ""
+
+#: ../vector/v.label/main.c:100
+msgid "Offset label in x-direction"
+msgstr ""
+
+#: ../vector/v.label/main.c:103 ../vector/v.label/main.c:110
+#: ../vector/v.label/main.c:119 ../vector/v.label/main.c:163
+msgid "Placement"
+msgstr ""
+
+#: ../vector/v.label/main.c:107
+msgid "Offset label in y-direction"
+msgstr ""
+
+#: ../vector/v.label/main.c:114 ../vector/v.lrs/v.lrs.label/main.c:173
+msgid "Reference position"
+msgstr ""
+
+#: ../vector/v.label/main.c:126 ../vector/v.label/main.c:133
+#: ../vector/v.label/main.c:141 ../vector/v.label/main.c:149
+#: ../vector/v.label.sa/main.c:118 ../vector/v.label.sa/main.c:119
+#: ../vector/v.label.sa/main.c:126 ../vector/v.lrs/v.lrs.label/main.c:180
+msgid "Font"
+msgstr ""
+
+#: ../vector/v.label/main.c:130 ../vector/v.label.sa/main.c:123
+#: ../vector/v.lrs/v.lrs.label/main.c:186
+msgid "Label size (in map-units)"
+msgstr ""
+
+#: ../vector/v.label/main.c:138
+msgid "Space between letters for curled labels (in map-units)"
+msgstr ""
+
+#: ../vector/v.label/main.c:145
+msgid "Label size (in points)"
+msgstr ""
+
+#: ../vector/v.label/main.c:157
+msgid "Rotation angle (degrees counter-clockwise)"
+msgstr ""
+
+#: ../vector/v.label/main.c:167
+msgid "Border width"
+msgstr ""
+
+#: ../vector/v.label/main.c:175 ../vector/v.label.sa/main.c:153
+#: ../vector/v.lrs/v.lrs.label/main.c:210
+msgid "Highlight color for text"
+msgstr ""
+
+#: ../vector/v.label/main.c:181 ../vector/v.label.sa/main.c:163
+msgid "Width of highlight coloring"
+msgstr ""
+
+#: ../vector/v.label/main.c:201 ../vector/v.label.sa/main.c:181
+msgid "Opaque to vector (only relevant if background color is selected)"
+msgstr ""
+
+#: ../vector/v.label/main.c:252
+msgid "size and space options vary significantly which may lead to crummy output"
+msgstr ""
+
+#: ../vector/v.label/main.c:260
+msgid "Too many parameters for <reference>"
+msgstr ""
+
+#: ../vector/v.label/main.c:323 ../vector/v.label.sa/labels.c:174
+#: ../vector/v.overlay/main.c:362
+msgid "Unable to select attributes"
+msgstr ""
+
+#: ../vector/v.label/main.c:329 ../vector/v.sample/main.c:252
+#: ../vector/v.sample/main.c:260 ../vector/v.vol.rst/user1.c:170
+#: ../vector/v.buffer2/main.c:417 ../vector/v.buffer2/main.c:489
+#: ../vector/v.label.sa/labels.c:178 ../vector/v.buffer/main.c:454
+#: ../vector/v.buffer/main.c:466 ../vector/v.buffer/main.c:531
+#: ../vector/v.buffer/main.c:543 ../vector/v.what.rast/main.c:318
+#, c-format
+msgid "No record for category %d in table <%s>"
+msgstr ""
+
+#: ../vector/v.label/main.c:442
+#, c-format
+msgid "Labeled %d lines."
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:53
+msgid "vector, network, connectivity"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:55
+msgid "Computes vertex connectivity between two sets of nodes in the network."
+msgstr "Calculează conectivitatea punctelor de inflexiune dintre două seturi de noduri din rețea."
+
+#: ../vector/v.net.connectivity/main.c:66
+msgid "Name of node capacity column"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:70
+msgid "Set1 layer number or name"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:71
+#: ../vector/v.net.connectivity/main.c:76
+#: ../vector/v.net.connectivity/main.c:82
+msgid "Set1"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:75
+msgid "Set1 category values"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:81
+msgid "Set1 WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:86
+msgid "Set2 layer number or name"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:87
+#: ../vector/v.net.connectivity/main.c:92
+#: ../vector/v.net.connectivity/main.c:98
+msgid "Set2"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:91
+msgid "Set2 category values"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:97
+msgid "Set2 WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:130
+#: ../vector/v.net.connectivity/main.c:135 ../vector/v.net.flow/main.c:186
+#: ../vector/v.net.flow/main.c:191
+#, c-format
+msgid "Neither %s nor %s was given"
+msgstr ""
+
+#: ../vector/v.net.connectivity/main.c:148
+#: ../vector/v.net.connectivity/main.c:151
+#, c-format
+msgid "%s is empty"
+msgstr ""
+
+#: ../vector/v.delaunay2/memory.c:64 ../vector/v.delaunay2/memory.c:70
+#: ../vector/v.delaunay2/memory.c:74 ../vector/v.delaunay2/memory.c:84
+#: ../vector/v.delaunay2/memory.c:92 ../vector/v.delaunay2/memory.c:104
+#: ../vector/v.delaunay2/memory.c:108
+msgid "Not enough memory."
+msgstr ""
+
+#: ../vector/v.delaunay2/memory.c:124
+msgid "All allocated edges have been used."
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:86 ../vector/v.voronoi/vo_main.c:120
+#: ../vector/v.voronoi/dt_main.c:46
+msgid "vector, geometry, triangulation"
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:87 ../vector/v.voronoi/dt_main.c:47
+msgid "Creates a Delaunay triangulation from an input vector map containing points or centroids."
+msgstr "Crează triangulația Delaunay dintr-o hartă vectorială de intrare care conține puncte sau centrozi."
+
+#: ../vector/v.delaunay2/main.c:95 ../vector/v.voronoi/dt_main.c:55
+msgid "Use only points in current region"
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:100 ../vector/v.voronoi/dt_main.c:60
+msgid "Output triangulation as a graph (lines), not areas"
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:141
+msgid "no points to triangulate"
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:149
+msgid "Delaunay triangulation..."
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:152
+msgid "Writing edges..."
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:162
+msgid "Calculate area centroids..."
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:172 ../vector/v.category/main.c:290
+msgid "Unable to calculate area centroid"
+msgstr ""
+
+#: ../vector/v.delaunay2/main.c:178
+msgid "Unable to calculate area centroid z coordinate"
+msgstr ""
+
+#: ../vector/v.out.dxf/write_dxf.c:21
+#, c-format
+msgid "The file '%s' already exists."
+msgstr ""
+
+#: ../vector/v.out.dxf/write_dxf.c:23
+#, c-format
+msgid "The file '%s' already exists and will be overwritten."
+msgstr ""
+
+#: ../vector/v.out.dxf/write_dxf.c:27
+#, c-format
+msgid "%s: Cannot write dxf file."
+msgstr ""
+
+#: ../vector/v.out.dxf/main.c:48 ../vector/v.out.ogr/main.c:96
+#: ../vector/v.out.ascii/out.c:45 ../vector/v.out.svg/main.c:77
+#: ../vector/v.out.pov/main.c:43 ../vector/v.out.vtk/main.c:46
+msgid "vector, export"
+msgstr "vector, export"
+
+#: ../vector/v.out.dxf/main.c:50
+msgid "Exports GRASS vector map layers to DXF file format."
+msgstr "Exportă hartă vectorială GRASS în fișier format DXF."
+
+#: ../vector/v.out.dxf/main.c:60
+msgid "DXF output file"
+msgstr "Fișier de ieșire DXF "
+
+#: ../vector/v.out.dxf/main.c:97
+#, c-format
+msgid "%d features written to '%s'."
+msgstr ""
+
+#: ../vector/v.transform/setup_trans.c:83
+msgid "The points weren't spread out enough."
+msgstr ""
+
+#: ../vector/v.transform/setup_trans.c:86
+#, c-format
+msgid "You need to enter at least %d points."
+msgstr ""
+
+#: ../vector/v.transform/main.c:73
+msgid "vector, transformation"
+msgstr "vector, transformare"
+
+#: ../vector/v.transform/main.c:75
+msgid "Performs an affine transformation (shift, scale and rotate, or GPCs) on vector map."
+msgstr "Se efectuează o transformare afină (deplasare, scară și rotire, sau puncte de control) pe harta vectorială."
+
+#: ../vector/v.transform/main.c:82
+msgid "Suppress display of residuals or other information"
+msgstr ""
+
+#: ../vector/v.transform/main.c:86
+msgid "Shift all z values to bottom=0"
+msgstr ""
+
+#: ../vector/v.transform/main.c:87 ../vector/v.transform/main.c:99
+#: ../vector/v.transform/main.c:125 ../vector/v.transform/main.c:134
+#: ../vector/v.transform/main.c:143 ../vector/v.transform/main.c:152
+#: ../vector/v.transform/main.c:161 ../vector/v.transform/main.c:170
+#: ../vector/v.transform/main.c:180
+msgid "Custom"
+msgstr ""
+
+#: ../vector/v.transform/main.c:92
+msgid "Print the transformation matrix to stdout"
+msgstr ""
+
+#: ../vector/v.transform/main.c:97
+msgid "Instead of points use transformation parameters (xshift, yshift, zshift, xscale, yscale, zscale, zrot)"
+msgstr ""
+
+#: ../vector/v.transform/main.c:111
+msgid "ASCII file holding transform coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:112
+msgid "If not given, transformation parameters (xshift, yshift, zshift, xscale, yscale, zscale, zrot) are used instead"
+msgstr ""
+
+#: ../vector/v.transform/main.c:123
+msgid "Shifting value for x coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:132
+msgid "Shifting value for y coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:150
+msgid "Scaling factor for x coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:159
+msgid "Scaling factor for y coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:168
+msgid "Scaling factor for z coordinates"
+msgstr ""
+
+#: ../vector/v.transform/main.c:178
+msgid "Rotation around z axis in degrees counterclockwise"
+msgstr ""
+
+#: ../vector/v.transform/main.c:184
+msgid "Name of table containing transformation parameters"
+msgstr ""
+
+#: ../vector/v.transform/main.c:193
+msgid "Name of attribute column(s) used as transformation parameters"
+msgstr ""
+
+#: ../vector/v.transform/main.c:195
+msgid "Format: parameter:column, e.g. xshift:xs,yshift:ys,zrot:zr"
+msgstr ""
+
+#: ../vector/v.transform/main.c:211
+#, c-format
+msgid "The '%c' flag is deprecated and will be removed in future. Transformation parameters are used automatically when no pointsfile is given."
+msgstr ""
+
+#: ../vector/v.transform/main.c:217
+#, c-format
+msgid "The '%c' flag is deprecated and will be removed in future. Please use '--quiet' instead."
+msgstr ""
+
+#: ../vector/v.transform/main.c:226
+#, c-format
+msgid "Column names are not defined. Please use '%s' parameter."
+msgstr ""
+
+#: ../vector/v.transform/main.c:231
+#, c-format
+msgid "Please specify a valid layer with '%s' parameter."
+msgstr ""
+
+#: ../vector/v.transform/main.c:236
+msgid "Name of table and name for output vector map must be different. Otherwise the table is overwritten."
+msgstr ""
+
+#: ../vector/v.transform/main.c:253
+#, c-format
+msgid "Unable to open file with coordinates <%s>"
+msgstr ""
+
+#: ../vector/v.transform/main.c:289
+#, c-format
+msgid "Unable to tokenize column string: [%s]"
+msgstr ""
+
+#: ../vector/v.transform/main.c:361 ../vector/v.category/main.c:556
+#: ../vector/v.proj/main.c:296 ../vector/v.type/main.c:234
+#: ../vector/v.net/main.c:197 ../vector/v.build.polylines/main.c:233
+#: ../vector/v.clean/main.c:281 ../vector/v.kcv/main.c:161
+msgid "Failed to copy attribute table to output map"
+msgstr ""
+
+#: ../vector/v.transform/main.c:367
+#, c-format
+msgid ""
+"\n"
+"New vector map <%s> boundary coordinates:"
+msgstr ""
+"\n"
+"Coordonatele limită ale hărții vectoriale <%s>:"
+
+#: ../vector/v.transform/main.c:369
+#, c-format
+msgid " N: %-10.3f    S: %-10.3f"
+msgstr " N: %-10.3f    S: %-10.3f"
+
+#: ../vector/v.transform/main.c:370
+#, c-format
+msgid " E: %-10.3f    W: %-10.3f"
+msgstr " E: %-10.3f    V: %-10.3f"
+
+#: ../vector/v.transform/main.c:371
+#, c-format
+msgid " B: %6.3f    T: %6.3f"
+msgstr " J: %6.3f    S: %6.3f"
+
+#: ../vector/v.transform/get_coor.c:36
+msgid "Reading coordinates from file."
+msgstr "Citirea coordonatelor din fișier."
+
+#: ../vector/v.transform/trans_digit.c:106 ../vector/v.in.db/main.c:138
+#: ../vector/v.db.connect/main.c:284
+#, c-format
+msgid "Missing column <%s> in table <%s>"
+msgstr ""
+
+#: ../vector/v.transform/trans_digit.c:109
+#, c-format
+msgid "Unsupported column type of <%s>"
+msgstr ""
+
+#: ../vector/v.transform/trans_digit.c:117
+#, c-format
+msgid "Unable to select value for category %d from table <%s>, column <%s>. For category %d using default transformation parameter %.3f."
+msgstr ""
+
+#: ../vector/v.transform/trans_digit.c:128
+msgid "No category number defined. Using default transformation parameters."
+msgstr ""
+
+#: ../vector/v.transform/creat_trans.c:69
+#, c-format
+msgid " Number of points that have been entered: %d\n"
+msgstr ""
+
+#: ../vector/v.transform/creat_trans.c:102
+msgid "Please answer yes or no"
+msgstr ""
+
+#: ../vector/v.transform/creat_trans.c:118
+msgid "Error reading coordinates file"
+msgstr ""
+
+#: ../vector/v.transform/creat_trans.c:123
+#, c-format
+msgid "Number of points that have been entered [%d]"
+msgstr ""
+
+#: ../vector/v.transform/creat_trans.c:126
+msgid "Error creating transformation"
+msgstr ""
+
+#: ../vector/v.transform/ask_trans.c:88
+msgid "ask_transform_coor():  Leaving session.. \n"
+msgstr ""
+
+#: ../vector/v.in.ascii/head.c:22
+#, c-format
+msgid ""
+"Unexpected data in vector head:\n"
+"[%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/head.c:56
+#, c-format
+msgid "Unknown keyword <%s> in vector head"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:50
+msgid "Creates a vector map from ASCII points file or ASCII vector file."
+msgstr "Crează o hartă vectorială din puncte ASCII sau fișier vectorial ASCII."
+
+#: ../vector/v.in.ascii/in.c:56
+msgid "ASCII file to be imported, if not given reads from standard input"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:67
+msgid "point;simple x,y[,z] list;standard;GRASS vector ASCII format"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:70
+msgid "Input file format"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:71 ../vector/v.in.ascii/in.c:74
+#: ../vector/v.in.ascii/in.c:152
+msgid "Input format"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:83
+msgid "Number of header lines to skip at top of input file (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:92
+msgid "Column definition in SQL style (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:93
+msgid "For example: 'x double precision, y double precision, cat int, name varchar(10)'"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:105 ../vector/v.in.ascii/in.c:115
+msgid "First column is 1"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:114
+msgid "Number of column used as y coordinate (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:124
+msgid "Number of column used as z coordinate (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:125
+msgid "First column is 1. If 0, z coordinate is not used"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:135
+msgid "Number of column used as category (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:137
+msgid "First column is 1. If 0, unique category is assigned to each row and written to new column 'cat'"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:141 ../vector/v.in.dwg/main.c:88
+msgid "Create 3D vector map"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:146
+msgid "Create a new empty vector map and exit. Nothing is read from input."
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:151
+msgid "Don't expect a header when reading in standard format"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:156
+msgid "Do not create table in points mode"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:167
+msgid "Only import points falling within current region (points mode)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:181
+msgid "Please specify reasonable number of lines to skip"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:184
+msgid "Please specify z column"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:195
+msgid "Please specify reasonable z column"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:200
+msgid "Column numbers must not be negative"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:204 ../vector/v.edit/main.c:78
+#, c-format
+msgid "Unable to open ASCII file <%s>"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:256
+#, c-format
+msgid "Maximum input row length: %d"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:257
+#, c-format
+msgid "Maximum number of columns: %d"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:258
+#, c-format
+msgid "Minimum number of columns: %d"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:263
+msgid ""
+"x column number > minimum last column number\n"
+"(incorrect field separator?)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:267
+msgid ""
+"y column number > minimum last column number\n"
+"(incorrect field separator?)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:271
+msgid "z column number > minimum last column number (incorrect field separator?)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:276
+msgid "cat column number > minimum last column number (incorrect field separator?)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:282
+msgid "x column is not of number type"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:286
+msgid "y column is not of number type"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:290
+msgid "z column is not of number type"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:294
+msgid "cat column is not of number type"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:336
+msgid "Category column is not of integer type"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:417
+#, c-format
+msgid "Number of columns defined (%d) does not match number of columns (%d) in input"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:445
+#, c-format
+msgid "Column number %d <%s> defined as double has only integer values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:450
+#, c-format
+msgid "Column number %d <%s> defined as string has only integer values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:458
+#, c-format
+msgid "Column number %d <%s> defined as integer has double values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:463
+#, c-format
+msgid "Column number %d <%s> defined as string has double values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:471
+#, c-format
+msgid "Column number %d <%s> defined as integer has string values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:477
+#, c-format
+msgid "Column number %d <%s> defined as double has string values"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:483
+#, c-format
+msgid "Length of column %d <%s> (%d) is less than maximum value length (%d)"
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:523
+msgid "Populating table..."
+msgstr ""
+
+#: ../vector/v.in.ascii/in.c:530
+msgid "Could not close attribute table. The DBMI driver did not accept all attributes"
+msgstr ""
+
+#: ../vector/v.in.ascii/points.c:83
+msgid "Scanning input for column types..."
+msgstr ""
+
+#: ../vector/v.in.ascii/points.c:165
+#, c-format
+msgid "Unparsable longitude value in column <%d>: %s"
+msgstr ""
+
+#: ../vector/v.in.ascii/points.c:184
+#, c-format
+msgid "Unparsable latitude value in column <%d>: %s"
+msgstr ""
+
+#: ../vector/v.in.ascii/points.c:265
+#, c-format
+msgid "Skipping %d of %d rows falling outside of current region"
+msgstr ""
+
+#: ../vector/v.in.ascii/points.c:293
+msgid "Importing points..."
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:52
+#, c-format
+msgid "Error reading ASCII file: (bad type) [%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:90
+#, c-format
+msgid "Error reading ASCII file: (unknown type) [%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:103 ../vector/v.edit/a2b.c:136
+msgid "End of ASCII file reached before end of coordinates"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:114
+#, c-format
+msgid "Error reading ASCII file: (bad point) [%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:118
+#, c-format
+msgid "Unparsable longitude value: [%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:121
+#, c-format
+msgid "Unparsable latitude value: [%s]"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:154
+msgid "End of ASCII file reached before end of categories"
+msgstr ""
+
+#: ../vector/v.in.ascii/a2b.c:164
+#, c-format
+msgid "Error reading categories: [%s]"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:164 ../vector/v.vol.rst/main.c:202
+#: ../vector/v.surf.idw/main.c:84 ../vector/lidar/v.surf.bspline/main.c:83
+msgid "vector, interpolation"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:166
+msgid "Spatial approximation and topographic analysis from given point or isoline data in vector format to floating point raster format using regularized spline with tension."
+msgstr "Aproximarea spațială și analiza topografică de la un punct dat sau date de tip izolinii în format vectorial în format raster de puncte reale folosind metoda regularized spline with tension."
+
+#: ../vector/v.surf.rst/main.c:192
+msgid "Use z-coordinates (3D vector only)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:198
+msgid "Perform cross-validation procedure without raster approximation"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:203
+msgid "Use scale dependent tension"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:216 ../vector/lidar/v.surf.bspline/main.c:150
+msgid "If set to 0, z coordinates are used. (3D vector only)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:227
+msgid "Output surface raster map (elevation)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:233
+msgid "Output slope raster map"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:239
+msgid "Output aspect raster map"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:245
+msgid "Output profile curvature raster map"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:251
+msgid "Output tangential curvature raster map"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:257
+msgid "Output mean curvature raster map"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:265 ../vector/v.vol.rst/main.c:286
+msgid "Output deviations vector point file"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:272
+msgid "Output cross-validation errors vector point file"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:279
+msgid "Output vector map showing quadtree segmentation"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:286
+msgid "Output vector map showing overlapping windows"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:292 ../vector/v.vol.rst/main.c:302
+msgid "Name of the raster map used as mask"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:300
+msgid "Name of the attribute column with values to be used for approximation (if layer>0)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:308 ../vector/v.vol.rst/main.c:260
+msgid "Tension parameter"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:315 ../vector/v.vol.rst/main.c:268
+msgid "Smoothing parameter"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:323
+msgid "Name of the attribute column with smoothing parameters"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:331 ../vector/v.vol.rst/main.c:309
+msgid "Maximum number of points in a segment"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:340 ../vector/v.vol.rst/main.c:318
+msgid "Minimum number of points for approximation in a segment (>segmax)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:349 ../vector/v.vol.rst/main.c:336
+msgid "Minimum distance between points (to remove almost identical points)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:358
+msgid "Maximum distance between points on isoline (to insert additional points)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:367
+msgid "Conversion factor for values used for approximation"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:375
+msgid "Anisotropy angle (in degrees counterclockwise from East)"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:408 ../vector/v.surf.rst/main.c:413
+#: ../vector/v.surf.rst/main.c:418 ../vector/v.surf.rst/main.c:423
+#, c-format
+msgid "Output vector map name <%s> is not valid map name"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:436
+msgid "You are not outputting any raster or vector maps"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:456
+msgid "Both cross-validation options (-c flag and cvdev vector output) must be specified"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:459
+msgid "The cross-validation cannot be computed simultaneously with output raster or devi file"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:462
+msgid "Both z-coordinate and zcol attribute defined, only one is allowed"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:464
+msgid "Only smoothing column defined, zcol or -z flag is missing"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:484
+msgid "Using anisotropy - both theta and scalex have to be specified"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:492
+msgid "Both smatt and smooth options specified - using constant"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:502
+msgid "The computation will last too long - lower npmin is suggested"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:549
+msgid "Cannot create quaddata"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:555
+msgid "Cannot create quadfunc"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:558
+msgid "Cannot create tree"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:562
+msgid "Cannot create tree info"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:755
+#, c-format
+msgid ""
+"Processing all selected output files\n"
+"will require %d bytes of disk space for temp files"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:779
+msgid "Interp_segmets failed"
+msgstr ""
+
+#: ../vector/v.surf.rst/main.c:796
+msgid "Cannot write raster maps -- try to increase resolution"
+msgstr ""
+
+#: ../vector/v.info/main.c:63
+msgid "vector, metadata, history"
+msgstr ""
+
+#: ../vector/v.info/main.c:65
+msgid "Outputs basic information about a user-specified vector map."
+msgstr "Transmite informații de bază despre harta vectorială specificată de utilizator."
+
+#: ../vector/v.info/main.c:74
+msgid "Print vector history instead of info"
+msgstr ""
+
+#: ../vector/v.info/main.c:80
+msgid "Print types/names of table columns for specified layer instead of info"
+msgstr ""
+
+#: ../vector/v.info/main.c:95
+msgid "Print topology information only"
+msgstr ""
+
+#: ../vector/v.info/main.c:199 ../vector/v.db.connect/main.c:161
+#, c-format
+msgid "Database connection for map <%s> is not defined in DB file"
+msgstr ""
+
+#: ../vector/v.info/main.c:205
+#, c-format
+msgid "Displaying column types/names for database connection of layer %d:"
+msgstr ""
+
+#: ../vector/v.info/main.c:212 ../vector/v.convert/att.c:67
+#, c-format
+msgid "Unable to open driver <%s>"
+msgstr ""
+
+#: ../vector/v.info/main.c:240
+#, c-format
+msgid "Layer:           %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:242
+#, c-format
+msgid "Mapset:          %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:244
+#, c-format
+msgid "Location:        %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:246
+#, c-format
+msgid "Database:        %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:248
+#, c-format
+msgid "Title:           %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:250
+#, c-format
+msgid "Map scale:       1:%d"
+msgstr ""
+
+#: ../vector/v.info/main.c:252
+#, c-format
+msgid "Map format:      %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:254
+#, c-format
+msgid "Name of creator: %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:256
+#, c-format
+msgid "Organization:    %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:259
+#, c-format
+msgid "Source date:     %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:264
+#, c-format
+msgid "  Type of Map:  %s (level: %i)        "
+msgstr ""
+
+#: ../vector/v.info/main.c:272
+#, c-format
+msgid "  Number of points:       %-9ld       Number of areas:      %-9ld"
+msgstr ""
+
+#: ../vector/v.info/main.c:277
+#, c-format
+msgid "  Number of lines:        %-9ld       Number of islands:    %-9ld"
+msgstr ""
+
+#: ../vector/v.info/main.c:282
+#, c-format
+msgid "  Number of boundaries:   %-9ld       Number of faces:      %-9ld"
+msgstr ""
+
+#: ../vector/v.info/main.c:287
+#, c-format
+msgid "  Number of centroids:    %-9ld       Number of kernels:    %-9ld"
+msgstr ""
+
+#: ../vector/v.info/main.c:292
+#, c-format
+msgid "  Map is 3D:              %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:295
+#, c-format
+msgid "  Number of dblinks:      %-9ld"
+msgstr ""
+
+#: ../vector/v.info/main.c:304
+#, c-format
+msgid "        Projection: %s (zone %d)"
+msgstr ""
+
+#: ../vector/v.info/main.c:307
+#, c-format
+msgid "        Projection: %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:332
+#, c-format
+msgid "  Digitization threshold: %s"
+msgstr ""
+
+#: ../vector/v.info/main.c:334
+#, c-format
+msgid "  Comments:"
+msgstr ""
+
+#: ../vector/v.net.bridge/main.c:45
+msgid "vector, network, articulation points"
+msgstr ""
+
+#: ../vector/v.net.bridge/main.c:47
+msgid "Computes bridges and articulation points in the network."
+msgstr "Calculează podurile și punctele de articulație din rețea."
+
+#: ../vector/v.net.bridge/main.c:61
+msgid "bridge;Finds bridges;articulation;Finds articulation points;"
+msgstr ""
+
+#: ../vector/v.category/main.c:68
+msgid "vector, category"
+msgstr ""
+
+#: ../vector/v.category/main.c:70
+msgid "Attach, delete or report vector categories to map geometry."
+msgstr "Atașează, șterge sau raportează categoriile vectoriale din harta geometrică."
+
+#: ../vector/v.category/main.c:84
+msgid "Action to be done"
+msgstr ""
+
+#: ../vector/v.category/main.c:85
+msgid "add;add a new category;del;delete all categories of given layer;chlayer;change layer number (e.g. layer=3,1 changes layer 3 to layer 1);sum;add the value specified by cat option to the current category value;report;print report (statistics), in shell style: layer type count min max;print;print category values, more cats in the same layer are separated by '/';layers;print only layer numbers"
+msgstr ""
+
+#: ../vector/v.category/main.c:102
+msgid "Feature ids (by default all features are processed)"
+msgstr ""
+
+#: ../vector/v.category/main.c:118
+msgid "Shell script style, currently only for report"
+msgstr ""
+
+#: ../vector/v.category/main.c:119
+msgid "Format: layer type count min max"
+msgstr ""
+
+#: ../vector/v.category/main.c:137
+msgid "Database connection and attribute tables for concerned layers are not changed"
+msgstr ""
+
+#: ../vector/v.category/main.c:160 ../vector/v.edit/main.c:131
+#: ../vector/v.kcv/main.c:137
+#, c-format
+msgid "Unable to open vector map <%s> at topological level %d"
+msgstr ""
+
+#: ../vector/v.category/main.c:182
+msgid "Invalid category number (must be equal to or greater than 0). Normally category number starts at 1."
+msgstr ""
+
+#: ../vector/v.category/main.c:191
+#, c-format
+msgid "%d errors in id option"
+msgstr ""
+
+#: ../vector/v.category/main.c:212
+msgid "Too many layers for this operation"
+msgstr ""
+
+#: ../vector/v.category/main.c:215
+msgid "2 layers must be specified"
+msgstr ""
+
+#: ../vector/v.category/main.c:219
+msgid "Output vector wasn't entered"
+msgstr ""
+
+#: ../vector/v.category/main.c:258 ../vector/v.select/main.c:149
+msgid "Processing features..."
+msgstr ""
+
+#: ../vector/v.category/main.c:303
+#, c-format
+msgid "%d new centroids placed in output map"
+msgstr ""
+
+#: ../vector/v.category/main.c:474
+msgid "Layer/table"
+msgstr ""
+
+#: ../vector/v.category/main.c:478
+msgid "Layer"
+msgstr "Strat"
+
+#: ../vector/v.category/main.c:480
+#, c-format
+msgid "type       count        min        max\n"
+msgstr ""
+
+#: ../vector/v.category/main.c:481
+msgid "point"
+msgstr "punct"
+
+#: ../vector/v.category/main.c:485
+msgid "line"
+msgstr "linie"
+
+#: ../vector/v.category/main.c:489
+msgid "boundary"
+msgstr "limită"
+
+#: ../vector/v.category/main.c:493
+msgid "centroid"
+msgstr "centroid"
+
+#: ../vector/v.category/main.c:497
+msgid "area"
+msgstr "areal"
+
+#: ../vector/v.category/main.c:501
+msgid "all"
+msgstr ""
+
+#: ../vector/v.category/main.c:554
+msgid "Copying attribute table(s)..."
+msgstr ""
+
+#: ../vector/v.category/main.c:560
+#, c-format
+msgid "%d features modified."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:98
+msgid "Converts GRASS vector map to one of the supported OGR vector formats."
+msgstr "Convertește hartă vectorială GRASS în formate vector suportate OGR."
+
+#: ../vector/v.out.ogr/main.c:106
+msgid "Feature type(s). Combinations not supported by all output formats. Default: first type found in input."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:114
+msgid "OGR output datasource name"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:116
+msgid "For example: ESRI Shapefile: filename or directory for storage"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:123
+msgid "OGR layer name. If not specified, input name is used."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:124
+msgid "For example: ESRI Shapefile: shapefile name"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:125 ../vector/v.out.ogr/main.c:138
+#: ../vector/v.out.ogr/main.c:148 ../vector/v.out.ogr/main.c:158
+msgid "Creation"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:137
+msgid "OGR format"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:147
+msgid "OGR dataset creation option (format specific, NAME=VALUE)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:157
+msgid "OGR layer creation option (format specific, NAME=VALUE)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:162
+msgid "Open an existing datasource for update"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:167
+msgid "Skip export of GRASS category ID ('cat') attribute"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:171
+msgid "Export features with category (labeled) only. Otherwise all features are exported"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:176
+msgid "Use ESRI-style .prj file format (applies to Shapefile output only)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:181
+msgid "Create 3D output if input is 3D (applies to Shapefile output only)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:186
+msgid "Export lines as polygons"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:230
+msgid "Skipping all boundaries that are not part of an area."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:249
+msgid "Volumes will be exported as sets of faces."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:267
+msgid "Could not determine input map's feature type(s)."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:312
+msgid "The combination of types is not supported by all formats."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:326
+msgid "The map contains islands. To preserve them in the output map, use the -c flag"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:331
+#, c-format
+msgid "%d point(s) found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:336
+#, c-format
+msgid "%d line(s) found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:342
+#, c-format
+msgid "%d boundary(ies) found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:348
+#, c-format
+msgid "%d centroid(s) found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:353
+#, c-format
+msgid "%d areas found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:357
+#, c-format
+msgid "%d face(s) found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:363
+#, c-format
+msgid "%d kernel(s) found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:368
+#, c-format
+msgid "%d volume(s) found, but not requested to be exported. Verify 'type' parameter."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:374
+msgid "No points found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:383
+msgid "No lines found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:393
+msgid "No boundaries found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:402
+msgid "No areas found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:412
+msgid "No centroids found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:421
+msgid "No faces found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:430
+msgid "No kernels found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:439
+msgid "No volumes found, but requested to be exported. Will skip this geometry type."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:450
+msgid "Nothing to export"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:483
+#, c-format
+msgid "OGR driver <%s> not found"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:508
+#, c-format
+msgid "Unable to open OGR data source '%s'"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:522
+#, c-format
+msgid "Layer <%s> already exists in OGR data source '%s'"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:526
+#, c-format
+msgid "OGR layer <%s> already exists and will be overwritten"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:567
+msgid "Overriding existing user-defined 'SHPT=' LCO."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:583
+#, c-format
+msgid "Vector map <%s> is 3D. Use format specific layer creation options (parameter 'lco') or '-z' flag to export in 3D rather than 2D (default)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:590
+#, c-format
+msgid "Vector map <%s> is 3D. Use format specific layer creation options (parameter 'lco') to export in 3D rather than 2D (default)"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:603
+msgid "Unable to create OGR layer"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:613
+msgid "No attribute table found -> using only category numbers as attributes"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:617
+msgid "Exporting 'cat' anyway, as it is the only attribute table field"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:700
+#, c-format
+msgid "Key column '%s' not found"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:713
+#, c-format
+msgid "Exporting %i geometries..."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:795
+#, c-format
+msgid "Exporting %i areas (may take some time)..."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:870
+#, c-format
+msgid "Exporting %i faces (may take some time) ..."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:933
+#, c-format
+msgid "Exporting %i kernels..."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:992
+#, c-format
+msgid "Exporting %i volumes..."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:993
+msgid "Export of volumes not implemented yet. Skipping."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1010
+#, c-format
+msgid "%d features without category were written"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1012
+#, c-format
+msgid "%d features without attributes were written"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1014
+#, c-format
+msgid "%d features found without category were skipped"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1025
+#, c-format
+msgid "%d features written to <%s> (%s)."
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1067 ../vector/v.out.vtk/writeVTK.c:576
+#, c-format
+msgid "Cannot select attributes for cat = %d"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1072 ../vector/v.out.svg/main.c:397
+#: ../vector/v.out.vtk/writeVTK.c:580 ../vector/v.overlay/main.c:426
+#: ../vector/v.lrs/v.lrs.label/main.c:347
+msgid "Unable to fetch data from table"
+msgstr ""
+
+#: ../vector/v.out.ogr/main.c:1083
+#, c-format
+msgid "No database record for cat = %d and export of 'cat' disabled"
+msgstr ""
+
+#: ../vector/v.out.ascii/b2a.c:160
+#, c-format
+msgid "got type %d"
+msgstr ""
+
+#: ../vector/v.out.ascii/b2a.c:202
+#, c-format
+msgid "Feature has more categories. Only first category (%d) is exported."
+msgstr ""
+
+#: ../vector/v.out.ascii/b2a.c:212
+#, c-format
+msgid "Unable to select record from table <%s> (key %s, column %s)"
+msgstr ""
+
+#: ../vector/v.out.ascii/b2a.c:237 ../vector/v.vect.stats/main.c:394
+#: ../vector/v.distance/main.c:377 ../vector/v.distance/main.c:419
+#: ../vector/v.to.3d/trans3.c:62 ../vector/v.to.3d/trans2.c:60
+#: ../vector/v.reclass/main.c:138
+#, c-format
+msgid "Column <%s> not found in table <%s>"
+msgstr ""
+
+#: ../vector/v.out.ascii/b2a.c:239
+#, c-format
+msgid "Column <%s>: unsupported data type"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:47
+msgid "Converts a GRASS binary vector map to a GRASS ASCII vector map."
+msgstr "Convertește hartă vectorială binară GRASS în harta vectorială ASCII GRASS."
+
+#: ../vector/v.out.ascii/out.c:54
+msgid "Path to resulting ASCII file or ASCII vector name if '-o' is defined"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:66
+msgid "Field separator (points mode)"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:83
+msgid "Name of attribute column(s) to be exported (point mode)"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:91
+msgid "Create old (version 4) ASCII file"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:96
+msgid "Only export points falling within current 3D region (points mode)"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:111
+#, c-format
+msgid "Parameter '%s' ignored in standard mode"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:119
+msgid "Format 'point' is not supported for old version"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:123
+msgid "'output' must be given for old version"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:140 ../vector/v.out.vtk/main.c:186
+msgid "Failed to interpret 'dp' parameter as an integer"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:147
+#, c-format
+msgid "Unable to open vector map <%s> at topology level. Areas will not be processed."
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:185
+msgid "dig_att file already exist"
+msgstr ""
+
+#: ../vector/v.out.ascii/out.c:188
+#, c-format
+msgid "Unable to open dig_att file <%s>"
+msgstr ""
+
+#: ../vector/v.support/main.c:40
+msgid "vector, metadata"
+msgstr ""
+
+#: ../vector/v.support/main.c:41
+msgid "Updates vector map metadata."
+msgstr "Actualizări de metadate a hărții vectoriale."
+
+#: ../vector/v.support/main.c:52
+msgid "Organization where vector map was created"
+msgstr ""
+
+#: ../vector/v.support/main.c:61
+msgid "Date of vector map digitization (e.g., \"15 Mar 2007\")"
+msgstr ""
+
+#: ../vector/v.support/main.c:68
+msgid "Person who created vector map"
+msgstr ""
+
+#: ../vector/v.support/main.c:75
+msgid "Vector map title"
+msgstr ""
+
+#: ../vector/v.support/main.c:83
+msgid "Date when the source map was originally produced"
+msgstr ""
+
+#: ../vector/v.support/main.c:89
+msgid "Vector map scale number (e.g., 24000)"
+msgstr ""
+
+#: ../vector/v.support/main.c:95
+msgid "Vector map projection zone"
+msgstr ""
+
+#: ../vector/v.support/main.c:102
+msgid "Vector map digitizing threshold number (e.g., 0.5)"
+msgstr ""
+
+#: ../vector/v.support/main.c:110
+msgid "Text to append to the comment line of the map's metadata file"
+msgstr ""
+
+#: ../vector/v.support/main.c:118
+msgid "Command line to store into vector map history file (used for vector scripts)"
+msgstr ""
+
+#: ../vector/v.support/main.c:122
+msgid "Replace comment instead of appending it"
+msgstr ""
+
+#: ../vector/v.support/main.c:129 ../vector/v.build/main.c:84
+#: ../vector/v.edit/main.c:120 ../vector/v.neighbors/main.c:77
+#, c-format
+msgid "Vector map <%s> not found in the current mapset"
+msgstr ""
+
+#: ../vector/v.support/main.c:188
+#, c-format
+msgid "Unable to open history file for vector map <%s>"
+msgstr ""
+
+#: ../vector/v.proj/main.c:63
+msgid "vector, projection, transformation"
+msgstr ""
+
+#: ../vector/v.proj/main.c:64
+msgid "Re-projects a vector map from one location to the current location."
+msgstr "Reproiectează harta vectorială de la o locație la locația curentă."
+
+#: ../vector/v.proj/main.c:76
+msgid "Location containing input vector map"
+msgstr ""
+
+#: ../vector/v.proj/main.c:84
+msgid "Mapset containing input vector map"
+msgstr ""
+
+#: ../vector/v.proj/main.c:100
+msgid "Name for output vector map (default: input)"
+msgstr ""
+
+#: ../vector/v.proj/main.c:105
+msgid "List vector maps in input location and exit"
+msgstr ""
+
+#: ../vector/v.proj/main.c:109
+msgid "3D vector maps only"
+msgstr ""
+
+#: ../vector/v.proj/main.c:111
+msgid "Assume z co-ordinate is ellipsoidal height and transform if possible"
+msgstr ""
+
+#: ../vector/v.proj/main.c:188
+#, c-format
+msgid "Vector map <%s> in location <%s> mapset <%s> not found"
+msgstr ""
+
+#: ../vector/v.proj/main.c:211
+#, c-format
+msgid "Mapset <%s> in input location <%s> - permission denied"
+msgstr ""
+
+#: ../vector/v.proj/main.c:214
+#, c-format
+msgid "Mapset <%s> in input location <%s> not found"
+msgstr ""
+
+#: ../vector/v.proj/main.c:270
+#, c-format
+msgid "Reprojecting primitives: "
+msgstr ""
+
+#: ../vector/v.proj/main.c:281
+msgid "Reading input vector map"
+msgstr ""
+
+#: ../vector/v.proj/main.c:287
+msgid "Error in pj_do_transform"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:76
+msgid "Exports a GRASS vector map to SVG."
+msgstr "Exportă hartă vectorială GRASS în SVG."
+
+#: ../vector/v.out.svg/main.c:82
+msgid "Name for SVG output file"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:91
+msgid "Output type"
+msgstr "Tipul de ieșire"
+
+#: ../vector/v.out.svg/main.c:92
+msgid "Defines which feature-type will be extracted"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:100
+msgid "Coordinate precision"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:107
+msgid "Attribute(s) to include in output SVG"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:130
+msgid "Precision must not be negative"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:133
+msgid "Precision must not be higher than 15"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:204
+#, c-format
+msgid "Unable to open SVG file <%s>"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:221
+msgid "No areas found, skipping %"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:262
+#, c-format
+msgid "%d areas extracted"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:269
+#, c-format
+msgid "No points found, skipping %s"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:295
+#, c-format
+msgid "%d points extracted"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:302
+#, c-format
+msgid "No lines found, skipping %s"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:326
+#, c-format
+msgid "%d lines extracted"
+msgstr ""
+
+#: ../vector/v.out.svg/main.c:393
+#, c-format
+msgid "Cannot select attributes for cat=%d"
+msgstr ""
+
+#: ../vector/v.sample/main.c:86
+msgid "vector, raster, resample"
+msgstr ""
+
+#: ../vector/v.sample/main.c:88
+msgid "Samples a raster map at vector point locations."
+msgstr "Eșantionează harta raster la locația punctelor vectoriale."
+
+#: ../vector/v.sample/main.c:91
+msgid "Vector map defining sample points"
+msgstr ""
+
+#: ../vector/v.sample/main.c:98
+msgid "Vector map attribute column to use for comparison"
+msgstr ""
+
+#: ../vector/v.sample/main.c:101
+msgid "Vector map to store differences"
+msgstr ""
+
+#: ../vector/v.sample/main.c:105
+msgid "Raster map to be sampled"
+msgstr ""
+
+#: ../vector/v.sample/main.c:113
+msgid "Option scaling factor for values read from raster map. Sampled values will be multiplied by this factor"
+msgstr ""
+
+#: ../vector/v.sample/main.c:119
+msgid "Bilinear interpolation (default is nearest neighbor)"
+msgstr "Interpolare bilineară (implicit este cel mai apropiat vecin)"
+
+#: ../vector/v.sample/main.c:124
+msgid "Cubic convolution interpolation (default is nearest neighbor)"
+msgstr "Interpolare cubică de convoluție (implicit este cel mai apropiat vecin)"
+
+#: ../vector/v.sample/main.c:142
+msgid "Flags -b & -c are mutually exclusive. Choose only one."
+msgstr "Parametrii  -b & -c se exclud reciproc. Alege doar unul dintre ei."
+
+#: ../vector/v.sample/main.c:181
+#, c-format
+msgid "Column type <%s> not supported (must be integer or double precision)"
+msgstr "Tip de coloană <%s> neacceptat (trebuie să fie întreg sau cu dublă precizie)"
+
+#: ../vector/v.sample/main.c:187 ../vector/v.surf.idw/read_sites.c:54
+#: ../vector/v.normal/main.c:155
+#, c-format
+msgid "%d records selected from table"
+msgstr "%d înregistrări selectate din tabel"
+
+#: ../vector/v.sample/main.c:216 ../vector/v.patch/main.c:285
+#, c-format
+msgid "Unable to create table <%s>"
+msgstr "Imposibil de creat tabelul <%s>"
+
+#: ../vector/v.sample/main.c:227
+msgid "Checking vector points..."
+msgstr "Verifică punctele vectoriale..."
+
+#: ../vector/v.sample/main.c:266 ../vector/v.buffer2/main.c:350
+#: ../vector/v.univar/main.c:328 ../vector/v.surf.idw/read_sites.c:49
+#: ../vector/v.class/main.c:123 ../vector/v.buffer/main.c:402
+#: ../vector/v.to.rast3/main.c:100 ../vector/v.what.rast/main.c:163
+#: ../vector/lidar/v.surf.bspline/main.c:345
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:138
+msgid "Column type not supported"
+msgstr "Tip de coloană neacceptat"
+
+#: ../vector/v.sample/main.c:289 ../vector/v.kcv/main.c:270
+#, c-format
+msgid "Unable to insert row: %s"
+msgstr "Imposibil de inserat rândul: %s"
+
+#: ../vector/v.net.distance/main.c:60 ../vector/v.net.path/main.c:41
+#: ../vector/v.net.allpairs/main.c:58 ../vector/v.net.timetable/main.c:254
+msgid "vector, network, shortest path"
+msgstr "vector, rețea, calea cea mai scurtă"
+
+#: ../vector/v.net.distance/main.c:61
+msgid "Computes shortest distance via the network between the given sets of features."
+msgstr "Calculează distanța cea mai scurtă prin intermediul rețelei dintre anumite seturi de trăsături."
+
+#: ../vector/v.net.distance/main.c:64
+msgid "Finds the shortest paths from a feature 'to' to every feature 'from' and various information about this realtion are uploaded to the attribute table."
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:73
+msgid "From layer number or name"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:74 ../vector/v.net.distance/main.c:79
+#: ../vector/v.net.distance/main.c:85 ../vector/v.distance/main.c:121
+#: ../vector/v.distance/main.c:133 ../vector/v.distance/main.c:145
+msgid "From"
+msgstr "De la"
+
+#: ../vector/v.net.distance/main.c:78
+msgid "From category values"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:84
+msgid "From WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:89
+msgid "To layer number or name"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:90 ../vector/v.net.distance/main.c:95
+#: ../vector/v.net.distance/main.c:101 ../vector/v.net.distance/main.c:108
+#: ../vector/v.distance/main.c:126 ../vector/v.distance/main.c:140
+#: ../vector/v.distance/main.c:150 ../vector/v.distance/main.c:209
+msgid "To"
+msgstr "La"
+
+#: ../vector/v.net.distance/main.c:94
+msgid "To category values"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:100
+msgid "To WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:107
+msgid "To feature type"
+msgstr ""
+
+#: ../vector/v.net.distance/main.c:216 ../vector/v.net.path/path.c:117
+#: ../vector/v.net.allpairs/main.c:161 ../vector/v.net.flow/main.c:176
+#: ../vector/v.net.timetable/main.c:112 ../vector/v.net.components/main.c:155
+#: ../vector/v.net.centrality/main.c:248
+#, c-format
+msgid "Cannot grant privileges on table <%s>"
+msgstr ""
+
+#: ../vector/v.type/main.c:47 ../vector/v.patch/main.c:68
+#: ../vector/v.to.points/main.c:173 ../vector/v.mkgrid/main.c:63
+#: ../vector/v.segment/main.c:52 ../vector/v.hull/main.c:273
+#: ../vector/v.in.region/main.c:38 ../vector/v.split/main.c:42
+#: ../vector/v.overlay/main.c:60 ../vector/v.parallel2/main.c:45
+#: ../vector/v.parallel/main.c:39
+msgid "vector, geometry"
+msgstr ""
+
+#: ../vector/v.type/main.c:48
+msgid "Change the type of geometry elements."
+msgstr "Schimbă tipul de geometrie a elementelor."
+
+#: ../vector/v.type/main.c:62
+msgid "Feature type to convert from"
+msgstr ""
+
+#: ../vector/v.type/main.c:72
+msgid "Feature type to convert to"
+msgstr ""
+
+#: ../vector/v.type/main.c:77
+msgid "Pairs for input and output type separated by comma"
+msgstr ""
+
+#: ../vector/v.type/main.c:79
+msgid ""
+"<input_type1>,<output_type1>,<input_type2>,<output_type2>,...\n"
+"\t\tExample1: line,boundary\n"
+"\t\tExample2: line,boundary,point,centroid"
+msgstr ""
+
+#: ../vector/v.type/main.c:92
+msgid "Nothing to do"
+msgstr ""
+
+#: ../vector/v.type/main.c:141 ../vector/v.type/main.c:174
+msgid "Incompatible types"
+msgstr ""
+
+#: ../vector/v.type/main.c:186
+msgid "Not enough types"
+msgstr ""
+
+#: ../vector/v.type/main.c:189
+msgid "Odd number of types"
+msgstr ""
+
+#: ../vector/v.build/main.c:34 ../vector/v.clean/main.c:43
+msgid "vector, topology"
+msgstr "vector, topologie"
+
+#: ../vector/v.build/main.c:35
+msgid "Creates topology for GRASS vector map."
+msgstr "Crează topologie pentru harta vectorială GRASS."
+
+#: ../vector/v.build/main.c:42
+msgid "Name for vector map where erroneous vector features are written to"
+msgstr ""
+
+#: ../vector/v.build/main.c:53
+msgid "Build topology or dump topology or spatial index to stdout"
+msgstr ""
+
+#: ../vector/v.build/main.c:55
+msgid "build;build topology;dump;write topology to stdout;sdump;write spatial index to stdout;cdump;write category index to stdout"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:204
+msgid "Interpolates point data to a 3D raster map using regularized spline with tension (RST) algorithm."
+msgstr "Interpolează datele punctuale într-o hartă raster 3D folosind algoritmul regular spline with tension (RST)."
+
+#: ../vector/v.vol.rst/main.c:237
+msgid "Name of the vector map with input x,y,z,w"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:245
+msgid "Name of the surface raster map for cross-section"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:252
+msgid "Name of the column containing w attribute to interpolate"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:276
+msgid "Name of the column with smoothing parameters"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:287 ../vector/v.vol.rst/main.c:295
+msgid "Analysis"
+msgstr "Analiză"
+
+#: ../vector/v.vol.rst/main.c:294
+msgid "Output cross-validation vector map"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:327
+msgid "Maximum number of points for approximation in a segment (>npmin)"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:345
+msgid "Conversion factor for w-values used for interpolation"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:353
+msgid "Conversion factor for z-values"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:361
+msgid "Output cross-section raster map"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:370
+msgid "Output elevation g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:378
+msgid "Output gradient magnitude g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:388
+msgid "Output gradient horizontal angle g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:397
+msgid "Output gradient vertical angle g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:406
+msgid "Output change of gradient g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:415
+msgid "Output gaussian curvature g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:424
+msgid "Output mean curvature g3d-file"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:430
+msgid "Perform a cross-validation procedure without volume interpolation"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:467
+msgid "Smoothing must be a positive value"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:473
+msgid "Both crossvalidation options (-c, cvdev) must be specified"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:475
+msgid "Both crossvalidation and deviations file specified"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:557
+msgid "Vector is not 3D"
+msgstr ""
+
+#: ../vector/v.vol.rst/main.c:612
+#, c-format
+msgid "Cannot open %s"
+msgstr ""
+
+#: ../vector/v.vol.rst/user1.c:107
+msgid "Column type of wcolumn is not supported (must be integer or double)"
+msgstr ""
+
+#: ../vector/v.vol.rst/user1.c:126
+msgid "Column type of smooth column is not supported (must be integer or double)"
+msgstr ""
+
+#: ../vector/v.net/report.c:44
+#, c-format
+msgid "Line %d has no category"
+msgstr ""
+
+#: ../vector/v.net/report.c:67
+#, c-format
+msgid "Point not found: %.3lf %.3lf %.3lf line category: %d"
+msgstr ""
+
+#: ../vector/v.net/report.c:70
+#, c-format
+msgid "%d points found: %.3lf %.3lf %.3lf line category: %d"
+msgstr ""
+
+#: ../vector/v.net/main.c:47
+msgid "vector, networking, maintenance"
+msgstr ""
+
+#: ../vector/v.net/main.c:48
+msgid "Performs network maintenance."
+msgstr "Efectuează întreținerea rețelei."
+
+#: ../vector/v.net/main.c:55
+msgid "Name of input point vector map"
+msgstr ""
+
+#: ../vector/v.net/main.c:56
+msgid "Required for operation 'connect'"
+msgstr ""
+
+#: ../vector/v.net/main.c:71
+msgid "nodes;new point is placed on each node (line end) if doesn't exist;connect;connect still unconnected points to vector network by inserting new line(s);report;print to standard output {line_category start_point_category end_point_category};nreport;print to standard output {point_category line_category[,line_category...]}"
+msgstr ""
+
+#: ../vector/v.net/main.c:97
+msgid "Required for operation 'connect'. Connect points in given threshold."
+msgstr ""
+
+#: ../vector/v.net/main.c:101
+msgid "Assign unique categories to new points"
+msgstr ""
+
+#: ../vector/v.net/main.c:102
+msgid "For operation 'nodes'"
+msgstr ""
+
+#: ../vector/v.net/main.c:120
+msgid "Unknown operation"
+msgstr ""
+
+#: ../vector/v.net/main.c:124
+msgid "Output vector map must be specified"
+msgstr ""
+
+#: ../vector/v.net/main.c:129
+msgid "Point vector map must be specified"
+msgstr ""
+
+#: ../vector/v.net/main.c:132
+msgid "Threshold value must be specified"
+msgstr ""
+
+#: ../vector/v.net/main.c:137
+msgid "Threshold value must be >= 0"
+msgstr ""
+
+#: ../vector/v.net/main.c:174
+#, c-format
+msgid "Unable to open vector map <%s> at topology level %d"
+msgstr ""
+
+#: ../vector/v.net/main.c:190
+#, c-format
+msgid "%d arcs added to network (nlayer %d)"
+msgstr ""
+
+#: ../vector/v.net/nodes.c:85
+#, c-format
+msgid "%d new points written to output"
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:31
+msgid "Failed opening input dig file."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:46
+msgid "dig_att file doesn't exist."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:50
+msgid "Failed opening input dig_att file."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:72
+msgid "Attaching categories..."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:89
+#, c-format
+msgid "Failed to attach an attribute (category %d) to a line."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:94
+#, c-format
+msgid "Line %d label: %d matched another label: %d."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:103
+msgid "Writing new file..."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:125
+#, c-format
+msgid "[%d] points and lines written to output file."
+msgstr ""
+
+#: ../vector/v.convert/old2new.c:139
+#, c-format
+msgid "[%d] centroids written to output file."
+msgstr ""
+
+#: ../vector/v.convert/main.c:36
+msgid "vector, import, conversion"
+msgstr ""
+
+#: ../vector/v.convert/main.c:37
+msgid "Imports older versions of GRASS vector maps."
+msgstr "Importă hărți vectoriale realizate în versiuni mai vechi de GRASS."
+
+#: ../vector/v.convert/main.c:54
+msgid "Endian of input vector map"
+msgstr ""
+
+#: ../vector/v.convert/att.c:36
+msgid "No category labels (dig_cats) found, no table created"
+msgstr ""
+
+#: ../vector/v.convert/att.c:41
+msgid "Unable to open dig_cats file"
+msgstr ""
+
+#: ../vector/v.convert/read.c:41
+msgid "Reading dig file..."
+msgstr ""
+
+#: ../vector/v.convert/read.c:82
+msgid "Input file is version 3."
+msgstr ""
+
+#: ../vector/v.convert/read.c:86
+msgid "Input file is version 4."
+msgstr ""
+
+#: ../vector/v.convert/read.c:96
+msgid "Input file is portable."
+msgstr ""
+
+#: ../vector/v.convert/read.c:99
+msgid "Input file is not portable. We will attempt to convert anyway but conversion may fail. Please read manual for detail information."
+msgstr ""
+
+#: ../vector/v.convert/read.c:185
+#, c-format
+msgid "[%d] points read to memory"
+msgstr ""
+
+#: ../vector/v.convert/read.c:186
+#, c-format
+msgid "[%d] lines read to memory"
+msgstr ""
+
+#: ../vector/v.convert/read.c:189
+#, c-format
+msgid "[%d] points read and written to output"
+msgstr ""
+
+#: ../vector/v.convert/read.c:190
+#, c-format
+msgid "[%d] lines read and written to output"
+msgstr ""
+
+#: ../vector/v.convert/read.c:192
+#, c-format
+msgid "[%d] area boundaries read and written to output"
+msgstr ""
+
+#: ../vector/v.convert/read.c:193
+#, c-format
+msgid "[%d] dead points skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:194
+#, c-format
+msgid "[%d] dead lines skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:195
+#, c-format
+msgid "[%d] dead area boundaries skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:196
+#, c-format
+msgid "[%d] elements of unknown type skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:198
+#, c-format
+msgid "[%d] elements read to memory"
+msgstr ""
+
+#: ../vector/v.convert/read.c:241
+msgid "Reading dig_att file..."
+msgstr ""
+
+#: ../vector/v.convert/read.c:249
+#, c-format
+msgid "Error: %s"
+msgstr "Eroare: %s"
+
+#: ../vector/v.convert/read.c:270
+#, c-format
+msgid "Unknown type: %c"
+msgstr "Tip necunoscut: %c"
+
+#: ../vector/v.convert/read.c:293
+#, c-format
+msgid "[%d] point categories read"
+msgstr ""
+
+#: ../vector/v.convert/read.c:294
+#, c-format
+msgid "[%d] line categories read"
+msgstr ""
+
+#: ../vector/v.convert/read.c:295
+#, c-format
+msgid "[%d] centroids read"
+msgstr ""
+
+#: ../vector/v.convert/read.c:296
+#, c-format
+msgid "[%d] dead point categories skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:297
+#, c-format
+msgid "[%d] dead line categories skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:298
+#, c-format
+msgid "[%d] dead centroids skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:299
+#, c-format
+msgid "[%d] categories of unknown type skipped"
+msgstr ""
+
+#: ../vector/v.convert/read.c:301
+#, c-format
+msgid "[%d] categories read into memory"
+msgstr ""
+
+#: ../vector/v.convert/type.c:29
+#, c-format
+msgid "OLD_T_NEW Got a bad type code [%x]"
+msgstr ""
+
+#: ../vector/v.convert/type.c:50
+#, c-format
+msgid "NEW_T_OLD Got a bad type code [%x]"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:150
+msgid "vector, buffer"
+msgstr "vector, zonă tampon (buffer)"
+
+#: ../vector/v.buffer2/main.c:152 ../vector/v.buffer/main.c:256
+msgid "Creates a buffer around features of given type (areas must contain centroid)."
+msgstr "Crează o zonă tampon în jurul trăsăturii pentru un tip dat (arealele trebuie să conțină centroizi)."
+
+#: ../vector/v.buffer2/main.c:170
+msgid "Buffer distance along major axis in map units"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:171 ../vector/v.buffer2/main.c:179
+#: ../vector/v.buffer2/main.c:187 ../vector/v.buffer2/main.c:193
+#: ../vector/v.buffer2/main.c:201 ../vector/v.buffer2/main.c:210
+msgid "Distance"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:178
+msgid "Buffer distance along minor axis in map units"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:186 ../vector/v.parallel2/main.c:74
+msgid "Angle of major axis in degrees"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:192
+msgid "Name of column to use for buffer distances"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:200 ../vector/v.buffer/main.c:286
+msgid "Scaling factor for attribute column values"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:209 ../vector/v.buffer/main.c:296
+msgid "Maximum distance between theoretical arc and polygon segments as multiple of buffer"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:225
+msgid "This is an alias to the distance option. It is retained for backwards compatibility"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:227 ../vector/v.buffer/main.c:271
+msgid "Buffer distance in map units"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:232
+msgid "Make outside corners straight"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:236
+msgid "Don't make caps at the ends of polylines"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:247
+msgid "Select a buffer distance/minordistance/angle or column, but not both."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:251 ../vector/v.buffer/main.c:319
+msgid "The bufcol option may contain bugs during the cleaning step. If you encounter problems, use the debug option or clean manually with v.clean tool=break; v.category step=0; v.extract -d type=area"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:262
+msgid "The bufcol option requires a valid layer."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:265
+msgid "The buffer option has been replaced by the distance option and will be removed in future."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:268
+msgid "Use the distance option instead of the buffer option."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:272
+msgid "The tolerance must be > 0."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:275
+#, c-format
+msgid "The tolerance was reset to %g"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:299
+#, c-format
+msgid "The tolerance in map units = %g"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:344
+#, c-format
+msgid "Unable to select data from table <%s>"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:380
+msgid "No features available for buffering. Check type option and features available in the input vector."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:394
+msgid "Buffering lines..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:423 ../vector/v.buffer2/main.c:495
+#: ../vector/v.buffer/main.c:473 ../vector/v.buffer/main.c:550
+#, c-format
+msgid "Attribute is of invalid size (%.3f) for category %d"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:437 ../vector/v.buffer2/main.c:509
+#: ../vector/v.buffer/main.c:335 ../vector/v.buffer/main.c:485
+#: ../vector/v.buffer/main.c:562
+#, c-format
+msgid "The tolerance in map units: %g"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:468
+msgid "Buffering areas..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:524
+msgid "Writing buffers..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:540 ../vector/v.buffer/main.c:607
+msgid "Building parts of topology..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:543 ../vector/v.buffer/main.c:619
+msgid "Snapping boundaries..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:546
+msgid "Breaking polygons..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:549 ../vector/v.buffer2/main.c:556
+#: ../vector/v.buffer/main.c:625 ../vector/v.overlay/area_area.c:114
+msgid "Removing duplicates..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:553 ../vector/v.buffer/main.c:622
+msgid "Breaking boundaries..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:559
+msgid "Cleaning boundaries at nodes"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:574 ../vector/v.buffer/main.c:637
+#: ../vector/v.overlay/area_area.c:157
+msgid "Attaching islands..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:580 ../vector/v.buffer2/main.c:673
+#: ../vector/v.buffer/main.c:644 ../vector/v.buffer/main.c:734
+msgid "Calculating centroids for areas..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:594 ../vector/v.buffer2/main.c:686
+#: ../vector/v.voronoi/dt_main.c:142 ../vector/v.buffer/main.c:663
+#: ../vector/v.buffer/main.c:750 ../vector/v.overlay/area_area.c:171
+#: ../vector/v.in.ogr/main.c:1065
+msgid "Cannot calculate area centroid"
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:611 ../vector/v.buffer/main.c:686
+msgid "Generating list of boundaries to be deleted..."
+msgstr ""
+
+#: ../vector/v.buffer2/main.c:644 ../vector/v.buffer/main.c:718
+msgid "Deleting boundaries..."
+msgstr ""
+
+#: ../vector/v.patch/main.c:69
+msgid "Create a new vector map layer by combining other vector map layers."
+msgstr "Crează o hartă vectorială prin combinarea altor hărți vectoriale."
+
+#: ../vector/v.patch/main.c:80
+msgid "Name for output vector map where bounding boxes of input vector maps are written to"
+msgstr ""
+
+#: ../vector/v.patch/main.c:84
+msgid "Append files to existing file (overwriting existing files must be activated)"
+msgstr ""
+
+#: ../vector/v.patch/main.c:89
+msgid "Copy also attribute table"
+msgstr ""
+
+#: ../vector/v.patch/main.c:91
+msgid "Only the table of layer 1 is currently supported"
+msgstr ""
+
+#: ../vector/v.patch/main.c:189
+msgid "Missing table"
+msgstr ""
+
+#: ../vector/v.patch/main.c:193
+msgid "Key columns differ"
+msgstr ""
+
+#: ../vector/v.patch/main.c:199
+msgid "Number of columns differ"
+msgstr ""
+
+#: ../vector/v.patch/main.c:211
+msgid "Column names differ"
+msgstr ""
+
+#: ../vector/v.patch/main.c:219
+msgid "Column types differ"
+msgstr ""
+
+#: ../vector/v.patch/main.c:224
+msgid "Length of string columns differ"
+msgstr ""
+
+#: ../vector/v.patch/main.c:238
+msgid "Key column not found"
+msgstr ""
+
+#: ../vector/v.patch/main.c:245
+msgid "The output map is not 3D"
+msgstr ""
+
+#: ../vector/v.patch/main.c:298
+#, c-format
+msgid "Patching vector map <%s@%s>..."
+msgstr ""
+
+#: ../vector/v.patch/main.c:322
+#, c-format
+msgid "Error reading vector map <%s> - some data may not be correct"
+msgstr ""
+
+#: ../vector/v.patch/main.c:364
+#, c-format
+msgid "Building topology for vector map <%s>..."
+msgstr ""
+
+#: ../vector/v.patch/main.c:370
+msgid "Intersections at borders will have to be snapped"
+msgstr ""
+
+#: ../vector/v.patch/main.c:371
+msgid "Lines common between files will have to be edited"
+msgstr ""
+
+#: ../vector/v.patch/main.c:372
+msgid "The header information also may have to be edited"
+msgstr ""
+
+#: ../vector/v.patch/main.c:374
+#, c-format
+msgid "%d vector maps patched"
+msgstr ""
+
+#: ../vector/v.patch/main.c:397
+#, c-format
+msgid "Cannot open select cursor: '%s'"
+msgstr ""
+
+#: ../vector/v.patch/main.c:408
+msgid "Cannot fetch row"
+msgstr ""
+
+#: ../vector/v.patch/main.c:459
+msgid "Unknown column type"
+msgstr ""
+
+#: ../vector/v.patch/main.c:467
+#, c-format
+msgid "Cannot insert new record: '%s'"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:57
+msgid "vector, import, sites"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:59
+msgid "Converts a GRASS site_lists file into a vector map."
+msgstr "Convertește un fișier cu liste de situri GRASS în hartă vectorială."
+
+#: ../vector/v.in.sites/main.c:83
+#, c-format
+msgid "Site file <%s> not found"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:86
+#, c-format
+msgid "Unable to open site file <%s@%s>"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:89
+msgid "Unable to guess site_list format"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:92
+msgid "Failed to allocate site structure"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:94
+#, c-format
+msgid "Input format: dimension: %d strings: %d FP: %d"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:98
+msgid "Floating point category values, using sequential integer for category"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:101
+msgid "No category values, using sequential integer for category"
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:183
+msgid "Transferring sites to vector point map..."
+msgstr ""
+
+#: ../vector/v.in.sites/main.c:255
+#, c-format
+msgid "%d sites written."
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:97
+msgid "vector, network, salesman"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:99
+msgid "Creates a cycle connecting given nodes (Traveling salesman problem)."
+msgstr "Crearea de ciclu conectat la anumite noduri (Problema 'vânzătorului călător')."
+
+#: ../vector/v.net.salesman/main.c:101
+msgid "Note that TSP is NP-hard, heuristic algorithm is used by this module and created cycle may be sub optimal"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:119
+msgid "Node layer (used for cities)"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:125 ../vector/v.net.steiner/main.c:375
+msgid "Arcs' cost column (for both directions)"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:130
+msgid "Categories of points ('cities') on nodes (layer is specified by nlayer)"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:193
+#, c-format
+msgid "Number of cities: [%d]"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:195
+msgid "Not enough cities (< 2)"
+msgstr ""
+
+#: ../vector/v.net.salesman/main.c:227
+#, c-format
+msgid "Destination node [%d] is unreachable from node [%d]"
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:110
+msgid "vector, geometry, topology"
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:111
+msgid "Builds polylines from lines or boundaries."
+msgstr "Construiește polinii din linii sau limite."
+
+#: ../vector/v.build.polylines/main.c:121
+msgid "Category number mode"
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:123
+msgid "no;Do not assign any category number to polyline;first;Assign category number of first line to polyline;multi;Assign multiple category numbers to polyline"
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:225
+#, c-format
+msgid "%d lines or boundaries found in vector map <%s@%s>"
+msgstr ""
+
+#: ../vector/v.build.polylines/main.c:227
+#, c-format
+msgid "%d polylines stored in vector map <%s@%s>"
+msgstr ""
+
+#: ../vector/v.net.path/main.c:42
+msgid "Finds shortest path on vector network."
+msgstr "Găsește calea cea mai scurtă a unei rețele vectoriale."
+
+#: ../vector/v.net.path/main.c:65
+msgid "Name of file containing start and end points. If not given, read from stdin"
+msgstr ""
+
+#: ../vector/v.net.path/main.c:92
+msgid "Maximum distance to the network"
+msgstr ""
+
+#: ../vector/v.net.path/main.c:93
+msgid "If start/end are given as coordinates. If start/end point is outside this threshold, the path is not found and error message is printed. To speed up the process, keep this value as low as possible."
+msgstr ""
+
+#: ../vector/v.net.path/main.c:106
+msgid "Write output as original input segments, not each path as one line."
+msgstr ""
+
+#: ../vector/v.net.path/path.c:82
+#, c-format
+msgid "[%d] points without category (nfield: [%d])"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:149 ../vector/v.net.timetable/main.c:444
+#, c-format
+msgid "Wrong input format: %s"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:168 ../vector/v.net.path/path.c:186
+#, c-format
+msgid "No point with category [%d]"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:205
+#, c-format
+msgid "Point with category [%d] is not reachable from point with category [%d]"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:262
+#, c-format
+msgid "Point %f,%f is not reachable from point %f,%f"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:327
+#, c-format
+msgid "[%d] input format errors"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:329
+#, c-format
+msgid "[%d] points of given category missing"
+msgstr ""
+
+#: ../vector/v.net.path/path.c:331
+#, c-format
+msgid "%d destination(s) unreachable (including points out of threshold)"
+msgstr ""
+
+#: ../vector/v.out.pov/main.c:210
+#, c-format
+msgid "%d features written"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:175
+msgid "Create points along input lines in new vector with 2 layers."
+msgstr "Crează puncte de-a lungul liniilor de intrare în vector nou cu 2 straturi."
+
+#: ../vector/v.to.points/main.c:178 ../vector/v.lrs/v.lrs.segment/main.c:76
+#: ../vector/v.lrs/v.lrs.create/main.c:126
+#: ../vector/v.lrs/v.lrs.where/main.c:65
+#: ../vector/v.lrs/v.lrs.label/main.c:107
+msgid "Input vector map containing lines"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:182
+msgid "Output vector map where points will be written"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:194
+msgid "Write line nodes"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:198
+msgid "Write line vertices"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:202
+msgid "Interpolate points between line vertices"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:209
+msgid "Maximum distance between points in map units"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:213 ../vector/v.voronoi/vo_main.c:140
+#: ../vector/v.overlay/main.c:132 ../vector/v.select/args.c:80
+#: ../vector/v.in.ogr/main.c:218
+msgid "Do not create attribute table"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:229
+msgid "Use either -n or -v flag, not both"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:273 ../vector/v.generalize/misc.c:177
+#, c-format
+msgid "Unable to copy table <%s>"
+msgstr ""
+
+#: ../vector/v.to.points/main.c:384
+#, c-format
+msgid "%d points written to output vector map"
+msgstr ""
+
+#: ../vector/v.label.sa/font.c:55
+#, c-format
+msgid "%s: Unable to read font definition file; use the default"
+msgstr ""
+
+#: ../vector/v.label.sa/font.c:61
+#, c-format
+msgid "%s: No font definition file"
+msgstr ""
+
+#: ../vector/v.label.sa/main.c:56
+msgid "Create optimally placed labels for vector map(s)"
+msgstr "Crează etichete plasate optim pe o hartă vectorială"
+
+#: ../vector/v.label.sa/main.c:117
+msgid "Name of TrueType font (as listed in the fontcap)"
+msgstr ""
+
+#: ../vector/v.label.sa/main.c:130
+msgid "Icon size of point features (in map-units)"
+msgstr ""
+
+#: ../vector/v.label.sa/main.c:200
+msgid "Border width (only for ps.map output)"
+msgstr ""
+
+#: ../vector/v.label.sa/main.c:207
+msgid "Numeric column to give precedence in case of overlapping labels. The label with a smaller weight is hidden."
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:73
+#, c-format
+msgid "Cannot allocate %d bytes of memory"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:95
+#, c-format
+msgid "Unable to find font '%s'\n"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:97
+#, c-format
+msgid "Font '%s' is not a FreeType font\n"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:101
+msgid "Font file format is not supported by FreeType"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:103
+msgid "Font file can not be loaded"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:112
+msgid "Unable to set font size"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:133
+msgid "Cannot allocate more memory"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:223
+#, c-format
+msgid "Cannot load overlap weights. Column %s is not of numeric type in table <%s>"
+msgstr ""
+
+#: ../vector/v.label.sa/labels.c:281
+#, c-format
+msgid "Cannot load glyph for '%c'"
+msgstr ""
+
+#: ../vector/v.clean/rmdac.c:61
+#, c-format
+msgid "Duplicate area centroids: %d"
+msgstr ""
+
+#: ../vector/v.clean/rmline.c:62
+#, c-format
+msgid "Lines / boundaries removed: %d"
+msgstr ""
+
+#: ../vector/v.clean/main.c:44
+msgid "Toolset for cleaning topology of vector map."
+msgstr "Set de intrumente pentru curățarea topologiei hărții vectoriale."
+
+#: ../vector/v.clean/main.c:53
+msgid "Name of output map where errors are written"
+msgstr ""
+
+#: ../vector/v.clean/main.c:64
+msgid "Cleaning tool"
+msgstr ""
+
+#: ../vector/v.clean/main.c:66
+msgid "break;break lines at each intersection;rmdupl;remove duplicate geometry features (pay attention to categories!);rmdangle;remove dangles, threshold ignored if < 0;chdangle;change the type of boundary dangle to line, threshold ignored if < 0, input line type is ignored;rmbridge;remove bridges connecting area and island or 2 islands;chbridge;change the type of bridges connecting area and island or 2 islands from boundary to line;snap;snap lines to vertex in threshold;rmdac;remove duplicate area centroids ('type' option ignored);bpol;break (topologically clean) polygons (imported from non topological format, like ShapeFile). Boundaries are broken on each point shared between 2 and more polygons where angles of segments are different;prune;remove vertices in threshold from lines and boundaries, boundary is pruned only if topology is not damaged (new intersection, changed attachment of centroid), first and last segment of the boundary is never changed;rmarea;remove small areas, the longest boundary with adjacent area is removed;rmline;remove all lines or boundaries of zero length, threshold is ignored;rmsa;remove small angles between lines at nodes"
+msgstr ""
+
+#: ../vector/v.clean/main.c:94
+msgid "Threshold in map units, one value for each tool (default: 0.0[,0.0,...])"
+msgstr ""
+
+#: ../vector/v.clean/main.c:100
+msgid "Don't build topology for the output vector"
+msgstr ""
+
+#: ../vector/v.clean/main.c:121
+msgid "You must select at least one tool"
+msgstr ""
+
+#: ../vector/v.clean/main.c:156
+msgid "Tool doesn't exist"
+msgstr ""
+
+#: ../vector/v.clean/main.c:176
+#, c-format
+msgid "Threshold for tool %d may not be > 0, set to 0"
+msgstr ""
+
+#: ../vector/v.clean/main.c:185
+msgid "Tool: Threshold"
+msgstr ""
+
+#: ../vector/v.clean/main.c:190
+msgid "Break"
+msgstr ""
+
+#: ../vector/v.clean/main.c:193
+msgid "Remove duplicates"
+msgstr ""
+
+#: ../vector/v.clean/main.c:196
+msgid "Remove dangles"
+msgstr ""
+
+#: ../vector/v.clean/main.c:199
+msgid "Change type of boundary dangles"
+msgstr ""
+
+#: ../vector/v.clean/main.c:203
+msgid "Remove bridges"
+msgstr ""
+
+#: ../vector/v.clean/main.c:206
+msgid "Change type of boundary bridges"
+msgstr ""
+
+#: ../vector/v.clean/main.c:210
+msgid "Snap vertices"
+msgstr ""
+
+#: ../vector/v.clean/main.c:213
+msgid "Remove duplicate area centroids"
+msgstr ""
+
+#: ../vector/v.clean/main.c:217
+msgid "Break polygons"
+msgstr ""
+
+#: ../vector/v.clean/main.c:220
+msgid "Prune"
+msgstr ""
+
+#: ../vector/v.clean/main.c:223
+msgid "Remove small areas"
+msgstr ""
+
+#: ../vector/v.clean/main.c:226
+msgid "Remove small angles at nodes"
+msgstr ""
+
+#: ../vector/v.clean/main.c:231
+msgid "Remove all lines or boundaries of zero length"
+msgstr ""
+
+#: ../vector/v.clean/main.c:273
+msgid "Copying vector lines..."
+msgstr ""
+
+#: ../vector/v.clean/main.c:295 ../vector/v.clean/main.c:305
+msgid "Rebuilding parts of topology..."
+msgstr ""
+
+#: ../vector/v.clean/main.c:313
+msgid "Tool: Break lines at intersections"
+msgstr ""
+
+#: ../vector/v.clean/main.c:317
+msgid "Tool: Remove duplicates"
+msgstr ""
+
+#: ../vector/v.clean/main.c:321
+msgid "Tool: Remove dangles"
+msgstr ""
+
+#: ../vector/v.clean/main.c:325
+msgid "Tool: Change type of boundary dangles"
+msgstr ""
+
+#: ../vector/v.clean/main.c:329
+msgid "Tool: Remove bridges"
+msgstr ""
+
+#: ../vector/v.clean/main.c:333
+msgid "Tool: Change type of boundary bridges"
+msgstr ""
+
+#: ../vector/v.clean/main.c:337
+msgid "Tool: Remove duplicate area centroids"
+msgstr ""
+
+#: ../vector/v.clean/main.c:341
+msgid "Tool: Snap line to vertex in threshold"
+msgstr ""
+
+#: ../vector/v.clean/main.c:345
+msgid "Tool: Break polygons"
+msgstr ""
+
+#: ../vector/v.clean/main.c:349
+msgid "Tool: Prune lines/boundaries"
+msgstr ""
+
+#: ../vector/v.clean/main.c:353
+msgid "Tool: Remove small areas"
+msgstr ""
+
+#: ../vector/v.clean/main.c:356
+#, c-format
+msgid "%d areas of total size %g removed"
+msgstr ""
+
+#: ../vector/v.clean/main.c:359
+msgid "Tool: Remove small angles at nodes"
+msgstr ""
+
+#: ../vector/v.clean/main.c:362
+#, c-format
+msgid "%d modifications done"
+msgstr ""
+
+#: ../vector/v.clean/main.c:365
+msgid "Tool: Remove all lines and boundaries of zero length"
+msgstr ""
+
+#: ../vector/v.clean/main.c:367
+#, c-format
+msgid "%d lines / boundaries removed"
+msgstr ""
+
+#: ../vector/v.clean/main.c:375
+msgid "Rebuilding topology for output vector map..."
+msgstr ""
+
+#: ../vector/v.clean/main.c:386
+msgid "Building topology for error vector map..."
+msgstr ""
+
+#: ../vector/v.clean/prune.c:217
+#, c-format
+msgid ""
+"\n"
+"%d vertices from input %d (vertices of given type) removed, i.e. %.2f %%"
+msgstr ""
+
+#: ../vector/v.clean/prune.c:221
+#, c-format
+msgid "%d boundaries not pruned because pruning would damage topology"
+msgstr ""
+
+#: ../vector/v.db.select/main.c:54
+msgid "Prints vector map attributes."
+msgstr "Printează aytibutele hărții vectoriale."
+
+#: ../vector/v.db.select/main.c:89
+msgid "Print minimal region extent of selected vector features instead of attributes"
+msgstr ""
+
+#: ../vector/v.db.select/main.c:141
+#, c-format
+msgid "Unable to open vector map <%s> at topology level. Flag '%c' requires topology level."
+msgstr ""
+
+#: ../vector/v.db.select/main.c:176
+msgid "Unable to open select cursor"
+msgstr ""
+
+#: ../vector/v.db.select/main.c:197 ../vector/v.reclass/main.c:247
+#, c-format
+msgid "Unable to fetch data from table <%s>"
+msgstr ""
+
+#: ../vector/v.db.select/main.c:243
+#, c-format
+msgid "Unable to get bounding box of area %d"
+msgstr ""
+
+#: ../vector/v.db.select/main.c:248
+#, c-format
+msgid "Unable to get bounding box of line %d"
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:121
+msgid "Creates a Voronoi diagram from an input vector map containing points or centroids."
+msgstr "Crează diagrama Voronoi dintr-o hartă vectorială de intrare care conține puncte sau centrozi."
+
+#: ../vector/v.voronoi/vo_main.c:136
+msgid "Output tessellation as a graph (lines), not areas"
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:179
+msgid "Reading sites..."
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:189
+msgid "Voronoi triangulation..."
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:271
+msgid "Writing sites to output..."
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:344 ../vector/v.extract/main.c:466
+msgid "No table"
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:359
+msgid "Cannot copy table"
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:415
+msgid "Output needs topological cleaning"
+msgstr ""
+
+#: ../vector/v.voronoi/vo_main.c:447
+msgid "Removing incorrect boundaries from output"
+msgstr ""
+
+#: ../vector/v.voronoi/dt_main.c:149
+msgid "Cannot calculate area centroid z coordinate"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:129
+msgid "Count points in areas, calculate statistics."
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:133
+msgid "Name of existing vector map with points"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:138
+msgid "Name of existing vector map with areas"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:150
+msgid "Layer number for points map"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:154
+msgid "Layer number for area map"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:170
+msgid "Method for aggregate statistics"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:177
+msgid "Column name of points map to use for statistics"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:178
+msgid "Column of points map must be numeric"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:185
+msgid "Column name to upload points count"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:187
+msgid "Column to hold points count, must be of type integer, will be created if not existing"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:194
+msgid "Column name to upload statistics"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:196
+msgid "Column to hold statistics, must be of type double, will be created if not existing"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:206
+msgid "Print output to stdout, do not update attribute table"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:207
+msgid "First column is always area category"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:261 ../vector/v.distance/main.c:306
+#, c-format
+msgid "Vector map <%s> is not in user mapset and cannot be updated"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:308 ../vector/v.vect.stats/main.c:384
+#, c-format
+msgid "Unable to open database <%s> with driver <%s>"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:312
+msgid "ccolumn is required to upload point counts"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:321
+msgid "ccolumn must be of type integer"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:334 ../vector/v.vect.stats/main.c:364
+#, c-format
+msgid "Unable to add column <%s>"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:340
+msgid "scolumn is required to upload point stats"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:351
+msgid "scolumn must be of type double"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:375
+msgid "collecting attributes from points vector..."
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:407
+msgid "column for points vector must be numeric"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:481
+msgid "creating spatial index"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:484
+msgid "Selecting points for each area..."
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:581
+#, c-format
+msgid "could not find area category %d"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:709 ../vector/v.distance/main.c:1151
+#: ../vector/v.what.rast/main.c:377
+#, c-format
+msgid "%d records updated"
+msgstr ""
+
+#: ../vector/v.vect.stats/main.c:711 ../vector/v.distance/main.c:1153
+#: ../vector/v.what.rast/main.c:378
+#, c-format
+msgid "%d update errors"
+msgstr ""
+
+#: ../vector/v.univar/main.c:95
+msgid "Calculates univariate statistics for attribute. Variance and standard deviation is calculated only for points if specified."
+msgstr "Calculează statistici univariate pentru atribute. Varianța și deviația standard sunt calculate doar pentru punctele specificate."
+
+#: ../vector/v.univar/main.c:111
+msgid "Column name"
+msgstr "Numele coloanei"
+
+#: ../vector/v.univar/main.c:136
+msgid "Calculate geometry distances instead of table data."
+msgstr ""
+
+#: ../vector/v.univar/main.c:144
+#, c-format
+msgid "The '-%c' flag is currently broken, please use v.distance instead."
+msgstr ""
+
+#: ../vector/v.univar/main.c:149
+#, c-format
+msgid ""
+"Required parameter <%s> not set:\n"
+"\t(%s)"
+msgstr ""
+
+#: ../vector/v.univar/main.c:175
+msgid "Incompatible vector type(s) specified, only number of features, minimum, maximum and range can be calculated"
+msgstr ""
+
+#: ../vector/v.univar/main.c:180
+msgid "Extended statistics is currently supported only for points/centroids"
+msgstr ""
+
+#: ../vector/v.univar/main.c:220
+#, c-format
+msgid "Unable select categories from table <%s>"
+msgstr ""
+
+#: ../vector/v.univar/main.c:311
+#, c-format
+msgid " Database connection not defined for layer <%s>"
+msgstr ""
+
+#: ../vector/v.univar/main.c:605
+msgid "Cannot sort the key/value array"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:86
+msgid "Surface interpolation from vector point data by Inverse Distance Squared Weighting."
+msgstr "Interpolarea suprafeței din puncte vectoriale în funcție de Inversul Distanței de Pondere Pătratică."
+
+#: ../vector/v.surf.idw/main.c:95
+msgid "If set to 0, z coordinates are used (3D vector only)"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:98 ../vector/v.surf.idw/main.c:106
+msgid "Values"
+msgstr "Valori"
+
+#: ../vector/v.surf.idw/main.c:104
+msgid "Attribute table column with values to interpolate"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:105
+msgid "Required if layer > 0"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:122
+msgid "Power parameter; greater values assign greater influence to closer points"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:127
+msgid "Don't index points by raster cell"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:128
+msgid "Slower but uses less memory and includes points from outside region in the interpolation"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:147
+msgid "No attribute column specified"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:182
+msgid "No data points found"
+msgstr ""
+
+#: ../vector/v.surf.idw/main.c:267
+#, c-format
+msgid "Interpolating raster map <%s> (%d rows, %d cols)... "
+msgstr ""
+
+#: ../vector/v.surf.idw/read_sites.c:86
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:225
+#, c-format
+msgid "No record for point (cat = %d)"
+msgstr ""
+
+#: ../vector/v.surf.idw/read_sites.c:102
+#, c-format
+msgid "%d points loaded"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:67
+#, c-format
+msgid "Performing 1 arg map function on map %s"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:78
+#, c-format
+msgid "Performing 2 arg map function on maps %s and %s"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:90
+#, c-format
+msgid "Performing map %s + %s"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:264
+msgid "Can't call bad map-function"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:276
+#, c-format
+msgid "Bad arguments to mapfunc %s (argc = %d)"
+msgstr ""
+
+#: ../vector/v.mapcalc/map.c:300
+#, c-format
+msgid "No function defined to perform map %c map"
+msgstr ""
+
+#: ../vector/v.mapcalc/number.c:159
+msgid "Can't call bad num-function"
+msgstr ""
+
+#: ../vector/v.mapcalc/number.c:189
+#, c-format
+msgid "Bad arguments to numfunc %s"
+msgstr ""
+
+#: ../vector/v.mapcalc/number.c:213
+#, c-format
+msgid "No function defined to perform ``number %c number''"
+msgstr ""
+
+#: ../vector/v.mapcalc/number.c:216 ../vector/v.mapcalc/vector.c:304
+#, c-format
+msgid "No function defined to perform ``point %c point''"
+msgstr ""
+
+#: ../vector/v.mapcalc/any.c:116
+msgid "Can't call bad any-function"
+msgstr ""
+
+#: ../vector/v.mapcalc/any.c:128
+#, c-format
+msgid "Bad arguments to anyfunc %s (argc = %d)"
+msgstr ""
+
+#: ../vector/v.mapcalc/vector.c:244
+msgid "Can't call bad function"
+msgstr ""
+
+#: ../vector/v.mapcalc/vector.c:281
+#, c-format
+msgid "Bad arguments to pointfunc %s"
+msgstr ""
+
+#: ../vector/v.class/main.c:47
+msgid "Classifies attribute data, e.g. for thematic mapping"
+msgstr "Clasifică datele de atribut, de ex. pentru cartografierea tematică"
+
+#: ../vector/v.class/main.c:58
+msgid "Column name or expression"
+msgstr ""
+
+#: ../vector/v.class/main.c:85
+msgid "Print only class breaks (without min and max)"
+msgstr ""
+
+#: ../vector/v.class/main.c:166
+msgid "The discontinuities algorithm indicates that some class breaks are not statistically significant at alpha=0.05. You are advised to reduce the number of classes."
+msgstr ""
+
+#: ../vector/v.class/main.c:193
+#, c-format
+msgid ""
+"\n"
+"Classification of %s into %i classes\n"
+msgstr ""
+
+#: ../vector/v.class/main.c:200
+#, c-format
+msgid "Lowest chi2 = %f\n"
+msgstr ""
+
+#: ../vector/v.class/main.c:206
+#, c-format
+msgid ""
+"%15s%15s%15s\n"
+"\n"
+msgstr ""
+
+#: ../vector/v.class/main.c:218
+#, c-format
+msgid ""
+"\n"
+"Note: Minimum of first class is including\n"
+"\n"
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:60
+msgid "Computes the shortest path between all pairs of nodes in the network."
+msgstr "Calculează calea cea mai scurtă dintre toate perechile de noduri din rețea."
+
+#: ../vector/v.net.allpairs/main.c:77 ../vector/v.net.centrality/main.c:115
+msgid "Name of arc forward/both direction(s) cost column"
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:78 ../vector/v.net.allpairs/main.c:84
+#: ../vector/v.net.centrality/main.c:116 ../vector/v.net.centrality/main.c:122
+msgid "Cost"
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:83 ../vector/v.net.centrality/main.c:121
+msgid "Name of arc backward direction cost column"
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:93
+msgid "Add points on nodes without points"
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:209
+msgid "New points are excluded from shortest path calculations."
+msgstr ""
+
+#: ../vector/v.net.allpairs/main.c:219 ../vector/v.net.centrality/main.c:311
+msgid "Writing data into the table..."
+msgstr ""
+
+#: ../vector/v.drape/main.c:166
+msgid "vector, geometry, sampling"
+msgstr ""
+
+#: ../vector/v.drape/main.c:168
+msgid "Converts vector map to 3D by sampling of elevation raster map."
+msgstr "Convertește harta vectorială 3D în funcție de harta raster de elevație."
+
+#: ../vector/v.drape/main.c:180
+msgid "Elevation raster map for height extraction"
+msgstr ""
+
+#: ../vector/v.drape/main.c:194
+msgid "Sampling method"
+msgstr ""
+
+#: ../vector/v.drape/main.c:199
+msgid "Scale sampled raster values"
+msgstr ""
+
+#: ../vector/v.drape/main.c:206
+msgid "Layer is only used for WHERE SQL statement"
+msgstr ""
+
+#: ../vector/v.drape/main.c:211
+msgid "Vector Z value for unknown height"
+msgstr ""
+
+#: ../vector/v.drape/main.c:213
+msgid "Will set Z to this value, if value from raster map can not be read"
+msgstr ""
+
+#: ../vector/v.drape/main.c:220 ../vector/v.extract/main.c:204
+msgid "Layer 0 not supported"
+msgstr ""
+
+#: ../vector/v.drape/main.c:305
+msgid "No features match Your query"
+msgstr ""
+
+#: ../vector/v.drape/main.c:407 ../vector/v.drape/main.c:417
+msgid "Due to error attribute data to new map are not transferred"
+msgstr ""
+
+#: ../vector/v.drape/main.c:425
+msgid "No features drapped. Check Your computational region and input raster map."
+msgstr ""
+
+#: ../vector/v.buffer/main.c:223 ../vector/v.overlay/main.c:551
+msgid "Rebuilding topology..."
+msgstr ""
+
+#: ../vector/v.buffer/main.c:254
+msgid "vector, geometry, buffer"
+msgstr ""
+
+#: ../vector/v.buffer/main.c:278
+msgid "Attribute column to use for buffer distances"
+msgstr ""
+
+#: ../vector/v.buffer/main.c:305
+msgid "Stop the process at a certain stage"
+msgstr ""
+
+#: ../vector/v.buffer/main.c:342
+#, c-format
+msgid "The tolerance was reset to %g (map units)"
+msgstr ""
+
+#: ../vector/v.buffer/main.c:432
+msgid "Lines buffers... "
+msgstr ""
+
+#: ../vector/v.buffer/main.c:492 ../vector/v.buffer/main.c:569
+#, c-format
+msgid "The tolerance was reset to %g (map units). [category %d]"
+msgstr ""
+
+#: ../vector/v.buffer/main.c:509
+msgid "Areas buffers... "
+msgstr ""
+
+#: ../vector/v.buffer/main.c:760 ../vector/v.overlay/area_area.c:372
+msgid "Attaching centroids..."
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:65
+msgid "Creates a GRASS vector map of a user-defined grid."
+msgstr "Crează o hartă vectorială GRASS pentru gridul definit de utilizator."
+
+#: ../vector/v.mkgrid/main.c:76
+msgid "Number of rows and columns in grid"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:85
+msgid "Where to place the grid"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:86
+msgid "region;current region;coor;use 'coor' and 'box' options"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:96
+msgid "Lower left easting and northing coordinates of map"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:104
+msgid "Width and height of boxes in grid"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:111
+msgid "Angle of rotation (in degrees counter-clockwise)"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:119
+msgid "Number of horizontal vertex points per grid cell"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:126
+msgid "Create grid of points instead of areas and centroids"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:131
+msgid "Quiet; No chatter"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:189
+msgid "'coor' option missing"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:192
+msgid "'box' option missing"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:196
+msgid "Invalid easting"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:199
+msgid "Invalid northing"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:203 ../vector/v.mkgrid/main.c:206
+msgid "Invalid distance"
+msgstr ""
+
+#: ../vector/v.mkgrid/main.c:272
+msgid "Creating centroids..."
+msgstr ""
+
+#: ../vector/v.mkgrid/write_grid.c:42
+msgid "Writing out vector rows..."
+msgstr ""
+
+#: ../vector/v.mkgrid/write_grid.c:79
+msgid "Writing out vector columns..."
+msgstr ""
+
+#: ../vector/v.extract/main.c:91
+msgid "vector, extract"
+msgstr ""
+
+#: ../vector/v.extract/main.c:93
+msgid "Selects vector objects from an existing vector map and creates a new map containing only the selected objects."
+msgstr "Selectează obiectele vectoriale dintr-o hartă vectorială existentă și crează o hartă nouă care să conțină doar obiectele selectate."
+
+#: ../vector/v.extract/main.c:98
+msgid "Dissolve common boundaries (default is no)"
+msgstr ""
+
+#: ../vector/v.extract/main.c:102
+msgid "Do not copy table (see also 'new' parameter)"
+msgstr ""
+
+#: ../vector/v.extract/main.c:106 ../vector/v.edit/args.c:201
+#: ../vector/v.select/args.c:88
+msgid "Reverse selection"
+msgstr ""
+
+#: ../vector/v.extract/main.c:116
+msgid "Types to be extracted"
+msgstr ""
+
+#: ../vector/v.extract/main.c:122
+msgid "Layer number (if -1, all features in all layers of given type are extracted)"
+msgstr ""
+
+#: ../vector/v.extract/main.c:136
+msgid "Input text file with category numbers/number ranges to be extracted"
+msgstr ""
+
+#: ../vector/v.extract/main.c:137
+msgid "If '-' given reads from standard input"
+msgstr ""
+
+#: ../vector/v.extract/main.c:145
+msgid "Number of random categories matching vector objects to extract"
+msgstr ""
+
+#: ../vector/v.extract/main.c:147
+msgid "Number must be smaller than unique cat count in layer"
+msgstr ""
+
+#: ../vector/v.extract/main.c:156
+msgid "Enter -1 to keep original categories or the desired NEW category value"
+msgstr ""
+
+#: ../vector/v.extract/main.c:157
+msgid "If new >= 0, table is not copied"
+msgstr ""
+
+#: ../vector/v.extract/main.c:175
+msgid "List, file, where and random options are exclusive. Please specify only one of them"
+msgstr ""
+
+#: ../vector/v.extract/main.c:228
+#, c-format
+msgid "Category value in '%s' not valid"
+msgstr ""
+
+#: ../vector/v.extract/main.c:244
+#, c-format
+msgid "Process file <%s> for category numbers"
+msgstr ""
+
+#: ../vector/v.extract/main.c:249
+#, c-format
+msgid "Unable to open specified file <%s>"
+msgstr ""
+
+#: ../vector/v.extract/main.c:259
+#, c-format
+msgid "Ignored text entry: %s"
+msgstr ""
+
+#: ../vector/v.extract/main.c:297
+#, c-format
+msgid "Unable select records from table <%s>"
+msgstr ""
+
+#: ../vector/v.extract/main.c:298
+#, c-format
+msgid "%d categories loaded from table <%s>"
+msgstr ""
+
+#: ../vector/v.extract/main.c:313
+msgid "This map has no categories attached. Use v.category to attach categories to this vector map."
+msgstr ""
+
+#: ../vector/v.extract/main.c:319
+msgid "Please specify random number larger than 0"
+msgstr ""
+
+#: ../vector/v.extract/main.c:323
+#, c-format
+msgid "Random category count must be smaller than feature count. There are only %d features of type(s): %s"
+msgstr ""
+
+#: ../vector/v.extract/main.c:346
+#, c-format
+msgid "Random category count is larger or equal to uniq \"%s\" feature category count %d"
+msgstr ""
+
+#: ../vector/v.extract/main.c:383
+msgid "Extracting features..."
+msgstr ""
+
+#: ../vector/v.extract/main.c:428 ../vector/v.select/main.c:480
+#: ../vector/v.generalize/misc.c:127
+msgid "Writing attributes..."
+msgstr ""
+
+#: ../vector/v.extract/main.c:481 ../vector/v.in.db/main.c:225
+msgid "Unable to copy table"
+msgstr ""
+
+#: ../vector/v.extract/main.c:498
+msgid "Removing duplicate centroids..."
+msgstr ""
+
+#: ../vector/v.segment/main.c:54
+msgid "Creates points/segments from input vector lines and positions."
+msgstr "Crează puncte/segmente din liniile vectoriale de intrare și poziții."
+
+#: ../vector/v.segment/main.c:57
+msgid "Name of input vector map containing lines"
+msgstr ""
+
+#: ../vector/v.segment/main.c:61
+msgid "Name for output vector map where segments will be written"
+msgstr ""
+
+#: ../vector/v.segment/main.c:66 ../vector/v.lrs/v.lrs.segment/main.c:85
+#: ../vector/v.lrs/v.lrs.create/main.c:145
+#: ../vector/v.lrs/v.lrs.where/main.c:74
+#: ../vector/v.lrs/v.lrs.label/main.c:116
+msgid "Line layer"
+msgstr ""
+
+#: ../vector/v.segment/main.c:71 ../vector/v.lrs/v.lrs.segment/main.c:112
+msgid "Name of file containing segment rules. If not given, read from stdin."
+msgstr ""
+
+#: ../vector/v.segment/main.c:137 ../vector/v.segment/main.c:177
+#, c-format
+msgid "Unable to read input: %s"
+msgstr ""
+
+#: ../vector/v.segment/main.c:147 ../vector/v.segment/main.c:186
+#, c-format
+msgid "Unable to find line of cat %d"
+msgstr ""
+
+#: ../vector/v.segment/main.c:157
+#, c-format
+msgid ""
+"Unable to get point on line: cat = %d offset = %f (line length = %.15g)\n"
+"%s"
+msgstr ""
+
+#: ../vector/v.segment/main.c:194
+msgid "End of segment > line length -> cut"
+msgstr ""
+
+#: ../vector/v.segment/main.c:200
+#, c-format
+msgid ""
+"Unable to make line segment: cat = %d : %f - %f (line length = %.15g)\n"
+"%s"
+msgstr ""
+
+#: ../vector/v.segment/main.c:222 ../vector/v.lrs/v.lrs.segment/main.c:331
+#, c-format
+msgid "Incorrect segment type: %s"
+msgstr ""
+
+#: ../vector/v.segment/main.c:227
+#, c-format
+msgid "%d points read from input"
+msgstr ""
+
+#: ../vector/v.segment/main.c:228
+#, c-format
+msgid "%d points written to output map (%d lost)"
+msgstr ""
+
+#: ../vector/v.segment/main.c:230
+#, c-format
+msgid "%d lines read from input"
+msgstr ""
+
+#: ../vector/v.segment/main.c:231
+#, c-format
+msgid "%d lines written to output map (%d lost)"
+msgstr ""
+
+#: ../vector/v.out.vtk/head.c:27
+msgid "writeVTKHeader: Writing VTK-Header"
+msgstr ""
+
+#: ../vector/v.out.vtk/writeVTK.c:188
+msgid "No coordinates to generate the output! Maybe an empty vector type chosen?"
+msgstr ""
+
+#: ../vector/v.out.vtk/writeVTK.c:623
+msgid "Cannot export attribute table fields for layer < 1. Skipping export"
+msgstr ""
+
+#: ../vector/v.out.vtk/writeVTK.c:631
+msgid "No attribute table found"
+msgstr ""
+
+#: ../vector/v.out.vtk/writeVTK.c:663
+msgid "No numerical attributes found. Skipping export"
+msgstr ""
+
+#: ../vector/v.out.vtk/writeVTK.c:717 ../vector/v.out.vtk/writeVTK.c:744
+#: ../vector/v.out.vtk/writeVTK.c:771 ../vector/v.out.vtk/writeVTK.c:797
+#, c-format
+msgid "Error reading value of attribute '%s'"
+msgstr ""
+
+#: ../vector/v.out.vtk/main.c:48
+msgid "Converts a GRASS binary vector map to VTK ASCII output."
+msgstr "Convertește hartă vectorială binară GRASS în fișier ASCII VTK."
+
+#: ../vector/v.out.vtk/main.c:58
+msgid "Path to resulting VTK file"
+msgstr ""
+
+#: ../vector/v.out.vtk/main.c:93
+msgid "Export numeric attribute table fields as VTK scalar variables"
+msgstr ""
+
+#: ../vector/v.out.vtk/main.c:188
+msgid "dp has to be from 0 to 8"
+msgstr ""
+
+#: ../vector/v.out.vtk/main.c:197
+msgid "Failed to interpret 'layer' parameter as an integer"
+msgstr ""
+
+#: ../vector/v.hull/main.c:141
+msgid "Simple planar hulls not implemented yet"
+msgstr ""
+
+#: ../vector/v.hull/main.c:275
+msgid "Produces a convex hull for a given vector map."
+msgstr "Produce un înveliș convex pentru o anumită hartă vectorială."
+
+#: ../vector/v.hull/main.c:279
+msgid "For vector lines reads their vertices"
+msgstr ""
+
+#: ../vector/v.hull/main.c:286
+msgid "Use all vector points (do not limit to current region)"
+msgstr ""
+
+#: ../vector/v.hull/main.c:291
+msgid "Create a 'flat' 2D hull even if the input is 3D points"
+msgstr ""
+
+#: ../vector/v.hull/main.c:314
+#, c-format
+msgid "Error loading vector points from <%s>"
+msgstr ""
+
+#: ../vector/v.hull/main.c:318
+msgid "Convex hull calculation requires at least three points. Exiting."
+msgstr ""
+
+#: ../vector/v.hull/main.c:320
+#, c-format
+msgid "%d points read from vector map <%s>"
+msgstr ""
+
+#: ../vector/v.to.rast3/main.c:45
+msgid "vector, volume, conversion"
+msgstr "vector, volum, conversie"
+
+#: ../vector/v.to.rast3/main.c:46
+msgid "Converts a binary GRASS vector map (only points) layer into a 3D GRASS raster map layer."
+msgstr "Convertește hartă vectorială binară GRASS (doar puncte) în hartă raster 3D GRASS."
+
+#: ../vector/v.to.rast3/main.c:59
+msgid "Column name (type must be numeric)"
+msgstr "Numele coloanei (tipul trebuie să fie numeric)"
+
+#: ../vector/v.to.rast3/main.c:108
+msgid "Unable to create output map"
+msgstr "Imposibil de creat harta de ieșire"
+
+#: ../vector/v.to.rast3/main.c:150 ../vector/v.to.rast/do_lines.c:51
+#: ../vector/v.to.rast/do_lines.c:59
+#, c-format
+msgid "No record for line (cat = %d)"
+msgstr "Nici o înregistrare pentru linie (cat = %d)"
+
+#: ../vector/v.to.rast3/main.c:162
+msgid "Unable to close new 3d raster map"
+msgstr "Imposibil de închis harta nouă raster 3D"
+
+#: ../vector/v.in.region/main.c:39
+msgid "Creates a vector polygon from the current region extent."
+msgstr "Crează poligon vectorial în funcție de extinderea regiunii curente."
+
+#: ../vector/v.in.region/main.c:47
+msgid "Select type: line or area"
+msgstr "Selectează tipul: linie sau areal"
+
+#: ../vector/v.distance/main.c:116
+msgid "Finds the nearest element in vector map 'to' for elements in vector map 'from'."
+msgstr "Găsește cele mai apropiate elemente din harta vectorială 'to' cu elementele din harta vectorială 'from'."
+
+#: ../vector/v.distance/main.c:120
+msgid "Name of existing vector map (from)"
+msgstr "Numele hărții vectoriale existentă (de la)"
+
+#: ../vector/v.distance/main.c:125
+msgid "Name of existing vector map (to)"
+msgstr "Numele hărții vectoriale existentă (la)"
+
+#: ../vector/v.distance/main.c:132
+msgid "Feature type (from)"
+msgstr "Tipul trăsăturii (de la)"
+
+#: ../vector/v.distance/main.c:139
+msgid "Feature type (to)"
+msgstr "Tipul trăsăturii (la)"
+
+#: ../vector/v.distance/main.c:144
+msgid "Layer number (from)"
+msgstr "Numărul stratului (de la)"
+
+#: ../vector/v.distance/main.c:149
+msgid "Layer number (to)"
+msgstr "Numărul stratului (la)"
+
+#: ../vector/v.distance/main.c:155
+msgid "Name for output vector map containing lines connecting nearest elements"
+msgstr "Nume pentru harta vectorială de ieșire care conține linii ce conectează cele mai apropiate elemente"
+
+#: ../vector/v.distance/main.c:163
+msgid "Maximum distance or -1 for no limit"
+msgstr "Distanța maximă sau -1 pentru nici o limită"
+
+#: ../vector/v.distance/main.c:170
+msgid "Minimum distance or -1 for no limit"
+msgstr "Distanța minimă sau -1 pentru nici o limită"
+
+#: ../vector/v.distance/main.c:179
+msgid "Values describing the relation between two nearest features"
+msgstr ""
+
+#: ../vector/v.distance/main.c:181
+msgid "cat;category of the nearest feature;dist;minimum distance to nearest feature;to_x;x coordinate of the nearest point on the 'to' feature;to_y;y coordinate of the nearest point on the 'to' feature;to_along;distance to the nearest point on the 'to' feature along that linear feature;to_angle;angle along the nearest linear feature in the 'to' map, measured CCW from the +x axis, in radians, between -Pi and Pi inclusive;to_attr;attribute of nearest feature given by to_column option"
+msgstr ""
+
+#: ../vector/v.distance/main.c:202
+msgid "Column name(s) where values specified by 'upload' option will be uploaded"
+msgstr ""
+
+#: ../vector/v.distance/main.c:203
+msgid "From_map"
+msgstr ""
+
+#: ../vector/v.distance/main.c:208
+msgid "Column name of nearest feature (used with upload=to_attr)"
+msgstr ""
+
+#: ../vector/v.distance/main.c:214
+msgid "Name of table created for output when the distance to all flag is used"
+msgstr ""
+
+#: ../vector/v.distance/main.c:219
+msgid "Print output to stdout, don't update attribute table"
+msgstr ""
+
+#: ../vector/v.distance/main.c:221
+msgid "First column is always category of 'from' feature called from_cat"
+msgstr ""
+
+#: ../vector/v.distance/main.c:226
+msgid "Calculate distances to all features within the threshold"
+msgstr ""
+
+#: ../vector/v.distance/main.c:228
+msgid "Output is written to stdout but may be uploaded to a new table created by this module; multiple 'upload' options may be used."
+msgstr ""
+
+#: ../vector/v.distance/main.c:280
+msgid "to_column option missing"
+msgstr ""
+
+#: ../vector/v.distance/main.c:292
+msgid "Too many column names"
+msgstr ""
+
+#: ../vector/v.distance/main.c:299
+msgid "Not enough column names"
+msgstr ""
+
+#: ../vector/v.distance/main.c:387
+msgid "Unable to open default database"
+msgstr ""
+
+#: ../vector/v.distance/main.c:451
+msgid "Incompatible column types"
+msgstr ""
+
+#: ../vector/v.distance/main.c:524
+msgid "Finding nearest lines..."
+msgstr ""
+
+#: ../vector/v.distance/main.c:654
+msgid "Finding nearest areas..."
+msgstr ""
+
+#: ../vector/v.distance/main.c:726
+#, c-format
+msgid "More cats found in to_layer (area=%d)"
+msgstr ""
+
+#: ../vector/v.distance/main.c:872
+msgid "DATETIME type not yet supported, no attributes will be uploaded"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1123
+#, c-format
+msgid "%d categories with more than 1 feature in vector map <%s>"
+msgstr "%d din categoriile cu mai mult de o trăsătură în harta vectorială <%s>"
+
+#: ../vector/v.distance/main.c:1126
+#, c-format
+msgid "%d categories - no nearest feature found"
+msgstr "%d din categorii - nici o trăsătură vecină nu a fost găsită"
+
+#: ../vector/v.distance/main.c:1135
+#, c-format
+msgid "%d distances calculated"
+msgstr "%d din distanțele calculate"
+
+#: ../vector/v.distance/main.c:1136
+#, c-format
+msgid "%d records inserted"
+msgstr "%d din înregistrările inserate"
+
+#: ../vector/v.distance/main.c:1138
+#, c-format
+msgid "%d insert errors"
+msgstr "%d erori de inserare"
+
+#: ../vector/v.distance/main.c:1142
+#, c-format
+msgid "%d categories read from the map"
+msgstr "%d din categoriile citite din hartă"
+
+#: ../vector/v.distance/main.c:1144
+#, c-format
+msgid "%d categories exist in the table"
+msgstr "%d din categoriile existente în tabel"
+
+#: ../vector/v.distance/main.c:1146
+#, c-format
+msgid "%d categories read from the map exist in the table"
+msgstr ""
+
+#: ../vector/v.distance/main.c:1149
+#, c-format
+msgid "%d categories read from the map don't exist in the table"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:70
+msgid "Indices for quadrat counts of sites lists."
+msgstr "Indicii pentru totalul quadrat a siturile din liste."
+
+#: ../vector/v.qcount/main.c:76
+msgid "Vector of points defining sample points"
+msgstr "Puncte de vectori definind puncte de eșantionare"
+
+#: ../vector/v.qcount/main.c:84
+msgid "Output quadrant centres, number of points is written as category"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:91
+msgid "Number of quadrats"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:98
+msgid "Quadrat radius"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:103
+msgid "Print results in shell script style"
+msgstr ""
+
+#: ../vector/v.qcount/main.c:134
+msgid "Finding quadrats..."
+msgstr ""
+
+#: ../vector/v.qcount/main.c:139
+msgid "Counting sites in quadrats..."
+msgstr ""
+
+#: ../vector/v.net.visibility/main.c:46
+msgid "vector, path, visibility"
+msgstr "vector, cale, vizibilitate"
+
+#: ../vector/v.net.visibility/main.c:47
+msgid "Visibility graph construction."
+msgstr "Construcția graph-ului de vizibilitate."
+
+#: ../vector/v.net.visibility/main.c:59
+msgid "One or more coordinates"
+msgstr "Una sau mai multe coordonate"
+
+#: ../vector/v.net.visibility/main.c:65
+msgid "Add points after computing the vis graph"
+msgstr ""
+
+#: ../vector/v.net.visibility/main.c:98
+#, c-format
+msgid "Unable to copy elements from vector map <%s>"
+msgstr "Imposibil de copiat elementele din harta vector <%s>"
+
+#: ../vector/v.net.visibility/main.c:104
+msgid "Lat-long projection"
+msgstr "Proiecție lat-long"
+
+#: ../vector/v.to.db/report.c:187
+#, c-format
+msgid "%d categories read from vector map (layer %d)"
+msgstr "%d din categoriile citite din harta vectorială (strat %d)"
+
+#: ../vector/v.to.db/report.c:191
+#, c-format
+msgid "%d records selected from table (layer %d)"
+msgstr "%d din înregistrările selectate din tabel (strat %d)"
+
+#: ../vector/v.to.db/report.c:194
+#, c-format
+msgid "%d categories read from vector map exist in selection from table"
+msgstr "%d din categoriile citite din harta vectorială existentă în selecția din tabel"
+
+#: ../vector/v.to.db/report.c:197
+#, c-format
+msgid "%d categories read from vector map don't exist in selection from table"
+msgstr "%d din categoriile citite din harta vectorială care nu existentă în selecția din tabel"
+
+#: ../vector/v.to.db/report.c:199
+#, c-format
+msgid "%d records updated/inserted (layer %d)"
+msgstr "%d înregistrări actualizate/inserate (strat %d)"
+
+#: ../vector/v.to.db/report.c:202
+#, c-format
+msgid "%d update/insert errors (layer %d)"
+msgstr "%d actualizare/inserează erori (strat %d)"
+
+#: ../vector/v.to.db/report.c:205
+#, c-format
+msgid "%d categories with more points (coordinates not loaded)"
+msgstr "%d din categoriile cu mai multe puncte (coordonate neîncărcate)"
+
+#: ../vector/v.to.db/lines.c:75 ../vector/v.to.db/query.c:23
+#: ../vector/v.to.rast/do_lines.c:35
+msgid "Reading features..."
+msgstr "Citirea trăsăturilor..."
+
+#: ../vector/v.to.db/main.c:34
+msgid "Populates database values from vector features."
+msgstr "Populează valorile bazei de date din trăsăturile vectoriale."
+
+#: ../vector/v.to.db/main.c:48 ../vector/v.to.db/query.c:83
+#: ../vector/v.to.db/update.c:28 ../vector/v.to.db/update.c:32
+#, c-format
+msgid "Database connection not defined for layer %d. Use v.db.connect first."
+msgstr "Conexiunea bazei de date nu este definită pentru stratul %d. Utilizați prima dată v.db.connect."
+
+#: ../vector/v.to.db/areas.c:28 ../vector/v.to.rast/do_areas.c:33
+msgid "Reading areas..."
+msgstr "Citirea arealelor..."
+
+#: ../vector/v.to.db/parse.c:38
+msgid "For coor valid point/centroid, for length valid line/boundary"
+msgstr "Pentru coordonate punct/centroid valide, pentru lungimi linie/limite valide"
+
+#: ../vector/v.to.db/parse.c:42
+msgid "Layer number (write to)"
+msgstr "Număr de strat (scrie în)"
+
+#: ../vector/v.to.db/parse.c:46
+msgid "Query layer number (read from)"
+msgstr "Interoghează număr de strat (citește din)"
+
+#: ../vector/v.to.db/parse.c:56
+msgid "Value to upload"
+msgstr "Valoare pentru încărcare"
+
+#: ../vector/v.to.db/parse.c:87
+msgid "mi(les),f(eet),me(ters),k(ilometers),a(cres),h(ectares),r(adians),d(egrees)"
+msgstr "mi(le),p(icioare),me(tri),k(ilometri),a(cri),h(ectare),r(adiani),g(rade)"
+
+#: ../vector/v.to.db/parse.c:93
+msgid "Name of attribute column used for 'query' option"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:94
+msgid "E.g. 'cat', 'count(*)', 'sum(val)'"
+msgstr "De exemplu: 'cat', 'count(*)', 'sum(val)'"
+
+#: ../vector/v.to.db/parse.c:103
+msgid "Print only"
+msgstr "Doar printează"
+
+#: ../vector/v.to.db/parse.c:108
+msgid "Only print SQL statements"
+msgstr "Printează doar declarația SQL"
+
+#: ../vector/v.to.db/parse.c:114
+msgid "In print mode prints totals for options: length,area,count"
+msgstr "În modul de printare, se afișează numărul total de opțiuni: lungime, areal, numărătoare"
+
+#: ../vector/v.to.db/parse.c:153
+msgid "This option requires one column"
+msgstr "Această opțiune necesită o singură coloană"
+
+#: ../vector/v.to.db/parse.c:158
+msgid "This option requires two columns"
+msgstr "Această opțiune necesită două coloane"
+
+#: ../vector/v.to.db/parse.c:163
+msgid "This option requires at least two columns"
+msgstr "Această opțiune necesită cel puțin două coloane"
+
+#: ../vector/v.to.db/parse.c:169
+msgid "Parameter 'qcolumn' must be specified for 'option=query'"
+msgstr "Parametrul 'qcolumn' trebuie specificate pentru 'option=query'"
+
+#: ../vector/v.to.db/parse.c:174
+msgid "The 'sides' option makes sense only for boundaries"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:177
+msgid "The 'sinuous' option makes sense only for lines"
+msgstr ""
+
+#: ../vector/v.to.db/parse.c:180
+msgid "The 'azimuth' option makes sense only for lines"
+msgstr ""
+
+#: ../vector/v.to.db/query.c:93
+msgid "Querying database... "
+msgstr "Interogarea baza de date..."
+
+#: ../vector/v.to.db/query.c:108
+#, c-format
+msgid "Query for category '0' (no category) was not executed because of too many (%d) query categories. All later reported values for cat 0 are not valid."
+msgstr ""
+
+#: ../vector/v.to.db/query.c:145
+#, c-format
+msgid "Multiple query results, output value set to NULL (category [%d])"
+msgstr ""
+
+#: ../vector/v.to.db/query.c:152
+msgid "Unable to fetch record"
+msgstr ""
+
+#: ../vector/v.to.db/update.c:82
+msgid "Updating database..."
+msgstr "Actualizarea bazei de date..."
+
+#: ../vector/v.to.db/update.c:115
+#, c-format
+msgid "More elements of category %d, nothing loaded to database"
+msgstr ""
+
+#: ../vector/v.to.db/update.c:213
+#, c-format
+msgid "Record (cat %d) already exists (not inserted)"
+msgstr ""
+
+#: ../vector/v.to.db/update.c:221 ../vector/v.to.3d/trans3.c:129
+#, c-format
+msgid "Record (cat %d) does not exist (not updated)"
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:66
+msgid "Converts DWG/DXF to GRASS vector map"
+msgstr "Convertește DWG/DXF în hartă vectorială GRASS"
+
+#: ../vector/v.in.dwg/main.c:69
+msgid "Name of DWG or DXF file"
+msgstr "Nume fișier DWG sau DXF"
+
+#: ../vector/v.in.dwg/main.c:92
+msgid "Write circles as points (centre)"
+msgstr ""
+
+#: ../vector/v.in.dwg/main.c:100
+msgid "Use numeric type for attribute \"layer\""
+msgstr "Folosește tip numeric pentru atribute \"strat\""
+
+#: ../vector/v.in.dwg/main.c:120
+#, c-format
+msgid "Unable to initialize OpenDWG Toolkit, error: %d: %s."
+msgstr "Imposibil de inițializat OpenDWG Toolkit, eroare: %d: %s."
+
+#: ../vector/v.in.dwg/main.c:123
+#, c-format
+msgid "%s Cannot open %s"
+msgstr "%s Nu s-a putut deschide %s"
+
+#: ../vector/v.in.dwg/main.c:131
+#, c-format
+msgid "Unable to open input file <%s>. Error %d: %s"
+msgstr "Imposibil de deschis fișierul de intrare <%s>. Eroare %d: %s"
+
+#: ../vector/v.in.dwg/main.c:266
+#, c-format
+msgid "%d elements skipped (layer name was not in list)"
+msgstr "%d elemente omise (numele stratului nu a fost în listă)"
+
+#: ../vector/v.in.dwg/main.c:269
+#, c-format
+msgid "%d elements processed"
+msgstr "%d elemente procesate"
+
+#: ../vector/v.to.3d/main.c:37
+msgid "vector, transformation, 3D"
+msgstr "vector, transformare, 3D"
+
+#: ../vector/v.to.3d/main.c:39
+msgid "Performs transformation of 2D vector features to 3D."
+msgstr "Efectuează transformarea trăsăturilor 2D în 3D."
+
+#: ../vector/v.to.3d/main.c:52
+#, c-format
+msgid "Either '%s' or '%s' parameter have to be used"
+msgstr "Fie  '%s' , fie parametrul '%s' trebuie utilizat"
+
+#: ../vector/v.to.3d/main.c:58
+#, c-format
+msgid "Parameters '%s' ignored"
+msgstr "Parametrul '%s' ignorat"
+
+#: ../vector/v.to.3d/main.c:63
+msgid "Attribute table required"
+msgstr "Tabela de atribute necesară"
+
+#: ../vector/v.to.3d/main.c:76
+#, c-format
+msgid "Vector map <%s> is 2D"
+msgstr "Harta vectorială <%s> este 2D"
+
+#: ../vector/v.to.3d/main.c:81
+#, c-format
+msgid "Vector map <%s> is 3D"
+msgstr "Harta vectorială <%s> este 3D"
+
+#: ../vector/v.to.3d/main.c:97 ../vector/v.to.3d/main.c:127
+#: ../vector/v.in.db/main.c:212
+msgid "Copying attributes..."
+msgstr "Copierea atributelor..."
+
+#: ../vector/v.to.3d/main.c:99 ../vector/v.to.3d/main.c:129
+msgid "Unable to copy attributes"
+msgstr "Imposibil de copiat atributele"
+
+#: ../vector/v.to.3d/main.c:103
+msgid "Transforming features..."
+msgstr "Transformarea trăsăturilor..."
+
+#: ../vector/v.to.3d/main.c:123
+#, c-format
+msgid "%s failed"
+msgstr "%s eșuat"
+
+#: ../vector/v.to.3d/main.c:138
+#, c-format
+msgid "Vertical extent of vector map <%s>: B: %f T: %f"
+msgstr "Extinderea verticală a hărții vectoriale <%s>: B: %f T: %f"
+
+#: ../vector/v.to.3d/trans3.c:67 ../vector/v.to.3d/trans2.c:65
+msgid "Column must be numeric"
+msgstr "Coloana trebuie sa fie numerică"
+
+#: ../vector/v.to.3d/trans3.c:100
+#, c-format
+msgid "Feature id %d has no category - skipping"
+msgstr "Id-ul trăsăturii %d nu are nici o categorie omisă"
+
+#: ../vector/v.to.3d/trans3.c:103
+#, c-format
+msgid "Feature id %d has more categories. Using category %d."
+msgstr "Id trăsăturii %d are mai multe categorii. Categorie utilizată %d."
+
+#: ../vector/v.to.3d/trans2.c:98
+msgid "Skipping feature without category"
+msgstr "Trăsături omise fără categorie"
+
+#: ../vector/v.to.3d/trans2.c:113
+#, c-format
+msgid "Unable to get height for feature category %d"
+msgstr "Imposibil de obținut înălțimea pentru categoria trăsăturii %d"
+
+#: ../vector/v.to.3d/args.c:11
+msgid "Reverse transformation; 3D vector features to 2D"
+msgstr "Transformare inversă; trăsături vectoriale 3D în 2D"
+
+#: ../vector/v.to.3d/args.c:15
+msgid "Do not copy table"
+msgstr "Nu copiază tabelul"
+
+#: ../vector/v.to.3d/args.c:30
+msgid "Fixed height for 3D vector features"
+msgstr "Înălțimea pentru trăsăturile vectoriale 3D"
+
+#: ../vector/v.to.3d/args.c:31 ../vector/v.to.3d/args.c:34
+#: ../vector/v.to.3d/args.c:41
+msgid "Height"
+msgstr "Înălțime"
+
+#: ../vector/v.to.3d/args.c:37
+msgid "Name of attribute column used for height"
+msgstr "Numele coloanei de atribute folosită pentru înălțime"
+
+#: ../vector/v.to.3d/args.c:39
+msgid "Can be used for reverse transformation, to store height of points"
+msgstr "Poate fi utilizat în transformarea inversă pentru a stoca înălțimea punctelor"
+
+#: ../vector/v.overlay/line_area.c:69 ../vector/v.overlay/area_area.c:110
+msgid "Breaking lines..."
+msgstr ""
+
+#: ../vector/v.overlay/line_area.c:71 ../vector/v.overlay/area_area.c:153
+msgid "Merging lines..."
+msgstr ""
+
+#: ../vector/v.overlay/line_area.c:83
+msgid "Selecting lines..."
+msgstr ""
+
+#: ../vector/v.overlay/line_area.c:162 ../vector/v.overlay/line_area.c:190
+#: ../vector/v.overlay/area_area.c:208 ../vector/v.overlay/area_area.c:290
+#: ../vector/v.overlay/area_area.c:318
+msgid "Attribute not found"
+msgstr "Atribut negăsit"
+
+#: ../vector/v.overlay/main.c:61
+msgid "Overlays two vector maps."
+msgstr "Suprapunerea două hărți vectoriale."
+
+#: ../vector/v.overlay/main.c:64 ../vector/v.select/args.c:10
+msgid "Name of input vector map (A)"
+msgstr "Numele hărții vectoriale de intrare (A)"
+
+#: ../vector/v.overlay/main.c:68 ../vector/v.select/args.c:14
+msgid "Feature type (vector map A)"
+msgstr "Tipul trăsăturii (harta vectorială A)"
+
+#: ../vector/v.overlay/main.c:74 ../vector/v.select/args.c:19
+msgid "Layer number (vector map A)"
+msgstr "Numar de strat (harta vectorială A)"
+
+#: ../vector/v.overlay/main.c:78 ../vector/v.select/args.c:24
+msgid "Name of input vector map (B)"
+msgstr "Numele hărții vectoriale de intrare (B)"
+
+#: ../vector/v.overlay/main.c:82 ../vector/v.select/args.c:28
+msgid "Feature type (vector map B)"
+msgstr "Tipul trăsăturii (harta vectorială B)"
+
+#: ../vector/v.overlay/main.c:88 ../vector/v.select/args.c:33
+msgid "Layer number (vector map B)"
+msgstr "Numar de strat (harta vectorială B)"
+
+#: ../vector/v.overlay/main.c:100
+msgid "Operator defines features written to output vector map"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:103
+msgid "Feature is written to output if the result of operation 'ainput operator binput' is true. Input feature is considered to be true, if category of given layer is defined."
+msgstr ""
+
+#: ../vector/v.overlay/main.c:108
+msgid "and;also known as 'intersection' in GIS;or;also known as 'union' in GIS (only for atype=area);not;features from ainput not overlayed by features from binput;xor;features from either ainput or binput but not those from ainput overlayed by binput (only for atype=area)"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:119
+msgid "Output layer for new category, ainput and binput"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:120
+msgid "If 0 or not given, the category is not written"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:125 ../vector/v.in.ogr/main.c:178
+msgid "Snapping threshold for boundaries"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:126
+msgid "Disable snapping with snap <= 0"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:160
+#, c-format
+msgid "Unknown operator '%s'"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:165
+#, c-format
+msgid "Operator '%s' is not supported for type line"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:220
+#, c-format
+msgid "Copying vector objects from vector map <%s>..."
+msgstr ""
+
+#: ../vector/v.overlay/main.c:293
+#, c-format
+msgid "No %s features found in vector map <%s>. Verify '%s' parameter."
+msgstr ""
+
+#: ../vector/v.overlay/main.c:327
+msgid "Collecting input attributes..."
+msgstr ""
+
+#: ../vector/v.overlay/main.c:413
+#, c-format
+msgid "Unknown column type '%s' of column '%s'"
+msgstr ""
+
+#: ../vector/v.overlay/main.c:478
+#, c-format
+msgid "Unknown column type '%s' of column '%s', values lost"
+msgstr ""
+
+#: ../vector/v.overlay/area_area.c:54
+#, c-format
+msgid "Snapping boundaries with %g ..."
+msgstr ""
+
+#: ../vector/v.overlay/area_area.c:102
+#, c-format
+msgid "%d boundaries snapped"
+msgstr ""
+
+#: ../vector/v.overlay/area_area.c:117
+msgid "Cleaning boundaries at nodes..."
+msgstr ""
+
+#: ../vector/v.overlay/area_area.c:181
+#, c-format
+msgid "Querying vector map <%s>..."
+msgstr ""
+
+#: ../vector/v.overlay/area_area.c:218
+msgid "Writing centroids..."
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:46
+msgid "Creates parallel line to input vector lines."
+msgstr "Crează linie paralelă cu liniile vectorului de intrare."
+
+#: ../vector/v.parallel2/main.c:58
+msgid "Offset along major axis in map units"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:66
+msgid "Offset along minor axis in map units"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:83
+msgid "Side"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:85
+msgid "left;Parallel line is on the left;right;Parallel line is on the right;both;Parallel lines on both sides"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:95
+msgid "Tolerance of arc polylines in map units"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:99
+msgid "Make outside corners round"
+msgstr ""
+
+#: ../vector/v.parallel2/main.c:103
+msgid "Create buffer-like parallel lines"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:58
+msgid "vector, network, flow"
+msgstr "vector, rețea, debit"
+
+#: ../vector/v.net.flow/main.c:60
+msgid "Computes the maximum flow between two sets of nodes in the network."
+msgstr "Calculează fluxul maxim dintre două seturi de noduri din rețea."
+
+#: ../vector/v.net.flow/main.c:71
+msgid "Name for output vector map containing a minimum cut"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:77
+msgid "Name of arc forward/both direction(s) capacity column"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:82
+msgid "Name of arc backward direction capacity column"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:86
+msgid "Source layer number or name"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:91
+msgid "Source category values"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:97
+msgid "Source WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:102
+msgid "Sink layer number or name"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:103 ../vector/v.net.flow/main.c:108
+#: ../vector/v.net.flow/main.c:114
+msgid "Sink"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:107
+msgid "Sink category values"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:113
+msgid "Sink WHERE conditions of SQL statement without 'where' keyword"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:199
+msgid "No sources"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:202
+msgid "No sinks"
+msgstr ""
+
+#: ../vector/v.net.flow/main.c:224
+msgid "Writing the output..."
+msgstr ""
+
+#: ../vector/v.what/what.c:164
+#, c-format
+msgid ""
+"Id: %d\n"
+"Type: %s\n"
+"Left: %d\n"
+"Right: %d\n"
+msgstr ""
+"Id: %d\n"
+"Tip: %s\n"
+"Stânga: %d\n"
+"Dreapta: %d\n"
+
+#: ../vector/v.what/what.c:187
+#, c-format
+msgid ""
+"Node[%d]=%d\n"
+"Number_lines=%d\n"
+"Coordinates=%.6f,%.6f,%.6f\n"
+msgstr ""
+"Nod[%d]=%d\n"
+"Număr_linii=%d\n"
+"Coordonate=%.6f,%.6f,%.6f\n"
+
+#: ../vector/v.what/what.c:192
+#, c-format
+msgid ""
+"Node[%d]: %d\n"
+"Number of lines: %d\n"
+"Coordinates: %.6f, %.6f, %.6f\n"
+msgstr ""
+"Nod[%d]: %d\n"
+"Număr de linii: %d\n"
+"Coordonate: %.6f, %.6f, %.6f\n"
+
+#: ../vector/v.what/what.c:206
+#, c-format
+msgid ""
+"Id: %5d\n"
+"Angle: %.8f\n"
+msgstr ""
+"Id: %5d\n"
+"Unghi: %.8f\n"
+
+#: ../vector/v.what/what.c:221
+#, c-format
+msgid "Type: %s"
+msgstr "Tip: %s"
+
+#: ../vector/v.what/what.c:222
+#, c-format
+msgid "Id: %d\n"
+msgstr "Id: %d\n"
+
+#: ../vector/v.what/what.c:266
+#, c-format
+msgid ""
+"Line height min: %f\n"
+"Line height max: %f\n"
+msgstr ""
+"Înălțimea minimă a liniei: %f\n"
+"Înălțimea maximă a liniei: %f\n"
+
+#: ../vector/v.what/what.c:280
+#, c-format
+msgid ""
+"Type: Area\n"
+"Area height: %f\n"
+msgstr ""
+"Tip: Areal\n"
+"Înălțimea arealului: %f\n"
+
+#: ../vector/v.what/what.c:288
+#, c-format
+msgid "Type: Area\n"
+msgstr "Tip: Areal\n"
+
+#: ../vector/v.what/what.c:310
+#, c-format
+msgid ""
+"Area: %d\n"
+"Number of isles: %d\n"
+msgstr ""
+"Areal: %d\n"
+"Număr de insule: %d\n"
+
+#: ../vector/v.what/what.c:320
+#, c-format
+msgid "Isle[%d]: %d\n"
+msgstr "Insule[%d]: %d\n"
+
+#: ../vector/v.what/what.c:333
+#, c-format
+msgid "Island: %d In area: %d\n"
+msgstr "Insule: %d ÃŽn areal: %d\n"
+
+#: ../vector/v.what/what.c:346 ../vector/v.what/what.c:353
+#, c-format
+msgid ""
+"Sq Meters: %.3f\n"
+"Hectares: %.3f\n"
+msgstr ""
+"Metru pătrat: %.3f\n"
+"Hectare: %.3f\n"
+
+#: ../vector/v.what/what.c:348 ../vector/v.what/what.c:356
+#, c-format
+msgid ""
+"Acres: %.3f\n"
+"Sq Miles: %.4f\n"
+msgstr ""
+"Acri: %.3f\n"
+"Mile pătrate: %.4f\n"
+
+#: ../vector/v.what/what.c:379
+#, c-format
+msgid ""
+"Layer: %d\n"
+"Category: %d\n"
+msgstr ""
+"Strat: %d\n"
+"Categorie: %d\n"
+
+#: ../vector/v.what/what.c:393
+#, c-format
+msgid ""
+"\n"
+"Driver: %s\n"
+"Database: %s\n"
+"Table: %s\n"
+"Key column: %s\n"
+msgstr ""
+"\n"
+"Driver: %s\n"
+"Baza de date: %s\n"
+"Tabel %s\n"
+"Coloană primară: %s\n"
+
+#: ../vector/v.what/main.c:56
+msgid "vector, querying"
+msgstr "vector, interogare"
+
+#: ../vector/v.what/main.c:57
+msgid "Queries a vector map layer at given locations."
+msgstr "Interoghează harta vectorială din anumite locații."
+
+#: ../vector/v.what/main.c:70
+msgid "If not given reads from standard input"
+msgstr ""
+
+#: ../vector/v.what/main.c:77
+msgid "Query threshold distance"
+msgstr ""
+
+#: ../vector/v.what/main.c:85
+msgid "Print attribute information"
+msgstr ""
+
+#: ../vector/v.what/main.c:159
+#, c-format
+msgid "You must build topology on vector map <%s>"
+msgstr ""
+
+#: ../vector/v.what/main.c:178
+#, c-format
+msgid "Unknown input format, skipping: '%s'"
+msgstr ""
+
+#: ../vector/v.external/main.c:58
+msgid "vector, external, import"
+msgstr "vector, extern, import"
+
+#: ../vector/v.external/main.c:60
+msgid "Creates a new vector as a read-only link to OGR layer."
+msgstr ""
+
+#: ../vector/v.external/main.c:75
+msgid "Output vector. If not given, available layers are printed only."
+msgstr ""
+
+#: ../vector/v.external/main.c:83
+msgid ""
+"OGR layer name. If not given, available layers are printed only. Examples:\n"
+"\t\tESRI Shapefile: shapefile name\n"
+"\t\tMapInfo File: mapinfo file name"
+msgstr ""
+
+#: ../vector/v.external/main.c:91
+msgid "Output vector name was not specified"
+msgstr ""
+
+#: ../vector/v.external/main.c:96
+msgid "Cannot open data source"
+msgstr ""
+
+#: ../vector/v.external/main.c:128 ../vector/v.in.ogr/main.c:370
+#, c-format
+msgid "Layer <%s> not available"
+msgstr ""
+
+#: ../vector/v.normal/main.c:80
+msgid "Tests for normality for points."
+msgstr "Test pentru normalitatea punctelor."
+
+#: ../vector/v.normal/main.c:223
+msgid "Doing log transformation"
+msgstr ""
+
+#: ../vector/v.edit/snap.c:111 ../vector/v.edit/a2b.c:328
+#, c-format
+msgid "Unable to rewrite line %d"
+msgstr ""
+
+#: ../vector/v.edit/main.c:56
+msgid "vector, editing, geometry"
+msgstr ""
+
+#: ../vector/v.edit/main.c:57
+msgid "Edits a vector map, allows adding, deleting and modifying selected vector features."
+msgstr "Editarea unei hărți vectoriale, permite adăugarea, ștergerea și modificarea trăsăturilor vectoriale selectate."
+
+#: ../vector/v.edit/main.c:66
+#, c-format
+msgid "Unable to get category list <%s>"
+msgstr ""
+
+#: ../vector/v.edit/main.c:94 ../vector/v.in.ogr/main.c:345
+#, c-format
+msgid "Vector map <%s> already exists"
+msgstr ""
+
+#: ../vector/v.edit/main.c:99
+msgid "Creating new DB connection based on default mapset settings..."
+msgstr ""
+
+#: ../vector/v.edit/main.c:154
+#, c-format
+msgid "Unable to open vector map <%s> as the background map. It is given as vector map to be edited."
+msgstr ""
+
+#: ../vector/v.edit/main.c:169
+#, c-format
+msgid "Background vector map <%s> registered"
+msgstr ""
+
+#: ../vector/v.edit/main.c:209
+msgid "Selecting features..."
+msgstr ""
+
+#: ../vector/v.edit/main.c:221
+msgid "No features selected, nothing to edit"
+msgstr ""
+
+#: ../vector/v.edit/main.c:229
+#, c-format
+msgid "Vector map <%s> is not 3D. Tool '%s' requires 3D vector map. Please convert the vector map to 3D using e.g. %s."
+msgstr ""
+
+#: ../vector/v.edit/main.c:267
+#, c-format
+msgid "%d features added"
+msgstr ""
+
+#: ../vector/v.edit/main.c:269 ../vector/v.edit/main.c:290
+#: ../vector/v.edit/main.c:298 ../vector/v.edit/main.c:323
+#: ../vector/v.edit/main.c:360
+#, c-format
+msgid "Threshold value for snapping is %.2f"
+msgstr ""
+
+#: ../vector/v.edit/main.c:278
+#, c-format
+msgid "%d boundaries closed"
+msgstr "%d limite închise"
+
+#: ../vector/v.edit/main.c:285
+#, c-format
+msgid "%d features deleted"
+msgstr "%d trăsături șterse"
+
+#: ../vector/v.edit/main.c:293
+#, c-format
+msgid "%d features moved"
+msgstr "%d trăsături mutate"
+
+#: ../vector/v.edit/main.c:302
+#, c-format
+msgid "%d vertices moved"
+msgstr "%d vertecși mutați"
+
+#: ../vector/v.edit/main.c:306
+#, c-format
+msgid "%d vertices added"
+msgstr "%d vertecși adăugați"
+
+#: ../vector/v.edit/main.c:310
+#, c-format
+msgid "%d vertices removed"
+msgstr "%d vertecși eliminați"
+
+#: ../vector/v.edit/main.c:320
+#, c-format
+msgid "%d lines broken"
+msgstr "%d linii întrerupte"
+
+#: ../vector/v.edit/main.c:326
+#, c-format
+msgid "%d lines connected"
+msgstr "%d linii conectate"
+
+#: ../vector/v.edit/main.c:330
+#, c-format
+msgid "%d lines merged"
+msgstr "%d linii fuzionate"
+
+#: ../vector/v.edit/main.c:338 ../vector/v.edit/main.c:342
+#, c-format
+msgid "%d features modified"
+msgstr "%d trăsături modificate"
+
+#: ../vector/v.edit/main.c:347
+#, c-format
+msgid "Multiple background maps were given. Selected features will be copied only from vector map <%s>."
+msgstr ""
+
+#: ../vector/v.edit/main.c:357
+#, c-format
+msgid "%d features copied"
+msgstr "%d trăsături copiate"
+
+#: ../vector/v.edit/main.c:366
+#, c-format
+msgid "%d lines flipped"
+msgstr ""
+
+#: ../vector/v.edit/main.c:386
+#, c-format
+msgid "%d lines labeled"
+msgstr ""
+
+#: ../vector/v.edit/main.c:393
+#, c-format
+msgid "%d features converted"
+msgstr "%d trăsături convertite"
+
+#: ../vector/v.edit/main.c:396
+msgid "No feature modified"
+msgstr "Nici o trăsătură modificată"
+
+#: ../vector/v.edit/main.c:401
+msgid "Operation not implemented"
+msgstr "Operațiune neimplementată"
+
+#: ../vector/v.edit/select.c:73
+#, c-format
+msgid "Threshold value for coordinates is %.2f"
+msgstr ""
+
+#: ../vector/v.edit/select.c:160
+#, c-format
+msgid "Threshold value for querying is %.2f"
+msgstr ""
+
+#: ../vector/v.edit/select.c:176
+#, c-format
+msgid "%d of %d features selected from vector map <%s>"
+msgstr "%d de %d trăsături selectate din harta vectorială <%s>"
+
+#: ../vector/v.edit/select.c:501
+msgid "Layer must be > 0 for 'where'"
+msgstr "Stratul trebuie să fie  > 0 pentru 'where'"
+
+#: ../vector/v.edit/args.c:38
+msgid "Name of vector map to edit"
+msgstr ""
+
+#: ../vector/v.edit/args.c:54
+msgid "Tool"
+msgstr "Intrument"
+
+#: ../vector/v.edit/args.c:55
+msgid "create;Create new (empty) vector map;add;Add new features to existing vector map;delete;Delete selected features from vector map;move;Move selected features in vector map;vertexmove;Move vertex of selected vector lines;vertexdel;Remove vertex from selected vector lines;vertexadd;Add new vertex to selected vector lines;merge;Merge selected vector lines;break;Break/split vector lines;select;Select lines and print their ID's;catadd;Set new categories to selected vector features for defined layer;catdel;Delete categories from selected vector features for defined layer;copy;Copy selected features;snap;Snap vector features in given threshold;flip;Flip direction of selected vector lines;connect;Connect two lines;zbulk;Z bulk-labeling (automated assignment of z coordinate to vector lines);chtype;Change feature type (point<->centroid, line<->boundary)"
+msgstr ""
+
+#: ../vector/v.edit/args.c:100
+msgid "ASCII file to be converted to binary vector map"
+msgstr ""
+
+#: ../vector/v.edit/args.c:102
+msgid "If not given (or \"-\") reads from standard input"
+msgstr ""
+
+#: ../vector/v.edit/args.c:112
+msgid "Difference in x,y direction for moving feature or vertex"
+msgstr ""
+
+#: ../vector/v.edit/args.c:119
+msgid "Threshold distance (coords,snap,query)"
+msgstr ""
+
+#: ../vector/v.edit/args.c:121
+msgid "'-1' for threshold based on the current resolution settings"
+msgstr ""
+
+#: ../vector/v.edit/args.c:137
+msgid "List of point coordinates"
+msgstr ""
+
+#: ../vector/v.edit/args.c:146
+msgid "Bounding box for selecting features"
+msgstr ""
+
+#: ../vector/v.edit/args.c:155
+msgid "Polygon for selecting features"
+msgstr ""
+
+#: ../vector/v.edit/args.c:165
+msgid "Query tool"
+msgstr "Instrument de interogare"
+
+#: ../vector/v.edit/args.c:167
+msgid "For 'shorter' use negative threshold value, positive value for 'longer'"
+msgstr ""
+
+#: ../vector/v.edit/args.c:170
+msgid "length;Select only lines or boundaries shorter/longer than threshold distance;dangle;Select dangles shorter/longer than threshold distance"
+msgstr ""
+
+#: ../vector/v.edit/args.c:178
+msgid "Name of background vector map(s)"
+msgstr ""
+
+#: ../vector/v.edit/args.c:185
+msgid "Snap added or modified features in the given threshold to the nearest existing feature"
+msgstr ""
+
+#: ../vector/v.edit/args.c:187
+msgid "no;Not apply snapping;node;Snap only to node;vertex;Allow snapping also to vertex"
+msgstr ""
+
+#: ../vector/v.edit/args.c:195
+msgid "Starting value and step for z bulk-labeling"
+msgstr ""
+
+#: ../vector/v.edit/args.c:196
+msgid "Pair: value,step (e.g. 1100,10)"
+msgstr ""
+
+#: ../vector/v.edit/args.c:207
+msgid "Close added boundaries (using threshold distance)"
+msgstr ""
+
+#: ../vector/v.edit/args.c:211
+msgid "Do not expect header of input data"
+msgstr ""
+
+#: ../vector/v.edit/args.c:221
+msgid "Modify only first found feature in bounding box"
+msgstr ""
+
+#: ../vector/v.edit/args.c:233
+msgid "Polygon must have at least 3 coordinate pairs"
+msgstr ""
+
+#: ../vector/v.edit/args.c:294
+#, c-format
+msgid "Operation '%s' not implemented"
+msgstr ""
+
+#: ../vector/v.edit/args.c:303
+#, c-format
+msgid "At least one option from %s must be specified"
+msgstr ""
+
+#: ../vector/v.edit/args.c:309 ../vector/v.edit/args.c:318
+#: ../vector/v.edit/args.c:325 ../vector/v.edit/args.c:332
+#: ../vector/v.edit/args.c:336
+#, c-format
+msgid "Tool %s requires option %s"
+msgstr "Intrumentul %s necesită opțiunea %s"
+
+#: ../vector/v.edit/a2b.c:85 ../vector/v.edit/a2b.c:123
+#: ../vector/v.edit/a2b.c:147
+#, c-format
+msgid "Error reading ASCII file: '%s'"
+msgstr "Eroare în citirea fișierului ASCII: '%s'"
+
+#: ../vector/v.edit/a2b.c:178
+msgid "End of ascii file reached before end of categories"
+msgstr ""
+
+#: ../vector/v.edit/a2b.c:189
+#, c-format
+msgid "Error reading categories: '%s'"
+msgstr "Eroare în citirea categoriilor: '%s'"
+
+#: ../vector/v.edit/a2b.c:236
+#, c-format
+msgid "Unexpected data in vector head: '%s'"
+msgstr ""
+
+#: ../vector/v.edit/a2b.c:270
+#, c-format
+msgid "Unknown keyword '%s' in vector head"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:61
+msgid "vector, network, allocation"
+msgstr "vector, rețea, alocare"
+
+#: ../vector/v.net.alloc/main.c:63
+msgid "Allocate subnets for nearest centres (direction from centre)."
+msgstr "Alocarea subrețelelor pentru cei mai apropiați centrii (direcție dinspre centru)."
+
+#: ../vector/v.net.alloc/main.c:65
+msgid "Centre node must be opened (costs >= 0). Costs of centre node are used in calculation"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:92 ../vector/v.net.iso/main.c:99
+msgid "Arc forward/both direction(s) cost column (number)"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:98 ../vector/v.net.iso/main.c:103
+msgid "Arc backward direction cost column (number)"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:104 ../vector/v.net.iso/main.c:107
+msgid "Node cost column (number)"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:110
+msgid "Categories of centres (points on nodes) to which net will be allocated, layer for this categories is given by nlayer option"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:186
+#, c-format
+msgid "Number of centres: [%d] (nlayer: [%d])"
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:189 ../vector/v.net.iso/main.c:227
+msgid "Not enough centres for selected nlayer. Nothing will be allocated."
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:200
+msgid "Calculating costs from centres ..."
+msgstr ""
+
+#: ../vector/v.net.alloc/main.c:340 ../vector/v.net.alloc/main.c:351
+#: ../vector/v.net.iso/main.c:508
+msgid "Cannot get line segment, segment out of line"
+msgstr ""
+
+#: ../vector/v.net.spanningtree/main.c:46
+msgid "vector, network, spanning tree"
+msgstr ""
+
+#: ../vector/v.net.spanningtree/main.c:48
+msgid "Computes minimum spanning tree for the network."
+msgstr "Calculează întinderea minimă a arborelui pentru rețea."
+
+#: ../vector/v.net.spanningtree/main.c:59
+msgid "Name of Arc cost column"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:58
+#, c-format
+msgid "Init costs from node %d"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:345
+msgid "vector, network, steiner tree"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:347
+msgid "Create Steiner tree for the network and given terminals"
+msgstr "Creaze un arbore Steiner pentru rețea și anumite terminale"
+
+#: ../vector/v.net.steiner/main.c:349
+msgid "Note that 'Minimum Steiner Tree' problem is NP-hard and heuristic algorithm is used in this module so the result may be sub optimal"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:369
+msgid "Node layer (used for terminals)"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:381
+msgid "Categories of points on terminals (layer is specified by nlayer)"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:389
+msgid "Number of steiner points (-1 for all possible)"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:453
+msgid "Not enough terminals (< 2)"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:459
+msgid "Requested number of Steiner points > than possible"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:511
+#, c-format
+msgid "Terminal at node [%d] cannot be connected to terminal at node [%d]"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:527
+#, c-format
+msgid "[%d] (not reachable) nodes removed from list of Steiner point candidates"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:532
+#, c-format
+msgid "MST costs = %f"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:538
+#, c-format
+msgid "Search for [%d]. Steiner point"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:559
+#, c-format
+msgid "Steiner point at node [%d] was added to terminals (MST costs = %f)"
+msgstr ""
+
+#: ../vector/v.net.steiner/main.c:571
+msgid "No Steiner point found -> leaving cycle"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:72
+msgid "Splits net by cost isolines."
+msgstr "Desparte rețea în funcție de costul izoliniilor."
+
+#: ../vector/v.net.iso/main.c:73
+msgid "vector, network, isolines"
+msgstr "vector, rețea, izolinii"
+
+#: ../vector/v.net.iso/main.c:75
+msgid "Splits net to bands between cost isolines (direction from centre). Centre node must be opened (costs >= 0). Costs of centre node are used in calculation."
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:113
+msgid "Categories of centres (points on nodes) to which net will be allocated. Layer for this categories is given by nlayer option."
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:122
+msgid "Costs for isolines"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:159
+#, c-format
+msgid "Wrong iso cost: %f"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:162
+#, c-format
+msgid "Iso cost: %f less than previous"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:164
+#, c-format
+msgid "Iso cost %d: %f"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:171
+msgid "Not enough costs, everything reachable falls to first band"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:205
+msgid "Centre at closed node (costs = -1) ignored"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:224
+#, c-format
+msgid "Number of centres: %d (nlayer %d)"
+msgstr ""
+
+#: ../vector/v.net.iso/main.c:247
+#, c-format
+msgid "Calculating costs from centre %d..."
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:81
+msgid "vector, raster, attribute table"
+msgstr "vector, raster, tabel de atribute"
+
+#: ../vector/v.what.rast/main.c:83
+msgid "Uploads raster values at positions of vector points to the table."
+msgstr "Încarcă valorile rasterului la poziția punctelor vectoriale din tabel."
+
+#: ../vector/v.what.rast/main.c:88
+msgid "Name of input vector points map for which to edit attribute table"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:92
+msgid "Name of existing raster map to be queried"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:101
+msgid "Column name (will be updated by raster values)"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:160 ../vector/v.to.rast/vect2rast.c:64
+#: ../vector/v.to.rast/support.c:315 ../vector/v.to.rast/support.c:467
+#, c-format
+msgid "Column <%s> not found"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:166
+msgid "Raster type is integer and column type is float"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:169
+msgid "Raster type is float and column type is integer, some data lost!!"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:249
+#, c-format
+msgid "%d points outside current region were skipped"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:253
+#, c-format
+msgid "%d points without category were skipped"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:307
+#, c-format
+msgid "More points (%d) of category %d, value set to 'NULL'"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:372
+#, c-format
+msgid "%d categories loaded from table"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:373
+#, c-format
+msgid "%d categories loaded from vector"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:374
+#, c-format
+msgid "%d categories from vector missing in table"
+msgstr ""
+
+#: ../vector/v.what.rast/main.c:375
+#, c-format
+msgid "%d duplicate categories in vector"
+msgstr ""
+
+#: ../vector/v.kcv/main.c:78
+msgid "Randomly partition points into test/train sets."
+msgstr "Puncte de partiție aleatoriu în seturile test/pregătire."
+
+#: ../vector/v.kcv/main.c:87
+msgid "Number of partitions"
+msgstr ""
+
+#: ../vector/v.kcv/main.c:97
+msgid "Name for new column to which partition number is written"
+msgstr ""
+
+#: ../vector/v.kcv/main.c:101
+msgid "Use drand48()"
+msgstr ""
+
+#: ../vector/v.kcv/main.c:174
+#, c-format
+msgid "Unable to get layer info for vector map <%s>"
+msgstr ""
+
+#: ../vector/v.kcv/main.c:198
+#, c-format
+msgid "Cannot alter table: %s"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:52
+msgid "vector, import, database, points"
+msgstr "vector, import, bază de date, puncte"
+
+#: ../vector/v.in.db/main.c:54
+msgid "Creates new vector (points) map from database table containing coordinates."
+msgstr "Crează hartă vectorială nouă (puncte) din tabelul bazei de date care conține coordonate."
+
+#: ../vector/v.in.db/main.c:58
+msgid "Input table name"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:72
+msgid "Name of column containing x coordinate"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:77
+msgid "Name of column containing y coordinate"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:81
+msgid "Name of column containing z coordinate"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:86
+msgid "Name of column containing category number"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:87 ../vector/v.db.connect/main.c:73
+msgid "Must refer to an integer column"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:130
+#, c-format
+msgid "Output vector map, table <%s> (driver: <%s>, database: <%s>) already exists"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:141 ../vector/v.db.connect/main.c:290
+msgid "Data type of key column must be integer"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:173
+msgid "Writing features..."
+msgstr ""
+
+#: ../vector/v.in.db/main.c:180
+msgid "Key column must be integer"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:188
+msgid "x/y/z column must be integer or double"
+msgstr ""
+
+#: ../vector/v.in.db/main.c:235
+#, c-format
+msgid "%d points written to vector map."
+msgstr ""
+
+#: ../vector/v.select/main.c:52
+msgid "vector, spatial query"
+msgstr "vector, interogare spațială"
+
+#: ../vector/v.select/main.c:54
+msgid "Selects features from vector map (A) by features from other vector map (B)."
+msgstr "Selectează trăsături din harta vectorială (A) în funcție de trăsăturile din harta vectorială (B)."
+
+#: ../vector/v.select/main.c:87
+msgid "Unknown operator"
+msgstr "Operator necunoscut"
+
+#: ../vector/v.select/main.c:124
+msgid "Output from v.select"
+msgstr ""
+
+#: ../vector/v.select/main.c:172
+#, c-format
+msgid "Unable to read line id %d from vector map <%s>"
+msgstr ""
+
+#: ../vector/v.select/main.c:278
+msgid "Processing areas..."
+msgstr ""
+
+#: ../vector/v.select/main.c:301
+#, c-format
+msgid "Unable to read area id %d from vector map <%s>"
+msgstr ""
+
+#: ../vector/v.select/main.c:446
+msgid "Writing selected features..."
+msgstr ""
+
+#: ../vector/v.select/main.c:512
+#, c-format
+msgid "Layer %d - no table"
+msgstr ""
+
+#: ../vector/v.select/main.c:527
+#, c-format
+msgid "Layer %d - unable to copy table"
+msgstr ""
+
+#: ../vector/v.select/main.c:542
+#, c-format
+msgid "%d features without category skipped"
+msgstr ""
+
+#: ../vector/v.select/main.c:545
+#, c-format
+msgid "%d features written to output."
+msgstr ""
+
+#: ../vector/v.select/args.c:45
+msgid "Operator defines required relation between features"
+msgstr ""
+
+#: ../vector/v.select/args.c:47
+msgid "A feature is written to output if the result of operation 'ainput operator binput' is true. An input feature is considered to be true, if category of given layer is defined."
+msgstr ""
+
+#: ../vector/v.select/args.c:53
+msgid "overlap;features partially or completely overlap"
+msgstr ""
+
+#: ../vector/v.select/args.c:58
+msgid "overlap;features partially or completely overlap;equals;features are spatially equals (using GEOS);disjoint;features do not spatially intersect (using GEOS);intersects;features spatially intersect (using GEOS);touches;features spatially touches (using GEOS);crosses;features spatially crosses (using GEOS);within;feature A is completely inside feature B (using GEOS);contains;feature B is completely inside feature A (using GEOS);overlaps;features spatially overlap (using GEOS);relate;feature A is spatially related to feature B (using GEOS, requires 'relate' option);"
+msgstr ""
+
+#: ../vector/v.select/args.c:75
+msgid "Intersection Matrix Pattern used for 'relate' operator"
+msgstr ""
+
+#: ../vector/v.select/args.c:84
+msgid "Do not skip features without category"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:79
+#: ../vector/lidar/v.lidar.correction/main.c:73
+msgid "vector, LIDAR"
+msgstr "vector, LIDAR"
+
+#: ../vector/lidar/v.lidar.growing/main.c:81
+msgid "Building contour determination and Region Growing algorithm for determining the building inside"
+msgstr "Determinarea conturului de construcție și algoritmul Regiunii de Creștere pentru determinarea interiorului clădirii"
+
+#: ../vector/lidar/v.lidar.growing/main.c:86
+msgid "Input vector (v.lidar.edgedetection output"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:96
+msgid "Name of the first pulse vector map"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:103
+msgid "Threshold for cell object frequency in region growing"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:111
+msgid "Threshold for double pulse in region growing"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:166
+#: ../vector/lidar/v.surf.bspline/main.c:210
+#: ../vector/lidar/v.surf.bspline/main.c:362
+#: ../vector/lidar/v.lidar.edgedetection/main.c:193
+#: ../vector/lidar/v.lidar.edgedetection/main.c:205
+#: ../vector/lidar/v.lidar.edgedetection/main.c:255
+#: ../vector/lidar/v.lidar.correction/main.c:169
+#: ../vector/lidar/v.lidar.correction/main.c:229
+#: ../vector/lidar/v.outlier/main.c:171 ../vector/lidar/v.outlier/main.c:237
+#, c-format
+msgid "No database connection for driver <%s> is defined. Run db.connect."
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:179
+#, c-format
+msgid "Unable to open table <%s>"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:204
+msgid "Setting regions and boxes"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:249
+#: ../vector/lidar/v.surf.bspline/main.c:485
+#: ../vector/lidar/v.lidar.edgedetection/main.c:354
+#: ../vector/lidar/v.lidar.correction/main.c:334
+#: ../vector/lidar/v.outlier/main.c:332
+#, c-format
+msgid "subregion %d of %d"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:270
+#, c-format
+msgid "Rows = %d"
+msgstr "Rânduri = %d"
+
+#: ../vector/lidar/v.lidar.growing/main.c:271
+#, c-format
+msgid "Columns = %d"
+msgstr "Coloane = %d"
+
+#: ../vector/lidar/v.lidar.growing/main.c:291
+msgid "read points in input vector"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/main.c:440
+msgid "Region Growing"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.growing/ConvexHull.c:269
+msgid "...now exiting to system..."
+msgstr ""
+
+#: ../vector/lidar/lidarlib/zones.c:414 ../vector/lidar/lidarlib/zones.c:451
+#, c-format
+msgid "<%s> created in database."
+msgstr ""
+
+#: ../vector/lidar/lidarlib/zones.c:418 ../vector/lidar/lidarlib/zones.c:455
+#, c-format
+msgid "<%s> has not been created in database."
+msgstr ""
+
+#: ../vector/lidar/lidarlib/TcholBand.c:28
+msgid "Decomposition failed"
+msgstr ""
+
+#: ../vector/lidar/lidarlib/raster.c:80 ../vector/lidar/lidarlib/raster.c:95
+#: ../vector/lidar/lidarlib/raster.c:108 ../vector/lidar/lidarlib/raster.c:125
+#: ../vector/lidar/lidarlib/raster.c:140 ../vector/lidar/lidarlib/raster.c:153
+#: ../vector/lidar/lidarlib/raster.c:168 ../vector/lidar/lidarlib/raster.c:181
+#, c-format
+msgid "Unable to access table <%s>"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:85
+msgid "Bicubic or bilinear spline interpolation with Tykhonov regularization."
+msgstr "Interpolare spline bicubică sau bilineară cu regularizare Tykhonov."
+
+#: ../vector/lidar/v.surf.bspline/main.c:90
+msgid "Find the best Tykhonov regularizing parameter using a \"leave-one-out\" cross validation method"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:94
+#: ../vector/lidar/v.lidar.edgedetection/main.c:84
+#: ../vector/lidar/v.lidar.correction/main.c:79
+#: ../vector/lidar/v.outlier/main.c:78
+msgid "Estimate point density and distance"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:96
+#: ../vector/lidar/v.lidar.edgedetection/main.c:86
+#: ../vector/lidar/v.lidar.correction/main.c:81
+#: ../vector/lidar/v.outlier/main.c:80
+msgid "Estimate point density and distance for the input vector points within the current region extends and quit"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:104
+msgid "Name of input vector map of sparse points"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:119
+msgid "Length of each spline step in the east-west direction"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:128
+msgid "Length of each spline step in the north-south direction"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:135
+msgid "Spline interpolation algorithm"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:144
+msgid "Tykhonov regularization parameter (affects smoothing)"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:159
+msgid "Attribute table column with values to interpolate (if layer>0)"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:172
+msgid "Choose either vector or raster output, not both"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:175
+msgid "No raster or vector or cross-validation output"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:191
+#: ../vector/lidar/v.lidar.edgedetection/main.c:173
+#: ../vector/lidar/v.lidar.correction/main.c:152
+#: ../vector/lidar/v.outlier/main.c:139
+msgid "Unable to read name of database"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:194
+#: ../vector/lidar/v.lidar.edgedetection/main.c:176
+#: ../vector/lidar/v.lidar.correction/main.c:155
+#: ../vector/lidar/v.outlier/main.c:142
+msgid "Unable to read name of driver"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:213
+#: ../vector/lidar/v.lidar.edgedetection/main.c:196
+#: ../vector/lidar/v.lidar.edgedetection/main.c:208
+#: ../vector/lidar/v.lidar.correction/main.c:172
+#: ../vector/lidar/v.outlier/main.c:174
+msgid "Old auxiliar table could not be dropped"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:223
+#: ../vector/lidar/v.surf.bspline/main.c:277
+#: ../vector/lidar/v.outlier/main.c:181
+#, c-format
+msgid "Unable to open vector map <%s> at the topological level"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:229
+msgid "Need either 3D vector or layer and column with z values"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:231
+msgid "Layer but not column with z values given"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:241
+#: ../vector/lidar/v.lidar.edgedetection/main.c:237
+#: ../vector/lidar/v.lidar.correction/main.c:200
+#: ../vector/lidar/v.outlier/main.c:196
+msgid "No points in current region!"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:254
+msgid "Cross validation didn't finish correctly"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:260
+#, c-format
+msgid "Cross validation finished for sie = %f and sin = %f"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:269
+#, c-format
+msgid "Vector map <%s> of sparse points will be interpolated"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:285
+#, c-format
+msgid "Sorry, <%s> driver is not allowed for vector output in this module. Try with a raster output or other driver."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:307
+#, c-format
+msgid "Points in input vector map <%s> will be interpolated"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:320
+#, c-format
+msgid "Cells for raster map <%s> will be interpolated"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:329
+msgid "Cannot read field info"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:350
+#, c-format
+msgid "[%d] records selected from table"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:369
+#, c-format
+msgid "Interpolation: Creating table: It was impossible to create table <%s>."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:392
+msgid "Cannot allocate memory for auxiliar matrix.Consider changing region resolution"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:416
+#: ../vector/lidar/v.lidar.edgedetection/main.c:298
+#: ../vector/lidar/v.lidar.correction/main.c:278
+#: ../vector/lidar/v.outlier/main.c:276
+#, c-format
+msgid "adjusted EW splines %d"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:417
+#: ../vector/lidar/v.lidar.edgedetection/main.c:299
+#: ../vector/lidar/v.lidar.correction/main.c:279
+#: ../vector/lidar/v.outlier/main.c:277
+#, c-format
+msgid "adjusted NS splines %d"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:590
+#, c-format
+msgid "Interpolation: (%d,%d): No record for point (cat = %d)"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:709
+msgid "No data within this subregion. Consider increasing spline step values."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:715
+msgid "Writing output..."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/main.c:731
+#: ../vector/lidar/v.lidar.edgedetection/main.c:470
+#: ../vector/lidar/v.lidar.correction/main.c:440
+#: ../vector/lidar/v.outlier/main.c:433
+msgid "Auxiliar table could not be dropped"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:80
+#, c-format
+msgid "%d are too many points. The cross validation would take too much time."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:89
+#, c-format
+msgid "%d points read in region"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:93
+msgid "Maybe, it takes too long. It will depend on how many points you are considering."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:124
+#, c-format
+msgid "CrossCorrelation: driver=%s db=%s"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:141
+#, c-format
+msgid "No records selected from table <%s> "
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:156
+#, c-format
+msgid "Too many splines (%d x %d). Consider changing spline steps \"sie=\" \"sin=\"."
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:174
+#, c-format
+msgid "Beginning cross validation with lambda_i=%.4f ... (%d of %d)"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:300
+#, c-format
+msgid "Mean = %.5lf"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:301
+#, c-format
+msgid "Root Mean Square (RMS) = %.5lf"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:318
+msgid "Different number of splines and lambda_i values have been taken for the cross correlation"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:320
+#, c-format
+msgid "The minimum value for the test (rms=%lf) was obtained with: lambda_i = %.3f"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:328
+msgid "Table of results:"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:329
+#, c-format
+msgid "    lambda |       mean |        rms |\n"
+msgstr ""
+
+#: ../vector/lidar/v.surf.bspline/crosscorr.c:339
+msgid "No point lies into the current region"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:232
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:278
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:308
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:326
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:356
+msgid "Impossible to read from aux table"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:237
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:313
+msgid "Impossible to update aux table"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:250
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:262
+#: ../vector/lidar/v.lidar.edgedetection/edgedetection.c:383
+msgid "Impossible to write to aux table"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:78
+msgid "vector, LIDAR, edges"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:80
+msgid "Detects the object's edges from a LIDAR data set."
+msgstr "Detectează marginile obiectului dintr-un set de date LIDAR."
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:98
+#: ../vector/lidar/v.lidar.correction/main.c:105
+#: ../vector/lidar/v.outlier/main.c:108
+msgid "Interpolation spline step value in east direction"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:107
+#: ../vector/lidar/v.lidar.correction/main.c:113
+#: ../vector/lidar/v.outlier/main.c:116
+msgid "Interpolation spline step value in north direction"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:115
+msgid "Regularization weight in gradient evaluation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:124
+msgid "High gradient threshold for edge classification"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:133
+msgid "Low gradient threshold for edge classification"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:141
+msgid "Angle range for same direction detection"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:150
+msgid "Regularization weight in residual evaluation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:227
+#: ../vector/lidar/v.lidar.correction/main.c:190
+#: ../vector/lidar/v.outlier/main.c:186
+#, c-format
+msgid "Input vector map <%s> is not 3D!"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:260
+#, c-format
+msgid "It was impossible to create <%s>."
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:263
+#, c-format
+msgid "It was impossible to create <%s> interpolation table in database."
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:396
+msgid "Allocating memory for bilinear interpolation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:417
+#: ../vector/lidar/v.lidar.correction/main.c:403
+#: ../vector/lidar/v.outlier/main.c:393
+msgid "Bilinear interpolation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:429
+msgid "Allocating memory for bicubic interpolation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:434
+msgid "Bicubic interpolation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:446
+msgid "Point classification"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:460
+#: ../vector/lidar/v.lidar.correction/main.c:429
+#: ../vector/lidar/v.outlier/main.c:423
+msgid "No data within this subregion. Consider changing the spline step."
+msgstr ""
+
+#: ../vector/lidar/v.lidar.edgedetection/main.c:468
+#: ../vector/lidar/v.lidar.correction/main.c:438
+#, c-format
+msgid "Dropping <%s>"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:75
+msgid "Correction of the v.lidar.growing output. It is the last of the three algorithms for LIDAR filtering."
+msgstr "Corectarea de ieșire cu v.lidar.growing. Acesta este ultimul din cei trei algoritmi de filtrare pentru LIDAR."
+
+#: ../vector/lidar/v.lidar.correction/main.c:85
+msgid "Input observation vector map name (v.lidar.growing output)"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:88
+msgid "Output classified vector map name"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:97
+msgid "Only 'terrain' points output vector map"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:120
+msgid "Regularization weight in reclassification evaluation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:128
+msgid "High threshold for object to terrain reclassification"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:136
+msgid "Low threshold for terrain to object reclassification"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:325
+#, c-format
+msgid "nsply = %d"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:358
+#, c-format
+msgid "nsplx = %d"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:361
+msgid "read vector region map"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:366
+#, c-format
+msgid "npoints = %d, nterrain = %d"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:372
+msgid "Mean calculation"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:386
+msgid "Only TERRAIN points"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/main.c:416
+msgid "Correction and creation of terrain vector"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/correction.c:96
+#: ../vector/lidar/v.lidar.correction/correction.c:130
+#: ../vector/lidar/v.lidar.correction/correction.c:154
+#: ../vector/lidar/v.lidar.correction/correction.c:166
+#: ../vector/lidar/v.lidar.correction/correction.c:190
+#: ../vector/lidar/v.outlier/outlier.c:75
+#: ../vector/lidar/v.outlier/outlier.c:112
+#: ../vector/lidar/v.outlier/outlier.c:138
+#: ../vector/lidar/v.outlier/outlier.c:151
+#: ../vector/lidar/v.outlier/outlier.c:175
+msgid "Impossible to read the database"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/correction.c:100
+#: ../vector/lidar/v.lidar.correction/correction.c:158
+#: ../vector/lidar/v.outlier/outlier.c:79
+#: ../vector/lidar/v.outlier/outlier.c:142
+msgid "Impossible to update the database"
+msgstr ""
+
+#: ../vector/lidar/v.lidar.correction/correction.c:110
+#: ../vector/lidar/v.lidar.correction/correction.c:118
+#: ../vector/lidar/v.lidar.correction/correction.c:213
+#: ../vector/lidar/v.outlier/outlier.c:90
+#: ../vector/lidar/v.outlier/outlier.c:99
+#: ../vector/lidar/v.outlier/outlier.c:197
+msgid "Impossible to write in the database"
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:74
+msgid "Removes outliers from vector point data."
+msgstr "Elimină datele aberante din punctele vectoriale."
+
+#: ../vector/lidar/v.outlier/main.c:92
+msgid "Name of output outlier vector map"
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:100
+msgid "Name of vector map for visualization in QGIS"
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:122
+msgid "Tykhonov regularization weight"
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:129
+msgid "Threshold for the outliers"
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:243
+#, c-format
+msgid "It was impossible to create <%s> table."
+msgstr ""
+
+#: ../vector/lidar/v.outlier/main.c:405
+msgid "Outlier detection"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:70
+#: ../vector/v.lrs/v.lrs.create/main.c:121
+#: ../vector/v.lrs/v.lrs.where/main.c:58
+#: ../vector/v.lrs/v.lrs.label/main.c:102
+msgid "vector, LRS, networking"
+msgstr "vector, LRS, rețea"
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:72
+msgid "Creates points/segments from input lines, linear reference system and positions read from stdin or a file."
+msgstr "Crează puncte/segmente din linii de intrare, sistem de referință linear și poziții citite din stdin sau din fișier."
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:80
+msgid "Output vector map where segments will be written"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:91
+#: ../vector/v.lrs/v.lrs.create/main.c:205
+#: ../vector/v.lrs/v.lrs.where/main.c:85
+#: ../vector/v.lrs/v.lrs.label/main.c:122
+msgid "Driver name for reference system table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:99
+#: ../vector/v.lrs/v.lrs.create/main.c:213
+#: ../vector/v.lrs/v.lrs.where/main.c:93
+#: ../vector/v.lrs/v.lrs.label/main.c:130
+msgid "Database name for reference system table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:107
+#: ../vector/v.lrs/v.lrs.where/main.c:101
+#: ../vector/v.lrs/v.lrs.label/main.c:138
+msgid "Name of the reference system table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:151
+#: ../vector/v.lrs/v.lrs.create/main.c:304
+#: ../vector/v.lrs/v.lrs.where/main.c:145
+#: ../vector/v.lrs/v.lrs.label/main.c:308
+msgid "Unable to open database for reference table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:179
+#: ../vector/v.lrs/v.lrs.segment/main.c:233
+#, c-format
+msgid "Cannot read input: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:191
+#, c-format
+msgid "No record in LR table for: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:195
+#, c-format
+msgid "More than one record in LR table for: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:202
+#: ../vector/v.lrs/v.lrs.segment/main.c:289
+#, c-format
+msgid "Unable to find line of cat [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:212
+#, c-format
+msgid ""
+"Cannot get point on line: cat = [%d] distance = [%f] (line length = %f)\n"
+"%s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:248
+#, c-format
+msgid ""
+"No record in LRS table for 1. point of:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:253
+#, c-format
+msgid ""
+"Using last from more offsets found for 1. point of:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:257
+#, c-format
+msgid ""
+"Requested offset for the 1. point not found, using nearest found:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:268
+#, c-format
+msgid ""
+"No record in LRS table for 2. point of:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:273
+#, c-format
+msgid ""
+"Requested offset for the 2. point not found, using nearest found:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:277
+#, c-format
+msgid ""
+"Using first from more offsets found for 2. point of:\n"
+"  %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:282
+msgid "Segment over 2 (or more) segments, not yet supported"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:299
+#, c-format
+msgid "End of segment > line length (%e) -> cut"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:308
+#, c-format
+msgid ""
+"Cannot make line segment: cat = %d : %f - %f (line length = %f)\n"
+"%s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:346
+#: ../vector/v.lrs/v.lrs.where/main.c:220
+#, c-format
+msgid "[%d] points read from input"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:347
+#, c-format
+msgid "[%d] points written to output map (%d lost)"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:349
+#, c-format
+msgid "[%d] lines read from input"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.segment/main.c:350
+#, c-format
+msgid "[%d] lines written to output map (%d lost)"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:122
+msgid "Creates Linear Reference System"
+msgstr "Crează Sistem de Referință Linear"
+
+#: ../vector/v.lrs/v.lrs.create/main.c:131
+msgid "Output vector map where oriented lines are written"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:136
+msgid "Output vector map of errors"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:141
+msgid "Input vector map containing reference points"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:149
+#: ../vector/v.lrs/v.lrs.where/main.c:79
+msgid "Point layer"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:156
+msgid "Column containing line identifiers for lines"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:163
+msgid "Column containing line identifiers for points"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:171
+msgid "Column containing milepost position for the beginning of next segment"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:180
+msgid "Column containing offset from milepost for the beginning of next segment"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:189
+msgid "Column containing milepost position for the end of previous segment"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:198
+msgid "Column containing offset from milepost for the end of previous segment"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:222
+msgid "Name of table where the reference system will be written"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:223
+msgid "New table is created by this module"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:230
+msgid "Maximum distance of point to line allowed"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:277
+msgid "Cannot get layer info for lines"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:280
+msgid "Cannot get layer info for points"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:315
+#, c-format
+msgid "Unable to drop table: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:334
+#, c-format
+msgid "Unable to select line id values from %s.%s."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:344
+msgid "Line id column must be integer"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:355
+#: ../vector/v.lrs/v.lrs.create/main.c:457
+msgid "Unable to fetch line id from line table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:407
+#, c-format
+msgid "Line [%d] without category (layer [%d])"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:427
+#, c-format
+msgid "No lines selected for line id [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:447
+#, c-format
+msgid "Unable to select point attributes from <%s>"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:478
+#, c-format
+msgid "Milepost (start) %f+%f used as %f+%f (change MP to integer)"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:500
+#, c-format
+msgid "Milepost (end) %f+%f used as %f+%f (change MP to integer)"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:526
+#, c-format
+msgid "Point [%d] without category (layer [%d])"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:573
+#, c-format
+msgid "Point [%d] cat [%d] is out of threshold (distance = %f)"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:705
+#, c-format
+msgid "End > start for point cat [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:722
+msgid "Start of 1. MP >= end of 2. MP for points' cats %[d], [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:739
+#, c-format
+msgid "Start of 1. MP >= start of 2. MP for points' cats [%d], [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:749
+#, c-format
+msgid "Distance along line identical for points' cats [%d], [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:763
+#, c-format
+msgid "Not enough points (%d) attached to the line (cat %d), line skip."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:768
+#, c-format
+msgid "Unable to guess direction for the line (cat %d), line skip."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:772
+#, c-format
+msgid "Incorrect order of points along line cat [%d]"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:822
+#, c-format
+msgid "Unable to insert reference records: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:863
+msgid "Building topology for output (out_lines) map..."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.create/main.c:869
+msgid "Building topology for error (err) map..."
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:60
+msgid "Finds line id and real km+offset for given points in vector map using linear reference system."
+msgstr "Găsește id-ul liniei și km real+offset pentru anumite puncte din harta vectorială folosind sistemul de referință linear."
+
+#: ../vector/v.lrs/v.lrs.where/main.c:69
+msgid "Input vector map containing points"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:108
+msgid "Maximum distance to nearest line"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:221
+#, c-format
+msgid "[%d] positions found"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:223
+#, c-format
+msgid "[%d] points outside threshold"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:225
+#, c-format
+msgid "[%d] points - no record found"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.where/main.c:227
+#, c-format
+msgid "[%d] points - too many records found"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:103
+msgid "Creates stationing from input lines, and linear reference system"
+msgstr "Crează staționare pentru liniile de intrare, și sistem de referință linear"
+
+#: ../vector/v.lrs/v.lrs.label/main.c:111
+msgid "Output vector map where stationing will be written"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:146
+msgid "Label file"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:155
+msgid "PM left, MP right, stationing left, stationing right offset"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:160
+msgid "Offset label in label x-direction in map units"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:167
+msgid "Offset label in label y-direction in map units"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:202
+msgid "Line width of text"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:203
+#: ../vector/v.lrs/v.lrs.label/main.c:211
+#: ../vector/v.lrs/v.lrs.label/main.c:221
+msgid "Only for d.label output"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:220
+msgid "Line width of highlight color"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:246
+msgid "Opaque to vector"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:247
+msgid "Only relevant if background color is selected"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:338
+#, c-format
+msgid "Unable to select records from LRS table: %s"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:428
+msgid "No record in LR table"
+msgstr ""
+
+#: ../vector/v.lrs/v.lrs.label/main.c:432
+msgid "More than one record in LR table"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:64
+msgid "vector, reclass, attributes"
+msgstr "vector, reclasificare, atribute"
+
+#: ../vector/v.reclass/main.c:66
+msgid "Changes vector category values for an existing vector map according to results of SQL queries or a value in attribute table column."
+msgstr "Schimbă valorile de categorie vectorială pentru o hartă vectorială existentă în funcție de rezultatele interogărilor SQL sau de valorile din coloana de atribute din tabel."
+
+#: ../vector/v.reclass/main.c:83
+msgid "The name of the column whose values are to be used as new categories"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:84
+msgid "The source for the new key column must be type integer or string"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:89
+msgid "Full path to the reclass rule file"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:100
+msgid "Either 'rules' or 'col' must be specified"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:224 ../vector/v.to.rast/vect2rast.c:73
+#: ../vector/v.to.rast/support.c:143 ../vector/v.to.rast/support.c:304
+#: ../vector/v.to.rast/support.c:454
+#, c-format
+msgid "No records selected from table <%s>"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:237
+msgid "Key column type is not integer"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:273
+#, c-format
+msgid "Cannot insert data: [%s]"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:310
+msgid "Column type must be integer or string"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:322
+#, c-format
+msgid "Unable to open rule file <%s>"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:338
+#, c-format
+msgid "Category %d overwritten by '%s'"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:342
+#, c-format
+msgid "Category '%s' invalid"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:346
+#, c-format
+msgid "Label '%s' overwritten by '%s'"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:352
+#, c-format
+msgid "Condition '%s' overwritten by '%s'"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:357
+#, c-format
+msgid "Unknown rule option: '%s'"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:371
+msgid "Cannot select values from database"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:387
+#, c-format
+msgid "%d previously set categories overwritten by new category %d"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:413
+msgid "Incomplete rule"
+msgstr ""
+
+#: ../vector/v.reclass/main.c:449
+#, c-format
+msgid "%d features reclassed."
+msgstr ""
+
+#: ../vector/v.to.rast/do_lines.c:65 ../vector/v.to.rast/do_areas.c:63
+msgid "Unable to use column specified"
+msgstr ""
+
+#: ../vector/v.to.rast/do_lines.c:125
+#, c-format
+msgid "%d lines with varying height were not written to raster"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:39
+msgid "vector, raster, conversion"
+msgstr "vector, raster, conversie"
+
+#: ../vector/v.to.rast/main.c:40
+msgid "Converts (rasterize) a vector map into a raster map."
+msgstr "Convertește hartă vectorială în hartă raster (rasterizare)."
+
+#: ../vector/v.to.rast/main.c:61
+msgid "Source of raster values"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:62
+msgid "attr;read values from attribute table;cat;use category values;val;use value specified by value option;z;use z coordinate (points or contours only);dir;output as flow direction (lines only)"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:71
+msgid "Name of column for 'attr' parameter (data type must be numeric)"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:77
+msgid "Name of color definition column (with RRR:GGG:BBB entries)"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:83
+msgid "Name of column used as raster category labels"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:92
+msgid "Raster value (for use=val)"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:113
+msgid "Column parameter missing (or use value parameter)"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:118
+msgid "Column parameter cannot be combined with use of category values option"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:123
+msgid "Column parameter cannot be combined with use of value option"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:128
+msgid "Column parameter cannot be combined with use of z coordinate"
+msgstr ""
+
+#: ../vector/v.to.rast/main.c:134
+#, c-format
+msgid "Unknown option '%s'"
+msgstr "Opțiunr necunoscută '%s'"
+
+#: ../vector/v.to.rast/vect2rast.c:39
+msgid "Loading data..."
+msgstr "ÃŽncarca data..."
+
+#: ../vector/v.to.rast/vect2rast.c:44
+#, c-format
+msgid "Vector map <%s> is not 3D"
+msgstr "Harta vectorială <%s> nu este 3D"
+
+#: ../vector/v.to.rast/vect2rast.c:69
+#, c-format
+msgid "Column type (%s) not supported (did you mean 'labelcolumn'?)"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:101
+#, c-format
+msgid "Unable to use column <%s>"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:119 ../vector/v.to.rast/support.c:578
+#, c-format
+msgid "Unknown use type: %d"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:132
+msgid "Unknown raster map type"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:140
+#, c-format
+msgid "Unable to process areas from vector map <%s>"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:156
+#, c-format
+msgid "Pass %d of %d:"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:164
+#, c-format
+msgid "Problem processing areas from vector map <%s>, continuing..."
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:175
+#, c-format
+msgid "Problem processing lines from vector map <%s>, continuing..."
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:200
+msgid "Creating support files for raster map..."
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:207
+msgid "Color can be updated from database only if use=attr"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:227
+#, c-format
+msgid "Converted areas: %d of %d"
+msgstr ""
+
+#: ../vector/v.to.rast/vect2rast.c:229
+#, c-format
+msgid "Converted points/lines: %d of %d"
+msgstr ""
+
+#: ../vector/v.to.rast/do_areas.c:49 ../vector/v.to.rast/do_areas.c:57
+#, c-format
+msgid "No record for area (cat = %d)"
+msgstr ""
+
+#: ../vector/v.to.rast/do_areas.c:78
+#, c-format
+msgid "Get area %d failed"
+msgstr ""
+
+#: ../vector/v.to.rast/do_areas.c:118
+msgid "Area without centroid (OK for island)"
+msgstr ""
+
+#: ../vector/v.to.rast/do_areas.c:125
+msgid "Area centroid without category"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:139 ../vector/v.to.rast/support.c:300
+#: ../vector/v.to.rast/support.c:450
+#, c-format
+msgid "Unknown column <%s> in table <%s>"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:160 ../vector/v.to.rast/support.c:326
+msgid "No records selected"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:173
+#, c-format
+msgid "Error in color definition column (%s) with cat %d: colorstring [%s]"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:176
+msgid "Color set to [200:200:200]"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:181
+#, c-format
+msgid "Error in color definition column (%s), with cat %d"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:273
+msgid "Label column was not specified, no labels will be written"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:349 ../vector/v.to.rast/support.c:496
+#, c-format
+msgid "Column type (%s) not supported"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:514
+msgid "Cannot allocate memory for row buffer"
+msgstr ""
+
+#: ../vector/v.to.rast/support.c:584
+#, c-format
+msgid "Unable to write categories for raster map <%s>"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:52
+msgid "Prints/sets DB connection for a vector map to attribute table."
+msgstr "Printează/setează conexiunea BD pentru o hartă vectorială la tabela de atribute."
+
+#: ../vector/v.db.connect/main.c:72
+msgid "Key column name"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:79
+msgid "Field separator for shell script style output"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:85
+msgid "Print all map connection parameters and exit"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:90
+msgid "Print all map connection parameters and exit in shell script style"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:93
+msgid "Format: layer[/layer name] table key database driver"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:103
+msgid "When printing, limit to layer specified by the layer option"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:108
+msgid "Print types/names of table columns for specified layer and exit"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:115
+msgid "Overwrite connection parameter for certain layer"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:120
+msgid "Delete connection for certain layer (not the table)"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:153
+msgid "Unable to modify vector map stored in other mapset"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:170
+#, c-format
+msgid "Vector map <%s> is connected by:"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:198
+#, c-format
+msgid "layer <%d> table <%s> in database <%s> through driver <%s> with key <%s>\n"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:261
+#, c-format
+msgid "Use -o to overwrite existing link for layer <%d>"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:269 ../vector/v.db.connect/main.c:309
+#, c-format
+msgid "Table <%s> does not exist in database <%s>"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:297 ../vector/v.db.connect/main.c:315
+#, c-format
+msgid "The table <%s> is now part of vector map <%s> and may be deleted or overwritten by GRASS modules"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:339
+msgid "Select privileges were granted on the table"
+msgstr ""
+
+#: ../vector/v.db.connect/main.c:346
+msgid "For defining a new connection you have to specify these parameters: driver, database, table [, key [, layer]]"
+msgstr ""
+
+#: ../vector/v.parallel/main.c:40
+msgid "Create parallel line to input lines"
+msgstr ""
+
+#: ../vector/v.parallel/main.c:52
+msgid "Offset in map units, positive for right side, negative for left side."
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:218
+#, c-format
+msgid "Could not find a path between stops %d and %d"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:255
+msgid "Finds shortest path using timetables."
+msgstr "Găsește calea cea mai scurtă folosind orar."
+
+#: ../vector/v.net.timetable/main.c:267
+msgid "Layer number or name with walking connections or -1"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:272
+msgid "Layer number or name with route paths or -1"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:278
+msgid "Name of column name with route ids"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:285
+msgid "Name of column name with stop timestamps"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:291
+msgid "Name of column name with stop ids"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:297
+msgid "Name of column name with walk lengths"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:345
+msgid "Could not initialize the timetables"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:421 ../vector/v.net.timetable/main.c:452
+#: ../vector/v.net.timetable/main.c:460
+#, c-format
+msgid "No stop with category: %d"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:467
+msgid "'From' and 'To' stops are the same"
+msgstr ""
+
+#: ../vector/v.net.timetable/main.c:476
+msgid "No path between the stops"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:108
+msgid "Convert OGR vector layers to GRASS vector map."
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:115
+msgid "OGR datasource name"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:116
+msgid ""
+"Examples:\n"
+"\t\tESRI Shapefile: directory containing shapefiles\n"
+"\t\tMapInfo File: directory containing mapinfo files"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:131
+msgid "OGR layer name. If not given, all available layers are imported"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:133
+msgid ""
+"Examples:\n"
+"\t\tESRI Shapefile: shapefile name\n"
+"\t\tMapInfo File: mapinfo file name"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:143
+msgid "Import subregion only"
+msgstr "Importă doar subregiunea"
+
+#: ../vector/v.in.ogr/main.c:144 ../vector/v.in.ogr/main.c:228
+msgid "Subregion"
+msgstr "Subregiune"
+
+#: ../vector/v.in.ogr/main.c:146
+msgid "Format: xmin,ymin,xmax,ymax - usually W,S,E,N"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:157
+msgid "Minimum size of area to be imported (square units)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:158 ../vector/v.in.ogr/main.c:179
+msgid "Min-area & snap"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:159
+msgid "Smaller areas and islands are ignored. Should be greater than snap^2"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:165
+msgid "Optionally change default input type"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:167
+msgid "point;import area centroids as points;line;import area boundaries as lines;boundary;import lines as area boundaries;centroid;import points as centroids"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:180
+msgid "'-1' for no snap"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:194
+msgid "List of column names to be used instead of original names, first is used for category column"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:201
+msgid "List available layers in data source and exit"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:210
+msgid "Do not clean polygons (not recommended)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:214 ../vector/v.random/main.c:127
+msgid "Create 3D output"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:224
+msgid "Override dataset projection (use location's projection)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:229
+msgid "Limit import to the current region"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:241
+msgid "Change column names to lowercase characters"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:258
+msgid "Available OGR Drivers:"
+msgstr "Drivere OGR disponibile:"
+
+#: ../vector/v.in.ogr/main.c:301
+#, c-format
+msgid "Unable to open data source <%s>"
+msgstr "Imposibil de deschis sursa de date <%s>"
+
+#: ../vector/v.in.ogr/main.c:309
+#, c-format
+msgid "Data source contains %d layers:"
+msgstr "Sursa datelor conține %d straturi:"
+
+#: ../vector/v.in.ogr/main.c:342
+#, c-format
+msgid "Vector map <%s> already exists and will be overwritten"
+msgstr "Harta vectorială <%s> există deja și va fi scrisă peste"
+
+#: ../vector/v.in.ogr/main.c:386
+msgid "Select either the current region flag or the spatial option, not both"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:414
+msgid "4 parameters required for 'spatial' parameter"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:491
+msgid "Unable to convert input map projection to GRASS format; cannot create new location"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:503
+msgid "Unable to convert input map projection information to GRASS format for checking"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:533
+msgid "GRASS LOCATION PROJ_INFO is:\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:593
+#, c-format
+msgid ""
+"\n"
+"You can use the -o flag to %s to override this projection check.\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:596
+msgid "Consider generating a new location with 'location' parameter from input data set.\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:619
+#, c-format
+msgid "Using temporary vector <%s>"
+msgstr "Folosirea vectorului temporar <%s>"
+
+#: ../vector/v.in.ogr/main.c:640
+#, c-format
+msgid "Layer: %s"
+msgstr "Strat: %s"
+
+#: ../vector/v.in.ogr/main.c:711
+#, c-format
+msgid "Column name changed: '%s' -> '%s'"
+msgstr "Numele coloanei modificat: '%s' -> '%s'"
+
+#: ../vector/v.in.ogr/main.c:735
+#, c-format
+msgid "Writing column <%s> with fixed length %d chars (may be truncated)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:758
+#, c-format
+msgid "Width for column %s set to 255 (was not specified by OGR), some strings may be truncated!"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:770
+#, c-format
+msgid "Writing column %s with fixed length %d chars (may be truncated)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:774
+#, c-format
+msgid "Column type not supported (%s)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:789
+#, c-format
+msgid "Unable open database <%s> by driver <%s>"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:826
+#, c-format
+msgid "Counting polygons for %d features..."
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:848
+#, c-format
+msgid "Boundary splitting distance in map units: %G"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:853
+#, c-format
+msgid "Importing map %d features..."
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:955
+#, c-format
+msgid "%d %s without geometry"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:979
+msgid "Cleaning polygons, result is not guaranteed!"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:983
+#, c-format
+msgid "Snap boundaries (threshold = %.3e):"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:997
+msgid "Break polygons:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1002 ../vector/v.in.ogr/main.c:1016
+msgid "Remove duplicates:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1012
+msgid "Break boundaries:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1020
+msgid "Clean boundaries at nodes:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1027
+msgid "Merge boundaries:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1032
+msgid "Change boundary dangles to lines:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1036
+msgid "Change dangles to lines:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1042
+msgid "Change boundary bridges to lines:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1046
+msgid "Remove bridges:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1081
+#, c-format
+msgid "Find centroids for layer: %s"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1102
+msgid "Write centroids:"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1152
+#, c-format
+msgid "%d areas represent more (overlapping) features, because polygons overlap in input layer(s). Such areas are linked to more than 1 row in attribute table. The number of features for those areas is stored as category in layer %d"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1162
+#, c-format
+msgid "%d input polygons\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1163
+#, c-format
+msgid "%d input polygons"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1166
+#, c-format
+msgid "Total area: %G (%d areas)\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1167
+#, c-format
+msgid "Total area: %G (%d areas)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1170
+#, c-format
+msgid "Overlapping area: %G (%d areas)\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1172
+#, c-format
+msgid "Overlapping area: %G (%d areas)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1176
+#, c-format
+msgid "Area without category: %G (%d areas)\n"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1178
+#, c-format
+msgid "Area without category: %G (%d areas)"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1228
+msgid "Errors were encountered during the import"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1229
+#, c-format
+msgid "Try to import again, snapping with at least %g: 'snap=%g'"
+msgstr ""
+
+#: ../vector/v.in.ogr/main.c:1270
+msgid "Input data contains 3D features. Created vector is 2D only, use -z flag to import 3D vector"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:195
+msgid "Cannot read part of geometry"
+msgstr "Nu s-a putut citi partea de geometrie"
+
+#: ../vector/v.in.ogr/geom.c:234 ../vector/v.in.ogr/geom.c:247
+#: ../vector/v.in.ogr/geom.c:275 ../vector/v.in.ogr/geom.c:321
+msgid "Skipping empty geometry feature"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:291
+#, c-format
+msgid "Degenerate polygon ([%d] vertices)"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:334
+#, c-format
+msgid "Degenerate island ([%d] vertices)"
+msgstr ""
+
+#: ../vector/v.in.ogr/geom.c:368
+msgid "Cannot calculate centroid"
+msgstr "Nu s-a putut calcula centroidul"
+
+#: ../vector/v.in.ogr/geom.c:399
+msgid "No centroid written for polygon with 0 vertices"
+msgstr "Nici un centroid scris pentru un poligon cu 0 vertecși"
+
+#: ../vector/v.in.ogr/geom.c:420
+msgid "Cannot write part of geometry"
+msgstr "Nu s-a putut scrie partea de geometrie"
+
+#: ../vector/v.in.ogr/geom.c:426
+msgid "Unknown geometry type"
+msgstr "Tip de geometrie necunoscut"
+
+#: ../vector/v.net.components/main.c:69
+msgid "vector, network, components"
+msgstr "vector, rețea, componente"
+
+#: ../vector/v.net.components/main.c:71
+msgid "Computes strongly and weakly connected components in the network."
+msgstr "Calculează componentele cele mai puternic și cele mai slab conectate din rețea."
+
+#: ../vector/v.net.components/main.c:85
+msgid "weak;Weakly connected components;strong;Strongly connected components;"
+msgstr ""
+
+#: ../vector/v.net.components/main.c:87
+msgid "Type of components"
+msgstr "Tipul componentelor"
+
+#: ../vector/v.net.components/main.c:91 ../vector/v.net.centrality/main.c:171
+msgid "Add points on nodes"
+msgstr ""
+
+#: ../vector/v.perturb/normalrs.c:31
+msgid "normalsv: restoration of unitialized block"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:73
+msgid "vector, geometry, statistics"
+msgstr "vector, geometrie, statistici"
+
+#: ../vector/v.perturb/main.c:75
+msgid "Random location perturbations of GRASS vector points"
+msgstr "Locația aleatorie a punctelor vectoriale perturbate GRASS"
+
+#: ../vector/v.perturb/main.c:78
+msgid "Vector points to be spatially perturbed"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:88
+msgid "Distribution of perturbation"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:96
+msgid "Parameter(s) of distribution. If the distribution is uniform, only one parameter, the maximum, is needed. For a normal distribution, two parameters, the mean and standard deviation, are required."
+msgstr ""
+
+#: ../vector/v.perturb/main.c:106
+msgid "Minimum deviation in map units"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:113
+msgid "Seed for random number generation"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:137 ../vector/v.perturb/main.c:144
+msgid "Error scanning arguments"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:140
+msgid "Maximum of uniform distribution must be >= zero"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:147
+msgid "Standard deviation of normal distribution must be >= zero"
+msgstr ""
+
+#: ../vector/v.perturb/main.c:232
+msgid "Cannot get db link info"
+msgstr ""
+
+#: ../vector/v.perturb/normalsv.c:29
+msgid "normalsv: save of unitialized block"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:95
+msgid "vector, network, centrality measures"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:97
+msgid "Computes degree, centrality, betweeness, closeness and eigenvector centrality measures in the network."
+msgstr "Calculează gradele, centralitatea, aproprierea și vectorii eigen din rețea."
+
+#: ../vector/v.net.centrality/main.c:127
+msgid "Name of degree centrality column"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:128 ../vector/v.net.centrality/main.c:134
+#: ../vector/v.net.centrality/main.c:140 ../vector/v.net.centrality/main.c:146
+msgid "Columns"
+msgstr "Coloane"
+
+#: ../vector/v.net.centrality/main.c:133
+msgid "Name of closeness centrality column"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:139
+msgid "Name of betweenness centrality column"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:145
+msgid "Name of eigenvector centrality column"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:154
+msgid "Maximum number of iterations to compute eigenvector centrality"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:162
+msgid "Cummulative error tolerance for eigenvector centrality"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:293
+msgid "Computing degree centrality measure"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:297
+msgid "Computing betweenness and/or closeness centrality measure"
+msgstr ""
+
+#: ../vector/v.net.centrality/main.c:304
+msgid "Computing eigenvector centrality measure"
+msgstr ""
+
+#: ../vector/v.generalize/smoothing.c:86
+#: ../vector/v.generalize/smoothing.c:146
+msgid "Look ahead parameter must be odd"
+msgstr ""
+
+#: ../vector/v.generalize/smoothing.c:481
+msgid "Unable to find the inverse matrix"
+msgstr "Imposibil de găsit matricea inversă"
+
+#: ../vector/v.generalize/smoothing.c:488
+msgid "Unable to calculate the output vectors"
+msgstr "Imposibil de calculat vectorii de ieșire"
+
+#: ../vector/v.generalize/main.c:77
+msgid "vector, generalization, simplification, smoothing, displacement, network generalization"
+msgstr "vector, generalizare, simplificare, netezire, deplasare, generalizarea rețelei"
+
+#: ../vector/v.generalize/main.c:78
+msgid "Vector based generalization."
+msgstr "Vectori bazați pe generalizare."
+
+#: ../vector/v.generalize/main.c:95
+msgid "douglas;Douglas-Peucker Algorithm;douglas_reduction;Douglas-Peucker Algorithm with reduction parameter;lang;Lang Simplification Algorithm;reduction;Vertex Reduction Algorithm eliminates points close to each other;reumann;Reumann-Witkam Algorithm;boyle;Boyle's Forward-Looking Algorithm;sliding_averaging;McMaster's Sliding Averaging Algorithm;distance_weighting;McMaster's Distance-Weighting Algorithm;chaiken;Chaiken's Algorithm;hermite;Interpolation by Cubic Hermite Splines;snakes;Snakes method for line smoothing;network;Network generalization;displacement;Displacement of lines close to each other;"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:109
+msgid "Generalization algorithm"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:116
+msgid "Maximal tolerance value"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:123
+msgid "Look-ahead parameter"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:132
+msgid "Percentage of the points in the output of 'douglas_reduction' algorithm"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:141
+msgid "Slide of computed point toward the original point"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:150
+msgid "Minimum angle between two consecutive segments in Hermite method"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:158
+msgid "Degree threshold in network generalization"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:167
+msgid "Closeness threshold in network generalization"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:175
+msgid "Betweeness threshold in network generalization"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:182
+msgid "Snakes alpha parameter"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:189
+msgid "Snakes beta parameter"
+msgstr ""
+
+#: ../vector/v.generalize/main.c:196
+msgid "Number of iterations"
+msgstr "Număr de iterații"
+
+#: ../vector/v.generalize/main.c:204
+msgid "Copy attributes"
+msgstr "Copiază atributele"
+
+#: ../vector/v.generalize/main.c:263
+msgid "Unknown method"
+msgstr "Metodă necunoscută"
+
+#: ../vector/v.generalize/main.c:323
+msgid "Displacement..."
+msgstr "Deplasare..."
+
+#: ../vector/v.generalize/main.c:332
+msgid "Network generalization..."
+msgstr "Generalizarea rețelei..."
+
+#: ../vector/v.generalize/main.c:347
+msgid "Attributes are needed for 'where' option, copying table"
+msgstr "Atributele sunt necesare pentru opțiunea 'where', copierea tabelului"
+
+#: ../vector/v.generalize/main.c:369
+#, c-format
+msgid "Generalization (%s)..."
+msgstr "Generalizare (%s)..."
+
+#: ../vector/v.generalize/main.c:463
+#, c-format
+msgid "Method '%s' did not preserve first point"
+msgstr "Metoda %s' nu a păstrat primul punct"
+
+#: ../vector/v.generalize/main.c:468
+#, c-format
+msgid "Method '%s' did not preserve last point"
+msgstr "Metoda %s' nu a păstrat ultimul punct"
+
+#: ../vector/v.generalize/main.c:495
+#, c-format
+msgid "%d boundaries were not modified because modification would damage topology"
+msgstr "%d limitele nu au fost modificate deoarece modificarea ar afecta topologia"
+
+#: ../vector/v.generalize/main.c:498
+#, c-format
+msgid "%d lines/boundaries were not modified due to over-simplification"
+msgstr "%d liniile/limitele nu au fost modificate din cauza supra-simplificării"
+
+#: ../vector/v.generalize/main.c:513
+#, c-format
+msgid "Number of vertices for selected lines %s from %d to %d (%d%%)."
+msgstr "Număr de vertecși pentru liniile selectate %s de la %d la %d (%d%%)."
+
+#: ../vector/v.generalize/main.c:514
+msgid "reduced"
+msgstr "redus"
+
+#: ../vector/v.generalize/main.c:514
+msgid "changed"
+msgstr "modificat"
+
+#: ../vector/v.generalize/misc.c:208 ../vector/v.generalize/misc.c:221
+#, c-format
+msgid "'%s' must be > 0 for '%s'"
+msgstr "'%s' trebuie sa fie > 0 pentru '%s'"
+
+#: ../vector/v.generalize/misc.c:210
+msgid "'where' and 'cats' parameters were supplied, cat will be ignored"
+msgstr ""
+
+#: ../vector/v.generalize/misc.c:216
+msgid "Unable to load data from database"
+msgstr "Imposibil de încărcat datele din baza de date"
+
+#: ../vector/v.generalize/misc.c:227
+msgid "Problem loading category values"
+msgstr "Problemă la încărcarea valorilor de categorii"
+
+#: ../vector/v.generalize/displacement.c:197
+msgid "Inverting matrix..."
+msgstr "Inversarea matricii..."
+
+#: ../vector/v.generalize/displacement.c:199
+msgid "Unable to calculate the inverse matrix"
+msgstr "Imposibil de calculat matricea inversă"
+
+#: ../vector/v.generalize/displacement.c:202
+msgid "Resolving conflicts..."
+msgstr "Rezolvarea conflictelor..."
+
+#: ../vector/v.generalize/network.c:164
+msgid "Calculating centrality measures..."
+msgstr ""
+
+#: ../vector/v.random/main.c:85
+msgid "Randomly generate a 2D/3D vector points map."
+msgstr "Generarea aleatorie a punctelor 2D/3D pe harta vectorială."
+
+#: ../vector/v.random/main.c:93
+msgid "Number of points to be created"
+msgstr "Număr de puncte pentru a fi creat(e)"
+
+#: ../vector/v.random/main.c:100
+msgid "Minimum z height (needs -z flag or column name)"
+msgstr "Înălțimea z minimă (necesită parametrul z sau numele coloanei)"
+
+#: ../vector/v.random/main.c:102 ../vector/v.random/main.c:111
+#: ../vector/v.random/main.c:123 ../vector/v.random/main.c:128
+msgid "3D output"
+msgstr "Ieșire 3D"
+
+#: ../vector/v.random/main.c:109
+msgid "Maximum z height (needs -z flag or column name)"
+msgstr "Înălțimea z maximă (necesită parametrul -z sau numele coloanei)"
+
+#: ../vector/v.random/main.c:119
+msgid "Column name and type (i.e. INTEGER, DOUBLE PRECISION) for z values"
+msgstr "Numele coloanei și tipul (de ex. ÎNTREG, PRECIZIE DUBLĂ) pentru valorile z"
+
+#: ../vector/v.random/main.c:121
+msgid "If type is not given then DOUBLE PRECISION is used. Writes Z data to column instead of 3D vector."
+msgstr "Dacă tipul nu este dat atunci PRECIZIA DUBLĂ nu este folosită. Scrie în coloană Z în locul vectorului 3D."
+
+#: ../vector/v.random/main.c:132
+msgid "Use drand48() function instead of rand()"
+msgstr "Utilizează funcția drand48() în loc de rând()"
+
+#: ../vector/v.random/main.c:142
+msgid "v.random can't create 3D vector and attribute table at same time"
+msgstr "v.random nu poate creat vector 3D și tabela de atribute în același timp"
+
+#: ../vector/v.random/main.c:150
+#, c-format
+msgid "Number of points must be > 0 (%d given)"
+msgstr "Numărul de puncte trebuie să fie > 0 (%d dat)"
+
+#: ../vector/v.random/main.c:179
+#, c-format
+msgid "Using 'double precision' for column <%s>"
+msgstr "Folosind 'precizie dublă' pentru coloană <%s>"
+
+#: ../vector/v.random/main.c:221
+msgid "Table should contain only two columns"
+msgstr "Tabelul trebuie să conțină doar două coloane"
+
+#: ../vector/v.random/main.c:234
+msgid "You have created unsupported column type. This module supports only INTEGER and DOUBLE PRECISION column types."
+msgstr "Ați creat un tip de coloană nesuportat. Acest modul suportă doar coloane de tip INTEGER și cu DUBLĂ PRECIZIE."
+
+#: ../vector/v.random/main.c:264
+msgid "Generating points..."
+msgstr "Generarea punctelor..."
+
+#: ../vector/v.neighbors/main.c:48
+msgid "vector, raster, aggregation"
+msgstr "vector, raster, agregare"
diff --git a/locale/po/grassnviz_fr.po b/locale/po/grassnviz_fr.po
new file mode 100644
index 0000000..041b345
--- /dev/null
+++ b/locale/po/grassnviz_fr.po
@@ -0,0 +1,2504 @@
+# translation of grassnviz_fr.po to french
+# This file is distributed under the same license as the GRASS package.
+# Copyright (C) 2013 GRASS Development Team
+#
+# Sylvain Maillard <sylvain.maillard at gmail.com>, 2013.
+msgid ""
+msgstr ""
+"Project-Id-Version: grassnviz_fr\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-10 00:42+0200\n"
+"PO-Revision-Date: 2013-05-18 12:46+0100\n"
+"Last-Translator: Sylvain Maillard <sylvain.maillard at gmail.com>\n"
+"Language-Team: Français <grass-translations at lists.osgeo.org>\n"
+"Language: fr\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-Generator: Poedit 1.5.5\n"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:197
+msgid "Show Panels"
+msgstr "Afficher  les panneaux"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:204
+#: ../visualization/nviz/scripts/nviz2.2_script:327
+#: ../visualization/nviz/scripts/nviz2.2_script:688
+msgid "Hide Panels"
+msgstr "Cacher les panneaux"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:246
+msgid "Start"
+msgstr "Démarrer"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:267
+#: ../visualization/nviz/scripts/nviz2.2_script:274
+#: ../visualization/nviz/scripts/nviz2.2_script:281
+#: ../visualization/nviz/scripts/nviz2.2_script:289
+msgid "Togl canvas initialization failed. Is Your OpenGL working fine?"
+msgstr ""
+"L'initialisation du canevas Togl a échoué. Est-ce que OpenGL fonctionne "
+"correctement ?"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:349
+msgid "Please Wait..."
+msgstr "Merci de patienter ..."
+
+#: ../visualization/nviz/scripts/nviz2.2_script:355
+msgid "Help"
+msgstr "Aide"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:356
+msgid "NVIZ Help"
+msgstr "Aide de NVIZ"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:356
+msgid "About NVIZ"
+msgstr "À propos de NVIZ"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:356
+msgid "NVIZ - Bugs / ToDo"
+msgstr "NVIZ - Bugs / À faire"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:368
+msgid "File"
+msgstr "Ficher"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:369
+msgid "Load State"
+msgstr "Charger l'état"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:369
+msgid "Save State"
+msgstr "Enregistre l'état"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:371
+msgid "Set Canvas Size"
+msgstr "Définir la taille de canevas"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:373
+msgid "Load 3d Settings"
+msgstr "Charger les paramètres 3D"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:373
+msgid "Save 3d Settings"
+msgstr "Enregistrer les paramètres 3D"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:375
+msgid "Save image as..."
+msgstr "Enregistre l'image sous ..."
+
+#: ../visualization/nviz/scripts/nviz2.2_script:377
+#: ../visualization/nviz/scripts/nviz2.2_script:925
+#: ../visualization/nviz/scripts/panel_vol.tcl:1169
+#: ../visualization/nviz/scripts/panel_surf.tcl:725
+#: ../visualization/nviz/scripts/site_attr.tcl:483
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:182
+#: ../visualization/nviz/scripts/panel_rquery.tcl:64
+#: ../visualization/nviz/scripts/panel_lights.tcl:81
+msgid "Reset"
+msgstr "Réinitialiser"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:377
+msgid "Quit"
+msgstr "Quitter"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:410
+msgid "Scripting"
+msgstr "Scripts"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:414
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:230
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1249
+msgid "On"
+msgstr "On"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:420
+msgid "Create New Scriptfile"
+msgstr "Créer un nouveau fichier de script"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:423
+msgid "Open and Play Script"
+msgstr "Ouvrir et lancer un script"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:426
+msgid "Close Script"
+msgstr "Fermer le script"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:431
+#: ../visualization/nviz/scripts/script_get_line:15
+msgid "Add Script Line"
+msgstr "Ajouter une ligne de script"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:434
+msgid "Add Script Command"
+msgstr "Ajouter une commande de script"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:439
+msgid "Script Tools"
+msgstr "Outils de script"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:484
+msgid "PPM Image"
+msgstr "Image PPM"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:486
+msgid "TIFF Image"
+msgstr "Image TIFF"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:500
+msgid "Maximum Resolution PPM"
+msgstr "Résolution maximale PPM"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:646
+msgid "Visualize"
+msgstr "Visualiser"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:680
+msgid "Appearance"
+msgstr "Apparence"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:800
+msgid "Set Size of Display Canvas"
+msgstr "Définir la taille du cadre d'affichage"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:803
+msgid "Width"
+msgstr "Largeur"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:805
+#: ../visualization/nviz/scripts/panel_pos.tcl:68
+msgid "Height"
+msgstr "Hauteur"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:811
+msgid "Unconstrained"
+msgstr "Non contraint"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:821
+#: ../visualization/nviz/scripts/panel_animation.tcl:203
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:111
+#: ../visualization/nviz/scripts/panel_site.tcl:114
+#: ../visualization/nviz/scripts/panel_vol.tcl:1170
+#: ../visualization/nviz/scripts/panel_surf.tcl:184
+#: ../visualization/nviz/scripts/panel_surf.tcl:726
+#: ../visualization/nviz/scripts/panel_label.tcl:96
+#: ../visualization/nviz/scripts/panel_legend.tcl:138
+#: ../visualization/nviz/scripts/panel_color.tcl:53
+#: ../visualization/nviz/scripts/panel_arrow.tcl:93
+#: ../visualization/nviz/scripts/script_tools:47
+#: ../visualization/nviz/scripts/panel_tst.tcl:53
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:186
+#: ../visualization/nviz/scripts/panel_vquery.tcl:144
+#: ../visualization/nviz/scripts/panel_vect.tcl:80
+#: ../visualization/nviz/scripts/panel_resize.tcl:58
+#: ../visualization/nviz/scripts/panel_scale.tcl:94
+#: ../visualization/nviz/scripts/panel_rquery.tcl:88
+#: ../visualization/nviz/scripts/panel_lights.tcl:83
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:69
+#: ../visualization/nviz/scripts/panel_pos.tcl:125
+#: ../visualization/nviz/scripts/panel_fringe.tcl:82
+msgid "Close"
+msgstr "Fermer"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:873
+#: ../visualization/nviz/scripts/nviz2.2_script:1027
+#: ../visualization/nviz/scripts/script_file_tools:126
+#, tcl-format
+msgid "Error while opening file: %s"
+msgstr "Erreor à l'ouverture du fichier : %s"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:926
+msgid "Really reset Nviz?"
+msgstr "Voulez-vous réellement réinitialiser NVIZ ?"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:926
+#: ../visualization/nviz/scripts/panel_animation.tcl:577
+#: ../visualization/nviz/scripts/panel_animation.tcl:755
+#: ../visualization/nviz/scripts/panel_animation.tcl:801
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:466
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:553
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:858
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1126
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1708
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1910
+#: ../visualization/nviz/scripts/script_get_line:18
+#: ../visualization/nviz/scripts/wirecolorPopup.tcl:80
+#: ../visualization/nviz/scripts/script_file_tools:113
+msgid "Ok"
+msgstr "Ok"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:926
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:172
+#: ../visualization/nviz/scripts/panel_main.tcl:112
+#: ../visualization/nviz/scripts/attPopup.tcl:133
+#: ../visualization/nviz/scripts/attPopup.tcl:475
+#: ../visualization/nviz/scripts/attPopup.tcl:523
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1910
+#: ../visualization/nviz/scripts/fileBrowser.tcl:115
+#: ../visualization/nviz/scripts/script_get_line:19
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:173
+#: ../visualization/nviz/scripts/script_tools:111
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:125
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:410
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:456
+#: ../visualization/nviz/scripts/ACS_utils.tcl:312
+#: ../visualization/nviz/scripts/ACS_utils.tcl:354
+#: ../visualization/nviz/scripts/ACS_utils.tcl:375
+#: ../visualization/nviz/scripts/ACS_utils.tcl:430
+#: ../visualization/nviz/scripts/ACS_utils.tcl:475
+#: ../visualization/nviz/scripts/ACS_utils.tcl:569
+#: ../visualization/nviz/scripts/ACS_utils.tcl:641
+#: ../visualization/nviz/scripts/wirecolorPopup.tcl:83
+#: ../visualization/nviz/scripts/mapBrowser.tcl:229
+#: ../visualization/nviz/scripts/script_file_tools:113
+#: ../visualization/nviz/scripts/script_file_tools:575
+#: ../visualization/nviz/scripts/script_file_tools:888
+msgid "Cancel"
+msgstr "Annuler"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:1055
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1923
+#: ../visualization/nviz/scripts/script_play:30
+msgid "File Error"
+msgstr "Erreur de fichier"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:1056
+#: ../visualization/nviz/scripts/panel_animation.tcl:577
+#: ../visualization/nviz/scripts/panel_animation.tcl:603
+#: ../visualization/nviz/scripts/panel_animation.tcl:644
+#: ../visualization/nviz/scripts/panel_animation.tcl:755
+#: ../visualization/nviz/scripts/panel_animation.tcl:801
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:497
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:505
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:577
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:678
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:858
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:873
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1007
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1126
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1872
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1925
+#: ../visualization/nviz/scripts/script_play:32
+msgid "Dismiss"
+msgstr "Annuler"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:100
+msgid "Simple Animation"
+msgstr "Animation simple"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:104
+msgid "Simple Keyframe Animation Panel"
+msgstr "Panneau simple d'animation des images clefs"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:111
+msgid "Step backward frame by frame"
+msgstr "Retour image par image"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:114
+msgid "Pause playback"
+msgstr "Pause de la lecture"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:117
+msgid "Step forward frame by frame"
+msgstr "Avence image par image"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:120
+msgid "Run animation from beginning"
+msgstr "Lire l'animation depuis le début"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:122
+msgid " set max frames:"
+msgstr " définir le maximum d'images :"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:136
+msgid "Key Frames"
+msgstr "Images-clefs"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:145
+msgid "Current frame:"
+msgstr "Image actuelle :"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:148
+msgid "Selected key frame:"
+msgstr "Sélectionner l'image-clef :"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:159
+msgid "Add frame"
+msgstr "Ajouter une image"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:161
+msgid "Clear all"
+msgstr "Tout effacer"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:170
+msgid "Show: "
+msgstr "Montrer :"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:171
+msgid "path"
+msgstr "chemin"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:173
+msgid "lines"
+msgstr "lignes"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:175
+msgid "points"
+msgstr "points"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:177
+msgid "volumes"
+msgstr "volumes"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:184
+msgid "Interpolation: "
+msgstr "Interpolation :"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:185
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:162
+msgid "linear"
+msgstr "linéaire"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:189
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:165
+msgid "spline"
+msgstr "spline"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:200
+msgid "Run and save"
+msgstr "Lancer et enregistrer"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:202
+msgid "Run animation and save frames"
+msgstr "Lancer l'animation et enregistrer les images"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:222
+msgid "spline tension"
+msgstr "spline avec tension"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:275
+#: ../visualization/nviz/scripts/panel_tst.tcl:21
+msgid "Test"
+msgstr "Test"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:576
+#: ../visualization/nviz/scripts/panel_animation.tcl:800
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1908
+#: ../visualization/nviz/scripts/script_file_tools:111
+msgid "Verify"
+msgstr "Vérifier"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:576
+msgid "Do you really want to delete this keyframe?"
+msgstr "Voulez-vous vraiment supprimer cette image clef ?"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:601
+#: ../visualization/nviz/scripts/panel_animation.tcl:642
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:676
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:871
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1005
+msgid "Internal Error"
+msgstr "Erreur interne"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:602
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:872
+msgid "Internal Error - Failed to delete keyframe in GK key list"
+msgstr ""
+"Erreur interne - la suppression de l'image clef de la liste GK a échoué"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:643
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1006
+msgid "Internal Error - Failed to move keyframe in GK key list"
+msgstr ""
+"Erreur interne - le déplacement de l'image clef dans la liste GK a échoué"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:753
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1124
+msgid "Replace Key"
+msgstr "Remplacer la clef"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:754
+msgid "There is already a keyframe at this time, do you wish to replace it?"
+msgstr "Il y a déjà une image-clef à ce temps, voulez-vous la remplacer ?"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:800
+msgid "Do you really want to delete all keyframes?"
+msgstr "Voulez-vous vraiment supprimer toutes les images-clefs ?"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:928
+msgid "Save Animation Frames"
+msgstr "Enregistrer les iamges d'animation"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:934
+msgid "Prefix for images: "
+msgstr "Préfix pour les images :"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:935
+msgid "Enter a prefix name for images to be created from animation frames"
+msgstr "Entrer un nom de préfix pour les images à créer depuis l'animation"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:940
+msgid "Output format: "
+msgstr "Format de sortie :"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:941
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1712
+msgid "PPM"
+msgstr "PPM"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:942
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1713
+msgid "TIFF"
+msgstr "TIFF"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:943
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1714
+msgid "MPEG-1"
+msgstr "MPEG-1"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:948
+msgid "Rendering mode: "
+msgstr "mode de rendu :"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:949
+#: ../visualization/nviz/scripts/panel_surf.tcl:143
+msgid "coarse"
+msgstr "grossier"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:950
+#: ../visualization/nviz/scripts/panel_surf.tcl:153
+msgid "fine"
+msgstr "fin"
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:955
+#: ../visualization/nviz/scripts/ACS_utils.tcl:312
+#: ../visualization/nviz/scripts/ACS_utils.tcl:354
+#: ../visualization/nviz/scripts/ACS_utils.tcl:375
+#: ../visualization/nviz/scripts/ACS_utils.tcl:430
+#: ../visualization/nviz/scripts/ACS_utils.tcl:475
+#: ../visualization/nviz/scripts/ACS_utils.tcl:569
+#: ../visualization/nviz/scripts/ACS_utils.tcl:641
+msgid "OK"
+msgstr "OK"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:99
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:98
+msgid "Remove"
+msgstr "Supprimer"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:105
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:104
+#: ../visualization/nviz/scripts/mapBrowser.tcl:150
+msgid "MAPSETS"
+msgstr "JEUX DE DONNÉES"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:119
+#: ../visualization/nviz/scripts/fileBrowser.tcl:99
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:118
+#: ../visualization/nviz/scripts/mapBrowser.tcl:168
+msgid "FILES"
+msgstr "FICHIERS"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:149
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:148
+msgid "Map Type:"
+msgstr "Type de carte :"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:152
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:151
+#: ../visualization/nviz/scripts/mapBrowser.tcl:207
+msgid "Map Type"
+msgstr "Type de carte"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:155
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:154
+#: ../visualization/nviz/scripts/mapBrowser.tcl:210
+msgid "Raster"
+msgstr "Raster"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:157
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:156
+#: ../visualization/nviz/scripts/mapBrowser.tcl:212
+msgid "Vector"
+msgstr "Vecteur"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:159
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:158
+#: ../visualization/nviz/scripts/mapBrowser.tcl:214
+msgid "Site"
+msgstr "Site"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:161
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:160
+#: ../visualization/nviz/scripts/mapBrowser.tcl:216
+msgid "Surf"
+msgstr "Surface"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:163
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:162
+#: ../visualization/nviz/scripts/mapBrowser.tcl:220
+msgid "Regions"
+msgstr "Régions"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:165
+#: ../visualization/nviz/scripts/panel_main.tcl:158
+#: ../visualization/nviz/scripts/panel_label.tcl:60
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:164
+#: ../visualization/nviz/scripts/mapBrowser.tcl:222
+msgid "Labels"
+msgstr "Étiquettes"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:168
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:167
+#: ../visualization/nviz/scripts/mapBrowser.tcl:225
+msgid "Icons"
+msgstr "ÃŽcones"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:171
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:172
+#: ../visualization/nviz/scripts/panel_legend.tcl:171
+#: ../visualization/nviz/scripts/script_file_tools:54
+msgid "Done"
+msgstr "Fini"
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:200
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:201
+#: ../visualization/nviz/scripts/mapBrowser.tcl:141
+msgid "Map Browser"
+msgstr "Naviguateur de cartes"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:60
+#: ../visualization/nviz/scripts/flythrough.tcl:141
+msgid "fly"
+msgstr "survol"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:67
+#: ../visualization/nviz/scripts/flythrough.tcl:270
+msgid "none"
+msgstr "Aucun"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:70
+#: ../visualization/nviz/scripts/flythrough.tcl:149
+#: ../visualization/nviz/scripts/flythrough.tcl:271
+msgid "basic"
+msgstr "basique"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:71
+#: ../visualization/nviz/scripts/flythrough.tcl:157
+msgid "simple"
+msgstr "simple"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:72
+#: ../visualization/nviz/scripts/flythrough.tcl:165
+msgid "orbit"
+msgstr "orbite"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:83
+msgid "Coarse Draw"
+msgstr "Affichage grossier"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:86
+msgid "fly help"
+msgstr "aide du survol"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:114
+msgid "Interactively set view position"
+msgstr "Définir la position de vue de manière interactive"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:135
+msgid "flythrough help"
+msgstr "Aide du survol"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:174
+msgid "move"
+msgstr "se déplacer"
+
+#: ../visualization/nviz/scripts/flythrough.tcl:196
+msgid "turn"
+msgstr "tourner"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:86
+msgid "Main"
+msgstr "Principal"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:104
+msgid "DRAW"
+msgstr "DESSINER"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:107
+msgid "Draw selected features"
+msgstr "Dessiner les objets sélectionnés"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:109
+#: ../visualization/nviz/scripts/site_attr.tcl:1437
+#: ../visualization/nviz/scripts/panel_rquery.tcl:66
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:64
+msgid "Clear"
+msgstr "Effacer"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:110
+msgid "Clear NVIZ display"
+msgstr "Effacre l'affichage NVIZ"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:113
+msgid "Cancel current draw"
+msgstr "Annuler l'actualisation du rendu"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:119
+msgid "Automatically render display:"
+msgstr "Rendu automatique :"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:123
+msgid "Automatically render display after changing parameters"
+msgstr "rendu automatique après modification des paramètres"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:128
+msgid "Show features:"
+msgstr "Afficher les objets :"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:131
+msgid "Main features..."
+msgstr "Objet principal ..."
+
+#: ../visualization/nviz/scripts/panel_main.tcl:136
+msgid "Decorations..."
+msgstr "Décorations ..."
+
+#: ../visualization/nviz/scripts/panel_main.tcl:142
+#: ../visualization/nviz/scripts/panel_surf.tcl:125
+#: ../visualization/nviz/scripts/script_file_tools:543
+msgid "Surface"
+msgstr "Surface"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:145
+msgid "Vectors"
+msgstr "Vecteurs"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:148
+msgid "Sites"
+msgstr "Sites"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:151
+#: ../visualization/nviz/scripts/panel_vol.tcl:40
+msgid "Volumes"
+msgstr "Volumes"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:156
+#: ../visualization/nviz/scripts/panel_legend.tcl:63
+msgid "Legend"
+msgstr "Légende"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:160
+msgid "North Arrow"
+msgstr "Flèche Nord"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:162
+msgid "Scale Bar"
+msgstr "Barre d'échelle"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:164
+#: ../visualization/nviz/scripts/panel_fringe.tcl:43
+msgid "Fringe"
+msgstr "Bordures"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:175
+msgid "View method:"
+msgstr "Méthode de visualisation :"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:177
+msgid "eye"
+msgstr "oeil"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:181
+#: ../visualization/nviz/scripts/panel_main.tcl:220
+msgid "center"
+msgstr "centre"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:186
+msgid "Change view by moving eye position"
+msgstr "Changer la vue en bougant la position de l'oeil"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:187
+msgid "Change view by moving scene center position"
+msgstr "Changer la vue en bougant le centre de la scène"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:196
+msgid "Change view using mouse to control fly-through"
+msgstr "Changer la vue en utilisant la souris pour contrôler le mode survol"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:205
+#: ../visualization/nviz/scripts/panel_main.tcl:206
+msgid "Set vertical exaggeration"
+msgstr "Définir l'exagération verticale"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:207
+#: ../visualization/nviz/scripts/panel_main.tcl:208
+msgid "Set eye height"
+msgstr "Définir la hauteur de vue"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:213
+msgid "Look"
+msgstr "Regarder"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:214
+msgid "here"
+msgstr "ici"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:215
+msgid "Center view at point marked with mouse click"
+msgstr "Centrer la vue sur le clic de la souris"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:221
+msgid "Center view at center of displayed surface"
+msgstr "Centrer la vue au centre de la surface affichée"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:225
+msgid "top"
+msgstr "dessus"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:226
+msgid "View directly from above"
+msgstr "Voir directement depuis au-dessus"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:246
+msgid "perspective"
+msgstr "perspective"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:247
+msgid "twist"
+msgstr "pivoter"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:249
+msgid "Set field of view size (degrees)"
+msgstr "Définir la taille de la vue (degrés)"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:250
+msgid "Set twist angle (degrees)"
+msgstr "Définir l'angle de vue (degrés)"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:253
+msgid "reset"
+msgstr "réinitialiser"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:255
+msgid "Reset view to default"
+msgstr "Réinitialiser à la vue par défaut"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:416
+#: ../visualization/nviz/scripts/widgets.tcl:334
+msgid "z-exag"
+msgstr "z-exag"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:432
+#: ../visualization/nviz/scripts/panel_vol.tcl:457
+#: ../visualization/nviz/scripts/panel_vol.tcl:460
+#: ../visualization/nviz/scripts/panel_vol.tcl:735
+#: ../visualization/nviz/scripts/panel_vol.tcl:738
+#: ../visualization/nviz/scripts/panel_resize.tcl:43
+#: ../visualization/nviz/scripts/widgets.tcl:329
+msgid "height"
+msgstr "hauteur"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:517
+msgid "Set eye position"
+msgstr "Définir la position de l'oeil"
+
+#: ../visualization/nviz/scripts/panel_main.tcl:522
+msgid "Set center of view position"
+msgstr "Définir le centre de position de vue"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:45
+#: ../visualization/nviz/scripts/attPopup.tcl:46
+#: ../visualization/nviz/scripts/panel_vol.tcl:1115
+#: ../visualization/nviz/scripts/panel_surf.tcl:671
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:36
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:37
+msgid "Attribute"
+msgstr "Attribut"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:88
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:80
+#, tcl-format
+msgid "Change attribute: %s"
+msgstr "Changer l'attribut : %s"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:92
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:85
+msgid "New map"
+msgstr "Nouvelle carte"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:97
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:89
+msgid "Remove mask"
+msgstr "Supprimer le masque"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:98
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:90
+msgid "invert mask"
+msgstr "Inverser le masque"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:106
+#: ../visualization/nviz/scripts/attPopup.tcl:115
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:98
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:107
+msgid "New constant"
+msgstr "Nouvelle constante"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:107
+msgid "use as color"
+msgstr "utilisr comme couleur"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:113
+msgid "Constant not supported"
+msgstr "Constante non supportée"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:122
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:114
+msgid "Curr. value: "
+msgstr "Valeure actuelle :"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:128
+#: ../visualization/nviz/scripts/attPopup.tcl:474
+#: ../visualization/nviz/scripts/attPopup.tcl:522
+#: ../visualization/nviz/scripts/fileBrowser.tcl:113
+#: ../visualization/nviz/scripts/script_tools:110
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:123
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:409
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:455
+#: ../visualization/nviz/scripts/mapBrowser.tcl:227
+#: ../visualization/nviz/scripts/script_file_tools:574
+#: ../visualization/nviz/scripts/script_file_tools:887
+msgid "Accept"
+msgstr "Accepter"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:319
+msgid "Surface Color"
+msgstr "Couleur de surface"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:462
+#: ../visualization/nviz/scripts/attPopup.tcl:512
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:399
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:445
+msgid "Constant"
+msgstr "Constante"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:468
+msgid "Enter value:"
+msgstr "Entrer une valeur :"
+
+#: ../visualization/nviz/scripts/attPopup.tcl:516
+msgid "Use slider to set value"
+msgstr "Utiliser le curseur pour définir la valeur"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:79
+msgid "Keyframe Animation"
+msgstr "Animation par image-clef"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:80
+msgid "Keyframe Animation Panel"
+msgstr "Panneau d'animation par image-clef"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:96
+msgid "Framerate :"
+msgstr "taux de rafraîchissement :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:105
+msgid "File: "
+msgstr "Fichier :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:106
+#: ../visualization/nviz/scripts/site_attr.tcl:1434
+msgid "Save"
+msgstr "Enregistrer"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:107
+msgid "Load"
+msgstr "Charger"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:109
+msgid "Animation: "
+msgstr "Animation : "
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:110
+msgid "Run and Save"
+msgstr "Lancer et enregistrer"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:130
+#: ../visualization/nviz/scripts/panel_vol.tcl:492
+#: ../visualization/nviz/scripts/panel_vol.tcl:860
+#: ../visualization/nviz/scripts/panel_legend.tcl:169
+#: ../visualization/nviz/scripts/script_file_tools:44
+msgid "Add"
+msgstr "Ajouter"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:131
+#: ../visualization/nviz/scripts/panel_site.tcl:59
+#: ../visualization/nviz/scripts/panel_vol.tcl:494
+#: ../visualization/nviz/scripts/panel_vol.tcl:862
+#: ../visualization/nviz/scripts/panel_surf.tcl:71
+#: ../visualization/nviz/scripts/panel_legend.tcl:170
+#: ../visualization/nviz/scripts/panel_vect.tcl:70
+#: ../visualization/nviz/scripts/script_file_tools:45
+msgid "Delete"
+msgstr "Supprimer"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:132
+msgid "New Key Time:"
+msgstr "Nouvelle clef de temps :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:143
+msgid "Show Feature"
+msgstr "Afficher les objets"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:146
+msgid "Path"
+msgstr "Chemin"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:148
+msgid "Vect Lines/Polygons"
+msgstr "Lignes vect / Polygones"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:150
+msgid "Vect Points"
+msgstr "Points vect"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:152
+msgid "Volume"
+msgstr "Volume"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:154
+msgid "Labels/Legend"
+msgstr "Étiquettes/Légende"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:159
+msgid "Interp."
+msgstr "Interp."
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:168
+msgid "tension"
+msgstr "tension"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:447
+msgid "New Key Time"
+msgstr "Nouvelle clef de temps"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:451
+msgid "Minute:"
+msgstr "Minute :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:452
+msgid "Second:"
+msgstr "Seconde :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:453
+msgid "Frame:"
+msgstr "Image :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:496
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:504
+msgid "KeyTime Error"
+msgstr "Erreur sur la clef de temps"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:496
+msgid "Error - All values must be at least zero."
+msgstr "Erreur - Toutes les valeures doivent être au moins à zéro."
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:504
+msgid "Error - Frame number must be less than frame rate."
+msgstr ""
+"Erreur - le numéro de l'image doit être inférieur au taux de rafraîchissement"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:540
+msgid "New Frame Rate"
+msgstr "Nouveaux taux de rafraîchissement"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:544
+msgid "Framerate:"
+msgstr "Taux de rafraîchissement :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:576
+msgid "Frame Rate Error"
+msgstr "Erreur de taux de rafraichissement"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:576
+msgid "Error - Frame rate must be at least 1."
+msgstr "Erreur - le taux de rafraîchissement doit être au moins de 1."
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:677
+#, tcl-format
+msgid "Internal Error - Can't find channel %s for keyframe %s"
+msgstr "Erreur interne - Ne peut pas trouver le canal %s pour l'image-clef %s"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:856
+msgid "Delete Keys"
+msgstr "Supprimer la clef"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:857
+msgid "Delete the selected keys?"
+msgstr "Supprimer la clef sélectionnée ?"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1125
+msgid "There is already a keyframe at this time, replace it?"
+msgstr "Il y a déjà une image-clef à ce temps, la remplacer ?"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1221
+msgid "Keyframe Attributes"
+msgstr "Attributs de l'image-clef"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1699
+msgid "Enter a base name:"
+msgstr "Entre un nom de base :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1702
+msgid "Render:"
+msgstr "Rendu :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1703
+msgid "Wireframe"
+msgstr "Fil de fer"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1705
+msgid "Full Rendering"
+msgstr "Rendu complet"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1710
+msgid "Image:"
+msgstr "Image :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1716
+msgid "Start Frame:"
+msgstr "Image de début :"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1718
+msgid "Off-Screen"
+msgstr "Hors-écran"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1909
+msgid "Warning - Current animation has not been saved, continue?"
+msgstr "Attention - l'animation actuelle n'a pas été enregistrée, continuer ?"
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1924
+#, tcl-format
+msgid "Error - Could not open file %s for reading"
+msgstr "Erreur - Ne peut pas ouvir le fichier %s pour lecture"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:44
+msgid "Vector Points"
+msgstr "Vecteur de points"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:51
+msgid "Vector Points Panel"
+msgstr "Panneau des vecteurs de points"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:55
+#: ../visualization/nviz/scripts/panel_vol.tcl:51
+#: ../visualization/nviz/scripts/panel_surf.tcl:68
+#: ../visualization/nviz/scripts/fileBrowser.tcl:119
+#: ../visualization/nviz/scripts/panel_vect.tcl:65
+msgid "Current:"
+msgstr "Actuel :"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:58
+#: ../visualization/nviz/scripts/panel_surf.tcl:70
+#: ../visualization/nviz/scripts/site_attr.tcl:1271
+#: ../visualization/nviz/scripts/panel_vect.tcl:69
+msgid "New"
+msgstr "Nouveau"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:118
+#: ../visualization/nviz/scripts/panel_vol.tcl:115
+#: ../visualization/nviz/scripts/panel_surf.tcl:185
+#: ../visualization/nviz/scripts/panel_vect.tcl:82
+msgid "DRAW CURRENT"
+msgstr "Actualiser le rendu"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:133
+msgid "icon size"
+msgstr "taille d'icône"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:149
+#: ../visualization/nviz/scripts/panel_label.tcl:70
+#: ../visualization/nviz/scripts/panel_arrow.tcl:61
+#: ../visualization/nviz/scripts/panel_arrow.tcl:78
+#: ../visualization/nviz/scripts/panel_vect.tcl:106
+#: ../visualization/nviz/scripts/panel_scale.tcl:60
+#: ../visualization/nviz/scripts/panel_scale.tcl:79
+#: ../visualization/nviz/scripts/panel_fringe.tcl:69
+msgid "Color"
+msgstr "Couleur"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:153
+msgid "icon type"
+msgstr "type d'icône"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:162
+msgid "3D points"
+msgstr "Points 3D"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:166
+#: ../visualization/nviz/scripts/panel_vect.tcl:113
+msgid "display on surface(s):"
+msgstr "afficher sur la surface :"
+
+#: ../visualization/nviz/scripts/panel_site.tcl:182
+msgid "thematic mapping for vector points"
+msgstr "cartographie thématique pour les points vecteurs"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:46
+msgid "Volume Panel"
+msgstr "Panneau de volume"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:63
+msgid "Visualization type..."
+msgstr "Type de visualisation ..."
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:66
+msgid "isosurfaces"
+msgstr "iso-surface"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:69
+msgid "slices"
+msgstr "tranches"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:73
+#: ../visualization/nviz/scripts/panel_surf.tcl:128
+msgid "Shading..."
+msgstr "Ombrage ..."
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:76
+#: ../visualization/nviz/scripts/panel_surf.tcl:132
+msgid "Flat"
+msgstr "Plat"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:78
+#: ../visualization/nviz/scripts/panel_surf.tcl:134
+msgid "Gouraud"
+msgstr "Gouraud"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:82
+#: ../visualization/nviz/scripts/panel_surf.tcl:92
+#: ../visualization/nviz/scripts/panel_pos.tcl:28
+msgid "Position"
+msgstr "Position"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:88
+msgid "Polygon resolution: "
+msgstr "Résolution de polygone :"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:441
+msgid "X-axis"
+msgstr "Axe X"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:443
+msgid "Y-axis"
+msgstr "Axe Y"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:445
+msgid "Z-axis"
+msgstr "Axe Z"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:449
+msgid "Transparency"
+msgstr "Transparence"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:455
+#: ../visualization/nviz/scripts/panel_vol.tcl:733
+msgid "azimuth"
+msgstr "azimuth"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:456
+#: ../visualization/nviz/scripts/panel_vol.tcl:461
+#: ../visualization/nviz/scripts/panel_vol.tcl:734
+#: ../visualization/nviz/scripts/panel_vol.tcl:739
+msgid "length"
+msgstr "longueur"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:459
+#: ../visualization/nviz/scripts/panel_vol.tcl:737
+msgid "tilt"
+msgstr "basculer"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:493
+msgid "Add new slice"
+msgstr "Ajouter une nouvelle tranche"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:495
+msgid "Delete selected slice"
+msgstr "Supprimer la tranche sélectionnée"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:497
+#: ../visualization/nviz/scripts/panel_vol.tcl:865
+msgid "Move Up"
+msgstr "Déplacer vers le haut"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:498
+msgid "Move slice up in list"
+msgstr "Déplacer la tranche vers le haut dans la liste"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:499
+#: ../visualization/nviz/scripts/panel_vol.tcl:867
+msgid "Move Down"
+msgstr "Déplacer vers le bas"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:500
+msgid "Move slice down in list"
+msgstr "Déplacer la tranche vers le bas dans la liste"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:830
+msgid "Isosurface attributes..."
+msgstr "Attributs d'iso-surface ..."
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:839
+msgid "toggle normal direction"
+msgstr "Activer la direction normale"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:861
+msgid "Add new isosurface"
+msgstr "Ajouter une nouvelle iso-surface"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:863
+msgid "Delete selected isosurface"
+msgstr "Supprimer l'iso-surface sélectionnée"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:866
+msgid "Move isosurface up in list"
+msgstr "Déplacer l'iso-surface vers le haut dans la liste"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:868
+msgid "Move isosurface down in list"
+msgstr "Déplacer l'iso-surface vers le bas dans la liste"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:1114
+msgid "Position Volume"
+msgstr "Position du volume"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:1145
+#: ../visualization/nviz/scripts/panel_surf.tcl:701
+msgid "Z:"
+msgstr "Z :"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:1146
+#: ../visualization/nviz/scripts/panel_surf.tcl:702
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:114
+msgid "X:"
+msgstr "X :"
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:1147
+#: ../visualization/nviz/scripts/panel_surf.tcl:703
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:115
+msgid "Y:"
+msgstr "Y :"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:51
+msgid "Raster Surfaces"
+msgstr "Surface raster"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:58
+msgid "Surface Panel"
+msgstr "Panneau des surfaces"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:79
+msgid "Surface attributes..."
+msgstr "Attributs de surface ..."
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:88
+msgid "Wire Color"
+msgstr "Couleur du fil"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:96
+msgid "Mask zeros:"
+msgstr "Masquer les zéros :"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:97
+msgid "by elevation"
+msgstr "par altitude"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:99
+msgid "by color"
+msgstr "par couleur"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:109
+msgid "Draw mode..."
+msgstr "Mode de rendu ..."
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:112
+msgid "Coarse"
+msgstr "Grossier"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:114
+msgid "Fine"
+msgstr "Fin"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:116
+msgid "Both"
+msgstr "les deux"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:120
+msgid "Coarse style..."
+msgstr "Style grossier ..."
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:123
+msgid "Wire"
+msgstr "Fil de fer"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:141
+msgid "Resolution:"
+msgstr "Résolution :"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:166
+msgid "Set resolution for:"
+msgstr "Définir la résolution pour :"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:167
+msgid "current surface"
+msgstr "surface actuelle"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:169
+msgid "all surfaces"
+msgstr "toutes les surfaces"
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:670
+msgid "Position Surface"
+msgstr "Positionner la surface"
+
+#: ../visualization/nviz/scripts/fileBrowser.tcl:82
+msgid "DIRECTORIES"
+msgstr "DOSSIERS"
+
+#: ../visualization/nviz/scripts/fileBrowser.tcl:154
+msgid "File Browser"
+msgstr "Naviguateur de fichiers"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:62
+msgid "Labels Panel"
+msgstr "Panneau d'étiquettes"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:67
+#: ../visualization/nviz/scripts/panel_legend.tcl:77
+#: ../visualization/nviz/scripts/panel_arrow.tcl:73
+msgid "Font"
+msgstr "Police"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:69
+#: ../visualization/nviz/scripts/panel_arrow.tcl:75
+msgid "Select font family, size, and style"
+msgstr "Sélectionner la famille de police, la taille et le style"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:73
+msgid "Choose font color"
+msgstr "Choisir la couleur de police"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:83
+msgid "Label text: "
+msgstr "Texte d'étiquette :"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:90
+msgid "Place label"
+msgstr "PLacer l'étiquette"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:91
+msgid "Click with mouse to place label"
+msgstr "Cliqueravec la souris pour placer l'étiquette"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:92
+msgid "Erase last"
+msgstr "Effacer la dernière"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:93
+msgid "Erase most recent label placed"
+msgstr "Effacer la dernière étiquette placée"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:94
+msgid "Erase all"
+msgstr "Effacer tout"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:95
+msgid "Erase all labels"
+msgstr "Effacer toutes les étiquettes"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:177
+#: ../visualization/nviz/scripts/panel_legend.tcl:220
+#: ../visualization/nviz/scripts/panel_arrow.tcl:119
+msgid "The quick brown fox jumps over the lazy dog"
+msgstr "Le renard roux agile saute par dessus le chien fainéant"
+
+#: ../visualization/nviz/scripts/panel_label.tcl:177
+#: ../visualization/nviz/scripts/panel_legend.tcl:220
+#: ../visualization/nviz/scripts/panel_arrow.tcl:119
+msgid "Select font"
+msgstr "Sélectionner la police"
+
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:170
+msgid "Blank"
+msgstr "Effacer"
+
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:171
+msgid "Previous"
+msgstr "Précédent"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:65
+msgid "Legends Panel"
+msgstr "Panneau de légende"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:71
+msgid "reverse legend"
+msgstr "inverser la légende"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:73
+msgid "show values"
+msgstr "afficher les valeurs"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:75
+msgid "show labels"
+msgstr "afficher les étiquettes"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:79
+msgid "Select font family, size, and style for legend text"
+msgstr ""
+"Sélectionner la famille de police, la taille, et le style pour les texte de "
+"la légende"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:86
+msgid "set value range "
+msgstr "définir la gamme de valeurs"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:91
+msgid "min "
+msgstr "min"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:94
+msgid " max "
+msgstr " max "
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:107
+msgid "discrete categories"
+msgstr "catégories discrètes"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:131
+msgid "Place legend"
+msgstr "Placer la légende"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:133
+msgid ""
+"Use mouse to place legend; left button defines first corner,  right button "
+"defines opposite corner."
+msgstr ""
+"Utilisez la souris pour placer la légende ; le boutton gauche définit le "
+"premier coin, le boutton droit définit le coin opposé."
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:135
+msgid "Erase legend"
+msgstr "Effacer la légende"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:137
+msgid "Erase all legends"
+msgstr "Effacer toutes les légendes"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:166
+msgid "Category Values"
+msgstr "Valeurs de catégorie"
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:183
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:61
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:67
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:290
+#: ../visualization/nviz/scripts/script_file_tools:567
+#: ../visualization/nviz/scripts/script_file_tools:676
+msgid "None"
+msgstr "Aucune"
+
+#: ../visualization/nviz/scripts/config.tcl:125
+msgid "x"
+msgstr "x"
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "sphere"
+msgstr "shpère"
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "diamond"
+msgstr "diamant"
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "cube"
+msgstr "cube"
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "box"
+msgstr "boîte"
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "gyro"
+msgstr "boussole"
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "aster"
+msgstr "étoile"
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "histogram"
+msgstr "histogramme"
+
+#: ../visualization/nviz/scripts/panel_color.tcl:38
+msgid "Background Color"
+msgstr "Couleur de fond"
+
+#: ../visualization/nviz/scripts/panel_color.tcl:44
+msgid "Background Color Panel"
+msgstr "panneau de couleur de fond"
+
+#: ../visualization/nviz/scripts/panel_color.tcl:46
+msgid "Background"
+msgstr "Fond"
+
+#: ../visualization/nviz/scripts/colorPopup.tcl:17
+msgid "Choose color"
+msgstr "Choisir la couleur"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:411
+msgid ""
+"Fill 2 or more entry fields with  desired min and max values, then press "
+"[Apply].  Or press [Auto] to automatically  generate a range of symbol sizes."
+msgstr ""
+"Entrer 2 champs ou plus avec les valeurs de min et max désirés, puis cliquer "
+"sur [Appliquer]. Ou cliquer sur [Auto] pour générer automatiquement une "
+"gamme de tailles de symboles."
+
+#: ../visualization/nviz/scripts/site_attr.tcl:422
+msgid ""
+"Fill 2 or more entry fields with desired colors, then press [Apply]. Or "
+"press [Auto] to automatically generate a color table."
+msgstr ""
+"Entrer 2 champs ou plus avec les couleurs désirées, puis cliquer sur "
+"[Appliquer]. Ou cliquer sur [Auto] pour générer automatiquement une table de "
+"couleurs."
+
+#: ../visualization/nviz/scripts/site_attr.tcl:428
+#, tcl-format
+msgid "WARNING: No thematic mapping preferences set for %s!"
+msgstr "ATTENTION : pas de préférences de carte thématique définies pour %s !"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:447
+#, tcl-format
+msgid "Vary point %s"
+msgstr "Point variable %s"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:451
+#, tcl-format
+msgid "GIS attribute: %s"
+msgstr "Attribut SIG : %s"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:460
+#, tcl-format
+msgid "Attribute type: %s"
+msgstr "Type d'attribut : %s"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:472
+#: ../visualization/nviz/scripts/panel_pos.tcl:109
+msgid "Apply"
+msgstr "Appliquer"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:474
+msgid "Apply current thematic preferences to point display"
+msgstr "Appliquer les préférences thématiques actuelles au point affiché"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:477
+msgid "Auto"
+msgstr "Auto"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:479
+msgid ""
+"Automatically generate a color  table distributed across range of attribute "
+"values"
+msgstr ""
+"Générer automatiquement une table de couleurs distribuée sur une gamme de "
+"valeurs d'attributs"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:485
+msgid "Clear all thematic settings"
+msgstr "Effacer tous les paramètres thématiques"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:495
+msgid "Load/save theme preferences"
+msgstr "Charger/enregistrer les préférences de thème"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:528
+msgid "Select thematic prefs to use"
+msgstr "Sélectionner les préférences thématique sà utiliser"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:531
+msgid "current prefs"
+msgstr "préfs actuelles"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:536
+msgid "prefs. from file"
+msgstr "préf. depuis le fichier"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:542
+msgid "(preserves current prefs.)"
+msgstr "(conserver les préfs actuelles)"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:553
+msgid "no prefs loaded"
+msgstr "pas de préfs chargées"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:558
+msgid "View loaded thematic prefs"
+msgstr "Voir les préfs thématiques chargées"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:570
+msgid "Load and save prefs."
+msgstr "Charger et enregistrer les préfs"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:572
+msgid "Load prefs"
+msgstr "Charger les préfs"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:574
+msgid "Replace current themes with prefs loaded from file"
+msgstr "Remplacer le thème actuel avec les préfs chargées depuis le fichier"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:580
+msgid "Save prefs"
+msgstr "Enregistrer les préfs"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:582
+msgid "Copy current themes to prefs loaded from file"
+msgstr "Copier le thème actuel vers les préfs chargées depuis le fichier"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:860
+#: ../visualization/nviz/scripts/site_attr.tcl:915
+msgid "Too few values: at least 2!"
+msgstr "Pas assez de valeurs : minimum de 2 !"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1107
+#: ../visualization/nviz/scripts/site_attr.tcl:1197
+msgid "No prefs file loaded"
+msgstr "Pas de fichier de préfs chargé"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1138
+msgid "No prefs"
+msgstr "pas de préfs"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1146
+msgid "Thematic prefs and attribute have different types"
+msgstr "Les préfs thématiques et l'attribut sont de type différent"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1207
+msgid "Thematic prefs and attributes have different types"
+msgstr "Les préfs thématiques et les attributs sont de types différents"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1408
+#, tcl-format
+msgid "WARNING: No attribute behaviour for %s!"
+msgstr "ATTENTION : pas de comportement d'attribut pour %s !"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1418
+#, tcl-format
+msgid "Thematic prefs file %s"
+msgstr "Fichier de  préfs thématiques %s"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1422
+#, tcl-format
+msgid "Name: %s"
+msgstr "Nom : %s"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1430
+#, tcl-format
+msgid "Type: %s"
+msgstr "Type : %s"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1436
+msgid "Save thematic prefs in file"
+msgstr "Enregistrer les préfs thématiques dans le fichier"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1439
+msgid "Clear current thematic prefs"
+msgstr "Effacer les préfs thématiques actuelles"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1493
+msgid "Load Thematic Prefs"
+msgstr "Charger les préfs thématiques"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1497
+msgid "Load file"
+msgstr "Charger le fichier"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1577
+msgid "Save thematic prefs"
+msgstr "Enregistrer les préfs thématiques"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1582
+#, tcl-format
+msgid "Old LUT \"%s\" deleted"
+msgstr "Old LUT \"%s\" deleted"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1607
+#, tcl-format
+msgid "Thematic preferences file \"%s\" saved"
+msgstr "Fichier de préférences thématiques \"%s\" enregistré"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1616
+msgid "Load thematic prefs"
+msgstr "Charger les préfs thématiques"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1622
+#, tcl-format
+msgid "*** WARNING *** File \"%s\" is unavailable"
+msgstr "*** ATTENTION *** Fichier \"%s\" non disponible"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1627
+#, tcl-format
+msgid "*** ERROR *** Some thematic pref component are missing in file \"%s\""
+msgstr ""
+"*** ERREUR *** Certains composants de préf thématique sont manquants dans le "
+"fichier \"%s\""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1700
+#, tcl-format
+msgid "WARNING: Unknown Tag \"%s\" in file \"%s\""
+msgstr "ATTENTION : Tag inconnu \"%s\" dans le fichier \"%s\""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1770
+#: ../visualization/nviz/scripts/site_attr.tcl:1852
+#, tcl-format
+msgid "WARNING: Unknown attribute %s!"
+msgstr "ATTENTION : attribut inconnu %s !"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1791
+#, tcl-format
+msgid "WARNING: field %s NOT FOUND"
+msgstr "ATTENTION : champ %s NON TROUVÉ"
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1798
+#, tcl-format
+msgid "WARNING: lut file %s NOT FOUND"
+msgstr "ATTENTION : fichier lut %s NON TROUVÉ"
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:47
+msgid "North arrow"
+msgstr "Flèche Nord"
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:49
+msgid "North Arrow Panel"
+msgstr "Panneua de la flèche nord"
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:53
+msgid "Arrow: "
+msgstr "Flèche :"
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:56
+msgid "size (in map units) "
+msgstr "taille (en unité de carte)"
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:72
+msgid "North text: "
+msgstr "Texte du Nord:"
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:89
+msgid "Place arrow"
+msgstr "PLacer la flèche"
+
+#: ../visualization/nviz/scripts/script_tools:32
+msgid "Open Loop"
+msgstr "Ouvrir une boucle"
+
+#: ../visualization/nviz/scripts/script_tools:33
+msgid "Close Loop"
+msgstr "Fermer la boucle"
+
+#: ../visualization/nviz/scripts/script_tools:37
+msgid "Open File Seq. Loop"
+msgstr "Ouvrir une boucle de fichiers"
+
+#: ../visualization/nviz/scripts/script_tools:38
+msgid "Close File Seq. Loop"
+msgstr "Fermer la boucle de fichiers"
+
+#: ../visualization/nviz/scripts/script_tools:42
+msgid "File Sequence Tool"
+msgstr "Outil de séquence de fichiers"
+
+#: ../visualization/nviz/scripts/script_tools:104
+msgid "Loop Start Value"
+msgstr "Valeur de départ de la boucle"
+
+#: ../visualization/nviz/scripts/script_tools:106
+msgid "Loop End Value"
+msgstr "Valeur de fin de la boucle"
+
+#: ../visualization/nviz/scripts/script_tools:108
+msgid "Loop Increment Value"
+msgstr "Valeur d'incrément de la boucle"
+
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:99
+msgid "use volume as color"
+msgstr "utiliser un volume comme couleur"
+
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:275
+msgid "remove mask"
+msgstr "supprimer le masque"
+
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:403
+msgid "Enter value: "
+msgstr "Entrer une valeur :"
+
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:449
+msgid "Use slider to select constant value :"
+msgstr "Utiliser le curseur pour sélectionner la valeure de constante :"
+
+#: ../visualization/nviz/scripts/panel_tst.tcl:31
+msgid "Test Panel"
+msgstr "Paneau de test"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:48
+msgid "Cutting Planes"
+msgstr "Plans de coupe"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:50
+msgid "Cutting Planes Panel"
+msgstr "Panneaux des plans de coupe"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:60
+msgid "Active cutting plane: "
+msgstr "Plan de coupe actif :"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:68
+msgid "Plane 0"
+msgstr "Plan 0"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:69
+msgid "Plane 1"
+msgstr "Plan 1"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:70
+msgid "Plane 2"
+msgstr "Plan 2"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:71
+msgid "Plane 3"
+msgstr "Plan 3"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:72
+msgid "Plane 4"
+msgstr "Plan 4"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:73
+msgid "Plane 5"
+msgstr "Plan 5"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:87
+msgid "set shading"
+msgstr "définir l'ombrage"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:90
+msgid "top color"
+msgstr "couleur du dessus"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:92
+msgid "bottom color"
+msgstr "couleur du dessous"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:94
+msgid "blend"
+msgstr "mélange"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:96
+msgid "shaded"
+msgstr "ombré"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:98
+#: ../visualization/nviz/scripts/panel_vquery.tcl:426
+msgid "clear"
+msgstr "effacer"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:139
+msgid "Z coord"
+msgstr "coord Z"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:151
+msgid "Rotate"
+msgstr "Rotation"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:163
+msgid "Tilt"
+msgstr "Pivoter"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:184
+msgid "All Off"
+msgstr "Tout désactiver"
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:292
+#, tcl-format
+msgid "Plane %s"
+msgstr "Plan %s"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:51
+msgid "Vector Query"
+msgstr "Requête vectorielle"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:57
+msgid "Vector Query Panel"
+msgstr "Panneau de requête vectorielle"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:83
+#: ../visualization/nviz/scripts/panel_rquery.tcl:62
+msgid "query on/off"
+msgstr "requête on/off"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:86
+msgid "Choose map(s)"
+msgstr "Choisir la(les) carte(s)"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:88
+msgid "Select/unselect vector map(s) to query"
+msgstr "Sélectionner/désélectionner la(les) carte(s) vecteur pour la requête"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:98
+msgid "Set threshold distance for selecting objects"
+msgstr "Définir la distance d'accroche pour les objets sélectionnés"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:100
+msgid "threshold dist"
+msgstr "dist d'accroche"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:104
+msgid "show hyperlink"
+msgstr "afficher l'hyperlien"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:113
+msgid "Highlight queried vector points with..."
+msgstr "Surligner les points vecteurs sélectionnés avec ..."
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:118
+msgid "color"
+msgstr "couleur"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:122
+msgid "Choose color to indicate point queried"
+msgstr "Choisir la couleur pour indiquer le point de requête"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:124
+msgid "icon size  X"
+msgstr "taille d'icône X"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:130
+msgid "Choose size in multiples of default to indicate point queried"
+msgstr ""
+"Choisir le multiple de la taille  pour indiquer les points sélectionnés"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:137
+msgid "specific icon"
+msgstr "icône spécifique"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:208
+msgid "Select vectors to query"
+msgstr "Sélectionner les vecteurs pour les requêtes"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:209
+msgid "vectors displayed"
+msgstr "vecteurs affichés"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:209
+msgid "vectors to query"
+msgstr "vecteurs pour les requêtes"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:410
+#, tcl-format
+msgid "Map: %s"
+msgstr "Carte : %s"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:496
+msgid "Clear Window?"
+msgstr "Effacer la fenêtre ?"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:496
+msgid "Yes"
+msgstr "Oui"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:496
+msgid "No"
+msgstr "Non"
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:619
+msgid "set icon"
+msgstr "définir l'icône"
+
+#: ../visualization/nviz/scripts/ACS_utils.tcl:331
+msgid "ok"
+msgstr "ok"
+
+#: ../visualization/nviz/scripts/ACS_utils.tcl:331
+msgid "dismiss"
+msgstr "annuler"
+
+#: ../visualization/nviz/scripts/panel_vect.tcl:55
+msgid "Vector Lines/3D Polygons"
+msgstr "Vecteur de lignes/Polygones 3D"
+
+#: ../visualization/nviz/scripts/panel_vect.tcl:60
+msgid "Vector Lines Panel"
+msgstr "Panneau de lignes vecteur"
+
+#: ../visualization/nviz/scripts/panel_vect.tcl:95
+msgid "line width"
+msgstr "largeur de ligne"
+
+#: ../visualization/nviz/scripts/panel_vect.tcl:110
+msgid "display flat"
+msgstr "affichage plat"
+
+#: ../visualization/nviz/scripts/panel_vect.tcl:117
+msgid ""
+"vector height\n"
+"above surface"
+msgstr "hauteur du vecteur\au-dessus de la surface"
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:27
+msgid "Resize Draw Area"
+msgstr "Redimensionner la zone de dessin"
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:33
+msgid "Resize Panel"
+msgstr "Redimensionner le panneau"
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:39
+msgid "Resize: "
+msgstr "Redimensionner :"
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:42
+msgid "width"
+msgstr "largeur"
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:52
+msgid "Resize"
+msgstr "Redimensionner"
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:55
+#: ../visualization/nviz/scripts/panel_pos.tcl:95
+msgid "Refresh"
+msgstr "Actualiser"
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:45
+msgid "Scale bar"
+msgstr "Barre d'échelle"
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:47
+msgid "Scale Bar Panel"
+msgstr "Panneau de la barre d'échelle"
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:51
+msgid "Scale bar: "
+msgstr "Barre d'échelle :"
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:54
+msgid "length (in map units) "
+msgstr "longueur (en unité de carte)"
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:71
+msgid "Scale text: "
+msgstr "Texte d'échelle :"
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:74
+msgid "size "
+msgstr "taille"
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:90
+msgid "Place scale"
+msgstr "PLacer l'échelle"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:41
+msgid "Send results to: (no file selected)"
+msgstr "Envoyer le résultat vers : (pas de fichier sélectionné)"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:52
+msgid "Raster Query"
+msgstr "Requête raster"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:58
+msgid "Raster Query Panel"
+msgstr "Panneau de requête raster"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:65
+msgid "Reset most recent query"
+msgstr "Réinitialiser la requête la plus récente"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:67
+msgid "Clear all queries"
+msgstr "Effacre toutes les requêtes"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:68
+msgid "Attributes"
+msgstr "Attributs"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Map name"
+msgstr "Nom de carte"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Easting"
+msgstr "Abcisse"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Northing"
+msgstr "Ordonnée"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Elevation"
+msgstr "Altitude"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Category of color map"
+msgstr "Catégorie de la carte de couleur"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "XY dist from prev"
+msgstr "Dist XY depuis préc"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "XYZ dist from prev"
+msgstr "Dist XYZ depuis préc"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Dist along surface"
+msgstr "Dist suivant la surface"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Dist along exag surface"
+msgstr "Dist suivant la surface exag"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:93
+msgid "Select file to receive all future query results"
+msgstr ""
+"Sélectionner le fichier de réception des résultats de toutes les prochaines "
+"requêtes "
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:126
+#, tcl-format
+msgid "Send results to: %s"
+msgstr "Envoyer les résultats vers : %s"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:152
+#: ../visualization/nviz/scripts/panel_rquery.tcl:153
+msgid "Point not on surface\n"
+msgstr "Point pas sur la surface\n"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:164
+#, tcl-format
+msgid "Easting: %15.4f\n"
+msgstr "Abcisse : %15.4f\n"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:171
+#, tcl-format
+msgid "Northing: %15.4f\n"
+msgstr "Ordonnée : %15.4f\n"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:178
+#, tcl-format
+msgid "Elevation: %15.4f\n"
+msgstr "Altitude : %15.4f\n"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:186
+#: ../visualization/nviz/scripts/panel_rquery.tcl:187
+#, tcl-format
+msgid "Surf map: %s"
+msgstr "Carte de surface : %s"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:202
+msgid "constant"
+msgstr "constante"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:204
+#: ../visualization/nviz/scripts/panel_rquery.tcl:205
+#, tcl-format
+msgid "Color map: %s"
+msgstr "Carte de couleur : %s"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:224
+#, tcl-format
+msgid "XY distance from previous: \t%15.4f\n"
+msgstr "Distance XY depuis le précédent : \t%15.4f\n"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:232
+#, tcl-format
+msgid "XYZ distance from previous: \t%15.4f\n"
+msgstr "Distance XYZ depuis le précédent : \t%15.4f\n"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:241
+#, tcl-format
+msgid "Distance along surface: \t%15.4f\n"
+msgstr "Distance suivant la surface : \t%15.4f\n"
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:252
+#, tcl-format
+msgid "Distance along exag. surface:%15.4f\n"
+msgstr "Distance suivant la surface exag. : \t%15.4f\n"
+
+#: ../visualization/nviz/scripts/wirecolorPopup.tcl:30
+msgid "Select Wire Color"
+msgstr "Sélectionner la couleur du fil"
+
+#: ../visualization/nviz/scripts/wirecolorPopup.tcl:57
+msgid "use surface color"
+msgstr "utiliser la couleur de surface"
+
+#: ../visualization/nviz/scripts/mapBrowser.tcl:204
+msgid "Map type:"
+msgstr "Type de carte :"
+
+#: ../visualization/nviz/scripts/mapBrowser.tcl:218
+msgid "3d.view"
+msgstr "Vue 3D"
+
+#: ../visualization/nviz/scripts/script_file_tools:36
+msgid "Map Object File Sequencing"
+msgstr "Séquençage du fichier d'objet carte"
+
+#: ../visualization/nviz/scripts/script_file_tools:43
+msgid "Fields:"
+msgstr "Champs :"
+
+#: ../visualization/nviz/scripts/script_file_tools:46
+msgid "State File: None"
+msgstr "Fichier d'état : aucun"
+
+#: ../visualization/nviz/scripts/script_file_tools:53
+msgid "Options:"
+msgstr "Options :"
+
+#: ../visualization/nviz/scripts/script_file_tools:55
+msgid "Add To Script"
+msgstr "Ajouter au script"
+
+#: ../visualization/nviz/scripts/script_file_tools:56
+msgid "Build Script..."
+msgstr "Construire le script ..."
+
+#: ../visualization/nviz/scripts/script_file_tools:57
+msgid "Load Fields..."
+msgstr "Charger des champs ..."
+
+#: ../visualization/nviz/scripts/script_file_tools:58
+msgid "Save Fields..."
+msgstr "Enregistrer les champs ..."
+
+#: ../visualization/nviz/scripts/script_file_tools:75
+msgid "Frame"
+msgstr "Image"
+
+#: ../visualization/nviz/scripts/script_file_tools:111
+msgid "Current fields have not been saved, really load new fields?"
+msgstr ""
+"Les champs actuels ne peuvent pas être sauvegardés, voulez-vous vraiment "
+"charger de nouveau champs ?"
+
+#: ../visualization/nviz/scripts/script_file_tools:135
+#, tcl-format
+msgid "While reading state_file: %s"
+msgstr "Pendant la mecture du fichier d'état : %s"
+
+#: ../visualization/nviz/scripts/script_file_tools:142
+#, tcl-format
+msgid "While reading number of fields: %s"
+msgstr "Pendant la lecture du nombre de champs : %s"
+
+#: ../visualization/nviz/scripts/script_file_tools:151
+#, tcl-format
+msgid "While reading field type: %s"
+msgstr "Pendant la lecture du type de champs : %s"
+
+#: ../visualization/nviz/scripts/script_file_tools:157
+#, tcl-format
+msgid "While reading field attribute: %s"
+msgstr "Pendant la lecture des champs d'attributs : %s"
+
+#: ../visualization/nviz/scripts/script_file_tools:542
+msgid "Field Type: "
+msgstr "Type de champ :"
+
+#: ../visualization/nviz/scripts/script_file_tools:554
+msgid "Field Attribute: "
+msgstr "Champ d'attribut :"
+
+#: ../visualization/nviz/scripts/script_file_tools:555
+msgid "Topography"
+msgstr "Topographie"
+
+#: ../visualization/nviz/scripts/script_file_tools:566
+msgid "Use Nviz Map: "
+msgstr "Utiliser la carte NVIZ :"
+
+#: ../visualization/nviz/scripts/script_file_tools:853
+#, tcl-format
+msgid "State File: %s"
+msgstr "Fichier d'état : %s"
+
+#: ../visualization/nviz/scripts/script_file_tools:885
+msgid "Enter an image root name"
+msgstr "Entrer le nom de l'image principale"
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:25
+msgid "Lighting"
+msgstr "Illumination"
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:30
+msgid "Lighting Panel"
+msgstr "Panel d'illumination"
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:43
+msgid " Light source position"
+msgstr " Position de la source de lumière"
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:58
+msgid "Follow surface viewpoint"
+msgstr "Suivre le point de vue en surface"
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:60
+msgid "Show lighting model"
+msgstr "Montrer les modèles d'illumination"
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:66
+msgid "Light color"
+msgstr "Couleur de lumière"
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:70
+msgid "Light intensity"
+msgstr "Intensité lumineuse"
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:39
+msgid "Scaled Difference"
+msgstr "Différences"
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:45
+msgid "Scaled Difference Panel"
+msgstr "Panneau de mise en évidence des différences"
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:54
+msgid "Reference surface:"
+msgstr "Surface de référence :"
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:58
+msgid "Set difference between reference surface and others"
+msgstr "Définir la différence entre la surface de référence et les autres"
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:66
+msgid "unselect reference surface"
+msgstr "Désélectionner la surface de référence"
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:124
+msgid "None selected"
+msgstr "Rien de sélectionné"
+
+#: ../visualization/nviz/scripts/widgets.tcl:70
+msgid "E"
+msgstr "E"
+
+#: ../visualization/nviz/scripts/widgets.tcl:71
+msgid "W"
+msgstr "W"
+
+#: ../visualization/nviz/scripts/widgets.tcl:72
+msgid "N"
+msgstr "N"
+
+#: ../visualization/nviz/scripts/widgets.tcl:73
+msgid "S"
+msgstr "S"
+
+#: ../visualization/nviz/scripts/widgets.tcl:596
+msgid "None Loaded"
+msgstr "Rien de chargé"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:34
+msgid "Position Panel"
+msgstr "Panneau de position"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:45
+msgid "From (eye):"
+msgstr "Depuis (oeil) :"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:46
+msgid "To (surface):"
+msgstr "Vers (surface) :"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:49
+msgid "Range/bearing:"
+msgstr "Distance/Gisement"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:52
+msgid "East"
+msgstr "Est"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:56
+msgid "Range"
+msgstr "Distance"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:60
+msgid "North"
+msgstr "Nord"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:64
+msgid "Bearing"
+msgstr "Gisement"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:72
+msgid "Elev"
+msgstr "Altitude"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:83
+msgid "Eye to surface"
+msgstr "Oeil vers surface"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:84
+msgid "Surface to eye"
+msgstr "Surface vers oeil"
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:85
+msgid "Calculate"
+msgstr "Calculer"
+
+#: ../visualization/nviz/scripts/script_play:31
+#, tcl-format
+msgid "Script file %s does not exist"
+msgstr "Le ficheir de script %s n'existe pas"
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:45
+msgid "Fringe Panel"
+msgstr "Panneau des bordures"
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:48
+msgid "Edges with fringe: "
+msgstr "Angles avec bordures :"
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:51
+msgid "N&W"
+msgstr "N&W"
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:54
+msgid "N&E"
+msgstr "N&E"
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:57
+msgid "S&W"
+msgstr "S&W"
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:60
+msgid "S&E"
+msgstr "S&E"
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:68
+msgid "Elevation of fringe bottom: "
+msgstr "Altitude du bas de la bordure :"
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:80
+msgid "Draw Fringe"
+msgstr "Afficher les bordures"
diff --git a/locale/po/grassnviz_nl.po b/locale/po/grassnviz_nl.po
new file mode 100644
index 0000000..61efaea
--- /dev/null
+++ b/locale/po/grassnviz_nl.po
@@ -0,0 +1,2478 @@
+# translation of grassnviz_nl.po to Dutch
+# This file is distributed under the same license as the GRASS package.
+# Copyright (C) 2012 GRASS Development Team
+#
+# XXX, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: grassnviz_nl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-10 00:42+0200\n"
+"PO-Revision-Date: 2012-06-19 23:46+0200\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Dutch <grass-translations at lists.osgeo.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../visualization/nviz/scripts/nviz2.2_script:197
+msgid "Show Panels"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:204
+#: ../visualization/nviz/scripts/nviz2.2_script:327
+#: ../visualization/nviz/scripts/nviz2.2_script:688
+msgid "Hide Panels"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:246
+msgid "Start"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:267
+#: ../visualization/nviz/scripts/nviz2.2_script:274
+#: ../visualization/nviz/scripts/nviz2.2_script:281
+#: ../visualization/nviz/scripts/nviz2.2_script:289
+msgid "Togl canvas initialization failed. Is Your OpenGL working fine?"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:349
+msgid "Please Wait..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:355
+msgid "Help"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:356
+msgid "NVIZ Help"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:356
+msgid "About NVIZ"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:356
+msgid "NVIZ - Bugs / ToDo"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:368
+msgid "File"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:369
+msgid "Load State"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:369
+msgid "Save State"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:371
+msgid "Set Canvas Size"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:373
+msgid "Load 3d Settings"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:373
+msgid "Save 3d Settings"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:375
+msgid "Save image as..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:377
+#: ../visualization/nviz/scripts/nviz2.2_script:925
+#: ../visualization/nviz/scripts/panel_vol.tcl:1169
+#: ../visualization/nviz/scripts/panel_surf.tcl:725
+#: ../visualization/nviz/scripts/site_attr.tcl:483
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:182
+#: ../visualization/nviz/scripts/panel_rquery.tcl:64
+#: ../visualization/nviz/scripts/panel_lights.tcl:81
+msgid "Reset"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:377
+msgid "Quit"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:410
+msgid "Scripting"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:414
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:230
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1249
+msgid "On"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:420
+msgid "Create New Scriptfile"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:423
+msgid "Open and Play Script"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:426
+msgid "Close Script"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:431
+#: ../visualization/nviz/scripts/script_get_line:15
+msgid "Add Script Line"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:434
+msgid "Add Script Command"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:439
+msgid "Script Tools"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:484
+msgid "PPM Image"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:486
+msgid "TIFF Image"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:500
+msgid "Maximum Resolution PPM"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:646
+msgid "Visualize"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:680
+msgid "Appearance"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:800
+msgid "Set Size of Display Canvas"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:803
+msgid "Width"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:805
+#: ../visualization/nviz/scripts/panel_pos.tcl:68
+msgid "Height"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:811
+msgid "Unconstrained"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:821
+#: ../visualization/nviz/scripts/panel_animation.tcl:203
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:111
+#: ../visualization/nviz/scripts/panel_site.tcl:114
+#: ../visualization/nviz/scripts/panel_vol.tcl:1170
+#: ../visualization/nviz/scripts/panel_surf.tcl:184
+#: ../visualization/nviz/scripts/panel_surf.tcl:726
+#: ../visualization/nviz/scripts/panel_label.tcl:96
+#: ../visualization/nviz/scripts/panel_legend.tcl:138
+#: ../visualization/nviz/scripts/panel_color.tcl:53
+#: ../visualization/nviz/scripts/panel_arrow.tcl:93
+#: ../visualization/nviz/scripts/script_tools:47
+#: ../visualization/nviz/scripts/panel_tst.tcl:53
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:186
+#: ../visualization/nviz/scripts/panel_vquery.tcl:144
+#: ../visualization/nviz/scripts/panel_vect.tcl:80
+#: ../visualization/nviz/scripts/panel_resize.tcl:58
+#: ../visualization/nviz/scripts/panel_scale.tcl:94
+#: ../visualization/nviz/scripts/panel_rquery.tcl:88
+#: ../visualization/nviz/scripts/panel_lights.tcl:83
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:69
+#: ../visualization/nviz/scripts/panel_pos.tcl:125
+#: ../visualization/nviz/scripts/panel_fringe.tcl:82
+msgid "Close"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:873
+#: ../visualization/nviz/scripts/nviz2.2_script:1027
+#: ../visualization/nviz/scripts/script_file_tools:126
+#, tcl-format
+msgid "Error while opening file: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:926
+msgid "Really reset Nviz?"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:926
+#: ../visualization/nviz/scripts/panel_animation.tcl:577
+#: ../visualization/nviz/scripts/panel_animation.tcl:755
+#: ../visualization/nviz/scripts/panel_animation.tcl:801
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:466
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:553
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:858
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1126
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1708
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1910
+#: ../visualization/nviz/scripts/script_get_line:18
+#: ../visualization/nviz/scripts/wirecolorPopup.tcl:80
+#: ../visualization/nviz/scripts/script_file_tools:113
+msgid "Ok"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:926
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:172
+#: ../visualization/nviz/scripts/panel_main.tcl:112
+#: ../visualization/nviz/scripts/attPopup.tcl:133
+#: ../visualization/nviz/scripts/attPopup.tcl:475
+#: ../visualization/nviz/scripts/attPopup.tcl:523
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1910
+#: ../visualization/nviz/scripts/fileBrowser.tcl:115
+#: ../visualization/nviz/scripts/script_get_line:19
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:173
+#: ../visualization/nviz/scripts/script_tools:111
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:125
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:410
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:456
+#: ../visualization/nviz/scripts/ACS_utils.tcl:312
+#: ../visualization/nviz/scripts/ACS_utils.tcl:354
+#: ../visualization/nviz/scripts/ACS_utils.tcl:375
+#: ../visualization/nviz/scripts/ACS_utils.tcl:430
+#: ../visualization/nviz/scripts/ACS_utils.tcl:475
+#: ../visualization/nviz/scripts/ACS_utils.tcl:569
+#: ../visualization/nviz/scripts/ACS_utils.tcl:641
+#: ../visualization/nviz/scripts/wirecolorPopup.tcl:83
+#: ../visualization/nviz/scripts/mapBrowser.tcl:229
+#: ../visualization/nviz/scripts/script_file_tools:113
+#: ../visualization/nviz/scripts/script_file_tools:575
+#: ../visualization/nviz/scripts/script_file_tools:888
+msgid "Cancel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:1055
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1923
+#: ../visualization/nviz/scripts/script_play:30
+msgid "File Error"
+msgstr ""
+
+#: ../visualization/nviz/scripts/nviz2.2_script:1056
+#: ../visualization/nviz/scripts/panel_animation.tcl:577
+#: ../visualization/nviz/scripts/panel_animation.tcl:603
+#: ../visualization/nviz/scripts/panel_animation.tcl:644
+#: ../visualization/nviz/scripts/panel_animation.tcl:755
+#: ../visualization/nviz/scripts/panel_animation.tcl:801
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:497
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:505
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:577
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:678
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:858
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:873
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1007
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1126
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1872
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1925
+#: ../visualization/nviz/scripts/script_play:32
+msgid "Dismiss"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:100
+msgid "Simple Animation"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:104
+msgid "Simple Keyframe Animation Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:111
+msgid "Step backward frame by frame"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:114
+msgid "Pause playback"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:117
+msgid "Step forward frame by frame"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:120
+msgid "Run animation from beginning"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:122
+msgid " set max frames:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:136
+msgid "Key Frames"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:145
+msgid "Current frame:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:148
+msgid "Selected key frame:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:159
+msgid "Add frame"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:161
+msgid "Clear all"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:170
+msgid "Show: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:171
+msgid "path"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:173
+msgid "lines"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:175
+msgid "points"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:177
+msgid "volumes"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:184
+msgid "Interpolation: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:185
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:162
+msgid "linear"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:189
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:165
+msgid "spline"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:200
+msgid "Run and save"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:202
+msgid "Run animation and save frames"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:222
+msgid "spline tension"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:275
+#: ../visualization/nviz/scripts/panel_tst.tcl:21
+msgid "Test"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:576
+#: ../visualization/nviz/scripts/panel_animation.tcl:800
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1908
+#: ../visualization/nviz/scripts/script_file_tools:111
+msgid "Verify"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:576
+msgid "Do you really want to delete this keyframe?"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:601
+#: ../visualization/nviz/scripts/panel_animation.tcl:642
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:676
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:871
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1005
+msgid "Internal Error"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:602
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:872
+msgid "Internal Error - Failed to delete keyframe in GK key list"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:643
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1006
+msgid "Internal Error - Failed to move keyframe in GK key list"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:753
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1124
+msgid "Replace Key"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:754
+msgid "There is already a keyframe at this time, do you wish to replace it?"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:800
+msgid "Do you really want to delete all keyframes?"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:928
+msgid "Save Animation Frames"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:934
+msgid "Prefix for images: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:935
+msgid "Enter a prefix name for images to be created from animation frames"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:940
+msgid "Output format: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:941
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1712
+msgid "PPM"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:942
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1713
+msgid "TIFF"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:943
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1714
+msgid "MPEG-1"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:948
+msgid "Rendering mode: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:949
+#: ../visualization/nviz/scripts/panel_surf.tcl:143
+msgid "coarse"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:950
+#: ../visualization/nviz/scripts/panel_surf.tcl:153
+msgid "fine"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_animation.tcl:955
+#: ../visualization/nviz/scripts/ACS_utils.tcl:312
+#: ../visualization/nviz/scripts/ACS_utils.tcl:354
+#: ../visualization/nviz/scripts/ACS_utils.tcl:375
+#: ../visualization/nviz/scripts/ACS_utils.tcl:430
+#: ../visualization/nviz/scripts/ACS_utils.tcl:475
+#: ../visualization/nviz/scripts/ACS_utils.tcl:569
+#: ../visualization/nviz/scripts/ACS_utils.tcl:641
+msgid "OK"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:99
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:98
+msgid "Remove"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:105
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:104
+#: ../visualization/nviz/scripts/mapBrowser.tcl:150
+msgid "MAPSETS"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:119
+#: ../visualization/nviz/scripts/fileBrowser.tcl:99
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:118
+#: ../visualization/nviz/scripts/mapBrowser.tcl:168
+msgid "FILES"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:149
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:148
+msgid "Map Type:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:152
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:151
+#: ../visualization/nviz/scripts/mapBrowser.tcl:207
+msgid "Map Type"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:155
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:154
+#: ../visualization/nviz/scripts/mapBrowser.tcl:210
+msgid "Raster"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:157
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:156
+#: ../visualization/nviz/scripts/mapBrowser.tcl:212
+msgid "Vector"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:159
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:158
+#: ../visualization/nviz/scripts/mapBrowser.tcl:214
+msgid "Site"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:161
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:160
+#: ../visualization/nviz/scripts/mapBrowser.tcl:216
+msgid "Surf"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:163
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:162
+#: ../visualization/nviz/scripts/mapBrowser.tcl:220
+msgid "Regions"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:165
+#: ../visualization/nviz/scripts/panel_main.tcl:158
+#: ../visualization/nviz/scripts/panel_label.tcl:60
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:164
+#: ../visualization/nviz/scripts/mapBrowser.tcl:222
+msgid "Labels"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:168
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:167
+#: ../visualization/nviz/scripts/mapBrowser.tcl:225
+msgid "Icons"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:171
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:172
+#: ../visualization/nviz/scripts/panel_legend.tcl:171
+#: ../visualization/nviz/scripts/script_file_tools:54
+msgid "Done"
+msgstr ""
+
+#: ../visualization/nviz/scripts/multimapBrowser.tcl:200
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:201
+#: ../visualization/nviz/scripts/mapBrowser.tcl:141
+msgid "Map Browser"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:60
+#: ../visualization/nviz/scripts/flythrough.tcl:141
+msgid "fly"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:67
+#: ../visualization/nviz/scripts/flythrough.tcl:270
+msgid "none"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:70
+#: ../visualization/nviz/scripts/flythrough.tcl:149
+#: ../visualization/nviz/scripts/flythrough.tcl:271
+msgid "basic"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:71
+#: ../visualization/nviz/scripts/flythrough.tcl:157
+msgid "simple"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:72
+#: ../visualization/nviz/scripts/flythrough.tcl:165
+msgid "orbit"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:83
+msgid "Coarse Draw"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:86
+msgid "fly help"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:114
+msgid "Interactively set view position"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:135
+msgid "flythrough help"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:174
+msgid "move"
+msgstr ""
+
+#: ../visualization/nviz/scripts/flythrough.tcl:196
+msgid "turn"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:86
+msgid "Main"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:104
+msgid "DRAW"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:107
+msgid "Draw selected features"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:109
+#: ../visualization/nviz/scripts/site_attr.tcl:1437
+#: ../visualization/nviz/scripts/panel_rquery.tcl:66
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:64
+msgid "Clear"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:110
+msgid "Clear NVIZ display"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:113
+msgid "Cancel current draw"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:119
+msgid "Automatically render display:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:123
+msgid "Automatically render display after changing parameters"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:128
+msgid "Show features:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:131
+msgid "Main features..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:136
+msgid "Decorations..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:142
+#: ../visualization/nviz/scripts/panel_surf.tcl:125
+#: ../visualization/nviz/scripts/script_file_tools:543
+msgid "Surface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:145
+msgid "Vectors"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:148
+msgid "Sites"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:151
+#: ../visualization/nviz/scripts/panel_vol.tcl:40
+msgid "Volumes"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:156
+#: ../visualization/nviz/scripts/panel_legend.tcl:63
+msgid "Legend"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:160
+msgid "North Arrow"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:162
+msgid "Scale Bar"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:164
+#: ../visualization/nviz/scripts/panel_fringe.tcl:43
+msgid "Fringe"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:175
+msgid "View method:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:177
+msgid "eye"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:181
+#: ../visualization/nviz/scripts/panel_main.tcl:220
+msgid "center"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:186
+msgid "Change view by moving eye position"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:187
+msgid "Change view by moving scene center position"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:196
+msgid "Change view using mouse to control fly-through"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:205
+#: ../visualization/nviz/scripts/panel_main.tcl:206
+msgid "Set vertical exaggeration"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:207
+#: ../visualization/nviz/scripts/panel_main.tcl:208
+msgid "Set eye height"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:213
+msgid "Look"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:214
+msgid "here"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:215
+msgid "Center view at point marked with mouse click"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:221
+msgid "Center view at center of displayed surface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:225
+msgid "top"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:226
+msgid "View directly from above"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:246
+msgid "perspective"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:247
+msgid "twist"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:249
+msgid "Set field of view size (degrees)"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:250
+msgid "Set twist angle (degrees)"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:253
+msgid "reset"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:255
+msgid "Reset view to default"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:416
+#: ../visualization/nviz/scripts/widgets.tcl:334
+msgid "z-exag"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:432
+#: ../visualization/nviz/scripts/panel_vol.tcl:457
+#: ../visualization/nviz/scripts/panel_vol.tcl:460
+#: ../visualization/nviz/scripts/panel_vol.tcl:735
+#: ../visualization/nviz/scripts/panel_vol.tcl:738
+#: ../visualization/nviz/scripts/panel_resize.tcl:43
+#: ../visualization/nviz/scripts/widgets.tcl:329
+msgid "height"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:517
+msgid "Set eye position"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_main.tcl:522
+msgid "Set center of view position"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:45
+#: ../visualization/nviz/scripts/attPopup.tcl:46
+#: ../visualization/nviz/scripts/panel_vol.tcl:1115
+#: ../visualization/nviz/scripts/panel_surf.tcl:671
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:36
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:37
+msgid "Attribute"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:88
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:80
+#, tcl-format
+msgid "Change attribute: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:92
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:85
+msgid "New map"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:97
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:89
+msgid "Remove mask"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:98
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:90
+msgid "invert mask"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:106
+#: ../visualization/nviz/scripts/attPopup.tcl:115
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:98
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:107
+msgid "New constant"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:107
+msgid "use as color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:113
+msgid "Constant not supported"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:122
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:114
+msgid "Curr. value: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:128
+#: ../visualization/nviz/scripts/attPopup.tcl:474
+#: ../visualization/nviz/scripts/attPopup.tcl:522
+#: ../visualization/nviz/scripts/fileBrowser.tcl:113
+#: ../visualization/nviz/scripts/script_tools:110
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:123
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:409
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:455
+#: ../visualization/nviz/scripts/mapBrowser.tcl:227
+#: ../visualization/nviz/scripts/script_file_tools:574
+#: ../visualization/nviz/scripts/script_file_tools:887
+msgid "Accept"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:319
+msgid "Surface Color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:462
+#: ../visualization/nviz/scripts/attPopup.tcl:512
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:399
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:445
+msgid "Constant"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:468
+msgid "Enter value:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attPopup.tcl:516
+msgid "Use slider to set value"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:79
+msgid "Keyframe Animation"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:80
+msgid "Keyframe Animation Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:96
+msgid "Framerate :"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:105
+msgid "File: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:106
+#: ../visualization/nviz/scripts/site_attr.tcl:1434
+msgid "Save"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:107
+msgid "Load"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:109
+msgid "Animation: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:110
+msgid "Run and Save"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:130
+#: ../visualization/nviz/scripts/panel_vol.tcl:492
+#: ../visualization/nviz/scripts/panel_vol.tcl:860
+#: ../visualization/nviz/scripts/panel_legend.tcl:169
+#: ../visualization/nviz/scripts/script_file_tools:44
+msgid "Add"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:131
+#: ../visualization/nviz/scripts/panel_site.tcl:59
+#: ../visualization/nviz/scripts/panel_vol.tcl:494
+#: ../visualization/nviz/scripts/panel_vol.tcl:862
+#: ../visualization/nviz/scripts/panel_surf.tcl:71
+#: ../visualization/nviz/scripts/panel_legend.tcl:170
+#: ../visualization/nviz/scripts/panel_vect.tcl:70
+#: ../visualization/nviz/scripts/script_file_tools:45
+msgid "Delete"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:132
+msgid "New Key Time:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:143
+msgid "Show Feature"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:146
+msgid "Path"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:148
+msgid "Vect Lines/Polygons"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:150
+msgid "Vect Points"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:152
+msgid "Volume"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:154
+msgid "Labels/Legend"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:159
+msgid "Interp."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:168
+msgid "tension"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:447
+msgid "New Key Time"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:451
+msgid "Minute:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:452
+msgid "Second:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:453
+msgid "Frame:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:496
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:504
+msgid "KeyTime Error"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:496
+msgid "Error - All values must be at least zero."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:504
+msgid "Error - Frame number must be less than frame rate."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:540
+msgid "New Frame Rate"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:544
+msgid "Framerate:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:576
+msgid "Frame Rate Error"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:576
+msgid "Error - Frame rate must be at least 1."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:677
+#, tcl-format
+msgid "Internal Error - Can't find channel %s for keyframe %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:856
+msgid "Delete Keys"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:857
+msgid "Delete the selected keys?"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1125
+msgid "There is already a keyframe at this time, replace it?"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1221
+msgid "Keyframe Attributes"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1699
+msgid "Enter a base name:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1702
+msgid "Render:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1703
+msgid "Wireframe"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1705
+msgid "Full Rendering"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1710
+msgid "Image:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1716
+msgid "Start Frame:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1718
+msgid "Off-Screen"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1909
+msgid "Warning - Current animation has not been saved, continue?"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_kanimator.tcl:1924
+#, tcl-format
+msgid "Error - Could not open file %s for reading"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:44
+msgid "Vector Points"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:51
+msgid "Vector Points Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:55
+#: ../visualization/nviz/scripts/panel_vol.tcl:51
+#: ../visualization/nviz/scripts/panel_surf.tcl:68
+#: ../visualization/nviz/scripts/fileBrowser.tcl:119
+#: ../visualization/nviz/scripts/panel_vect.tcl:65
+msgid "Current:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:58
+#: ../visualization/nviz/scripts/panel_surf.tcl:70
+#: ../visualization/nviz/scripts/site_attr.tcl:1271
+#: ../visualization/nviz/scripts/panel_vect.tcl:69
+msgid "New"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:118
+#: ../visualization/nviz/scripts/panel_vol.tcl:115
+#: ../visualization/nviz/scripts/panel_surf.tcl:185
+#: ../visualization/nviz/scripts/panel_vect.tcl:82
+msgid "DRAW CURRENT"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:133
+msgid "icon size"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:149
+#: ../visualization/nviz/scripts/panel_label.tcl:70
+#: ../visualization/nviz/scripts/panel_arrow.tcl:61
+#: ../visualization/nviz/scripts/panel_arrow.tcl:78
+#: ../visualization/nviz/scripts/panel_vect.tcl:106
+#: ../visualization/nviz/scripts/panel_scale.tcl:60
+#: ../visualization/nviz/scripts/panel_scale.tcl:79
+#: ../visualization/nviz/scripts/panel_fringe.tcl:69
+msgid "Color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:153
+msgid "icon type"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:162
+msgid "3D points"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:166
+#: ../visualization/nviz/scripts/panel_vect.tcl:113
+msgid "display on surface(s):"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_site.tcl:182
+msgid "thematic mapping for vector points"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:46
+msgid "Volume Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:63
+msgid "Visualization type..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:66
+msgid "isosurfaces"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:69
+msgid "slices"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:73
+#: ../visualization/nviz/scripts/panel_surf.tcl:128
+msgid "Shading..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:76
+#: ../visualization/nviz/scripts/panel_surf.tcl:132
+msgid "Flat"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:78
+#: ../visualization/nviz/scripts/panel_surf.tcl:134
+msgid "Gouraud"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:82
+#: ../visualization/nviz/scripts/panel_surf.tcl:92
+#: ../visualization/nviz/scripts/panel_pos.tcl:28
+msgid "Position"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:88
+msgid "Polygon resolution: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:441
+msgid "X-axis"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:443
+msgid "Y-axis"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:445
+msgid "Z-axis"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:449
+msgid "Transparency"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:455
+#: ../visualization/nviz/scripts/panel_vol.tcl:733
+msgid "azimuth"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:456
+#: ../visualization/nviz/scripts/panel_vol.tcl:461
+#: ../visualization/nviz/scripts/panel_vol.tcl:734
+#: ../visualization/nviz/scripts/panel_vol.tcl:739
+msgid "length"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:459
+#: ../visualization/nviz/scripts/panel_vol.tcl:737
+msgid "tilt"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:493
+msgid "Add new slice"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:495
+msgid "Delete selected slice"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:497
+#: ../visualization/nviz/scripts/panel_vol.tcl:865
+msgid "Move Up"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:498
+msgid "Move slice up in list"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:499
+#: ../visualization/nviz/scripts/panel_vol.tcl:867
+msgid "Move Down"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:500
+msgid "Move slice down in list"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:830
+msgid "Isosurface attributes..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:839
+msgid "toggle normal direction"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:861
+msgid "Add new isosurface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:863
+msgid "Delete selected isosurface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:866
+msgid "Move isosurface up in list"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:868
+msgid "Move isosurface down in list"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:1114
+msgid "Position Volume"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:1145
+#: ../visualization/nviz/scripts/panel_surf.tcl:701
+msgid "Z:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:1146
+#: ../visualization/nviz/scripts/panel_surf.tcl:702
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:114
+msgid "X:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vol.tcl:1147
+#: ../visualization/nviz/scripts/panel_surf.tcl:703
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:115
+msgid "Y:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:51
+msgid "Raster Surfaces"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:58
+msgid "Surface Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:79
+msgid "Surface attributes..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:88
+msgid "Wire Color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:96
+msgid "Mask zeros:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:97
+msgid "by elevation"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:99
+msgid "by color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:109
+msgid "Draw mode..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:112
+msgid "Coarse"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:114
+msgid "Fine"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:116
+msgid "Both"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:120
+msgid "Coarse style..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:123
+msgid "Wire"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:141
+msgid "Resolution:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:166
+msgid "Set resolution for:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:167
+msgid "current surface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:169
+msgid "all surfaces"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_surf.tcl:670
+msgid "Position Surface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/fileBrowser.tcl:82
+msgid "DIRECTORIES"
+msgstr ""
+
+#: ../visualization/nviz/scripts/fileBrowser.tcl:154
+msgid "File Browser"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:62
+msgid "Labels Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:67
+#: ../visualization/nviz/scripts/panel_legend.tcl:77
+#: ../visualization/nviz/scripts/panel_arrow.tcl:73
+msgid "Font"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:69
+#: ../visualization/nviz/scripts/panel_arrow.tcl:75
+msgid "Select font family, size, and style"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:73
+msgid "Choose font color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:83
+msgid "Label text: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:90
+msgid "Place label"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:91
+msgid "Click with mouse to place label"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:92
+msgid "Erase last"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:93
+msgid "Erase most recent label placed"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:94
+msgid "Erase all"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:95
+msgid "Erase all labels"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:177
+#: ../visualization/nviz/scripts/panel_legend.tcl:220
+#: ../visualization/nviz/scripts/panel_arrow.tcl:119
+msgid "The quick brown fox jumps over the lazy dog"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_label.tcl:177
+#: ../visualization/nviz/scripts/panel_legend.tcl:220
+#: ../visualization/nviz/scripts/panel_arrow.tcl:119
+msgid "Select font"
+msgstr ""
+
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:170
+msgid "Blank"
+msgstr ""
+
+#: ../visualization/nviz/scripts/filemapBrowser.tcl:171
+msgid "Previous"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:65
+msgid "Legends Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:71
+msgid "reverse legend"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:73
+msgid "show values"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:75
+msgid "show labels"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:79
+msgid "Select font family, size, and style for legend text"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:86
+msgid "set value range "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:91
+msgid "min "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:94
+msgid " max "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:107
+msgid "discrete categories"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:131
+msgid "Place legend"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:133
+msgid ""
+"Use mouse to place legend; left button defines first corner,  right button "
+"defines opposite corner."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:135
+msgid "Erase legend"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:137
+msgid "Erase all legends"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:166
+msgid "Category Values"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_legend.tcl:183
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:61
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:67
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:290
+#: ../visualization/nviz/scripts/script_file_tools:567
+#: ../visualization/nviz/scripts/script_file_tools:676
+msgid "None"
+msgstr ""
+
+#: ../visualization/nviz/scripts/config.tcl:125
+msgid "x"
+msgstr ""
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "sphere"
+msgstr ""
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "diamond"
+msgstr ""
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "cube"
+msgstr ""
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "box"
+msgstr ""
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "gyro"
+msgstr ""
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "aster"
+msgstr ""
+
+#: ../visualization/nviz/scripts/config.tcl:125
+#: ../visualization/nviz/scripts/site_attr.tcl:77
+msgid "histogram"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_color.tcl:38
+msgid "Background Color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_color.tcl:44
+msgid "Background Color Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_color.tcl:46
+msgid "Background"
+msgstr ""
+
+#: ../visualization/nviz/scripts/colorPopup.tcl:17
+msgid "Choose color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:411
+msgid ""
+"Fill 2 or more entry fields with  desired min and max values, then press "
+"[Apply].  Or press [Auto] to automatically  generate a range of symbol sizes."
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:422
+msgid ""
+"Fill 2 or more entry fields with desired colors, then press [Apply]. Or "
+"press [Auto] to automatically generate a color table."
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:428
+#, tcl-format
+msgid "WARNING: No thematic mapping preferences set for %s!"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:447
+#, tcl-format
+msgid "Vary point %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:451
+#, tcl-format
+msgid "GIS attribute: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:460
+#, tcl-format
+msgid "Attribute type: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:472
+#: ../visualization/nviz/scripts/panel_pos.tcl:109
+msgid "Apply"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:474
+msgid "Apply current thematic preferences to point display"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:477
+msgid "Auto"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:479
+msgid ""
+"Automatically generate a color  table distributed across range of attribute "
+"values"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:485
+msgid "Clear all thematic settings"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:495
+msgid "Load/save theme preferences"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:528
+msgid "Select thematic prefs to use"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:531
+msgid "current prefs"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:536
+msgid "prefs. from file"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:542
+msgid "(preserves current prefs.)"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:553
+msgid "no prefs loaded"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:558
+msgid "View loaded thematic prefs"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:570
+msgid "Load and save prefs."
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:572
+msgid "Load prefs"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:574
+msgid "Replace current themes with prefs loaded from file"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:580
+msgid "Save prefs"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:582
+msgid "Copy current themes to prefs loaded from file"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:860
+#: ../visualization/nviz/scripts/site_attr.tcl:915
+msgid "Too few values: at least 2!"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1107
+#: ../visualization/nviz/scripts/site_attr.tcl:1197
+msgid "No prefs file loaded"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1138
+msgid "No prefs"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1146
+msgid "Thematic prefs and attribute have different types"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1207
+msgid "Thematic prefs and attributes have different types"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1408
+#, tcl-format
+msgid "WARNING: No attribute behaviour for %s!"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1418
+#, tcl-format
+msgid "Thematic prefs file %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1422
+#, tcl-format
+msgid "Name: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1430
+#, tcl-format
+msgid "Type: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1436
+msgid "Save thematic prefs in file"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1439
+msgid "Clear current thematic prefs"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1493
+msgid "Load Thematic Prefs"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1497
+msgid "Load file"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1577
+msgid "Save thematic prefs"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1582
+#, tcl-format
+msgid "Old LUT \"%s\" deleted"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1607
+#, tcl-format
+msgid "Thematic preferences file \"%s\" saved"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1616
+msgid "Load thematic prefs"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1622
+#, tcl-format
+msgid "*** WARNING *** File \"%s\" is unavailable"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1627
+#, tcl-format
+msgid "*** ERROR *** Some thematic pref component are missing in file \"%s\""
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1700
+#, tcl-format
+msgid "WARNING: Unknown Tag \"%s\" in file \"%s\""
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1770
+#: ../visualization/nviz/scripts/site_attr.tcl:1852
+#, tcl-format
+msgid "WARNING: Unknown attribute %s!"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1791
+#, tcl-format
+msgid "WARNING: field %s NOT FOUND"
+msgstr ""
+
+#: ../visualization/nviz/scripts/site_attr.tcl:1798
+#, tcl-format
+msgid "WARNING: lut file %s NOT FOUND"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:47
+msgid "North arrow"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:49
+msgid "North Arrow Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:53
+msgid "Arrow: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:56
+msgid "size (in map units) "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:72
+msgid "North text: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_arrow.tcl:89
+msgid "Place arrow"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_tools:32
+msgid "Open Loop"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_tools:33
+msgid "Close Loop"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_tools:37
+msgid "Open File Seq. Loop"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_tools:38
+msgid "Close File Seq. Loop"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_tools:42
+msgid "File Sequence Tool"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_tools:104
+msgid "Loop Start Value"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_tools:106
+msgid "Loop End Value"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_tools:108
+msgid "Loop Increment Value"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:99
+msgid "use volume as color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:275
+msgid "remove mask"
+msgstr ""
+
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:403
+msgid "Enter value: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/attIsosurfPopup.tcl:449
+msgid "Use slider to select constant value :"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_tst.tcl:31
+msgid "Test Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:48
+msgid "Cutting Planes"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:50
+msgid "Cutting Planes Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:60
+msgid "Active cutting plane: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:68
+msgid "Plane 0"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:69
+msgid "Plane 1"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:70
+msgid "Plane 2"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:71
+msgid "Plane 3"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:72
+msgid "Plane 4"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:73
+msgid "Plane 5"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:87
+msgid "set shading"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:90
+msgid "top color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:92
+msgid "bottom color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:94
+msgid "blend"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:96
+msgid "shaded"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:98
+#: ../visualization/nviz/scripts/panel_vquery.tcl:426
+msgid "clear"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:139
+msgid "Z coord"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:151
+msgid "Rotate"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:163
+msgid "Tilt"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:184
+msgid "All Off"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_cutplane.tcl:292
+#, tcl-format
+msgid "Plane %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:51
+msgid "Vector Query"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:57
+msgid "Vector Query Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:83
+#: ../visualization/nviz/scripts/panel_rquery.tcl:62
+msgid "query on/off"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:86
+msgid "Choose map(s)"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:88
+msgid "Select/unselect vector map(s) to query"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:98
+msgid "Set threshold distance for selecting objects"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:100
+msgid "threshold dist"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:104
+msgid "show hyperlink"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:113
+msgid "Highlight queried vector points with..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:118
+msgid "color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:122
+msgid "Choose color to indicate point queried"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:124
+msgid "icon size  X"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:130
+msgid "Choose size in multiples of default to indicate point queried"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:137
+msgid "specific icon"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:208
+msgid "Select vectors to query"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:209
+msgid "vectors displayed"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:209
+msgid "vectors to query"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:410
+#, tcl-format
+msgid "Map: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:496
+msgid "Clear Window?"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:496
+msgid "Yes"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:496
+msgid "No"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vquery.tcl:619
+msgid "set icon"
+msgstr ""
+
+#: ../visualization/nviz/scripts/ACS_utils.tcl:331
+msgid "ok"
+msgstr ""
+
+#: ../visualization/nviz/scripts/ACS_utils.tcl:331
+msgid "dismiss"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vect.tcl:55
+msgid "Vector Lines/3D Polygons"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vect.tcl:60
+msgid "Vector Lines Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vect.tcl:95
+msgid "line width"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vect.tcl:110
+msgid "display flat"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_vect.tcl:117
+msgid ""
+"vector height\n"
+"above surface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:27
+msgid "Resize Draw Area"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:33
+msgid "Resize Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:39
+msgid "Resize: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:42
+msgid "width"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:52
+msgid "Resize"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_resize.tcl:55
+#: ../visualization/nviz/scripts/panel_pos.tcl:95
+msgid "Refresh"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:45
+msgid "Scale bar"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:47
+msgid "Scale Bar Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:51
+msgid "Scale bar: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:54
+msgid "length (in map units) "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:71
+msgid "Scale text: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:74
+msgid "size "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_scale.tcl:90
+msgid "Place scale"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:41
+msgid "Send results to: (no file selected)"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:52
+msgid "Raster Query"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:58
+msgid "Raster Query Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:65
+msgid "Reset most recent query"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:67
+msgid "Clear all queries"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:68
+msgid "Attributes"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Map name"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Easting"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Northing"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Elevation"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Category of color map"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "XY dist from prev"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "XYZ dist from prev"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Dist along surface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:78
+msgid "Dist along exag surface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:93
+msgid "Select file to receive all future query results"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:126
+#, tcl-format
+msgid "Send results to: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:152
+#: ../visualization/nviz/scripts/panel_rquery.tcl:153
+msgid "Point not on surface\n"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:164
+#, tcl-format
+msgid "Easting: %15.4f\n"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:171
+#, tcl-format
+msgid "Northing: %15.4f\n"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:178
+#, tcl-format
+msgid "Elevation: %15.4f\n"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:186
+#: ../visualization/nviz/scripts/panel_rquery.tcl:187
+#, tcl-format
+msgid "Surf map: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:202
+msgid "constant"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:204
+#: ../visualization/nviz/scripts/panel_rquery.tcl:205
+#, tcl-format
+msgid "Color map: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:224
+#, tcl-format
+msgid "XY distance from previous: \t%15.4f\n"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:232
+#, tcl-format
+msgid "XYZ distance from previous: \t%15.4f\n"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:241
+#, tcl-format
+msgid "Distance along surface: \t%15.4f\n"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_rquery.tcl:252
+#, tcl-format
+msgid "Distance along exag. surface:%15.4f\n"
+msgstr ""
+
+#: ../visualization/nviz/scripts/wirecolorPopup.tcl:30
+msgid "Select Wire Color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/wirecolorPopup.tcl:57
+msgid "use surface color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/mapBrowser.tcl:204
+msgid "Map type:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/mapBrowser.tcl:218
+msgid "3d.view"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:36
+msgid "Map Object File Sequencing"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:43
+msgid "Fields:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:46
+msgid "State File: None"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:53
+msgid "Options:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:55
+msgid "Add To Script"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:56
+msgid "Build Script..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:57
+msgid "Load Fields..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:58
+msgid "Save Fields..."
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:75
+msgid "Frame"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:111
+msgid "Current fields have not been saved, really load new fields?"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:135
+#, tcl-format
+msgid "While reading state_file: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:142
+#, tcl-format
+msgid "While reading number of fields: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:151
+#, tcl-format
+msgid "While reading field type: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:157
+#, tcl-format
+msgid "While reading field attribute: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:542
+msgid "Field Type: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:554
+msgid "Field Attribute: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:555
+msgid "Topography"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:566
+msgid "Use Nviz Map: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:853
+#, tcl-format
+msgid "State File: %s"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_file_tools:885
+msgid "Enter an image root name"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:25
+msgid "Lighting"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:30
+msgid "Lighting Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:43
+msgid " Light source position"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:58
+msgid "Follow surface viewpoint"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:60
+msgid "Show lighting model"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:66
+msgid "Light color"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_lights.tcl:70
+msgid "Light intensity"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:39
+msgid "Scaled Difference"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:45
+msgid "Scaled Difference Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:54
+msgid "Reference surface:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:58
+msgid "Set difference between reference surface and others"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:66
+msgid "unselect reference surface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_sdiff.tcl:124
+msgid "None selected"
+msgstr ""
+
+#: ../visualization/nviz/scripts/widgets.tcl:70
+msgid "E"
+msgstr ""
+
+#: ../visualization/nviz/scripts/widgets.tcl:71
+msgid "W"
+msgstr ""
+
+#: ../visualization/nviz/scripts/widgets.tcl:72
+msgid "N"
+msgstr ""
+
+#: ../visualization/nviz/scripts/widgets.tcl:73
+msgid "S"
+msgstr ""
+
+#: ../visualization/nviz/scripts/widgets.tcl:596
+msgid "None Loaded"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:34
+msgid "Position Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:45
+msgid "From (eye):"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:46
+msgid "To (surface):"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:49
+msgid "Range/bearing:"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:52
+msgid "East"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:56
+msgid "Range"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:60
+msgid "North"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:64
+msgid "Bearing"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:72
+msgid "Elev"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:83
+msgid "Eye to surface"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:84
+msgid "Surface to eye"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_pos.tcl:85
+msgid "Calculate"
+msgstr ""
+
+#: ../visualization/nviz/scripts/script_play:31
+#, tcl-format
+msgid "Script file %s does not exist"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:45
+msgid "Fringe Panel"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:48
+msgid "Edges with fringe: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:51
+msgid "N&W"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:54
+msgid "N&E"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:57
+msgid "S&W"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:60
+msgid "S&E"
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:68
+msgid "Elevation of fringe bottom: "
+msgstr ""
+
+#: ../visualization/nviz/scripts/panel_fringe.tcl:80
+msgid "Draw Fringe"
+msgstr ""
diff --git a/locale/po/grasstcl_nl.po b/locale/po/grasstcl_nl.po
new file mode 100644
index 0000000..57ed2c1
--- /dev/null
+++ b/locale/po/grasstcl_nl.po
@@ -0,0 +1,6609 @@
+# translation of grasstcl_nl.po to Dutch
+# This file is distributed under the same license as the GRASS package.
+# Copyright (C) 2012 GRASS Development Team
+#
+# XXX, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: grasstcl_nl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-10 00:42+0200\n"
+"PO-Revision-Date: 2012-06-19 23:46+0200\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Dutch <grass-translations at lists.osgeo.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../lib/init/file_option.tcl:72
+msgid "Define location using projection information in georeferenced file"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:92 ../lib/init/epsg_option.tcl:120
+msgid "Name of new location"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:95
+msgid "Enter name of location to be created"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:99
+msgid "Path to georeferenced file"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:102
+msgid "Path to georeferenced file (format must be readable by GDAL/OGR)"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:105 ../lib/init/epsg_option.tcl:133
+#: ../lib/init/epsg_option.tcl:146 ../lib/init/gis_set.tcl:267
+msgid "Browse..."
+msgstr ""
+
+#: ../lib/init/file_option.tcl:106
+msgid "Browse to locate georeferenced file"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:111 ../lib/init/epsg_option.tcl:162
+msgid "Define location"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:114 ../lib/init/file_option.tcl:266
+#: ../lib/init/epsg_option.tcl:165 ../lib/init/epsg_option.tcl:312
+#: ../lib/gtcltk/select.tcl:210 ../gui/tcltk/gis.m/georect.tcl:703
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:921 ../gui/tcltk/gis.m/rules.tcl:172
+#: ../gui/tcltk/gis.m/dnviz.tcl:230 ../gui/tcltk/gis.m/gm.tcl:468
+#: ../gui/tcltk/gis.m/gm.tcl:543 ../gui/tcltk/gis.m/animate.tcl:538
+msgid "Cancel"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:131 ../lib/init/file_option.tcl:134
+msgid "Choose georeferenced file"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:152
+msgid ""
+"WARNING: Please supply a\n"
+"valid georeferenced file"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:185 ../lib/init/file_option.tcl:212
+#: ../lib/init/epsg_option.tcl:234 ../lib/init/epsg_option.tcl:261
+msgid "Error creating location!"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:186 ../lib/init/file_option.tcl:213
+#: ../lib/init/epsg_option.tcl:235 ../lib/init/epsg_option.tcl:262
+#, tcl-format
+msgid ""
+"g.proj returned the following message:\n"
+"%s"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:193 ../lib/init/file_option.tcl:217
+#: ../lib/init/epsg_option.tcl:242 ../lib/init/epsg_option.tcl:266
+msgid "Informational output from g.proj"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:194 ../lib/init/file_option.tcl:218
+#: ../lib/init/epsg_option.tcl:243 ../lib/init/epsg_option.tcl:267
+#, tcl-format
+msgid ""
+"g.proj returned the following informational message:\n"
+"%s"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:240 ../lib/init/epsg_option.tcl:286
+msgid "Select datum transformation parameters:"
+msgstr ""
+
+#: ../lib/init/file_option.tcl:244 ../lib/init/epsg_option.tcl:290
+msgid ""
+"Continue without specifying parameters - if used when creating a location, "
+"other GRASS modules will use the \"default\" (likely non-optimum) parameters "
+"for this datum if necessary in the future."
+msgstr ""
+
+#: ../lib/init/file_option.tcl:263 ../lib/init/epsg_option.tcl:309
+#: ../gui/tcltk/gis.m/rules.tcl:170 ../gui/tcltk/gis.m/dnviz.tcl:228
+#: ../gui/tcltk/gis.m/gm.tcl:465 ../gui/tcltk/gis.m/animate.tcl:536
+#: ../vector/v.digit/settings.tcl:174
+msgid "OK"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:91
+msgid "WARNING: cant get environmental variable"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:92
+msgid ""
+"Warning: Unable to get environmental variable GRASS_PROJSHARE. \n"
+"This is a GRASS installation error. \n"
+"Set environmental variable GRASS_PROJSHARE to point to directory with Proj4 "
+"EPSG file. "
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:101
+msgid "Define location using EPSG projection codes"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:123
+msgid "Enter name for location to be created"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:127 ../lib/init/epsg_option.tcl:130
+msgid "Path to the EPSG-codes file"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:134
+msgid "Browse to locate EPSG file"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:141
+msgid "EPSG code number of projection"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:144
+msgid "Enter EPSG code for selected projection"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:147
+msgid "View EPSG codes and projection information."
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:153
+msgid "WARNING: epsg-codes file not found"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:154
+msgid "WARNING: The epsg-codes file was not found!"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:185
+msgid "Invalid EPSG Code!"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:186
+#, tcl-format
+msgid "ERROR: Invalid EPSG code %s: should be an integer."
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:196
+msgid "Location Exists!"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:197
+#, tcl-format
+msgid "WARNING: Location '%s' already exists: please try another name."
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:342
+msgid "You can select EPSG code (in <braces>) and copy it for later use."
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:379
+msgid "GUESS THAT IS NOT THE EPSG FILE"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:385 ../lib/init/epsg_option.tcl:414
+#: ../lib/init/epsg_option.tcl:433
+msgid "Search"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:387
+msgid "Grab code"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:392 ../lib/init/epsg_option.tcl:436
+#: ../lib/gis/gui.tcl:511 ../gui/tcltk/d.m/print.tcl:281
+#: ../gui/tcltk/d.m/menu.tcl:176 ../gui/tcltk/gis.m/mapprint.tcl:372
+#: ../gui/tcltk/gis.m/runandoutput.tcl:48 ../gui/tcltk/gis.m/gmmenu.tcl:90
+msgid "Close"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:420
+msgid "Search text: "
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:421
+msgid "Search for entered text in EPSG file"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:426
+msgid "forward search"
+msgstr ""
+
+#: ../lib/init/epsg_option.tcl:427
+msgid "backward search"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:111
+msgid "WARNING: can not save"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:112
+#, tcl-format
+msgid ""
+"Warning: unable to save data to <%s> file.\n"
+"Error message: %s"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:131 ../lib/init/gis_set.tcl:403
+#: ../lib/init/gis_set.tcl:509 ../lib/init/gis_set.tcl:641
+#: ../lib/init/gis_set.tcl:662 ../lib/init/gis_set.tcl:680
+#: ../lib/init/gis_set.tcl:708
+msgid "WARNING: invalid location"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:132
+#, tcl-format
+msgid ""
+"Warning: location <%s> at GISDBASE <%s> is not a directory or does not exist."
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:183
+#, tcl-format
+msgid "GRASS %s Startup"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:225
+msgid "Welcome to GRASS GIS Version"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:227
+msgid ""
+"The world's leading open source GIS\n"
+"\n"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:229
+msgid "Select an existing project location and mapset\n"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:230
+msgid "or define a new location\n"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:253
+msgid "GIS Data Directory: "
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:269
+msgid "New GIS data directory"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:292
+msgid "Project Location (projection/coordinate system)"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:325
+msgid "Accessible Mapsets (directories of GIS files)"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:382
+msgid "Create new mapset in selected location"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:390
+msgid "Create new mapset"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:395
+msgid "WARNING: invalid mapset name"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:396
+#, tcl-format
+msgid ""
+"Warning: Mapset with name <%s> already exists. \n"
+"New mapset is NOT created. \n"
+"Choose different mapset name and try again."
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:404
+#, tcl-format
+msgid ""
+"Warning: selected location <%s> is not valid. \n"
+" New mapset is NOT created. \n"
+" Select valid location and try again."
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:411
+msgid "WARNING: unable to mkdir"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:412
+#, tcl-format
+msgid ""
+"Warning: Unable to create directory for new mapset. \n"
+"Error message: %s"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:437
+msgid "Define new location with..."
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:441
+msgid "Georeferenced file"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:454
+msgid "EPSG codes"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:467
+msgid "Projection values"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:505
+msgid "Enter GRASS"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:510
+#, tcl-format
+msgid ""
+"Warning: selected location <%s> is not valid. \n"
+" Select valid location and try again."
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:515 ../lib/init/gis_set.tcl:686
+msgid "WARNING: invalid mapset"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:516
+#, tcl-format
+msgid "Warning: <%s> is not a valid mapset"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:531 ../lib/gis/gui.tcl:509
+#: ../gui/tcltk/d.m/barscale.tcl:74 ../gui/tcltk/d.m/barscale.tcl:78
+#: ../gui/tcltk/d.m/chart.tcl:96 ../gui/tcltk/d.m/chart.tcl:100
+#: ../gui/tcltk/d.m/labels.tcl:70 ../gui/tcltk/d.m/labels.tcl:74
+#: ../gui/tcltk/d.m/frames.tcl:66 ../gui/tcltk/d.m/frames.tcl:70
+#: ../gui/tcltk/d.m/raster.tcl:90 ../gui/tcltk/d.m/raster.tcl:94
+#: ../gui/tcltk/d.m/legend.tcl:86 ../gui/tcltk/d.m/legend.tcl:90
+#: ../gui/tcltk/d.m/gridline.tcl:81 ../gui/tcltk/d.m/gridline.tcl:120
+#: ../gui/tcltk/d.m/gridline.tcl:150 ../gui/tcltk/d.m/fttext.tcl:83
+#: ../gui/tcltk/d.m/fttext.tcl:87 ../gui/tcltk/d.m/dtext.tcl:75
+#: ../gui/tcltk/d.m/dtext.tcl:79 ../gui/tcltk/d.m/thematic.tcl:121
+#: ../gui/tcltk/d.m/thematic.tcl:125 ../gui/tcltk/d.m/vector.tcl:202
+#: ../gui/tcltk/d.m/vector.tcl:206 ../gui/tcltk/d.m/rgbhis.tcl:130
+#: ../gui/tcltk/d.m/rgbhis.tcl:137 ../gui/tcltk/gis.m/georect.tcl:708
+#: ../gui/tcltk/gis.m/georect.tcl:712 ../gui/tcltk/gis.m/georect.tcl:1142
+#: ../gui/tcltk/gis.m/georect.tcl:1146 ../gui/tcltk/gis.m/barscale.tcl:180
+#: ../gui/tcltk/gis.m/barscale.tcl:184 ../gui/tcltk/gis.m/chart.tcl:210
+#: ../gui/tcltk/gis.m/chart.tcl:214 ../gui/tcltk/gis.m/labels.tcl:136
+#: ../gui/tcltk/gis.m/labels.tcl:140 ../gui/tcltk/gis.m/rules.tcl:139
+#: ../gui/tcltk/gis.m/rules.tcl:143 ../gui/tcltk/gis.m/frames.tcl:118
+#: ../gui/tcltk/gis.m/frames.tcl:122 ../gui/tcltk/gis.m/raster.tcl:209
+#: ../gui/tcltk/gis.m/raster.tcl:213 ../gui/tcltk/gis.m/legend.tcl:219
+#: ../gui/tcltk/gis.m/legend.tcl:222 ../gui/tcltk/gis.m/gridline.tcl:166
+#: ../gui/tcltk/gis.m/gridline.tcl:218 ../gui/tcltk/gis.m/gridline.tcl:249
+#: ../gui/tcltk/gis.m/dnviz.tcl:208 ../gui/tcltk/gis.m/dnviz.tcl:212
+#: ../gui/tcltk/gis.m/runandoutput.tcl:47 ../gui/tcltk/gis.m/histogram.tcl:163
+#: ../gui/tcltk/gis.m/histogram.tcl:166 ../gui/tcltk/gis.m/rastarrows.tcl:169
+#: ../gui/tcltk/gis.m/rastarrows.tcl:172 ../gui/tcltk/gis.m/dtext.tcl:179
+#: ../gui/tcltk/gis.m/dtext.tcl:183 ../gui/tcltk/gis.m/profile.tcl:131
+#: ../gui/tcltk/gis.m/profile.tcl:135 ../gui/tcltk/gis.m/animate.tcl:408
+#: ../gui/tcltk/gis.m/animate.tcl:412 ../gui/tcltk/gis.m/animate.tcl:481
+#: ../gui/tcltk/gis.m/animate.tcl:484 ../gui/tcltk/gis.m/thematic.tcl:269
+#: ../gui/tcltk/gis.m/thematic.tcl:273 ../gui/tcltk/gis.m/rastnums.tcl:165
+#: ../gui/tcltk/gis.m/rastnums.tcl:168 ../gui/tcltk/gis.m/vector.tcl:368
+#: ../gui/tcltk/gis.m/vector.tcl:372 ../gui/tcltk/gis.m/rgbhis.tcl:156
+#: ../gui/tcltk/gis.m/rgbhis.tcl:165
+msgid "Help"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:536
+msgid "Help already opened"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:549
+msgid "Exit"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:583
+msgid "Starting GRASS for the first time"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:584
+msgid ""
+"GRASS needs a directory in which to store its data.  Create one now if you "
+"have not already done so.  A popular choice is \"grassdata\", located in "
+"your home directory."
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:589
+msgid "Select GIS data directory"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:594
+msgid "WARNING: Invalid Database"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:595
+msgid "WARNING: Invalid database. Finding first valid directory in parent tree"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:642 ../lib/init/gis_set.tcl:663
+#: ../lib/init/gis_set.tcl:681 ../lib/init/gis_set.tcl:709
+#, tcl-format
+msgid ""
+"Warning: selected location <%%s> is not valid. \n"
+" Select valid location and try again."
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:687
+#, tcl-format
+msgid "Warning: <%%s> is not a valid mapset"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:781
+msgid "WARNING: change directory failed"
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:782
+#, tcl-format
+msgid ""
+"Warning: could not change directory to <%s>.\n"
+"Check directory permissions."
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:936
+#, tcl-format
+msgid ""
+"Something went wrong while processing GISRC file named \"%s\".\n"
+"It's a fatal error. GRASS will not start till issue with GISRC file is fixed."
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:938
+msgid ""
+"\n"
+"\n"
+"On MS-Windows systems failure might be caused by non-latin letter in GISRC "
+"file path.  Check that Your username doesn't contain non-latin letters.  Due "
+"to non-latin letter encoding handling in MS-Windows, it's not possible to "
+"run GRASS if username contains non-latin letters."
+msgstr ""
+
+#: ../lib/init/gis_set.tcl:942
+msgid "ERROR: unable to read GISRC"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:11 ../lib/gis/gui.tcl:15 ../lib/gis/gui.tcl:19
+#: ../lib/gis/gui.tcl:310 ../gui/tcltk/gis.m/grassabout.tcl:94
+#: ../gui/tcltk/gis.m/gmlib.tcl:141 ../gui/tcltk/gis.m/runandoutput.tcl:277
+#: ../gui/tcltk/gis.m/runandoutput.tcl:283
+msgid "Error"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:229 ../gui/tcltk/gis.m/gmlib.tcl:119
+msgid "Save File"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:231
+msgid "Load File"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:295 ../lib/gis/gui.tcl:485
+msgid "Output"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:355
+msgid "Options"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:361
+msgid "Required"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:469 ../gui/tcltk/gis.m/gmmenu.tcl:171
+msgid "Copy"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:508 ../gui/tcltk/gis.m/runandoutput.tcl:44
+#: ../gui/tcltk/gis.m/runandoutput.tcl:118
+msgid "Run"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:510
+msgid "Clear"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:582
+msgid "required"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:582
+msgid "optional"
+msgstr ""
+
+#: ../lib/gis/gui.tcl:583
+msgid "multiple"
+msgstr ""
+
+#: ../lib/gtcltk/select.tcl:107
+msgid "Select item"
+msgstr ""
+
+#: ../lib/gtcltk/select.tcl:209
+msgid "Ok"
+msgstr ""
+
+#: ../gui/tcltk/d.m/barscale.tcl:67 ../gui/tcltk/d.m/legend.tcl:106
+msgid "Text color: "
+msgstr ""
+
+#: ../gui/tcltk/d.m/barscale.tcl:69
+msgid " Background color: "
+msgstr ""
+
+#: ../gui/tcltk/d.m/barscale.tcl:71
+msgid "no background color"
+msgstr ""
+
+#: ../gui/tcltk/d.m/barscale.tcl:73
+msgid " "
+msgstr ""
+
+#: ../gui/tcltk/d.m/barscale.tcl:92
+msgid "display N. arrow only "
+msgstr ""
+
+#: ../gui/tcltk/d.m/barscale.tcl:94 ../gui/tcltk/gis.m/barscale.tcl:224
+msgid "display scale only"
+msgstr ""
+
+#: ../gui/tcltk/d.m/barscale.tcl:101
+msgid "line scale instead of bar scale "
+msgstr ""
+
+#: ../gui/tcltk/d.m/barscale.tcl:103 ../gui/tcltk/gis.m/barscale.tcl:232
+msgid "text on top of scale, instead of to right"
+msgstr ""
+
+#: ../gui/tcltk/d.m/barscale.tcl:110 ../gui/tcltk/gis.m/barscale.tcl:242
+msgid "use feet/miles instead of meters"
+msgstr ""
+
+#: ../gui/tcltk/d.m/barscale.tcl:118 ../gui/tcltk/d.m/legend.tcl:185
+msgid "place with mouse (cannot save placement with group)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:91 ../gui/tcltk/gis.m/chart.tcl:202
+msgid "Vector map to chart:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:106 ../gui/tcltk/gis.m/chart.tcl:220
+msgid "Vector type:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:107 ../gui/tcltk/d.m/vector.tcl:227
+#: ../gui/tcltk/gis.m/chart.tcl:221
+msgid "points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:108 ../gui/tcltk/d.m/vector.tcl:229
+#: ../gui/tcltk/gis.m/chart.tcl:222 ../gui/tcltk/gis.m/legend.tcl:308
+msgid "lines"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:109 ../gui/tcltk/d.m/vector.tcl:231
+#: ../gui/tcltk/gis.m/chart.tcl:223
+msgid "boundaries"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:110 ../gui/tcltk/d.m/vector.tcl:233
+#: ../gui/tcltk/gis.m/chart.tcl:224
+msgid "centroids"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:111 ../gui/tcltk/d.m/vector.tcl:235
+#: ../gui/tcltk/gis.m/chart.tcl:225
+msgid "areas"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:120
+msgid "  show attribute columns"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:121 ../gui/tcltk/d.m/thematic.tcl:151
+#: ../gui/tcltk/d.m/vector.tcl:349 ../gui/tcltk/gis.m/chart.tcl:239
+#: ../gui/tcltk/gis.m/thematic.tcl:299 ../gui/tcltk/gis.m/vector.tcl:533
+msgid "columns"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:125 ../gui/tcltk/d.m/thematic.tcl:155
+#: ../gui/tcltk/d.m/vector.tcl:353 ../gui/tcltk/gis.m/chart.tcl:243
+#: ../gui/tcltk/gis.m/thematic.tcl:303 ../gui/tcltk/gis.m/vector.tcl:537
+msgid "Show columns"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:158 ../gui/tcltk/gis.m/chart.tcl:278
+msgid "Chart type:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/chart.tcl:169
+msgid "    chart outline color:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:22 ../gui/tcltk/gis.m/gmtool1.tcl:42
+msgid "Add raster layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:28 ../gui/tcltk/gis.m/gmtool1.tcl:49
+msgid "Add RGB or HIS layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:33
+msgid "Add legend"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:48 ../gui/tcltk/gis.m/gmtool1.tcl:92
+msgid "Add vector layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:54 ../gui/tcltk/gis.m/gmtool1.tcl:108
+msgid "Add thematic charts layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:62 ../gui/tcltk/gis.m/gmtool1.tcl:99
+msgid "Add thematic map layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:76
+msgid "Add paint labels layer (from directory paint/labels)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:82
+msgid "Add freetype text layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:88 ../gui/tcltk/gis.m/gmtool1.tcl:128
+msgid "Add text layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:100 ../gui/tcltk/gis.m/gmtool2.tcl:26
+msgid "Scalebar and north arrow"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:105 ../gui/tcltk/gis.m/gmtool2.tcl:32
+msgid "Overlay grids and lines"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:110
+msgid "Create or select display frame"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:116 ../gui/tcltk/gis.m/gmtool2.tcl:39
+msgid "Add command layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:130 ../gui/tcltk/gis.m/gmtool2.tcl:59
+msgid "Add group"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:135 ../gui/tcltk/gis.m/gmtool2.tcl:65
+msgid "Duplicate Layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:139 ../gui/tcltk/gis.m/gmtool2.tcl:70
+msgid "Delete layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool2.tcl:153 ../gui/tcltk/gis.m/gmtool2.tcl:127
+msgid "Digitize map (select or create new map first)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/labels.tcl:65
+msgid "Labels name:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/labels.tcl:80 ../gui/tcltk/gis.m/labels.tcl:146
+msgid "Display constraints:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/labels.tcl:85 ../gui/tcltk/gis.m/labels.tcl:151
+msgid "region size"
+msgstr ""
+
+#: ../gui/tcltk/d.m/labels.tcl:91 ../gui/tcltk/gis.m/labels.tcl:157
+msgid " ignore rotation setting and draw horizontally"
+msgstr ""
+
+#: ../gui/tcltk/d.m/frames.tcl:60 ../gui/tcltk/gis.m/frames.tcl:112
+msgid "create and select frame"
+msgstr ""
+
+#: ../gui/tcltk/d.m/frames.tcl:62 ../gui/tcltk/gis.m/frames.tcl:114
+msgid "select frame"
+msgstr ""
+
+#: ../gui/tcltk/d.m/frames.tcl:64
+msgid "remove all frames"
+msgstr ""
+
+#: ../gui/tcltk/d.m/raster.tcl:85
+msgid "Raster name:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/raster.tcl:108
+msgid "show legend in selected display monitor"
+msgstr ""
+
+#: ../gui/tcltk/d.m/raster.tcl:111 ../gui/tcltk/d.m/raster.tcl:136
+msgid " thin legend by "
+msgstr ""
+
+#: ../gui/tcltk/d.m/raster.tcl:118
+msgid "Raster to drape over 1st map:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/raster.tcl:132
+msgid "show legend for drape map in monitor"
+msgstr ""
+
+#: ../gui/tcltk/d.m/raster.tcl:143 ../gui/tcltk/d.m/rgbhis.tcl:147
+#: ../gui/tcltk/gis.m/raster.tcl:263 ../gui/tcltk/gis.m/rgbhis.tcl:220
+msgid "overlay maps from other layers (transparent null value cells)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/legend.tcl:81
+msgid "Raster map for legend:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/legend.tcl:96
+msgid "Display legend in monitor: "
+msgstr ""
+
+#: ../gui/tcltk/d.m/legend.tcl:99
+msgid " erase monitor before drawing legend"
+msgstr ""
+
+#: ../gui/tcltk/d.m/legend.tcl:164
+msgid "do not show cat labels"
+msgstr ""
+
+#: ../gui/tcltk/d.m/legend.tcl:166
+msgid "do not show cat numbers"
+msgstr ""
+
+#: ../gui/tcltk/d.m/legend.tcl:173
+msgid "skip cats with no labels"
+msgstr ""
+
+#: ../gui/tcltk/d.m/legend.tcl:175
+msgid "draw smooth gradient"
+msgstr ""
+
+#: ../gui/tcltk/d.m/legend.tcl:177
+msgid "flip legend"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:33
+msgid "x0"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:35
+msgid "Start/select display monitor x0"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:38
+msgid "x1"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:40
+msgid "Start/select display monitor x1"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:43
+msgid "x2"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:45
+msgid "Start/select display monitor x2"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:48
+msgid "x3"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:50
+msgid "Start/select display monitor x3"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:53
+msgid "x4"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:55
+msgid "Start/select display monitor x4"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:58
+msgid "x5"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:60
+msgid "Start/select display monitor x5"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:63
+msgid "x6"
+msgstr ""
+
+#: ../gui/tcltk/d.m/monitorsel.tcl:65
+msgid "Start/select display monitor x6"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:77 ../gui/tcltk/gis.m/gridline.tcl:162
+msgid "draw grid"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:78
+msgid "geodetic grid"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:80
+msgid " grid color "
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:85 ../gui/tcltk/gis.m/gridline.tcl:170
+msgid "Help for grids"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:86
+msgid " grid color"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:92
+msgid "     "
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:93
+msgid "draw grid border"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:94
+msgid "draw border text"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:95
+msgid " border & text color"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:119 ../gui/tcltk/gis.m/gridline.tcl:217
+msgid "draw geodesic line"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:124 ../gui/tcltk/gis.m/gridline.tcl:222
+msgid "Help for geodesic lines"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:149 ../gui/tcltk/gis.m/gridline.tcl:248
+msgid "draw rhumbline"
+msgstr ""
+
+#: ../gui/tcltk/d.m/gridline.tcl:154 ../gui/tcltk/gis.m/gridline.tcl:253
+msgid "Help for rhumblines"
+msgstr ""
+
+#: ../gui/tcltk/d.m/fttext.tcl:102
+msgid "     (leave blank to place with mouse; position will not save)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/fttext.tcl:108
+msgid "     coordinate type"
+msgstr ""
+
+#: ../gui/tcltk/d.m/fttext.tcl:111
+msgid "  align text with coordinate point"
+msgstr ""
+
+#: ../gui/tcltk/d.m/fttext.tcl:120
+#, tcl-format
+msgid ""
+"     (for coordinates, % is from bottom left of display, pixels from top "
+"left)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/fttext.tcl:126
+msgid "     text rotation (degrees counterclockwise)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/fttext.tcl:129
+msgid "rotation in radians"
+msgstr ""
+
+#: ../gui/tcltk/d.m/fttext.tcl:144 ../gui/tcltk/gis.m/maptext.tcl:183
+msgid "Font:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/fttext.tcl:149 ../gui/tcltk/gis.m/maptext.tcl:190
+#: ../gui/tcltk/gis.m/maplabels.tcl:274 ../gui/tcltk/gis.m/dtext.tcl:234
+msgid "  color"
+msgstr ""
+
+#: ../gui/tcltk/d.m/fttext.tcl:151 ../gui/tcltk/d.m/dtext.tcl:106
+#: ../gui/tcltk/gis.m/dtext.tcl:236
+msgid "bold text"
+msgstr ""
+
+#: ../gui/tcltk/d.m/fttext.tcl:164
+msgid "height in pixels instead of %"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:169
+msgid "Paper format"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:180
+msgid "Custom"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:181 ../gui/tcltk/gis.m/mapprint.tcl:282
+msgid "width:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:184
+msgid "height:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:191
+msgid "left:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:193
+msgid "right:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:195
+msgid "top:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:197
+msgid "bottom:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:210
+msgid "PS file:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:212 ../gui/tcltk/d.m/print.tcl:223
+#: ../gui/tcltk/d.m/print.tcl:234 ../gui/tcltk/d.m/print.tcl:261
+#: ../gui/tcltk/gis.m/mapprint.tcl:345 ../gui/tcltk/gis.m/mapprint.tcl:357
+msgid "Browse"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:221
+msgid "PDF file:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:232
+msgid "PNG file:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:241
+msgid "PNG file resolution (points/inch):"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:250
+msgid "Printer:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:259
+msgid "Script file:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:279 ../gui/tcltk/gis.m/mapprint.tcl:371
+msgid "Print"
+msgstr ""
+
+#: ../gui/tcltk/d.m/print.tcl:280
+msgid "Preview"
+msgstr ""
+
+#: ../gui/tcltk/d.m/cmd.tcl:52 ../gui/tcltk/gis.m/cmd.tcl:115
+msgid "Command:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/dtext.tcl:101
+msgid "Text options: color"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:22
+msgid "Display active layers in current region"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:28
+msgid "Display active layers in default region"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:34
+msgid "Display active layers in saved region setting"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:40 ../gui/tcltk/gis.m/maptool.tcl:68
+#: ../gui/tcltk/gis.m/georecttool.tcl:47
+msgid "Erase to white"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:54
+msgid "NVIZ - n dimensional visualization"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:60
+msgid "Fly through path for NVIZ"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:66 ../gui/tcltk/gis.m/gmtool2.tcl:111
+msgid "Animate raster map series"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:81
+msgid "Zoom"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:87 ../gui/tcltk/gis.m/maptool.tcl:165
+#: ../gui/tcltk/gis.m/georecttool.tcl:144
+msgid "Return to previous zoom"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:93
+msgid "Pan and recenter"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:99
+msgid "Query map (select map first)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:104
+msgid "Measure lengths and areas"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:109
+msgid "Geographical position"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:121 ../gui/tcltk/gis.m/gmtool2.tcl:84
+msgid "Create new workspace file (erase current workspace settings first)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:124 ../gui/tcltk/gis.m/gmtool2.tcl:90
+msgid "Open existing workspace file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:127 ../gui/tcltk/gis.m/gmtool2.tcl:96
+msgid "Save workspace file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/tool1.tcl:130
+msgid "Print raster & vector maps using ps.map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/d.m.tcl:314 ../gui/tcltk/gis.m/gm.tcl:219
+msgid "Loading GIS Manager"
+msgstr ""
+
+#: ../gui/tcltk/d.m/d.m.tcl:404 ../gui/tcltk/gis.m/gm.tcl:266
+msgid "Done"
+msgstr ""
+
+#: ../gui/tcltk/d.m/d.m.tcl:406
+msgid "Welcome to the GRASS GIS manager"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:116 ../gui/tcltk/gis.m/thematic.tcl:261
+#: ../gui/tcltk/gis.m/vector.tcl:354
+msgid "Vector map:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:131 ../gui/tcltk/gis.m/thematic.tcl:279
+msgid "    vector type"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:150 ../gui/tcltk/d.m/vector.tcl:348
+#: ../gui/tcltk/gis.m/thematic.tcl:298
+msgid "    show attribute columns"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:156 ../gui/tcltk/d.m/vector.tcl:354
+msgid "     show data"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:157 ../gui/tcltk/d.m/vector.tcl:355
+#: ../gui/tcltk/gis.m/chart.tcl:245 ../gui/tcltk/gis.m/thematic.tcl:305
+#: ../gui/tcltk/gis.m/vector.tcl:539
+msgid "data"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:161 ../gui/tcltk/d.m/vector.tcl:359
+#: ../gui/tcltk/gis.m/chart.tcl:249 ../gui/tcltk/gis.m/thematic.tcl:309
+#: ../gui/tcltk/gis.m/vector.tcl:543
+msgid "Show data"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:168 ../gui/tcltk/gis.m/thematic.tcl:315
+msgid "Thematic map: type"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:171 ../gui/tcltk/gis.m/thematic.tcl:320
+msgid " map by"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:205 ../gui/tcltk/d.m/vector.tcl:245
+#: ../gui/tcltk/gis.m/thematic.tcl:353
+msgid "icon"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:210 ../gui/tcltk/gis.m/thematic.tcl:357
+msgid "point color"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:212 ../gui/tcltk/gis.m/thematic.tcl:359
+msgid "line color"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:230
+msgid "Graduate colors: preset color schemes"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:243 ../gui/tcltk/gis.m/thematic.tcl:391
+msgid "draw border"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:250 ../gui/tcltk/gis.m/thematic.tcl:398
+msgid "save thematic colors to GRASSRGB column of vector file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:258
+msgid "create graphic legend"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:260 ../gui/tcltk/gis.m/thematic.tcl:446
+msgid "use math notation in legend"
+msgstr ""
+
+#: ../gui/tcltk/d.m/thematic.tcl:267
+msgid "    select monitor for legend"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:75 ../gui/tcltk/gis.m/gmmenu.tcl:85
+msgid "&File"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:76
+msgid "Import"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:77 ../gui/tcltk/d.m/menu.tcl:113
+#: ../gui/tcltk/gis.m/raster.tcl:115 ../gui/tcltk/gis.m/rastnums.tcl:105
+msgid "Raster map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:78 ../gui/tcltk/d.m/menu.tcl:114
+#: ../gui/tcltk/gis.m/gmmenu.tcl:94 ../gui/tcltk/gis.m/gmmenu.tcl:133
+msgid "Multiple formats using GDAL"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:80
+msgid "Aggregate ASCII xyz data into raster grid"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:81
+msgid "ASCII GRID (includes GRASS ASCII)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:82
+msgid "Polygons and lines from ASCII file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:84
+msgid "Binary file (includes GTOPO30 format)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:85
+msgid "ESRI Arc/Info ASCII grid"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:86 ../gui/tcltk/d.m/menu.tcl:120
+msgid "GRIDATB.FOR map file (TOPMODEL)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:87 ../gui/tcltk/d.m/menu.tcl:121
+msgid "MAT-File (v.4) array (Matlab or Octave)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:88
+msgid "SPOT vegetation NDVI data sets"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:89
+msgid "SRTM hgt files"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:90
+msgid "Terra ASTER HDF files"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:92 ../gui/tcltk/gis.m/gmmenu.tcl:109
+msgid "Web Mapping Server"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:94 ../gui/tcltk/d.m/menu.tcl:134
+#: ../gui/tcltk/gis.m/thematic.tcl:133 ../gui/tcltk/gis.m/vector.tcl:222
+msgid "Vector map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:95
+msgid "Various formats using OGR"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:97
+msgid "ASCII points file or GRASS ASCII vector file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:98
+msgid "Import old GRASS vector format"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:100
+msgid "DXF file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:101
+msgid "ESRI e00 format"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:102
+msgid "Garmin GPS Waypoints/Routes/Tracks"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:103
+msgid "GPS Waypoints/Routes/Tracks  from many formats using GPSBabel"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:104
+msgid "GEOnet Name server country files (US-NGA GNS)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:105
+msgid "Matlab and MapGen files"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:107 ../gui/tcltk/d.m/menu.tcl:144
+msgid "Grid 3D"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:108 ../gui/tcltk/d.m/menu.tcl:145
+msgid "ASCII 3D file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:109 ../gui/tcltk/d.m/menu.tcl:146
+msgid "Vis5D file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:112
+msgid "Export"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:116
+msgid "ASCII grid (for GRASS, Surfer, Modflow, etc)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:117
+msgid "ASCII x,y,z values of cell centers"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:119
+msgid "ESRI ARC/INFO ASCII grid"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:123
+msgid "Binary file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:125
+msgid "MPEG-1 animations"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:126
+msgid "PNG image (not georeferenced)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:127
+msgid "PPM image (24bit)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:128
+msgid "PPM image from red, green, blue raster maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:129
+msgid "POVray height-field"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:130
+msgid "TIFF image (8/24bit)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:131
+msgid "VRML file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:132 ../gui/tcltk/d.m/menu.tcl:142
+#: ../gui/tcltk/d.m/menu.tcl:147
+msgid "VTK ASCII file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:135
+msgid "Various formats using OGR (SHAPE, MapInfo etc)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:137
+msgid "DXF file (ASCII)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:138
+msgid "ASCII vector or point file/old GRASS ASCII vector file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:139 ../gui/tcltk/gis.m/gmmenu.tcl:158
+msgid "Multiple GPS formats using GPSBabel"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:140
+msgid "POV-Ray format"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:141 ../gui/tcltk/gis.m/gmmenu.tcl:160
+msgid "SVG"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:151 ../gui/tcltk/gis.m/gmmenu.tcl:170
+msgid "Manage maps and volumes"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:152
+msgid "Copy maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:153
+msgid "List maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:154
+msgid "List maps using expressions and 'wildcards'"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:155
+msgid "Rename maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:156
+msgid "Remove maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:157
+msgid "Remove maps using expressions and 'wildcards'"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:159 ../gui/tcltk/gis.m/gmmenu.tcl:181
+msgid "Map type conversions"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:160
+msgid "Raster to vector map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:161
+msgid "Raster map series to volume"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:162
+msgid "Raster 2.5D map to volume"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:163 ../gui/tcltk/gis.m/gmmenu.tcl:186
+msgid "Vector to raster"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:164
+msgid "Vector to vector"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:165
+msgid "Vector lines to points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:166
+msgid "Vector 3D points to volume voxels"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:167
+msgid "Sites (GRASS 5.x) to vector"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:168
+msgid "Volumes to raster map series"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:171
+msgid "Groups"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:172
+msgid "New"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:172
+msgid "Create new group file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:173 ../gui/tcltk/gis.m/gmmenu.tcl:87
+msgid "Open..."
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:173
+msgid "Open group file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:174 ../gui/tcltk/gis.m/mapcanvas.tcl:925
+#: ../gui/tcltk/gis.m/gmmenu.tcl:88
+msgid "Save"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:174
+msgid "Save group file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:175 ../gui/tcltk/gis.m/gmmenu.tcl:89
+msgid "Save as..."
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:175
+msgid "Save group file as name"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:176
+msgid "Close group"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:179
+msgid "Save display to image file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:180
+msgid "XWD (Save display, selected with mouse, to map.xwd in home directory )"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:181
+msgid "Save displays to multiple graphic file formats"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:183
+msgid "Save map to Postscript file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:184
+msgid "Print to default printer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:184
+msgid "print"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:186
+msgid "E&xit"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:186
+msgid "Exit Display Manager"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:188 ../gui/tcltk/gis.m/gmmenu.tcl:208
+msgid "&Config"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:189 ../gui/tcltk/gis.m/gmmenu.tcl:209
+msgid "Region"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:190 ../gui/tcltk/gis.m/gmmenu.tcl:210
+msgid "Display region settings"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:191 ../gui/tcltk/gis.m/gmmenu.tcl:211
+msgid "Change region settings"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:192
+msgid "Zoom to maximum extent of all displayed maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:194 ../gui/tcltk/gis.m/gmmenu.tcl:213
+msgid "GRASS working environment"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:195
+msgid "Access other mapsets in current location"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:196
+msgid "Change current working session to new mapset, location, or GISDBASE"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:197
+msgid "Modify access by other users to current mapset"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:198
+msgid "Show current GRASS environment settings"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:199
+msgid "Set GRASS environment settings"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:200 ../gui/tcltk/gis.m/gmmenu.tcl:219
+msgid "Change default GUI"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:201 ../gui/tcltk/gis.m/gmmenu.tcl:220
+msgid "Show current GRASS version"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:203 ../gui/tcltk/gis.m/gmmenu.tcl:222
+#: ../gui/tcltk/gis.m/gmmenu.tcl:223
+msgid "Manage projections"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:204
+msgid "Create/edit projection information for current location"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:205
+msgid "Show projection information and create projection files"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:207
+msgid "Convert coordinates from one projection to another"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:209
+msgid "Text"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:210
+msgid "Select default text font"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:211
+msgid "Select default freetype text font"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:213
+msgid "X-monitor displays"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:214
+msgid "Configure xmonitor displays"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:215
+msgid "Configure frames for xmonitors"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:216
+msgid "Start/restart xmonitor at specified window size"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:217
+msgid "Set active xmonitor to specified size"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:218
+msgid "Display information about active xmonitor"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:221 ../gui/tcltk/gis.m/gmmenu.tcl:230
+msgid "&Raster"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:222 ../gui/tcltk/d.m/menu.tcl:381
+#: ../gui/tcltk/gis.m/gmmenu.tcl:231 ../gui/tcltk/gis.m/gmmenu.tcl:438
+msgid "Develop map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:223 ../gui/tcltk/gis.m/gmmenu.tcl:232
+msgid "Digitize raster"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:225
+msgid "Compress/decompress raster file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:226
+msgid "Manage boundary definitions"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:227
+msgid "Manage null values"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:228
+msgid "Manage timestamps for files"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:229
+msgid "Quantization for floating-point maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:231
+msgid "Resample (change resolution)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:232
+msgid "Resample using nearest neighbor method"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:233
+msgid "Resample using various interpolation methods"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:234 ../gui/tcltk/gis.m/gmmenu.tcl:245
+msgid "Resample using aggregate statistics"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:235
+msgid "Resample using regularized spline with tension method"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:238
+msgid "Support file creation and maintenance"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:240
+msgid "Reproject raster from other location"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:241
+msgid "Generate tiling for other projection"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:243 ../gui/tcltk/gis.m/gmmenu.tcl:256
+msgid "Manage map colors"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:244
+msgid "Set colors to predefined color tables"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:245
+msgid "Set colors based on standard deviations"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:246
+msgid "Set colors using color rules"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:248
+msgid "Blend 2 color maps to produce 3 RGB files"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:249
+msgid "Create color image from RGB files"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:250
+msgid ""
+"Create 3 RGB (red, green, blue) maps from 3 HIS (hue, intensity, saturation) "
+"maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:253 ../gui/tcltk/d.m/menu.tcl:409
+#: ../gui/tcltk/gis.m/gmmenu.tcl:268
+msgid "Query by coordinate(s)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:255
+msgid "Create raster buffers"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:256
+msgid "Create raster MASK"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:257
+msgid "Locate closest points between areas in 2 raster maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:258 ../gui/tcltk/gis.m/gmmenu.tcl:273
+msgid "Map calculator"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:259 ../gui/tcltk/d.m/menu.tcl:419
+#: ../gui/tcltk/gis.m/gmmenu.tcl:274
+msgid "Neighborhood analysis"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:260
+msgid "Moving window analysis of raster cells"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:261
+msgid "Analyze vector points in neighborhood of raster cells"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:263 ../gui/tcltk/d.m/menu.tcl:433
+#: ../gui/tcltk/gis.m/gmmenu.tcl:278 ../gui/tcltk/gis.m/gmmenu.tcl:504
+msgid "Overlay maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:264 ../gui/tcltk/gis.m/gmmenu.tcl:279
+msgid "Cross product"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:265
+msgid "Function of map series (time series)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:266 ../gui/tcltk/gis.m/gmmenu.tcl:281
+msgid "Patch maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:268
+msgid "Statistical calculations for cover map over base map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:270 ../gui/tcltk/gis.m/gmmenu.tcl:285
+msgid "Solar radiance and shadows"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:271
+msgid "Solar irradiance and daily irradiation"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:272
+msgid "Shadows map for sun position or date/time"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:274 ../gui/tcltk/gis.m/gmmenu.tcl:289
+msgid "Terrain analysis"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:275
+msgid "Calculate cumulative movement costs between locales"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:276 ../gui/tcltk/gis.m/gmmenu.tcl:291
+msgid "Cost surface"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:277 ../gui/tcltk/gis.m/gmmenu.tcl:292
+msgid "Least cost route or flow"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:278
+msgid "Profile analysis"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:279
+msgid "Shaded relief map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:280 ../gui/tcltk/gis.m/gmmenu.tcl:296
+msgid "Slope and aspect"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:281 ../gui/tcltk/gis.m/gmmenu.tcl:297
+msgid "Terrain parameters"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:282 ../gui/tcltk/gis.m/gmmenu.tcl:298
+msgid "Textural features"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:283
+msgid "Visibility/line of sight"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:284 ../gui/tcltk/gis.m/gmmenu.tcl:301
+msgid "Distance to features"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:286 ../gui/tcltk/gis.m/gmmenu.tcl:305
+msgid "Transform features"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:287
+msgid "Clump small areas (statistics calculated by r.volume)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:288
+msgid "Grow areas"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:289
+msgid "Thin linear features"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:292 ../gui/tcltk/gis.m/gmmenu.tcl:311
+msgid "Hydrologic modeling"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:293
+msgid "Carve stream channels into elevation map using vector streams map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:294
+msgid "Depressionless elevation map and flowline map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:295
+msgid "Fill lake from seed point to specified level"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:296
+msgid "Flow accumulation for massive grids"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:297
+msgid "Generate flow lines for raster map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:298 ../gui/tcltk/gis.m/gmmenu.tcl:321
+msgid "SIMWE overland flow modeling"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:299
+msgid "SIMWE sediment erosion, transport, & deposition modeling"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:300 ../gui/tcltk/gis.m/gmmenu.tcl:324
+msgid "Topographic index map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:301 ../gui/tcltk/gis.m/gmmenu.tcl:325
+msgid "TOPMODEL simulation"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:302 ../gui/tcltk/gis.m/gmmenu.tcl:327
+msgid "Watershed subbasins"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:303 ../gui/tcltk/gis.m/gmmenu.tcl:328
+msgid "Watershed analysis"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:304 ../gui/tcltk/gis.m/gmmenu.tcl:329
+msgid "Watershed basin creation"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:306 ../gui/tcltk/gis.m/gmmenu.tcl:331
+msgid "Landscape structure modeling"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:307 ../gui/tcltk/gis.m/gmmenu.tcl:347
+msgid "Set up sampling and analysis framework"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:309
+msgid "Analyze landscape characteristics"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:310
+msgid "Analyze landscape patch characteristics"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:311
+msgid "Output landscape patch information"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:313 ../gui/tcltk/gis.m/gmmenu.tcl:366
+msgid "Wildfire modeling"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:314
+msgid "Generate rate of spread (ROS) maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:315
+msgid "Generate least-cost spread paths"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:316
+msgid "Simulate anisotropic spread phenomena"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:319 ../gui/tcltk/gis.m/gmmenu.tcl:372
+msgid "Change category values and labels"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:320
+msgid "Edit category values of individual cells for displayed raster map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:323
+msgid "Reclassify categories for areas of specified sizes"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:324
+msgid "Reclassify categories using rules"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:325
+msgid "Reclassify categories using rules file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:327
+msgid "Recode categories using rules (create new map)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:328
+msgid "Recode categories using rules file (create new map)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:330
+msgid "Rescale categories (create new map)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:331
+msgid "Rescale categories with equalized histogram (create new map)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:334
+msgid "Generate concentric circles around points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:335
+msgid "Generate random raster cells"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:336 ../gui/tcltk/gis.m/gmmenu.tcl:387
+msgid "Generate random cells"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:337
+msgid "Generate random cells and vector points from raster map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:339 ../gui/tcltk/gis.m/gmmenu.tcl:391
+msgid "Generate surfaces"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:340
+msgid "Generate density surface using moving Gausian kernal"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:341
+msgid "Generate fractal surface"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:342
+msgid "Generate gaussian deviates surface"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:343
+msgid "Generate plane"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:344
+msgid "Generate random deviates surface"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:345
+msgid "Generate random surface with spatial dependence"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:347
+msgid "Generate vector contour lines"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:348 ../gui/tcltk/gis.m/gmmenu.tcl:403
+msgid "Interpolate surfaces"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:349
+msgid "Bilinear interpolation from raster points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:350
+msgid "Inverse distance weighted interpolation from raster points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:351
+msgid "Interpolation from raster contours"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:353
+msgid "Inverse distance weighted interpolation from vector points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:354
+msgid "Regularized spline tension interpolation from vector points or contours"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:356
+msgid "Fill NULL cells by interpolation using regularized spline tension"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:359 ../gui/tcltk/d.m/menu.tcl:465
+#: ../gui/tcltk/d.m/menu.tcl:521 ../gui/tcltk/gis.m/gmmenu.tcl:416
+#: ../gui/tcltk/gis.m/gmmenu.tcl:539 ../gui/tcltk/gis.m/gmmenu.tcl:598
+msgid "Reports and statistics"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:360 ../gui/tcltk/d.m/menu.tcl:522
+#: ../gui/tcltk/gis.m/gmmenu.tcl:417
+msgid "Report basic file information"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:361
+msgid "Manage category labels and values"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:363 ../gui/tcltk/gis.m/gmmenu.tcl:420
+#: ../gui/tcltk/gis.m/gmmenu.tcl:616
+msgid "General statistics"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:364
+msgid "Range of all category values"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:365
+msgid "Sum all cell category values"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:366 ../gui/tcltk/gis.m/gmmenu.tcl:424
+msgid "Sum area by map and category"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:367
+msgid "Summary statistics for clumped cells (works with r.clump)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:368 ../gui/tcltk/gis.m/gmmenu.tcl:426
+msgid "Total surface area corrected for topography"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:369 ../gui/tcltk/d.m/menu.tcl:469
+#: ../gui/tcltk/gis.m/gmmenu.tcl:427 ../gui/tcltk/gis.m/gmmenu.tcl:617
+#: ../gui/tcltk/gis.m/gmmenu.tcl:655
+msgid "Univariate statistics"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:370
+msgid "Univariate statistics (script version)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:372
+msgid "Sample values along transects"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:373
+msgid "Sample values along transects (use azimuth, distance)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:375 ../gui/tcltk/gis.m/gmmenu.tcl:432
+msgid "Covariance/correlation"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:376
+msgid "Linear regression between 2 maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:377
+msgid "Mutual category occurences (coincidence)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:380 ../gui/tcltk/gis.m/gmmenu.tcl:437
+msgid "&Vector"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:382 ../gui/tcltk/gis.m/gmmenu.tcl:439
+msgid "Digitize"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:384 ../gui/tcltk/gis.m/gmmenu.tcl:442
+msgid "Create/rebuild topology"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:385
+msgid "Clean vector files"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:386
+msgid "Add missing centroids"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:388
+msgid "Build polylines from adjacent segments"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:389
+msgid "Split polylines into segments"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:390
+msgid "Create lines parallel to existing lines"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:391
+msgid "Dissolve common boundaries"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:393
+msgid "Convert vector feature types"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:394
+msgid "Convert 2D vector to 3D by sampling raster"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:395
+msgid "Extrude 2D vector into 3D vector"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:397
+msgid "Create text label file for vector features"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:398
+msgid "Assign colors from a numeric attribute column"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:400
+msgid "Reproject vector from other location"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:402 ../gui/tcltk/gis.m/gmmenu.tcl:649
+msgid "Vector<->database connections"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:403
+msgid "Create new vector as link to external OGR layer"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:404
+msgid "Set database connection for vector attributes"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:406
+msgid "Rectify and georeference vector map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:408
+msgid "Query by attributes"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:410
+msgid "Query by map features"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:412
+msgid "Create vector buffers"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:413
+msgid "Linear referencing for vectors"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:414
+msgid "Create linear reference system"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:415
+msgid "Create stationing from imput lines, and linear reference system"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:416
+msgid ""
+"Create points/segments from input lines, linear reference system and "
+"positions read from stdin"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:417
+msgid ""
+"Find line id and real km+offset for given points in vector map using linear "
+"reference system"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:420
+msgid "Locate nearest features to points or centroids"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:421
+msgid "Generate Thiessen polygons around points (Voronoi diagram)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:422
+msgid "Connect points to create Delaunay triangles"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:424 ../gui/tcltk/gis.m/gmmenu.tcl:490
+msgid "Network analysis"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:425 ../gui/tcltk/gis.m/gmmenu.tcl:491
+msgid "Allocate subnets"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:426 ../gui/tcltk/gis.m/gmmenu.tcl:492
+msgid "Network maintenance"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:427 ../gui/tcltk/gis.m/gmmenu.tcl:494
+msgid "Shortest route"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:428
+msgid "Shortest route (visualization only)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:429
+msgid "Split net to bands between cost isolines"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:430 ../gui/tcltk/gis.m/gmmenu.tcl:501
+msgid "Steiner tree"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:431 ../gui/tcltk/gis.m/gmmenu.tcl:502
+msgid "Traveling salesman analysis"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:434
+msgid "Overlay/combine 2 vector maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:435
+msgid "Patch multiple maps (combine)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:437
+msgid "Generate area feature for extent of current region"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:438
+msgid "Generate rectangular vector grid"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:440 ../gui/tcltk/gis.m/gmmenu.tcl:509
+msgid "Change attributes"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:441
+msgid "Attach, delete, or report categories"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:442
+msgid "Reclassify features using rules file"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:445
+msgid "Work with vector points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:446 ../gui/tcltk/gis.m/gmmenu.tcl:522
+msgid "Generate points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:447
+msgid "Generate points from database with x/y coordinates"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:448 ../gui/tcltk/gis.m/gmmenu.tcl:525
+msgid "Generate random points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:449
+msgid "Random location perturbations of points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:451 ../gui/tcltk/gis.m/gmmenu.tcl:516
+msgid "Generate areas from points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:452
+msgid "Generate convex hull for point set"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:453
+msgid "Generate Delaunay triangles for point set"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:454
+msgid "Generate Voronoi diagram/Thiessen polygons for point set"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:456
+msgid "Sample raster maps"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:457
+msgid "Calculate statistics for raster map overlain by vector map"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:458 ../gui/tcltk/gis.m/gmmenu.tcl:535
+msgid "Sample raster map at point locations"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:459 ../gui/tcltk/gis.m/gmmenu.tcl:536
+msgid "Sample raster neighborhood around points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:461
+msgid "Partition points into test/training sets for k-fold cross validatation"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:462
+msgid "Transfer attribute data from queried vector map to points"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:466 ../gui/tcltk/gis.m/gmmenu.tcl:540
+#: ../gui/tcltk/gis.m/gmmenu.tcl:615
+msgid "Basic information"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:467
+msgid "Load vector attributes to database or create reports"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:468
+msgid "Report areas for vector attribute categories"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:471
+msgid "Test normality of point distribution"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:472
+msgid "Calculate stats for raster map underlying vector objects"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:473
+msgid "Indices of point counts in quadrats"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:476 ../gui/tcltk/gis.m/gmmenu.tcl:552
+msgid "&Imagery"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:477 ../gui/tcltk/gis.m/gmmenu.tcl:553
+msgid "Develop images and groups"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:478
+msgid "Create/edit imagery group"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:479
+msgid "Target imagery group"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:481
+msgid "Mosaic up to 4 adjacent images"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:483 ../gui/tcltk/gis.m/gmmenu.tcl:559
+msgid "Manage image colors"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:484
+msgid ""
+"Color balance and enhance color tables of multiband imagery for rgb display"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:485
+msgid ""
+"Transform HIS (Hue/Intensity/Saturation) color image to RGB (Red/Green/Blue)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:486
+msgid ""
+"Transform RGB (Red/Green/Blue) color image to HIS (Hue/Intensity/Saturation)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:488
+msgid "Rectify and georeference image group"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:489
+msgid "Set ground control points (GCP's) from raster map or keyboard entry"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:491
+msgid "Set ground control points (GCP's) from vector map or keyboard entry"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:493
+msgid "Affine and Polynomial rectification (rubber sheet)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:494 ../gui/tcltk/gis.m/gmmenu.tcl:564
+msgid "Ortho photo rectification"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:497
+msgid "Brovey transformation and pan sharpening"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:498 ../gui/tcltk/gis.m/gmmenu.tcl:571
+msgid "Classify image"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:499 ../gui/tcltk/gis.m/gmmenu.tcl:572
+msgid "Clustering input for unsupervised classification"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:501 ../gui/tcltk/gis.m/gmmenu.tcl:574
+msgid "Maximum likelihood classification (MLC)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:502 ../gui/tcltk/gis.m/gmmenu.tcl:575
+msgid "Sequential maximum a posteriory classification (SMAP)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:504 ../gui/tcltk/gis.m/gmmenu.tcl:577
+msgid "Interactive input for supervised classification"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:505
+msgid "Non-interactive input for supervised classification (MLC)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:506
+msgid "Non-interactive input for supervised classification (SMAP)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:508 ../gui/tcltk/gis.m/gmmenu.tcl:585
+msgid "Filter image"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:509
+msgid "Zero edge crossing detection"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:510
+msgid "User defined matrix/convolving filter"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:512 ../gui/tcltk/gis.m/gmmenu.tcl:589
+msgid "Spectral response"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:513 ../gui/tcltk/gis.m/gmmenu.tcl:590
+msgid "Tassled cap vegetation index"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:514 ../gui/tcltk/gis.m/gmmenu.tcl:591
+msgid "Transform image"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:515
+msgid "Canonical component"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:516
+msgid "Principal component"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:517
+msgid "Fast Fourier Transform"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:518
+msgid "Inverse Fast Fourier Transform"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:523
+msgid "Range of image values"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:525
+msgid "Bit pattern comparison for ID of low quality pixels"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:526
+msgid "Kappa classification accuracy assessment"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:527
+msgid "Optimum index factor for LandSat TM"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:530
+msgid "&Grid3D"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:531 ../gui/tcltk/gis.m/gmmenu.tcl:605
+msgid "Develop grid3D volumes"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:532 ../gui/tcltk/gis.m/gmmenu.tcl:606
+msgid "Manage nulls for grid3D volume"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:533 ../gui/tcltk/gis.m/gmmenu.tcl:607
+msgid "Manage timestamp for grid3D volume"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:535
+msgid "Create 3D mask for grid3D operations"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:536
+msgid "Create 2D raster cross section from grid3d volume"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:537
+msgid "Map calculator for grid3D operations"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:538
+msgid "Interpolate volume from vector points using splines"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:539 ../gui/tcltk/gis.m/gmmenu.tcl:614
+#: ../gui/tcltk/gis.m/gmmenu.tcl:654
+msgid "Report and Statistics"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:540
+msgid "Display information about grid3D volume"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:543 ../gui/tcltk/gis.m/gmmenu.tcl:620
+msgid "&Databases"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:544 ../gui/tcltk/gis.m/gmmenu.tcl:628
+msgid "Manage database"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:545 ../gui/tcltk/gis.m/gmmenu.tcl:629
+msgid "Connect to database"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:546 ../gui/tcltk/gis.m/gmmenu.tcl:630
+msgid "Login to database"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:548 ../gui/tcltk/gis.m/gmmenu.tcl:632
+msgid "Copy table"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:549
+msgid "Add columns to table"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:550
+msgid "Change values in a column"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:551 ../gui/tcltk/gis.m/gmmenu.tcl:641
+msgid "Test database"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:553 ../gui/tcltk/gis.m/gmmenu.tcl:621
+msgid "Database information"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:554 ../gui/tcltk/gis.m/gmmenu.tcl:622
+msgid "Describe table"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:555 ../gui/tcltk/gis.m/gmmenu.tcl:623
+msgid "List columns"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:556 ../gui/tcltk/gis.m/gmmenu.tcl:624
+msgid "List drivers"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:557 ../gui/tcltk/gis.m/gmmenu.tcl:625
+msgid "List tables"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:560 ../gui/tcltk/gis.m/mapcanvas.tcl:2195
+#: ../gui/tcltk/gis.m/gmmenu.tcl:644 ../gui/tcltk/gis.m/maptool.tcl:229
+msgid "Query"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:561
+msgid "Query data (SQL select)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:562
+msgid "Execute SQL statement"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:565 ../gui/tcltk/gis.m/gmmenu.tcl:658
+msgid "&Help"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:566 ../gui/tcltk/gis.m/gmmenu.tcl:659
+msgid "GRASS help"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:567 ../gui/tcltk/gis.m/gmmenu.tcl:660
+msgid "GIS Manager &help"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:567 ../gui/tcltk/gis.m/gmmenu.tcl:660
+msgid "GIS Manager help"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:568 ../gui/tcltk/gis.m/gmmenu.tcl:661
+msgid "About &GRASS"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:568 ../gui/tcltk/gis.m/gmmenu.tcl:661
+msgid "About GRASS"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:569 ../gui/tcltk/gis.m/gmmenu.tcl:662
+msgid "About &System"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:569 ../gui/tcltk/gis.m/gmmenu.tcl:662
+msgid "About System"
+msgstr ""
+
+#: ../gui/tcltk/d.m/menu.tcl:577 ../gui/tcltk/gis.m/gmmenu.tcl:670
+msgid "&Xtns"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:197
+msgid "Vector name:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:212
+msgid "Display:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:213
+msgid "shapes"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:215
+msgid "categories"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:217
+msgid "topology"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:219
+msgid "line directions"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:226
+msgid "            "
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:237
+msgid "faces"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:259 ../gui/tcltk/gis.m/vector.tcl:433
+msgid "Draw lines:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:262 ../gui/tcltk/d.m/vector.tcl:278
+#: ../gui/tcltk/d.m/vector.tcl:294
+msgid "color"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:275 ../gui/tcltk/gis.m/vector.tcl:449
+msgid "Fill areas:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:281
+msgid "  "
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:282
+msgid "random colors"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:284 ../gui/tcltk/gis.m/vector.tcl:458
+msgid "GRASSRGB column colors"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:291 ../gui/tcltk/gis.m/vector.tcl:465
+msgid "Label vectors:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:292 ../gui/tcltk/gis.m/vector.tcl:466
+msgid "label"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:297
+msgid " size"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:299 ../gui/tcltk/gis.m/vector.tcl:473
+msgid "text size"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:301
+msgid " align with pt"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:315
+msgid "     layer for labels"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:318
+msgid " attribute col for labels"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:326
+msgid "Query vectors: "
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:327 ../gui/tcltk/gis.m/vector.tcl:505
+msgid "layer for query"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:330
+msgid " query cat values"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:333
+msgid "SQL query"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:340
+msgid "     SQL where statement"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:366
+msgid "Mouse query setup:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:367
+msgid "edit attributes (form mode)"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:369
+msgid "results as text in terminal"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:376 ../gui/tcltk/gis.m/vector.tcl:571
+msgid "Display when avg. region dimension is"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:386
+msgid "Line width for ps.map print output:"
+msgstr ""
+
+#: ../gui/tcltk/d.m/vector.tcl:388
+msgid "Line width used for printing"
+msgstr ""
+
+#: ../gui/tcltk/d.m/rgbhis.tcl:96
+msgid "red (RGB) or hue (HIS):"
+msgstr ""
+
+#: ../gui/tcltk/d.m/rgbhis.tcl:107
+msgid "green (RGB) or intensity (HIS):"
+msgstr ""
+
+#: ../gui/tcltk/d.m/rgbhis.tcl:118
+msgid "blue (RGB) or saturation (HIS):"
+msgstr ""
+
+#: ../gui/tcltk/d.m/rgbhis.tcl:128 ../gui/tcltk/gis.m/rgbhis.tcl:155
+msgid "display maps as RGB"
+msgstr ""
+
+#: ../gui/tcltk/d.m/rgbhis.tcl:134 ../gui/tcltk/gis.m/rgbhis.tcl:160
+msgid "Help for RGB"
+msgstr ""
+
+#: ../gui/tcltk/d.m/rgbhis.tcl:135 ../gui/tcltk/gis.m/rgbhis.tcl:164
+msgid "display maps as HIS"
+msgstr ""
+
+#: ../gui/tcltk/d.m/rgbhis.tcl:141 ../gui/tcltk/gis.m/rgbhis.tcl:169
+msgid "Help for HIS"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:285
+msgid ""
+"There is no raster group file (REF). You must select the 'create/edit group' "
+"option to create a group file."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:307
+msgid ""
+"There is no vector group file (VREF). You must select the 'create/edit "
+"group' option to create a group file."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:388
+msgid "Select mapset of raster to georectify"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:409 ../gui/tcltk/gis.m/barscale.tcl:91
+#: ../gui/tcltk/gis.m/barscale.tcl:401 ../gui/tcltk/gis.m/chart.tcl:91
+#: ../gui/tcltk/gis.m/chart.tcl:468 ../gui/tcltk/gis.m/labels.tcl:78
+#: ../gui/tcltk/gis.m/labels.tcl:279 ../gui/tcltk/gis.m/mapcanvas.tcl:228
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:238 ../gui/tcltk/gis.m/rules.tcl:207
+#: ../gui/tcltk/gis.m/mapprint.tcl:197 ../gui/tcltk/gis.m/mapprint.tcl:204
+#: ../gui/tcltk/gis.m/frames.tcl:78 ../gui/tcltk/gis.m/frames.tcl:275
+#: ../gui/tcltk/gis.m/raster.tcl:87 ../gui/tcltk/gis.m/raster.tcl:480
+#: ../gui/tcltk/gis.m/legend.tcl:95 ../gui/tcltk/gis.m/legend.tcl:505
+#: ../gui/tcltk/gis.m/gridline.tcl:103 ../gui/tcltk/gis.m/gridline.tcl:416
+#: ../gui/tcltk/gis.m/histogram.tcl:85 ../gui/tcltk/gis.m/histogram.tcl:370
+#: ../gui/tcltk/gis.m/rastarrows.tcl:88 ../gui/tcltk/gis.m/rastarrows.tcl:372
+#: ../gui/tcltk/gis.m/cmd.tcl:75 ../gui/tcltk/gis.m/cmd.tcl:206
+#: ../gui/tcltk/gis.m/dtext.tcl:94 ../gui/tcltk/gis.m/dtext.tcl:407
+#: ../gui/tcltk/gis.m/animate.tcl:91 ../gui/tcltk/gis.m/thematic.tcl:111
+#: ../gui/tcltk/gis.m/thematic.tcl:640 ../gui/tcltk/gis.m/thematic.tcl:713
+#: ../gui/tcltk/gis.m/rastnums.tcl:81 ../gui/tcltk/gis.m/rastnums.tcl:375
+#: ../gui/tcltk/gis.m/vector.tcl:196 ../gui/tcltk/gis.m/vector.tcl:876
+#: ../gui/tcltk/gis.m/rgbhis.tcl:83 ../gui/tcltk/gis.m/rgbhis.tcl:362
+msgid "Error creating tempfile"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:436
+msgid "Create a group REF file and directory for vectors"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:449
+msgid "Create/replace vector group"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:475
+msgid "group name"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:477
+msgid "Select existing vector group or name new group"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:487
+msgid "vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:489
+msgid "Select xy vector(s) for group"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:499
+msgid "Vector group"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:616
+msgid "GRASS Georectifier"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:627
+msgid "Set up environment for georectifying rasters or vectors"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:636
+msgid "Georeference raster"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:640
+msgid "Georeference vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:647
+msgid "1. Select mapset"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:649
+msgid "Mapset of xy raster group"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:659
+msgid "2. Create/edit group"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:661
+msgid "Create/edit group (rasters or vectors to georectify)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:669
+msgid "3. Select group"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:671
+msgid "Select existing group to georectify"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:681
+msgid "4. Select map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:683
+msgid ""
+"Select non-georectified raster or vector to display for marking ground "
+"control points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:693
+msgid "5. Start georectifying"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:695
+msgid "Start georectifying"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:705
+msgid "Cancel georectification"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:802
+msgid "Displaying xy map to be georectified"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1010
+msgid "Select rectification method for rasters"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1013
+msgid "1st order"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1014
+msgid "affine transformation  (rasters & vectors). Requires 3+ GCPs."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1019
+msgid "2nd order"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1020
+msgid "polynomial transformation  (rasters only). Requires 6+ GCPs."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1024
+msgid "3rd order"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1025
+msgid "polynomial transformation  (rasters only). Requires 10+ GCPs."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1028
+msgid "Clip map/image to target region"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1038
+msgid "Use"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1040
+msgid "xy coordinates"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1042
+msgid "geographic coordinates"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1044
+msgid "forward error"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1046
+msgid "backward error"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1087
+msgid "Manage ground control points (GCPs)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1112
+msgid "Save GCPs to POINTS file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1119
+msgid "Clear all unchecked GCP entries"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1126
+msgid "Calculate RMS error"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1133
+msgid "Rectify maps in group"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1136
+msgid "Quit"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1140
+msgid "Exit georectifier"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1323
+msgid ""
+"There is no POINTS file of ground control points for group. You must create "
+"ground control points before georectifying map."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1353
+msgid ""
+"Insufficient ground control points for georectification method. You need at "
+"least 3 points for 1st order, 6 points for 2nd order and 10 points for 3rd "
+"order."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1384
+msgid ""
+"No valid ground control points in GCP file. You must create valid ground "
+"control points before georectifying map."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1587
+msgid "Error setting region"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:1596
+msgid "Please wait..."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:2029 ../gui/tcltk/gis.m/mapcanvas.tcl:1503
+msgid "Drag or click mouse to zoom"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:2031 ../gui/tcltk/gis.m/mapcanvas.tcl:1505
+msgid "Drag or click mouse to unzoom"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georect.tcl:2229 ../gui/tcltk/gis.m/mapcanvas.tcl:1808
+msgid "Drag with mouse to pan"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:153
+msgid "Display scale and north arrow"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:160 ../gui/tcltk/gis.m/chart.tcl:192
+#: ../gui/tcltk/gis.m/labels.tcl:118 ../gui/tcltk/gis.m/raster.tcl:185
+#: ../gui/tcltk/gis.m/legend.tcl:200 ../gui/tcltk/gis.m/gridline.tcl:151
+#: ../gui/tcltk/gis.m/histogram.tcl:146 ../gui/tcltk/gis.m/rastarrows.tcl:152
+#: ../gui/tcltk/gis.m/cmd.tcl:105 ../gui/tcltk/gis.m/dtext.tcl:168
+#: ../gui/tcltk/gis.m/thematic.tcl:251 ../gui/tcltk/gis.m/rastnums.tcl:148
+#: ../gui/tcltk/gis.m/vector.tcl:344 ../gui/tcltk/gis.m/rgbhis.tcl:143
+msgid "Opaque "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:164 ../gui/tcltk/gis.m/chart.tcl:196
+#: ../gui/tcltk/gis.m/labels.tcl:122 ../gui/tcltk/gis.m/raster.tcl:189
+#: ../gui/tcltk/gis.m/legend.tcl:204 ../gui/tcltk/gis.m/gridline.tcl:155
+#: ../gui/tcltk/gis.m/histogram.tcl:150 ../gui/tcltk/gis.m/rastarrows.tcl:156
+#: ../gui/tcltk/gis.m/cmd.tcl:109 ../gui/tcltk/gis.m/dtext.tcl:172
+#: ../gui/tcltk/gis.m/thematic.tcl:255 ../gui/tcltk/gis.m/rastnums.tcl:152
+#: ../gui/tcltk/gis.m/rgbhis.tcl:147
+msgid " Transparent"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:170
+#, tcl-format
+msgid "Scale placement: 0-100% from top left of display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:176
+msgid "\t enter x,y of scale/arrow upper left corner"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:179
+msgid "    "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:190
+msgid "\t "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:191 ../gui/tcltk/gis.m/maptext.tcl:154
+#: ../gui/tcltk/gis.m/legend.tcl:238 ../gui/tcltk/gis.m/dtext.tcl:201
+msgid "place with mouse"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:199
+msgid "Scale appearance:  text color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:201
+msgid "  font "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:204 ../gui/tcltk/gis.m/maptext.tcl:186
+#: ../gui/tcltk/gis.m/legend.tcl:265 ../gui/tcltk/gis.m/gridline.tcl:191
+#: ../gui/tcltk/gis.m/histogram.tcl:179 ../gui/tcltk/gis.m/dtext.tcl:232
+#: ../gui/tcltk/gis.m/rastnums.tcl:184
+msgid "select font for text"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:211
+msgid "\tbackground color "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:214 ../gui/tcltk/gis.m/histogram.tcl:191
+msgid "transparent background"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:222
+msgid "display N. arrow only"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/barscale.tcl:240
+msgid "line scale instead of bar"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:113
+msgid "Vector map for chart"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:116
+#, tcl-format
+msgid "chart for %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:130 ../gui/tcltk/gis.m/chart.tcl:151
+#: ../gui/tcltk/gis.m/raster.tcl:145 ../gui/tcltk/gis.m/raster.tcl:161
+#: ../gui/tcltk/gis.m/thematic.tcl:173 ../gui/tcltk/gis.m/thematic.tcl:194
+#: ../gui/tcltk/gis.m/vector.tcl:247 ../gui/tcltk/gis.m/vector.tcl:269
+#: ../gui/tcltk/gis.m/vector.tcl:302
+msgid "This action requires map name to be set"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:136 ../gui/tcltk/gis.m/chart.tcl:157
+#: ../gui/tcltk/gis.m/thematic.tcl:179 ../gui/tcltk/gis.m/thematic.tcl:200
+#: ../gui/tcltk/gis.m/vector.tcl:253 ../gui/tcltk/gis.m/vector.tcl:275
+#: ../gui/tcltk/gis.m/vector.tcl:308
+msgid "You must provide valid vector layer number"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:185
+msgid ""
+"Display pie and bar charts of attribute values at vector object locations"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:205
+msgid "vector map to chart"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:231
+msgid "Attributes to chart: attribute layer"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:238
+msgid "     show attribute columns"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:244
+msgid "   show attribute data"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:255
+msgid "\tcolumns to chart (col1,col2,...)  "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:262
+msgid "\tcolors for columns (clr1,clr2,...)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:269
+msgid "\tcolumn for variable chart size"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:271
+msgid "  scale factor"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:280 ../gui/tcltk/gis.m/histogram.tcl:175
+msgid "pie"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:280 ../gui/tcltk/gis.m/histogram.tcl:175
+msgid "bar"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:281
+msgid "\tfixed chart size (if size column not used)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:288
+msgid "\tchart outline color:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292
+msgid "none"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "white"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "grey"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "gray"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "black"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "brown"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "red"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "orange"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "yellow"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "green"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "aqua"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "cyan"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "indigo"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "blue"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "purple"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "violet"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/chart.tcl:292 ../gui/tcltk/gis.m/raster.tcl:273
+#: ../gui/tcltk/gis.m/legend.tcl:262 ../gui/tcltk/gis.m/gridline.tcl:227
+#: ../gui/tcltk/gis.m/gridline.tcl:233 ../gui/tcltk/gis.m/gridline.tcl:258
+#: ../gui/tcltk/gis.m/rastarrows.tcl:201 ../gui/tcltk/gis.m/rastarrows.tcl:208
+#: ../gui/tcltk/gis.m/rastarrows.tcl:220 ../gui/tcltk/gis.m/rastarrows.tcl:227
+#: ../gui/tcltk/gis.m/rastnums.tcl:179 ../gui/tcltk/gis.m/rastnums.tcl:196
+msgid "magenta"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:83 ../gui/tcltk/gis.m/maplabels.tcl:140
+#: ../gui/tcltk/gis.m/thematic.tcl:145 ../gui/tcltk/gis.m/thematic.tcl:152
+#: ../gui/tcltk/gis.m/thematic.tcl:158
+msgid "This is font sample text."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:83 ../gui/tcltk/gis.m/maplabels.tcl:140
+msgid "Select label font"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:129
+msgid ""
+"Create postscript text object (for postscript eps, pdf, and print output "
+"only)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:136
+msgid "Text to display:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:143 ../gui/tcltk/gis.m/dtext.tcl:190
+msgid "Text placement: x,y coordinates (from upper left) "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:150 ../gui/tcltk/gis.m/dtext.tcl:196
+msgid "     coordinate type for text placement "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:153 ../gui/tcltk/gis.m/dtext.tcl:199
+msgid "pixels"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:153 ../gui/tcltk/gis.m/dtext.tcl:199
+msgid "percent"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:153 ../gui/tcltk/gis.m/dtext.tcl:199
+msgid "geographic"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:162 ../gui/tcltk/gis.m/dtext.tcl:209
+msgid "     align text with coordinate point  "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:166 ../gui/tcltk/gis.m/maplabels.tcl:200
+#: ../gui/tcltk/gis.m/dtext.tcl:213
+msgid "lower left"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:166 ../gui/tcltk/gis.m/dtext.tcl:213
+msgid "bottom center"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:166 ../gui/tcltk/gis.m/maplabels.tcl:200
+#: ../gui/tcltk/gis.m/dtext.tcl:213
+msgid "lower right"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:166 ../gui/tcltk/gis.m/maplabels.tcl:200
+#: ../gui/tcltk/gis.m/dtext.tcl:213
+msgid "center left"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:166 ../gui/tcltk/gis.m/maptext.tcl:175
+#: ../gui/tcltk/gis.m/maplabels.tcl:200 ../gui/tcltk/gis.m/maplabels.tcl:221
+#: ../gui/tcltk/gis.m/dtext.tcl:213 ../gui/tcltk/gis.m/vector.tcl:483
+#: ../gui/tcltk/gis.m/vector.tcl:488
+msgid "center"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:166 ../gui/tcltk/gis.m/maplabels.tcl:200
+#: ../gui/tcltk/gis.m/dtext.tcl:213
+msgid "center right"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:166 ../gui/tcltk/gis.m/maplabels.tcl:200
+#: ../gui/tcltk/gis.m/dtext.tcl:213
+msgid "upper left"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:166 ../gui/tcltk/gis.m/dtext.tcl:213
+msgid "top center"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:166 ../gui/tcltk/gis.m/maplabels.tcl:200
+#: ../gui/tcltk/gis.m/dtext.tcl:213
+msgid "upper right"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:172
+msgid "     justification"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:175 ../gui/tcltk/gis.m/maplabels.tcl:221
+#: ../gui/tcltk/gis.m/vector.tcl:483
+msgid "left"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:175 ../gui/tcltk/gis.m/maplabels.tcl:221
+#: ../gui/tcltk/gis.m/vector.tcl:483
+msgid "right"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptext.tcl:176
+msgid "  line width"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/labels.tcl:96
+msgid "Labels for vectors"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/labels.tcl:111
+msgid "Display labels for vector objects (created with v.label)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/labels.tcl:128 ../gui/tcltk/gis.m/maplabels.tcl:177
+msgid "Labels file:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/labels.tcl:131 ../gui/tcltk/gis.m/maplabels.tcl:180
+msgid "labels file to display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/labels.tcl:147
+msgid "min"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/labels.tcl:149
+msgid "max"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/labels.tcl:164 ../gui/tcltk/gis.m/maplabels.tcl:281
+msgid "Launch v.label to create labels file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/labels.tcl:165 ../gui/tcltk/gis.m/maplabels.tcl:282
+msgid "v.label"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/tksys.tcl:57
+msgid ""
+"\n"
+"***** Please wait *****"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/tksys.tcl:58
+msgid "Gathering information about your system"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/tksys.tcl:230
+msgid "***** Done *****"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:127
+msgid "Label file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:163
+msgid "Create postscript labels for vector objects from v.labels file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:170
+msgid "  (for postscript eps, pdf, and print output only)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:189
+msgid "Override offset, alignment, and color settings in v.labels file: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:196
+msgid "Align label with vector object: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:200
+msgid "lower center"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:200
+msgid "upper center"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:206
+msgid "Offset label from vector object: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:207
+msgid "x offset"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:210
+msgid "y offset"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:218
+msgid "Justification: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:222
+msgid " Label line max length: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:229
+msgid "Enclose label in box: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:231
+msgid "Draw label background: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:233
+msgid "Background color:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:240
+msgid "Draw box outline: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:242
+msgid "Border width:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:245
+msgid "Border color:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:252
+msgid "Distance between label and enclosing box. Horizontal: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:255
+msgid " Vertical: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:263
+msgid "Font"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:266
+msgid "select font for label"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:268
+msgid "family:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:271
+msgid "size:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maplabels.tcl:329
+msgid "Could not open labels file "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:493 ../gui/tcltk/gis.m/profile.tcl:412
+msgid "g.proj or projection error"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:584
+msgid "Maximum zoom-in reached"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:660
+msgid "Error setting region 1"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:669
+msgid "please wait..."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:826 ../gui/tcltk/gis.m/mapcanvas.tcl:2149
+msgid "You have to select map layer first"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:827 ../gui/tcltk/gis.m/mapcanvas.tcl:2150
+msgid "No map layer selected"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:899
+msgid "Save Region"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:902
+msgid "Save current display geometry to named region"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:908
+msgid "Enter region name"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:943
+#, tcl-format
+msgid ""
+"Region file %s already exists. \n"
+"Do you want to overwrite it?"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:1296
+#, tcl-format
+msgid "Display: rows=%d  cols=%d  N-S res=%s  E-W res=%s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:1299
+#, tcl-format
+msgid "Display: rows=%d  cols=%d  N-S res=%g  E-W res=%g"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:1374
+msgid "Error setting region (Problem with g.region?)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:1440 ../gui/tcltk/gis.m/mapcanvas.tcl:1445
+msgid "Error reading current resolution with g.region"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:1477
+msgid "Error setting region 2"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:1940
+msgid "Measurement"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:1965
+msgid "Draw measure line with mouse"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:2120
+msgid "Click to query feature"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:2188
+msgid "This layer type does not support queries"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:2189
+msgid "Query not supported"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapcanvas.tcl:2196
+msgid "You must select a map to query\n"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rules.tcl:35 ../gui/tcltk/gis.m/dnviz.tcl:49
+msgid "Select input map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rules.tcl:97
+msgid "Interactive rules entry"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rules.tcl:147 ../gui/tcltk/gis.m/dnviz.tcl:219
+msgid "Overwrite existing file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rules.tcl:174 ../gui/tcltk/gis.m/dnviz.tcl:232
+#: ../gui/tcltk/gis.m/animate.tcl:540
+msgid "Apply"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rules.tcl:194 ../gui/tcltk/gis.m/dnviz.tcl:359
+msgid "You must select an input map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rules.tcl:194 ../gui/tcltk/gis.m/dnviz.tcl:360
+msgid "No input map selected"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rules.tcl:199
+msgid "You must specify an output map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rules.tcl:199
+msgid "No output map specified"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rules.tcl:221
+msgid "Error creating rules file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:112
+msgid "Ghostscript not available"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:254
+msgid "Postscript and LPR printing of map display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:268
+msgid "Preset paper type"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:272
+msgid "letter"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:272
+msgid "A4"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:272
+msgid "legal"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:272
+msgid "11x17"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:272
+msgid "A3"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:272
+msgid "ledger"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:272
+msgid "A0"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:272
+msgid "A1"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:272
+msgid "A2"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:281
+msgid "Custom paper size"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:284
+msgid "  height:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:291
+msgid "Margins  left:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:293
+msgid " right:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:295
+msgid " top:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:297
+msgid " bottom:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:305
+msgid "Resolution (dpi) for printing and PDF "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:323
+msgid "Print on LPR printer"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:331
+msgid "Print on postscript device* "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:342
+msgid "Save to PDF file*              "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:355
+msgid "Save to EPS file               "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/mapprint.tcl:363
+msgid "*requires ghostscript to be installed and in path"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/frames.tcl:105
+msgid "Divide map display into frames for displaying multiple maps"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/frames.tcl:116
+msgid "remove all frames   "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/frames.tcl:128
+msgid "Frame name (optional): "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/frames.tcl:135
+#, tcl-format
+msgid "Set frame borders at 0-100% from lower left corner of display "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/frames.tcl:141
+msgid "     set borders (bottom,top,left,right): "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:128
+msgid "Raster drape map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:178
+msgid "Display raster maps"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:195
+msgid "Base map:\t"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:198
+msgid "base raster map to display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:203 ../gui/tcltk/gis.m/raster.tcl:207
+msgid "base map info"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:219
+msgid "\tvalues to display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:226
+msgid "\tOptional color draping. Use base map for shading,"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:231
+msgid "\tdrape map for color in color relief map or data fusion"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:236
+msgid "\tdrape map:  "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:239
+msgid "raster map to drape over base map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:244 ../gui/tcltk/gis.m/raster.tcl:248
+msgid "drape map info"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:254
+msgid "\tdrape map brightness adjustment\t "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:256
+msgid "Adjust brightness of drape map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/raster.tcl:270
+msgid " Set background color (colored null value cells)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:149
+msgid "Raster map for legend"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:152
+#, tcl-format
+msgid "legend for %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:193
+msgid "Display legend for raster map using cat values and labels"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:210
+msgid "Raster map: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:229
+#, tcl-format
+msgid "Legend placement and size as 0-100% of display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:235
+#, tcl-format
+msgid "    x,y of lower left corner (in % from display top left)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:246
+msgid "    legend height "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:248
+#, tcl-format
+msgid "Legend height (% of display)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:249
+msgid "%  width"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:251
+#, tcl-format
+msgid "Legend width (% of display)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:258
+msgid "Legend appearance: text color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:263
+msgid "  legend text font "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:274
+msgid "do not display labels"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:276
+msgid "do not display values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:283
+msgid "    number of lines (0=display all):"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:285
+msgid "Lines to display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:287
+msgid "invert legend"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:294
+msgid "    interval between categories (integer maps)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:296
+msgid "Thinning interval"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:303
+msgid "draw smooth gradient (fp maps)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:305
+msgid "with maximum of"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:307
+msgid "Maximum lines to display for gradient"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:314
+msgid "Display legend for subset of raster values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:321
+msgid "skip categories with no labels"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:328
+msgid "    legend for only these categories     "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/legend.tcl:335
+msgid "    legend for only this range of values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:144
+msgid "Display grid lines, and geodesic lines or rhumblines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:161
+msgid "Grid options: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:163
+msgid "geodetic grid  "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:165
+msgid "grid color "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:176
+msgid "    grid size (map units)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:178
+msgid " grid origin (east, north)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:186
+msgid "draw border text "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:188
+msgid "text color "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:193
+msgid "text font "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:194
+msgid "  text size"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:196
+msgid "Grid text size in points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:203
+msgid "draw grid border "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:205
+msgid "border color "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:210
+msgid "Geodesic and rhumblines for latlong locations only"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:223 ../gui/tcltk/gis.m/gridline.tcl:254
+msgid " line color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:229
+msgid " text color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gridline.tcl:240 ../gui/tcltk/gis.m/gridline.tcl:265
+msgid "     line endpoints (x1,y1,x2,y2)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmlib.tcl:85 ../gui/tcltk/gis.m/gmlib.tcl:114
+msgid "Map Resource File"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmlib.tcl:86 ../gui/tcltk/gis.m/gmlib.tcl:116
+msgid "All Files"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmlib.tcl:90
+msgid "Open File"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmlib.tcl:115
+msgid "DM Resource File"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:106
+msgid "NVIZ flythrough path"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:122
+msgid "Create flythough path for NVIZ display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:129
+msgid "Raster surface map "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:140
+msgid "Output script file "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:151
+msgid "Flythrough path "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:157
+msgid "Create path with mouse in map display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:160
+msgid "Coordinate pairs for flythrough path (x1,y1,x2,y2,...)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:169
+msgid "Flythrough images prefix "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:170
+msgid "Prefix for image series created by flythough"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:177
+msgid "Camera layback "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:178
+msgid "Camera layback distance (in map units)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:180
+msgid "Camera height "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:181
+msgid "Camera height above terrain"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:188
+msgid "Number of frames "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:189
+msgid "Number of frames to create for flythrough"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:191
+msgid "Start frame "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:192
+msgid "Starting frame number..."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:199
+msgid "Enable vector rendering"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:201
+msgid "Full render (save images)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:203
+msgid "Render images offscreen"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:215
+msgid "Height value is elevation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:217
+msgid "Output keyframe file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:224
+msgid "Reset"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:226
+msgid "Clear all path coordinates"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:365
+msgid "You must specify an output file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:366
+msgid "No output file specified"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:374
+msgid "You must specify at least 4 points (x,y coordinate pairs)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dnviz.tcl:375
+msgid "Insufficient coordinates specified"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/runandoutput.tcl:121
+msgid "Run (background)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/runandoutput.tcl:124
+msgid "Run (GUI)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/runandoutput.tcl:136
+msgid " Save "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/runandoutput.tcl:138
+msgid " Clear "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/runandoutput.tcl:159
+msgid "Output - GIS.m"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/runandoutput.tcl:261
+msgid "X Windows not available"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/runandoutput.tcl:262
+msgid "Functions that require X Windows are not available in Windows"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/runandoutput.tcl:284
+msgid "This module requires X11 support, but no xmons were found"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:108
+msgid "Raster map for histogram"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:111
+#, tcl-format
+msgid "histogram of %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:139
+msgid "Draw histogram of values from raster map or image"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:156
+msgid "Raster to histogram: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:172
+msgid "Graph style"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:176
+msgid "\ttext font "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:186
+msgid "Histogram color: text & frame"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:188
+msgid "  background"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:198
+msgid "Steps/bins for values (fp maps only)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:202
+msgid "include null values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/histogram.tcl:265
+msgid "r.info error"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:75
+msgid ""
+"GISDBASE or LOCATION_NAME or MAPSET is empty.  This is a fatal error. gis.m "
+"can not work without proper settings."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:226
+msgid "Creating MainFrame..."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:268
+msgid "Welcome to GRASS GIS"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:305
+#, tcl-format
+msgid "Map Display %d"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:330
+#, tcl-format
+msgid "GRASS%s GIS Manager - %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:405
+msgid "Select GRASS display font"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:419
+msgid "Font: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:458
+msgid "Character encoding: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:539
+msgid "End current GRASS session"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:540
+msgid ""
+"Do you really want to terminate current GRASS session?\n"
+"\n"
+"This action will close all sessions gis.m instances.\n"
+"\n"
+"If You have running some  GRASS module from comandline, GRASS will terminate "
+"after it finishes to run."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:543
+msgid "Terminate current GRASS session"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:550
+msgid "Not supported"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:551
+msgid ""
+"We sorry. Your shell does not support this feature. \n"
+" You have to type 'exit' in terminal manually."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gm.tcl:573
+#, tcl-format
+msgid "GRASS%s GIS Manager - %s %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtree.tcl:69
+#, tcl-format
+msgid "Map Layers for Display %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtree.tcl:308
+msgid "You must open a display before adding map layers"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtree.tcl:483 ../gui/tcltk/gis.m/gmtree.tcl:631
+#: ../gui/tcltk/gis.m/gmtree.tcl:1152 ../gui/tcltk/gis.m/gmtree.tcl:1158
+msgid "No layer selected"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtree.tcl:867
+msgid "Loading layers..."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtree.tcl:1052
+msgid "Layers loaded"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtree.tcl:1168
+msgid "Selected raster layer is empty"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtree.tcl:1179
+msgid "Selected vector layer is empty"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtree.tcl:1185
+msgid "You can digitize raster or vector maps only"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:86
+msgid "Workspace"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:93
+msgid "Import raster map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:95
+msgid "Multiple formats using GDAL (link into instead of import)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:97
+msgid "Aggregate ASCII xyz"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:98 ../gui/tcltk/gis.m/gmmenu.tcl:135
+msgid "ASCII grid"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:99
+msgid "ASCII polygons and lines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:101 ../gui/tcltk/gis.m/gmmenu.tcl:142
+msgid "Binary"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:102
+msgid "ESRI grid"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:103 ../gui/tcltk/gis.m/gmmenu.tcl:139
+msgid "GRIDATB.FOR"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:104 ../gui/tcltk/gis.m/gmmenu.tcl:140
+msgid "MAT-File (v.4)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:105
+msgid "SPOT NDVI"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:106
+msgid "SRTM hgt"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:107
+msgid "Terra ASTER"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:111
+msgid "Import vector map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:112 ../gui/tcltk/gis.m/gmmenu.tcl:154
+msgid "Multiple formats using OGR"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:114 ../gui/tcltk/gis.m/gmmenu.tcl:156
+msgid "ASCII points or GRASS ASCII vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:115
+msgid "ASCII points as vector lines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:116
+msgid "Old GRASS vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:118 ../gui/tcltk/gis.m/gmmenu.tcl:157
+msgid "DXF"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:119
+msgid "ESRI e00"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:120
+msgid "Garmin GPS"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:121
+msgid "GPSBabel GPS"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:122
+msgid "Geonames"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:123
+msgid "GEOnet"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:124
+msgid "Matlab and MapGen"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:126
+msgid "Import grid 3D volume"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:127 ../gui/tcltk/gis.m/gmmenu.tcl:164
+msgid "ASCII 3D"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:128 ../gui/tcltk/gis.m/gmmenu.tcl:165
+msgid "Vis5D"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:130
+msgid "Import data table"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:132
+msgid "Export raster map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:136
+msgid "ASCII x,y,z"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:138
+msgid "ESRI ASCII grid"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:144
+msgid "MPEG-1"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:145
+msgid "PNG"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:146
+msgid "PPM"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:147
+msgid "PPM from RGB"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:148 ../gui/tcltk/gis.m/gmmenu.tcl:159
+msgid "POV-Ray"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:149
+msgid "TIFF"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:150
+msgid "VRML"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:151 ../gui/tcltk/gis.m/gmmenu.tcl:161
+#: ../gui/tcltk/gis.m/gmmenu.tcl:166
+msgid "VTK"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:153
+msgid "Export vector map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:163
+msgid "Export grid 3D volume"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:168
+msgid "Export data table"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:173
+msgid "List"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:174
+msgid "List filtered"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:176
+msgid "Rename"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:178 ../vector/v.digit/cats.tcl:20
+msgid "Delete"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:179
+msgid "Delete filtered"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:182
+msgid "Raster to vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:183
+msgid "Raster series to volume"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:184
+msgid "Raster 2.5D to volume"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:187
+msgid "Vector to volume"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:188
+msgid "Sites to vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:190
+msgid "Volume to raster series"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:193
+msgid "Georectify"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:195
+msgid "Animate raster maps"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:197
+msgid "Bearing/distance to coordinates"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:199
+msgid "3D rendering"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:200
+msgid "NVIZ"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:201
+msgid "NVIZ fly through path"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:203
+msgid "PostScript plot"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:205
+msgid "Exit &GRASS"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:206
+msgid "&Quit GIS Manager"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:214
+msgid "Mapset access"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:215
+msgid "Change working environment"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:216
+msgid "User access"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:217
+msgid "Show settings"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:218
+msgid "Change settings"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:224
+msgid "Projection for current location"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:226
+msgid "Convert coordinates"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:228
+msgid "Display font"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:238
+msgid "Compress/decompress"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:240
+msgid "Boundaries"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:241
+msgid "Null values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:242
+msgid "Quantization"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:243
+msgid "Timestamps"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:246
+msgid "Resample using multiple methods"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:247
+msgid "Resample using nearest neighbor"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:248
+msgid "Resample using spline tension"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:250
+msgid "Support file maintenance"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:251
+msgid "Update map statistics"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:253
+msgid "Reproject"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:254
+msgid "Tiling"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:257
+msgid "Color tables"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:258
+msgid "Color tables (stddev)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:259
+msgid "Color rules"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:261
+msgid "Blend"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:262
+msgid "Create RGB"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:263 ../gui/tcltk/gis.m/gmmenu.tcl:561
+msgid "HIS to RGB"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:265
+msgid "Query raster color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:270
+msgid "Buffers"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:271
+msgid "Closest points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:272
+msgid "MASK"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:275
+msgid "Moving window"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:276
+msgid "Neighborhood points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:280
+msgid "Map series"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:283
+msgid "Statistical overlay"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:286
+msgid "Solar irradiance irradiation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:287
+msgid "Shadows map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:290
+msgid "Cumulative movement costs"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:294
+msgid "Shaded relief"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:300
+msgid "Visibility"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:303
+msgid "Horizon"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:306
+msgid "Clump"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:307
+msgid "Grow"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:308
+msgid "Thin"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:312
+msgid "Carve stream channels"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:313
+msgid "Fill lake"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:315
+msgid "Depressionless map and flowlines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:316
+msgid "Flow accumulation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:317
+msgid "Flow lines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:319 ../gui/tcltk/gis.m/gmmenu.tcl:612
+msgid "Groundwater flow model"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:322
+msgid "SIMWE sediment flux modeling"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:332
+msgid "Set up"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:338
+msgid "Analyze landscape"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:339
+msgid "Analyze patches"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:340
+msgid "Summary and display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:346
+msgid "Landscape patch analysis"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:349
+msgid "Edge density"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:350
+msgid "Contrast weighted edge density"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:352
+msgid "Patch size mean"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:353
+msgid "Patch area range"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:354
+msgid "Patch area Std Dev"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:355
+msgid "Patch area Coeff Var"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:356
+msgid "Patch density"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:357
+msgid "Patch number"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:359
+msgid "Dominance's diversity"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:360
+msgid "Shannon's diversity"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:361
+msgid "Simpson's diversity"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:363
+msgid "Richness"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:364
+msgid "Shape index"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:367
+msgid "Rate of spread"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:368
+msgid "Least-cost spread paths"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:369
+msgid "Anisotropic spread simulation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:373
+msgid "Interactively edit category values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:375
+msgid "Reclassify by size"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:376
+msgid "Reclassify interactively"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:377 ../gui/tcltk/gis.m/gmmenu.tcl:512
+msgid "Reclassify using rules file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:379
+msgid "Recode interactively"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:380
+msgid "Recode using rules file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:382
+msgid "Rescale"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:383
+msgid "Rescale with histogram"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:386
+msgid "Concentric circles"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:388
+msgid "Random cells"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:389
+msgid "Random cells and vector points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:392
+msgid "Fractal surface"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:394
+msgid "Gausian kernal density surface"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:395
+msgid "Gaussian deviates surface"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:397
+msgid "Plane"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:399
+msgid "Random deviates surface"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:400
+msgid "Random surface with spatial dependence"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:402
+msgid "Contour lines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:404
+msgid "Bilinear from raster points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:405
+msgid "Bilinear and bicubic from vector points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:407
+msgid "IDW from raster points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:408
+msgid "IDW from vector points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:410
+msgid "Raster contours"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:411
+msgid "Regularized spline tension"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:413
+msgid "Fill NULL cells"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:418
+msgid "Manage category information"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:421
+msgid "Quantiles for large data sets"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:422
+msgid "Range of category values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:423
+msgid "Sum cell category values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:425
+msgid "Statistics for clumped cells (works with r.clump)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:429
+msgid "Sample transects"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:430
+msgid "Sample transects (bearing/distance)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:433
+msgid "Linear regression"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:434
+msgid "Mutual category occurences"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:440
+msgid "Edit features"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:443
+msgid "Clean vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:444
+msgid "Smooth or simplify"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:446
+msgid "Convert object types"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:448
+msgid "Add centroids"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:450
+msgid "Build polylines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:451
+msgid "Split polylines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:452
+msgid "Split lines to segments"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:453
+msgid "Parallel lines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:455
+msgid "Dissolve boundaries"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:457
+msgid "Create 3D vector over raster"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:458
+msgid "Extrude 3D vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:460
+msgid "Link to OGR"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:462
+msgid "Create labels"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:463
+msgid "Create optimally placed labels"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:464
+msgid "Assign colors"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:466
+msgid "Reposition vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:467
+msgid "Reproject vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:469
+msgid "Metadata support"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:473
+msgid "Query with attributes"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:474
+msgid "Query with coordinate(s)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:475
+msgid "Query with another map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:477
+msgid "Buffer vectors"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:478
+msgid "Lidar analysis"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:479
+msgid "Detect edges"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:480
+msgid "Detect interiors"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:481
+msgid "Correct and reclassify objects"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:483
+msgid "Linear referencing"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:484
+msgid "Create LRS"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:485
+msgid "Create stationing"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:486
+msgid "Create points/segments"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:487
+msgid "Find ID and offset"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:489
+msgid "Nearest features"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:493
+msgid "Visibility network"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:495
+msgid "Display shortest route"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:500
+msgid "Split net"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:505
+msgid "Overlay"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:506
+msgid "Patch (combine)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:510
+msgid "Manage or report categories"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:511
+msgid "Reclassify objects interactively"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:515
+msgid "Generate area for current region"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:517
+msgid "Convex hull"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:518
+msgid "Delaunay triangles"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:519
+msgid "Voronoi diagram/Thiessen polygons"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:521
+msgid "Generate grid"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:523
+msgid "Generate points from database"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:524
+msgid "Generate points along lines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:526
+msgid "Perturb points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:529
+msgid "Remove outliers in point sets"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:530
+msgid "Test/training sets"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:532
+msgid "Update area attributes from raster"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:533
+msgid "Update point attributes from areas"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:534
+msgid "Update point attributes from raster"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:542
+msgid "Report topology by category"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:543
+msgid "Upload or report topology"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:545
+msgid "Univariate attribute statistics"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:546
+msgid "Attribute classification"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:548
+msgid "Quadrat indices"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:549
+msgid "Test normality"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:554
+msgid "Create/edit group"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:555
+msgid "Target group"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:557
+msgid "Mosaic images"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:560
+msgid "Color balance for RGB"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:562
+msgid "RGB to HIS"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:570
+msgid "Brovey sharpening"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:582
+msgid "Input for supervised MLC"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:583
+msgid "Input for supervised SMAP"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:586
+msgid "Edge detection"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:587
+msgid "Matrix/convolving filter"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:592
+msgid "Canonical correlation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:593
+msgid "Principal components"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:594
+msgid "Fast Fourier"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:595
+msgid "Inverse Fast Fourier"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:599
+msgid "Bit pattern comparison"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:600
+msgid "Kappa analysis"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:601
+msgid "OIF for LandSat TM"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:604
+msgid "&Volumes"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:609
+msgid "3D MASK"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:610
+msgid "3D Map calculator"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:611
+msgid "Cross section from volume"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:613
+msgid "Interpolate volume from vector points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:633
+msgid "New table"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:634
+msgid "Remove table"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:636
+msgid "Add columns"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:637
+msgid "Change values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:638
+msgid "Drop column"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:639
+msgid "Rename a column"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:645
+msgid "Query any table"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:646
+msgid "Query vector attribute table"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:647
+msgid "SQL statement"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:650
+msgid "Reconnect vector to database"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmmenu.tcl:651
+msgid "Set vector - database connection"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:111
+msgid "Aspect map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:114 ../gui/tcltk/gis.m/rastarrows.tcl:126
+#, tcl-format
+msgid "arrows for %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:123
+msgid "Slope/intensity map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:139
+msgid "Display arrows whose orientations are based on raster aspect map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:145
+msgid "  (optionally, arrow lengths are based on slope or intensity map)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:162
+msgid "Aspect map: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:178
+msgid "    aspect value type"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:181
+msgid "grass"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:181
+msgid "compass"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:181
+msgid "agnps"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:181
+msgid "answers"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:188
+msgid "    draw arrows every Nth grid cell"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:196
+msgid "    arrow color      "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:203
+msgid "     cell grid color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:215
+msgid "    null value color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:234
+msgid "Slope/intensity map: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastarrows.tcl:245
+msgid "    scale factor for computing arrow length"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dtext.tcl:161
+msgid "Display text"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dtext.tcl:178
+msgid "Text to display: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dtext.tcl:220
+msgid "     text rotation (degrees)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dtext.tcl:229
+msgid "Text options: font "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dtext.tcl:243
+msgid "     text height in pixels "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/dtext.tcl:245
+msgid "  line spacing"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:54
+msgid "Raster map for profile"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:77
+msgid "Profile Window"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:110
+msgid ""
+"Select raster map to profile.\n"
+"Currently selected raster is default."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:115
+msgid "Draw profile transect in map display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:120
+msgid "Draw profile"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:125
+msgid "Clear profile"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:130
+msgid "Save profile to EPS file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:177
+msgid "r.univar error"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:433
+msgid "You must select a raster to profile"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:434
+msgid "No raster map selected"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:440
+msgid "You must draw a transect to profile"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:441
+msgid "No transect drawn"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:446
+msgid "Please wait while profile elevations are calculated"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:451
+msgid ""
+"Elevation range for selected raster is zero.\n"
+"No profile can be created."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:452
+msgid "Zero elevation range"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:539
+msgid "Error reading region values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/profile.tcl:563 ../gui/tcltk/gis.m/profile.tcl:648
+msgid "r.profile error"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:299
+msgid "Select maps to animate"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:313
+msgid "Rewind animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:319
+msgid "Replay animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:325
+msgid "Step backwards through animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:331
+msgid "Stop animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:337
+msgid "Step forwards through animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:343
+msgid "Play animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:356
+msgid "Slower animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:362
+msgid "Faster animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:372
+msgid "Continuously loop through animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:380
+msgid "Run animation alternately forward and backward"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:391
+msgid "Show map names in animation window"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:404
+msgid "Quit animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:435
+msgid "Select maps"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:463
+msgid "Maps for Animation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:479
+msgid "Select maps to animate in one or more frames (1 frame required)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:492
+msgid "Maps for frame 1 (required): "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:503
+msgid "Maps for frame 2 (optional): "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:514
+msgid "Maps for frame 3 (optional): "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:525
+msgid "Maps for frame 4 (optional): "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:563
+msgid "You must select maps to animate for frame 1"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:564
+msgid "No maps selected"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/animate.tcl:1031
+msgid "Animation Window"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:41 ../gui/tcltk/gis.m/georecttool.tcl:40
+msgid "Display active layers"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:48
+msgid "Redraw all layers"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:55
+msgid "Start NVIZ using active layers in current region"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:61
+msgid "Create flythough path for NVIZ"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:94
+msgid "Pointer"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:113 ../gui/tcltk/gis.m/georecttool.tcl:92
+msgid "Zoom In"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:132 ../gui/tcltk/gis.m/georecttool.tcl:111
+msgid "Zoom Out"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:151 ../gui/tcltk/gis.m/georecttool.tcl:130
+#: ../vector/v.digit/toolbox.tcl:212
+msgid "Pan"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:185
+msgid "Zoom display to selected map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:188
+msgid "Zoom display to saved region"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:191
+msgid "Save display extents to named region"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:194
+msgid "Zoom display to computational region (set with g.region)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:197
+msgid "Zoom display to default region"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:200
+msgid "Set computational region extents to match display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:248
+msgid "Measure"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:255
+msgid "Create profile of raster map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:272
+msgid "Print raster & vector maps to eps file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:291
+msgid "low quality (50)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:293
+msgid "mid quality (75)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:295
+msgid "high quality (95)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:297
+msgid "very high resolution (300% your current resolution)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:302
+msgid "(* requires gdal)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:327 ../gui/tcltk/gis.m/rastnums.tcl:288
+msgid "Constrain map to region geometry"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:346
+msgid "Map fills display window"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:397
+msgid "Could not create BMP"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:409 ../gui/tcltk/gis.m/maptool.tcl:414
+msgid "Could not create JPG"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:427
+msgid "Could not create PNG"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/maptool.tcl:442
+msgid "Could not create TIF"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtool1.tcl:28
+msgid "Start new map display monitor"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtool1.tcl:56
+msgid "Add histogram layer"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtool1.tcl:63
+msgid "Add cell values layer"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtool1.tcl:70
+msgid "Add directional arrows layer"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtool1.tcl:76
+msgid "Add raster legend layer"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtool1.tcl:121
+msgid "Add raster labels layer (using v.labels file)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtool1.tcl:135
+msgid "Add postscript labels layer (using v.labels file)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/gmtool1.tcl:142
+msgid "Add postscript text layer"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georecttool.tcl:73
+msgid "Set ground control points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/georecttool.tcl:151
+msgid "Zoom to map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:136
+#, tcl-format
+msgid "thematic map for %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:145 ../gui/tcltk/gis.m/thematic.tcl:152
+#: ../gui/tcltk/gis.m/thematic.tcl:158
+msgid "Select font"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:222 ../gui/tcltk/gis.m/vector.tcl:319
+msgid "Vector point symbol"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:238
+msgid "Display vector maps thematically by graduate colors (all types)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:244
+msgid "  or by graduated sizes (points and lines)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:264
+msgid "vector for thematic mapping"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:282
+msgid "area"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:282
+msgid "point"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:282
+msgid "centroid"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:282
+msgid "line"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:282
+msgid "boundary"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:284
+msgid " attribute layer"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:291
+msgid "    NUMERIC attribute column to use for thematic map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:304
+msgid "   show data"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:318
+msgid "graduated colors"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:318
+msgid "graduated points"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:318
+msgid "graduated lines"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:323
+msgid "interval"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:323
+msgid "std deviation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:323
+msgid "quartiles"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:323
+msgid "custom breaks"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:330
+msgid "    number of intervals to map (interval themes):"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:338
+msgid "    custom breakpoints (val val ...)  "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:345
+msgid "    query with SQL where clause   "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:352
+msgid "Graduated points & lines: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:366
+msgid "    size/min size (graduated pts/lines)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:368
+msgid "icon size/min size (graduated pts/lines)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:369
+msgid "max size (graduated pts)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:371
+msgid " max size (graduated pts/lines)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:377
+msgid "Graduated colors: preset color schemes"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:380
+msgid "blue red"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:380
+msgid "red blue"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:380
+msgid "green red"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:380
+msgid "red green"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:380
+msgid "blue green"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:380
+msgid "green blue"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:380
+msgid "cyan yellow"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:380
+msgid "yellow cyan"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:380
+msgid "custom gradient"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:380
+msgid "single color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:387
+msgid "    custom color scheme - start color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:389
+msgid " end color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:405
+msgid "Legend: title font "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:408
+msgid "title font for legend"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:412 ../gui/tcltk/gis.m/thematic.tcl:438
+msgid " font color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:419
+msgid "    subtitle font    "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:422
+msgid "subtitle font for legend"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:431
+msgid "    label font       "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:434
+msgid "label font for legend"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:453
+msgid "Name for ps.map instruction files"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:663
+#, tcl-format
+msgid "Legend for Map %d, %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:686
+msgid "clear"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:688
+msgid "Clear legend"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:689
+msgid "save"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/thematic.tcl:691
+msgid "Save legend to EPS file"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:108
+#, tcl-format
+msgid "cell values for %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:136
+msgid "Display cell values from raster map or image"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:142
+msgid "  (resolution must be 100x100 or less)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:158
+msgid "Raster to display: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:174
+msgid "Color for cell grid:       "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:181
+msgid "  cell values font "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:191
+msgid "Color for cell values:   "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:198
+msgid "use raster colors for cell values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:280
+msgid ""
+"Cell values can only be displayed\n"
+"for regions of < 10,000 cells"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:285
+msgid "Constrain map to region geometry?"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:286
+msgid ""
+"Cell values can only be displayed for \n"
+"regions of < 10,000 cells. Map in explore mode may contain more than 10,000 "
+"cells.\n"
+"\n"
+" It's suggested to constrain map to region geometry to display cell values."
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rastnums.tcl:288
+msgid "Leave in explore mode"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:231
+msgid "Vector output map"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:337
+msgid "Display vector maps"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:348
+msgid "Transparent"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:357
+msgid "vector map to display"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:362 ../gui/tcltk/gis.m/vector.tcl:366
+msgid "Vector Info"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:378
+msgid "Display: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:379
+msgid "Shapes "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:381
+msgid "Categories "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:383
+msgid "Topology "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:385
+msgid "Line directions "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:393
+msgid "Points "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:395
+msgid "Lines "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:397
+msgid "Boundaries "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:399
+msgid "Areas "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:401
+msgid "Centroids "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:403
+msgid "Faces "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:411
+msgid "Point symbols:"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:412
+msgid "Icon"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:416
+msgid "   Size"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:418
+msgid "Icon size"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:423
+msgid "Attribute column for size"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:425
+msgid "Attribute column for rotation"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:436 ../gui/tcltk/gis.m/vector.tcl:452
+msgid "Color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:439
+msgid "   Width"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:441
+msgid "Line width"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:443
+msgid "(pixels) "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:456
+msgid "Random colors "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:468
+msgid " Text color"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:471
+msgid "   Text size"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:480
+msgid "Label part to align with vector point "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:485
+msgid "   Justification"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:488
+msgid "top"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:488
+msgid "bottom"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:495
+msgid "     Layer for labels"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:497
+msgid "   Attribute column for labels"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:504
+msgid "Query vectors for display: "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:513
+msgid "Query cat values"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:524
+msgid "Use SQL query"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:532
+msgid "    Show attribute columns"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:538
+msgid "      Show attribute data"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:550
+msgid "Save displayed objects to new vector file "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:552
+msgid "Overwrite existing"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:559
+msgid "     New vector"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:563
+msgid "Select existing vector for saving queried objects"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/vector.tcl:574
+msgid " or <"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:104
+msgid "Raster map for red or hue channel"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:107
+#, tcl-format
+msgid "RGB-HIS %s"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:114
+msgid "Raster map for green or intensity channel"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:122
+msgid "Raster map for blue or saturation channel"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:136
+msgid ""
+"Display 3 raster maps as Red/Green/Blue or Hue/Intensity/Saturation channels"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:175
+msgid "red (RGB) or hue (HIS): "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:178
+msgid "raster map for red or hue channel (HIS drape)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:187
+msgid "green (RGB) or intensity (HIS): "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:190
+msgid "raster map for green or intensity channel (HIS relief)"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:199
+msgid "blue (RGB) or saturation (HIS): "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:202
+msgid "raster map for blue or saturation channel"
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:211
+msgid "HIS brightness adjustment\t "
+msgstr ""
+
+#: ../gui/tcltk/gis.m/rgbhis.tcl:213
+msgid "Adjusts the HIS intensity channel brightness"
+msgstr ""
+
+#: ../vector/v.digit/cats.tcl:34
+msgid "Categories already opened"
+msgstr ""
+
+#: ../vector/v.digit/cats.tcl:42
+msgid "Categories"
+msgstr ""
+
+#: ../vector/v.digit/cats.tcl:53
+msgid "Layer:"
+msgstr ""
+
+#: ../vector/v.digit/cats.tcl:55
+msgid "   Category:"
+msgstr ""
+
+#: ../vector/v.digit/cats.tcl:62
+msgid "Insert new record to table"
+msgstr ""
+
+#: ../vector/v.digit/cats.tcl:63
+msgid "Add new"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:20
+msgid "Welcome to v.digit"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:21
+msgid "Left button"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:22
+msgid "Middle button"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:23
+msgid "Right button"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:98
+msgid "  Layer"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:102
+msgid "  Category"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:106
+msgid "  Mode "
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:118
+msgid "Insert new record into table"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:135
+msgid "Digitize new point"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:140
+msgid "Digitize new line"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:145
+msgid "Digitize new boundary"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:150
+msgid "Digitize new centroid"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:156
+msgid "Move vertex"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:161
+msgid "Add vertex"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:166
+msgid "Remove vertex"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:171
+msgid "Split line"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:176
+msgid "Edit line/boundary"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:181
+msgid "Move point, line, boundary, or centroid"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:186
+msgid "Delete point, line, boundary, or centroid"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:197
+msgid "Redraw"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:202
+msgid "Zoom in by window"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:207
+msgid "Zoom out"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:217
+msgid "Zoom to default region"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:230
+msgid "Zoom to saved region"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:236
+msgid "Display categories"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:241
+msgid "Copy categories"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:246
+msgid "Display attributes"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:258
+msgid "Open settings"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:264
+msgid "Save and exit"
+msgstr ""
+
+#: ../vector/v.digit/toolbox.tcl:275
+msgid "mouse button actions (left, middle, right)"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:75
+msgid "Add new column"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:78
+msgid "Create table"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:111
+msgid "Add command"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:149
+msgid "Table successfully created"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:165
+msgid "Settings already opened"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:183
+msgid "Symbology"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:187 ../vector/v.digit/settings.tcl:340
+msgid "Background"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:194
+msgid "Highlight"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:201
+msgid "Point"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:210
+msgid "Line"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:219
+msgid "Boundary (no area)"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:227
+msgid "Boundary (1 area)"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:235
+msgid "Boundary (2 areas)"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:244
+msgid "Centroid (in area)"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:252
+msgid "Centroid (outside area)"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:260
+msgid "Centroid (duplicate in area)"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:269
+msgid "Node (1 line)"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:277
+msgid "Node (2 lines)"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:287
+msgid "Settings"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:292
+msgid "Snapping threshold in screen pixels"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:302
+msgid "Snapping threshold in map units"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:319
+msgid "Line width in screen pixels"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:321
+msgid "Set line width in pixels"
+msgstr ""
+
+#: ../vector/v.digit/settings.tcl:329
+msgid "Table"
+msgstr ""
diff --git a/locale/po/grasswxpy_nl.po b/locale/po/grasswxpy_nl.po
new file mode 100644
index 0000000..ca095dd
--- /dev/null
+++ b/locale/po/grasswxpy_nl.po
@@ -0,0 +1,12611 @@
+# translation of grasswxpy_nl.po to Dutch
+# This file is distributed under the same license as the GRASS package.
+# Copyright (C) 2012 GRASS Development Team
+#
+# XXX, 2012.
+msgid ""
+msgstr ""
+"Project-Id-Version: grasswxpy_nl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-10 00:42+0200\n"
+"PO-Revision-Date: 2012-06-19 23:46+0200\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: Dutch <grass-translations at lists.osgeo.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../gui/wxpython/gui_core/prompt.py:393
+#, python-format
+msgid "Warning: flag <%(flag)s> not found in '%(module)s'"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/prompt.py:396
+#, python-format
+msgid "Warning: option <%(param)s> not found in '%(module)s'"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/prompt.py:638
+msgid "Type GRASS command and run by pressing ENTER"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/mapdisp.py:84 ../gui/wxpython/core/render.py:434
+#, python-format
+msgid "GRASS module '%s' not found. Unable to start map display window."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:314
+msgid "Not selectable element"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:335
+#: ../gui/wxpython/gui_core/preferences.py:1649
+msgid "Mapset"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:359
+#, python-format
+msgid "GSelect: invalid item: %s"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:876 ../gui/wxpython/gis_set.py:781
+msgid "Choose GIS Data Directory"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:877
+#: ../gui/wxpython/gui_core/gselect.py:1175
+#: ../gui/wxpython/gui_core/gselect.py:1184
+#: ../gui/wxpython/gui_core/gselect.py:1193
+#: ../gui/wxpython/gui_core/gselect.py:1508
+#: ../gui/wxpython/gui_core/gselect.py:1696
+#: ../gui/wxpython/gui_core/forms.py:1308
+#: ../gui/wxpython/gui_core/dialogs.py:1770
+#: ../gui/wxpython/location_wizard/wizard.py:101
+#: ../gui/wxpython/location_wizard/wizard.py:1118
+#: ../gui/wxpython/location_wizard/wizard.py:1192
+#: ../gui/wxpython/location_wizard/wizard.py:1278
+#: ../gui/wxpython/psmap/dialogs.py:1971 ../gui/wxpython/psmap/dialogs.py:2160
+#: ../gui/wxpython/psmap/dialogs.py:4120 ../gui/wxpython/nviz/tools.py:476
+msgid "Browse"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1101
+#: ../gui/wxpython/gui_core/toolbars.py:77 ../gui/wxpython/nviz/tools.py:1799
+msgid "Settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1105
+msgid "Output settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1107
+msgid "Source settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1118
+msgid "Native"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1122
+#: ../gui/wxpython/gui_core/forms.py:1307
+msgid "File"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1126
+msgid "Directory"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1130
+#: ../gui/wxpython/dbmgr/manager.py:2321 ../gui/wxpython/dbmgr/manager.py:2445
+#: ../gui/wxpython/dbmgr/manager.py:2699
+msgid "Database"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1134
+msgid "Protocol"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1148
+msgid "Save current settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1151
+msgid "Delete currently selected settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1157
+msgid "Output type"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1159
+msgid "Source type"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1167
+#: ../gui/wxpython/gui_core/gselect.py:1170
+#: ../gui/wxpython/gui_core/gselect.py:1501
+#: ../gui/wxpython/gui_core/gselect.py:1503
+#: ../gui/wxpython/gui_core/gselect.py:1689
+#: ../gui/wxpython/gui_core/gselect.py:1691
+msgid "All files"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1174
+#: ../gui/wxpython/gui_core/gselect.py:1507
+msgid "Choose file to import"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1183
+msgid "Choose input directory"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1192
+#: ../gui/wxpython/gui_core/gselect.py:1695
+msgid "Choose file"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1226
+msgid "File:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1229
+#: ../gui/wxpython/gui_core/gselect.py:1232
+#: ../gui/wxpython/gui_core/gselect.py:1241
+#: ../gui/wxpython/gui_core/gselect.py:1381
+#: ../gui/wxpython/gmodeler/preferences.py:464
+msgid "Name:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1235
+msgid "Protocol:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1262
+msgid "Extension:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1290
+msgid "Load settings:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1311
+msgid "Format:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1333
+msgid "Creation options:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1370
+#, python-format
+msgid "Settings <%s> not found"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1382
+#: ../gui/wxpython/gui_core/gselect.py:1403
+msgid "Save settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1389
+msgid "Name not given, settings is not saved."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1394
+msgid "No data source defined, settings is not saved."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1401
+#, python-format
+msgid "Settings <%s> already exists. Do you want to overwrite the settings?"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1423
+msgid "No settings is defined. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1442
+msgid "Unable to save settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/gselect.py:1587
+#, python-format
+msgid "Database <%s> not accessible."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:31
+msgid "Display map"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:32
+msgid "Re-render modified map layers only"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:34
+msgid "Render map"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:35
+msgid "Force re-rendering all map layers"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:37
+msgid "Erase display"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:38
+msgid "Erase display canvas with given background color"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:40
+msgid "Pointer"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:42
+msgid "Zoom in"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:43
+msgid "Drag or click mouse to zoom"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:45
+msgid "Zoom out"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:46
+msgid "Drag or click mouse to unzoom"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:48
+msgid "Return to previous zoom"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:50
+msgid "Various zoom options"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:51
+msgid "Zoom to computational, default, saved region, ..."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:53
+msgid "Zoom to selected map layer(s)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:55
+msgid "Pan"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:56
+msgid "Drag with mouse to pan"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:58
+msgid "Save display to graphic file"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:60
+#: ../gui/wxpython/modules/histogram.py:451
+#: ../gui/wxpython/mapdisp/frame.py:613 ../gui/wxpython/wxplot/base.py:485
+#: ../gui/wxpython/gcp/mapdisplay.py:493
+msgid "Print display"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:62
+msgid "Select font"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:64
+msgid "Show manual"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:66
+#: ../gui/wxpython/lmgr/layertree.py:66
+msgid "Quit"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:68
+msgid "Add raster map layer"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:70
+msgid "Add vector map layer"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:72
+msgid "Add map elements"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:73
+msgid "Overlay elements like scale and legend onto map"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/toolbars.py:75
+msgid "Create histogram with d.histogram"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:135
+#: ../gui/wxpython/gui_core/forms.py:1252
+msgid "Select Color"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:424
+msgid "Enter parameters for '"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:435
+msgid "Close this window without executing the command (Ctrl+Q)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:455 ../gui/wxpython/gui_core/ghelp.py:211
+#: ../gui/wxpython/gmodeler/model.py:2175
+#: ../gui/wxpython/gmodeler/frame.py:1496
+#: ../gui/wxpython/modules/mcalc_builder.py:133
+#: ../gui/wxpython/modules/vclean.py:156 ../gui/wxpython/scripts/vkrige.py:152
+msgid "&Run"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:456
+msgid "Run the command (Ctrl+R)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:462 ../gui/wxpython/modules/vclean.py:159
+msgid "Copy the current command string to the clipboard (Ctrl+C)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:476
+msgid "Show manual page of the command (Ctrl+H)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:497
+msgid "Add created map(s) into layer tree"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:512
+#: ../gui/wxpython/gui_core/dialogs.py:1471
+msgid "Close dialog on finish"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:514
+msgid ""
+"Close dialog when command is successfully finished. Change this settings in "
+"Preferences dialog ('Command' tab)."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:685
+#, python-format
+msgid "'%s' copied to clipboard"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:748 ../gui/wxpython/gui_core/forms.py:761
+msgid "Required"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:751 ../gui/wxpython/gui_core/forms.py:761
+msgid "Optional"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:787 ../gui/wxpython/gmodeler/frame.py:117
+#: ../gui/wxpython/scripts/vkrige.py:108
+msgid "Command output"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:795
+msgid "Manual"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:835
+#: ../gui/wxpython/gui_core/forms.py:1359
+msgid "Parameterized in model"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:910
+msgid "[multiple]"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:957
+msgid "valid range"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:1286
+msgid "Transparent"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:1306
+#, python-format
+msgid "Choose %s"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:1334
+#: ../gui/wxpython/modules/mcalc_builder.py:140
+msgid "&Load"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:1340
+msgid "or enter values interactively"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:1520
+msgid "Nothing to load."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:1548
+#: ../gui/wxpython/modules/colorrules.py:567
+msgid "Nothing to save."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:1552
+msgid "Save input as..."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:1800
+#, python-format
+msgid "Error in %s"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:1904
+#, python-format
+msgid "Unable to parse command '%s'"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:1910
+#, python-format
+msgid "%(cmd)s: parameter '%(key)s' not available"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/forms.py:2017
+#, python-format
+msgid "usage: %s <grass command>"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/widgets.py:393
+#: ../gui/wxpython/modules/extensions.py:312
+msgid "Menu tree"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:114
+msgid "Type of element:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:145
+msgid "Select GRASS location and mapset"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:146
+msgid "Name of GRASS location:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:166
+#: ../gui/wxpython/gui_core/dialogs.py:198
+msgid "Name of mapset:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:196
+msgid "Select mapset in GRASS location"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:224
+#: ../gui/wxpython/gui_core/dialogs.py:337 ../gui/wxpython/menustrings.py:520
+msgid "Create new vector map"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:239
+msgid "Name for new vector map:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:245
+msgid "Create attribute table"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:257
+#: ../gui/wxpython/gui_core/preferences.py:852
+msgid "Add created map into layer tree"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:287
+#: ../gui/wxpython/gui_core/preferences.py:1072
+msgid "Key column:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:362
+#, python-format
+msgid "Unable to create vector map <%s>."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:367
+#, python-format
+msgid ""
+"Invalid or empty key column.\n"
+"Unable to create vector map <%s>."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:384
+#, python-format
+msgid ""
+"Vector map <%s> already exists in the current mapset. Do you want to "
+"overwrite it?"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:387
+msgid "Overwrite?"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:434
+#, python-format
+msgid "New vector map <%s> created"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:456
+msgid "Load region:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:460
+msgid "Save region:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:527
+#: ../gui/wxpython/lmgr/layertree.py:93
+msgid "Set options"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:533
+msgid "Set size and position"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:534
+msgid ""
+"Click and drag on the map display to set legend size and position and then "
+"press OK"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:544
+msgid ""
+"Drag legend object with mouse in pointer mode to position.\n"
+"Double-click to change options.\n"
+"Define raster map name for legend in properties dialog."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:548
+msgid ""
+"Drag scale object with mouse in pointer mode to position.\n"
+"Double-click to change options."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:596
+#, python-format
+msgid "Legend of raster map <%s>"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:690
+msgid "Show text object"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:700
+#: ../gui/wxpython/psmap/dialogs.py:3712
+msgid "Enter text:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:716 ../gui/wxpython/nviz/tools.py:1004
+msgid "Rotation:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:729
+#: ../gui/wxpython/gui_core/preferences.py:423
+#: ../gui/wxpython/gui_core/preferences.py:595
+msgid "Set font"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:740
+msgid ""
+"Drag text with mouse in pointer mode to position.\n"
+"Double-click to change options"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:821
+msgid "Create or edit imagery groups"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:839
+msgid "Apply changes to selected group and close dialog"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:840
+msgid "Apply changes to selected group"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:841
+msgid "Close dialog, changes are not applied"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:882
+msgid "Select the group you want to edit or enter name of new group:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:893
+msgid "Layers in selected group:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:905
+msgid "Select map layers and add them to the list."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:909
+msgid "Remove selected layer(s) from list."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:919
+msgid "Define also sub-group (same name as group)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:934
+msgid "Add selected map layers into group"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:968
+#, python-format
+msgid "Group <%s> was changed, do you want to apply changes?"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:970
+msgid "Unapplied changes"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1052
+#, python-format
+msgid "No changes to apply in group <%s>."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1055
+#, python-format
+msgid "Group <%s> was successfully created."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1057
+#, python-format
+msgid "Group <%s> was successfully changed."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1060
+#, python-format
+msgid "Creating of new group <%s> failed."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1062
+#, python-format
+msgid "Changing of group <%s> failed."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1091
+msgid "No group selected."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1153
+msgid "Use fully-qualified map names"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1160
+#, python-format
+msgid "Dynamic series (%s)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1198
+msgid "Map type:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1203
+#: ../gui/wxpython/psmap/dialogs.py:695 ../gui/wxpython/gmodeler/frame.py:1326
+#: ../gui/wxpython/lmgr/layertree.py:823 ../gui/wxpython/gcp/manager.py:314
+msgid "raster"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1203
+#: ../gui/wxpython/lmgr/layertree.py:826
+msgid "3D raster"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1203
+#: ../gui/wxpython/psmap/dialogs.py:696 ../gui/wxpython/gmodeler/frame.py:1327
+#: ../gui/wxpython/lmgr/layertree.py:844 ../gui/wxpython/gcp/manager.py:314
+msgid "vector"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1221
+msgid "Select toggle"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1228
+msgid "Mapset:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1238
+msgid "Pattern:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1250
+msgid "List of maps:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1304
+#: ../gui/wxpython/gui_core/dialogs.py:1906
+#: ../gui/wxpython/dbmgr/manager.py:1139
+msgid "Select all"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1305
+msgid "Invert selection"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1306
+#: ../gui/wxpython/gui_core/dialogs.py:1907
+#: ../gui/wxpython/dbmgr/manager.py:1140
+msgid "Deselect all"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1412
+msgid "Multiple import"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1426
+#, python-format
+msgid " List of %s layers "
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1431
+msgid "Layer id"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1432
+msgid "Layer name"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1433
+msgid "Name for GRASS map (editable)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1438
+#: ../gui/wxpython/modules/extensions.py:68
+msgid "Options"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1466
+#: ../gui/wxpython/gui_core/preferences.py:832
+#: ../gui/wxpython/gmodeler/preferences.py:442
+#: ../gui/wxpython/modules/vclean.py:135 ../gui/wxpython/scripts/vkrige.py:139
+msgid "Allow output files to overwrite existing files"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1479
+#: ../gui/wxpython/modules/ogc_services.py:77
+#: ../gui/wxpython/gcp/manager.py:2374
+msgid "Close dialog"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1482
+#: ../gui/wxpython/gui_core/dialogs.py:1661
+#: ../gui/wxpython/modules/ogc_services.py:85
+msgid "&Import"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1483
+#: ../gui/wxpython/gui_core/dialogs.py:1662
+#: ../gui/wxpython/modules/ogc_services.py:86
+msgid "Import selected layers"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1489
+#: ../gui/wxpython/modules/extensions.py:102
+#: ../gui/wxpython/modules/extensions.py:404
+msgid "Command dialog"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1633 ../gui/wxpython/menustrings.py:152
+#: ../gui/wxpython/lmgr/layertree.py:60
+msgid "Link external vector data"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1635 ../gui/wxpython/menustrings.py:56
+#: ../gui/wxpython/lmgr/layertree.py:58
+msgid "Import vector data"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1639 ../gui/wxpython/menustrings.py:150
+#: ../gui/wxpython/lmgr/layertree.py:54
+msgid "Link external raster data"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1641 ../gui/wxpython/menustrings.py:29
+#: ../gui/wxpython/lmgr/layertree.py:52
+msgid "Import raster data"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1647
+msgid "Add linked layers into layer tree"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1649
+#: ../gui/wxpython/gui_core/dialogs.py:1775
+#: ../gui/wxpython/modules/ogc_services.py:69
+msgid "Add imported layers into layer tree"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1654
+msgid "&Link"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1655
+msgid "Link selected layers"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1657
+#: ../gui/wxpython/gui_core/dialogs.py:1659
+#: ../gui/wxpython/gui_core/dialogs.py:1664
+#: ../gui/wxpython/gui_core/dialogs.py:1666
+#: ../gui/wxpython/modules/extensions.py:103
+#: ../gui/wxpython/modules/extensions.py:405
+#, python-format
+msgid "Open %s dialog"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1675
+msgid "No layers selected. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1765
+msgid "Import DXF layers"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1769
+msgid "Choose DXF file to import"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1974
+msgid "Set Map Layer Opacity"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:1998
+#: ../gui/wxpython/psmap/dialogs.py:4603 ../gui/wxpython/psmap/dialogs.py:4618
+#: ../gui/wxpython/psmap/dialogs.py:4857 ../gui/wxpython/psmap/dialogs.py:4878
+msgid "transparent"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:2001
+msgid "opaque"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:2097
+msgid "Set image size"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:2106
+msgid "Image size"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:2145
+#: ../gui/wxpython/psmap/dialogs.py:2722
+#: ../gui/wxpython/gmodeler/preferences.py:158
+#: ../gui/wxpython/gmodeler/preferences.py:277
+#: ../gui/wxpython/gmodeler/preferences.py:362
+#: ../gui/wxpython/nviz/preferences.py:475
+msgid "Width:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:2149
+#: ../gui/wxpython/psmap/dialogs.py:2734 ../gui/wxpython/psmap/dialogs.py:2872
+#: ../gui/wxpython/psmap/dialogs.py:3476
+#: ../gui/wxpython/gmodeler/preferences.py:176
+#: ../gui/wxpython/gmodeler/preferences.py:295
+#: ../gui/wxpython/gmodeler/preferences.py:380
+#: ../gui/wxpython/nviz/tools.py:276 ../gui/wxpython/nviz/tools.py:1036
+#: ../gui/wxpython/nviz/tools.py:1674
+msgid "Height:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:2153
+msgid "Template:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:2194
+msgid "Symbols"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:2221
+msgid "Symbol directory:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/dialogs.py:2229
+msgid "Symbol name:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:58
+msgid "User settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:78
+msgid "Set to default"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:86
+msgid "Revert settings to default and apply changes"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:88
+#: ../gui/wxpython/wxplot/dialogs.py:376 ../gui/wxpython/wxplot/dialogs.py:763
+#: ../gui/wxpython/gcp/manager.py:2370
+msgid "Apply changes for the current session"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:90
+#: ../gui/wxpython/wxplot/dialogs.py:381 ../gui/wxpython/wxplot/dialogs.py:765
+#: ../gui/wxpython/gcp/manager.py:2372
+msgid ""
+"Apply and save changes to user settings file (default for next sessions)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:93
+#: ../gui/wxpython/psmap/dialogs.py:354
+#: ../gui/wxpython/gmodeler/preferences.py:452
+#: ../gui/wxpython/wxplot/dialogs.py:383 ../gui/wxpython/wxplot/dialogs.py:766
+#: ../gui/wxpython/vdigit/preferences.py:58
+msgid "Close dialog and ignore changes"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:149
+msgid "Settings applied to current session but not saved"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:176
+#, python-format
+msgid "Settings saved to file '%s'."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:211
+msgid "Key column cannot be empty string."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:212
+#: ../gui/wxpython/gui_core/preferences.py:1265
+#: ../gui/wxpython/gui_core/preferences.py:1294
+#: ../gui/wxpython/gui_core/preferences.py:1303
+#: ../gui/wxpython/gui_core/preferences.py:1312
+#: ../gui/wxpython/location_wizard/dialogs.py:114
+#: ../gui/wxpython/location_wizard/dialogs.py:131
+#: ../gui/wxpython/location_wizard/dialogs.py:438
+#: ../gui/wxpython/location_wizard/wizard.py:538
+#: ../gui/wxpython/location_wizard/wizard.py:723
+#: ../gui/wxpython/location_wizard/wizard.py:1452
+#: ../gui/wxpython/location_wizard/wizard.py:1518
+#: ../gui/wxpython/psmap/dialogs.py:3950 ../gui/wxpython/core/gcmd.py:110
+#: ../gui/wxpython/core/workspace.py:1001
+#: ../gui/wxpython/gmodeler/frame.py:892
+#: ../gui/wxpython/mapdisp/mapwindow.py:1621
+#: ../gui/wxpython/lmgr/layertree.py:555 ../gui/wxpython/gis_set.py:213
+#: ../gui/wxpython/gis_set.py:551 ../gui/wxpython/gis_set.py:588
+#: ../gui/wxpython/gis_set.py:654 ../gui/wxpython/vdigit/dialogs.py:241
+#: ../gui/wxpython/vdigit/dialogs.py:433
+msgid "Error"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:248
+msgid "GUI Settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:269
+#: ../gui/wxpython/gmodeler/preferences.py:45
+#: ../gui/wxpython/vdigit/preferences.py:118
+msgid "General"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:275
+msgid "Layer Manager settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:286
+msgid "Ask when removing map layer from layer tree"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:296
+msgid "Ask when quiting wxGUI or closing display"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:306
+#: ../gui/wxpython/gui_core/preferences.py:316
+#, python-format
+msgid "Hide '%s' tab (requires GUI restart)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:306
+#: ../gui/wxpython/lmgr/frame.py:266
+msgid "Search module"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:316
+#: ../gui/wxpython/lmgr/frame.py:273
+msgid "Python shell"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:329
+msgid "Automatically copy selected text to clipboard (in Command console)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:343
+msgid "Workspace settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:351
+msgid "Suppress positioning Map Display Window(s)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:363
+msgid "Suppress positioning Layer Manager window"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:374
+msgid "Save current window layout as default"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:377
+msgid ""
+"Save current position and size of Layer Manager window and opened Map "
+"Display window(s) and use as default for next sessions."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:400
+#: ../gui/wxpython/nviz/tools.py:91
+msgid "Appearance"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:404
+#: ../gui/wxpython/gui_core/preferences.py:579
+#: ../gui/wxpython/gui_core/preferences.py:1415
+#: ../gui/wxpython/psmap/dialogs.py:2787 ../gui/wxpython/psmap/dialogs.py:3264
+#: ../gui/wxpython/psmap/dialogs.py:3720 ../gui/wxpython/wxplot/dialogs.py:310
+msgid "Font settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:418
+msgid "Font for command output:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:432
+msgid "Language settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:442
+msgid "Choose language (requires to save and GRASS restart):"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:464
+msgid "Appearance settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:475
+msgid "Element list:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:497
+msgid "Menu style (requires to save and GUI restart):"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:521
+msgid "Height of map selection popup window (in pixels):"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:545
+msgid "Icon theme (requires GUI restart):"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:575
+msgid "Map Display"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:590
+msgid "Default font for GRASS displays:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:607
+msgid "Default display settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:619
+msgid "Display driver:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:649
+msgid "Statusbar mode:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:669
+#: ../gui/wxpython/nviz/tools.py:348 ../gui/wxpython/nviz/preferences.py:178
+msgid "Background color:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:688
+#: ../gui/wxpython/mapdisp/statusbar.py:435
+msgid "Align region extent based on display size"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:701
+#: ../gui/wxpython/mapdisp/statusbar.py:455
+msgid "Constrain display resolution to computational settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:714
+msgid "Enable auto-rendering"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:727
+msgid "Enable auto-zooming to selected map layer"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:740
+msgid "Mouse wheel action:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:755
+msgid "Mouse scrolling direction:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:780
+msgid "Advanced display settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:786
+msgid "3D view depth buffer (possible values are 16, 24, 32):"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:817
+#: ../gui/wxpython/gmodeler/dialogs.py:136
+#: ../gui/wxpython/gmodeler/dialogs.py:392
+#: ../gui/wxpython/gmodeler/dialogs.py:494
+msgid "Command"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:820
+msgid "Command dialog settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:842
+msgid "Close dialog when command is successfully finished"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:863
+msgid "Allow interactive input"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:873
+msgid "Verbosity level:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:892
+msgid "Raster settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:903
+msgid "Overlay raster maps"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:914
+msgid "Default color table"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:940
+msgid "Vector settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:946
+msgid "Display:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:969
+#: ../gui/wxpython/vdigit/preferences.py:344
+msgid "Attributes"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:977
+msgid "Highlighting"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:983
+#: ../gui/wxpython/psmap/dialogs.py:1776 ../gui/wxpython/psmap/dialogs.py:1879
+#: ../gui/wxpython/nviz/tools.py:1143 ../gui/wxpython/nviz/tools.py:1696
+#: ../gui/wxpython/nviz/tools.py:1817 ../gui/wxpython/nviz/preferences.py:333
+#: ../gui/wxpython/nviz/preferences.py:490
+#: ../gui/wxpython/nviz/preferences.py:544 ../gui/wxpython/gcp/manager.py:2437
+msgid "Color:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:993
+msgid "Line width (in pixels):"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1016
+msgid "Data browser"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1021
+msgid "Left mouse double click:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1033
+msgid "Encoding (e.g. utf-8, ascii, iso8859-1, koi8-r):"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1044
+msgid "Ask when deleting data record(s) from table"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1065
+msgid "Create table"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1099
+#: ../gui/wxpython/mapdisp/statusbar.py:681
+msgid "Projection"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1106
+msgid "Projection statusbar settings"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1115
+msgid ""
+"\n"
+"Note: This only controls the coordinates displayed in the lower-left of the "
+"Map Display\n"
+"window's status bar. It is purely cosmetic and does not affect the working "
+"location's\n"
+"projection in any way. You will need to enable the Projection check box in "
+"the drop-down\n"
+"menu located at the bottom of the Map Display window.\n"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1130
+#: ../gui/wxpython/location_wizard/wizard.py:1269
+msgid "EPSG code:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1147
+msgid "Proj.4 string (required):"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1163
+msgid "EPSG file:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1178
+msgid ""
+"Load EPSG codes (be patient), enter EPSG code or insert Proj.4 string "
+"directly."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1186
+msgid "&Load EPSG codes"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1197
+msgid "Coordinates format"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1206
+msgid "LL projections"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1225
+msgid "Precision:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1264
+#, python-format
+msgid "Unable to read EPSG codes: %s"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1293
+#: ../gui/wxpython/gui_core/preferences.py:1302
+#: ../gui/wxpython/gui_core/preferences.py:1311
+#, python-format
+msgid "EPSG code %s not found"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1319
+msgid "Select default display font"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1344
+msgid "Select output font"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1422
+msgid "Select font:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1446
+msgid "Character encoding:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1464
+#: ../gui/wxpython/psmap/dialogs.py:291 ../gui/wxpython/psmap/dialogs.py:3554
+msgid "Font size:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1562
+msgid "Manage access to mapsets"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1575
+msgid ""
+"Check a mapset to make it accessible, uncheck it to hide it.\n"
+"  Notes:\n"
+"    - The current mapset is always accessible.\n"
+"    - You may only write to the current mapset.\n"
+"    - You may only write to mapsets which you own."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/preferences.py:1650
+msgid "Owner"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:234
+msgid "Click here to show search module engine"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:235
+msgid "Click here to hide search module engine"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:253
+msgid "Output window"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:255
+msgid "Command prompt"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:259
+msgid "Clear output window content"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:261
+msgid "Clear command prompt content"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:263
+msgid "Save output window content to the file"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:265
+msgid "Abort running command"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:268
+msgid "&Log file"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:270
+msgid ""
+"Toggle to save list of executed commands into a file; content saved when "
+"switching off."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:486
+#: ../gui/wxpython/gui_core/goutput.py:793
+#, python-format
+msgid ""
+"Unable to write file '%(filePath)s'.\n"
+"\n"
+"Details: %(error)s"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:524
+#, python-format
+msgid ""
+"Command '%s' not yet implemented in the WxGUI. Try adding it as a command "
+"layer instead."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:571
+#, python-format
+msgid ""
+"Unable to run command:\n"
+"%(cmd)s\n"
+"\n"
+"Option <%(opt)s>: read from standard input is not supported by wxGUI"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:661
+#: ../gui/wxpython/gui_core/goutput.py:811
+msgid "Save file as..."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:663
+#: ../gui/wxpython/gui_core/goutput.py:813
+#, python-format
+msgid "%(txt)s (*.txt)|*.txt|%(files)s (*)|*"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:664
+#: ../gui/wxpython/gui_core/goutput.py:814
+msgid "Text files"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:664
+#: ../gui/wxpython/gui_core/goutput.py:814
+msgid "Files"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:676
+#, python-format
+msgid ""
+"Unable to write file '%(path)s'.\n"
+"\n"
+"Details: %(error)s"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:679
+#, python-format
+msgid "Command output saved into '%s'"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:708
+#: ../gui/wxpython/gui_core/ghelp.py:328
+#, python-format
+msgid "%d modules match"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:798
+#, python-format
+msgid "Command log saved to '%s'"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:853
+#, python-format
+msgid "%d sec"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:856
+#, python-format
+msgid "%(min)d min %(sec)d sec"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:860
+#: ../gui/wxpython/gui_core/ghelp.py:486 ../gui/wxpython/gmodeler/model.py:927
+#: ../gui/wxpython/gmodeler/model.py:994 ../gui/wxpython/lmgr/frame.py:752
+#: ../gui/wxpython/lmgr/frame.py:757
+msgid "unknown"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:864
+msgid ""
+"Please note that the data are left in inconsistent state and may be corrupted"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:866
+msgid "Command aborted"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:868
+msgid "Command finished"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/goutput.py:1356
+#: ../gui/wxpython/gmodeler/frame.py:186
+msgid "Python script contains local modifications"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:57 ../gui/wxpython/gui_core/ghelp.py:65
+msgid "description"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:58 ../gui/wxpython/gui_core/ghelp.py:67
+msgid "command"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:59 ../gui/wxpython/gui_core/ghelp.py:66
+msgid "keywords"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:62
+msgid "Find module(s)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:134 ../gui/wxpython/gui_core/ghelp.py:167
+#, python-format
+msgid "%d modules found"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:202
+msgid "Menu tree (double-click to run command)"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:212
+msgid "Run selected command"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:273
+msgid "You must run this command from the menu or command line"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:275 ../gui/wxpython/core/gcmd.py:144
+#: ../gui/wxpython/lmgr/frame.py:1828 ../gui/wxpython/gis_set.py:539
+#: ../gui/wxpython/gis_set.py:575
+msgid "Message"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:385 ../gui/wxpython/menustrings.py:853
+#: ../gui/wxpython/menustrings.py:854
+msgid "About GRASS GIS"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:418
+msgid "Official GRASS site:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:429
+msgid "SVN Revision"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:440 ../gui/wxpython/lmgr/frame.py:775
+msgid "GIS Library Revision"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:478 ../gui/wxpython/gui_core/ghelp.py:711
+msgid "Language"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:498
+msgid "Info"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:499
+msgid "Copyright"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:500
+msgid "License"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:501
+msgid "Authors"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:502
+msgid "Contributors"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:503
+msgid "Extra contributors"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:504
+msgid "Translators"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:538 ../gui/wxpython/gui_core/ghelp.py:562
+#: ../gui/wxpython/gui_core/ghelp.py:585 ../gui/wxpython/gui_core/ghelp.py:640
+#: ../gui/wxpython/gui_core/ghelp.py:699
+#, python-format
+msgid "%s file missing"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:627 ../gui/wxpython/gui_core/ghelp.py:686
+#, python-format
+msgid "Error when reading file '%s'."
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:628 ../gui/wxpython/gui_core/ghelp.py:687
+msgid "Lines:"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:645 ../gui/wxpython/gui_core/ghelp.py:647
+#: ../gui/wxpython/gui_core/ghelp.py:707
+#: ../gui/wxpython/gmodeler/dialogs.py:391
+#: ../gui/wxpython/gmodeler/dialogs.py:493
+#: ../gui/wxpython/gmodeler/frame.py:1314
+#: ../gui/wxpython/gmodeler/frame.py:1357
+#: ../gui/wxpython/gmodeler/frame.py:1459
+msgid "Name"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:645 ../gui/wxpython/gui_core/ghelp.py:647
+#: ../gui/wxpython/gui_core/ghelp.py:709
+msgid "E-mail"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:647
+msgid "Country"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:647
+msgid "OSGeo_ID"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:858
+msgid "&Next"
+msgstr ""
+
+#: ../gui/wxpython/gui_core/ghelp.py:861
+msgid "&Previous"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:145
+msgid "Loading data..."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:152
+#, python-format
+msgid ""
+"Attribute table <%s> not found. For creating the table switch to 'Manage "
+"layers' tab."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:163
+#, python-format
+msgid "Column <%(column)s> not found in in the table <%(table)s>."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:232
+msgid "Can display only 256 columns."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:247
+#, python-format
+msgid "Inconsistent number of columns in the table <%(table)s>."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:257
+msgid "Viewing limit: 100000 records."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:274 ../gui/wxpython/dbmgr/manager.py:828
+#: ../gui/wxpython/dbmgr/manager.py:1162 ../gui/wxpython/dbmgr/manager.py:1828
+#: ../gui/wxpython/dbmgr/manager.py:1850 ../gui/wxpython/dbmgr/manager.py:1997
+#, python-format
+msgid "Number of loaded records: %d"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:298
+msgid "Unknown value"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:304
+msgid "Unable to decode value. Set encoding in GUI preferences ('Attributes')."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:313
+#, python-format
+msgid ""
+"Error loading attribute data. Record number: %(rec)d. Unable to convert "
+"value '%(val)s' in key column (%(key)s) to integer.\n"
+"\n"
+"Details: %(detail)s"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:395
+msgid "Sort ascending"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:396
+msgid "Sort descending"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:399
+msgid "Calculate (only numeric columns)"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:405
+msgid "Area size"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:406
+msgid "Line length"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:407
+msgid "Compactness of an area"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:408
+msgid "Fractal dimension of boundary defining a polygon"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:409
+msgid "Perimeter length of an area"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:410
+msgid "Number of features for each category"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:411
+msgid "Slope steepness of 3D line"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:412
+msgid "Line sinuousity"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:413
+msgid "Line azimuth"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:572 ../gui/wxpython/dbmgr/manager.py:3110
+msgid "GRASS GIS Attribute Table Manager"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:602
+#, python-format
+msgid ""
+"Database connection for vector map <%s> is not defined in DB file. You can "
+"define new connection in 'Manage layers' tab."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:628
+msgid "Browse data"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:634
+msgid "Manage tables"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:642
+msgid "Manage layers"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:659
+msgid "Close Attribute Table Manager"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:661
+msgid "Reload attribute data (selected layer only)"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:691
+msgid "Attribute data - right-click to edit/manage records"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:704 ../gui/wxpython/dbmgr/manager.py:844
+#: ../gui/wxpython/dbmgr/manager.py:2321 ../gui/wxpython/dbmgr/manager.py:2451
+#: ../gui/wxpython/dbmgr/manager.py:2705
+msgid "Table"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:706 ../gui/wxpython/dbmgr/manager.py:846
+#: ../gui/wxpython/dbmgr/manager.py:1016
+msgid " (readonly)"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:714
+msgid "SQL Query"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:733
+msgid "Apply SELECT statement and reload data records"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:735 ../gui/wxpython/dbmgr/manager.py:2054
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:454
+msgid "SQL Builder"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:739
+msgid "Simple"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:742
+msgid "Advanced"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:756 ../gui/wxpython/dbmgr/manager.py:762
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:108
+#, python-format
+msgid "Example: %s"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:857 ../gui/wxpython/dbmgr/sqlbuilder.py:87
+msgid "Database connection"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:869
+#, python-format
+msgid "Table <%s> - right-click to delete column(s)"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:880
+#: ../gui/wxpython/modules/colorrules.py:979
+msgid "Add column"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:888 ../gui/wxpython/dbmgr/manager.py:939
+msgid "Column"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:903
+#: ../gui/wxpython/gmodeler/preferences.py:207
+msgid "Type"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:915
+msgid "Length"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:931 ../gui/wxpython/menustrings.py:838
+msgid "Rename column"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:951
+#: ../gui/wxpython/gmodeler/dialogs.py:265
+msgid "To"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:958
+msgid "&Rename"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1014
+msgid "Layers of vector map"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1027
+msgid "List of layers"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1127 ../gui/wxpython/core/settings.py:702
+msgid "Edit selected record"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1131 ../gui/wxpython/dbmgr/manager.py:1381
+msgid "Insert new record"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1132
+msgid "Delete selected record(s)"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1133
+msgid "Delete all records"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1142
+msgid "Highlight selected features"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1143
+msgid "Highlight selected features and zoom"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1147 ../gui/wxpython/dbmgr/manager.py:2096
+msgid "Extract selected features"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1148
+msgid "Delete selected features"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1156 ../gui/wxpython/dbmgr/manager.py:1680
+#: ../gui/wxpython/gmodeler/dialogs.py:731
+#: ../gui/wxpython/gmodeler/dialogs.py:906
+#: ../gui/wxpython/vdigit/dialogs.py:278
+msgid "Reload"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1188
+#, python-format
+msgid ""
+"Selected data records (%d) will be permanently deleted from table. Do you "
+"want to delete them?"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1191 ../gui/wxpython/dbmgr/manager.py:1237
+#: ../gui/wxpython/gmodeler/dialogs.py:851
+msgid "Delete records"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1234
+#, python-format
+msgid ""
+"All data records (%d) will be permanently deleted from table. Do you want to "
+"delete them?"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1392
+#, python-format
+msgid "Record with category number %d already exists in the table."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1402
+#, python-format
+msgid "Category number (column %s) is missing."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1416 ../gui/wxpython/dbmgr/manager.py:1525
+#, python-format
+msgid "Value '%(value)s' needs to be entered as %(type)s."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1427
+#, python-format
+msgid ""
+"Unable to insert new record.\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1498
+msgid "Update existing record"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1538
+#, python-format
+msgid ""
+"Unable to update existing record.\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1624
+msgid "Unable to rename column. No column name defined."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1632
+#, python-format
+msgid ""
+"Unable to rename column <%(column)s> to <%(columnTo)s>. Column already "
+"exists in the table <%(table)s>."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1648
+#, python-format
+msgid ""
+"Unable to rename column. Column <%(column)s> doesn't exist in the table <"
+"%(table)s>."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1675
+msgid "Drop selected column"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1678
+msgid "Drop all columns"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1693
+#, python-format
+msgid ""
+"Selected column '%s' will PERMANENTLY removed from table. Do you want to "
+"drop the column?"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1696 ../gui/wxpython/dbmgr/manager.py:1733
+msgid "Drop column(s)"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1730
+#, python-format
+msgid ""
+"Selected columns\n"
+"%s\n"
+"will PERMANENTLY removed from table. Do you want to drop the columns?"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1768
+msgid "Unable to add column to the table. No column name defined."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1789
+#, python-format
+msgid "Column <%(column)s> already exists in table <%(table)s>."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1959 ../gui/wxpython/dbmgr/manager.py:1982
+#, python-format
+msgid ""
+"Loading attribute data failed.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:1970
+#, python-format
+msgid ""
+"Loading attribute data failed.\n"
+"Invalid SQL select statement.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2092
+msgid "Nothing to extract."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2122
+msgid "Nothing to delete."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2212 ../gui/wxpython/dbmgr/manager.py:2627
+#: ../gui/wxpython/dbmgr/manager.py:3047
+#, python-format
+msgid "Drop also linked attribute table (%s)"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2267
+msgid "Column name"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2267
+#: ../gui/wxpython/gmodeler/frame.py:1314
+#: ../gui/wxpython/gmodeler/frame.py:1364
+msgid "Data type"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2267
+msgid "Data length"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2321 ../gui/wxpython/dbmgr/manager.py:2434
+#: ../gui/wxpython/dbmgr/manager.py:2685 ../gui/wxpython/dbmgr/dialogs.py:483
+#: ../gui/wxpython/vdigit/dialogs.py:111 ../gui/wxpython/vdigit/dialogs.py:555
+#: ../gui/wxpython/vdigit/preferences.py:362
+#: ../gui/wxpython/vdigit/preferences.py:364
+msgid "Layer"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2321 ../gui/wxpython/dbmgr/manager.py:2440
+#: ../gui/wxpython/dbmgr/manager.py:2693
+msgid "Driver"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2321
+msgid "Key"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2397
+msgid ""
+"Unknown default DB connection. Please define DB connection using db.connect "
+"module."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2416
+msgid "Add layer"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2426
+msgid "Layer description"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2456 ../gui/wxpython/dbmgr/manager.py:2494
+#: ../gui/wxpython/dbmgr/manager.py:2711
+msgid "Key column"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2461
+msgid "Insert record for each category into table"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2476
+msgid "You need to add categories by v.category module."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2481
+msgid "Table description"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2489
+msgid "Table name"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2502
+msgid "&Create table"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2506
+msgid "&Add layer"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2510
+msgid "&Set default"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2610
+msgid "Remove layer"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2613
+msgid "Layer to remove"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2634
+msgid "&Remove layer"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2678
+msgid "Modify layer"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2750
+msgid "&Modify layer"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2798
+msgid ""
+"Unable to get list of tables.\n"
+"Please use db.connect to set database parameters."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2895
+msgid "Unable to create new table. Table name or key column name is missing."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2901
+#, python-format
+msgid "Unable to create new table. Table <%s> already exists in the database."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/manager.py:2938
+#, python-format
+msgid ""
+"Unable to add new layer to vector map <%(vector)s>. Layer %(layer)d already "
+"exists."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:68
+#, python-format
+msgid "GRASS SQL Builder (%(type)s): vector map <%(map)s>"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:75
+msgid "SQL statement not verified"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:99 ../gui/wxpython/menustrings.py:820
+msgid "Query"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:117
+msgid "Set SQL statement to default"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:119
+msgid "Verify"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:120
+msgid "Verify SQL statement"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:122
+msgid "Apply SQL statement and close the dialog"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:124
+msgid "Close the dialog"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:173
+msgid "Columns"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:183
+msgid "Add on double-click"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:184
+msgid "columns"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:184
+msgid "values"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:195
+msgid "Values"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:204
+msgid "Get all values"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:207
+msgid "Get sample"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:227
+msgid "Close dialog on apply"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:423
+msgid "SQL statement is not valid"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:425
+#, python-format
+msgid ""
+"SQL statement is not valid.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:427
+msgid "SQL statement is valid"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:71
+#, python-format
+msgid ""
+"No attribute table found.\n"
+"\n"
+"Do you want to create a new attribute table and defined a link to vector map "
+"<%s>?"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:74
+msgid "Create table?"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:94
+msgid "Close dialog on submit"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:106
+msgid "No attributes found"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:112 ../gui/wxpython/menustrings.py:650
+msgid "Update attributes"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:114
+msgid "Define attributes"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:116
+msgid "Display attributes"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:120
+msgid "&Reload"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:121 ../gui/wxpython/dbmgr/dialogs.py:587
+msgid "&Submit"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:139 ../gui/wxpython/vdigit/dialogs.py:166
+msgid "Feature id:"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:226
+#, python-format
+msgid "Column <%(col)s>: Value '%(value)s' needs to be entered as %(type)s."
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:426
+msgid "Unknown"
+msgstr ""
+
+#: ../gui/wxpython/dbmgr/dialogs.py:484 ../gui/wxpython/dbmgr/dialogs.py:602
+#: ../gui/wxpython/vdigit/dialogs.py:118 ../gui/wxpython/vdigit/dialogs.py:556
+#: ../gui/wxpython/vdigit/preferences.py:362
+msgid "Category"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:36
+msgid "Set default region extent and resolution"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:83
+msgid "&Set region"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:113
+msgid "Invalid location selected."
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:130
+msgid "Invalid region"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:160
+msgid "Click here to show 3D settings"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:161
+msgid "Click here to hide 3D settings"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:184
+#: ../gui/wxpython/location_wizard/dialogs.py:465
+#, python-format
+msgid "Rows: %d"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:185
+#: ../gui/wxpython/location_wizard/dialogs.py:466
+#, python-format
+msgid "Cols: %d"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:186
+#: ../gui/wxpython/location_wizard/dialogs.py:467
+#, python-format
+msgid "Cells: %d"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:227
+#: ../gui/wxpython/location_wizard/dialogs.py:469
+#, python-format
+msgid "Depth: %d"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:228
+#: ../gui/wxpython/location_wizard/dialogs.py:470
+#, python-format
+msgid "3D Cells: %d"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:231
+#: ../gui/wxpython/psmap/dialogs.py:384
+msgid "Top"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:239
+#: ../gui/wxpython/psmap/dialogs.py:384
+msgid "Bottom"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:247
+msgid "T-B resolution"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:310
+msgid "North"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:318
+msgid "West"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:338
+msgid "East"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:347
+msgid "South"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:351
+msgid "N-S resolution"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:359
+msgid "E-W resolution"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:437
+#, python-format
+msgid "Invalid value: %s"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:521
+msgid "Select datum transformation"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/dialogs.py:546
+msgid "Select from list of datum transformations"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:94
+msgid "Define GRASS Database and Location Name"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:111
+#: ../gui/wxpython/gis_set.py:113
+msgid "GIS Data Directory:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:127
+msgid "Project Location"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:128
+msgid "Name of location directory in GIS Data Directory"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:139
+msgid "Location Title"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:140
+msgid "Optional location title, you can leave this field blank."
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:159
+#, python-format
+msgid ""
+"Name <%(name)s> is not a valid name for location. Please use only ASCII "
+"characters excluding %(chars)s and space."
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:162
+msgid "Invalid location name"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:177
+msgid "Choose GRASS data directory:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:188
+#: ../gui/wxpython/location_wizard/wizard.py:1994
+msgid "Location already exists in GRASS Database."
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:192
+msgid "Unable to create location"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:205
+msgid ""
+"Title of the location is limited only to one line and 256 characters. The "
+"rest of the text will be ignored."
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:212
+msgid "Choose method for creating a new location"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:219
+msgid "Select coordinate system parameters from a list"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:222
+msgid "Select EPSG code of spatial reference system"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:224
+msgid "Read projection and datum terms from a georeferenced data file"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:227
+msgid "Read projection and datum terms from a Well Known Text (WKT) .prj file"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:230
+msgid "Specify projection and datum terms using custom PROJ.4 parameters"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:233
+msgid "Create a generic Cartesian coordinate system (XY)"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:334
+msgid "Choose projection"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:350
+#: ../gui/wxpython/location_wizard/wizard.py:851
+#: ../gui/wxpython/location_wizard/wizard.py:1017
+#: ../gui/wxpython/location_wizard/wizard.py:1285
+msgid "Code"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:350
+#: ../gui/wxpython/location_wizard/wizard.py:851
+#: ../gui/wxpython/location_wizard/wizard.py:1017
+#: ../gui/wxpython/location_wizard/wizard.py:1285
+#: ../gui/wxpython/gmodeler/frame.py:1315
+#: ../gui/wxpython/gmodeler/frame.py:1377
+msgid "Description"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:355
+msgid "Projection code:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:363
+#: ../gui/wxpython/location_wizard/wizard.py:865
+#: ../gui/wxpython/location_wizard/wizard.py:1030
+msgid "Search in description:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:537
+#, python-format
+msgid "Unable to read list: %s"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:640
+msgid "Choose projection parameters"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:656
+msgid "Select datum or ellipsoid (next page)"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:662
+msgid "Datum with associated ellipsoid"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:665
+msgid "Ellipsoid only"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:722
+#, python-format
+msgid "You must enter a value for %s"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:734
+#: ../gui/wxpython/location_wizard/wizard.py:752
+#, python-format
+msgid " Enter parameters for %s projection "
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:775
+msgid "No"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:775
+msgid "Yes"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:829
+msgid "Specify geodetic datum"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:851
+msgid "Ellipsoid"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:856
+msgid "Datum code:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:994
+msgid "Specify ellipsoid"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1022
+msgid "Ellipsoid code:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1111
+#: ../gui/wxpython/location_wizard/wizard.py:1171
+msgid "Select georeferenced file"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1116
+msgid "Georeferenced file:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1185
+#: ../gui/wxpython/location_wizard/wizard.py:1242
+msgid "Select Well Known Text (WKT) .prj file"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1190
+msgid "WKT .prj file:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1259
+msgid "Choose EPSG Code"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1267
+msgid "Path to the EPSG-codes file:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1285
+msgid "Parameters"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1422
+msgid "Choose EPSG codes file"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1451
+#, python-format
+msgid "Unable to read EPGS codes: %s"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1469
+msgid "Choose method of specifying georeferencing parameters"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1477
+msgid "Enter PROJ.4 parameters string:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1532
+#: ../gui/wxpython/location_wizard/wizard.py:1536
+msgid "Datum transform is required."
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1571
+msgid "Summary"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1616
+msgid "GRASS Database:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1622
+msgid "Location Name:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1628
+msgid "Location Title:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1634
+msgid "Projection:"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1640
+msgid ""
+"PROJ.4 definition:\n"
+" (non-definitive)"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1730
+#: ../gui/wxpython/psmap/dialogs.py:506 ../gui/wxpython/psmap/dialogs.py:527
+msgid "custom"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1740
+#, python-format
+msgid "Do you want to create GRASS location <%s>?"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1741
+msgid "Create new location?"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1785
+msgid "Define new GRASS Location"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1877
+#, python-format
+msgid ""
+"Unable to create new location. Location <%(loc)s> not created.\n"
+"\n"
+"Details: %(err)s"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1885
+msgid "Location wizard canceled. Location not created."
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:1992
+msgid "Unable to create new location"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:2011
+#, python-format
+msgid ""
+"Location <%(loc)s> will be created in GIS data directory <%(dir)s>. You will "
+"need to change the default GIS data directory in the GRASS startup screen."
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:2016
+msgid "New GIS data directory"
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:2047
+msgid "EPSG code missing."
+msgstr ""
+
+#: ../gui/wxpython/location_wizard/wizard.py:2058
+#: ../gui/wxpython/location_wizard/wizard.py:2067
+#, python-format
+msgid "File <%s> not found."
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:133
+#, python-format
+msgid ""
+"Unable to open file\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:460
+#, python-format
+msgid "Instruction file will be loaded with following region: %s\n"
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:465
+#, python-format
+msgid ""
+"Region cannot be set\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:604
+#: ../gui/wxpython/psmap/instructions.py:754
+#: ../gui/wxpython/psmap/instructions.py:870
+#: ../gui/wxpython/psmap/instructions.py:928
+#: ../gui/wxpython/psmap/instructions.py:1069
+#: ../gui/wxpython/psmap/instructions.py:1124
+#: ../gui/wxpython/psmap/instructions.py:1183
+#: ../gui/wxpython/psmap/instructions.py:1252
+#: ../gui/wxpython/psmap/instructions.py:1358
+#: ../gui/wxpython/psmap/instructions.py:1483
+#: ../gui/wxpython/psmap/instructions.py:1534
+#, python-format
+msgid "Failed to read instruction %s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:618
+#, python-format
+msgid ""
+"Scale has changed, old value: %(old)s\n"
+"new value: %(new)s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:621
+#, python-format
+msgid ""
+"Failed to read instruction %s.\n"
+"Use 1:25000 notation."
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:629
+#, python-format
+msgid ""
+"Map frame position changed, old value: %(old1)s %(old2)s\n"
+"new value: %(new1)s %(new2)s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:637
+#, python-format
+msgid ""
+"Map frame size changed, old value: %(old1)s %(old2)s\n"
+"new value: %(new1)s %(new2)s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:684
+#, python-format
+msgid ""
+"Failed to read instruction %(file)s.\n"
+"Unknown format %(for)s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:697
+#, python-format
+msgid "Failed to read instruction %s."
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:811
+#: ../gui/wxpython/psmap/instructions.py:1693
+#, python-format
+msgid ""
+"Characters on position %s are not supported by ISO-8859-1 (Latin 1) encoding "
+"which is required by module ps.map."
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:815
+#: ../gui/wxpython/psmap/instructions.py:1697
+msgid ""
+"Not all characters are supported by ISO-8859-1 (Latin 1) encoding which is "
+"required by module ps.map."
+msgstr ""
+
+#: ../gui/wxpython/psmap/instructions.py:931
+#, python-format
+msgid "Failed to read instruction %(inst)s: file %(file)s not found."
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:52
+msgid "Generate text file with mapping instructions"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:54
+msgid "Load text file with mapping instructions"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:56
+msgid "Generate PostScript output"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:58
+msgid "Generate PDF output"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:60
+#: ../gui/wxpython/modules/histogram.py:443
+#: ../gui/wxpython/mapdisp/frame.py:605 ../gui/wxpython/wxplot/base.py:483
+#: ../gui/wxpython/gcp/mapdisplay.py:485
+msgid "Page setup"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:61
+msgid "Specify paper size, margins and orientation"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:63
+msgid "Full extent"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:64
+msgid "Zoom to full extent"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:66 ../gui/wxpython/psmap/dialogs.py:618
+#: ../gui/wxpython/psmap/dialogs.py:673
+msgid "Map frame"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:67
+msgid "Click and drag to place map frame"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:69
+msgid "Delete selected object"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:71
+msgid "Show preview"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:73
+msgid "Quit Cartographic Composer"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:75 ../gui/wxpython/psmap/dialogs.py:3704
+#: ../gui/wxpython/psmap/dialogs.py:3709
+msgid "Text"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:77
+msgid "Map info"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:79 ../gui/wxpython/wxplot/dialogs.py:576
+#: ../gui/wxpython/wxplot/dialogs.py:618
+msgid "Legend"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:81 ../gui/wxpython/nviz/tools.py:1895
+msgid "Scale bar"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:83 ../gui/wxpython/psmap/dialogs.py:4060
+#: ../gui/wxpython/psmap/dialogs.py:4108
+msgid "Image"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:85 ../gui/wxpython/psmap/dialogs.py:4493
+#: ../gui/wxpython/mapdisp/toolbars.py:35 ../gui/wxpython/nviz/tools.py:1853
+msgid "North Arrow"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:87
+msgid "Add simple graphics"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:89 ../gui/wxpython/psmap/dialogs.py:4525
+#: ../gui/wxpython/vdigit/preferences.py:516
+msgid "Point"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:91
+#: ../gui/wxpython/vdigit/preferences.py:517
+msgid "Line"
+msgstr ""
+
+#: ../gui/wxpython/psmap/toolbars.py:93
+msgid "Rectangle"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:197
+msgid "Units:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:206
+msgid ""
+"Position of the top left corner\n"
+"from the top left edge of the paper"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:207
+msgid "X:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:208
+msgid "Y:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:220
+msgid "Position is given:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:221
+msgid "relative to paper"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:222
+msgid "by map coordinates"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:238
+msgid ""
+"Position from the top left\n"
+"edge of the paper"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:290
+msgid "Font:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:304
+msgid "Choose color:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:352
+msgid "Close dialog and apply changes"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:358 ../gui/wxpython/vdigit/dialogs.py:142
+msgid "Apply changes"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:383
+msgid "Units"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:383
+msgid "Format"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:383
+msgid "Orientation"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:383 ../gui/wxpython/psmap/dialogs.py:2084
+msgid "Width"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:383
+msgid "Height"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:384
+msgid "Left"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:384
+msgid "Right"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:439
+msgid "Literal is not allowed!"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:439 ../gui/wxpython/psmap/dialogs.py:1034
+#: ../gui/wxpython/psmap/dialogs.py:1056 ../gui/wxpython/psmap/dialogs.py:1106
+#: ../gui/wxpython/psmap/dialogs.py:3636
+msgid "Invalid input"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:448
+msgid "Page size"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:450
+msgid "Margins"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:454
+msgid "Portrait"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:454
+msgid "Landscape"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:556
+msgid "Map settings"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:562
+msgid "Map frame settings"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:679
+msgid "Map frame options:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:680
+msgid "fit frame to match selected map"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:681
+msgid "fit frame to match saved region"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:682
+msgid "fit frame to match current computational region"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:683
+msgid "fixed scale and map center"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:691 ../gui/wxpython/psmap/dialogs.py:859
+msgid "Map selection"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:699 ../gui/wxpython/psmap/dialogs.py:1283
+msgid "Map:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:699
+msgid "Region:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:718
+msgid "Map scale and center"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:723
+msgid "Center:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:724
+msgid "E:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:725
+msgid "N:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:728 ../gui/wxpython/psmap/dialogs.py:4165
+msgid "Scale:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:729
+msgid "1 :"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:749
+msgid "Map max resolution (dpi):"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:762 ../gui/wxpython/psmap/dialogs.py:2653
+msgid "Border"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:766
+msgid "draw border around map frame"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:772
+msgid "border color:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:773
+msgid "border width (pts):"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:867
+msgid ""
+"Region is set to match this map,\n"
+"raster or vector map must be added later"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:874
+msgid "Region selection"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1033
+msgid "No map selected!"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1055
+msgid "No region selected!"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1105
+msgid "Invalid scale or map center!"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1143 ../gui/wxpython/nviz/tools.py:648
+#: ../gui/wxpython/nviz/mapwindow.py:1630
+msgid "Raster map"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1165
+msgid "Choose raster map"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1169
+msgid "no raster map"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1170
+msgid "raster:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1210 ../gui/wxpython/psmap/frame.py:580
+#: ../gui/wxpython/psmap/frame.py:603
+msgid "Please, create map frame first."
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1270 ../gui/wxpython/gmodeler/model.py:668
+msgid "Vector maps"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1279
+msgid "Add map"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1287 ../gui/wxpython/psmap/dialogs.py:1651
+msgid "points"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1287 ../gui/wxpython/psmap/dialogs.py:1653
+msgid "lines"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1287
+msgid "areas"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1289
+msgid "Data Type"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1292
+msgid "Add"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1304
+msgid "Manage vector maps"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1312
+msgid "The topmost vector map overlaps the others"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1314 ../gui/wxpython/psmap/dialogs.py:2636
+msgid "Up"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1315 ../gui/wxpython/psmap/dialogs.py:2637
+msgid "Down"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1316 ../gui/wxpython/menustrings.py:163
+#: ../gui/wxpython/nviz/tools.py:1094 ../gui/wxpython/nviz/tools.py:1883
+msgid "Delete"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1317
+msgid "Properties..."
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1517
+msgid "Raster map settings"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1554
+msgid "Vector maps settings"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1589
+#, python-format
+msgid "%s properties"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1640
+msgid "Data selection"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1647
+msgid "Feature type"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1651
+msgid "centroids"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1653
+msgid "boundaries"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1669
+msgid "Layer selection"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1675
+msgid "Database connection is not defined in DB file."
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1676
+msgid "Select layer:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1699
+msgid "list of categories (e.g. 1,3,5-7)"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1726 ../gui/wxpython/menustrings.py:312
+#: ../gui/wxpython/nviz/tools.py:786 ../gui/wxpython/nviz/tools.py:2271
+msgid "Mask"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1729
+msgid "Use current mask"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1746 ../gui/wxpython/psmap/dialogs.py:1845
+msgid "Colors"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1751 ../gui/wxpython/psmap/dialogs.py:1850
+msgid "Outline"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1755 ../gui/wxpython/psmap/dialogs.py:1859
+msgid "draw outline"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1758 ../gui/wxpython/psmap/dialogs.py:1863
+#: ../gui/wxpython/psmap/dialogs.py:3749 ../gui/wxpython/psmap/dialogs.py:3754
+msgid "Width (pts):"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1795 ../gui/wxpython/psmap/dialogs.py:1899
+#: ../gui/wxpython/wxplot/dialogs.py:610
+msgid "Fill"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1799
+msgid "fill color"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1802 ../gui/wxpython/psmap/dialogs.py:1905
+msgid "choose color:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1814 ../gui/wxpython/psmap/dialogs.py:1918
+msgid "color from map table column:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1861
+msgid "No effect for fill color from table column"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1903
+msgid "Color of lines:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1948 ../gui/wxpython/psmap/dialogs.py:2079
+#: ../gui/wxpython/psmap/dialogs.py:2148
+msgid "Size and style"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1953 ../gui/wxpython/gcp/manager.py:2396
+#: ../gui/wxpython/vdigit/preferences.py:80
+msgid "Symbology"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1958 ../gui/wxpython/nviz/tools.py:1371
+msgid "symbol:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1967
+msgid "eps file:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1971 ../gui/wxpython/psmap/dialogs.py:2160
+msgid "Type filename or click browse to choose file"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1972 ../gui/wxpython/psmap/dialogs.py:2161
+msgid "Choose a file"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:1995 ../gui/wxpython/psmap/dialogs.py:2706
+#: ../gui/wxpython/psmap/dialogs.py:3470 ../gui/wxpython/wxplot/dialogs.py:601
+msgid "Size"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2000 ../gui/wxpython/nviz/tools.py:1321
+msgid "size:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2002
+msgid "size from map table column:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2004
+msgid "scale:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2036
+msgid "Rotation"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2042
+msgid "rotate symbols:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2043
+msgid "counterclockwise in degrees:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2045
+msgid "from map table column:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2088
+msgid "Set width (pts):"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2097
+msgid "multiply width by category value"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2114 ../gui/wxpython/psmap/dialogs.py:4896
+#: ../gui/wxpython/wxplot/dialogs.py:567
+msgid "Line style"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2118
+msgid "Choose line style:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2128
+msgid "Choose linecap:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2153
+msgid "Pattern"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2158
+msgid "use pattern:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2159
+msgid "Choose pattern file:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2163
+msgid "pattern line width (pts):"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2165
+msgid "pattern scale factor:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2481
+msgid "Raster legend"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2485
+msgid "Show raster legend"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2491
+msgid "Source raster"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2496
+msgid "current raster"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2497
+msgid "select raster"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2504 ../gui/wxpython/psmap/dialogs.py:3189
+#, python-format
+msgid "%(rast)s: type %(type)s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2523
+msgid "Type of legend"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2527
+msgid "discrete legend (categorical maps)"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2529
+msgid "continuous color gradient legend (floating point map)"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2540
+msgid "Advanced legend settings"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2544
+msgid "draw \"no data\" box"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2550
+msgid "draw ticks across color table"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2561
+#: ../gui/wxpython/modules/colorrules.py:834
+#: ../gui/wxpython/modules/colorrules.py:1450
+#: ../gui/wxpython/modules/colorrules.py:1453
+msgid "range"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2598
+msgid "Vector legend"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2602
+msgid "Show vector legend"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2608
+msgid "Source vector maps"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2614
+msgid "Choose vector maps and their order in legend"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2618 ../gui/wxpython/nviz/tools.py:1173
+msgid "Vector map"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2619
+msgid "Label"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2638 ../gui/wxpython/psmap/dialogs.py:2944
+msgid "Edit label"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2657
+msgid "draw border around legend"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2694
+msgid "Size and position"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2704 ../gui/wxpython/psmap/dialogs.py:3245
+#: ../gui/wxpython/psmap/dialogs.py:3440 ../gui/wxpython/psmap/dialogs.py:3814
+#: ../gui/wxpython/psmap/dialogs.py:3818 ../gui/wxpython/psmap/dialogs.py:4220
+#: ../gui/wxpython/psmap/dialogs.py:4225 ../gui/wxpython/psmap/dialogs.py:4678
+#: ../gui/wxpython/psmap/dialogs.py:4683 ../gui/wxpython/nviz/tools.py:853
+#: ../gui/wxpython/nviz/tools.py:1583
+msgid "Position"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2728
+msgid "Leave the edit field empty, to use default values."
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2750
+msgid ""
+"Width of the color symbol (for lines)\n"
+"in front of the legend text"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2756 ../gui/wxpython/psmap/dialogs.py:2861
+msgid "Columns:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2760
+msgid "column span:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2762
+msgid ""
+"Column separation distance between the left edges\n"
+"of two columns in a multicolumn legend"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2944
+msgid "Edit legend label:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2985
+msgid "No raster map selected!"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:2986
+msgid "No raster"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3220
+msgid "Mapinfo settings"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3282
+msgid "Color settings"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3288
+msgid "use border color:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3289
+msgid "use background color:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3429
+msgid ""
+"Units of current projection are not supported,\n"
+" meters will be used!"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3430
+msgid "Unsupported units"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3475
+msgid "Length:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3479
+msgid "Scalebar length is given in map units"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3482
+msgid "Scalebar height is real height on paper"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3484
+msgid "default"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3523 ../gui/wxpython/wxplot/dialogs.py:625
+msgid "Style"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3528
+msgid "Type:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3544
+msgid "Number of segments:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3548
+msgid "Label every "
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3549
+msgid "segments"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3558
+msgid "transparent text background"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3635
+msgid "Length of scale bar is not defined"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3738
+msgid "Text effects"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3743
+msgid "text background"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3746
+msgid "highlight"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3751
+msgid "text border"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3828
+msgid "Offset"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3831
+msgid "horizontal (pts):"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3832
+msgid "vertical (pts):"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3845
+msgid " Reference point"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3871
+msgid "Text rotation"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3874
+msgid "rotate text (counterclockwise)"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:3950
+msgid "No text entered!"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4118 ../gui/wxpython/nviz/tools.py:474
+msgid "Choose a directory:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4119
+msgid "Choose a directory with images"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4151
+msgid "Note: only EPS format supported"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4160
+msgid "Scale And Rotation"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4191 ../gui/wxpython/psmap/dialogs.py:4653
+msgid "Rotation angle (deg):"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4200 ../gui/wxpython/psmap/dialogs.py:4662
+msgid "Counterclockwise rotation in degrees"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4298
+msgid ""
+"PIL\n"
+"missing"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4318
+#, python-format
+msgid "Unable to read file %s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4377
+#, python-format
+msgid "size: %(width)s x %(height)s pts"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4399
+msgid "No image selected."
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4496
+msgid "North Arrow settings"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4507
+msgid "Compute convergence"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4563
+msgid "Symbol"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4569
+msgid "Select symbol:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4583
+msgid ""
+"Note: Selected symbol is not displayed\n"
+"in draft mode (only in preview mode)"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4596 ../gui/wxpython/psmap/dialogs.py:4851
+#: ../gui/wxpython/gmodeler/preferences.py:88
+#: ../gui/wxpython/gmodeler/preferences.py:326
+#: ../gui/wxpython/nviz/tools.py:785 ../gui/wxpython/nviz/tools.py:2270
+#: ../gui/wxpython/wxplot/dialogs.py:595
+msgid "Color"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4601 ../gui/wxpython/psmap/dialogs.py:4855
+msgid "Outline color:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4616 ../gui/wxpython/psmap/dialogs.py:4876
+msgid "Fill color:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4639
+msgid "Size and Rotation"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4644
+msgid "Size (pt):"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4646
+msgid "Symbol size in points"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4820
+msgid "Rectangle settings"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4822
+msgid "Line settings"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4899 ../gui/wxpython/gcp/manager.py:2528
+msgid "Line width:"
+msgstr ""
+
+#: ../gui/wxpython/psmap/dialogs.py:4908
+msgid "Line width in points"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:51
+msgid "GRASS GIS Cartographic Composer (experimental prototype)"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:180
+msgid ""
+"Python Imaging Library is not available.\n"
+"'Preview' functionality won't work."
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:232
+msgid "Program ps2pdf is not available. Please install it first to create PDF."
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:276
+msgid "Generating PDF..."
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:278
+msgid "Generating PostScript..."
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:280
+msgid "Generating preview..."
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:290
+#, python-format
+msgid "Ps.map exited with return code %s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:320
+#, python-format
+msgid "%(prg)s exited with return code %(code)s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:323
+msgid "PDF generated"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:326
+#, python-format
+msgid ""
+"Program ps2pdf is not available. Please install it to create PDF.\n"
+"\n"
+" %s"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:329
+msgid "PostScript file generated"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:335
+msgid "Generating preview, wait please"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:349
+msgid "Preview not available"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:350
+msgid "Preview is not available probably due to missing Ghostscript."
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:352
+msgid "Please follow instructions on GRASS Trac Wiki."
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:363
+msgid "Preview generated"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:393
+msgid "Save file as"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:431
+#, python-format
+msgid "Failed to read file %s."
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:619
+msgid "Scalebar is not appropriate for this projection"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:1028
+msgid "Press button with green triangle icon to generate preview."
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:1055
+msgid "wxGUI Cartographic Composer"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:1057
+msgid ""
+"(C) 2011 by the GRASS Development Team\n"
+"\n"
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:1058 ../gui/wxpython/gmodeler/frame.py:717
+msgid ""
+"This program is free software under the GNU General Public License(>=v2). "
+"Read the file COPYING that comes with GRASS for details."
+msgstr ""
+
+#: ../gui/wxpython/psmap/frame.py:1367
+msgid "Click and drag to resize object"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:92
+msgid "inch"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:93 ../gui/wxpython/modules/vclean.py:194
+msgid "point"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:94
+msgid "centimeter"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:95
+msgid "millimeter"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:96
+msgid "meters"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:97
+msgid "kilometers"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:98
+msgid "feet"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:99
+msgid "miles"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:100 ../gui/wxpython/psmap/utils.py:104
+msgid "nautical miles"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:102
+msgid "pixel"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:103
+msgid "meter"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:105
+msgid "degree"
+msgstr ""
+
+#: ../gui/wxpython/psmap/utils.py:345
+msgid "Unable to run `ps.map -b`"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:447
+msgid "Segment break"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:514
+msgid "animation"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:695
+msgid "Collapse all except PERMANENT and current"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:696
+msgid "Collapse all except PERMANENT"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:697
+msgid "Collapse all except current"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:698
+msgid "Collapse all"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:699
+msgid "Expand all"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:703
+msgid "Display selected"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:713
+msgid "Classic (labels only)"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:714
+msgid "Combined (labels and module names)"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:715
+msgid "Professional (module names only)"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:722
+msgid "Zoom and recenter"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:723
+msgid "Zoom to mouse cursor"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:724
+msgid "Nothing"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:725
+msgid "Scroll forward to zoom in"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:726
+msgid "Scroll back to zoom in"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:759
+msgid "box"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:760
+msgid "sphere"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:761
+msgid "cube"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:762
+msgid "diamond"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:763
+msgid "aster"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:764
+msgid "gyro"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:765
+msgid "histogram"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:802
+#, python-format
+msgid "Unable to read settings file <%s>\n"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:826
+#, python-format
+msgid ""
+"Error: Reading settings from file <%(file)s> failed.\n"
+"\t\tDetails: %(detail)s\n"
+"\t\tLine: '%(line)s'\n"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:845
+msgid "Unable to create settings directory"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:881
+#, python-format
+msgid ""
+"Writing settings to file <%(file)s> failed.\n"
+"\n"
+"Details: %(detail)s"
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:980
+msgid "Unable to set "
+msgstr ""
+
+#: ../gui/wxpython/core/settings.py:1006 ../gui/wxpython/core/settings.py:1012
+#, python-format
+msgid "Unable to parse settings '%s'"
+msgstr ""
+
+#: ../gui/wxpython/core/menudata.py:84
+msgid "Unknow tag"
+msgstr ""
+
+#: ../gui/wxpython/core/gcmd.py:82
+#, python-format
+msgid "ERROR: %s\n"
+msgstr ""
+
+#: ../gui/wxpython/core/gcmd.py:123
+msgid "Reason"
+msgstr ""
+
+#: ../gui/wxpython/core/gcmd.py:135 ../gui/wxpython/core/workspace.py:1017
+#: ../gui/wxpython/mapdisp/mapwindow.py:1653
+#: ../gui/wxpython/wxplot/dialogs.py:493
+msgid "Warning"
+msgstr ""
+
+#: ../gui/wxpython/core/gcmd.py:385
+msgid "Execution failed:"
+msgstr ""
+
+#: ../gui/wxpython/core/gcmd.py:388 ../gui/wxpython/core/render.py:643
+#: ../gui/wxpython/core/render.py:646
+msgid "Details:"
+msgstr ""
+
+#: ../gui/wxpython/core/gcmd.py:390 ../gui/wxpython/core/gcmd.py:394
+msgid "Error: "
+msgstr ""
+
+#: ../gui/wxpython/core/gcmd.py:469
+#, python-format
+msgid "Unable to exectute command: '%s'"
+msgstr ""
+
+#: ../gui/wxpython/core/workspace.py:1000
+#, python-format
+msgid "Unable to open file <%s> for reading."
+msgstr ""
+
+#: ../gui/wxpython/core/workspace.py:1013
+#, python-format
+msgid ""
+"Some lines were skipped when reading settings from file <%(file)s>.\n"
+"See 'Command output' window for details.\n"
+"\n"
+"Number of skipped lines: %(line)d"
+msgstr ""
+
+#: ../gui/wxpython/core/workspace.py:1231
+#, python-format
+msgid " row %d:"
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:125
+#, python-format
+msgid "<%(name)s>: layer type <%(type)s> is not supported"
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:180
+#, python-format
+msgid "Command '%s' failed\n"
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:182
+#, python-format
+msgid "Details: %s\n"
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:280
+#, python-format
+msgid "Unsupported map layer type '%s'"
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:421
+msgid "GISBASE not set. You must be in GRASS GIS to run this program."
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:466
+#, python-format
+msgid "Error: Unable to open '%(file)s'. Reason: %(ret)s. wxGUI exited.\n"
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:642
+#, python-format
+msgid "Unable to zoom to raster map <%s>."
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:645
+#, python-format
+msgid "Unable to zoom to vector map <%s>."
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:648
+msgid ""
+"Unable to get current geographic extent. Force quiting wxGUI. Please "
+"manually run g.region to fix the problem."
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:931
+#, python-format
+msgid "ERROR: Rendering failed. Details: %s"
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:980 ../gui/wxpython/core/render.py:1064
+#, python-format
+msgid "Unable to render map layer <%s>."
+msgstr ""
+
+#: ../gui/wxpython/core/render.py:1173 ../gui/wxpython/core/render.py:1212
+#, python-format
+msgid "Unable to render overlay <%s>."
+msgstr ""
+
+#: ../gui/wxpython/core/utils.py:313 ../gui/wxpython/core/utils.py:354
+#, python-format
+msgid "Vector map <%(map)s>: %(msg)s\n"
+msgstr ""
+
+#: ../gui/wxpython/core/utils.py:573
+#, python-format
+msgid "failed to open '%s'"
+msgstr ""
+
+#: ../gui/wxpython/core/utils.py:808
+#, python-format
+msgid "ERROR: Unable to determine GRASS version. Details: %s"
+msgstr ""
+
+#: ../gui/wxpython/core/utils.py:844
+#, python-format
+msgid "Unable to open file '%s'\n"
+msgstr ""
+
+#: ../gui/wxpython/core/utils.py:852
+#, python-format
+msgid "%(env)s: line skipped - unable to parse Reason: %(e)s\n"
+msgstr ""
+
+#: ../gui/wxpython/core/utils.py:858
+#, python-format
+msgid "Duplicated key: %s\n"
+msgstr ""
+
+#: ../gui/wxpython/core/utils.py:873
+#, python-format
+msgid "Unable to create file '%s'\n"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:58
+msgid "model"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:59
+msgid "Script generated by wxGUI Graphical Modeler."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:388 ../gui/wxpython/gmodeler/model.py:450
+#, python-format
+msgid "undefined variable '%s'"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:483
+msgid "Running model..."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:502
+msgid "Model is empty. Nothing to run."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:511 ../gui/wxpython/gmodeler/frame.py:508
+msgid "Validating model..."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:517
+#, python-format
+msgid ""
+"Model is not valid. Do you want to run the model anyway?\n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:519
+msgid "Run model?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:554
+msgid "Variables below not defined:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:662
+msgid "Raster maps"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:665
+msgid "3D raster maps"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:1242
+msgid "<not defined>"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:1352
+msgid "Condition: "
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:1354
+msgid "Condition: not defined"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:1415
+msgid "loop"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:1456
+msgid "if-else"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:2150
+msgid "Model parameters"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:2167
+msgid "Delete intermediate data when finish"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/model.py:2219
+#: ../gui/wxpython/gmodeler/frame.py:115
+msgid "Variables"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:47
+msgid "Data properties"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:73
+msgid "Name of raster map:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:75
+msgid "Name of vector map:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:78
+msgid "Name of element:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:118
+msgid "Add new GRASS module to the model"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:205
+msgid ""
+"Command not defined.\n"
+"\n"
+"Unable to add new action to the model."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:211
+#, python-format
+msgid ""
+"'%s' is not a GRASS module.\n"
+"\n"
+"Unable to add new action to the model."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:246
+msgid "Relation properties"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:263
+msgid "From"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:307
+#, python-format
+msgid "Data: %s"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:313
+msgid "Command:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:319
+msgid "Option:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:334
+msgid ""
+"Relation doesn't start with data item.\n"
+"Unable to add relation."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:341
+msgid ""
+"Relation doesn't point to GRASS command.\n"
+"Unable to add relation."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:354
+msgid ""
+"No relevant option found.\n"
+"Unable to add relation."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:385
+msgid "Condition"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:391
+#: ../gui/wxpython/gmodeler/dialogs.py:493
+#: ../gui/wxpython/gmodeler/frame.py:1459
+msgid "ID"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:410
+msgid "Loop properties"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:416
+msgid "List of items in loop"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:419
+msgid "Series"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:420
+msgid "Define map series as condition for the loop"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:464
+msgid "Define series of maps"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:479
+msgid "If-else properties"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:485
+msgid "List of items in 'if' block"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:490
+msgid "List of items in 'else' block"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:654
+#, python-format
+msgid "Variable <%s> already exists in the model. Adding variable failed."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:683
+msgid "Do you want to delete all variables from the model?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:685
+msgid "Delete variables"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:724
+#: ../gui/wxpython/gmodeler/dialogs.py:898
+#: ../gui/wxpython/vdigit/dialogs.py:272
+msgid "Delete selected"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:725
+#: ../gui/wxpython/gmodeler/dialogs.py:899
+#: ../gui/wxpython/vdigit/dialogs.py:276
+msgid "Delete all"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:848
+#, python-format
+msgid ""
+"Selected data records (%d) will permanently deleted from table. Do you want "
+"to delete them?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/dialogs.py:905
+msgid "Normalize"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:28
+#: ../gui/wxpython/menustrings.py:876
+msgid "Modeler settings"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:50
+msgid "Item properties"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:58
+msgid "Disabled:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:83
+msgid "Action"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:96
+#: ../gui/wxpython/gmodeler/preferences.py:334
+msgid "Valid:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:113
+msgid "Invalid:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:130
+msgid "Running:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:150
+#: ../gui/wxpython/gmodeler/preferences.py:269
+#: ../gui/wxpython/gmodeler/preferences.py:354
+msgid "Shape size"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:202
+#: ../gui/wxpython/nviz/tools.py:87
+msgid "Data"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:215
+msgid "Raster:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:232
+msgid "3D raster:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:249
+msgid "Vector:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:321
+msgid "Loop"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:421
+#: ../gui/wxpython/menustrings.py:890
+msgid "Model properties"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:428
+#: ../gui/wxpython/lmgr/layertree.py:430 ../gui/wxpython/lmgr/layertree.py:463
+msgid "Metadata"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:430
+msgid "Commands"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:450
+msgid "Apply properties"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:473
+msgid "Description:"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/preferences.py:482
+msgid "Author(s):"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:61
+msgid "GRASS GIS Graphical Modeler (experimental prototype)"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:113
+msgid "Model"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:114
+msgid "Items"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:116
+msgid "Python editor"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:188
+#: ../gui/wxpython/gmodeler/frame.py:1643
+msgid "Python script is up-to-date"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:203
+msgid "Redrawing model..."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:238
+msgid "Do you want to save changes in the model?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:240
+msgid "Do you want to store current model settings to model file?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:246
+msgid "Quit Graphical Modeler"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:307
+msgid "No intermediate data to delete."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:311
+#, python-format
+msgid "Do you want to permanently delete data?%s"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:312
+msgid "Delete intermediate data?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:326
+#, python-format
+msgid "%d maps deleted from current mapset"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:341 ../gui/wxpython/gmodeler/frame.py:456
+msgid ""
+"Current model is not empty. Do you want to store current settings to model "
+"file?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:344 ../gui/wxpython/gmodeler/frame.py:459
+msgid "Create new model?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:371
+msgid "Choose model file"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:373 ../gui/wxpython/gmodeler/frame.py:417
+#: ../gui/wxpython/lmgr/frame.py:413
+msgid "GRASS Model File (*.gxm)|*.gxm"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:389
+#, python-format
+msgid "%(items)d items (%(actions)d actions) loaded into model"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:396 ../gui/wxpython/gmodeler/frame.py:433
+#, python-format
+msgid "Model file <%s> already exists. Do you want to overwrite this file?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:399 ../gui/wxpython/menustrings.py:863
+msgid "Save model"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:406 ../gui/wxpython/gmodeler/frame.py:446
+#, python-format
+msgid "File <%s> saved"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:415
+msgid "Choose file to save current model"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:435
+msgid "File already exists"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:504
+msgid "Model is empty. Nothing to validate."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:514
+#, python-format
+msgid ""
+"Model is not valid.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:517
+msgid "Model is valid."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:550
+#: ../gui/wxpython/modules/histogram.py:414
+#: ../gui/wxpython/mapdisp/frame.py:576 ../gui/wxpython/gcp/mapdisplay.py:456
+msgid "Choose a file name to save the image (no need to add extension)"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:578 ../gui/wxpython/gmodeler/frame.py:585
+#, python-format
+msgid "Model exported to <%s>"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:713
+msgid "wxGUI Graphical Modeler"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:716
+#, python-format
+msgid ""
+"(C) 2010-%s by the GRASS Development Team\n"
+"\n"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:815
+#, python-format
+msgid ""
+"Reading model file <%s> failed.\n"
+"Invalid file, unable to parse XML document."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:821
+msgid "Please wait, loading model..."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:881
+msgid "Writing current settings to model file failed."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:891 ../gui/wxpython/lmgr/frame.py:1118
+#, python-format
+msgid "Unable to open file <%s> for writing."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1196
+#: ../gui/wxpython/lmgr/layertree.py:336
+msgid "Remove"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1200
+msgid "Disable"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1203
+msgid "Enable"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1208
+msgid "Add control point"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1210
+msgid "Remove control point"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1217
+msgid "Intermediate"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1228
+#: ../gui/wxpython/lmgr/layertree.py:350
+msgid "Properties"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1311
+msgid "List of variables - right-click to delete"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1315
+#: ../gui/wxpython/gmodeler/frame.py:1370
+msgid "Default value"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1319
+msgid "Add new variable"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1323
+msgid "integer"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1324
+msgid "float"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1325
+msgid "string"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1328
+msgid "mapset"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1329
+msgid "file"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1336
+msgid "Add new variable to the model"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1456
+msgid "List of items - right-click to delete"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1459
+msgid "In block"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1460
+msgid "Command / Condition"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1493
+msgid "Python script"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1497
+msgid "Run python script"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1500
+msgid "Save python script to file"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1503
+msgid ""
+"Refresh python script based on the model.\n"
+"It will discards all local changes."
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1541
+#, python-format
+msgid "Unable to launch Python script. %s"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1566
+msgid "Choose file to save"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1568
+msgid "Python script (*.py)|*.py"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1582
+#: ../gui/wxpython/wxplot/profile.py:343
+#, python-format
+msgid "File <%s> already exists. Do you want to overwrite this file?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1584
+msgid "Save file"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1619
+msgid ""
+"Python script is locally modificated. Refresh will discard all changes. Do "
+"you really want to continue?"
+msgstr ""
+
+#: ../gui/wxpython/gmodeler/frame.py:1622
+msgid "Update"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:2 ../gui/wxpython/menustrings.py:857
+msgid "&File"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:3
+msgid "Workspace"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:4 ../gui/wxpython/menustrings.py:858
+#: ../gui/wxpython/nviz/tools.py:1090
+msgid "New"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:5
+msgid "Create new workspace"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:6 ../gui/wxpython/menustrings.py:860
+msgid "Open"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:7
+msgid "Load workspace from file"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:8 ../gui/wxpython/menustrings.py:862
+#: ../gui/wxpython/modules/colorrules.py:406
+msgid "Save"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:9 ../gui/wxpython/lmgr/frame.py:1069
+#: ../gui/wxpython/lmgr/frame.py:1086
+msgid "Save workspace"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:10 ../gui/wxpython/menustrings.py:864
+msgid "Save as"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:11
+msgid "Save workspace to file"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:12 ../gui/wxpython/menustrings.py:866
+msgid "Close"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:13
+msgid "Close workspace file"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:14
+msgid "Load GRC file (Tcl/Tk GUI)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:15
+msgid "Load map layers from GRC file to layer tree"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:16
+msgid "Map display"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:17
+msgid "Add raster"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:18
+msgid "Add raster map layer to current display"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:19
+msgid "Add vector"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:20
+msgid "Add vector map layer to current display"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:21
+msgid "Add multiple rasters or vectors"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:22
+msgid "Add multiple raster or vector map layers to current display"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:23
+msgid "New map display window"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:24
+msgid "Open new map display window"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:25 ../gui/wxpython/menustrings.py:26
+msgid "Close current map display window"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:27 ../gui/wxpython/menustrings.py:28
+msgid "Close all open map display windows"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:30
+msgid "Common formats import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:31
+msgid "Import raster data into a GRASS map layer using GDAL."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:32
+msgid "ASCII x,y,z point import and gridding"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:33
+msgid ""
+"Create a raster map from an assemblage of many coordinates using univariate "
+"statistics."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:34
+msgid "ASCII grid import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:35
+msgid "Converts ASCII raster file to binary raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:36
+msgid "ASCII polygons and lines import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:37
+msgid "Creates raster maps from ASCII polygon/line/point data files."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:38
+msgid "Binary file import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:39
+msgid "Import a binary raster file into a GRASS raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:40
+msgid "ESRI ASCII grid import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:41
+msgid ""
+"Converts an ESRI ARC/INFO ascii raster file (GRID) into a (binary) raster "
+"map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:42
+msgid "GRIDATB.FOR import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:43
+msgid "Imports GRIDATB.FOR map file (TOPMODEL) into GRASS raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:44
+msgid "Matlab 2D array import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:45
+msgid "Imports a binary MAT-File(v4) to a GRASS raster."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:46
+msgid "SPOT NDVI import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:47
+msgid "Import of SPOT VGT NDVI file into a raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:48
+msgid "SRTM HGT import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:49
+msgid "Import SRTM HGT files into GRASS"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:50
+msgid "Terra ASTER HDF import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:51
+msgid ""
+"Georeference, rectify and import Terra-ASTER imagery and relative DEM's "
+"using gdalwarp."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:52
+msgid "WMS import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:53
+msgid "Downloads and imports data from WMS servers"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:54
+msgid "Unpack raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:55
+msgid "Unpacks a raster map packed with r.pack."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:57
+msgid "Common import formats"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:58
+msgid "Converts vector layers into a GRASS vector map using OGR."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:59
+msgid "ASCII points/GRASS ASCII vector import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:60
+msgid "Creates a vector map from ASCII points file or ASCII vector file."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:61
+msgid "ASCII points as a vector lines"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:62
+msgid "Import ASCII x,y[,z] coordinates as a series of lines."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:63
+msgid "Historical GRASS vector import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:64
+msgid "Imports older versions of GRASS vector maps."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:65
+msgid "Historical GRASS vector import (all maps)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:66
+msgid ""
+"Converts all older versions of GRASS vector maps in current mapset to "
+"current format."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:67
+msgid "DXF import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:68
+msgid "Converts files in DXF format to GRASS vector map format."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:69
+msgid "WFS"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:70
+msgid "Import GetFeature from WFS"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:71
+msgid "ESRI e00 import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:72
+msgid "Import E00 file into a vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:73
+msgid "Garmin GPS import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:74
+msgid ""
+"Download waypoints, routes, and tracks from a Garmin GPS receiver into a "
+"vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:75
+msgid "GPSBabel GPS import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:76
+msgid ""
+"Import waypoints, routes, and tracks from a GPS receiver or GPS download "
+"file into a vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:77
+msgid "Geonames import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:78
+msgid "Imports geonames.org country files into a GRASS vector points map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:79
+msgid "GEOnet import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:80
+msgid ""
+"Imports US-NGA GEOnet Names Server (GNS) country files into a GRASS vector "
+"points map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:81
+msgid "Matlab array or Mapgen format import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:82
+msgid "Imports Mapgen or Matlab-ASCII vector maps into GRASS."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:83
+msgid "Import 3D raster data"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:84
+msgid "ASCII 3D import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:85
+msgid ""
+"Converts a 3D ASCII raster text file into a (binary) 3D raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:86
+msgid "Vis5D import"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:87
+msgid ""
+"Imports 3-dimensional Vis5D files (i.e. the V5D file with 1 variable and 1 "
+"time step)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:88
+msgid "Import database table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:89
+msgid "Multiple import formats using OGR"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:90
+msgid "Imports attribute tables in various formats."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:91
+msgid "Export raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:92 ../gui/wxpython/menustrings.py:125
+msgid "Common export formats"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:93
+msgid "Exports GRASS raster maps into GDAL supported formats."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:94
+msgid "ASCII grid export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:95
+msgid "Converts a raster map layer into an ASCII text file."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:96
+msgid "ASCII x,y,z points export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:97
+msgid ""
+"Export a raster map to a text file as x,y,z values based on cell centers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:98
+msgid "ESRI ASCII grid export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:99
+msgid "Converts a raster map layer into an ESRI ARCGRID file."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:100
+msgid "GRIDATB.FOR export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:101
+msgid "Exports GRASS raster map to GRIDATB.FOR map file (TOPMODEL)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:102
+msgid "Matlab 2D array export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:103
+msgid "Exports a GRASS raster to a binary MAT-File."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:104
+msgid "Raw binary array export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:105
+msgid "Exports a GRASS raster map to a binary array."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:106
+msgid "MPEG-1 export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:107
+msgid "Raster File Series to MPEG Conversion."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:108
+msgid "PNG export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:109
+msgid "Export GRASS raster as non-georeferenced PNG image."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:110
+msgid "PPM export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:111
+msgid ""
+"Converts a GRASS raster map to a PPM image file at the pixel resolution of "
+"the currently defined region."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:112
+msgid "PPM from RGB export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:113
+msgid ""
+"Converts 3 GRASS raster layers (R,G,B) to a PPM image file at the pixel "
+"resolution of the CURRENTLY DEFINED REGION."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:114 ../gui/wxpython/menustrings.py:133
+msgid "POV-Ray export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:115
+msgid "Converts a raster map layer into a height-field file for POVRAY."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:116
+msgid "TIFF export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:117
+msgid ""
+"Exports a GRASS raster map to a 8/24bit TIFF image file at the pixel "
+"resolution of the currently defined region."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:118
+msgid "VRML export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:119
+msgid "Export a raster map to the Virtual Reality Modeling Language (VRML)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:120 ../gui/wxpython/menustrings.py:137
+#: ../gui/wxpython/menustrings.py:144
+msgid "VTK export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:121
+msgid "Converts raster maps into the VTK-Ascii format"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:122
+msgid "Pack raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:123
+msgid "Packs up a raster map and support files for copying."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:124
+msgid "Export vector map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:126
+msgid "Converts GRASS vector map to one of the supported OGR vector formats."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:127
+msgid "ASCII points/GRASS ASCII vector export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:128
+msgid "Converts a GRASS binary vector map to a GRASS ASCII vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:129
+msgid "DXF export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:130
+msgid "Exports GRASS vector map layers to DXF file format."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:131
+msgid "Multiple GPS export formats using GPSBabel"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:132
+msgid ""
+"Exports a vector map to a GPS receiver or file format supported by GpsBabel."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:134
+msgid "Converts to POV-Ray format, GRASS x,y,z -> POV-Ray x,z,y"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:135
+msgid "SVG export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:136
+msgid "Exports a GRASS vector map to SVG."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:138
+msgid "Converts a GRASS binary vector map to VTK ASCII output."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:139
+msgid "Export 3D raster maps"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:140
+msgid "ASCII 3D export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:141
+msgid "Converts a 3D raster map layer into an ASCII text file."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:142
+msgid "Vis5D export"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:143
+msgid "Exports GRASS 3D raster map to 3-dimensional Vis5D file."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:145
+msgid "Converts 3D raster maps into the VTK-ASCII format."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:146
+msgid "Export database table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:147
+msgid "Common export formats using OGR"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:148
+msgid "Exports attribute tables into various formats."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:149
+msgid "Link external formats"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:151
+msgid "Link GDAL supported raster data as a pseudo GRASS raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:153
+msgid "Creates a new pseudo-vector map as a link to an OGR-supported layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:154
+msgid "Manage maps and volumes"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:155
+msgid "Copy"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:156
+msgid ""
+"Copies available data files in the user's current mapset search path and "
+"location to the appropriate element directories under the user's current "
+"mapset."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:157
+msgid "List"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:158
+msgid "Lists available GRASS data base files of the user-specified data type."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:159
+msgid "List filtered"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:160
+msgid ""
+"Lists available GRASS data base files of the user-specified data type "
+"optionally using the search pattern."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:161 ../gui/wxpython/lmgr/layertree.py:340
+msgid "Rename"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:162
+msgid "Renames data base element files in the user's current mapset."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:164 ../gui/wxpython/menustrings.py:166
+msgid "Removes data base element files from the user's current mapset."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:165
+msgid "Delete filtered"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:167 ../gui/wxpython/menustrings.py:299
+#: ../gui/wxpython/menustrings.py:578 ../gui/wxpython/menustrings.py:777
+msgid "Map type conversions"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:168 ../gui/wxpython/menustrings.py:300
+msgid "Raster to vector"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:169 ../gui/wxpython/menustrings.py:301
+msgid "Converts a raster map into a vector map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:170 ../gui/wxpython/menustrings.py:302
+msgid "Raster series to volume"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:171 ../gui/wxpython/menustrings.py:303
+msgid "Converts 2D raster map slices to one 3D raster volume map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:172 ../gui/wxpython/menustrings.py:304
+msgid "Raster 2.5D to volume"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:173 ../gui/wxpython/menustrings.py:305
+msgid "Creates a 3D volume map based on 2D elevation and value raster maps."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:174 ../gui/wxpython/menustrings.py:579
+msgid "Vector to raster"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:175 ../gui/wxpython/menustrings.py:580
+msgid "Converts (rasterize) a vector map into a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:176 ../gui/wxpython/menustrings.py:581
+msgid "Vector to volume"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:177 ../gui/wxpython/menustrings.py:582
+msgid ""
+"Converts a binary GRASS vector map (only points) layer into a 3D GRASS "
+"raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:178 ../gui/wxpython/menustrings.py:583
+msgid "2D vector to 3D vector"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:179 ../gui/wxpython/menustrings.py:584
+msgid "Performs transformation of 2D vector features to 3D."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:180 ../gui/wxpython/menustrings.py:585
+msgid "Sites to vector"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:181 ../gui/wxpython/menustrings.py:586
+msgid "Converts a GRASS site_lists file into a vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:182 ../gui/wxpython/menustrings.py:778
+msgid "Volume to raster series"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:183 ../gui/wxpython/menustrings.py:779
+msgid "Converts 3D raster maps to 2D raster maps"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:184
+msgid "Georectify"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:185
+msgid "Manage Ground Control Points for Georectification"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:186
+msgid "Graphical modeler"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:187
+msgid "Launch Graphical modeler"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:188 ../gui/wxpython/menustrings.py:894
+msgid "Run model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:189
+msgid "Run model prepared by Graphical modeler"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:190
+msgid "NVIZ (requires Tcl/Tk)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:191
+msgid "nviz - Visualization and animation tool for GRASS data."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:192
+msgid "3D image rendering"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:193
+msgid "Creates a 3D rendering of GIS data."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:194
+msgid "Bearing/distance to coordinates"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:195
+msgid ""
+"A simple utility for converting bearing and distance measurements to "
+"coordinates and vice versa."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:196 ../gui/wxpython/lmgr/toolbars.py:142
+msgid "Cartographic Composer"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:197
+msgid "Launch Cartographic Composer"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:198
+msgid "Launch script"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:199
+msgid "Launches script file."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:200
+msgid "Exit GUI"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:201
+msgid "Quit the GRASS wxGUI session."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:202 ../gui/wxpython/menustrings.py:874
+msgid "&Settings"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:203
+msgid "Region"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:204
+msgid "Display region"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:205 ../gui/wxpython/menustrings.py:207
+msgid "Manages the boundary definitions for the geographic region."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:206
+msgid "Set region"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:208
+msgid "GRASS working environment"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:209
+msgid "Mapset access"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:210
+msgid "Set/unset access to other mapsets in current location"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:211
+msgid "User access"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:212
+msgid "Controls access to the current mapset for other users on the system."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:213
+msgid "Change working environment"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:214
+msgid "Changes current mapset."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:215
+msgid "Change location and mapset"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:216
+msgid "Change current location and mapset."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:217
+msgid "Change mapset"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:218
+msgid "Change current mapset."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:219
+msgid "Show settings"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:220 ../gui/wxpython/menustrings.py:222
+msgid "Outputs and modifies the user's current GRASS variable settings."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:221
+msgid "Change settings"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:223
+msgid "Change default GUI"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:224
+msgid "Changes the default GRASS graphical user interface (GUI) setting."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:225
+msgid "Create new location"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:226
+msgid "Launches location wizard to create new GRASS location."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:227 ../gui/wxpython/lmgr/frame.py:686
+#: ../gui/wxpython/gis_set.py:429 ../gui/wxpython/gis_set.py:796
+msgid "Create new mapset"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:228
+msgid "Creates new mapset in the current location, changes current mapset."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:229
+msgid "Version"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:230
+msgid "Displays version and copyright information."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:231
+msgid "Map projections"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:232
+msgid "Display map projection"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:233
+msgid "Print projection information (in conventional GRASS format)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:234
+msgid "Manage projections"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:235
+msgid ""
+"Prints and manipulates GRASS projection information files (in various co-"
+"ordinate system descriptions)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:236
+msgid "Change projection for current location"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:237
+msgid "Interactively reset the location's projection settings."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:238
+msgid "Convert coordinates"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:239
+msgid "Convert coordinates from one projection to another (cs2cs frontend)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:240
+msgid "Addons extensions"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:241
+msgid "Install extension from addons"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:242
+msgid "Installs new extension from GRASS AddOns SVN repository."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:243
+msgid "Update installed extensions"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:244
+msgid "Rebuilds all locally installed GRASS Addons extensions."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:245
+#: ../gui/wxpython/modules/extensions.py:461
+msgid "Remove extension"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:246
+msgid "Removes installed GRASS AddOns extension."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:247 ../gui/wxpython/menustrings.py:875
+msgid "Preferences"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:248
+msgid "User GUI preferences (display font, commands, digitizer, etc.)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:249
+msgid "&Raster"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:250
+msgid "Develop raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:251
+msgid "Digitize raster (requires XTerm)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:252
+msgid ""
+"Interactive tool used to draw and save vector features on a graphics monitor "
+"using a pointing device (mouse) and save to a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:253
+msgid "Compress/decompress"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:254
+msgid "Compresses and decompresses raster maps."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:255
+msgid "Region boundaries"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:256
+msgid "Sets the boundary definitions for a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:257
+msgid "Manage NULL values"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:258
+msgid "Manages NULL-values of given raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:259
+msgid "Quantization"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:260
+msgid "Produces the quantization file for a floating-point map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:261
+msgid "Timestamp"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:262
+msgid "Modifies a timestamp for a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:263
+msgid "Resample using aggregate statistics"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:264
+msgid "Resamples raster map layers to a coarser grid using aggregation."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:265
+msgid "Resample using multiple methods"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:266
+msgid "Resamples raster map layers to a finer grid using interpolation."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:267
+msgid "Resample using nearest neighbor"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:268
+msgid "GRASS raster map layer data resampling capability."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:269
+msgid "Resample using spline tension"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:270
+msgid ""
+"Reinterpolates and optionally computes topographic analysis from input "
+"raster map to a new raster map (possibly with different resolution) using "
+"regularized spline with tension and smoothing."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:271 ../gui/wxpython/menustrings.py:544
+msgid "Support file maintenance"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:272
+msgid "Allows creation and/or modification of raster map layer support files."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:273
+msgid "Update map statistics"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:274
+msgid "Update raster map statistics"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:275
+msgid "Reproject raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:276
+msgid "Re-projects a raster map from one location to the current location."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:277
+msgid "Tiling"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:278
+msgid ""
+"Produces tilings of the source projection for use in the destination region "
+"and projection."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:279 ../gui/wxpython/menustrings.py:563
+msgid "Manage colors"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:280 ../gui/wxpython/menustrings.py:564
+msgid "Color tables"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:281
+msgid "Creates/modifies the color table associated with a raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:282
+msgid "Color tables (stddev)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:283
+msgid "Set color rules based on stddev from a map's mean value."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:284 ../gui/wxpython/menustrings.py:566
+msgid "Color rules"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:285
+msgid "Interactive management of raster color tables."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:286
+msgid "Export color table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:287
+msgid "Exports the color table associated with a raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:288
+msgid "Blend 2 color rasters"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:289
+msgid "Blends color components of two raster maps by a given ratio."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:290
+msgid "Create RGB"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:291
+msgid ""
+"Combines red, green and blue raster maps into a single composite raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:292 ../gui/wxpython/menustrings.py:713
+msgid "RGB to HIS"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:293
+msgid ""
+"Generates red, green and blue raster map layers combining hue, intensity and "
+"saturation (HIS) values from user-specified input raster map layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:294
+msgid "Query raster maps"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:295
+msgid "Query values by coordinates"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:296
+msgid "Queries raster map layers on their category values and category labels."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:297
+msgid "Query colors by value"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:298
+msgid "Queries colors for a raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:306
+msgid "Buffer rasters"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:307
+msgid ""
+"Creates a raster map layer showing buffer zones surrounding cells that "
+"contain non-NULL category values."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:308
+msgid "Concentric circles"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:309
+msgid "Creates a raster map containing concentric rings around a given point."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:310
+msgid "Closest points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:311
+msgid "Locates the closest points between objects in two raster maps."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:313
+msgid "Creates a MASK for limiting raster operation."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:314
+msgid "Raster map calculator"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:315
+msgid "Map calculator for raster map algebra."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:316
+msgid "Neighborhood analysis"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:317
+msgid "Moving window"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:318
+msgid ""
+"Makes each cell category value a function of the category values assigned to "
+"the cells around it, and stores new cell values in an output raster map "
+"layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:319
+msgid "Neighborhood points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:320
+msgid ""
+"Makes each cell value a function of the attribute values assigned to the "
+"vector points or centroids around it, and stores new cell values in an "
+"output raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:321
+msgid "Overlay rasters"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:322
+msgid "Cross product"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:323
+msgid ""
+"Creates a cross product of the category values from multiple raster map "
+"layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:324
+msgid "Raster series"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:325
+msgid ""
+"Makes each output cell value a function of the values assigned to the "
+"corresponding cells in the input raster map layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:326
+msgid "Patch raster maps"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:327
+msgid ""
+"Creates a composite raster map layer by using known category values from one "
+"(or more) map layer(s) to fill in areas of \"no data\" in another map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:328
+msgid "Statistical overlay"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:329
+msgid "Calculates category or object oriented statistics."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:330
+msgid "Solar radiance and shadows"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:331
+msgid "Solar irradiance and irradiation"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:332
+msgid "Solar irradiance and irradiation model."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:333
+msgid "Shadows map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:334
+msgid ""
+"Calculates cast shadow areas from sun position and elevation raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:335
+msgid "Terrain analysis"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:336
+msgid "Generate contour lines"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:337
+msgid "Produces a vector map of specified contours from a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:338
+msgid "Cost surface"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:339
+msgid ""
+"Creates a raster map showing the cumulative cost of moving between different "
+"geographic locations on an input raster map whose cell category values "
+"represent cost."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:340
+msgid "Cumulative movement costs"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:341
+msgid ""
+"Outputs a raster map layer showing the anisotropic cumulative cost of moving "
+"between different geographic locations on an input elevation raster map "
+"layer whose cell category values represent elevation combined with an input "
+"raster map layer whose cell values represent friction cost."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:342
+msgid "Least cost route or flow"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:343
+msgid "Traces a flow through an elevation model on a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:344
+msgid "Shaded relief"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:345
+msgid "Creates shaded relief map from an elevation map (DEM)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:346
+msgid "Slope and aspect"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:347
+msgid ""
+"Generates raster maps of slope, aspect, curvatures and partial derivatives "
+"from a elevation raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:348
+msgid "Terrain parameters"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:349
+msgid "Extracts terrain parameters from a DEM."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:350
+msgid "Textural features"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:351
+msgid "Generate images with textural features from a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:352
+msgid "Visibility"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:353
+msgid "Line-of-sight raster analysis program."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:354
+msgid "Distance to features"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:355
+msgid "Generates a raster map layer of distance to features in input layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:356
+msgid "Horizon angle"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:357
+msgid "Horizon angle computation from a digital elevation model."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:358
+msgid "Transform features"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:359
+msgid "Clump"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:360
+msgid ""
+"Recategorizes data in a raster map by grouping cells that form physically "
+"discrete areas into unique categories."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:361
+msgid "Grow"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:362
+msgid "Generates a raster map layer with contiguous areas grown by one cell."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:363
+msgid "Thin"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:364
+msgid "Thins non-zero cells that denote linear features in a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:365
+msgid "Hydrologic modeling"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:366
+msgid "Carve stream channels"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:367
+msgid ""
+"Takes vector stream data, transforms it to raster and subtracts depth from "
+"the output DEM."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:368
+msgid "Fill lake"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:369
+msgid "Fills lake at given point to given level."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:370
+msgid "Depressionless map and flowlines"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:371
+msgid ""
+"Filters and generates a depressionless elevation map and a flow direction "
+"map from a given elevation raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:372
+msgid "Flow accumulation"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:373
+msgid "Flow computation for massive grids (float version)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:374
+msgid "Flow lines"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:375
+msgid ""
+"Construction of slope curves (flowlines), flowpath lengths, and flowline "
+"densities (upslope areas) from a raster digital elevation model (DEM)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:376
+msgid "Watershed analysis"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:377
+msgid "Watershed basin analysis program."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:378
+msgid "Watershed subbasins"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:379
+msgid "Generates watershed subbasins raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:380
+msgid "Watershed basin creation"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:381
+msgid "Watershed basin creation program."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:382 ../gui/wxpython/menustrings.py:786
+msgid "Groundwater modeling"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:383
+msgid ""
+"Numerical calculation program for transient, confined and unconfined "
+"groundwater flow in two dimensions."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:384
+msgid "SIMWE Overland flow modeling"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:385
+msgid "Overland flow hydrologic simulation using path sampling method (SIMWE)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:386
+msgid "SIMWE Sediment flux modeling"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:387
+msgid ""
+"Sediment transport and erosion/deposition simulation using path sampling "
+"method (SIMWE)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:388
+msgid "Topographic index map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:389
+msgid "Creates topographic index map from elevation raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:390
+msgid "TOPMODEL simulation"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:391
+msgid "Simulates TOPMODEL which is a physically based hydrologic model."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:392
+msgid "Landscape structure modeling"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:393
+msgid "Set up (requires XTerm)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:394
+msgid ""
+"Interactive tool used to setup the sampling and analysis framework that will "
+"be used by the other r.le programs."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:395
+msgid "Analyze landscape"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:396
+msgid ""
+"Contains a set of measures for attributes, diversity, texture, "
+"juxtaposition, and edge."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:397
+msgid "Analyze patches"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:398
+msgid ""
+"Calculates attribute, patch size, core (interior) size, shape, fractal "
+"dimension, and perimeter measures for sets of patches in a landscape."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:399
+msgid "Summary and display (requires XTerm)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:400
+msgid ""
+"Displays the boundary of each r.le patch and shows how the boundary is "
+"traced, displays the attribute, size, perimeter and shape indices for each "
+"patch and saves the data in an output file."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:401
+msgid "Landscape patch analysis"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:402
+msgid "Set up sampling and analysis framework"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:403
+msgid "Configuration editor for r.li.'index'"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:404
+msgid "Edge density"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:405
+msgid ""
+"Calculates edge density index on a raster map, using a 4 neighbour algorithm"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:406
+msgid "Contrast weighted edge density"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:407
+msgid "Calculates contrast weighted edge density index on a raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:408
+msgid "Patch area mean"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:409
+msgid ""
+"Calculates mean patch size index on a raster map, using a 4 neighbour "
+"algorithm"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:410
+msgid "Patch area range"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:411
+msgid "Calculates range of patch area size on a raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:412
+msgid "Patch area Std Dev"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:413
+msgid "Calculates standard deviation of patch area a raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:414
+msgid "Patch area Coeff Var"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:415
+msgid "Calculates coefficient of variation of patch area on a raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:416
+msgid "Patch density"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:417
+msgid ""
+"Calculates patch density index on a raster map, using a 4 neighbour algorithm"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:418
+msgid "Patch number"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:419
+msgid ""
+"Calculates patch number index on a raster map, using a 4 neighbour algorithm."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:420
+msgid "Dominance's diversity"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:421 ../gui/wxpython/menustrings.py:427
+msgid "Calculates dominance's diversity index on a raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:422
+msgid "Shannon's diversity"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:423
+msgid "Calculates Shannon's diversity index on a raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:424
+msgid "Simpson's diversity"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:425
+msgid "Calculates Simpson's diversity index on a raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:426
+msgid "Richness"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:428
+msgid "Shape index"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:429
+msgid "Calculates shape index on a raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:430
+msgid "Wildfire modeling"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:431
+msgid "Rate of spread"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:432
+msgid ""
+"Generates three, or four raster map layers showing 1) the base "
+"(perpendicular) rate of spread (ROS), 2) the maximum (forward) ROS, 3) the "
+"direction of the maximum ROS, and optionally 4) the maximum potential "
+"spotting distance."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:433
+msgid "Least-cost spread paths"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:434
+msgid ""
+"Recursively traces the least cost path backwards to cells from which the "
+"cumulative cost was determined."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:435
+msgid "Anisotropic spread simulation"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:436
+msgid ""
+"Simulates elliptically anisotropic spread on a graphics window and generates "
+"a raster map of the cumulative time of spread, given raster maps containing "
+"the rates of spread (ROS), the ROS directions and the spread origins."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:437
+msgid "Change category values and labels"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:438
+msgid "Interactively edit category values"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:439
+msgid "Interactively edit cell values in a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:440
+msgid "Reclassify by size"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:441
+msgid ""
+"Reclasses a raster map greater or less than user specified area size (in "
+"hectares)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:442 ../gui/wxpython/menustrings.py:648
+msgid "Reclassify"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:443
+msgid ""
+"Creates a new map layer whose category values are based upon a "
+"reclassification of the categories in an existing raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:444
+msgid "Recode"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:445
+msgid "Recodes categorical raster maps."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:446
+msgid "Rescale"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:447
+msgid "Rescales the range of category values in a raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:448
+msgid "Rescale with histogram"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:449
+msgid ""
+"Rescales histogram equalized the range of category values in a raster map "
+"layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:450
+msgid "Generate random cells"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:451
+msgid "Random cells"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:452
+msgid "Generates random cell values with spatial dependence."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:453
+msgid "Random cells and vector points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:454
+msgid ""
+"Creates a raster map layer and vector point map containing randomly located "
+"points."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:455
+msgid "Generate surfaces"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:456
+msgid "Fractal surface"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:457
+msgid "Creates a fractal surface of a given fractal dimension."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:458
+msgid "Gaussian kernel density surface"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:459
+msgid ""
+"Generates a raster density map from vector point data using a moving kernel "
+"or optionally generates a vector density map on a vector network."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:460
+msgid "Gaussian deviates surface"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:461
+msgid ""
+"GRASS module to produce a raster map layer of gaussian deviates whose mean "
+"and standard deviation can be expressed by the user. It uses a gaussian "
+"random number generator."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:462 ../gui/wxpython/nviz/tools.py:4307
+msgid "Plane"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:463
+msgid ""
+"Creates raster plane map given dip (inclination), aspect (azimuth) and one "
+"point."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:464
+msgid "Random deviates surface"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:465
+msgid ""
+"Produces a raster map of uniform random deviates whose range can be "
+"expressed by the user."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:466
+msgid "Random surface with spatial dependence"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:467
+msgid "Generates random surface(s) with spatial dependence."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:468
+msgid "Interpolate surfaces"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:469
+msgid "Bilinear from raster points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:470
+msgid "Bilinear interpolation utility for raster map layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:471
+msgid "Bilinear and bicubic from vector points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:472
+msgid "Bicubic or bilinear spline interpolation with Tykhonov regularization."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:473
+msgid "IDW from raster points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:474
+msgid "Surface interpolation utility for raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:475
+msgid "IDW from raster points (alternate method for sparse points)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:476
+msgid "Surface generation program."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:477
+msgid "IDW from vector points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:478
+msgid ""
+"Surface interpolation from vector point data by Inverse Distance Squared "
+"Weighting."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:479
+msgid "Raster contours"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:480
+msgid "Surface generation program from rasterized contours."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:481
+msgid "Regularized spline tension"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:482
+msgid ""
+"Spatial approximation and topographic analysis from given point or isoline "
+"data in vector format to floating point raster format using regularized "
+"spline with tension."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:483
+msgid "Ordinary or block kriging"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:484
+msgid "Performs ordinary or block kriging."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:485
+msgid "Fill NULL cells"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:486
+msgid "Fills no-data areas in raster maps using spline interpolation."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:487 ../gui/wxpython/menustrings.py:764
+msgid "Report and statistics"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:488
+msgid "Basic raster metadata"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:489
+msgid "Output basic information about a raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:490
+msgid "Manage category information"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:491
+msgid ""
+"Manages category values and labels associated with user-specified raster map "
+"layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:492
+msgid "General statistics"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:493
+msgid "Generates area statistics for raster map layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:494
+msgid "Quantiles for large data sets"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:495
+msgid "Compute quantiles using two passes."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:496
+msgid "Range of category values"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:497
+msgid "Prints terse list of category values found in a raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:498
+msgid "Sum category values"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:499
+msgid "Sums up the raster cell values."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:500
+msgid "Sum area by raster map and category"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:501
+msgid "Reports statistics for raster map layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:502
+msgid "Statistics for clumped cells"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:503
+msgid ""
+"Calculates the volume of data \"clumps\", and (optionally) produces a GRASS "
+"vector points map containing the calculated centroids of these clumps."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:504
+msgid "Total corrected area"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:505
+msgid "Surface area estimation for rasters."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:506 ../gui/wxpython/lmgr/layertree.py:459
+msgid "Univariate raster statistics"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:507
+msgid ""
+"Calculates univariate statistics from the non-null cells of a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:508
+msgid "Sample transects"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:509
+msgid "Outputs the raster map layer values lying on user-defined line(s)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:510
+msgid "Sample transects (bearing/distance)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:511
+msgid ""
+"Outputs raster map layer values lying along user defined transect line(s)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:512
+msgid "Covariance/correlation"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:513
+msgid ""
+"Outputs a covariance/correlation matrix for user-specified raster map layer"
+"(s)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:514
+msgid "Linear regression"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:515
+msgid "Calculates linear regression from two raster maps: y = a + b*x."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:516
+msgid "Mutual category occurrences"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:517
+msgid ""
+"Tabulates the mutual occurrence (coincidence) of categories for two raster "
+"map layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:518
+msgid "&Vector"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:519
+msgid "Develop vector map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:521
+msgid "Create new empty vector map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:522
+msgid "Digitize vector map using Tcl/Tk digitizer"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:523
+msgid "Interactive editing and digitization of vector maps."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:524
+msgid "Edit vector map (non-interactively)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:525
+msgid ""
+"Edits a vector map, allows adding, deleting and modifying selected vector "
+"features."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:526
+msgid "Convert object types"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:527
+msgid "Change the type of geometry elements."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:528
+msgid "Parallel lines"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:529
+msgid "Creates parallel line to input vector lines."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:530
+msgid "Dissolve boundaries"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:531
+msgid ""
+"Dissolves boundaries between adjacent areas sharing a common category number "
+"or attribute."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:532
+msgid "Create 3D vector over raster"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:533
+msgid "Converts vector map to 3D by sampling of elevation raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:534
+msgid "Extrude 3D vector map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:535
+msgid "Extrudes flat vector object to 3D with defined height."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:536
+msgid "Create labels"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:537
+msgid "Creates paint labels for a vector map from attached attributes."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:538
+msgid "Create optimally placed labels"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:539
+msgid "Create optimally placed labels for vector map(s)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:540
+msgid "Reposition vector map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:541
+msgid ""
+"Performs an affine transformation (shift, scale and rotate, or GPCs) on "
+"vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:542
+msgid "Reproject vector map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:543
+msgid "Re-projects a vector map from one location to the current location."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:545
+msgid "Updates vector map metadata."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:546
+msgid "Topology maintenance"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:547
+msgid "Create or rebuild topology"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:548
+msgid "Creates topology for GRASS vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:549
+msgid "Rebuild topology on all vector maps"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:550
+msgid "Rebuilds topology on all vector maps in the current mapset."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:551
+msgid "Build polylines"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:552
+msgid "Builds polylines from lines or boundaries."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:553
+msgid "Split lines"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:554
+msgid "Split lines to shorter segments."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:555
+msgid "Split polylines"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:556
+msgid "Creates points/segments from input vector lines and positions."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:557
+msgid "Clean vector map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:558
+msgid "Toolset for cleaning topology of vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:559
+msgid "Smooth or simplify"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:560
+msgid "Vector based generalization."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:561
+msgid "Add centroids"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:562
+msgid "Adds missing centroids to closed boundaries."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:565
+msgid ""
+"Set color rules for features in a vector using a numeric attribute column."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:567
+msgid "Interactive management of vector color tables."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:568
+msgid "Query vector map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:569
+msgid "Query with coordinate(s)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:570
+msgid "Queries a vector map layer at given locations."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:571 ../gui/wxpython/menustrings.py:823
+msgid "Query vector attribute data"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:572 ../gui/wxpython/menustrings.py:824
+msgid "Prints vector map attributes."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:573
+msgid "Feature selection"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:574
+msgid "Attribute query"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:575
+msgid ""
+"Selects vector objects from an existing vector map and creates a new map "
+"containing only the selected objects."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:576
+msgid "Spatial query"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:577
+msgid ""
+"Selects features from vector map (A) by features from other vector map (B)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:587
+msgid "Buffer vectors"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:588
+msgid ""
+"Creates a buffer around features of given type (areas must contain centroid)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:589
+msgid "Lidar analysis"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:590
+msgid "Detect edges"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:591
+msgid "Detects the object's edges from a LIDAR data set."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:592
+msgid "Detect interiors"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:593
+msgid ""
+"Building contour determination and Region Growing algorithm for determining "
+"the building inside"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:594
+msgid "Correct and reclassify objects"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:595
+msgid ""
+"Correction of the v.lidar.growing output. It is the last of the three "
+"algorithms for LIDAR filtering."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:596
+msgid "Linear referencing"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:597
+msgid "Create LRS"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:598
+msgid "Creates Linear Reference System"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:599
+msgid "Create stationing"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:600
+msgid "Creates stationing from input lines, and linear reference system"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:601
+msgid "Create points/segments"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:602
+msgid ""
+"Creates points/segments from input lines, linear reference system and "
+"positions read from stdin or a file."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:603
+msgid "Find line id and offset"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:604
+msgid ""
+"Finds line id and real km+offset for given points in vector map using linear "
+"reference system."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:605
+msgid "Nearest features"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:606
+msgid ""
+"Finds the nearest element in vector map 'to' for elements in vector map "
+"'from'."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:607
+msgid "Network analysis"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:608
+msgid "Network maintenance"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:609
+msgid "Performs network maintenance."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:610
+msgid "Allocate subnets"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:611
+msgid "Allocate subnets for nearest centres (direction from centre)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:612
+msgid "Split net"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:613
+msgid "Splits net by cost isolines."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:614
+msgid "Shortest path"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:615
+msgid "Finds shortest path on vector network."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:616
+msgid "Shortest path for sets of features"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:617
+msgid ""
+"Computes shortest distance via the network between the given sets of "
+"features."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:618
+msgid "Shortest path using timetables"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:619
+msgid "Finds shortest path using timetables."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:620
+msgid "Shortest path for all pairs"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:621
+msgid "Computes the shortest path between all pairs of nodes in the network."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:622
+msgid "Visibility network"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:623
+msgid "Visibility graph construction."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:624
+msgid "Bridges and articulation points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:625
+msgid "Computes bridges and articulation points in the network."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:626
+msgid "Maximum flow"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:627
+msgid "Computes the maximum flow between two sets of nodes in the network."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:628
+msgid "Vertex connectivity"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:629
+msgid "Computes vertex connectivity between two sets of nodes in the network."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:630
+msgid "Components"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:631
+msgid "Computes strongly and weakly connected components in the network."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:632
+msgid "Centrality"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:633
+msgid ""
+"Computes degree, centrality, betweeness, closeness and eigenvector "
+"centrality measures in the network."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:634
+msgid "Steiner tree"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:635
+msgid "Create Steiner tree for the network and given terminals"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:636
+msgid "Minimum spanning tree"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:637
+msgid "Computes minimum spanning tree for the network."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:638
+msgid "Traveling salesman analysis"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:639
+msgid "Creates a cycle connecting given nodes (Traveling salesman problem)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:640 ../gui/wxpython/menustrings.py:641
+msgid "Overlay vector maps"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:642
+msgid "Overlays two vector maps."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:643
+msgid "Patch vector maps"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:644
+msgid "Create a new vector map layer by combining other vector map layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:645
+msgid "Change attributes"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:646
+msgid "Manage or report categories"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:647
+msgid "Attach, delete or report vector categories to map geometry."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:649
+msgid ""
+"Changes vector category values for an existing vector map according to "
+"results of SQL queries or a value in attribute table column."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:651
+msgid "Update area attributes from raster"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:652
+msgid ""
+"Calculates univariate statistics from a raster map based on vector polygons "
+"and uploads statistics to new attribute columns."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:653
+msgid "Update point attributes from areas"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:654
+msgid "Uploads vector values at positions of vector points to the table."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:655
+msgid "Update database values from vector"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:656
+msgid "Populates database values from vector features."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:657
+msgid "Sample raster maps at point locations"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:658
+msgid "Uploads raster values at positions of vector points to the table."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:659
+msgid "Sample raster neighborhood around points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:660
+msgid "Samples a raster map at vector point locations."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:661
+msgid "Generate area for current region"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:662
+msgid "Creates a vector polygon from the current region extent."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:663
+msgid "Generate areas from points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:664
+msgid "Convex hull"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:665
+msgid "Produces a convex hull for a given vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:666
+msgid "Delaunay triangles"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:667
+msgid ""
+"Creates a Delaunay triangulation from an input vector map containing points "
+"or centroids."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:668
+msgid "Voronoi diagram/Thiessen polygons"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:669
+msgid ""
+"Creates a Voronoi diagram from an input vector map containing points or "
+"centroids."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:670
+msgid "Generate grid"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:671
+msgid "Creates a GRASS vector map of a user-defined grid."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:672
+msgid "Generate points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:673
+msgid "Generate from database"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:674
+msgid ""
+"Creates new vector (points) map from database table containing coordinates."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:675
+msgid "Generate points along lines"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:676
+msgid "Create points along input lines in new vector with 2 layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:677
+msgid "Generate random points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:678
+msgid "Randomly generate a 2D/3D vector points map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:679
+msgid "Perturb points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:680
+msgid "Random location perturbations of GRASS vector points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:681
+msgid "Remove outliers in point sets"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:682
+msgid "Removes outliers from vector point data."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:683
+msgid "Test/training point sets"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:684
+msgid "Randomly partition points into test/train sets."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:685
+msgid "Reports and statistics"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:686
+msgid "Basic vector metadata"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:687
+msgid "Outputs basic information about a user-specified vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:688
+msgid "Classify attribute data"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:689
+msgid "Classifies attribute data, e.g. for thematic mapping"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:690
+msgid "Report topology by category"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:691
+msgid "Reports geometry statistics for vectors."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:692
+msgid "Univariate attribute statistics for points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:693
+msgid ""
+"Calculates univariate statistics for attribute. Variance and standard "
+"deviation is calculated only for points if specified."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:694
+msgid "Univariate statistics for attribute columns"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:695
+msgid ""
+"Calculates univariate statistics on selected table column for a GRASS vector "
+"map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:696
+msgid "Quadrat indices"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:697
+msgid "Indices for quadrat counts of sites lists."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:698
+msgid "Test normality"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:699
+msgid "Tests for normality for points."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:700
+msgid "&Imagery"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:701
+msgid "Develop images and groups"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:702
+msgid "Create/edit group"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:703
+msgid "Creates, edits, and lists groups of imagery files."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:704
+msgid "Target group"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:705
+msgid "Targets an imagery group to a GRASS location and mapset."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:706
+msgid "Mosaic images"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:707
+msgid "Mosaics up to 4 images and extends colormap; creates map *.mosaic"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:708
+msgid "Manage image colors"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:709
+msgid "Color balance for RGB"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:710
+msgid "Performs auto-balancing of colors for LANDSAT images."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:711
+msgid "HIS to RGB"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:712
+msgid ""
+"Transforms raster maps from HIS (Hue-Intensity-Saturation) color space to "
+"RGB (Red-Green-Blue) color space."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:714
+msgid ""
+"Transforms raster maps from RGB (Red-Green-Blue) color space to HIS (Hue-"
+"Intensity-Saturation) color space."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:715
+msgid "Rectify image or raster"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:716
+msgid ""
+"Rectifies an image by computing a coordinate transformation for each pixel "
+"in the image based on the control points."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:717 ../gui/wxpython/lmgr/layertree.py:457
+msgid "Histogram"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:718
+msgid "Generate histogram of image"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:719
+msgid "Spectral response"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:720
+msgid ""
+"Displays spectral response at user specified locations in group or images."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:721
+msgid "Brovey sharpening"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:722
+msgid ""
+"Brovey transform to merge multispectral and high-res panchromatic channels"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:723
+msgid "Classify image"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:724
+msgid "Clustering input for unsupervised classification"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:725
+msgid ""
+"Generates spectral signatures for land cover types in an image using a "
+"clustering algorithm."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:726
+msgid "Input for supervised MLC"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:727
+msgid "Generates statistics for i.maxlik from raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:728
+msgid "Maximum likelihood classification (MLC)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:729
+msgid "Classifies the cell spectral reflectances in imagery data."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:730
+msgid "Interactive input for supervised classification (requires Xterm)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:731
+msgid ""
+"Generates spectral signatures for an image by allowing the user to outline "
+"regions of interest."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:732
+msgid "Input for supervised SMAP"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:733
+msgid "Generates statistics for i.smap from raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:734
+msgid "Sequential maximum a posteriori classification (SMAP)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:735
+msgid ""
+"Performs contextual image classification using sequential maximum a "
+"posteriori (SMAP) estimation."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:736
+msgid "Filter image"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:737
+msgid "Edge detection"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:738
+msgid "Zero-crossing \"edge detection\" raster function for image processing."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:739
+msgid "Matrix/convolving filter"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:740
+msgid "Performs raster map matrix filter."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:741
+msgid "Transform image"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:742
+msgid "Canonical correlation"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:743
+msgid "Canonical components analysis (cca) program for image processing."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:744
+msgid "Principal components"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:745
+msgid "Principal components analysis (PCA) for image processing."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:746
+msgid "Fast Fourier"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:747
+msgid "Fast Fourier Transform (FFT) for image processing."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:748
+msgid "Inverse Fast Fourier"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:749
+msgid "Inverse Fast Fourier Transform (IFFT) for image processing."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:750
+msgid "Satellite images tools"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:751
+msgid "Landsat DN to radiance/reflectance"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:752
+msgid ""
+"Calculates top-of-atmosphere radiance or reflectance and temperature for "
+"Landsat MSS/TM/ETM+."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:753
+msgid "Landsat cloud cover assessment"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:754
+msgid "Performs Landsat TM/ETM+ Automatic Cloud Cover Assessment (ACCA)."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:755
+msgid "Modis quality control"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:756
+msgid "Extracts quality control parameters from Modis QC layers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:757
+msgid "Atmospheric correction"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:758
+msgid "Performs atmospheric correction using the 6S algorithm."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:759
+msgid "Topographic correction"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:760
+msgid "Computes topographic correction of reflectance."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:761
+msgid "Satellite images products"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:762
+msgid "Tasseled cap vegetation index"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:763
+msgid "Tasseled Cap (Kauth Thomas) transformation for LANDSAT-TM data"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:765
+msgid "Bit pattern comparison "
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:766
+msgid "Compares bit patterns with a raster map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:767
+msgid "Kappa analysis"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:768
+msgid ""
+"Calculate error matrix and kappa parameter for accuracy assessment of "
+"classification result."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:769
+msgid "OIF for LandSat TM"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:770
+msgid "Calculates Optimum-Index-Factor table for LANDSAT TM bands 1-5, & 7"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:771
+msgid "V&olumes"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:772
+msgid "Develop volumes"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:773
+msgid "Manage 3D NULL values"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:774
+msgid "Explicitly create the 3D NULL-value bitmap file."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:775
+msgid "Manage timestamp"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:776
+msgid "Print/add/remove a timestamp for a 3D raster map"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:780
+msgid "3D Mask"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:781
+msgid "Establishes the current working 3D raster mask."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:782
+msgid "Volume calculator"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:783
+msgid "Map calculator for 3D raster map algebra."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:784
+msgid "Cross section"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:785
+msgid ""
+"Creates cross section 2D raster map from 3D raster map based on 2D elevation "
+"map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:787
+msgid ""
+"Calculates numerically transient, confined groundwater flow in three "
+"dimensions."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:788
+msgid "Interpolate volume from points"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:789
+msgid ""
+"Interpolates point data to a 3D raster map using regularized spline with "
+"tension (RST) algorithm."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:790
+msgid "Report and Statistics"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:791
+msgid "Basic volume metadata"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:792
+msgid "Outputs basic information about a user-specified 3D raster map layer."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:793
+msgid "Voxel statistics"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:794
+msgid "Generates volume statistics for 3D raster maps."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:795
+msgid "Univariate statistics for volumes"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:796
+msgid ""
+"Calculates univariate statistics from the non-null 3d cells of a raster3d "
+"map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:797
+msgid "&Database"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:798
+msgid "Database information"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:799
+msgid "List drivers"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:800
+msgid "Lists all database drivers."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:801
+msgid "List tables"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:802
+msgid "Lists all tables for a given database."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:803
+msgid "Describe table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:804
+msgid "Describes a table in detail."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:805
+msgid "List columns"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:806
+msgid "List all columns for a given table."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:807
+msgid "Manage databases"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:808
+msgid "Connect"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:809
+msgid "Prints/sets general DB connection for current mapset and exits."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:810
+msgid "Login"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:811
+msgid "Sets user/password for driver/database."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:812
+msgid "Drop table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:813
+msgid "Drops an attribute table."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:814
+msgid "Copy table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:815
+msgid "Copy a table."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:816 ../gui/wxpython/menustrings.py:836
+msgid "Drop column"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:817
+msgid "Drops a column from selected attribute table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:818
+msgid "Test"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:819
+msgid "Test database driver, database must exist and set by db.connect."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:821
+msgid "Query any table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:822
+msgid "Selects data from attribute table (performs SQL query statement(s))."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:825
+msgid "SQL statement"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:826
+msgid "Executes any SQL statement."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:827
+msgid "Vector database connections"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:828
+msgid "New table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:829
+msgid ""
+"Creates and connects a new attribute table to a given layer of an existing "
+"vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:830
+msgid "Remove table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:831
+msgid "Removes existing attribute table of a vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:832
+msgid "Join table"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:833
+msgid "Allows to join a table to a vector map table."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:834
+msgid "Add columns"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:835
+msgid ""
+"Adds one or more columns to the attribute table connected to a given vector "
+"map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:837
+msgid ""
+"Drops a column from the attribute table connected to a given vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:839
+msgid ""
+"Renames a column in the attribute table connected to a given vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:840
+msgid "Change values"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:841
+msgid ""
+"Allows to update a column in the attribute table connected to a vector map."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:842
+msgid "Reconnect vectors to database"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:843
+msgid "Reconnects vectors to a new database."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:844
+msgid "Set vector map - database connection"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:845
+msgid "Prints/sets DB connection for a vector map to attribute table."
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:846 ../gui/wxpython/menustrings.py:898
+msgid "&Help"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:847
+msgid "GRASS help"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:848 ../gui/wxpython/menustrings.py:850
+msgid "Display the HTML man pages of GRASS"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:849
+msgid "GUI help"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:851
+msgid "About system"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:852
+msgid "Prints system information"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:859
+msgid "Create new model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:861
+msgid "Load model from file"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:865
+msgid "Save model to file"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:867
+msgid "Close model file"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:868
+msgid "Export to image"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:869
+msgid "Export model to image"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:870
+msgid "Export to Python"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:871
+msgid "Export model to Python script"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:872
+msgid "Quit modeler"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:873
+msgid "Close modeler window"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:877
+msgid "&Model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:878
+msgid "Add command"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:879
+msgid "Add action (GRASS command) to model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:880
+msgid "Add data"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:881
+msgid "Add data item to model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:882
+msgid "Define relation"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:883
+msgid "Define relation between data and action items"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:884
+msgid "Add loop / series"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:885
+msgid "Adds loop (series) to model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:886
+msgid "Add condition"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:887
+msgid "Adds condition (if/else) to model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:888
+msgid "Remove item"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:889
+msgid "Remove action/data from model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:891
+msgid "Model properties (name, purpose, etc.)"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:892
+msgid "Delete intermediate data"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:893
+msgid "Delete intermediate data defined in the model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:895
+msgid "Run entire model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:896
+msgid "Validate model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:897
+msgid "Validate entire model"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:899
+msgid "Help"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:900
+msgid "Display the HTML man pages of Graphical modeler"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:901
+msgid "About Graphical Modeler"
+msgstr ""
+
+#: ../gui/wxpython/menustrings.py:902
+msgid "Display information about Graphical Modeler"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:52
+msgid "GRASS GIS Raster Map Calculator"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:55
+msgid "GRASS GIS 3D Raster Map Calculator"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:66
+msgid "mapcalc statement"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:122
+msgid "Operators"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:124
+msgid "Operands"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:126
+msgid "Expression"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:138
+msgid "Save expression to file"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:141
+msgid "Load expression from file"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:145
+msgid "exponent"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:147
+msgid "divide"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:149
+msgid "add"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:151
+msgid "subtract"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:153
+msgid "modulus"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:155
+msgid "multiply"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:160
+msgid "left shift"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:162
+msgid "right shift"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:164
+msgid "right shift (unsigned)"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:166
+msgid "greater than"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:168
+msgid "greater than or equal to"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:170
+msgid "less than"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:172
+msgid "less than or equal to"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:174
+msgid "equal to"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:176
+msgid "not equal to"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:179
+msgid "one's complement"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:181
+msgid "NOT"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:183
+msgid "bitwise AND"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:185
+msgid "bitwise OR"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:187
+msgid "logical AND"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:189
+msgid "logical AND (ignores NULLs)"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:191
+msgid "logical OR"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:193
+msgid "logical OR (ignores NULLs)"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:195
+msgid "conditional"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:208
+msgid "Name for new 3D raster map to create"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:210
+msgid "Name for new raster map to create"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:214
+msgid "Insert existing 3D raster map"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:216
+msgid "Insert existing raster map"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:220
+msgid "Insert mapcalc function"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:227
+msgid "Add created raster map into layer tree"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:466
+msgid "You must enter the name of a new raster map to create."
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:476
+msgid "You must enter an expression to create a new raster map."
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:516
+msgid "Choose a file name to save the expression"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:517
+#: ../gui/wxpython/modules/mcalc_builder.py:538
+msgid "Expression file (*)|*"
+msgstr ""
+
+#: ../gui/wxpython/modules/mcalc_builder.py:537
+msgid "Choose a file name to load the expression"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:31 ../gui/wxpython/modules/vclean.py:113
+msgid "Set up vector cleaning tools"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:68
+msgid "break lines/boundaries"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:69
+msgid "remove duplicates"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:70
+msgid "remove dangles"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:71
+msgid "change boundary dangles to lines"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:72
+msgid "remove bridges"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:73
+msgid "change bridges to lines"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:74
+msgid "snap lines/boundaries"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:75
+msgid "remove duplicate area centroids"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:76
+msgid "break polygons"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:77
+msgid "prune lines/boundaries"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:78
+msgid "remove small areas"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:79
+msgid "remove lines/boundaries of zero length"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:80
+msgid "remove small angles at nodes"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:115
+msgid "Choose cleaning tools and set thresholds"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:119
+msgid "Select input vector map:"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:125
+msgid " Feature type: "
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:129
+msgid "Select output vector map:"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:195
+msgid "line"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:196
+msgid "boundary"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:197
+msgid "centroid"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:198
+#: ../gui/wxpython/vdigit/preferences.py:417
+msgid "area"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:199
+msgid "face"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:355
+#, python-format
+msgid "%s. cleaning tool removed, will be ignored"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:357
+msgid "Please select a cleaning tool to remove"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:378
+#, python-format
+msgid "%s. cleaning tool moved up"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:380
+msgid "1. cleaning tool can not be moved up "
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:382
+msgid "Please select a cleaning tool to move up"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:405
+#, python-format
+msgid "%s. cleaning tool moved down"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:407
+msgid "Last cleaning tool can not be moved down "
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:409
+msgid "Please select a cleaning tool to move down"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:420
+#, python-format
+msgid "cleaning tool: '%s'"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:428
+#, python-format
+msgid "Threshold for %(num)s. tool '%(tool)s': %(thresh)s"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:456
+msgid "Name of input vector map"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:457
+msgid "Name for output vector map"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:458
+msgid "Tools"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:459
+msgid "Threshold"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:461
+#, python-format
+msgid "'%s' not defined"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:463
+#, python-format
+msgid ""
+"Some parameters not defined. Operation canceled.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:468
+msgid "Executing selected cleaning operations..."
+msgstr ""
+
+#: ../gui/wxpython/modules/vclean.py:524
+msgid "Vector cleaning command copied to clipboard"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:71
+msgid "Check all"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:74
+msgid "Clear all"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:130
+msgid "Enter vector attribute values"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:287
+msgid "Bad color format. Use color format '0:0:0'"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:369
+msgid "Select raster map:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:371
+msgid "Select vector map:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:388
+msgid "Import or export color table:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:393
+msgid "Load color table from file:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:394
+msgid "Choose file to load color table"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:395
+msgid "Load"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:396
+msgid "Type filename or click to choose file and load color table"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:402
+msgid "Save color table to file:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:403
+msgid "Choose file to save color table"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:404
+msgid "Type filename or click to choose file and save color table"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:410
+msgid "Reload default table"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:500
+msgid "Preview"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:504
+msgid "Show preview of map (current Map Display extent is used)."
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:534
+msgid "No valid color rules given."
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:600
+msgid "Invalid color table format"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:677
+#, python-format
+msgid "Invalid rule value '%s'. Unable to apply color table."
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:752
+msgid "Create new color table for raster map"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:830
+msgid "Enter raster category values or percents"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:836
+msgid "fp range"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:837
+#, python-format
+msgid "Enter raster category values or percents (%(range)s = %(min)d-%(max)d)"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:926
+msgid "Create new color rules for vector map"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:937
+#: ../gui/wxpython/modules/colorrules.py:1462
+msgid "Enter vector attribute values or percents:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:939
+#: ../gui/wxpython/modules/colorrules.py:1464
+msgid "Enter vector attribute values:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:950
+msgid "Select vector columns"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:952
+msgid "Layer:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:954
+msgid "Attribute column:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:957
+msgid "Load color from column:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:957
+msgid "Save color to column:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:959
+msgid "Load size from column:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:959
+msgid "Save size to column:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:961
+msgid "Load width from column:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:961
+msgid "Save width to column:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:965
+msgid "Use color column instead of color table:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:980
+msgid "Add GRASSRGB column to current attribute table."
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1035
+#: ../gui/wxpython/modules/colorrules.py:1084
+msgid "Import or export color table"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1096
+#, python-format
+msgid ""
+"Database connection for vector map <%s> is not defined in DB file.  Do you "
+"want to create and connect new attribute table?"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1099
+msgid "No database connection defined"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1171
+#, python-format
+msgid ""
+"Selected map <%(map)s> is not in current mapset <%(mapset)s>. Color rules "
+"cannot be edited."
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1176
+#, python-format
+msgid ""
+"Selected map <%(map)s> is not in current mapset <%(mapset)s>. Attribute "
+"table cannot be edited."
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1318
+#, python-format
+msgid "%s column already exists."
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1350
+msgid "Please wait, loading data from attribute table..."
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1411
+#, python-format
+msgid ""
+"Number of loaded records reached %d, displaying all the records will be time-"
+"consuming and may lead to computer freezing, do you still want to continue?"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1415
+msgid "Too many records"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1457
+#, python-format
+msgid "Enter vector attribute values or percents %s:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1459
+#, python-format
+msgid "Enter vector attribute values %s:"
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1596
+msgid "Please select column to save values to."
+msgstr ""
+
+#: ../gui/wxpython/modules/colorrules.py:1633
+msgid "No color column defined. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:43
+msgid "Fetch & install extension from GRASS Addons"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:53
+msgid "Repository"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:55
+msgid "List of extensions"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:59
+msgid "Fetch full info including description and keywords"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:94
+msgid "&Fetch"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:95
+msgid "Fetch list of available modules from GRASS Addons SVN repository"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:98
+msgid "&Install"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:99
+msgid "Install selected add-ons GRASS module"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:172
+msgid "Extension not defined"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:186
+msgid "Fetch list of available extensions by clicking on 'Fetch' button"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:194
+#, python-format
+msgid "%d items match"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:207
+msgid "Fetching list of modules from GRASS-Addons SVN (be patient)..."
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:386
+msgid "Uninstall GRASS Addons extensions"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:395
+msgid "List of installed extensions"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:401
+msgid "&Uninstall"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:402
+msgid "Uninstall selected AddOns extensions"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:449
+msgid "No extension selected for removal. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:458
+#, python-format
+msgid ""
+"List of files to be removed:\n"
+"%(files)s\n"
+"\n"
+"Do you want really to remove <%(ext)s> extension?"
+msgstr ""
+
+#: ../gui/wxpython/modules/extensions.py:491
+msgid "Extension"
+msgstr ""
+
+#: ../gui/wxpython/modules/ogc_services.py:38
+msgid "Import data from WMS server"
+msgstr ""
+
+#: ../gui/wxpython/modules/ogc_services.py:54
+msgid " Server settings "
+msgstr ""
+
+#: ../gui/wxpython/modules/ogc_services.py:56
+msgid "Server:"
+msgstr ""
+
+#: ../gui/wxpython/modules/ogc_services.py:63
+msgid " List of layers "
+msgstr ""
+
+#: ../gui/wxpython/modules/ogc_services.py:79
+msgid "&Connect"
+msgstr ""
+
+#: ../gui/wxpython/modules/ogc_services.py:80
+msgid "Connect to the server"
+msgstr ""
+
+#: ../gui/wxpython/modules/ogc_services.py:167
+msgid ""
+"The 'xml2' parser is required, please install it first. You may also try "
+"running r.in.wms directly from the command line."
+msgstr ""
+
+#: ../gui/wxpython/modules/ogc_services.py:251
+msgid "Layer / Style"
+msgstr ""
+
+#: ../gui/wxpython/modules/ogc_services.py:252
+msgid "Title"
+msgstr ""
+
+#: ../gui/wxpython/modules/ogc_services.py:262
+msgid "Layers"
+msgstr ""
+
+#: ../gui/wxpython/modules/histogram.py:176
+#: ../gui/wxpython/mapdisp/mapwindow.py:438
+msgid "Please wait, exporting image..."
+msgstr ""
+
+#: ../gui/wxpython/modules/histogram.py:266
+msgid "GRASS GIS Histogramming Tool (d.histogram)"
+msgstr ""
+
+#: ../gui/wxpython/modules/histogram.py:343 ../gui/wxpython/nviz/wxnviz.py:321
+#: ../gui/wxpython/nviz/wxnviz.py:332
+#, python-format
+msgid "Raster map <%s> not found"
+msgstr ""
+
+#: ../gui/wxpython/modules/histogram.py:368
+msgid "Select font for histogram text"
+msgstr ""
+
+#: ../gui/wxpython/modules/histogram.py:447
+#: ../gui/wxpython/mapdisp/frame.py:609 ../gui/wxpython/wxplot/base.py:484
+#: ../gui/wxpython/gcp/mapdisplay.py:489
+msgid "Print preview"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:28
+msgid "Query raster/vector map(s)"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:29
+msgid "Query selected raster/vector map(s)"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:31
+msgid "Add scalebar and north arrow"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:33
+msgid "Add legend"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:37
+msgid "Analyze map"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:38
+msgid "Measuring, profiling, histogramming, ..."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:40
+msgid "Measure distance"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:42
+msgid "Profile surface map"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:44
+msgid "Create bivariate scatterplot of raster maps"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:46
+#: ../gui/wxpython/mapdisp/frame.py:1183
+msgid "Add text layer"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:48
+msgid "Create histogram of raster map"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:53
+msgid "Rotate 3D scene"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:54
+msgid "Drag with mouse to rotate 3D scene"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:56
+#: ../gui/wxpython/nviz/preferences.py:208
+msgid "Fly-through mode"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:57
+msgid ""
+"Drag with mouse, hold Ctrl down for different mode or Shift to accelerate"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:59
+msgid "Click mouse to zoom"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:60
+msgid "Click mouse to unzoom"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:78 ../gui/wxpython/mapdisp/frame.py:206
+#: ../gui/wxpython/mapdisp/frame.py:217 ../gui/wxpython/mapdisp/frame.py:269
+#: ../gui/wxpython/mapdisp/frame.py:416
+msgid "2D view"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:84 ../gui/wxpython/lmgr/frame.py:303
+msgid "3D view"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:88
+msgid "3D view mode not available"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:89
+#: ../gui/wxpython/mapdisp/toolbars.py:106
+#, python-format
+msgid "Reason: %s"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:90
+msgid ""
+"Note that the wxGUI's 3D view mode is currently disabled on MS Windows "
+"(hopefully this will be fixed soon). Please keep an eye out for updated "
+"versions of GRASS. In the meantime you can use \"NVIZ\" from the File menu."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:98
+#: ../gui/wxpython/vdigit/toolbars.py:695
+msgid "Digitize"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:105
+msgid "Vector digitizer not available"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/toolbars.py:107
+msgid ""
+"Note that the wxGUI's vector digitizer is currently disabled (hopefully this "
+"will be fixed soon). Please keep an eye out for updated versions of GRASS. "
+"In the meantime you can use \"v.digit\" from the Develop Vector menu."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/gprint.py:285
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/main.py:116
+#, python-format
+msgid "Starting map display <%s>..."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/main.py:123
+msgid "GRASS GIS Map Display: "
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/main.py:129
+#, python-format
+msgid "Stopping map display <%s>..."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:357
+msgid "Render"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:363
+msgid "Enable/disable auto-rendering"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:385
+msgid "Show comp. extent"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:388
+msgid "Show computational extent"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:392
+msgid ""
+"Show/hide computational region extent (set with g.region). Display region "
+"drawn as a blue box inside the computational region, computational region "
+"inside a display region as a red box)."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:432
+msgid "Display mode"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:439
+msgid ""
+"Align region extent based on display size from center point. Default value "
+"for new map displays can be set up in 'User GUI settings' dialog."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:452
+msgid "Display resolution"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:459
+msgid ""
+"Constrain display resolution to computational region settings. Default value "
+"for new map displays can be set up in 'User GUI settings' dialog."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:483
+msgid "Map scale"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:497
+msgid ""
+"As everyone's monitors and resolutions are set differently these values are "
+"not true map scales, but should get you into the right neighborhood."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:550
+msgid "Go to"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:571
+#: ../gui/wxpython/mapdisp/statusbar.py:635
+#: ../gui/wxpython/mapdisp/statusbar.py:809
+#: ../gui/wxpython/mapdisp/statusbar.py:875
+msgid "Projection not defined (check the settings)"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:649
+#: ../gui/wxpython/mapdisp/statusbar.py:822
+#: ../gui/wxpython/mapdisp/statusbar.py:905
+msgid "Error in projection (check the settings)"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:683
+msgid "Use defined projection"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:695
+msgid ""
+"Reproject coordinates displayed in the statusbar. Projection can be defined "
+"in GUI preferences dialog (tab 'Projection')"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:720
+msgid "MASK"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:764
+msgid "Display geometry"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:780
+msgid "Coordinates"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:834
+msgid "Extent"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:929
+msgid "Comp. region"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:978
+msgid "Go to GCP No."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:994
+msgid "Valid Range:"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:1056
+msgid "RMS error"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/statusbar.py:1059
+#, python-format
+msgid "Forward: %(forw)s, Backward: %(back)s"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/mapwindow.py:1121
+#: ../gui/wxpython/nviz/mapwindow.py:792
+msgid "Querying is not implemented in standalone mode of Map Display"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/mapwindow.py:1611
+msgid "Zoom to saved region extents"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/mapwindow.py:1620
+#, python-format
+msgid "Region <%s> not found. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/mapwindow.py:1641
+msgid "Save display extents to region file"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/mapwindow.py:1651
+#, python-format
+msgid "Region file <%s> already exists. Do you want to overwrite it?"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:64
+msgid "GRASS GIS - Map display"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:202
+#, python-format
+msgid ""
+"Unable to start wxGUI vector digitizer.\n"
+"Do you want to start TCL/TK digitizer (v.digit) instead?\n"
+"\n"
+"Details: %s"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:209
+msgid "Vector digitizer failed"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:250
+msgid "Vector Digitizer Toolbar"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:271
+#, python-format
+msgid ""
+"Unable to switch to 3D display mode.\n"
+"The Nviz python extension was not found or loaded properly.\n"
+"Switching back to 2D display mode.\n"
+"\n"
+"Details: %s"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:296
+msgid "Starting 3D view mode..."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:298
+msgid "Please wait, loading data..."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:354
+msgid "Please wait, unloading data..."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:355
+msgid "Switching back to 2D view mode..."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:385 ../gui/wxpython/gcp/mapdisplay.py:222
+msgid "Map Toolbar"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:561 ../gui/wxpython/gcp/mapdisplay.py:441
+msgid "Nothing to render (empty map). Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:663
+msgid "No raster or vector map layer selected for querying."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:754
+#, python-format
+msgid "Vector map <%s> opened for editing - skipped."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:759
+msgid "Nothing to query."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:827
+msgid "Nothing found."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:955
+msgid ""
+"Click and drag with left mouse button to measure.\n"
+"Double click with left button to clear."
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:961
+msgid "Measuring distance"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:964
+msgid "Measuring distance:"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:974
+#, python-format
+msgid ""
+"Geodesic distance is not yet supported by this tool.\n"
+"Reason: %s"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:1004 ../gui/wxpython/mapdisp/frame.py:1010
+msgid "segment"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:1005 ../gui/wxpython/mapdisp/frame.py:1011
+msgid "total distance"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:1006
+msgid "bearing"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:1006
+msgid "degrees (clockwise from grid-north)"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:1121
+msgid "Scale and North arrow"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:1274 ../gui/wxpython/gcp/mapdisplay.py:578
+msgid "Zoom to computational region (set with g.region)"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:1278 ../gui/wxpython/gcp/mapdisplay.py:582
+msgid "Zoom to default region"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:1282 ../gui/wxpython/gcp/mapdisplay.py:586
+msgid "Zoom to saved region"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:1286
+msgid "Set computational region from display extent"
+msgstr ""
+
+#: ../gui/wxpython/mapdisp/frame.py:1290 ../gui/wxpython/gcp/mapdisplay.py:594
+msgid "Save display geometry to named region"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:83 ../gui/wxpython/nviz/preferences.py:55
+#: ../gui/wxpython/nviz/preferences.py:60
+msgid "View"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:95
+msgid "Analysis"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:98 ../gui/wxpython/nviz/tools.py:378
+msgid "Animation"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:218
+msgid "Control View"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:239
+msgid "Adjusts the distance and angular perspective of the image viewpoint"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:244 ../gui/wxpython/nviz/preferences.py:68
+msgid "Perspective:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:252
+msgid "Tilts the plane of the surface from the horizontal"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:256 ../gui/wxpython/nviz/tools.py:1020
+msgid "Tilt:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:263
+msgid ""
+"Adjusts the viewing height above the surface (angle of view automatically "
+"adjusts to maintain the same center of view)"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:268
+msgid "Adjusts the relative height of features above the plane of the surface"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:282 ../gui/wxpython/nviz/preferences.py:149
+msgid "Z-exag:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:295
+msgid "Look:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:298
+msgid "here"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:301
+msgid ""
+"Allows you to select a point on the surface that becomes the new center of "
+"view. Click on the button and then on the surface."
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:307
+msgid "center"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:310
+msgid "Resets the view to the original default center of view"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:314
+msgid "top"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:317
+msgid ""
+"Sets the viewer directly over the scene's center position. This top view "
+"orients approximately north south."
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:321
+msgid "reset"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:322
+msgid "Reset to default view"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:340 ../gui/wxpython/nviz/preferences.py:171
+msgid "Image Appearance"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:385
+msgid ""
+"Press 'Record' button and start changing the view. It is recommended to use "
+"fly-through mode (Map Display toolbar) to achieve smooth motion."
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:396
+msgid "Record"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:398
+msgid "Play"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:400
+msgid "Pause"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:402
+msgid "Stop"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:414
+msgid "Total number of frames :"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:418
+msgid "Frame rate (FPS):"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:424
+msgid "Frames are recorded with given frequency (FPS). "
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:467
+msgid "Save image sequence"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:475
+msgid "Choose a directory for images"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:479
+msgid "File prefix:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:483
+msgid ""
+"Generated files names will look like this: prefix_1.ppm, prefix_2.ppm, ..."
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:484
+msgid "File format:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:542 ../gui/wxpython/nviz/tools.py:1766
+#: ../gui/wxpython/nviz/preferences.py:360
+msgid "Surface"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:548 ../gui/wxpython/nviz/tools.py:1079
+msgid "Constant surface"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:553 ../gui/wxpython/nviz/preferences.py:462
+msgid "Vector"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:559
+msgid "Volume"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:594 ../gui/wxpython/nviz/preferences.py:252
+msgid "Lighting"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:599
+msgid "Fringe"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:606
+msgid "Decorations"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:626 ../gui/wxpython/nviz/tools.py:937
+msgid "Cutting planes"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:671 ../gui/wxpython/nviz/tools.py:1467
+#: ../gui/wxpython/nviz/preferences.py:367
+msgid "Draw"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:678 ../gui/wxpython/nviz/tools.py:1474
+#: ../gui/wxpython/nviz/preferences.py:373
+msgid "Mode:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:681 ../gui/wxpython/nviz/preferences.py:376
+msgid "coarse"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:682 ../gui/wxpython/nviz/preferences.py:377
+msgid "fine"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:683 ../gui/wxpython/nviz/preferences.py:378
+msgid "both"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:692 ../gui/wxpython/nviz/tools.py:953
+#: ../gui/wxpython/nviz/tools.py:1488
+msgid "Shading:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:695 ../gui/wxpython/nviz/tools.py:1254
+#: ../gui/wxpython/nviz/tools.py:1491
+msgid "flat"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:696 ../gui/wxpython/nviz/tools.py:1492
+msgid "gouraud"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:704
+msgid "Set to all"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:705
+msgid "Use draw settings for all loaded surfaces"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:713 ../gui/wxpython/nviz/preferences.py:405
+msgid "Coarse mode:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:716 ../gui/wxpython/nviz/tools.py:756
+#: ../gui/wxpython/nviz/preferences.py:392
+#: ../gui/wxpython/nviz/preferences.py:409
+msgid "resolution:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:729 ../gui/wxpython/nviz/preferences.py:421
+msgid "style:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:732 ../gui/wxpython/nviz/preferences.py:424
+msgid "wire"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:733 ../gui/wxpython/nviz/preferences.py:425
+msgid "surface"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:745
+msgid "Change wire color"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:752 ../gui/wxpython/nviz/preferences.py:388
+msgid "Fine mode:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:777
+msgid "Surface attributes"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:787 ../gui/wxpython/nviz/tools.py:2272
+msgid "Transparency"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:788 ../gui/wxpython/nviz/tools.py:2273
+msgid "Shininess"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:794 ../gui/wxpython/nviz/tools.py:2284
+msgid "map"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:797 ../gui/wxpython/nviz/tools.py:2289
+msgid "unset"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:802 ../gui/wxpython/nviz/tools.py:2294
+msgid "constant"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:859
+msgid "Changes the x, y, and z position of the current surface"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:869 ../gui/wxpython/nviz/tools.py:1055
+#: ../gui/wxpython/nviz/tools.py:1598 ../gui/wxpython/nviz/tools.py:2454
+msgid "Reset"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:870 ../gui/wxpython/nviz/tools.py:1599
+msgid "Reset to default position"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:943
+msgid "Active cutting plane:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:955
+msgid "clear"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:956
+msgid "top color"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:957
+msgid "bottom color"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:958
+msgid "blend"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:959
+msgid "shaded"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:971
+msgid "Horizontal X:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:973
+msgid "Sets the X coordinate of the current cutting plane"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:987
+msgid "Horizontal Y:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:989
+msgid "Sets the Y coordinate of the current cutting plane"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1006
+msgid "Rotates the current cutting plane about vertical axis"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1022
+msgid "Rotates the current cutting plane about horizontal axis"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1038
+msgid ""
+"Sets the Z coordinate of the current cutting plane (only meaningful when "
+"tilt is not 0)"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1107
+msgid "Fine resolution:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1119
+msgid "Value:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1131 ../gui/wxpython/nviz/tools.py:2443
+msgid "Transparency:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1197
+msgid "Show vector lines"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1207 ../gui/wxpython/nviz/preferences.py:468
+msgid "Vector lines"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1214
+msgid "Line:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1217
+msgid "width:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1233 ../gui/wxpython/nviz/tools.py:1339
+msgid "color:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1248
+#: ../gui/wxpython/vdigit/preferences.py:125
+msgid "Display"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1253
+msgid "on surface(s):"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1263 ../gui/wxpython/nviz/tools.py:1390
+msgid "Height above surface:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1298
+msgid "Show vector points"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1307 ../gui/wxpython/nviz/preferences.py:508
+msgid "Vector points"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1318
+msgid "Icon:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1387
+msgid "Display on surface(s):"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1444
+msgid "3D raster map"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1477
+msgid "isosurfaces"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1478
+msgid "slices"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1501
+msgid "Resolution:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1523 ../gui/wxpython/nviz/tools.py:3512
+msgid "List of isosurfaces"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1639
+msgid "Show light model"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1652
+msgid "Light source position"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1668
+msgid "Adjusts the light height"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1692
+msgid "Light color and intensity"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1706 ../gui/wxpython/nviz/preferences.py:306
+msgid "Brightness:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1708
+msgid "Adjusts the brightness of the light"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1717 ../gui/wxpython/nviz/preferences.py:320
+msgid "Ambient:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1719
+msgid "Adjusts the ambient light"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1780
+msgid "Edges with fringe"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1782
+msgid "N && W"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1783
+msgid "N && E"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1784
+msgid "S && W"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1785
+msgid "S && E"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1805
+msgid "Elevation of fringe from bottom:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1858
+msgid "Arrow length (in map units):"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1868
+msgid "Arrow color:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1877
+msgid "Place arrow"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1900
+msgid "Scale bar length (in map units):"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1910
+msgid "Scale bar color:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1919
+msgid "Place scalebar"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1925
+msgid "Delete last"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1958
+msgid "Do you want to record new animation without saving the previous one?"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:1961
+msgid "Animation already axists"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2123
+msgid "No file prefix given."
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2127
+#, python-format
+msgid "Directory %s does not exist."
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2146 ../gui/wxpython/nviz/tools.py:2191
+#: ../gui/wxpython/nviz/tools.py:4299 ../gui/wxpython/nviz/mapwindow.py:2131
+#: ../gui/wxpython/nviz/mapwindow.py:2149
+msgid "constant#"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2257
+msgid "Isosurface attributes"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2263
+msgid "toggle normal direction"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2269
+msgid "Isosurface value"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2372
+msgid "Slice attributes"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2378
+msgid "Slice parallel to axis:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2511
+msgid "W"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2512
+msgid "N"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2513
+msgid "S"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2514
+msgid "E"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2515
+msgid "NW"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2516
+msgid "NE"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2517
+msgid "SE"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:2518
+msgid "SW"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:3007 ../gui/wxpython/nviz/tools.py:3699
+#: ../gui/wxpython/nviz/tools.py:3701 ../gui/wxpython/nviz/tools.py:4602
+msgid "Level"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:3518
+msgid "List of slices"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:3708 ../gui/wxpython/nviz/tools.py:3710
+#: ../gui/wxpython/nviz/tools.py:3987 ../gui/wxpython/nviz/tools.py:4615
+msgid "Slice parallel to"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4305
+msgid "None"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4467
+msgid "Vector map is 3D"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4470
+msgid "Vector map is 2D"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4472
+#, python-format
+msgid "%(features)d features (%(points)d points)"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4635
+msgid "range:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4703 ../gui/wxpython/nviz/tools.py:4714
+msgid "North edge:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4704 ../gui/wxpython/nviz/tools.py:4715
+msgid "South edge:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4705 ../gui/wxpython/nviz/tools.py:4712
+#: ../gui/wxpython/nviz/tools.py:4721
+msgid "West edge:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4706 ../gui/wxpython/nviz/tools.py:4713
+#: ../gui/wxpython/nviz/tools.py:4722
+msgid "East edge:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4708 ../gui/wxpython/nviz/tools.py:4719
+#: ../gui/wxpython/nviz/tools.py:4727
+msgid "Northing (Y):"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4709 ../gui/wxpython/nviz/tools.py:4718
+#: ../gui/wxpython/nviz/tools.py:4728
+msgid "Height (Z):"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4710 ../gui/wxpython/nviz/tools.py:4717
+#: ../gui/wxpython/nviz/tools.py:4726
+msgid "Easting (X):"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4723
+msgid "Bottom edge:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4724
+msgid "Top edge:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4828
+msgid "Adjusts the distance and direction of the image viewpoint"
+msgstr ""
+
+#: ../gui/wxpython/nviz/tools.py:4860
+msgid ""
+"Adjusts the light direction. Click and drag the puck to change the light "
+"direction."
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:31
+msgid "3D view settings"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:48
+msgid "Revert settings to default, changes are not applied"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:71
+#: ../gui/wxpython/nviz/preferences.py:134
+#: ../gui/wxpython/nviz/preferences.py:152
+msgid "value:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:83
+msgid "step:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:98
+#: ../gui/wxpython/nviz/preferences.py:265
+msgid "Position:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:101
+#: ../gui/wxpython/nviz/preferences.py:268
+msgid "x:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:131
+msgid "Twist:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:204
+msgid "Fly-through"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:215
+msgid "Move exag:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:227
+msgid "Turn exag:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:257
+msgid "Light"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:292
+msgid "z:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:436
+msgid "wire color:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:515
+msgid "Size:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:530
+msgid "Marker:"
+msgstr ""
+
+#: ../gui/wxpython/nviz/preferences.py:628
+#, python-format
+msgid "3D view settings saved to file <%s>."
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:204
+msgid ""
+"Opening 3D view was not successful. Please try to change the value of depth "
+"buffer in GUI Settings dialog > tab Map Display > Advanced and restart GUI."
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:530
+#, python-format
+msgid ""
+"Image is too large, your OpenGL implementation supports maximum texture size "
+"%d px."
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1026
+msgid "Easting"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1027
+msgid "Northing"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1028
+msgid "Elevation"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1035
+msgid "Surface map name"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1036
+msgid "Surface map elevation"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1037
+msgid "Surface map color"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1046
+msgid "XY distance from previous"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1047
+msgid "XYZ distance from previous"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1048
+msgid "Distance along surface"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1053
+msgid "Distance along exag. surface"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1060
+msgid "No point on surface"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1505
+msgid "Loading raster map"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1509
+msgid "Loading 3d raster map"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1515
+msgid "failed"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1517
+#, python-format
+msgid "Unsupported layer type '%s'"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1629
+msgid "Unable to unload raster map"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1634
+msgid "Unable to unload 3d raster map"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1635
+msgid "3d raster map"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1645
+msgid "unloaded successfully"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1697
+#, python-format
+msgid "Loading vector map <%(name)s> (%(type)s) failed"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1756
+#, python-format
+msgid "Unable to unload vector map <%(name)s> (%(type)s)"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:1759
+#, python-format
+msgid "Vector map <%(name)s> (%(type)s) unloaded successfully"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:2094
+#, python-format
+msgid "Vector point layer not found (id = %d)"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:2096
+#, python-format
+msgid "Unable to set data layer properties (id = %d)"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:2099
+#, python-format
+msgid ""
+"Setting data layer properties failed.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/nviz/mapwindow.py:2206
+msgid "At least one raster map required"
+msgstr ""
+
+#: ../gui/wxpython/nviz/wxnviz.py:32 ../gui/wxpython/wxplot/profile.py:30
+msgid ""
+"This module requires the NumPy module, which could not be imported. It "
+"probably is not installed (it's not part of the standard Python "
+"distribution). See the Numeric Python site (http://numpy.scipy.org) for "
+"information on downloading source or binaries."
+msgstr ""
+
+#: ../gui/wxpython/nviz/wxnviz.py:49
+#, python-format
+msgid "3D view mode: %s\n"
+msgstr ""
+
+#: ../gui/wxpython/nviz/wxnviz.py:409
+#, python-format
+msgid "Vector map <%s> not found"
+msgstr ""
+
+#: ../gui/wxpython/nviz/wxnviz.py:474 ../gui/wxpython/nviz/wxnviz.py:486
+#, python-format
+msgid "3d raster map <%s> not found"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:35
+msgid "Draw/re-draw plot"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:37
+msgid "Draw transect in map display window to profile"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:39
+msgid "Plot options"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:41
+msgid "Plot statistics"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:43
+msgid "Save profile data to CSV file"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:44
+msgid "Quit plot tool"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:381
+msgid "Left Mouse Down at Point:"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:411 ../gui/wxpython/wxplot/base.py:457
+#: ../gui/wxpython/wxplot/dialogs.py:247
+msgid "Text settings"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:415 ../gui/wxpython/wxplot/base.py:471
+#: ../gui/wxpython/wxplot/dialogs.py:503
+msgid "Plot settings"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:428
+msgid "This feature is not yet functional"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/base.py:429
+msgid "Under Construction"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:52
+msgid "GRASS Profile Analysis Tool"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:63 ../gui/wxpython/wxplot/profile.py:152
+msgid "Profile of"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:77
+#, python-format
+msgid "Distance (%s)"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:79
+msgid "Distance along transect"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:80
+msgid "Cell values"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:145
+msgid "Not all points of profile lie inside computational region."
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:213
+msgid "Raster values"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:264
+msgid "You must draw a transect to profile in the map display window."
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:265
+msgid "Nothing to profile"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:333
+msgid "Choose prefix for file(s) where to save profile values..."
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:335
+msgid "Comma separated value (*.csv)|*.csv"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:345
+msgid "Overwrite file?"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:356
+#, python-format
+msgid ""
+"Unable to open file <%(file)s> for writing.\n"
+"Reason: %(e)s"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:369
+#, python-format
+msgid ""
+"%(l)d files created:\n"
+"%(p)s"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:372
+msgid "No files generated."
+msgstr ""
+
+#: ../gui/wxpython/wxplot/profile.py:380
+msgid "Statistics for Profile(s)"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:34
+msgid "Select raster maps to profile"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:63
+msgid "Select raster map(s) to profile:"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:110
+msgid "Statistics"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:161
+msgid "C&opy"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:162
+msgid "Copy regression statistics the clipboard (Ctrl+C)"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:191
+msgid "Regression statistics copied to clipboard"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:254
+msgid "Profile title:"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:264
+msgid "Title font size (pts):"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:275
+msgid "X-axis label:"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:285
+msgid "Y-axis label:"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:295
+msgid "Label font size (pts):"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:318
+msgid "Font family:"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:332
+msgid "Style:"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:346
+msgid "Weight:"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:378 ../gui/wxpython/wxplot/dialogs.py:764
+msgid "Apply changes for the current session and close dialog"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:434
+#, python-format
+msgid "Plot text sizes saved to file '%s'."
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:492
+msgid "No map or image group selected to plot."
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:523
+msgid "Map/image plotted"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:535
+msgid "Settings for selected map"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:550
+msgid "Line color"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:557
+#: ../gui/wxpython/vdigit/preferences.py:130
+msgid "Line width"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:590
+msgid "Transect segment marker settings"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:641
+msgid "Axis settings"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:647
+msgid "X-Axis"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:648
+msgid "Y-Axis"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:657
+msgid "Scale"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:662
+msgid ""
+"Automatic axis scaling, custom max and min, or scale matches data range (min)"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:667
+msgid "Custom min"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:675
+msgid "Custom max"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:683
+msgid "Log scale"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:707
+msgid "Grid and Legend settings"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:712
+msgid "Grid color"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:719
+msgid "Show grid"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:725
+msgid "Legend font size"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:735
+msgid "Show legend"
+msgstr ""
+
+#: ../gui/wxpython/wxplot/dialogs.py:857
+#, python-format
+msgid "Plot settings saved to file '%s'."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:56
+msgid "Set raster output format"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:62
+msgid "Set vector output format"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:64
+msgid "Add command layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:68
+msgid "Add RGB map layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:70
+msgid "Add HIS map layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:72
+msgid "Add shaded relief map layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:74
+msgid "Add raster flow arrows"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:76
+msgid "Add raster cell numbers"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:78
+msgid "Add thematic area (choropleth) map layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:80
+msgid "Add thematic chart layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:82
+msgid "Add grid layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:84
+msgid "Add geodesic line layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:86
+msgid "Add rhumbline layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:88
+msgid "Add labels"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:90
+msgid "Add 3D raster map layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:91
+msgid "Note that 3D raster data are rendered only in 3D view mode"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:161
+#, python-format
+msgid "GRASS GIS Map Display: %(id)d  - Location: %(loc)s"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:171
+msgid "Map Layers"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:348
+msgid "Change opacity level"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:358
+msgid "3D view properties"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:362
+msgid "Zoom to selected map(s)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:364
+msgid "Set computational region from selected map(s)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:376 ../gui/wxpython/lmgr/layertree.py:449
+msgid "Export"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:383 ../gui/wxpython/lmgr/layertree.py:455
+msgid "Set color table"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:386
+msgid "Show attribute data"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:389
+msgid "Start editing"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:390
+msgid "Stop editing"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:401
+msgid "Use as background vector map for digitizer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:408
+msgid "Rebuild topology"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:443
+msgid "Zoom to selected map(s) (ignore NULLs)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:445
+msgid "Set computational region from selected map(s) (ignore NULLs)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:461
+msgid "Profile"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:553
+msgid "Unable to create profile of raster map."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:589
+msgid "Unable to display histogram of raster map. No map name defined."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:669
+#, python-format
+msgid "Set opacity of <%s>"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:773
+msgid "Layer group:"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:778
+#: ../gui/wxpython/lmgr/layertree.py:1380
+msgid "Click to edit layer settings"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:820
+msgid "(double click to set properties)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:829
+msgid "RGB"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:832
+msgid "HIS"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:835
+msgid "shaded relief"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:838
+msgid "raster cell numbers"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:841
+msgid "raster flow arrows"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:847
+msgid "thematic map"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:850
+msgid "thematic charts"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:853
+msgid "grid"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:856
+msgid "geodesic line"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:859
+msgid "rhumbline"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:862
+msgid "vector labels"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:1097
+#: ../gui/wxpython/lmgr/layertree.py:1156
+msgid "Please wait, updating data..."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:1451
+msgid "opacity:"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/layertree.py:1468
+#, python-format
+msgid "Map <%s> not found."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:50
+msgid "Start new map display"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:52
+msgid "Create new workspace (Ctrl+N)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:54
+msgid "Open existing workspace file (Ctrl+O)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:56
+msgid "Save current workspace to file (Ctrl+S)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:85
+msgid "Add multiple raster or vector map layers (Ctrl+Shift+L)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:86
+msgid "Add raster map layer (Ctrl+Shift+R)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:88
+msgid "Add various raster map layers (RGB, HIS, shaded relief...)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:89
+msgid "Add vector map layer (Ctrl+Shift+V)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:91
+msgid "Add various vector map layers (thematic, chart...)"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:93
+msgid "Add group"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:95
+msgid "Add grid or vector labels overlay"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:97
+msgid "Remove selected map layer(s) from layer tree"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:134
+msgid "Import/link raster or vector data"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:136
+msgid "Raster Map Calculator"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:138
+msgid "Graphical Modeler"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:140
+msgid "Georectifier"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:173
+msgid "GUI settings"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:174
+msgid "GRASS manual"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:199
+msgid "Edit vector maps"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:201
+msgid "Show attribute table"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:230
+msgid "Generate command for m.nviz.image"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:231
+msgid "Generate command for m.nviz.image based on current state"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:233
+msgid "3D view mode settings"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:234
+msgid "Show 3D view mode settings dialog"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/toolbars.py:236
+msgid "Show 3D view mode manual"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/pyshell.py:35
+#, python-format
+msgid "Welcome to wxGUI Interactive Python Shell %s"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/pyshell.py:36
+#, python-format
+msgid "Type %s for more GRASS scripting related information."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/pyshell.py:37
+#, python-format
+msgid "Type %s to add raster or vector to the layer tree."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/pyshell.py:46
+msgid "Delete all text from the shell"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/pyshell.py:96
+#, python-format
+msgid "Raster or vector map <%s> not found"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/pyshell.py:103
+#, python-format
+msgid "Raster map <%s> added"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/pyshell.py:105
+#, python-format
+msgid "Vector map <%s> added"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:76
+msgid "GRASS GIS Layer Manager"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:119
+msgid "Workspace Toolbar"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:122
+msgid "Data Toolbar"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:125
+msgid "Misc Toolbar"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:128
+msgid "Tools Toolbar"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:131
+msgid "Vector Toolbar"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:134
+msgid "3D view Toolbar"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:228 ../gui/wxpython/lmgr/frame.py:1159
+msgid "Rename Map Display"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:256
+msgid "Map layers"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:260 ../gui/wxpython/lmgr/frame.py:456
+msgid "Command console"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:338
+#, python-format
+msgid ""
+"Location <%s> created.\n"
+"\n"
+"Do you want to switch to the new location?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:341
+msgid "Switch to new location?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:354 ../gui/wxpython/lmgr/frame.py:678
+#, python-format
+msgid ""
+"Current location is <%(loc)s>.\n"
+"Current mapset is <%(mapset)s>."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:360 ../gui/wxpython/gis_set.py:442
+msgid "Do you want to set the default region extents and resolution now?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:362 ../gui/wxpython/gis_set.py:444
+#, python-format
+msgid "Location <%s> created"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:411
+msgid "Choose model to run"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:470 ../gui/wxpython/lmgr/frame.py:1787
+msgid "Do you want to save changes in the workspace?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:472 ../gui/wxpython/lmgr/frame.py:1789
+msgid "Do you want to store current settings to workspace file?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:480
+#, python-format
+msgid "Close Map Display %s"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:581 ../gui/wxpython/lmgr/frame.py:1404
+msgid "Selected map layer is not vector."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:586
+msgid "Editing is allowed only for vector maps from the current mapset."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:601
+msgid "Choose script file to run"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:603
+msgid "Python script (*.py)|*.py|Bash script (*.sh)|*.sh"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:614
+#, python-format
+msgid "Script file '%s' doesn't exist. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:621
+#, python-format
+msgid ""
+"Script <%s> is not executable. Do you want to set the permissions that "
+"allows you to run this script (note that you must be the owner of the file)?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:626
+msgid "Set permission?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:635
+msgid "Unable to set permission. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:646
+#, python-format
+msgid ""
+"Directory '%s' is not defined in GRASS_ADDON_PATH. Do you want add this "
+"directory to GRASS_ADDON_PATH?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:649
+msgid "Update Addons path?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:654
+#, python-format
+msgid "Launching script '%s'..."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:666
+msgid "No location/mapset provided. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:685 ../gui/wxpython/gis_set.py:795
+msgid "Enter name for new mapset:"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:692 ../gui/wxpython/lmgr/frame.py:713
+msgid "No mapset provided. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:701 ../gui/wxpython/lmgr/frame.py:720
+#, python-format
+msgid "Current mapset is <%s>."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:765
+msgid "System Info"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:773
+msgid "GRASS version"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:774
+msgid "GRASS SVN Revision"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:779
+msgid "Platform"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:831
+msgid ""
+"Current workspace is not empty. Do you want to store current settings to "
+"workspace file?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:834
+msgid "Create new workspace?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:860
+msgid "Choose workspace file"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:861 ../gui/wxpython/lmgr/frame.py:1053
+msgid "GRASS Workspace File (*.gxw)|*.gxw"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:896
+#, python-format
+msgid ""
+"Reading workspace file <%s> failed.\n"
+"Invalid file, unable to parse XML document."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:900 ../gui/wxpython/lmgr/frame.py:1030
+msgid "Please wait, loading workspace..."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1014
+msgid "Choose GRC file to load"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1015
+msgid "Old GRASS Workspace File (*.grc)|*.grc"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1052
+msgid "Choose file to save current workspace"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1067 ../gui/wxpython/lmgr/frame.py:1083
+#, python-format
+msgid "Workspace file <%s> already exists. Do you want to overwrite this file?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1107
+msgid "Writing current settings to workspace file failed."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1158
+msgid "Enter new name:"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1164
+#, python-format
+msgid "GRASS GIS Map Display: %(name)s  - Location: %(loc)s"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1377
+msgid "Nothing to import. No WMS layer selected."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1413
+msgid "Please wait, loading attribute data..."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1492
+msgid "Add selected map layers into layer tree"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1517
+#, python-format
+msgid "Unsupported map layer type <%s>."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1642
+msgid ""
+"Note that cell values can only be displayed for regions of less than 10,000 "
+"cells."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1724
+#, python-format
+msgid ""
+"Do you want to remove map layer(s)\n"
+"%s\n"
+"from layer tree?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1727
+msgid "Do you want to remove selected map layer(s) from layer tree?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1731
+msgid "Remove map layer"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1796
+msgid "Quit GRASS GUI"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1827
+msgid "No map layer selected. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1837
+msgid ""
+"Display resolution is currently not constrained to computational settings. "
+"It's suggested to constrain map to region geometry. Do you want to constrain "
+"the resolution?"
+msgstr ""
+
+#: ../gui/wxpython/lmgr/frame.py:1846
+msgid "Constrain map to region geometry?"
+msgstr ""
+
+#: ../gui/wxpython/scripts/p.cmd.py:53 ../gui/wxpython/scripts/p.rast.py:99
+#: ../gui/wxpython/scripts/p.vect.py:356
+msgid "GRASS_PYCMDFILE - File not found. Run p.mon."
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:33
+msgid "No GRASS-python library found."
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:65
+msgid "Input Data"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:71
+msgid "Point dataset:"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:83
+msgid "Numeric column:"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:94
+msgid "Kriging"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:114
+msgid "Output"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:118
+msgid "Name for the output raster map:"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:126
+msgid "Export variance map as well: "
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:267
+msgid "Kriging Module"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:271
+msgid "Ready."
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:295
+msgid "Variogram fitting"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:305
+msgid "Plot/refresh variogram"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:316
+msgid ":"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:341
+msgid "Kriging techniques"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:355
+msgid "Block size:"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:388
+msgid "Auto-fit variogram"
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:412
+msgid "Model: "
+msgstr ""
+
+#: ../gui/wxpython/scripts/vkrige.py:496
+msgid "Work in progress! No functionality provided."
+msgstr ""
+
+#: ../gui/wxpython/gcp/mapdisplay.py:45
+msgid "GRASS GIS Manage Ground Control Points"
+msgstr ""
+
+#: ../gui/wxpython/gcp/mapdisplay.py:151
+msgid "GCP List"
+msgstr ""
+
+#: ../gui/wxpython/gcp/mapdisplay.py:156
+msgid "Source Display"
+msgstr ""
+
+#: ../gui/wxpython/gcp/mapdisplay.py:160
+msgid "Target Display"
+msgstr ""
+
+#: ../gui/wxpython/gcp/mapdisplay.py:235
+msgid "GCP Display toolbar"
+msgstr ""
+
+#: ../gui/wxpython/gcp/mapdisplay.py:248
+msgid "GCP Manager toolbar"
+msgstr ""
+
+#: ../gui/wxpython/gcp/mapdisplay.py:590
+msgid "Set computational region from display"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:129
+msgid "Setup for georectification"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:162 ../gui/wxpython/gcp/manager.py:166
+msgid "Georectifying setup canceled."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:299
+msgid "Select map type and location/mapset"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:313
+msgid "Map type to georectify"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:321
+msgid "Select source location:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:330
+msgid "Select source mapset:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:383
+msgid "You must select a valid location before selecting a mapset"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:396
+msgid "You must select a valid location and mapset in order to continue"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:415
+msgid "Select image/map group to georectify"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:434
+msgid "Select group:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:445
+msgid "Create group if none exists"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:449
+msgid "Create/edit group..."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:450
+msgid "Add vector map to group..."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:462 ../gui/wxpython/gcp/manager.py:2618
+msgid "Extension for output maps:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:521
+msgid "You must select a valid image/map group in order to continue"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:528
+msgid "You must enter an map name extension in order to continue"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:594
+msgid "Select maps to display for ground control point (GCP) creation"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:602 ../gui/wxpython/gcp/manager.py:2560
+msgid "Select source map to display:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:613 ../gui/wxpython/gcp/manager.py:2565
+msgid "Select target map to display:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:669
+msgid "You must select a source map in order to continue"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:693
+#, python-format
+msgid ""
+"No maps in selected group <%s>.\n"
+"Please edit group or select another group."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:719
+msgid "Manage Ground Control Points"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:950
+#, python-format
+msgid "At least %d GCPs required. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1037
+msgid "mapwin not defined for "
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1107
+msgid "source"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1109
+msgid "target"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1111
+msgid "Set GCP coordinates"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1112
+#, python-format
+msgid ""
+"Set %(coor)s coordinates for GCP No. %(key)s? \n"
+"\n"
+"East: %(coor0)s \n"
+"North: %(coor1)s"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1176
+msgid "Writing POINTS file failed"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1185
+#, python-format
+msgid "POINTS file saved for group <%s>"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1201
+msgid "source mapwin not defined"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1206
+msgid "target mapwin not defined"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1234
+msgid "Reading POINTS file failed"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1305
+msgid ""
+"Insufficient points defined and active (checked) for selected rectification "
+"method.\n"
+"3+ points needed for 1st order,\n"
+"6+ points for 2nd order, and\n"
+"10+ points for 3rd order."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1332
+msgid "Rectifying images, please wait..."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1384
+#, python-format
+msgid "Transforming <%s>..."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1401 ../gui/wxpython/gcp/manager.py:1472
+#, python-format
+msgid "Georectification of vector map <%s> failed"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1443
+#, python-format
+msgid ""
+"Vector map <%s> already exists. Change extension name and georectify again."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1453
+msgid "For all vector maps georectified successfully,"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1454
+msgid "you will need to copy any attribute tables"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1455
+msgid "and reconnect them to the georectified vectors"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1478
+msgid "GCP Manager settings"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1523
+msgid "Quit GCP Manager"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1524
+msgid "Save ground control points?"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1603
+msgid ""
+"Could not calculate RMS Error.\n"
+"Possible error with g.transform."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1728
+msgid ""
+"Could not calculate new extends.\n"
+"Possible error with g.transform."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1859
+msgid "Adjust source display to target display"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1863
+msgid "Adjust target display to source display"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1924 ../gui/wxpython/gcp/manager.py:1941
+msgid "use"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1925 ../gui/wxpython/gcp/manager.py:1942
+msgid "source E"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1926 ../gui/wxpython/gcp/manager.py:1943
+msgid "source N"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1927 ../gui/wxpython/gcp/manager.py:1944
+msgid "target E"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1928 ../gui/wxpython/gcp/manager.py:1945
+msgid "target N"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1929 ../gui/wxpython/gcp/manager.py:1946
+msgid "Forward error"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:1930 ../gui/wxpython/gcp/manager.py:1947
+msgid "Backward error"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2078
+msgid "Invalid coordinate value. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2117
+msgid "Create vector map group"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2190
+msgid "Select vector map(s) to add to group:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2237
+msgid "Edit GCP"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2248
+msgid "Ground Control Point No."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2267
+msgid "source E:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2268
+msgid "target E:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2269
+msgid "source N:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2270
+msgid "target N:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2405
+msgid "Highlight highest RMS error only"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2411
+msgid "Highlight RMS error > M + SD * factor:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2412
+msgid ""
+"Highlight GCPs with an RMS error larger than \n"
+"mean + standard deviation * given factor. \n"
+"Recommended values for this factor are between 1 and 2."
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2428
+msgid "Symbol settings"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2454
+msgid "Color for high RMS error:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2471
+msgid "Color for selected GCP:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2488
+msgid "Color for unused GCPs:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2504
+msgid "Show unused GCPs"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2513
+msgid "Symbol size:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2585
+msgid "Rectification"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2591
+msgid "Select rectification order"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2592
+msgid "1st order"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2592
+msgid "2nd order"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2592
+msgid "3rd order"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2601
+msgid "Select interpolation method:"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2612
+msgid "clip to computational region in target location"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2651
+msgid "RMS threshold factor must be > 0"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2654
+msgid ""
+"RMS threshold factor is < 1\n"
+"Too many points might be highlighted"
+msgstr ""
+
+#: ../gui/wxpython/gcp/manager.py:2773
+#, python-format
+msgid "GCP Manager settings saved to file '%s'."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:100
+msgid "Choose project location and mapset"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:103
+msgid "Manage"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:105
+#, python-format
+msgid ""
+"Welcome to GRASS GIS %s\n"
+"The world's leading open source GIS"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:109
+msgid ""
+"Select an existing project location and mapset\n"
+"or define a new location"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:115
+msgid ""
+"Project location\n"
+"(projection/coordinate system)"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:118
+msgid ""
+"Accessible mapsets\n"
+"(directories of GIS files)"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:121
+msgid ""
+"Create new mapset\n"
+"in selected location"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:124
+msgid "Define new location"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:127
+msgid ""
+"Rename/delete selected\n"
+"mapset or location"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:132
+msgid "Start &GRASS"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:138
+msgid "&Browse"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:140
+msgid "&Create mapset"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:142
+msgid "&Location wizard"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:143
+msgid ""
+"Start location wizard. After location is created successfully, GRASS session "
+"is started."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:147
+msgid "Rename mapset"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:147
+msgid "Rename location"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:148
+msgid "Delete mapset"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:148
+msgid "Delete location"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:190
+msgid "Welcome to GRASS GIS"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:198
+msgid "Enter GRASS session"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:214 ../gui/wxpython/gis_set.py:655
+msgid "Unable to set GRASS database. Check your locale settings."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:232
+#, python-format
+msgid "ERROR: Location <%s> not found"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:244
+#, python-format
+msgid "ERROR: Mapset <%s> not found"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:383
+#, python-format
+msgid "Invalid line in GISRC file (%(e)s):%(l)s\n"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:412
+#, python-format
+msgid ""
+"Do you want to import data source <%(name)s> to created location? Default "
+"region will be set to match imported map."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:416
+msgid "Import data"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:428
+msgid "Do you want to create new mapset?"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:471
+#, python-format
+msgid "Import of vector data source <%(name)s> failed."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:475
+#, python-format
+msgid "Vector data source <%(name)s> imported successfully."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:490
+#, python-format
+msgid "Attempt to import data source <%(name)s> as raster or vector failed. "
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:494
+#, python-format
+msgid "Raster data source <%(name)s> imported successfully."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:522
+msgid ""
+"Mapset <PERMANENT> is required for valid GRASS location.\n"
+"\n"
+"This mapset cannot be renamed."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:527 ../gui/wxpython/gis_set.py:563
+#, python-format
+msgid ""
+"Current name: %s\n"
+"\n"
+"Enter new name:"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:528
+msgid "Rename selected mapset"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:540
+#, python-format
+msgid ""
+"Unable to rename mapset.\n"
+"\n"
+"Mapset <%s> already exists in location."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:552
+#, python-format
+msgid ""
+"Unable to rename mapset.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:564
+msgid "Rename selected location"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:576
+#, python-format
+msgid ""
+"Unable to rename location.\n"
+"\n"
+"Location <%s> already exists in GRASS database."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:589
+#, python-format
+msgid ""
+"Unable to rename location.\n"
+"\n"
+"%s"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:601
+msgid ""
+"Mapset <PERMANENT> is required for valid GRASS location.\n"
+"\n"
+"This mapset cannot be deleted."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:605
+#, python-format
+msgid ""
+"Do you want to continue with deleting mapset <%(mapset)s> from location <"
+"%(location)s>?\n"
+"\n"
+"ALL MAPS included in this mapset will be PERMANENTLY DELETED!"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:610
+msgid "Delete selected mapset"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:619
+msgid "Unable to delete mapset"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:630
+#, python-format
+msgid ""
+"Do you want to continue with deleting location <%s>?\n"
+"\n"
+"ALL MAPS included in this location will be PERMANENTLY DELETED!"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:634
+msgid "Delete selected location"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:645
+msgid "Unable to delete location"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:809
+#, python-format
+msgid "Mapset <%s> already exists."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:826
+#, python-format
+msgid "Unable to create new mapset: %s"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:839
+#, python-format
+msgid ""
+"GRASS is already running in selected mapset <%(mapset)s>\n"
+"(file %(lock)s found).\n"
+"\n"
+"Concurrent use not allowed.\n"
+"\n"
+"Do you want to try to remove .gislock (note that you need permission for "
+"this operation) and continue?"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:845 ../gui/wxpython/gis_set.py:857
+msgid "Lock file found"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:853
+msgid ""
+"ARE YOU REALLY SURE?\n"
+"\n"
+"If you really are running another GRASS session doing this could corrupt "
+"your data. Have another look in the processor manager just to be sure..."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:868
+#, python-format
+msgid ""
+"Unable to remove '%(lock)s'.\n"
+"\n"
+"Details: %(reason)s"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:918
+#, python-format
+msgid ""
+"Name <%(name)s> is not a valid name for location or mapset. Please use only "
+"ASCII characters excluding %(chars)s and space."
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:921
+msgid "Invalid name"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:984
+msgid "Starting GRASS for the first time"
+msgstr ""
+
+#: ../gui/wxpython/gis_set.py:985
+msgid ""
+"GRASS needs a directory in which to store its data. Create one now if you "
+"have not already done so. A popular choice is \"grassdata\", located in your "
+"home directory."
+msgstr ""
+
+#: ../gui/wxpython/icons/icon.py:83
+#, python-format
+msgid "Unable to load icon theme. Reason: %s"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:84
+msgid "Digitize new point"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:85 ../gui/wxpython/vdigit/toolbars.py:94
+#: ../gui/wxpython/vdigit/toolbars.py:97
+msgid "Left: new point"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:87
+msgid "Digitize new line"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:88 ../gui/wxpython/vdigit/toolbars.py:91
+#: ../gui/wxpython/vdigit/toolbars.py:112
+msgid "Left: new point; Ctrl+Left: undo last point; Right: close line"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:90
+msgid "Digitize new boundary"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:93
+msgid "Digitize new centroid"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:96
+msgid ""
+"Digitize new area (composition of boundaries without category and one "
+"centroid with category)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:99
+msgid "Add new vertex"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:100
+#: ../gui/wxpython/vdigit/toolbars.py:103
+#: ../gui/wxpython/vdigit/toolbars.py:115
+#: ../gui/wxpython/vdigit/toolbars.py:118
+#: ../gui/wxpython/vdigit/toolbars.py:121
+#: ../gui/wxpython/vdigit/toolbars.py:130
+msgid "Left: Select; Ctrl+Left: Unselect; Right: Confirm"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:102
+msgid "Delete feature(s)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:105
+msgid "Display/update attributes"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:106
+#: ../gui/wxpython/vdigit/toolbars.py:109
+msgid "Left: Select"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:108
+msgid "Display/update categories"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:111
+msgid "Edit line/boundary"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:114
+msgid "Move feature(s)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:117
+msgid "Move vertex"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:120
+msgid "Remove vertex"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:122
+#: ../gui/wxpython/vdigit/toolbars.py:377
+msgid "Digitization settings"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:123
+msgid "Quit digitizer"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:124
+msgid "Quit digitizer and save changes"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:125
+msgid "Vector Digitizer manual"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:126
+msgid "Show Vector Digitizer manual"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:128
+msgid "Additional tools (copy, flip, connect, etc.)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:132
+msgid "Undo"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:133
+msgid "Undo previous changes"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:393
+msgid "Break selected lines/boundaries at intersection"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:395
+msgid "Connect selected lines/boundaries"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:397
+msgid "Copy categories"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:399
+msgid "Copy features from (background) vector map"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:401
+msgid "Copy attributes"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:403
+msgid "Feature type conversion"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:405
+msgid "Flip selected lines/boundaries"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:407
+msgid "Merge selected lines/boundaries"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:409
+msgid "Snap selected lines/boundaries (only to nodes)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:411
+msgid "Split line/boundary"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:413
+msgid "Query features"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:415
+msgid "Z bulk-labeling of 3D lines"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:571
+msgid "Vector map is not 3D. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:640
+#: ../gui/wxpython/vdigit/toolbars.py:723
+#: ../gui/wxpython/vdigit/toolbars.py:802
+msgid "Select vector map"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:678
+#, python-format
+msgid "Please wait, opening vector map <%s> for editing..."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:731
+#, python-format
+msgid "Do you want to save changes in vector map <%s>?"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:733
+msgid "Save changes?"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:740
+#, python-format
+msgid "Please wait, closing and rebuilding topology of vector map <%s>..."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:750
+#, python-format
+msgid "Editing of vector map <%s> successfully finished"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/toolbars.py:808
+#: ../gui/wxpython/vdigit/toolbars.py:813
+msgid "New vector map"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:74
+msgid "List of categories - right-click to delete"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:105
+msgid "Add new category"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:144
+msgid "Ignore changes and close dialog"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:146
+msgid "Apply changes and close dialog"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:236 ../gui/wxpython/vdigit/dialogs.py:455
+#, python-format
+msgid ""
+"Unable to add new layer/category <%(layer)s/%(category)s>.\n"
+"Layer and category number must be integer.\n"
+"Layer number must be greater than zero."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:432
+msgid "Unable to update vector map."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:592
+#, python-format
+msgid "%d lines selected for z bulk-labeling"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:595
+msgid "Set value"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:602
+msgid "Starting value"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:611
+msgid "Step"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:641
+msgid "List of duplicates"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:737
+msgid "Feature id"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/dialogs.py:738
+msgid "Layer (Categories)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:53
+msgid "Apply changes for this session"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:56
+msgid "Close dialog and save changes to user settings file"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:148
+msgid "Snapping"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:154
+msgid "Snapping threshold"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:161
+msgid "screen pixels"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:161
+msgid "map units"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:170
+msgid "Snap also to vertex"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:175
+#: ../gui/wxpython/vdigit/preferences.py:603
+#: ../gui/wxpython/vdigit/preferences.py:617
+#: ../gui/wxpython/vdigit/preferences.py:621
+#, python-format
+msgid "Snapping threshold is %(value).1f %(units)s"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:188
+msgid "Select vector features"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:205
+msgid "Select threshold"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:218
+msgid "Select only features inside of selection bounding box"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:220
+msgid ""
+"By default are selected all features overlapping selection bounding box "
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:223
+msgid "Check for duplicates"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:235
+msgid "Digitize line features"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:238
+msgid "Break lines at intersection"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:248
+msgid "Save changes"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:251
+msgid "Save changes on exit"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:263
+msgid "Query tool"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:270
+msgid "Choose query tool"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:275
+msgid "Select by box"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:284
+#: ../gui/wxpython/vdigit/preferences.py:416
+msgid "length"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:289
+msgid "Select lines"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:291
+#: ../gui/wxpython/vdigit/preferences.py:314
+msgid "shorter than"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:291
+#: ../gui/wxpython/vdigit/preferences.py:314
+msgid "longer than"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:307
+msgid "dangle"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:312
+msgid "Select dangles"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:351
+msgid "Digitize new feature"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:356
+msgid "Add new record into table"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:362
+msgid "Mode"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:362
+#: ../gui/wxpython/vdigit/preferences.py:384
+msgid "Next to use"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:372
+msgid "Category number"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:382
+msgid "Category mode"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:384
+msgid "Manual entry"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:384
+msgid "No category"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:397
+msgid "Delete existing feature(s)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:402
+msgid "Delete record from table"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:412
+msgid "Geometry attributes"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:418
+msgid "perimeter"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:484
+msgid ""
+"Note: These settings are stored in the workspace not in the vector digitizer "
+"preferences."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:512
+msgid "Digitize new line segment"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:513
+msgid "Digitize new line/boundary"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:514
+msgid "Highlight"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:515
+msgid "Highlight (duplicates)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:518
+msgid "Boundary (no area)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:519
+msgid "Boundary (one area)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:520
+msgid "Boundary (two areas)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:521
+msgid "Centroid (in area)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:522
+msgid "Centroid (outside area)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:523
+msgid "Centroid (duplicate in area)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:524
+msgid "Node (one line)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:525
+msgid "Node (two lines)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:526
+msgid "Vertex"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:527
+msgid "Area (closed boundary + centroid)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:528
+msgid "Direction"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:596
+msgid "Snapping disabled"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:598
+#, python-format
+msgid "Snapping threshold is %(value).1f %(units)s (based on comp. resolution)"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/preferences.py:654
+#, python-format
+msgid "Vector digitizer settings saved to file <%s>."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/mapwindow.py:371
+msgid "Update categories"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/mapwindow.py:494
+#: ../gui/wxpython/vdigit/mapwindow.py:859
+msgid "No vector map selected for editing."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/mapwindow.py:502
+msgid "Nothing to do. Choose appropriate tool from digitizer toolbar."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/mapwindow.py:992
+msgid "Z bulk-labeling dialog"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdisplay.py:869
+#, python-format
+msgid ""
+"Topology for vector map <%s> is not available. Topology is required by "
+"digitizer. Do you want to rebuild topology (takes some time) and open the "
+"vector map for editing?"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdisplay.py:873
+msgid "Topology missing"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:50
+msgid "Digitization Error"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:55
+#, python-format
+msgid "Unable to open vector map <%s>."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:57
+msgid "No vector map open for editing."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:58
+msgid "Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:65
+msgid "Writing new feature failed. Operation cancelled."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:73
+#, python-format
+msgid "Reading feature id %d failed. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:81
+#, python-format
+msgid "Database link %d not available. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:89
+#, python-format
+msgid "Unable to start database driver <%s>. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:97
+#, python-format
+msgid ""
+"Unable to open database <%(db)s> by driver <%(driver)s>. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:105
+#, python-format
+msgid "Unable to execute SQL query '%s'. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:113
+#, python-format
+msgid "Feature id %d is marked as dead. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:121
+#, python-format
+msgid "Unsupported feature type %d. Operation canceled."
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:467
+#, python-format
+msgid "Unknown feature type '%s'"
+msgstr ""
+
+#: ../gui/wxpython/vdigit/wxdigit.py:472
+msgid "Not enough points for line"
+msgstr ""
diff --git a/locale/po/grasswxpy_ro.po b/locale/po/grasswxpy_ro.po
new file mode 100644
index 0000000..26649d5
--- /dev/null
+++ b/locale/po/grasswxpy_ro.po
@@ -0,0 +1,12523 @@
+# translation of grasswxpy_ro.po into Romanian
+# This file is distributed under the same license as the GRASS package.
+# Copyright (C) 2013 GRASS Development Team
+# Andreea Marin <andreea.marin09 yahoo.com>, 2013.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: grasswxpy_ro\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2013-07-10 00:42+0200\n"
+"PO-Revision-Date: 2013-07-17 21:26+0200\n"
+"Last-Translator: Andreea Marin <andreea.marin09 yahoo.com>\n"
+"Language-Team: GRASS Translation Team <grass-translations at lists.osgeo.org>\n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.5\n"
+
+#: ../gui/wxpython/gui_core/prompt.py:393
+#, python-format
+msgid "Warning: flag <%(flag)s> not found in '%(module)s'"
+msgstr "Atenție: indicatorul <%(flag)s> nu a fost găsit în '%(module)s'"
+
+#: ../gui/wxpython/gui_core/prompt.py:396
+#, python-format
+msgid "Warning: option <%(param)s> not found in '%(module)s'"
+msgstr "Atenție: opțiunea<%(param)s> nu a fost găsită în '%(module)s'"
+
+#: ../gui/wxpython/gui_core/prompt.py:638
+msgid "Type GRASS command and run by pressing ENTER"
+msgstr "Introduceți comanda GRASS și rulați prin apăsarea tastei ENTER"
+
+#: ../gui/wxpython/gui_core/mapdisp.py:84 ../gui/wxpython/core/render.py:434
+#, python-format
+msgid "GRASS module '%s' not found. Unable to start map display window."
+msgstr "Modulul GRASS '%s' nu a fost găsit. Nu poate porni fereastra de vizualizare."
+
+#: ../gui/wxpython/gui_core/gselect.py:314
+msgid "Not selectable element"
+msgstr "Nici un element selectat"
+
+#: ../gui/wxpython/gui_core/gselect.py:335
+#: ../gui/wxpython/gui_core/preferences.py:1649
+msgid "Mapset"
+msgstr "Mapset"
+
+#: ../gui/wxpython/gui_core/gselect.py:359
+#, python-format
+msgid "GSelect: invalid item: %s"
+msgstr "GSelectează: element nevalid: %s"
+
+#: ../gui/wxpython/gui_core/gselect.py:876 ../gui/wxpython/gis_set.py:781
+msgid "Choose GIS Data Directory"
+msgstr "Alege directorul de lucru:"
+
+#: ../gui/wxpython/gui_core/gselect.py:877
+#: ../gui/wxpython/gui_core/gselect.py:1175
+#: ../gui/wxpython/gui_core/gselect.py:1184
+#: ../gui/wxpython/gui_core/gselect.py:1193
+#: ../gui/wxpython/gui_core/gselect.py:1508
+#: ../gui/wxpython/gui_core/gselect.py:1696
+#: ../gui/wxpython/gui_core/forms.py:1308
+#: ../gui/wxpython/gui_core/dialogs.py:1770
+#: ../gui/wxpython/location_wizard/wizard.py:101
+#: ../gui/wxpython/location_wizard/wizard.py:1118
+#: ../gui/wxpython/location_wizard/wizard.py:1192
+#: ../gui/wxpython/location_wizard/wizard.py:1278
+#: ../gui/wxpython/psmap/dialogs.py:1971 ../gui/wxpython/psmap/dialogs.py:2160
+#: ../gui/wxpython/psmap/dialogs.py:4120 ../gui/wxpython/nviz/tools.py:476
+msgid "Browse"
+msgstr "Caută"
+
+#: ../gui/wxpython/gui_core/gselect.py:1101
+#: ../gui/wxpython/gui_core/toolbars.py:77 ../gui/wxpython/nviz/tools.py:1799
+msgid "Settings"
+msgstr "Setări"
+
+#: ../gui/wxpython/gui_core/gselect.py:1105
+msgid "Output settings"
+msgstr "Setările de ieșire"
+
+#: ../gui/wxpython/gui_core/gselect.py:1107
+msgid "Source settings"
+msgstr "Setările sursei"
+
+#: ../gui/wxpython/gui_core/gselect.py:1118
+msgid "Native"
+msgstr "Nativ"
+
+#: ../gui/wxpython/gui_core/gselect.py:1122
+#: ../gui/wxpython/gui_core/forms.py:1307
+msgid "File"
+msgstr "Fișier"
+
+#: ../gui/wxpython/gui_core/gselect.py:1126
+msgid "Directory"
+msgstr "Director"
+
+#: ../gui/wxpython/gui_core/gselect.py:1130
+#: ../gui/wxpython/dbmgr/manager.py:2321 ../gui/wxpython/dbmgr/manager.py:2445
+#: ../gui/wxpython/dbmgr/manager.py:2699
+msgid "Database"
+msgstr "Bază de date"
+
+#: ../gui/wxpython/gui_core/gselect.py:1134
+msgid "Protocol"
+msgstr "Protocol"
+
+#: ../gui/wxpython/gui_core/gselect.py:1148
+msgid "Save current settings"
+msgstr "Salvează setările curente"
+
+#: ../gui/wxpython/gui_core/gselect.py:1151
+msgid "Delete currently selected settings"
+msgstr "Șterge setările curente selectate"
+
+#: ../gui/wxpython/gui_core/gselect.py:1157
+msgid "Output type"
+msgstr "Tipul de ieșire"
+
+#: ../gui/wxpython/gui_core/gselect.py:1159
+msgid "Source type"
+msgstr "Tipul sursei:"
+
+#: ../gui/wxpython/gui_core/gselect.py:1167
+#: ../gui/wxpython/gui_core/gselect.py:1170
+#: ../gui/wxpython/gui_core/gselect.py:1501
+#: ../gui/wxpython/gui_core/gselect.py:1503
+#: ../gui/wxpython/gui_core/gselect.py:1689
+#: ../gui/wxpython/gui_core/gselect.py:1691
+msgid "All files"
+msgstr "Toate fișierele"
+
+#: ../gui/wxpython/gui_core/gselect.py:1174
+#: ../gui/wxpython/gui_core/gselect.py:1507
+msgid "Choose file to import"
+msgstr "Alege fișierul pentru import"
+
+#: ../gui/wxpython/gui_core/gselect.py:1183
+msgid "Choose input directory"
+msgstr "Alege directorul de intrare"
+
+#: ../gui/wxpython/gui_core/gselect.py:1192
+#: ../gui/wxpython/gui_core/gselect.py:1695
+msgid "Choose file"
+msgstr "Alege  fișier"
+
+#: ../gui/wxpython/gui_core/gselect.py:1226
+msgid "File:"
+msgstr "Fișier:"
+
+#: ../gui/wxpython/gui_core/gselect.py:1229
+#: ../gui/wxpython/gui_core/gselect.py:1232
+#: ../gui/wxpython/gui_core/gselect.py:1241
+#: ../gui/wxpython/gui_core/gselect.py:1381
+#: ../gui/wxpython/gmodeler/preferences.py:464
+msgid "Name:"
+msgstr "Nume:"
+
+#: ../gui/wxpython/gui_core/gselect.py:1235
+msgid "Protocol:"
+msgstr "Protocol:"
+
+#: ../gui/wxpython/gui_core/gselect.py:1262
+msgid "Extension:"
+msgstr "Extensie:"
+
+#: ../gui/wxpython/gui_core/gselect.py:1290
+msgid "Load settings:"
+msgstr "Încarcă setările:"
+
+#: ../gui/wxpython/gui_core/gselect.py:1311
+msgid "Format:"
+msgstr "Format:"
+
+#: ../gui/wxpython/gui_core/gselect.py:1333
+msgid "Creation options:"
+msgstr "Crearea opțiunilor:"
+
+#: ../gui/wxpython/gui_core/gselect.py:1370
+#, python-format
+msgid "Settings <%s> not found"
+msgstr "Setările <%s> nu au fost găsite"
+
+#: ../gui/wxpython/gui_core/gselect.py:1382
+#: ../gui/wxpython/gui_core/gselect.py:1403
+msgid "Save settings"
+msgstr "Salvează setările"
+
+#: ../gui/wxpython/gui_core/gselect.py:1389
+msgid "Name not given, settings is not saved."
+msgstr "Numele nu a fost introdus, setările nu sunt salvate."
+
+#: ../gui/wxpython/gui_core/gselect.py:1394
+msgid "No data source defined, settings is not saved."
+msgstr "Nici o sursă data definită, setările nu sunt salvate."
+
+#: ../gui/wxpython/gui_core/gselect.py:1401
+#, python-format
+msgid "Settings <%s> already exists. Do you want to overwrite the settings?"
+msgstr "Setările <%s> există deja. Doriți să suprascrieți setări?"
+
+#: ../gui/wxpython/gui_core/gselect.py:1423
+msgid "No settings is defined. Operation canceled."
+msgstr "Nici o setare nu este definită. Operațiune anulată."
+
+#: ../gui/wxpython/gui_core/gselect.py:1442
+msgid "Unable to save settings"
+msgstr "Nu se pot salva setările"
+
+#: ../gui/wxpython/gui_core/gselect.py:1587
+#, python-format
+msgid "Database <%s> not accessible."
+msgstr "Baza de date  <%s> nu este accesibilă."
+
+#: ../gui/wxpython/gui_core/toolbars.py:31
+msgid "Display map"
+msgstr "Afișează harta"
+
+#: ../gui/wxpython/gui_core/toolbars.py:32
+msgid "Re-render modified map layers only"
+msgstr "Reface afișarea doar a straturilor modificate"
+
+#: ../gui/wxpython/gui_core/toolbars.py:34
+msgid "Render map"
+msgstr "Reface afișarea hărții"
+
+#: ../gui/wxpython/gui_core/toolbars.py:35
+msgid "Force re-rendering all map layers"
+msgstr "Forțează refacerea afișării tuturor straturilor"
+
+#: ../gui/wxpython/gui_core/toolbars.py:37
+msgid "Erase display"
+msgstr "Curăță ecran"
+
+#: ../gui/wxpython/gui_core/toolbars.py:38
+msgid "Erase display canvas with given background color"
+msgstr "Curăță ecranul cu o culoare de fundal"
+
+#: ../gui/wxpython/gui_core/toolbars.py:40
+msgid "Pointer"
+msgstr "Indicator"
+
+#: ../gui/wxpython/gui_core/toolbars.py:42
+msgid "Zoom in"
+msgstr "Mărește harta"
+
+#: ../gui/wxpython/gui_core/toolbars.py:43
+msgid "Drag or click mouse to zoom"
+msgstr "Trageți sau dați click pe mouse pentru a mări"
+
+#: ../gui/wxpython/gui_core/toolbars.py:45
+msgid "Zoom out"
+msgstr "Micșorează harta"
+
+#: ../gui/wxpython/gui_core/toolbars.py:46
+msgid "Drag or click mouse to unzoom"
+msgstr "Trageți sau dați click pe mouse pentru a micșora"
+
+#: ../gui/wxpython/gui_core/toolbars.py:48
+msgid "Return to previous zoom"
+msgstr "Revenire la zoom-ul anterior"
+
+#: ../gui/wxpython/gui_core/toolbars.py:50
+msgid "Various zoom options"
+msgstr "Diverse opțiuni pentru zoom"
+
+#: ../gui/wxpython/gui_core/toolbars.py:51
+msgid "Zoom to computational, default, saved region, ..."
+msgstr "Mărește la regiunea de calcul, în mod implicit, regiune salvată, ..."
+
+#: ../gui/wxpython/gui_core/toolbars.py:53
+msgid "Zoom to selected map layer(s)"
+msgstr "Mărește la stratul de hartă selectat"
+
+#: ../gui/wxpython/gui_core/toolbars.py:55
+msgid "Pan"
+msgstr "Deplasare în zona de afișare"
+
+#: ../gui/wxpython/gui_core/toolbars.py:56
+msgid "Drag with mouse to pan"
+msgstr "Trageți cu mouse-ul pentru deplasare"
+
+#: ../gui/wxpython/gui_core/toolbars.py:58
+msgid "Save display to graphic file"
+msgstr "Salvează afișarea ca fișier grafic"
+
+#: ../gui/wxpython/gui_core/toolbars.py:60
+#: ../gui/wxpython/modules/histogram.py:451
+#: ../gui/wxpython/mapdisp/frame.py:613 ../gui/wxpython/wxplot/base.py:485
+#: ../gui/wxpython/gcp/mapdisplay.py:493
+msgid "Print display"
+msgstr "Printează afișarea"
+
+#: ../gui/wxpython/gui_core/toolbars.py:62
+msgid "Select font"
+msgstr "Selectează font"
+
+#: ../gui/wxpython/gui_core/toolbars.py:64
+msgid "Show manual"
+msgstr "Arată manual"
+
+#: ../gui/wxpython/gui_core/toolbars.py:66
+#: ../gui/wxpython/lmgr/layertree.py:66
+msgid "Quit"
+msgstr "ÃŽnchide"
+
+#: ../gui/wxpython/gui_core/toolbars.py:68
+msgid "Add raster map layer"
+msgstr "Adaugă stratul de raster"
+
+#: ../gui/wxpython/gui_core/toolbars.py:70
+msgid "Add vector map layer"
+msgstr "Adaugă stratul de vector"
+
+#: ../gui/wxpython/gui_core/toolbars.py:72
+msgid "Add map elements"
+msgstr "Adaugă elementele hărții"
+
+#: ../gui/wxpython/gui_core/toolbars.py:73
+msgid "Overlay elements like scale and legend onto map"
+msgstr "Suprapuneți elementele de hartă precum scara și legenda"
+
+#: ../gui/wxpython/gui_core/toolbars.py:75
+msgid "Create histogram with d.histogram"
+msgstr "Crează histograma cu d.histrogram"
+
+#: ../gui/wxpython/gui_core/forms.py:135
+#: ../gui/wxpython/gui_core/forms.py:1252
+msgid "Select Color"
+msgstr "Selectează Culoare"
+
+#: ../gui/wxpython/gui_core/forms.py:424
+msgid "Enter parameters for '"
+msgstr "Introduceți paramatrii pentru'"
+
+#: ../gui/wxpython/gui_core/forms.py:435
+msgid "Close this window without executing the command (Ctrl+Q)"
+msgstr "Închideți această fereastră fără executarea comenzii (Ctrl+Q)"
+
+#: ../gui/wxpython/gui_core/forms.py:455 ../gui/wxpython/gui_core/ghelp.py:211
+#: ../gui/wxpython/gmodeler/model.py:2175
+#: ../gui/wxpython/gmodeler/frame.py:1496
+#: ../gui/wxpython/modules/mcalc_builder.py:133
+#: ../gui/wxpython/modules/vclean.py:156 ../gui/wxpython/scripts/vkrige.py:152
+msgid "&Run"
+msgstr "&Rulează"
+
+#: ../gui/wxpython/gui_core/forms.py:456
+msgid "Run the command (Ctrl+R)"
+msgstr "Rulează comanda (Ctrl+R)"
+
+#: ../gui/wxpython/gui_core/forms.py:462 ../gui/wxpython/modules/vclean.py:159
+msgid "Copy the current command string to the clipboard (Ctrl+C)"
+msgstr "Copiază comanda curentă în clipboard (Ctrl+C)"
+
+#: ../gui/wxpython/gui_core/forms.py:476
+msgid "Show manual page of the command (Ctrl+H)"
+msgstr "Afișează pagina de manual a comenzii (Ctrl+H)"
+
+#: ../gui/wxpython/gui_core/forms.py:497
+msgid "Add created map(s) into layer tree"
+msgstr "Adaugă harta creată la arborele de straturi"
+
+#: ../gui/wxpython/gui_core/forms.py:512
+#: ../gui/wxpython/gui_core/dialogs.py:1471
+msgid "Close dialog on finish"
+msgstr "ÃŽnchide caseta de dialog la final"
+
+#: ../gui/wxpython/gui_core/forms.py:514
+msgid "Close dialog when command is successfully finished. Change this settings in Preferences dialog ('Command' tab)."
+msgstr "Închide caseta de dialog când comanda a fost finalizată cu succes. Schimbă setările în caseta Preferences ('Command' tab)."
+
+#: ../gui/wxpython/gui_core/forms.py:685
+#, python-format
+msgid "'%s' copied to clipboard"
+msgstr "'%s' copiat în clipboard"
+
+#: ../gui/wxpython/gui_core/forms.py:748 ../gui/wxpython/gui_core/forms.py:761
+msgid "Required"
+msgstr "Necesar"
+
+#: ../gui/wxpython/gui_core/forms.py:751 ../gui/wxpython/gui_core/forms.py:761
+msgid "Optional"
+msgstr "Opțional"
+
+#: ../gui/wxpython/gui_core/forms.py:787 ../gui/wxpython/gmodeler/frame.py:117
+#: ../gui/wxpython/scripts/vkrige.py:108
+msgid "Command output"
+msgstr "Comanda de ieșire"
+
+#: ../gui/wxpython/gui_core/forms.py:795
+msgid "Manual"
+msgstr "Manual"
+
+#: ../gui/wxpython/gui_core/forms.py:835
+#: ../gui/wxpython/gui_core/forms.py:1359
+msgid "Parameterized in model"
+msgstr "Parametrizare în model"
+
+#: ../gui/wxpython/gui_core/forms.py:910
+msgid "[multiple]"
+msgstr "[multiple]"
+
+#: ../gui/wxpython/gui_core/forms.py:957
+msgid "valid range"
+msgstr "interval valid"
+
+#: ../gui/wxpython/gui_core/forms.py:1286
+msgid "Transparent"
+msgstr "Transparent"
+
+#: ../gui/wxpython/gui_core/forms.py:1306
+#, python-format
+msgid "Choose %s"
+msgstr "Alege %s"
+
+#: ../gui/wxpython/gui_core/forms.py:1334
+#: ../gui/wxpython/modules/mcalc_builder.py:140
+msgid "&Load"
+msgstr "&Încarcă"
+
+#: ../gui/wxpython/gui_core/forms.py:1340
+msgid "or enter values interactively"
+msgstr "sau introduceți valorile interactiv"
+
+#: ../gui/wxpython/gui_core/forms.py:1520
+msgid "Nothing to load."
+msgstr "Nimic de încărcat."
+
+#: ../gui/wxpython/gui_core/forms.py:1548
+#: ../gui/wxpython/modules/colorrules.py:567
+msgid "Nothing to save."
+msgstr "Nimic de salvat."
+
+#: ../gui/wxpython/gui_core/forms.py:1552
+msgid "Save input as..."
+msgstr "Salvează datele de intrare ca..."
+
+#: ../gui/wxpython/gui_core/forms.py:1800
+#, python-format
+msgid "Error in %s"
+msgstr "Eroare în %s"
+
+#: ../gui/wxpython/gui_core/forms.py:1904
+#, python-format
+msgid "Unable to parse command '%s'"
+msgstr "Nu poate fi analizată comanda '%s'"
+
+#: ../gui/wxpython/gui_core/forms.py:1910
+#, python-format
+msgid "%(cmd)s: parameter '%(key)s' not available"
+msgstr "%(cmd)s: parametrul '%(key)s' nu este disponibil"
+
+#: ../gui/wxpython/gui_core/forms.py:2017
+#, python-format
+msgid "usage: %s <grass command>"
+msgstr "utilizare: %s <grass command>"
+
+#: ../gui/wxpython/gui_core/widgets.py:393
+#: ../gui/wxpython/modules/extensions.py:312
+msgid "Menu tree"
+msgstr "Arborele de meniu"
+
+#: ../gui/wxpython/gui_core/dialogs.py:114
+msgid "Type of element:"
+msgstr "Tipul elementului:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:145
+msgid "Select GRASS location and mapset"
+msgstr "Selectează locație și mapset"
+
+#: ../gui/wxpython/gui_core/dialogs.py:146
+msgid "Name of GRASS location:"
+msgstr "Numele locației:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:166
+#: ../gui/wxpython/gui_core/dialogs.py:198
+msgid "Name of mapset:"
+msgstr "Numele mapset-ului"
+
+#: ../gui/wxpython/gui_core/dialogs.py:196
+msgid "Select mapset in GRASS location"
+msgstr "Selectează mapset în locația GRASS"
+
+#: ../gui/wxpython/gui_core/dialogs.py:224
+#: ../gui/wxpython/gui_core/dialogs.py:337 ../gui/wxpython/menustrings.py:520
+msgid "Create new vector map"
+msgstr "Crează o nouă hartă vectorială"
+
+#: ../gui/wxpython/gui_core/dialogs.py:239
+msgid "Name for new vector map:"
+msgstr "Nume pentru noua hartă vectorială:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:245
+msgid "Create attribute table"
+msgstr "Crează tabela de atribute"
+
+#: ../gui/wxpython/gui_core/dialogs.py:257
+#: ../gui/wxpython/gui_core/preferences.py:852
+msgid "Add created map into layer tree"
+msgstr "Adaugă harta creată în arborele de straturi"
+
+#: ../gui/wxpython/gui_core/dialogs.py:287
+#: ../gui/wxpython/gui_core/preferences.py:1072
+msgid "Key column:"
+msgstr "Coloana primară:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:362
+#, python-format
+msgid "Unable to create vector map <%s>."
+msgstr "Nu se poate crea harta vectorială <%s>."
+
+#: ../gui/wxpython/gui_core/dialogs.py:367
+#, python-format
+msgid ""
+"Invalid or empty key column.\n"
+"Unable to create vector map <%s>."
+msgstr ""
+"Coloană primară nevalidă sau goală.\n"
+" Nu se poate crea harta vectorială <%s>."
+
+#: ../gui/wxpython/gui_core/dialogs.py:384
+#, python-format
+msgid "Vector map <%s> already exists in the current mapset. Do you want to overwrite it?"
+msgstr "Harta vectorială <%s> există deja în mapset-ul curent. Doriți să suprascrieți?"
+
+#: ../gui/wxpython/gui_core/dialogs.py:387
+msgid "Overwrite?"
+msgstr "Suprascrieți?"
+
+#: ../gui/wxpython/gui_core/dialogs.py:434
+#, python-format
+msgid "New vector map <%s> created"
+msgstr "Noua hartă vectorială <%s> a fost creată"
+
+#: ../gui/wxpython/gui_core/dialogs.py:456
+msgid "Load region:"
+msgstr "Încarcă regiunea:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:460
+msgid "Save region:"
+msgstr "Salvează regiunea:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:527
+#: ../gui/wxpython/lmgr/layertree.py:93
+msgid "Set options"
+msgstr "Setează opțiunile"
+
+#: ../gui/wxpython/gui_core/dialogs.py:533
+msgid "Set size and position"
+msgstr "Setează dimensiune și poziție"
+
+#: ../gui/wxpython/gui_core/dialogs.py:534
+msgid "Click and drag on the map display to set legend size and position and then press OK"
+msgstr "Click și trageți de harta afișată pentru a seta dimensiunea și poziția legendei și apoi apăsați OK"
+
+#: ../gui/wxpython/gui_core/dialogs.py:544
+msgid ""
+"Drag legend object with mouse in pointer mode to position.\n"
+"Double-click to change options.\n"
+"Define raster map name for legend in properties dialog."
+msgstr ""
+"Deplasează obiectul legendă cu mouse-ul.\n"
+"Dublu click pentru a schimba opțiunile"
+
+#: ../gui/wxpython/gui_core/dialogs.py:548
+msgid ""
+"Drag scale object with mouse in pointer mode to position.\n"
+"Double-click to change options."
+msgstr ""
+"Deplasează obiectul scară cu mouse-ul.\n"
+"Dublu click pentru a schimba opțiunile"
+
+#: ../gui/wxpython/gui_core/dialogs.py:596
+#, python-format
+msgid "Legend of raster map <%s>"
+msgstr "Legenda hărții raster <%s>"
+
+#: ../gui/wxpython/gui_core/dialogs.py:690
+msgid "Show text object"
+msgstr "Afișează obiectul text"
+
+#: ../gui/wxpython/gui_core/dialogs.py:700
+#: ../gui/wxpython/psmap/dialogs.py:3712
+msgid "Enter text:"
+msgstr "Introduceți textul:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:716 ../gui/wxpython/nviz/tools.py:1004
+msgid "Rotation:"
+msgstr "Rotația:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:729
+#: ../gui/wxpython/gui_core/preferences.py:423
+#: ../gui/wxpython/gui_core/preferences.py:595
+msgid "Set font"
+msgstr "Setează font"
+
+#: ../gui/wxpython/gui_core/dialogs.py:740
+msgid ""
+"Drag text with mouse in pointer mode to position.\n"
+"Double-click to change options"
+msgstr ""
+"Deplasați textul cu mouse-ul.\n"
+"Dublu click pentru a schimba opțiunile"
+
+#: ../gui/wxpython/gui_core/dialogs.py:821
+msgid "Create or edit imagery groups"
+msgstr "Crează sau editează grupurile de imagini"
+
+#: ../gui/wxpython/gui_core/dialogs.py:839
+msgid "Apply changes to selected group and close dialog"
+msgstr "Aplică modificările pentru grupul selectat și închide caseta de dialog"
+
+#: ../gui/wxpython/gui_core/dialogs.py:840
+msgid "Apply changes to selected group"
+msgstr "Aplică modificările pentru grupul selectat"
+
+#: ../gui/wxpython/gui_core/dialogs.py:841
+msgid "Close dialog, changes are not applied"
+msgstr "Închide caseta de dialog,  modificările nu sunt aplicate"
+
+#: ../gui/wxpython/gui_core/dialogs.py:882
+msgid "Select the group you want to edit or enter name of new group:"
+msgstr "Selectează grupul pe care doriți să-l editați sau introduceți un nume pentru noul grup:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:893
+msgid "Layers in selected group:"
+msgstr "Straturi în grupul selectat:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:905
+msgid "Select map layers and add them to the list."
+msgstr "Selectează straturile hărții și le adaugă la listă."
+
+#: ../gui/wxpython/gui_core/dialogs.py:909
+msgid "Remove selected layer(s) from list."
+msgstr "Elimină straturile selectate din listă."
+
+#: ../gui/wxpython/gui_core/dialogs.py:919
+msgid "Define also sub-group (same name as group)"
+msgstr "Definește un subgrup (același nume ca cel al grupului)"
+
+#: ../gui/wxpython/gui_core/dialogs.py:934
+msgid "Add selected map layers into group"
+msgstr "Adaugă straturile selectate în grup"
+
+#: ../gui/wxpython/gui_core/dialogs.py:968
+#, python-format
+msgid "Group <%s> was changed, do you want to apply changes?"
+msgstr "Grupul  <%s> a fost modificat, doriți să fie aplicate schimbările?"
+
+#: ../gui/wxpython/gui_core/dialogs.py:970
+msgid "Unapplied changes"
+msgstr "Modificări neaplicate"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1052
+#, python-format
+msgid "No changes to apply in group <%s>."
+msgstr "Nici o modificare nu a fost aplicată în grup <%s>."
+
+#: ../gui/wxpython/gui_core/dialogs.py:1055
+#, python-format
+msgid "Group <%s> was successfully created."
+msgstr "Grupul <%s> a fost creat cu succes."
+
+#: ../gui/wxpython/gui_core/dialogs.py:1057
+#, python-format
+msgid "Group <%s> was successfully changed."
+msgstr "Grupul <%s> a fost modificat cu succes."
+
+#: ../gui/wxpython/gui_core/dialogs.py:1060
+#, python-format
+msgid "Creating of new group <%s> failed."
+msgstr "Crearea grupului nou  <%s> a eșuat."
+
+#: ../gui/wxpython/gui_core/dialogs.py:1062
+#, python-format
+msgid "Changing of group <%s> failed."
+msgstr "Modificarea grupului <%s> a eșuat."
+
+#: ../gui/wxpython/gui_core/dialogs.py:1091
+msgid "No group selected."
+msgstr "Nici un grup selectat."
+
+#: ../gui/wxpython/gui_core/dialogs.py:1153
+msgid "Use fully-qualified map names"
+msgstr "Utilizarea numelui complet a hărții"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1160
+#, python-format
+msgid "Dynamic series (%s)"
+msgstr "Serii dinamice (%s)"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1198
+msgid "Map type:"
+msgstr "Tipul hărții:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1203
+#: ../gui/wxpython/psmap/dialogs.py:695 ../gui/wxpython/gmodeler/frame.py:1326
+#: ../gui/wxpython/lmgr/layertree.py:823 ../gui/wxpython/gcp/manager.py:314
+msgid "raster"
+msgstr "raster"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1203
+#: ../gui/wxpython/lmgr/layertree.py:826
+msgid "3D raster"
+msgstr "3D raster"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1203
+#: ../gui/wxpython/psmap/dialogs.py:696 ../gui/wxpython/gmodeler/frame.py:1327
+#: ../gui/wxpython/lmgr/layertree.py:844 ../gui/wxpython/gcp/manager.py:314
+msgid "vector"
+msgstr "vector"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1221
+msgid "Select toggle"
+msgstr "Selectează declanșator"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1228
+msgid "Mapset:"
+msgstr "Mapset:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1238
+msgid "Pattern:"
+msgstr "Model:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1250
+msgid "List of maps:"
+msgstr "Lista hărților"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1304
+#: ../gui/wxpython/gui_core/dialogs.py:1906
+#: ../gui/wxpython/dbmgr/manager.py:1139
+msgid "Select all"
+msgstr "Selectează tot"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1305
+msgid "Invert selection"
+msgstr "Selecție inversă"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1306
+#: ../gui/wxpython/gui_core/dialogs.py:1907
+#: ../gui/wxpython/dbmgr/manager.py:1140
+msgid "Deselect all"
+msgstr "Deselectează tot"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1412
+msgid "Multiple import"
+msgstr "Importare multiple"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1426
+#, python-format
+msgid " List of %s layers "
+msgstr "Lista %s layere"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1431
+msgid "Layer id"
+msgstr "Strat id"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1432
+msgid "Layer name"
+msgstr "Strat nume"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1433
+msgid "Name for GRASS map (editable)"
+msgstr "Nume pentru harta GRASS (editabilă)"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1438
+#: ../gui/wxpython/modules/extensions.py:68
+msgid "Options"
+msgstr "Opțiuni"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1466
+#: ../gui/wxpython/gui_core/preferences.py:832
+#: ../gui/wxpython/gmodeler/preferences.py:442
+#: ../gui/wxpython/modules/vclean.py:135 ../gui/wxpython/scripts/vkrige.py:139
+msgid "Allow output files to overwrite existing files"
+msgstr "Permiteți fișierele de ieșire pentru a suprascrie fișierele existente"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1479
+#: ../gui/wxpython/modules/ogc_services.py:77
+#: ../gui/wxpython/gcp/manager.py:2374
+msgid "Close dialog"
+msgstr "ÃŽnchide caseta de dialog"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1482
+#: ../gui/wxpython/gui_core/dialogs.py:1661
+#: ../gui/wxpython/modules/ogc_services.py:85
+msgid "&Import"
+msgstr "&Import"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1483
+#: ../gui/wxpython/gui_core/dialogs.py:1662
+#: ../gui/wxpython/modules/ogc_services.py:86
+msgid "Import selected layers"
+msgstr "Importă straturile selectate"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1489
+#: ../gui/wxpython/modules/extensions.py:102
+#: ../gui/wxpython/modules/extensions.py:404
+msgid "Command dialog"
+msgstr "Caseta de comandă"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1633 ../gui/wxpython/menustrings.py:152
+#: ../gui/wxpython/lmgr/layertree.py:60
+msgid "Link external vector data"
+msgstr "Leagă date vectoriale externe"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1635 ../gui/wxpython/menustrings.py:56
+#: ../gui/wxpython/lmgr/layertree.py:58
+msgid "Import vector data"
+msgstr "Import date vectoriale"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1639 ../gui/wxpython/menustrings.py:150
+#: ../gui/wxpython/lmgr/layertree.py:54
+msgid "Link external raster data"
+msgstr "Leagă date raster externe"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1641 ../gui/wxpython/menustrings.py:29
+#: ../gui/wxpython/lmgr/layertree.py:52
+msgid "Import raster data"
+msgstr "Import date de tip raster"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1647
+msgid "Add linked layers into layer tree"
+msgstr "Adaugă straturile de legătură în arborele de straturi"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1649
+#: ../gui/wxpython/gui_core/dialogs.py:1775
+#: ../gui/wxpython/modules/ogc_services.py:69
+msgid "Add imported layers into layer tree"
+msgstr "Adaugă straturile importate în arborele de straturi"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1654
+msgid "&Link"
+msgstr "&Link"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1655
+msgid "Link selected layers"
+msgstr "Leagă straturile selectate"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1657
+#: ../gui/wxpython/gui_core/dialogs.py:1659
+#: ../gui/wxpython/gui_core/dialogs.py:1664
+#: ../gui/wxpython/gui_core/dialogs.py:1666
+#: ../gui/wxpython/modules/extensions.py:103
+#: ../gui/wxpython/modules/extensions.py:405
+#, python-format
+msgid "Open %s dialog"
+msgstr "Deschide case de dialog %s "
+
+#: ../gui/wxpython/gui_core/dialogs.py:1675
+msgid "No layers selected. Operation canceled."
+msgstr "Nici un layer selectat. Operațiune anulată."
+
+#: ../gui/wxpython/gui_core/dialogs.py:1765
+msgid "Import DXF layers"
+msgstr "Import DXF layers"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1769
+msgid "Choose DXF file to import"
+msgstr "Alege fișier DXF pentru import"
+
+#: ../gui/wxpython/gui_core/dialogs.py:1974
+msgid "Set Map Layer Opacity"
+msgstr "Setează opacitatea "
+
+#: ../gui/wxpython/gui_core/dialogs.py:1998
+#: ../gui/wxpython/psmap/dialogs.py:4603 ../gui/wxpython/psmap/dialogs.py:4618
+#: ../gui/wxpython/psmap/dialogs.py:4857 ../gui/wxpython/psmap/dialogs.py:4878
+msgid "transparent"
+msgstr "transparent"
+
+#: ../gui/wxpython/gui_core/dialogs.py:2001
+msgid "opaque"
+msgstr "opac"
+
+#: ../gui/wxpython/gui_core/dialogs.py:2097
+msgid "Set image size"
+msgstr "Setează dimensiunea imaginii"
+
+#: ../gui/wxpython/gui_core/dialogs.py:2106
+msgid "Image size"
+msgstr "Dimensiunea imaginii"
+
+#: ../gui/wxpython/gui_core/dialogs.py:2145
+#: ../gui/wxpython/psmap/dialogs.py:2722
+#: ../gui/wxpython/gmodeler/preferences.py:158
+#: ../gui/wxpython/gmodeler/preferences.py:277
+#: ../gui/wxpython/gmodeler/preferences.py:362
+#: ../gui/wxpython/nviz/preferences.py:475
+msgid "Width:"
+msgstr "Lățime:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:2149
+#: ../gui/wxpython/psmap/dialogs.py:2734 ../gui/wxpython/psmap/dialogs.py:2872
+#: ../gui/wxpython/psmap/dialogs.py:3476
+#: ../gui/wxpython/gmodeler/preferences.py:176
+#: ../gui/wxpython/gmodeler/preferences.py:295
+#: ../gui/wxpython/gmodeler/preferences.py:380
+#: ../gui/wxpython/nviz/tools.py:276 ../gui/wxpython/nviz/tools.py:1036
+#: ../gui/wxpython/nviz/tools.py:1674
+msgid "Height:"
+msgstr "Înălțime:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:2153
+msgid "Template:"
+msgstr "Șablon:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:2194
+msgid "Symbols"
+msgstr "Simboluri"
+
+#: ../gui/wxpython/gui_core/dialogs.py:2221
+msgid "Symbol directory:"
+msgstr "Directorul simbolului:"
+
+#: ../gui/wxpython/gui_core/dialogs.py:2229
+msgid "Symbol name:"
+msgstr "Simbol nume:"
+
+#: ../gui/wxpython/gui_core/preferences.py:58
+msgid "User settings"
+msgstr "Setările utilizatorului"
+
+#: ../gui/wxpython/gui_core/preferences.py:78
+msgid "Set to default"
+msgstr "Setat la valorile implicite"
+
+#: ../gui/wxpython/gui_core/preferences.py:86
+msgid "Revert settings to default and apply changes"
+msgstr "Reveniți la setările implicite și aplicați modificările"
+
+#: ../gui/wxpython/gui_core/preferences.py:88
+#: ../gui/wxpython/wxplot/dialogs.py:376 ../gui/wxpython/wxplot/dialogs.py:763
+#: ../gui/wxpython/gcp/manager.py:2370
+msgid "Apply changes for the current session"
+msgstr "Aplică modificările pentru sesiunea curentă"
+
+#: ../gui/wxpython/gui_core/preferences.py:90
+#: ../gui/wxpython/wxplot/dialogs.py:381 ../gui/wxpython/wxplot/dialogs.py:765
+#: ../gui/wxpython/gcp/manager.py:2372
+msgid "Apply and save changes to user settings file (default for next sessions)"
+msgstr "Aplică și salvează modificările la setările fișierului utilizatorului (implicit pentru sesiunea viitoare)"
+
+#: ../gui/wxpython/gui_core/preferences.py:93
+#: ../gui/wxpython/psmap/dialogs.py:354
+#: ../gui/wxpython/gmodeler/preferences.py:452
+#: ../gui/wxpython/wxplot/dialogs.py:383 ../gui/wxpython/wxplot/dialogs.py:766
+#: ../gui/wxpython/vdigit/preferences.py:58
+msgid "Close dialog and ignore changes"
+msgstr "Închideți caseta de dialog și ignorați modificările"
+
+#: ../gui/wxpython/gui_core/preferences.py:149
+msgid "Settings applied to current session but not saved"
+msgstr "Setări aplicate sesiunii curente dar nu salvate"
+
+#: ../gui/wxpython/gui_core/preferences.py:176
+#, python-format
+msgid "Settings saved to file '%s'."
+msgstr "Setări salvate în fișierul '%s'."
+
+#: ../gui/wxpython/gui_core/preferences.py:211
+msgid "Key column cannot be empty string."
+msgstr "Coloana primară nu poate fi un șir gol."
+
+#: ../gui/wxpython/gui_core/preferences.py:212
+#: ../gui/wxpython/gui_core/preferences.py:1265
+#: ../gui/wxpython/gui_core/preferences.py:1294
+#: ../gui/wxpython/gui_core/preferences.py:1303
+#: ../gui/wxpython/gui_core/preferences.py:1312
+#: ../gui/wxpython/location_wizard/dialogs.py:114
+#: ../gui/wxpython/location_wizard/dialogs.py:131
+#: ../gui/wxpython/location_wizard/dialogs.py:438
+#: ../gui/wxpython/location_wizard/wizard.py:538
+#: ../gui/wxpython/location_wizard/wizard.py:723
+#: ../gui/wxpython/location_wizard/wizard.py:1452
+#: ../gui/wxpython/location_wizard/wizard.py:1518
+#: ../gui/wxpython/psmap/dialogs.py:3950 ../gui/wxpython/core/gcmd.py:110
+#: ../gui/wxpython/core/workspace.py:1001
+#: ../gui/wxpython/gmodeler/frame.py:892
+#: ../gui/wxpython/mapdisp/mapwindow.py:1621
+#: ../gui/wxpython/lmgr/layertree.py:555 ../gui/wxpython/gis_set.py:213
+#: ../gui/wxpython/gis_set.py:551 ../gui/wxpython/gis_set.py:588
+#: ../gui/wxpython/gis_set.py:654 ../gui/wxpython/vdigit/dialogs.py:241
+#: ../gui/wxpython/vdigit/dialogs.py:433
+msgid "Error"
+msgstr "Eroare"
+
+#: ../gui/wxpython/gui_core/preferences.py:248
+msgid "GUI Settings"
+msgstr "Setările interfeței grafice"
+
+#: ../gui/wxpython/gui_core/preferences.py:269
+#: ../gui/wxpython/gmodeler/preferences.py:45
+#: ../gui/wxpython/vdigit/preferences.py:118
+msgid "General"
+msgstr "General"
+
+#: ../gui/wxpython/gui_core/preferences.py:275
+msgid "Layer Manager settings"
+msgstr "Setările pentru gestionarea de straturi"
+
+#: ../gui/wxpython/gui_core/preferences.py:286
+msgid "Ask when removing map layer from layer tree"
+msgstr "Solicită când este eliminat stratul de hartă din arborele de straturi"
+
+#: ../gui/wxpython/gui_core/preferences.py:296
+msgid "Ask when quiting wxGUI or closing display"
+msgstr "Solicită când se renunță la wxGUI sau se închide afișarea"
+
+#: ../gui/wxpython/gui_core/preferences.py:306
+#: ../gui/wxpython/gui_core/preferences.py:316
+#, python-format
+msgid "Hide '%s' tab (requires GUI restart)"
+msgstr "Ascunde '%s' tab-ul (necesită restartarea GUI)"
+
+#: ../gui/wxpython/gui_core/preferences.py:306
+#: ../gui/wxpython/lmgr/frame.py:266
+msgid "Search module"
+msgstr "Caută modul"
+
+#: ../gui/wxpython/gui_core/preferences.py:316
+#: ../gui/wxpython/lmgr/frame.py:273
+msgid "Python shell"
+msgstr "Consola Python"
+
+#: ../gui/wxpython/gui_core/preferences.py:329
+msgid "Automatically copy selected text to clipboard (in Command console)"
+msgstr "Copiază automat textul selectat în clipboard (în Consola de comandă)"
+
+#: ../gui/wxpython/gui_core/preferences.py:343
+msgid "Workspace settings"
+msgstr "Setările spațiului de lucru"
+
+#: ../gui/wxpython/gui_core/preferences.py:351
+msgid "Suppress positioning Map Display Window(s)"
+msgstr "Suprimă poziționarea ferestrei de vizualizare"
+
+#: ../gui/wxpython/gui_core/preferences.py:363
+msgid "Suppress positioning Layer Manager window"
+msgstr "Suprimă poziționarea ferestrei de manipulare"
+
+#: ../gui/wxpython/gui_core/preferences.py:374
+msgid "Save current window layout as default"
+msgstr "Salvează aspectul ferestrei ca implicit"
+
+#: ../gui/wxpython/gui_core/preferences.py:377
+msgid "Save current position and size of Layer Manager window and opened Map Display window(s) and use as default for next sessions."
+msgstr "Salvează poziția și dimensiunea curentă a ferestrei de manipulare și deschiderea ferestrei de vizualizare și folosește-le ca implicit în următoarea sesiune."
+
+#: ../gui/wxpython/gui_core/preferences.py:400
+#: ../gui/wxpython/nviz/tools.py:91
+msgid "Appearance"
+msgstr "Aspect"
+
+#: ../gui/wxpython/gui_core/preferences.py:404
+#: ../gui/wxpython/gui_core/preferences.py:579
+#: ../gui/wxpython/gui_core/preferences.py:1415
+#: ../gui/wxpython/psmap/dialogs.py:2787 ../gui/wxpython/psmap/dialogs.py:3264
+#: ../gui/wxpython/psmap/dialogs.py:3720 ../gui/wxpython/wxplot/dialogs.py:310
+msgid "Font settings"
+msgstr "Setările fontului"
+
+#: ../gui/wxpython/gui_core/preferences.py:418
+msgid "Font for command output:"
+msgstr "Font pentru comanda de ieșire:"
+
+#: ../gui/wxpython/gui_core/preferences.py:432
+msgid "Language settings"
+msgstr "Setările de limbă"
+
+#: ../gui/wxpython/gui_core/preferences.py:442
+msgid "Choose language (requires to save and GRASS restart):"
+msgstr "Alege limba (necesită salvarea și repornirea GRASS):"
+
+#: ../gui/wxpython/gui_core/preferences.py:464
+msgid "Appearance settings"
+msgstr "Aspectul setărilor"
+
+#: ../gui/wxpython/gui_core/preferences.py:475
+msgid "Element list:"
+msgstr "Lista de elemente:"
+
+#: ../gui/wxpython/gui_core/preferences.py:497
+msgid "Menu style (requires to save and GUI restart):"
+msgstr "Stilul meniului (necesită salvarea și repornirea GUI):"
+
+#: ../gui/wxpython/gui_core/preferences.py:521
+msgid "Height of map selection popup window (in pixels):"
+msgstr "Înălțimea ferestrei pop-up a hărții de selectie (în pixeli):"
+
+#: ../gui/wxpython/gui_core/preferences.py:545
+msgid "Icon theme (requires GUI restart):"
+msgstr "Tema imaginii (necesită restartarea GUI):"
+
+#: ../gui/wxpython/gui_core/preferences.py:575
+msgid "Map Display"
+msgstr "Afișare hartă"
+
+#: ../gui/wxpython/gui_core/preferences.py:590
+msgid "Default font for GRASS displays:"
+msgstr "Fontul implicit pentru afișare GRASS:"
+
+#: ../gui/wxpython/gui_core/preferences.py:607
+msgid "Default display settings"
+msgstr "Setările implicite de afișare"
+
+#: ../gui/wxpython/gui_core/preferences.py:619
+msgid "Display driver:"
+msgstr "Afișare driver:"
+
+#: ../gui/wxpython/gui_core/preferences.py:649
+msgid "Statusbar mode:"
+msgstr "Mod de stare:"
+
+#: ../gui/wxpython/gui_core/preferences.py:669
+#: ../gui/wxpython/nviz/tools.py:348 ../gui/wxpython/nviz/preferences.py:178
+msgid "Background color:"
+msgstr "Culoare de fundal:"
+
+#: ../gui/wxpython/gui_core/preferences.py:688
+#: ../gui/wxpython/mapdisp/statusbar.py:435
+msgid "Align region extent based on display size"
+msgstr "Alinierea extinderii regiunii la dimensiunea de afișare"
+
+#: ../gui/wxpython/gui_core/preferences.py:701
+#: ../gui/wxpython/mapdisp/statusbar.py:455
+msgid "Constrain display resolution to computational settings"
+msgstr "Constrânge rezoluția de afișare la setările de calcul"
+
+#: ../gui/wxpython/gui_core/preferences.py:714
+msgid "Enable auto-rendering"
+msgstr "Permite auto-redarea"
+
+#: ../gui/wxpython/gui_core/preferences.py:727
+msgid "Enable auto-zooming to selected map layer"
+msgstr "Permite zoom automat pentru layerul selectat"
+
+#: ../gui/wxpython/gui_core/preferences.py:740
+msgid "Mouse wheel action:"
+msgstr "Acțiunea roții mouse-ului"
+
+#: ../gui/wxpython/gui_core/preferences.py:755
+msgid "Mouse scrolling direction:"
+msgstr "Direcția de mișcare a mouse-ului:"
+
+#: ../gui/wxpython/gui_core/preferences.py:780
+msgid "Advanced display settings"
+msgstr "Setări avansate de afișare"
+
+#: ../gui/wxpython/gui_core/preferences.py:786
+msgid "3D view depth buffer (possible values are 16, 24, 32):"
+msgstr "Vizualizarea 3D a adâncimii zonei tampon (valorile posibile sunt 16,24,32)"
+
+#: ../gui/wxpython/gui_core/preferences.py:817
+#: ../gui/wxpython/gmodeler/dialogs.py:136
+#: ../gui/wxpython/gmodeler/dialogs.py:392
+#: ../gui/wxpython/gmodeler/dialogs.py:494
+msgid "Command"
+msgstr "Comandă"
+
+#: ../gui/wxpython/gui_core/preferences.py:820
+msgid "Command dialog settings"
+msgstr "Setările casetei de dialog a comenzii"
+
+#: ../gui/wxpython/gui_core/preferences.py:842
+msgid "Close dialog when command is successfully finished"
+msgstr "Închide caseta de dialog cand comanda este finalizată cu succes"
+
+#: ../gui/wxpython/gui_core/preferences.py:863
+msgid "Allow interactive input"
+msgstr "Permite intrare interactivă"
+
+#: ../gui/wxpython/gui_core/preferences.py:873
+msgid "Verbosity level:"
+msgstr "Nivelul de detaliere:"
+
+#: ../gui/wxpython/gui_core/preferences.py:892
+msgid "Raster settings"
+msgstr "Setări raster"
+
+#: ../gui/wxpython/gui_core/preferences.py:903
+msgid "Overlay raster maps"
+msgstr "Suprapunerea hărților raster"
+
+#: ../gui/wxpython/gui_core/preferences.py:914
+msgid "Default color table"
+msgstr "Tabelul de culori implicit"
+
+#: ../gui/wxpython/gui_core/preferences.py:940
+msgid "Vector settings"
+msgstr "Setări vector"
+
+#: ../gui/wxpython/gui_core/preferences.py:946
+msgid "Display:"
+msgstr "Afișare:"
+
+#: ../gui/wxpython/gui_core/preferences.py:969
+#: ../gui/wxpython/vdigit/preferences.py:344
+msgid "Attributes"
+msgstr "Atribute"
+
+#: ../gui/wxpython/gui_core/preferences.py:977
+msgid "Highlighting"
+msgstr "Evidențierea"
+
+#: ../gui/wxpython/gui_core/preferences.py:983
+#: ../gui/wxpython/psmap/dialogs.py:1776 ../gui/wxpython/psmap/dialogs.py:1879
+#: ../gui/wxpython/nviz/tools.py:1143 ../gui/wxpython/nviz/tools.py:1696
+#: ../gui/wxpython/nviz/tools.py:1817 ../gui/wxpython/nviz/preferences.py:333
+#: ../gui/wxpython/nviz/preferences.py:490
+#: ../gui/wxpython/nviz/preferences.py:544 ../gui/wxpython/gcp/manager.py:2437
+msgid "Color:"
+msgstr "Culoare:"
+
+#: ../gui/wxpython/gui_core/preferences.py:993
+msgid "Line width (in pixels):"
+msgstr "Lățimea liniei (în pixeli):"
+
+#: ../gui/wxpython/gui_core/preferences.py:1016
+msgid "Data browser"
+msgstr "Navigator de date"
+
+#: ../gui/wxpython/gui_core/preferences.py:1021
+msgid "Left mouse double click:"
+msgstr "Dublu clik pe butonul stâng al mouse-ului:"
+
+#: ../gui/wxpython/gui_core/preferences.py:1033
+msgid "Encoding (e.g. utf-8, ascii, iso8859-1, koi8-r):"
+msgstr "Codificare (e.g. utf-8, ascii, iso8859-1, koi8-r):"
+
+#: ../gui/wxpython/gui_core/preferences.py:1044
+msgid "Ask when deleting data record(s) from table"
+msgstr "Întreabă când ștergeți înregistrări de date din tabelă"
+
+#: ../gui/wxpython/gui_core/preferences.py:1065
+msgid "Create table"
+msgstr "Crează tabel"
+
+#: ../gui/wxpython/gui_core/preferences.py:1099
+#: ../gui/wxpython/mapdisp/statusbar.py:681
+msgid "Projection"
+msgstr "Proiecție"
+
+#: ../gui/wxpython/gui_core/preferences.py:1106
+msgid "Projection statusbar settings"
+msgstr "Setările barei de proiecție"
+
+#: ../gui/wxpython/gui_core/preferences.py:1115
+msgid ""
+"\n"
+"Note: This only controls the coordinates displayed in the lower-left of the Map Display\n"
+"window's status bar. It is purely cosmetic and does not affect the working location's\n"
+"projection in any way. You will need to enable the Projection check box in the drop-down\n"
+"menu located at the bottom of the Map Display window.\n"
+msgstr ""
+"\n"
+"Notă: Aceasta controlează doar coordonatele afișate în colțul stâng al ferestrei de vizualizare\n"
+"Bara ferestrei. Este pur estetică și nu afectează locația de lucru\n"
+"proiecția în nici un fel. Veti avea nevoie să dați posibilitatea de selectare a proiecției în caseta de jos\n"
+"meniu situat în partea de jos a ferestrei de vizualizare.\n"
+
+#: ../gui/wxpython/gui_core/preferences.py:1130
+#: ../gui/wxpython/location_wizard/wizard.py:1269
+msgid "EPSG code:"
+msgstr "Codul EPSG:"
+
+#: ../gui/wxpython/gui_core/preferences.py:1147
+msgid "Proj.4 string (required):"
+msgstr "Șirul Proj.4 (obligatoriu)"
+
+#: ../gui/wxpython/gui_core/preferences.py:1163
+msgid "EPSG file:"
+msgstr "Fișier EPSG:"
+
+#: ../gui/wxpython/gui_core/preferences.py:1178
+msgid "Load EPSG codes (be patient), enter EPSG code or insert Proj.4 string directly."
+msgstr "Încărcați codurile EPSG (fi rabdător), introduceți codul EPSG sau inserați direct șirul Proj.4."
+
+#: ../gui/wxpython/gui_core/preferences.py:1186
+msgid "&Load EPSG codes"
+msgstr "&Încarcă codurile EPSG"
+
+#: ../gui/wxpython/gui_core/preferences.py:1197
+msgid "Coordinates format"
+msgstr "Formatul coordonatelor"
+
+#: ../gui/wxpython/gui_core/preferences.py:1206
+msgid "LL projections"
+msgstr "Proiecțiile LL"
+
+#: ../gui/wxpython/gui_core/preferences.py:1225
+msgid "Precision:"
+msgstr "Precizia:"
+
+#: ../gui/wxpython/gui_core/preferences.py:1264
+#, python-format
+msgid "Unable to read EPSG codes: %s"
+msgstr "Nu pot fi citite codurile EPSG: %s"
+
+#: ../gui/wxpython/gui_core/preferences.py:1293
+#: ../gui/wxpython/gui_core/preferences.py:1302
+#: ../gui/wxpython/gui_core/preferences.py:1311
+#, python-format
+msgid "EPSG code %s not found"
+msgstr "Codul EPSG %s nu este găsit"
+
+#: ../gui/wxpython/gui_core/preferences.py:1319
+msgid "Select default display font"
+msgstr "Selectează fontul de afișare prestabilit"
+
+#: ../gui/wxpython/gui_core/preferences.py:1344
+msgid "Select output font"
+msgstr "Selectează fontul de ieșire"
+
+#: ../gui/wxpython/gui_core/preferences.py:1422
+msgid "Select font:"
+msgstr "Selectează font:"
+
+#: ../gui/wxpython/gui_core/preferences.py:1446
+msgid "Character encoding:"
+msgstr "Codarea caracterelor:"
+
+#: ../gui/wxpython/gui_core/preferences.py:1464
+#: ../gui/wxpython/psmap/dialogs.py:291 ../gui/wxpython/psmap/dialogs.py:3554
+msgid "Font size:"
+msgstr "Dimensiune font:"
+
+#: ../gui/wxpython/gui_core/preferences.py:1562
+msgid "Manage access to mapsets"
+msgstr "Gestionează accesul la mapset"
+
+#: ../gui/wxpython/gui_core/preferences.py:1575
+msgid ""
+"Check a mapset to make it accessible, uncheck it to hide it.\n"
+"  Notes:\n"
+"    - The current mapset is always accessible.\n"
+"    - You may only write to the current mapset.\n"
+"    - You may only write to mapsets which you own."
+msgstr ""
+"Vericați un mapset pentru a-l face accesibil, debifați-l pentru a-l ascunde.\n"
+"Note:\n"
+"   - Mapsetul curent este întotdeauna accesibil.\n"
+"   - Puteți scrie numai în mapsetul curent.\n"
+"   - Puteți scrie numai pentru mapseturile pe care le dețineți."
+
+#: ../gui/wxpython/gui_core/preferences.py:1650
+msgid "Owner"
+msgstr "Proprietar"
+
+#: ../gui/wxpython/gui_core/goutput.py:234
+msgid "Click here to show search module engine"
+msgstr "Click aici pentru a afișa motorul de căutare a modulelor"
+
+#: ../gui/wxpython/gui_core/goutput.py:235
+msgid "Click here to hide search module engine"
+msgstr "Click aici pentru a ascunde motorul de căutare a modulelor"
+
+#: ../gui/wxpython/gui_core/goutput.py:253
+msgid "Output window"
+msgstr "Fereastra de ieșire"
+
+#: ../gui/wxpython/gui_core/goutput.py:255
+msgid "Command prompt"
+msgstr "Comandă"
+
+#: ../gui/wxpython/gui_core/goutput.py:259
+msgid "Clear output window content"
+msgstr "Curăță mesajele de ieșire"
+
+#: ../gui/wxpython/gui_core/goutput.py:261
+msgid "Clear command prompt content"
+msgstr "Curăță comenzile"
+
+#: ../gui/wxpython/gui_core/goutput.py:263
+msgid "Save output window content to the file"
+msgstr "Salvează conținutul ferestrei de ieșire ca fișier"
+
+#: ../gui/wxpython/gui_core/goutput.py:265
+msgid "Abort running command"
+msgstr "Anulează rularea comenzii"
+
+#: ../gui/wxpython/gui_core/goutput.py:268
+#, fuzzy
+msgid "&Log file"
+msgstr "&Fișier \"jurnal\""
+
+#: ../gui/wxpython/gui_core/goutput.py:270
+#, fuzzy
+msgid "Toggle to save list of executed commands into a file; content saved when switching off."
+msgstr "Permite salvearea listei de comenzi executate într-un fișier; conținut salvat atunci când este oprită."
+
+#: ../gui/wxpython/gui_core/goutput.py:486
+#: ../gui/wxpython/gui_core/goutput.py:793
+#, python-format
+msgid ""
+"Unable to write file '%(filePath)s'.\n"
+"\n"
+"Details: %(error)s"
+msgstr ""
+"Nu s-a putut scrie fișierul '%(filePath)s'.\n"
+"\n"
+"Detalii: %(error)s"
+
+#: ../gui/wxpython/gui_core/goutput.py:524
+#, python-format
+msgid "Command '%s' not yet implemented in the WxGUI. Try adding it as a command layer instead."
+msgstr "Comanda '%s' nu a fost încă implementată în WxGUI. Încercați să-l adăugați ca un strat de control."
+
+#: ../gui/wxpython/gui_core/goutput.py:571
+#, python-format
+msgid ""
+"Unable to run command:\n"
+"%(cmd)s\n"
+"\n"
+"Option <%(opt)s>: read from standard input is not supported by wxGUI"
+msgstr ""
+"Nu s-a putut rula comanda:\n"
+"%(cmd)s\n"
+"\n"
+"Opțiune <%(opt)s>: citirea de la intrarea standard nu este acceptată de wxGUI"
+
+#: ../gui/wxpython/gui_core/goutput.py:661
+#: ../gui/wxpython/gui_core/goutput.py:811
+msgid "Save file as..."
+msgstr "Salvează fișierul ca..."
+
+#: ../gui/wxpython/gui_core/goutput.py:663
+#: ../gui/wxpython/gui_core/goutput.py:813
+#, python-format
+msgid "%(txt)s (*.txt)|*.txt|%(files)s (*)|*"
+msgstr "%(txt)s (*.txt)|*.txt|%(files)s (*)|*"
+
+#: ../gui/wxpython/gui_core/goutput.py:664
+#: ../gui/wxpython/gui_core/goutput.py:814
+msgid "Text files"
+msgstr "Fișiere text"
+
+#: ../gui/wxpython/gui_core/goutput.py:664
+#: ../gui/wxpython/gui_core/goutput.py:814
+msgid "Files"
+msgstr "Fișiere"
+
+#: ../gui/wxpython/gui_core/goutput.py:676
+#, python-format
+msgid ""
+"Unable to write file '%(path)s'.\n"
+"\n"
+"Details: %(error)s"
+msgstr ""
+"Nu s-a putut scrie fișierul '%(path)s'.\n"
+"\n"
+"Detalii: %(error)s"
+
+#: ../gui/wxpython/gui_core/goutput.py:679
+#, python-format
+msgid "Command output saved into '%s'"
+msgstr "Comanda de ieșire salvată în '%s'"
+
+#: ../gui/wxpython/gui_core/goutput.py:708
+#: ../gui/wxpython/gui_core/ghelp.py:328
+#, python-format
+msgid "%d modules match"
+msgstr "%d module potrivite"
+
+#: ../gui/wxpython/gui_core/goutput.py:798
+#, fuzzy, python-format
+msgid "Command log saved to '%s'"
+msgstr "Comanda de intrare salvată ca '%s'"
+
+#: ../gui/wxpython/gui_core/goutput.py:853
+#, python-format
+msgid "%d sec"
+msgstr "%d sec"
+
+#: ../gui/wxpython/gui_core/goutput.py:856
+#, python-format
+msgid "%(min)d min %(sec)d sec"
+msgstr "%(min)d min %(sec)d sec"
+
+#: ../gui/wxpython/gui_core/goutput.py:860
+#: ../gui/wxpython/gui_core/ghelp.py:486 ../gui/wxpython/gmodeler/model.py:927
+#: ../gui/wxpython/gmodeler/model.py:994 ../gui/wxpython/lmgr/frame.py:752
+#: ../gui/wxpython/lmgr/frame.py:757
+msgid "unknown"
+msgstr "necunoscut"
+
+#: ../gui/wxpython/gui_core/goutput.py:864
+msgid "Please note that the data are left in inconsistent state and may be corrupted"
+msgstr "Vă rugăm să rețineți că datele sunt lăsate în stare de inconsistență și pot fi corupte"
+
+#: ../gui/wxpython/gui_core/goutput.py:866
+msgid "Command aborted"
+msgstr "Comandă eșuată"
+
+#: ../gui/wxpython/gui_core/goutput.py:868
+msgid "Command finished"
+msgstr "Comandă finalizată"
+
+#: ../gui/wxpython/gui_core/goutput.py:1356
+#: ../gui/wxpython/gmodeler/frame.py:186
+msgid "Python script contains local modifications"
+msgstr "Scriptul Python conține modificări locale"
+
+#: ../gui/wxpython/gui_core/ghelp.py:57 ../gui/wxpython/gui_core/ghelp.py:65
+msgid "description"
+msgstr "descriere"
+
+#: ../gui/wxpython/gui_core/ghelp.py:58 ../gui/wxpython/gui_core/ghelp.py:67
+msgid "command"
+msgstr "comandă"
+
+#: ../gui/wxpython/gui_core/ghelp.py:59 ../gui/wxpython/gui_core/ghelp.py:66
+msgid "keywords"
+msgstr "cuvinte cheie"
+
+#: ../gui/wxpython/gui_core/ghelp.py:62
+msgid "Find module(s)"
+msgstr "Găsește modul(e)"
+
+#: ../gui/wxpython/gui_core/ghelp.py:134 ../gui/wxpython/gui_core/ghelp.py:167
+#, python-format
+msgid "%d modules found"
+msgstr "%d module căutate"
+
+#: ../gui/wxpython/gui_core/ghelp.py:202
+msgid "Menu tree (double-click to run command)"
+msgstr "Arborele de meniu (dublu click pentru a rula comanda)"
+
+#: ../gui/wxpython/gui_core/ghelp.py:212
+msgid "Run selected command"
+msgstr "Rulează comanda selectată"
+
+#: ../gui/wxpython/gui_core/ghelp.py:273
+msgid "You must run this command from the menu or command line"
+msgstr "Trebuie să rulezi această comandă din meniu sau în linie de comandă"
+
+#: ../gui/wxpython/gui_core/ghelp.py:275 ../gui/wxpython/core/gcmd.py:144
+#: ../gui/wxpython/lmgr/frame.py:1828 ../gui/wxpython/gis_set.py:539
+#: ../gui/wxpython/gis_set.py:575
+msgid "Message"
+msgstr "Mesaj"
+
+#: ../gui/wxpython/gui_core/ghelp.py:385 ../gui/wxpython/menustrings.py:853
+#: ../gui/wxpython/menustrings.py:854
+msgid "About GRASS GIS"
+msgstr "Despre GRASS GIS"
+
+#: ../gui/wxpython/gui_core/ghelp.py:418
+msgid "Official GRASS site:"
+msgstr "Site-ul oficial GRASS:"
+
+#: ../gui/wxpython/gui_core/ghelp.py:429
+msgid "SVN Revision"
+msgstr "Revizuire SVN"
+
+#: ../gui/wxpython/gui_core/ghelp.py:440 ../gui/wxpython/lmgr/frame.py:775
+msgid "GIS Library Revision"
+msgstr "Revizie biblioteci GIS"
+
+#: ../gui/wxpython/gui_core/ghelp.py:478 ../gui/wxpython/gui_core/ghelp.py:711
+msgid "Language"
+msgstr "Limba"
+
+#: ../gui/wxpython/gui_core/ghelp.py:498
+msgid "Info"
+msgstr "Info"
+
+#: ../gui/wxpython/gui_core/ghelp.py:499
+msgid "Copyright"
+msgstr "Drepturi de autor"
+
+#: ../gui/wxpython/gui_core/ghelp.py:500
+msgid "License"
+msgstr "Licență"
+
+#: ../gui/wxpython/gui_core/ghelp.py:501
+msgid "Authors"
+msgstr "Autori"
+
+#: ../gui/wxpython/gui_core/ghelp.py:502
+msgid "Contributors"
+msgstr "Contribuitori"
+
+#: ../gui/wxpython/gui_core/ghelp.py:503
+msgid "Extra contributors"
+msgstr "Contribuitori suplimentari"
+
+#: ../gui/wxpython/gui_core/ghelp.py:504
+msgid "Translators"
+msgstr "Traducători"
+
+#: ../gui/wxpython/gui_core/ghelp.py:538 ../gui/wxpython/gui_core/ghelp.py:562
+#: ../gui/wxpython/gui_core/ghelp.py:585 ../gui/wxpython/gui_core/ghelp.py:640
+#: ../gui/wxpython/gui_core/ghelp.py:699
+#, python-format
+msgid "%s file missing"
+msgstr "%s fișier lipsă"
+
+#: ../gui/wxpython/gui_core/ghelp.py:627 ../gui/wxpython/gui_core/ghelp.py:686
+#, python-format
+msgid "Error when reading file '%s'."
+msgstr "Eroare când este citit fișierul '%s'."
+
+#: ../gui/wxpython/gui_core/ghelp.py:628 ../gui/wxpython/gui_core/ghelp.py:687
+msgid "Lines:"
+msgstr "Linii:"
+
+#: ../gui/wxpython/gui_core/ghelp.py:645 ../gui/wxpython/gui_core/ghelp.py:647
+#: ../gui/wxpython/gui_core/ghelp.py:707
+#: ../gui/wxpython/gmodeler/dialogs.py:391
+#: ../gui/wxpython/gmodeler/dialogs.py:493
+#: ../gui/wxpython/gmodeler/frame.py:1314
+#: ../gui/wxpython/gmodeler/frame.py:1357
+#: ../gui/wxpython/gmodeler/frame.py:1459
+msgid "Name"
+msgstr "Nume"
+
+#: ../gui/wxpython/gui_core/ghelp.py:645 ../gui/wxpython/gui_core/ghelp.py:647
+#: ../gui/wxpython/gui_core/ghelp.py:709
+msgid "E-mail"
+msgstr "E-mail"
+
+#: ../gui/wxpython/gui_core/ghelp.py:647
+msgid "Country"
+msgstr "Èšara"
+
+#: ../gui/wxpython/gui_core/ghelp.py:647
+msgid "OSGeo_ID"
+msgstr "OSGeo_ID"
+
+#: ../gui/wxpython/gui_core/ghelp.py:858
+msgid "&Next"
+msgstr "&Următorul"
+
+#: ../gui/wxpython/gui_core/ghelp.py:861
+msgid "&Previous"
+msgstr "&Precedentul"
+
+#: ../gui/wxpython/dbmgr/manager.py:145
+msgid "Loading data..."
+msgstr "ÃŽncarca data..."
+
+#: ../gui/wxpython/dbmgr/manager.py:152
+#, python-format
+msgid "Attribute table <%s> not found. For creating the table switch to 'Manage layers' tab."
+msgstr "Atributele tabelului <%s> nu a fost găsit. Pentru crearea tabelului activează tab-ul 'Gestionare layer'."
+
+#: ../gui/wxpython/dbmgr/manager.py:163
+#, python-format
+msgid "Column <%(column)s> not found in in the table <%(table)s>."
+msgstr "Coloana <%(column)s>nu a fost găsită in tabelul <%(table)s>."
+
+#: ../gui/wxpython/dbmgr/manager.py:232
+msgid "Can display only 256 columns."
+msgstr "Poate afișa doar 256 coloane."
+
+#: ../gui/wxpython/dbmgr/manager.py:247
+#, fuzzy, python-format
+msgid "Inconsistent number of columns in the table <%(table)s>."
+msgstr "Număr de coloane inconsistent în tabel <%(table)s>."
+
+#: ../gui/wxpython/dbmgr/manager.py:257
+msgid "Viewing limit: 100000 records."
+msgstr "Limită de vizualizare:  100000 înregistrări."
+
+#: ../gui/wxpython/dbmgr/manager.py:274 ../gui/wxpython/dbmgr/manager.py:828
+#: ../gui/wxpython/dbmgr/manager.py:1162 ../gui/wxpython/dbmgr/manager.py:1828
+#: ../gui/wxpython/dbmgr/manager.py:1850 ../gui/wxpython/dbmgr/manager.py:1997
+#, python-format
+msgid "Number of loaded records: %d"
+msgstr "Număr de înregistrări încărcate: %d"
+
+#: ../gui/wxpython/dbmgr/manager.py:298
+msgid "Unknown value"
+msgstr "Valoare necunoscută"
+
+#: ../gui/wxpython/dbmgr/manager.py:304
+msgid "Unable to decode value. Set encoding in GUI preferences ('Attributes')."
+msgstr "Nu s-a putut decoda valoarea. Setați codarea în preferințele GUI ('Attributes')."
+
+#: ../gui/wxpython/dbmgr/manager.py:313
+#, python-format
+msgid ""
+"Error loading attribute data. Record number: %(rec)d. Unable to convert value '%(val)s' in key column (%(key)s) to integer.\n"
+"\n"
+"Details: %(detail)s"
+msgstr ""
+"Eroare în încărcarea atributelor. Număr de înregistrări: %(rec)d. Nu s-a putut converti valoarea '%(val)s' din coloana primară (%(key)s) în număr întreg.\n"
+"\n"
+"Detalii: %(detail)s"
+
+#: ../gui/wxpython/dbmgr/manager.py:395
+msgid "Sort ascending"
+msgstr "Sortare crescătoare"
+
+#: ../gui/wxpython/dbmgr/manager.py:396
+msgid "Sort descending"
+msgstr "Sortare descrescătoare"
+
+#: ../gui/wxpython/dbmgr/manager.py:399
+msgid "Calculate (only numeric columns)"
+msgstr "Calculează (doar coloanele numerice)"
+
+#: ../gui/wxpython/dbmgr/manager.py:405
+msgid "Area size"
+msgstr "Dimensiunea arealului"
+
+#: ../gui/wxpython/dbmgr/manager.py:406
+msgid "Line length"
+msgstr "Lungimea liniei"
+
+#: ../gui/wxpython/dbmgr/manager.py:407
+msgid "Compactness of an area"
+msgstr "Compactitatea unui areal"
+
+#: ../gui/wxpython/dbmgr/manager.py:408
+msgid "Fractal dimension of boundary defining a polygon"
+msgstr "Dimensiunea fractală a limitei definite pentru un poligon"
+
+#: ../gui/wxpython/dbmgr/manager.py:409
+msgid "Perimeter length of an area"
+msgstr "Lungimea perimetrului unui areal"
+
+#: ../gui/wxpython/dbmgr/manager.py:410
+msgid "Number of features for each category"
+msgstr "Număr de trăsături pentru fiecare categorie"
+
+#: ../gui/wxpython/dbmgr/manager.py:411
+msgid "Slope steepness of 3D line"
+msgstr "Abruptul liniei 3D"
+
+#: ../gui/wxpython/dbmgr/manager.py:412
+msgid "Line sinuousity"
+msgstr "Linia de sinuozitate"
+
+#: ../gui/wxpython/dbmgr/manager.py:413
+msgid "Line azimuth"
+msgstr "Linia de azimut"
+
+#: ../gui/wxpython/dbmgr/manager.py:572 ../gui/wxpython/dbmgr/manager.py:3110
+msgid "GRASS GIS Attribute Table Manager"
+msgstr "Gestionare tabelă de atribute GRASS"
+
+#: ../gui/wxpython/dbmgr/manager.py:602
+#, python-format
+msgid "Database connection for vector map <%s> is not defined in DB file. You can define new connection in 'Manage layers' tab."
+msgstr "Conexiunea bazei de date pentru harta vectorială <%s> nu este definită în fișierul BD. Puteți defini o nouă conexiune în tab-ul 'Gestionare straturi' "
+
+#: ../gui/wxpython/dbmgr/manager.py:628
+msgid "Browse data"
+msgstr "Caută data"
+
+#: ../gui/wxpython/dbmgr/manager.py:634
+msgid "Manage tables"
+msgstr "Gestionează tabele"
+
+#: ../gui/wxpython/dbmgr/manager.py:642
+msgid "Manage layers"
+msgstr "Gestionează straturi"
+
+#: ../gui/wxpython/dbmgr/manager.py:659
+msgid "Close Attribute Table Manager"
+msgstr "ÃŽnchide gestionarea tabelei de atribute"
+
+#: ../gui/wxpython/dbmgr/manager.py:661
+msgid "Reload attribute data (selected layer only)"
+msgstr "Reîncarcă atributele (doar stratul selectat)"
+
+#: ../gui/wxpython/dbmgr/manager.py:691
+msgid "Attribute data - right-click to edit/manage records"
+msgstr "Datele de atribut - click dreapta pentru editare/gestionare înregistrări"
+
+#: ../gui/wxpython/dbmgr/manager.py:704 ../gui/wxpython/dbmgr/manager.py:844
+#: ../gui/wxpython/dbmgr/manager.py:2321 ../gui/wxpython/dbmgr/manager.py:2451
+#: ../gui/wxpython/dbmgr/manager.py:2705
+msgid "Table"
+msgstr "Tabel"
+
+#: ../gui/wxpython/dbmgr/manager.py:706 ../gui/wxpython/dbmgr/manager.py:846
+#: ../gui/wxpython/dbmgr/manager.py:1016
+msgid " (readonly)"
+msgstr "(doar citire)"
+
+#: ../gui/wxpython/dbmgr/manager.py:714
+msgid "SQL Query"
+msgstr "Interogare SQL"
+
+#: ../gui/wxpython/dbmgr/manager.py:733
+msgid "Apply SELECT statement and reload data records"
+msgstr "Aplică declarația SELECT și reîncarcă datele înregistrate"
+
+#: ../gui/wxpython/dbmgr/manager.py:735 ../gui/wxpython/dbmgr/manager.py:2054
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:454
+msgid "SQL Builder"
+msgstr "Construcție SQL"
+
+#: ../gui/wxpython/dbmgr/manager.py:739
+msgid "Simple"
+msgstr "Simplu"
+
+#: ../gui/wxpython/dbmgr/manager.py:742
+msgid "Advanced"
+msgstr "Avansat"
+
+#: ../gui/wxpython/dbmgr/manager.py:756 ../gui/wxpython/dbmgr/manager.py:762
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:108
+#, python-format
+msgid "Example: %s"
+msgstr "Examplu: %s"
+
+#: ../gui/wxpython/dbmgr/manager.py:857 ../gui/wxpython/dbmgr/sqlbuilder.py:87
+msgid "Database connection"
+msgstr "Conexiunea bazei de date"
+
+#: ../gui/wxpython/dbmgr/manager.py:869
+#, python-format
+msgid "Table <%s> - right-click to delete column(s)"
+msgstr "Tabel <%s> - click dreapta pentru a șterge coloana(ele)"
+
+#: ../gui/wxpython/dbmgr/manager.py:880
+#: ../gui/wxpython/modules/colorrules.py:979
+msgid "Add column"
+msgstr "Adaugă coloană"
+
+#: ../gui/wxpython/dbmgr/manager.py:888 ../gui/wxpython/dbmgr/manager.py:939
+msgid "Column"
+msgstr "Coloană"
+
+#: ../gui/wxpython/dbmgr/manager.py:903
+#: ../gui/wxpython/gmodeler/preferences.py:207
+msgid "Type"
+msgstr "Tip"
+
+#: ../gui/wxpython/dbmgr/manager.py:915
+msgid "Length"
+msgstr "Lungime"
+
+#: ../gui/wxpython/dbmgr/manager.py:931 ../gui/wxpython/menustrings.py:838
+msgid "Rename column"
+msgstr "Redenumește coloană"
+
+#: ../gui/wxpython/dbmgr/manager.py:951
+#: ../gui/wxpython/gmodeler/dialogs.py:265
+msgid "To"
+msgstr "La"
+
+#: ../gui/wxpython/dbmgr/manager.py:958
+msgid "&Rename"
+msgstr "&Redenumește"
+
+#: ../gui/wxpython/dbmgr/manager.py:1014
+msgid "Layers of vector map"
+msgstr "Straturile hărții vectoriale"
+
+#: ../gui/wxpython/dbmgr/manager.py:1027
+msgid "List of layers"
+msgstr "Lista straturilor"
+
+#: ../gui/wxpython/dbmgr/manager.py:1127 ../gui/wxpython/core/settings.py:702
+msgid "Edit selected record"
+msgstr "Editează înregistrarea selectată"
+
+#: ../gui/wxpython/dbmgr/manager.py:1131 ../gui/wxpython/dbmgr/manager.py:1381
+msgid "Insert new record"
+msgstr "Inserează inregistrare nouă"
+
+#: ../gui/wxpython/dbmgr/manager.py:1132
+msgid "Delete selected record(s)"
+msgstr "Șterge înregistrarea selectată"
+
+#: ../gui/wxpython/dbmgr/manager.py:1133
+msgid "Delete all records"
+msgstr "Șterge toate înregistrările"
+
+#: ../gui/wxpython/dbmgr/manager.py:1142
+msgid "Highlight selected features"
+msgstr "Evidențiază trăsăturile selectate"
+
+#: ../gui/wxpython/dbmgr/manager.py:1143
+msgid "Highlight selected features and zoom"
+msgstr "Evidențiază trăsăturile selectate și măriți"
+
+#: ../gui/wxpython/dbmgr/manager.py:1147 ../gui/wxpython/dbmgr/manager.py:2096
+msgid "Extract selected features"
+msgstr "Extrage trăsăturile selectate"
+
+#: ../gui/wxpython/dbmgr/manager.py:1148
+msgid "Delete selected features"
+msgstr "Șterge trăsăturile selectate"
+
+#: ../gui/wxpython/dbmgr/manager.py:1156 ../gui/wxpython/dbmgr/manager.py:1680
+#: ../gui/wxpython/gmodeler/dialogs.py:731
+#: ../gui/wxpython/gmodeler/dialogs.py:906
+#: ../gui/wxpython/vdigit/dialogs.py:278
+msgid "Reload"
+msgstr "Reîncarcă"
+
+#: ../gui/wxpython/dbmgr/manager.py:1188
+#, python-format
+msgid "Selected data records (%d) will be permanently deleted from table. Do you want to delete them?"
+msgstr "Datele înregistrate selectate (%d) vor fi șterse definitiv din tabel. Doriți să le ștergeți?"
+
+#: ../gui/wxpython/dbmgr/manager.py:1191 ../gui/wxpython/dbmgr/manager.py:1237
+#: ../gui/wxpython/gmodeler/dialogs.py:851
+msgid "Delete records"
+msgstr "Șterge înregistrările"
+
+#: ../gui/wxpython/dbmgr/manager.py:1234
+#, python-format
+msgid "All data records (%d) will be permanently deleted from table. Do you want to delete them?"
+msgstr "Toate înregistrările  (%d) vor fi șterse definitiv din tabel. Doriți să le ștergeți?"
+
+#: ../gui/wxpython/dbmgr/manager.py:1392
+#, python-format
+msgid "Record with category number %d already exists in the table."
+msgstr "Înregistrarea cu numărul de categorie %d există deja în tabel."
+
+#: ../gui/wxpython/dbmgr/manager.py:1402
+#, python-format
+msgid "Category number (column %s) is missing."
+msgstr "Numărul de categorie (coloana %s) lipsește."
+
+#: ../gui/wxpython/dbmgr/manager.py:1416 ../gui/wxpython/dbmgr/manager.py:1525
+#, python-format
+msgid "Value '%(value)s' needs to be entered as %(type)s."
+msgstr "Valoarea '%(value)s' trebuie introdusă ca %(type)s."
+
+#: ../gui/wxpython/dbmgr/manager.py:1427
+#, python-format
+msgid ""
+"Unable to insert new record.\n"
+"%s"
+msgstr ""
+"Nu s-a putut insera o înregistrare nouă.\n"
+"%s"
+
+#: ../gui/wxpython/dbmgr/manager.py:1498
+msgid "Update existing record"
+msgstr "Actualizarea înregistrărilor existente"
+
+#: ../gui/wxpython/dbmgr/manager.py:1538
+#, python-format
+msgid ""
+"Unable to update existing record.\n"
+"%s"
+msgstr ""
+"Nu s-a putut actualiza înregistrarea existentă.\n"
+"%s"
+
+#: ../gui/wxpython/dbmgr/manager.py:1624
+msgid "Unable to rename column. No column name defined."
+msgstr "Nu s-a putut redenumi coloana. Nici un nume de coloană definit."
+
+#: ../gui/wxpython/dbmgr/manager.py:1632
+#, python-format
+msgid "Unable to rename column <%(column)s> to <%(columnTo)s>. Column already exists in the table <%(table)s>."
+msgstr "Nu s-a putut redenumi coloana <%(column)s> în <%(columnTo)s>. Coloana există deja în tabel <%(table)s>."
+
+#: ../gui/wxpython/dbmgr/manager.py:1648
+#, python-format
+msgid "Unable to rename column. Column <%(column)s> doesn't exist in the table <%(table)s>."
+msgstr "Nu s-a putut redenumi coloana. Coloana <%(column)s> nu există în tabel <%(table)s>."
+
+#: ../gui/wxpython/dbmgr/manager.py:1675
+msgid "Drop selected column"
+msgstr "Șterge coloana selectată"
+
+#: ../gui/wxpython/dbmgr/manager.py:1678
+msgid "Drop all columns"
+msgstr "Șterge toate coloanele"
+
+#: ../gui/wxpython/dbmgr/manager.py:1693
+#, python-format
+msgid "Selected column '%s' will PERMANENTLY removed from table. Do you want to drop the column?"
+msgstr "Coloana selectată '%s' va fi eliminată DEFINITIV din tabel. Doriți să ștergeți această coloană?"
+
+#: ../gui/wxpython/dbmgr/manager.py:1696 ../gui/wxpython/dbmgr/manager.py:1733
+msgid "Drop column(s)"
+msgstr "Șterge coloana(ele)"
+
+#: ../gui/wxpython/dbmgr/manager.py:1730
+#, python-format
+msgid ""
+"Selected columns\n"
+"%s\n"
+"will PERMANENTLY removed from table. Do you want to drop the columns?"
+msgstr ""
+"Coloanele selectate\n"
+"%s\n"
+"vor fi eliminate DEFINITIV din tabel. Doriți să ștergeți aceste coloane?"
+
+#: ../gui/wxpython/dbmgr/manager.py:1768
+msgid "Unable to add column to the table. No column name defined."
+msgstr "Nu s-a putut adăuga coloana la tabel. Nici un nume de coloană definit."
+
+#: ../gui/wxpython/dbmgr/manager.py:1789
+#, python-format
+msgid "Column <%(column)s> already exists in table <%(table)s>."
+msgstr "Coloana  <%(column)s> există deja în tabel <%(table)s>."
+
+#: ../gui/wxpython/dbmgr/manager.py:1959 ../gui/wxpython/dbmgr/manager.py:1982
+#, python-format
+msgid ""
+"Loading attribute data failed.\n"
+"\n"
+"%s"
+msgstr ""
+"Încărcarea datelor de atribut a eșuat.\n"
+"\n"
+"%s"
+
+#: ../gui/wxpython/dbmgr/manager.py:1970
+#, python-format
+msgid ""
+"Loading attribute data failed.\n"
+"Invalid SQL select statement.\n"
+"\n"
+"%s"
+msgstr ""
+"Încărcarea atributelor a eșuat.\n"
+"Declarație SQL Select nevalidă.\n"
+"\n"
+"%s"
+
+#: ../gui/wxpython/dbmgr/manager.py:2092
+msgid "Nothing to extract."
+msgstr "Nimic de extras."
+
+#: ../gui/wxpython/dbmgr/manager.py:2122
+msgid "Nothing to delete."
+msgstr "Nimic de șters."
+
+#: ../gui/wxpython/dbmgr/manager.py:2212 ../gui/wxpython/dbmgr/manager.py:2627
+#: ../gui/wxpython/dbmgr/manager.py:3047
+#, python-format
+msgid "Drop also linked attribute table (%s)"
+msgstr "Șterge tabela de atribute legată(%s)"
+
+#: ../gui/wxpython/dbmgr/manager.py:2267
+msgid "Column name"
+msgstr "Numele coloanei"
+
+#: ../gui/wxpython/dbmgr/manager.py:2267
+#: ../gui/wxpython/gmodeler/frame.py:1314
+#: ../gui/wxpython/gmodeler/frame.py:1364
+msgid "Data type"
+msgstr "Tipul datei"
+
+#: ../gui/wxpython/dbmgr/manager.py:2267
+msgid "Data length"
+msgstr "Lungimea datei"
+
+#: ../gui/wxpython/dbmgr/manager.py:2321 ../gui/wxpython/dbmgr/manager.py:2434
+#: ../gui/wxpython/dbmgr/manager.py:2685 ../gui/wxpython/dbmgr/dialogs.py:483
+#: ../gui/wxpython/vdigit/dialogs.py:111 ../gui/wxpython/vdigit/dialogs.py:555
+#: ../gui/wxpython/vdigit/preferences.py:362
+#: ../gui/wxpython/vdigit/preferences.py:364
+msgid "Layer"
+msgstr "Strat"
+
+#: ../gui/wxpython/dbmgr/manager.py:2321 ../gui/wxpython/dbmgr/manager.py:2440
+#: ../gui/wxpython/dbmgr/manager.py:2693
+msgid "Driver"
+msgstr "Driver"
+
+#: ../gui/wxpython/dbmgr/manager.py:2321
+msgid "Key"
+msgstr "Cheie"
+
+#: ../gui/wxpython/dbmgr/manager.py:2397
+msgid "Unknown default DB connection. Please define DB connection using db.connect module."
+msgstr "Conexiunea implicită BD necunoscută. Dediniși conexiune BD folosind modulul db.connect."
+
+#: ../gui/wxpython/dbmgr/manager.py:2416
+msgid "Add layer"
+msgstr "Adaugă strat"
+
+#: ../gui/wxpython/dbmgr/manager.py:2426
+msgid "Layer description"
+msgstr "Descriere strat"
+
+#: ../gui/wxpython/dbmgr/manager.py:2456 ../gui/wxpython/dbmgr/manager.py:2494
+#: ../gui/wxpython/dbmgr/manager.py:2711
+msgid "Key column"
+msgstr "Coloana primară"
+
+#: ../gui/wxpython/dbmgr/manager.py:2461
+msgid "Insert record for each category into table"
+msgstr "Inserează înregistrare pentru fiecare categorie în tabel"
+
+#: ../gui/wxpython/dbmgr/manager.py:2476
+msgid "You need to add categories by v.category module."
+msgstr "Este nevoie să adaugi categorii cu modulul v.category."
+
+#: ../gui/wxpython/dbmgr/manager.py:2481
+msgid "Table description"
+msgstr "Descriere tabel"
+
+#: ../gui/wxpython/dbmgr/manager.py:2489
+msgid "Table name"
+msgstr "Numele tabelului"
+
+#: ../gui/wxpython/dbmgr/manager.py:2502
+msgid "&Create table"
+msgstr "&Crează tabel"
+
+#: ../gui/wxpython/dbmgr/manager.py:2506
+msgid "&Add layer"
+msgstr "&Adaugă strat"
+
+#: ../gui/wxpython/dbmgr/manager.py:2510
+msgid "&Set default"
+msgstr "&Setează default"
+
+#: ../gui/wxpython/dbmgr/manager.py:2610
+msgid "Remove layer"
+msgstr "Elimină strat"
+
+#: ../gui/wxpython/dbmgr/manager.py:2613
+msgid "Layer to remove"
+msgstr "Strat pentru eliminare"
+
+#: ../gui/wxpython/dbmgr/manager.py:2634
+msgid "&Remove layer"
+msgstr "&Elimină strat"
+
+#: ../gui/wxpython/dbmgr/manager.py:2678
+msgid "Modify layer"
+msgstr "Modifică strat"
+
+#: ../gui/wxpython/dbmgr/manager.py:2750
+msgid "&Modify layer"
+msgstr "&Modifică strat"
+
+#: ../gui/wxpython/dbmgr/manager.py:2798
+msgid ""
+"Unable to get list of tables.\n"
+"Please use db.connect to set database parameters."
+msgstr ""
+"Nu se poate obține lista tabelelor.\n"
+"Vă rugăm utilizați db.connect pentru a seta parametrii bazei de date."
+
+#: ../gui/wxpython/dbmgr/manager.py:2895
+msgid "Unable to create new table. Table name or key column name is missing."
+msgstr "Nu se poate crea un tabel nou. Numele tabelului sau numele coloanei primare lipsește."
+
+#: ../gui/wxpython/dbmgr/manager.py:2901
+#, python-format
+msgid "Unable to create new table. Table <%s> already exists in the database."
+msgstr "Nu se poate crea un tabel nou. Tabelul <%s> există deja în baza de date."
+
+#: ../gui/wxpython/dbmgr/manager.py:2938
+#, python-format
+msgid "Unable to add new layer to vector map <%(vector)s>. Layer %(layer)d already exists."
+msgstr "Nu se poate adăuga un strat nou la harta vectorială <%(vector)s>.  Stratul %(layer)d există deja."
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:68
+#, python-format
+msgid "GRASS SQL Builder (%(type)s): vector map <%(map)s>"
+msgstr "Construcție SQL GRASS (%(type)s): harta vectorială <%(map)s>"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:75
+msgid "SQL statement not verified"
+msgstr "Declarația SQL nu a fost verificată"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:99 ../gui/wxpython/menustrings.py:820
+msgid "Query"
+msgstr "Interogare"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:117
+msgid "Set SQL statement to default"
+msgstr "Setează declarația SQL ca implicit"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:119
+msgid "Verify"
+msgstr "Verifică"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:120
+msgid "Verify SQL statement"
+msgstr "Verifică declarația SQL"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:122
+msgid "Apply SQL statement and close the dialog"
+msgstr "Aplică declarația SQL și închide caseta de dialog"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:124
+msgid "Close the dialog"
+msgstr "ÃŽnchide caseta de dialog"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:173
+msgid "Columns"
+msgstr "Coloane"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:183
+msgid "Add on double-click"
+msgstr "Adaugă la dublu-click"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:184
+msgid "columns"
+msgstr "coloane"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:184
+msgid "values"
+msgstr "valori"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:195
+msgid "Values"
+msgstr "Valori"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:204
+msgid "Get all values"
+msgstr "Obține toate valorile"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:207
+msgid "Get sample"
+msgstr "Obține eșantion"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:227
+msgid "Close dialog on apply"
+msgstr "Închide caseta de dialog după validare"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:423
+msgid "SQL statement is not valid"
+msgstr "Declarația SQL nu este validă"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:425
+#, python-format
+msgid ""
+"SQL statement is not valid.\n"
+"\n"
+"%s"
+msgstr ""
+"Declarația SQL nu este validă.\n"
+"\n"
+"%s"
+
+#: ../gui/wxpython/dbmgr/sqlbuilder.py:427
+msgid "SQL statement is valid"
+msgstr "Declarația SQL este validă"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:71
+#, python-format
+msgid ""
+"No attribute table found.\n"
+"\n"
+"Do you want to create a new attribute table and defined a link to vector map <%s>?"
+msgstr ""
+"Nu a fost găsit nici un tabel de atribute.\n"
+"\n"
+"Doriți să creați un tabel nou și să definiți o legătură cu harta vectorială <%s>?"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:74
+msgid "Create table?"
+msgstr "Creați tabel?"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:94
+msgid "Close dialog on submit"
+msgstr "Închide caseta de dialog după validare"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:106
+msgid "No attributes found"
+msgstr "Nici un atribut găsit"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:112 ../gui/wxpython/menustrings.py:650
+msgid "Update attributes"
+msgstr "Actualizare atribute"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:114
+msgid "Define attributes"
+msgstr "Definire atribute"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:116
+msgid "Display attributes"
+msgstr "Afișare atribute"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:120
+msgid "&Reload"
+msgstr "&Reîncarcă"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:121 ../gui/wxpython/dbmgr/dialogs.py:587
+msgid "&Submit"
+msgstr "&Trimite"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:139 ../gui/wxpython/vdigit/dialogs.py:166
+msgid "Feature id:"
+msgstr "Trăsătură id:"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:226
+#, python-format
+msgid "Column <%(col)s>: Value '%(value)s' needs to be entered as %(type)s."
+msgstr "Coloana <%(col)s>: Valoare '%(value)s' trebuie introdusă ca %(type)s."
+
+#: ../gui/wxpython/dbmgr/dialogs.py:426
+msgid "Unknown"
+msgstr "Necunoscut"
+
+#: ../gui/wxpython/dbmgr/dialogs.py:484 ../gui/wxpython/dbmgr/dialogs.py:602
+#: ../gui/wxpython/vdigit/dialogs.py:118 ../gui/wxpython/vdigit/dialogs.py:556
+#: ../gui/wxpython/vdigit/preferences.py:362
+msgid "Category"
+msgstr "Categorie"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:36
+msgid "Set default region extent and resolution"
+msgstr "Setați implicit extinderea și rezoluția regiunii"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:83
+msgid "&Set region"
+msgstr "&Setați regiune"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:113
+msgid "Invalid location selected."
+msgstr "Locație selectată invalidă."
+
+#: ../gui/wxpython/location_wizard/dialogs.py:130
+msgid "Invalid region"
+msgstr "Regiune invalidă"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:160
+msgid "Click here to show 3D settings"
+msgstr "Click aici pentru a afișa setările 3D"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:161
+msgid "Click here to hide 3D settings"
+msgstr "Click aici pentru a ascunde setările 3D"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:184
+#: ../gui/wxpython/location_wizard/dialogs.py:465
+#, python-format
+msgid "Rows: %d"
+msgstr "Rânduri: %d"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:185
+#: ../gui/wxpython/location_wizard/dialogs.py:466
+#, python-format
+msgid "Cols: %d"
+msgstr "Coloane: %d"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:186
+#: ../gui/wxpython/location_wizard/dialogs.py:467
+#, python-format
+msgid "Cells: %d"
+msgstr "Celule: %d"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:227
+#: ../gui/wxpython/location_wizard/dialogs.py:469
+#, python-format
+msgid "Depth: %d"
+msgstr "Adâncime: %d"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:228
+#: ../gui/wxpython/location_wizard/dialogs.py:470
+#, python-format
+msgid "3D Cells: %d"
+msgstr "Celule 3D: %d"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:231
+#: ../gui/wxpython/psmap/dialogs.py:384
+msgid "Top"
+msgstr "Sus"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:239
+#: ../gui/wxpython/psmap/dialogs.py:384
+msgid "Bottom"
+msgstr "Jos"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:247
+msgid "T-B resolution"
+msgstr "rezoluția T-B"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:310
+msgid "North"
+msgstr "Nord"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:318
+msgid "West"
+msgstr "Vest"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:338
+msgid "East"
+msgstr "Est"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:347
+msgid "South"
+msgstr "Sud"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:351
+msgid "N-S resolution"
+msgstr "rezoluția N-S"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:359
+msgid "E-W resolution"
+msgstr "rezoluția E-W"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:437
+#, python-format
+msgid "Invalid value: %s"
+msgstr "Valoare invalidă: %s"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:521
+msgid "Select datum transformation"
+msgstr "Selectați transformare datum"
+
+#: ../gui/wxpython/location_wizard/dialogs.py:546
+msgid "Select from list of datum transformations"
+msgstr "Selectați din lista transformărilor de referință"
+
+#: ../gui/wxpython/location_wizard/wizard.py:94
+msgid "Define GRASS Database and Location Name"
+msgstr "Definiță baza de date GRASS și numele locației"
+
+#: ../gui/wxpython/location_wizard/wizard.py:111
+#: ../gui/wxpython/gis_set.py:113
+msgid "GIS Data Directory:"
+msgstr "Directorul de date GIS:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:127
+msgid "Project Location"
+msgstr "Proiecția locației"
+
+#: ../gui/wxpython/location_wizard/wizard.py:128
+msgid "Name of location directory in GIS Data Directory"
+msgstr "Numele directorului de locație în directorul de date GIS"
+
+#: ../gui/wxpython/location_wizard/wizard.py:139
+msgid "Location Title"
+msgstr "Titlul locației"
+
+#: ../gui/wxpython/location_wizard/wizard.py:140
+msgid "Optional location title, you can leave this field blank."
+msgstr "Titlul locației opționa, puteți lăsa câmpul necompletat."
+
+#: ../gui/wxpython/location_wizard/wizard.py:159
+#, python-format
+msgid "Name <%(name)s> is not a valid name for location. Please use only ASCII characters excluding %(chars)s and space."
+msgstr "Nume <%(name)s> nu este un nume valid pentru locație. Vă rugăm utilizați doar caractere ASCII excluzând %(chars)s și spații."
+
+#: ../gui/wxpython/location_wizard/wizard.py:162
+msgid "Invalid location name"
+msgstr "Nume locație invalid"
+
+#: ../gui/wxpython/location_wizard/wizard.py:177
+msgid "Choose GRASS data directory:"
+msgstr "Alegeți directorul de date GIS:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:188
+#: ../gui/wxpython/location_wizard/wizard.py:1994
+msgid "Location already exists in GRASS Database."
+msgstr "Locația există deja în baza de date GRASS."
+
+#: ../gui/wxpython/location_wizard/wizard.py:192
+msgid "Unable to create location"
+msgstr "Nu s-a putut crea locația"
+
+#: ../gui/wxpython/location_wizard/wizard.py:205
+msgid "Title of the location is limited only to one line and 256 characters. The rest of the text will be ignored."
+msgstr "Titlul locației este limitat doar la o singură linie și 256 caractere. Restul textului va fi ignorat."
+
+#: ../gui/wxpython/location_wizard/wizard.py:212
+msgid "Choose method for creating a new location"
+msgstr "Alegeți metoda pentru crearea unei locații noi"
+
+#: ../gui/wxpython/location_wizard/wizard.py:219
+msgid "Select coordinate system parameters from a list"
+msgstr "Selectați parametrii sistemului de coordonate dintr-o listă"
+
+#: ../gui/wxpython/location_wizard/wizard.py:222
+msgid "Select EPSG code of spatial reference system"
+msgstr "Selectați codul EPSG a sistemului de referință spațial"
+
+#: ../gui/wxpython/location_wizard/wizard.py:224
+msgid "Read projection and datum terms from a georeferenced data file"
+msgstr "Citiți proiecția și termenii de referință dintr-un fișier de date georeferențiate"
+
+#: ../gui/wxpython/location_wizard/wizard.py:227
+#, fuzzy
+msgid "Read projection and datum terms from a Well Known Text (WKT) .prj file"
+msgstr "Citiți proiecția și termenii de referință dintr-un fișier WKT sau PRJ"
+
+#: ../gui/wxpython/location_wizard/wizard.py:230
+msgid "Specify projection and datum terms using custom PROJ.4 parameters"
+msgstr "Specificați proiecția și termenii de referință folosind parametrii PROJ.4"
+
+#: ../gui/wxpython/location_wizard/wizard.py:233
+msgid "Create a generic Cartesian coordinate system (XY)"
+msgstr "Creați un sistem generic de coordonate carteziene (XY)"
+
+#: ../gui/wxpython/location_wizard/wizard.py:334
+msgid "Choose projection"
+msgstr "Alege proiecție"
+
+#: ../gui/wxpython/location_wizard/wizard.py:350
+#: ../gui/wxpython/location_wizard/wizard.py:851
+#: ../gui/wxpython/location_wizard/wizard.py:1017
+#: ../gui/wxpython/location_wizard/wizard.py:1285
+msgid "Code"
+msgstr "Cod"
+
+#: ../gui/wxpython/location_wizard/wizard.py:350
+#: ../gui/wxpython/location_wizard/wizard.py:851
+#: ../gui/wxpython/location_wizard/wizard.py:1017
+#: ../gui/wxpython/location_wizard/wizard.py:1285
+#: ../gui/wxpython/gmodeler/frame.py:1315
+#: ../gui/wxpython/gmodeler/frame.py:1377
+msgid "Description"
+msgstr "Descriere"
+
+#: ../gui/wxpython/location_wizard/wizard.py:355
+msgid "Projection code:"
+msgstr "Codul proiecției:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:363
+#: ../gui/wxpython/location_wizard/wizard.py:865
+#: ../gui/wxpython/location_wizard/wizard.py:1030
+msgid "Search in description:"
+msgstr "Caută în descriere:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:537
+#, python-format
+msgid "Unable to read list: %s"
+msgstr "Nu s-a putut citi lista: %s"
+
+#: ../gui/wxpython/location_wizard/wizard.py:640
+msgid "Choose projection parameters"
+msgstr "Alegeți parametrii proiecției"
+
+#: ../gui/wxpython/location_wizard/wizard.py:656
+msgid "Select datum or ellipsoid (next page)"
+msgstr "Selectați datum sau elipsoid (pagina următoare)"
+
+#: ../gui/wxpython/location_wizard/wizard.py:662
+msgid "Datum with associated ellipsoid"
+msgstr "Datum asociat cu elipsoid"
+
+#: ../gui/wxpython/location_wizard/wizard.py:665
+msgid "Ellipsoid only"
+msgstr "Doar elipsoid"
+
+#: ../gui/wxpython/location_wizard/wizard.py:722
+#, python-format
+msgid "You must enter a value for %s"
+msgstr "Trebuie să introduceți o valoare pentru  %s"
+
+#: ../gui/wxpython/location_wizard/wizard.py:734
+#: ../gui/wxpython/location_wizard/wizard.py:752
+#, python-format
+msgid " Enter parameters for %s projection "
+msgstr "Introduceți parametrii pentru %s proiecție"
+
+#: ../gui/wxpython/location_wizard/wizard.py:775
+msgid "No"
+msgstr "Nu"
+
+#: ../gui/wxpython/location_wizard/wizard.py:775
+msgid "Yes"
+msgstr "Da"
+
+#: ../gui/wxpython/location_wizard/wizard.py:829
+msgid "Specify geodetic datum"
+msgstr "Specifică datum geodezic"
+
+#: ../gui/wxpython/location_wizard/wizard.py:851
+msgid "Ellipsoid"
+msgstr "Elipsoid"
+
+#: ../gui/wxpython/location_wizard/wizard.py:856
+msgid "Datum code:"
+msgstr "Cod datum:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:994
+msgid "Specify ellipsoid"
+msgstr "Specifică elipsoid"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1022
+msgid "Ellipsoid code:"
+msgstr "Cod elipsoid:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1111
+#: ../gui/wxpython/location_wizard/wizard.py:1171
+msgid "Select georeferenced file"
+msgstr "Selectați fișierul georeferențiat"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1116
+msgid "Georeferenced file:"
+msgstr "Fișier georeferențiat:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1185
+#: ../gui/wxpython/location_wizard/wizard.py:1242
+#, fuzzy
+msgid "Select Well Known Text (WKT) .prj file"
+msgstr "Selectați fișier de tip Well Known Text (WKT) .prj"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1190
+#, fuzzy
+msgid "WKT .prj file:"
+msgstr "Fișier WKT sau PRJ:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1259
+msgid "Choose EPSG Code"
+msgstr "Alegeți codul EPSG"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1267
+msgid "Path to the EPSG-codes file:"
+msgstr "Calea către EPSG- fișier coduri:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1285
+msgid "Parameters"
+msgstr "Parametrii"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1422
+msgid "Choose EPSG codes file"
+msgstr "Alegeți fișier EPSG coduri"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1451
+#, python-format
+msgid "Unable to read EPGS codes: %s"
+msgstr "Nu s-a putut citi codurile EPGS: %s"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1469
+msgid "Choose method of specifying georeferencing parameters"
+msgstr "Alegeți metoda de specificare a parametrilor de georefențiere"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1477
+msgid "Enter PROJ.4 parameters string:"
+msgstr "Introduceți parametrii șirului PROJ.4:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1532
+#: ../gui/wxpython/location_wizard/wizard.py:1536
+msgid "Datum transform is required."
+msgstr "Transformarea datumului este necesară."
+
+#: ../gui/wxpython/location_wizard/wizard.py:1571
+msgid "Summary"
+msgstr "Rezumat"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1616
+msgid "GRASS Database:"
+msgstr "Baza de date GRASS:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1622
+msgid "Location Name:"
+msgstr "Numele locației:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1628
+msgid "Location Title:"
+msgstr "Titlul locației:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1634
+msgid "Projection:"
+msgstr "Proiecția:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1640
+#, fuzzy
+msgid ""
+"PROJ.4 definition:\n"
+" (non-definitive)"
+msgstr "Definirea PROJ.4:"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1730
+#: ../gui/wxpython/psmap/dialogs.py:506 ../gui/wxpython/psmap/dialogs.py:527
+msgid "custom"
+msgstr "obicei"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1740
+#, python-format
+msgid "Do you want to create GRASS location <%s>?"
+msgstr "Doriți să creați locația GRASS <%s>?"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1741
+msgid "Create new location?"
+msgstr "Creați locație nouă?"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1785
+msgid "Define new GRASS Location"
+msgstr "Definirea unei locații noi GRASS"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1877
+#, python-format
+msgid ""
+"Unable to create new location. Location <%(loc)s> not created.\n"
+"\n"
+"Details: %(err)s"
+msgstr ""
+"Nu s-a putut crea locație nouă. Locația <%(loc)s> nu a fost creată.\n"
+"\n"
+"Detalii:%(err)s"
+
+#: ../gui/wxpython/location_wizard/wizard.py:1885
+msgid "Location wizard canceled. Location not created."
+msgstr "Locație wizard anulată. Locația nu a fost creată. "
+
+#: ../gui/wxpython/location_wizard/wizard.py:1992
+msgid "Unable to create new location"
+msgstr "Nu s-a putut crea locație nouă"
+
+#: ../gui/wxpython/location_wizard/wizard.py:2011
+#, python-format
+msgid "Location <%(loc)s> will be created in GIS data directory <%(dir)s>. You will need to change the default GIS data directory in the GRASS startup screen."
+msgstr "Locația <%(loc)s> va fi creată în directorul de date GIS <%(dir)s>. Va fi nevoie să schimbați directorul de date GIS implicit în fereastra de pornire GRASS."
+
+#: ../gui/wxpython/location_wizard/wizard.py:2016
+msgid "New GIS data directory"
+msgstr "Director de date GIS nou"
+
+#: ../gui/wxpython/location_wizard/wizard.py:2047
+msgid "EPSG code missing."
+msgstr "Codul EPSG lipsește."
+
+#: ../gui/wxpython/location_wizard/wizard.py:2058
+#: ../gui/wxpython/location_wizard/wizard.py:2067
+#, python-format
+msgid "File <%s> not found."
+msgstr "Fișierul <%s> nu este găsit."
+
+#: ../gui/wxpython/psmap/instructions.py:133
+#, python-format
+msgid ""
+"Unable to open file\n"
+"%s"
+msgstr ""
+"Nu se poate deschide fișierul\n"
+"%s"
+
+#: ../gui/wxpython/psmap/instructions.py:460
+#, python-format
+msgid "Instruction file will be loaded with following region: %s\n"
+msgstr "Fișierul de instrucțiune va fi încărcat cu următoare regiune: %s\n"
+
+#: ../gui/wxpython/psmap/instructions.py:465
+#, python-format
+msgid ""
+"Region cannot be set\n"
+"%s"
+msgstr ""
+"Regiunea nu poate fi stabilită\n"
+"%s"
+
+#: ../gui/wxpython/psmap/instructions.py:604
+#: ../gui/wxpython/psmap/instructions.py:754
+#: ../gui/wxpython/psmap/instructions.py:870
+#: ../gui/wxpython/psmap/instructions.py:928
+#: ../gui/wxpython/psmap/instructions.py:1069
+#: ../gui/wxpython/psmap/instructions.py:1124
+#: ../gui/wxpython/psmap/instructions.py:1183
+#: ../gui/wxpython/psmap/instructions.py:1252
+#: ../gui/wxpython/psmap/instructions.py:1358
+#: ../gui/wxpython/psmap/instructions.py:1483
+#: ../gui/wxpython/psmap/instructions.py:1534
+#, python-format
+msgid "Failed to read instruction %s"
+msgstr "A eșuat citirea instrucțiunilor %s"
+
+#: ../gui/wxpython/psmap/instructions.py:618
+#, python-format
+msgid ""
+"Scale has changed, old value: %(old)s\n"
+"new value: %(new)s"
+msgstr ""
+"Scara a fost schimbată, valoare veche: %(old)s\n"
+"valoare nouă: %(new)s"
+
+#: ../gui/wxpython/psmap/instructions.py:621
+#, python-format
+msgid ""
+"Failed to read instruction %s.\n"
+"Use 1:25000 notation."
+msgstr ""
+"Citirea instrucțiunilor a eșuat %s.\n"
+"Utilizare 1:25000 notație."
+
+#: ../gui/wxpython/psmap/instructions.py:629
+#, python-format
+msgid ""
+"Map frame position changed, old value: %(old1)s %(old2)s\n"
+"new value: %(new1)s %(new2)s"
+msgstr ""
+"Poziția cadrului hărții a fost schimbată, valoare veche: %(old1)s %(old2)s\n"
+"valoare nouă: %(new1)s %(new2)s"
+
+#: ../gui/wxpython/psmap/instructions.py:637
+#, python-format
+msgid ""
+"Map frame size changed, old value: %(old1)s %(old2)s\n"
+"new value: %(new1)s %(new2)s"
+msgstr ""
+"Dimensiunea cadrului hărții a fost schimbată, valoare veche: %(old1)s %(old2)s\n"
+"valoare nouă: %(new1)s %(new2)s"
+
+#: ../gui/wxpython/psmap/instructions.py:684
+#, python-format
+msgid ""
+"Failed to read instruction %(file)s.\n"
+"Unknown format %(for)s"
+msgstr ""
+"Citirea instrucțiunilor a eșuat %(file)s.\n"
+"Format necunoscut %(for)s"
+
+#: ../gui/wxpython/psmap/instructions.py:697
+#, python-format
+msgid "Failed to read instruction %s."
+msgstr "Citirea instrucțiunilor a eșuat %s."
+
+#: ../gui/wxpython/psmap/instructions.py:811
+#: ../gui/wxpython/psmap/instructions.py:1693
+#, python-format
+msgid "Characters on position %s are not supported by ISO-8859-1 (Latin 1) encoding which is required by module ps.map."
+msgstr "Caracterele de pe poziția %s nu sunt acceptate de codificarea  ISO-8859-1 (Latin 1) care sunt necesare pentru modulul ps.map."
+
+#: ../gui/wxpython/psmap/instructions.py:815
+#: ../gui/wxpython/psmap/instructions.py:1697
+msgid "Not all characters are supported by ISO-8859-1 (Latin 1) encoding which is required by module ps.map."
+msgstr "Nu toate caracterele sunt acceptate de codificarea  ISO-8859-1 (Latin 1) care sunt necesare pentru modulul ps.map."
+
+#: ../gui/wxpython/psmap/instructions.py:931
+#, python-format
+msgid "Failed to read instruction %(inst)s: file %(file)s not found."
+msgstr "Citirea instrucțiunilor a eșuat %(inst)s: fișierul %(file)s nu a fost găsit."
+
+#: ../gui/wxpython/psmap/toolbars.py:52
+msgid "Generate text file with mapping instructions"
+msgstr "Generează fișierul text cu instrucțiunile de cartografiere"
+
+#: ../gui/wxpython/psmap/toolbars.py:54
+msgid "Load text file with mapping instructions"
+msgstr "Încarcă fișierul text cu instrucțiunile de cartografiere"
+
+#: ../gui/wxpython/psmap/toolbars.py:56
+msgid "Generate PostScript output"
+msgstr "Generează ca ieșire PostScript"
+
+#: ../gui/wxpython/psmap/toolbars.py:58
+msgid "Generate PDF output"
+msgstr "Generează ca ieșire PDF"
+
+#: ../gui/wxpython/psmap/toolbars.py:60
+#: ../gui/wxpython/modules/histogram.py:443
+#: ../gui/wxpython/mapdisp/frame.py:605 ../gui/wxpython/wxplot/base.py:483
+#: ../gui/wxpython/gcp/mapdisplay.py:485
+msgid "Page setup"
+msgstr "Pagina de configurare"
+
+#: ../gui/wxpython/psmap/toolbars.py:61
+msgid "Specify paper size, margins and orientation"
+msgstr "Specifică formatul paginii, marginile și orientarea"
+
+#: ../gui/wxpython/psmap/toolbars.py:63
+msgid "Full extent"
+msgstr "Extindere maximă"
+
+#: ../gui/wxpython/psmap/toolbars.py:64
+msgid "Zoom to full extent"
+msgstr "Mărește la extinderea maximă"
+
+#: ../gui/wxpython/psmap/toolbars.py:66 ../gui/wxpython/psmap/dialogs.py:618
+#: ../gui/wxpython/psmap/dialogs.py:673
+msgid "Map frame"
+msgstr "Cadrul hărții"
+
+#: ../gui/wxpython/psmap/toolbars.py:67
+msgid "Click and drag to place map frame"
+msgstr "Click și trage pentru a plasa cadrul hărții"
+
+#: ../gui/wxpython/psmap/toolbars.py:69
+msgid "Delete selected object"
+msgstr "Șterge obiectele selectate"
+
+#: ../gui/wxpython/psmap/toolbars.py:71
+msgid "Show preview"
+msgstr "Arată previzualizare"
+
+#: ../gui/wxpython/psmap/toolbars.py:73
+msgid "Quit Cartographic Composer"
+msgstr "Închide Compoziție Cartografică"
+
+#: ../gui/wxpython/psmap/toolbars.py:75 ../gui/wxpython/psmap/dialogs.py:3704
+#: ../gui/wxpython/psmap/dialogs.py:3709
+msgid "Text"
+msgstr "Text"
+
+#: ../gui/wxpython/psmap/toolbars.py:77
+msgid "Map info"
+msgstr "Informații hartă"
+
+#: ../gui/wxpython/psmap/toolbars.py:79 ../gui/wxpython/wxplot/dialogs.py:576
+#: ../gui/wxpython/wxplot/dialogs.py:618
+msgid "Legend"
+msgstr "Legendă"
+
+#: ../gui/wxpython/psmap/toolbars.py:81 ../gui/wxpython/nviz/tools.py:1895
+msgid "Scale bar"
+msgstr "Scara"
+
+#: ../gui/wxpython/psmap/toolbars.py:83 ../gui/wxpython/psmap/dialogs.py:4060
+#: ../gui/wxpython/psmap/dialogs.py:4108
+msgid "Image"
+msgstr "Imagine"
+
+#: ../gui/wxpython/psmap/toolbars.py:85 ../gui/wxpython/psmap/dialogs.py:4493
+#: ../gui/wxpython/mapdisp/toolbars.py:35 ../gui/wxpython/nviz/tools.py:1853
+msgid "North Arrow"
+msgstr "Săgeata Nord"
+
+#: ../gui/wxpython/psmap/toolbars.py:87
+msgid "Add simple graphics"
+msgstr "Adaugă grafice simple"
+
+#: ../gui/wxpython/psmap/toolbars.py:89 ../gui/wxpython/psmap/dialogs.py:4525
+#: ../gui/wxpython/vdigit/preferences.py:516
+msgid "Point"
+msgstr "Punct"
+
+#: ../gui/wxpython/psmap/toolbars.py:91
+#: ../gui/wxpython/vdigit/preferences.py:517
+msgid "Line"
+msgstr "Linie"
+
+#: ../gui/wxpython/psmap/toolbars.py:93
+msgid "Rectangle"
+msgstr "Dreptunghi"
+
+#: ../gui/wxpython/psmap/dialogs.py:197
+msgid "Units:"
+msgstr "Unități:"
+
+#: ../gui/wxpython/psmap/dialogs.py:206
+msgid ""
+"Position of the top left corner\n"
+"from the top left edge of the paper"
+msgstr ""
+"Poziția colțului stânga sus\n"
+"de la marginea stângă sus a paginii"
+
+#: ../gui/wxpython/psmap/dialogs.py:207
+msgid "X:"
+msgstr "X:"
+
+#: ../gui/wxpython/psmap/dialogs.py:208
+msgid "Y:"
+msgstr "Y:"
+
+#: ../gui/wxpython/psmap/dialogs.py:220
+msgid "Position is given:"
+msgstr "Poziția este dată:"
+
+#: ../gui/wxpython/psmap/dialogs.py:221
+#, fuzzy
+msgid "relative to paper"
+msgstr "în raport cu pagina"
+
+#: ../gui/wxpython/psmap/dialogs.py:222
+msgid "by map coordinates"
+msgstr "în funcție de coordonatele hărții"
+
+#: ../gui/wxpython/psmap/dialogs.py:238
+msgid ""
+"Position from the top left\n"
+"edge of the paper"
+msgstr ""
+"Poziția din stânga sus\n"
+"marginea paginii"
+
+#: ../gui/wxpython/psmap/dialogs.py:290
+msgid "Font:"
+msgstr "Font:"
+
+#: ../gui/wxpython/psmap/dialogs.py:304
+msgid "Choose color:"
+msgstr "Alege culoare:"
+
+#: ../gui/wxpython/psmap/dialogs.py:352
+msgid "Close dialog and apply changes"
+msgstr "Închide caseta de dialog și aplică modificările"
+
+#: ../gui/wxpython/psmap/dialogs.py:358 ../gui/wxpython/vdigit/dialogs.py:142
+msgid "Apply changes"
+msgstr "Aplică modificările"
+
+#: ../gui/wxpython/psmap/dialogs.py:383
+msgid "Units"
+msgstr "Unități"
+
+#: ../gui/wxpython/psmap/dialogs.py:383
+msgid "Format"
+msgstr "Format"
+
+#: ../gui/wxpython/psmap/dialogs.py:383
+msgid "Orientation"
+msgstr "Orientare"
+
+#: ../gui/wxpython/psmap/dialogs.py:383 ../gui/wxpython/psmap/dialogs.py:2084
+msgid "Width"
+msgstr "Lățime"
+
+#: ../gui/wxpython/psmap/dialogs.py:383
+msgid "Height"
+msgstr "Înălțime"
+
+#: ../gui/wxpython/psmap/dialogs.py:384
+msgid "Left"
+msgstr "Stânga"
+
+#: ../gui/wxpython/psmap/dialogs.py:384
+msgid "Right"
+msgstr "Dreapta"
+
+#: ../gui/wxpython/psmap/dialogs.py:439
+msgid "Literal is not allowed!"
+msgstr "Literal nu este permis!"
+
+#: ../gui/wxpython/psmap/dialogs.py:439 ../gui/wxpython/psmap/dialogs.py:1034
+#: ../gui/wxpython/psmap/dialogs.py:1056 ../gui/wxpython/psmap/dialogs.py:1106
+#: ../gui/wxpython/psmap/dialogs.py:3636
+msgid "Invalid input"
+msgstr "Intrare invalidă"
+
+#: ../gui/wxpython/psmap/dialogs.py:448
+msgid "Page size"
+msgstr "Dimensiunea paginii"
+
+#: ../gui/wxpython/psmap/dialogs.py:450
+msgid "Margins"
+msgstr "Margini"
+
+#: ../gui/wxpython/psmap/dialogs.py:454
+msgid "Portrait"
+msgstr "Portret"
+
+#: ../gui/wxpython/psmap/dialogs.py:454
+msgid "Landscape"
+msgstr "Peisaj"
+
+#: ../gui/wxpython/psmap/dialogs.py:556
+msgid "Map settings"
+msgstr "Setările hărții"
+
+#: ../gui/wxpython/psmap/dialogs.py:562
+msgid "Map frame settings"
+msgstr "Setările cadrului hărții"
+
+#: ../gui/wxpython/psmap/dialogs.py:679
+msgid "Map frame options:"
+msgstr "Opțiunile cadrului hărții"
+
+#: ../gui/wxpython/psmap/dialogs.py:680
+msgid "fit frame to match selected map"
+msgstr "potrivește cadrul cu harta selectată"
+
+#: ../gui/wxpython/psmap/dialogs.py:681
+msgid "fit frame to match saved region"
+msgstr "potrivește cadrul cu regiunea salvată"
+
+#: ../gui/wxpython/psmap/dialogs.py:682
+msgid "fit frame to match current computational region"
+msgstr "potrivește cadrul cu regiunea de calcul curentă"
+
+#: ../gui/wxpython/psmap/dialogs.py:683
+msgid "fixed scale and map center"
+msgstr "fixează scara și centrul hărții"
+
+#: ../gui/wxpython/psmap/dialogs.py:691 ../gui/wxpython/psmap/dialogs.py:859
+msgid "Map selection"
+msgstr "Selecția hărții"
+
+#: ../gui/wxpython/psmap/dialogs.py:699 ../gui/wxpython/psmap/dialogs.py:1283
+msgid "Map:"
+msgstr "Harta:"
+
+#: ../gui/wxpython/psmap/dialogs.py:699
+msgid "Region:"
+msgstr "Regiunea:"
+
+#: ../gui/wxpython/psmap/dialogs.py:718
+msgid "Map scale and center"
+msgstr "Scara și centrul hărții"
+
+#: ../gui/wxpython/psmap/dialogs.py:723
+msgid "Center:"
+msgstr "Centru:"
+
+#: ../gui/wxpython/psmap/dialogs.py:724
+msgid "E:"
+msgstr "E:"
+
+#: ../gui/wxpython/psmap/dialogs.py:725
+msgid "N:"
+msgstr "N:"
+
+#: ../gui/wxpython/psmap/dialogs.py:728 ../gui/wxpython/psmap/dialogs.py:4165
+msgid "Scale:"
+msgstr "Scara:"
+
+#: ../gui/wxpython/psmap/dialogs.py:729
+msgid "1 :"
+msgstr "1:"
+
+#: ../gui/wxpython/psmap/dialogs.py:749
+msgid "Map max resolution (dpi):"
+msgstr "Rezoluția maximă a hărții  (dpi):"
+
+#: ../gui/wxpython/psmap/dialogs.py:762 ../gui/wxpython/psmap/dialogs.py:2653
+msgid "Border"
+msgstr "Chenar"
+
+#: ../gui/wxpython/psmap/dialogs.py:766
+msgid "draw border around map frame"
+msgstr "desenează chenar în jurul cadrului hărții"
+
+#: ../gui/wxpython/psmap/dialogs.py:772
+msgid "border color:"
+msgstr "Culoare chenar:"
+
+#: ../gui/wxpython/psmap/dialogs.py:773
+msgid "border width (pts):"
+msgstr "lățimea chenarului (pts):"
+
+#: ../gui/wxpython/psmap/dialogs.py:867
+msgid ""
+"Region is set to match this map,\n"
+"raster or vector map must be added later"
+msgstr ""
+"Regiunea este setată pentru a se potrivi cu această hartă,\n"
+"harta vectorială sau raster trebuie adăugată mai târziu"
+
+#: ../gui/wxpython/psmap/dialogs.py:874
+msgid "Region selection"
+msgstr "Selecția regiunii"
+
+#: ../gui/wxpython/psmap/dialogs.py:1033
+msgid "No map selected!"
+msgstr "Nici o hartă selectată!"
+
+#: ../gui/wxpython/psmap/dialogs.py:1055
+msgid "No region selected!"
+msgstr "Nici o regiune selectată!"
+
+#: ../gui/wxpython/psmap/dialogs.py:1105
+msgid "Invalid scale or map center!"
+msgstr "Scară sau centrul hărții invalid(ă)!"
+
+#: ../gui/wxpython/psmap/dialogs.py:1143 ../gui/wxpython/nviz/tools.py:648
+#: ../gui/wxpython/nviz/mapwindow.py:1630
+msgid "Raster map"
+msgstr "Harta raster"
+
+#: ../gui/wxpython/psmap/dialogs.py:1165
+msgid "Choose raster map"
+msgstr "Alege harta raster"
+
+#: ../gui/wxpython/psmap/dialogs.py:1169
+msgid "no raster map"
+msgstr "nici o hartă raster"
+
+#: ../gui/wxpython/psmap/dialogs.py:1170
+msgid "raster:"
+msgstr "raster:"
+
+#: ../gui/wxpython/psmap/dialogs.py:1210 ../gui/wxpython/psmap/frame.py:580
+#: ../gui/wxpython/psmap/frame.py:603
+msgid "Please, create map frame first."
+msgstr "Vă rugăm să creați prima data cadrul hărții."
+
+#: ../gui/wxpython/psmap/dialogs.py:1270 ../gui/wxpython/gmodeler/model.py:668
+msgid "Vector maps"
+msgstr "Hărți vectoriale"
+
+#: ../gui/wxpython/psmap/dialogs.py:1279
+msgid "Add map"
+msgstr "Adaugă harta"
+
+#: ../gui/wxpython/psmap/dialogs.py:1287 ../gui/wxpython/psmap/dialogs.py:1651
+msgid "points"
+msgstr "puncte"
+
+#: ../gui/wxpython/psmap/dialogs.py:1287 ../gui/wxpython/psmap/dialogs.py:1653
+msgid "lines"
+msgstr "linii"
+
+#: ../gui/wxpython/psmap/dialogs.py:1287
+msgid "areas"
+msgstr "areale"
+
+#: ../gui/wxpython/psmap/dialogs.py:1289
+msgid "Data Type"
+msgstr "Tipul datei"
+
+#: ../gui/wxpython/psmap/dialogs.py:1292
+msgid "Add"
+msgstr "Adaugă"
+
+#: ../gui/wxpython/psmap/dialogs.py:1304
+msgid "Manage vector maps"
+msgstr "Gestionează hărțile vectoriale"
+
+#: ../gui/wxpython/psmap/dialogs.py:1312
+msgid "The topmost vector map overlaps the others"
+msgstr "Cea mai de sus hartă vectorială se suprapune peste celelalte"
+
+#: ../gui/wxpython/psmap/dialogs.py:1314 ../gui/wxpython/psmap/dialogs.py:2636
+msgid "Up"
+msgstr "Sus"
+
+#: ../gui/wxpython/psmap/dialogs.py:1315 ../gui/wxpython/psmap/dialogs.py:2637
+msgid "Down"
+msgstr "Jos"
+
+#: ../gui/wxpython/psmap/dialogs.py:1316 ../gui/wxpython/menustrings.py:163
+#: ../gui/wxpython/nviz/tools.py:1094 ../gui/wxpython/nviz/tools.py:1883
+msgid "Delete"
+msgstr "Șterge"
+
+#: ../gui/wxpython/psmap/dialogs.py:1317
+msgid "Properties..."
+msgstr "Proprietăți..."
+
+#: ../gui/wxpython/psmap/dialogs.py:1517
+msgid "Raster map settings"
+msgstr "Setările hărții raster"
+
+#: ../gui/wxpython/psmap/dialogs.py:1554
+msgid "Vector maps settings"
+msgstr "Setările hărților vectoriale"
+
+#: ../gui/wxpython/psmap/dialogs.py:1589
+#, python-format
+msgid "%s properties"
+msgstr "%s proprietăți"
+
+#: ../gui/wxpython/psmap/dialogs.py:1640
+msgid "Data selection"
+msgstr "Selectarea datei"
+
+#: ../gui/wxpython/psmap/dialogs.py:1647
+msgid "Feature type"
+msgstr "Tipul trăsăturii"
+
+#: ../gui/wxpython/psmap/dialogs.py:1651
+msgid "centroids"
+msgstr "centroizi"
+
+#: ../gui/wxpython/psmap/dialogs.py:1653
+msgid "boundaries"
+msgstr "limitele"
+
+#: ../gui/wxpython/psmap/dialogs.py:1669
+msgid "Layer selection"
+msgstr "Selectarea stratului"
+
+#: ../gui/wxpython/psmap/dialogs.py:1675
+msgid "Database connection is not defined in DB file."
+msgstr "Conexiunea bazei de date nu este definită în fișierul DB."
+
+#: ../gui/wxpython/psmap/dialogs.py:1676
+msgid "Select layer:"
+msgstr "Selectează strat:"
+
+#: ../gui/wxpython/psmap/dialogs.py:1699
+msgid "list of categories (e.g. 1,3,5-7)"
+msgstr "lista categoriilor (e.g. 1,3,5-7)"
+
+#: ../gui/wxpython/psmap/dialogs.py:1726 ../gui/wxpython/menustrings.py:312
+#: ../gui/wxpython/nviz/tools.py:786 ../gui/wxpython/nviz/tools.py:2271
+msgid "Mask"
+msgstr "Mască"
+
+#: ../gui/wxpython/psmap/dialogs.py:1729
+msgid "Use current mask"
+msgstr "Folosește masca curentă"
+
+#: ../gui/wxpython/psmap/dialogs.py:1746 ../gui/wxpython/psmap/dialogs.py:1845
+msgid "Colors"
+msgstr "Culori"
+
+#: ../gui/wxpython/psmap/dialogs.py:1751 ../gui/wxpython/psmap/dialogs.py:1850
+msgid "Outline"
+msgstr "Contur"
+
+#: ../gui/wxpython/psmap/dialogs.py:1755 ../gui/wxpython/psmap/dialogs.py:1859
+msgid "draw outline"
+msgstr "desenați contur"
+
+#: ../gui/wxpython/psmap/dialogs.py:1758 ../gui/wxpython/psmap/dialogs.py:1863
+#: ../gui/wxpython/psmap/dialogs.py:3749 ../gui/wxpython/psmap/dialogs.py:3754
+msgid "Width (pts):"
+msgstr "Lățime (pts):"
+
+#: ../gui/wxpython/psmap/dialogs.py:1795 ../gui/wxpython/psmap/dialogs.py:1899
+#: ../gui/wxpython/wxplot/dialogs.py:610
+msgid "Fill"
+msgstr "Umple"
+
+#: ../gui/wxpython/psmap/dialogs.py:1799
+msgid "fill color"
+msgstr "culoare de umplere"
+
+#: ../gui/wxpython/psmap/dialogs.py:1802 ../gui/wxpython/psmap/dialogs.py:1905
+msgid "choose color:"
+msgstr "alege culoare:"
+
+#: ../gui/wxpython/psmap/dialogs.py:1814 ../gui/wxpython/psmap/dialogs.py:1918
+msgid "color from map table column:"
+msgstr "culoare din coloana tabelului hărții:"
+
+#: ../gui/wxpython/psmap/dialogs.py:1861
+msgid "No effect for fill color from table column"
+msgstr "Nici un efect pentru culoarea de umplere din coloana tabelului"
+
+#: ../gui/wxpython/psmap/dialogs.py:1903
+msgid "Color of lines:"
+msgstr "Culoarea liniilor:"
+
+#: ../gui/wxpython/psmap/dialogs.py:1948 ../gui/wxpython/psmap/dialogs.py:2079
+#: ../gui/wxpython/psmap/dialogs.py:2148
+msgid "Size and style"
+msgstr "Dimensiune și stil"
+
+#: ../gui/wxpython/psmap/dialogs.py:1953 ../gui/wxpython/gcp/manager.py:2396
+#: ../gui/wxpython/vdigit/preferences.py:80
+msgid "Symbology"
+msgstr "Simbologie"
+
+#: ../gui/wxpython/psmap/dialogs.py:1958 ../gui/wxpython/nviz/tools.py:1371
+msgid "symbol:"
+msgstr "simbol:"
+
+#: ../gui/wxpython/psmap/dialogs.py:1967
+msgid "eps file:"
+msgstr "fișier eps:"
+
+#: ../gui/wxpython/psmap/dialogs.py:1971 ../gui/wxpython/psmap/dialogs.py:2160
+msgid "Type filename or click browse to choose file"
+msgstr "Tastați un nume de fișier sau faceți click pe navigator pentru a alege fișierul"
+
+#: ../gui/wxpython/psmap/dialogs.py:1972 ../gui/wxpython/psmap/dialogs.py:2161
+msgid "Choose a file"
+msgstr "Alege un fișier"
+
+#: ../gui/wxpython/psmap/dialogs.py:1995 ../gui/wxpython/psmap/dialogs.py:2706
+#: ../gui/wxpython/psmap/dialogs.py:3470 ../gui/wxpython/wxplot/dialogs.py:601
+msgid "Size"
+msgstr "Dimensiune"
+
+#: ../gui/wxpython/psmap/dialogs.py:2000 ../gui/wxpython/nviz/tools.py:1321
+msgid "size:"
+msgstr "dimensiune:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2002
+msgid "size from map table column:"
+msgstr "dimensiune din coloana tabelului hărții:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2004
+msgid "scale:"
+msgstr "scara:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2036
+msgid "Rotation"
+msgstr "Rotația"
+
+#: ../gui/wxpython/psmap/dialogs.py:2042
+msgid "rotate symbols:"
+msgstr "rotește simboluri:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2043
+msgid "counterclockwise in degrees:"
+msgstr "invers acelor de ceasornic, în grade:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2045
+msgid "from map table column:"
+msgstr "din coloana tabelului:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2088
+msgid "Set width (pts):"
+msgstr "Setează lățime (pts):"
+
+#: ../gui/wxpython/psmap/dialogs.py:2097
+msgid "multiply width by category value"
+msgstr "modifică lățimea în funcție de valoarea de categorie"
+
+#: ../gui/wxpython/psmap/dialogs.py:2114 ../gui/wxpython/psmap/dialogs.py:4896
+#: ../gui/wxpython/wxplot/dialogs.py:567
+msgid "Line style"
+msgstr "Stilul liniei"
+
+#: ../gui/wxpython/psmap/dialogs.py:2118
+msgid "Choose line style:"
+msgstr "Alege stilul liniei:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2128
+msgid "Choose linecap:"
+msgstr "Alege tipul de capăt pentru linie:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2153
+msgid "Pattern"
+msgstr "Model"
+
+#: ../gui/wxpython/psmap/dialogs.py:2158
+msgid "use pattern:"
+msgstr "utilizează model:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2159
+msgid "Choose pattern file:"
+msgstr "Alege fișierul model:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2163
+msgid "pattern line width (pts):"
+msgstr "lățimea liniei de model (pts):"
+
+#: ../gui/wxpython/psmap/dialogs.py:2165
+msgid "pattern scale factor:"
+msgstr "factorul de scară al modelului:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2481
+msgid "Raster legend"
+msgstr "Legendă raster"
+
+#: ../gui/wxpython/psmap/dialogs.py:2485
+msgid "Show raster legend"
+msgstr "Arată legendă raster"
+
+#: ../gui/wxpython/psmap/dialogs.py:2491
+msgid "Source raster"
+msgstr "Sursa raster"
+
+#: ../gui/wxpython/psmap/dialogs.py:2496
+msgid "current raster"
+msgstr "rasterul curent"
+
+#: ../gui/wxpython/psmap/dialogs.py:2497
+msgid "select raster"
+msgstr "selectează raster"
+
+#: ../gui/wxpython/psmap/dialogs.py:2504 ../gui/wxpython/psmap/dialogs.py:3189
+#, python-format
+msgid "%(rast)s: type %(type)s"
+msgstr "%(rast)s: tip %(type)s"
+
+#: ../gui/wxpython/psmap/dialogs.py:2523
+msgid "Type of legend"
+msgstr "Tipul de legendă"
+
+#: ../gui/wxpython/psmap/dialogs.py:2527
+msgid "discrete legend (categorical maps)"
+msgstr "legendă discretă (categorii de hărți)"
+
+#: ../gui/wxpython/psmap/dialogs.py:2529
+msgid "continuous color gradient legend (floating point map)"
+msgstr "gradiant de culoare continuu pentru legendă (hartă cu numere reale)"
+
+#: ../gui/wxpython/psmap/dialogs.py:2540
+msgid "Advanced legend settings"
+msgstr "Setările avansate ale legendei "
+
+#: ../gui/wxpython/psmap/dialogs.py:2544
+msgid "draw \"no data\" box"
+msgstr "desenează \"fără date\" casetă"
+
+#: ../gui/wxpython/psmap/dialogs.py:2550
+msgid "draw ticks across color table"
+msgstr "arată amploarea tabelului de culoare"
+
+#: ../gui/wxpython/psmap/dialogs.py:2561
+#: ../gui/wxpython/modules/colorrules.py:834
+#: ../gui/wxpython/modules/colorrules.py:1450
+#: ../gui/wxpython/modules/colorrules.py:1453
+msgid "range"
+msgstr "interval"
+
+#: ../gui/wxpython/psmap/dialogs.py:2598
+msgid "Vector legend"
+msgstr "Legendă vector"
+
+#: ../gui/wxpython/psmap/dialogs.py:2602
+msgid "Show vector legend"
+msgstr "Arată legendă vector"
+
+#: ../gui/wxpython/psmap/dialogs.py:2608
+msgid "Source vector maps"
+msgstr "Sursa hărților vectoriale"
+
+#: ../gui/wxpython/psmap/dialogs.py:2614
+msgid "Choose vector maps and their order in legend"
+msgstr "Alege hărțile vectoriale și ordinea lor în legendă"
+
+#: ../gui/wxpython/psmap/dialogs.py:2618 ../gui/wxpython/nviz/tools.py:1173
+msgid "Vector map"
+msgstr "Harta vectorială"
+
+#: ../gui/wxpython/psmap/dialogs.py:2619
+msgid "Label"
+msgstr "Etichetă"
+
+#: ../gui/wxpython/psmap/dialogs.py:2638 ../gui/wxpython/psmap/dialogs.py:2944
+msgid "Edit label"
+msgstr "Editează eticheta"
+
+#: ../gui/wxpython/psmap/dialogs.py:2657
+msgid "draw border around legend"
+msgstr "desenează chenar în jurul legendei"
+
+#: ../gui/wxpython/psmap/dialogs.py:2694
+msgid "Size and position"
+msgstr "Dimensiune și poziție"
+
+#: ../gui/wxpython/psmap/dialogs.py:2704 ../gui/wxpython/psmap/dialogs.py:3245
+#: ../gui/wxpython/psmap/dialogs.py:3440 ../gui/wxpython/psmap/dialogs.py:3814
+#: ../gui/wxpython/psmap/dialogs.py:3818 ../gui/wxpython/psmap/dialogs.py:4220
+#: ../gui/wxpython/psmap/dialogs.py:4225 ../gui/wxpython/psmap/dialogs.py:4678
+#: ../gui/wxpython/psmap/dialogs.py:4683 ../gui/wxpython/nviz/tools.py:853
+#: ../gui/wxpython/nviz/tools.py:1583
+msgid "Position"
+msgstr "Poziție"
+
+#: ../gui/wxpython/psmap/dialogs.py:2728
+msgid "Leave the edit field empty, to use default values."
+msgstr "Lăsați câmpul editabil gol, pentru a folosi valorile implicite."
+
+#: ../gui/wxpython/psmap/dialogs.py:2750
+msgid ""
+"Width of the color symbol (for lines)\n"
+"in front of the legend text"
+msgstr ""
+"Lățimea simbolului de culoare (pentru linii)\n"
+" în fața textului legendei"
+
+#: ../gui/wxpython/psmap/dialogs.py:2756 ../gui/wxpython/psmap/dialogs.py:2861
+msgid "Columns:"
+msgstr "Coloane:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2760
+msgid "column span:"
+msgstr "lățimea coloanei:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2762
+msgid ""
+"Column separation distance between the left edges\n"
+"of two columns in a multicolumn legend"
+msgstr ""
+"Distanța de separare dintre marginile din stânga\n"
+"a două coloane în cadrul legendei"
+
+#: ../gui/wxpython/psmap/dialogs.py:2944
+msgid "Edit legend label:"
+msgstr "Editează eticheta legendei:"
+
+#: ../gui/wxpython/psmap/dialogs.py:2985
+msgid "No raster map selected!"
+msgstr "Nici o hartă raster selectată!"
+
+#: ../gui/wxpython/psmap/dialogs.py:2986
+msgid "No raster"
+msgstr "Nici un raster"
+
+#: ../gui/wxpython/psmap/dialogs.py:3220
+msgid "Mapinfo settings"
+msgstr "Parametrii hărții"
+
+#: ../gui/wxpython/psmap/dialogs.py:3282
+msgid "Color settings"
+msgstr "Setări culoare"
+
+#: ../gui/wxpython/psmap/dialogs.py:3288
+msgid "use border color:"
+msgstr "utilizează culoare pentru margine:"
+
+#: ../gui/wxpython/psmap/dialogs.py:3289
+msgid "use background color:"
+msgstr "utilizează culoare de fundal:"
+
+#: ../gui/wxpython/psmap/dialogs.py:3429
+msgid ""
+"Units of current projection are not supported,\n"
+" meters will be used!"
+msgstr ""
+"Unitățile proiecției curente nu sunt acceptate,\n"
+" va fi utilizat metrul!"
+
+#: ../gui/wxpython/psmap/dialogs.py:3430
+msgid "Unsupported units"
+msgstr "Unități neacceptate"
+
+#: ../gui/wxpython/psmap/dialogs.py:3475
+msgid "Length:"
+msgstr "Lungime:"
+
+#: ../gui/wxpython/psmap/dialogs.py:3479
+msgid "Scalebar length is given in map units"
+msgstr "Lungimea scării este dată în unități de hartă"
+
+#: ../gui/wxpython/psmap/dialogs.py:3482
+msgid "Scalebar height is real height on paper"
+msgstr "Înălțimea scării este înălțimea reală pe hârtie"
+
+#: ../gui/wxpython/psmap/dialogs.py:3484
+msgid "default"
+msgstr "implicit"
+
+#: ../gui/wxpython/psmap/dialogs.py:3523 ../gui/wxpython/wxplot/dialogs.py:625
+msgid "Style"
+msgstr "Stil"
+
+#: ../gui/wxpython/psmap/dialogs.py:3528
+msgid "Type:"
+msgstr "Tip:"
+
+#: ../gui/wxpython/psmap/dialogs.py:3544
+msgid "Number of segments:"
+msgstr "Număr de segmente:"
+
+#: ../gui/wxpython/psmap/dialogs.py:3548
+msgid "Label every "
+msgstr "Etichetați fiecare"
+
+#: ../gui/wxpython/psmap/dialogs.py:3549
+msgid "segments"
+msgstr "segmente"
+
+#: ../gui/wxpython/psmap/dialogs.py:3558
+msgid "transparent text background"
+msgstr "fundal transparent pentru text"
+
+#: ../gui/wxpython/psmap/dialogs.py:3635
+msgid "Length of scale bar is not defined"
+msgstr "Lungimea barei de scară nu este definit"
+
+#: ../gui/wxpython/psmap/dialogs.py:3738
+msgid "Text effects"
+msgstr "Effecte pentru text"
+
+#: ../gui/wxpython/psmap/dialogs.py:3743
+msgid "text background"
+msgstr "fundal pentru text"
+
+#: ../gui/wxpython/psmap/dialogs.py:3746
+msgid "highlight"
+msgstr "evidențiere"
+
+#: ../gui/wxpython/psmap/dialogs.py:3751
+msgid "text border"
+msgstr "marginea pentru text"
+
+#: ../gui/wxpython/psmap/dialogs.py:3828
+msgid "Offset"
+msgstr "Echilibru"
+
+#: ../gui/wxpython/psmap/dialogs.py:3831
+msgid "horizontal (pts):"
+msgstr "orizontal (pts):"
+
+#: ../gui/wxpython/psmap/dialogs.py:3832
+msgid "vertical (pts):"
+msgstr "vertical (pts):"
+
+#: ../gui/wxpython/psmap/dialogs.py:3845
+msgid " Reference point"
+msgstr "Punct de referință"
+
+#: ../gui/wxpython/psmap/dialogs.py:3871
+msgid "Text rotation"
+msgstr "Rotație text"
+
+#: ../gui/wxpython/psmap/dialogs.py:3874
+msgid "rotate text (counterclockwise)"
+msgstr "rotește textul (invers acelor de ceasornic)"
+
+#: ../gui/wxpython/psmap/dialogs.py:3950
+msgid "No text entered!"
+msgstr "Nici un text introdus!"
+
+#: ../gui/wxpython/psmap/dialogs.py:4118 ../gui/wxpython/nviz/tools.py:474
+msgid "Choose a directory:"
+msgstr "Alege un director:"
+
+#: ../gui/wxpython/psmap/dialogs.py:4119
+msgid "Choose a directory with images"
+msgstr "Alege un director cu imagini"
+
+#: ../gui/wxpython/psmap/dialogs.py:4151
+msgid "Note: only EPS format supported"
+msgstr "Notă: este acceptat doar format EPS"
+
+#: ../gui/wxpython/psmap/dialogs.py:4160
+msgid "Scale And Rotation"
+msgstr "Scară și rotație"
+
+#: ../gui/wxpython/psmap/dialogs.py:4191 ../gui/wxpython/psmap/dialogs.py:4653
+msgid "Rotation angle (deg):"
+msgstr "Unghiul de rotație (grade):"
+
+#: ../gui/wxpython/psmap/dialogs.py:4200 ../gui/wxpython/psmap/dialogs.py:4662
+msgid "Counterclockwise rotation in degrees"
+msgstr "Rotație inversă acelor de ceasornic, în grade"
+
+#: ../gui/wxpython/psmap/dialogs.py:4298
+msgid ""
+"PIL\n"
+"missing"
+msgstr ""
+"PIL\n"
+"lipsă"
+
+#: ../gui/wxpython/psmap/dialogs.py:4318
+#, python-format
+msgid "Unable to read file %s"
+msgstr "Nu s-a putut citi fișierul %s"
+
+#: ../gui/wxpython/psmap/dialogs.py:4377
+#, python-format
+msgid "size: %(width)s x %(height)s pts"
+msgstr "dimesiune: %(width)s x %(height)s pts"
+
+#: ../gui/wxpython/psmap/dialogs.py:4399
+msgid "No image selected."
+msgstr "Nici o imagine selectată."
+
+#: ../gui/wxpython/psmap/dialogs.py:4496
+msgid "North Arrow settings"
+msgstr "Setările săgeții Nord"
+
+#: ../gui/wxpython/psmap/dialogs.py:4507
+msgid "Compute convergence"
+msgstr "Calculează convergență"
+
+#: ../gui/wxpython/psmap/dialogs.py:4563
+msgid "Symbol"
+msgstr "Simbol"
+
+#: ../gui/wxpython/psmap/dialogs.py:4569
+msgid "Select symbol:"
+msgstr "Selectați simbol:"
+
+#: ../gui/wxpython/psmap/dialogs.py:4583
+msgid ""
+"Note: Selected symbol is not displayed\n"
+"in draft mode (only in preview mode)"
+msgstr ""
+"Notă: Simbolul selectat nu este afișat\n"
+"în modul draft (doar în modul de previzualizare)"
+
+#: ../gui/wxpython/psmap/dialogs.py:4596 ../gui/wxpython/psmap/dialogs.py:4851
+#: ../gui/wxpython/gmodeler/preferences.py:88
+#: ../gui/wxpython/gmodeler/preferences.py:326
+#: ../gui/wxpython/nviz/tools.py:785 ../gui/wxpython/nviz/tools.py:2270
+#: ../gui/wxpython/wxplot/dialogs.py:595
+msgid "Color"
+msgstr "Culoare"
+
+#: ../gui/wxpython/psmap/dialogs.py:4601 ../gui/wxpython/psmap/dialogs.py:4855
+msgid "Outline color:"
+msgstr "Culoarea conturului:"
+
+#: ../gui/wxpython/psmap/dialogs.py:4616 ../gui/wxpython/psmap/dialogs.py:4876
+msgid "Fill color:"
+msgstr "Culoarea de umplere:"
+
+#: ../gui/wxpython/psmap/dialogs.py:4639
+msgid "Size and Rotation"
+msgstr "Dimensiune și rotație"
+
+#: ../gui/wxpython/psmap/dialogs.py:4644
+msgid "Size (pt):"
+msgstr "Dimensiune (pt):"
+
+#: ../gui/wxpython/psmap/dialogs.py:4646
+msgid "Symbol size in points"
+msgstr "Dimensiunea simbolului în puncte"
+
+#: ../gui/wxpython/psmap/dialogs.py:4820
+msgid "Rectangle settings"
+msgstr "Setările dreptunghiului"
+
+#: ../gui/wxpython/psmap/dialogs.py:4822
+msgid "Line settings"
+msgstr "Setările liniei:"
+
+#: ../gui/wxpython/psmap/dialogs.py:4899 ../gui/wxpython/gcp/manager.py:2528
+msgid "Line width:"
+msgstr "Lățimea liniei:"
+
+#: ../gui/wxpython/psmap/dialogs.py:4908
+msgid "Line width in points"
+msgstr "Lățimea liniei în puncte"
+
+#: ../gui/wxpython/psmap/frame.py:51
+msgid "GRASS GIS Cartographic Composer (experimental prototype)"
+msgstr "Compoziție Cartografică GRASS GIS (prototip experimental)"
+
+#: ../gui/wxpython/psmap/frame.py:180
+msgid ""
+"Python Imaging Library is not available.\n"
+"'Preview' functionality won't work."
+msgstr ""
+"Biblioteca de imagini Python nu este disponibilă.\n"
+"Funcția de previzualizare nu funcționează."
+
+#: ../gui/wxpython/psmap/frame.py:232
+msgid "Program ps2pdf is not available. Please install it first to create PDF."
+msgstr "Programul ps2pdf nu este disponibil. Vă rugăm să-l instalați pentru a crea PDF."
+
+#: ../gui/wxpython/psmap/frame.py:276
+msgid "Generating PDF..."
+msgstr "Generare PDF..."
+
+#: ../gui/wxpython/psmap/frame.py:278
+msgid "Generating PostScript..."
+msgstr "Generare PostScrip..."
+
+#: ../gui/wxpython/psmap/frame.py:280
+msgid "Generating preview..."
+msgstr "Generare previzualizare..."
+
+#: ../gui/wxpython/psmap/frame.py:290
+#, python-format
+msgid "Ps.map exited with return code %s"
+msgstr "Comanda Ps.map a returnat codul de ieșire %s"
+
+#: ../gui/wxpython/psmap/frame.py:320
+#, fuzzy, python-format
+msgid "%(prg)s exited with return code %(code)s"
+msgstr "comanda %(prg)s a returnat codul de ieșire %(code)s"
+
+#: ../gui/wxpython/psmap/frame.py:323
+msgid "PDF generated"
+msgstr "PDF generat"
+
+#: ../gui/wxpython/psmap/frame.py:326
+#, python-format
+msgid ""
+"Program ps2pdf is not available. Please install it to create PDF.\n"
+"\n"
+" %s"
+msgstr ""
+"Programul ps2pdf nu este disponibil. Vă rugăm să-l instalați pentru a crea PGF.\n"
+"\n"
+"%s"
+
+#: ../gui/wxpython/psmap/frame.py:329
+msgid "PostScript file generated"
+msgstr "Fișier PostScript generat"
+
+#: ../gui/wxpython/psmap/frame.py:335
+msgid "Generating preview, wait please"
+msgstr "Generarea de previzualizare, vă rugăm să asteptați"
+
+#: ../gui/wxpython/psmap/frame.py:349
+msgid "Preview not available"
+msgstr "Previzualizarea nu este disponibilă"
+
+#: ../gui/wxpython/psmap/frame.py:350
+msgid "Preview is not available probably due to missing Ghostscript."
+msgstr "Previzualizarea nu este disponibilă probabil din cauza lipsei Ghostscript."
+
+#: ../gui/wxpython/psmap/frame.py:352
+msgid "Please follow instructions on GRASS Trac Wiki."
+msgstr "Vă rugăm să urmați instrucțiunile de pe GRASS Trac Wiki."
+
+#: ../gui/wxpython/psmap/frame.py:363
+msgid "Preview generated"
+msgstr "Previzualizare generată"
+
+#: ../gui/wxpython/psmap/frame.py:393
+msgid "Save file as"
+msgstr "Salvați fișierul ca"
+
+#: ../gui/wxpython/psmap/frame.py:431
+#, python-format
+msgid "Failed to read file %s."
+msgstr "Citirea fișierului a eșuat %s."
+
+#: ../gui/wxpython/psmap/frame.py:619
+msgid "Scalebar is not appropriate for this projection"
+msgstr "Scara nu este apropiată pentru această proiecție"
+
+#: ../gui/wxpython/psmap/frame.py:1028
+msgid "Press button with green triangle icon to generate preview."
+msgstr "Apăsați butonul cu imaginea triunghiului verde pentru a genera previzualizarea."
+
+#: ../gui/wxpython/psmap/frame.py:1055
+msgid "wxGUI Cartographic Composer"
+msgstr "wxGUI Compoziție Cartografică"
+
+#: ../gui/wxpython/psmap/frame.py:1057
+msgid ""
+"(C) 2011 by the GRASS Development Team\n"
+"\n"
+msgstr ""
+"(C) 2011 Echipa de Dezvoltare GRASS\n"
+"\n"
+
+#: ../gui/wxpython/psmap/frame.py:1058 ../gui/wxpython/gmodeler/frame.py:717
+msgid "This program is free software under the GNU General Public License(>=v2). Read the file COPYING that comes with GRASS for details."
+msgstr "Acest program este un software liber dezvoltat sub Licență Publică Generală GNU (>=v2). Citiți fișierul COPYING care vine o dată cu GRASS pentru detalii."
+
+#: ../gui/wxpython/psmap/frame.py:1367
+msgid "Click and drag to resize object"
+msgstr "Click și trage-ți pentru a redimensiona obiectul"
+
+#: ../gui/wxpython/psmap/utils.py:92
+msgid "inch"
+msgstr "inci"
+
+#: ../gui/wxpython/psmap/utils.py:93 ../gui/wxpython/modules/vclean.py:194
+msgid "point"
+msgstr "punct"
+
+#: ../gui/wxpython/psmap/utils.py:94
+msgid "centimeter"
+msgstr "centimetru"
+
+#: ../gui/wxpython/psmap/utils.py:95
+msgid "millimeter"
+msgstr "milimetru"
+
+#: ../gui/wxpython/psmap/utils.py:96
+msgid "meters"
+msgstr "metri"
+
+#: ../gui/wxpython/psmap/utils.py:97
+msgid "kilometers"
+msgstr "kilometri"
+
+#: ../gui/wxpython/psmap/utils.py:98
+msgid "feet"
+msgstr "picioare"
+
+#: ../gui/wxpython/psmap/utils.py:99
+msgid "miles"
+msgstr "mile"
+
+#: ../gui/wxpython/psmap/utils.py:100 ../gui/wxpython/psmap/utils.py:104
+msgid "nautical miles"
+msgstr "mile marine"
+
+#: ../gui/wxpython/psmap/utils.py:102
+msgid "pixel"
+msgstr "pixel"
+
+#: ../gui/wxpython/psmap/utils.py:103
+msgid "meter"
+msgstr "metru"
+
+#: ../gui/wxpython/psmap/utils.py:105
+msgid "degree"
+msgstr "grade"
+
+#: ../gui/wxpython/psmap/utils.py:345
+msgid "Unable to run `ps.map -b`"
+msgstr "Nu se poate rula `ps.map -b`"
+
+#: ../gui/wxpython/core/settings.py:447
+msgid "Segment break"
+msgstr "Segment întrerupt"
+
+#: ../gui/wxpython/core/settings.py:514
+msgid "animation"
+msgstr "animație"
+
+#: ../gui/wxpython/core/settings.py:695
+msgid "Collapse all except PERMANENT and current"
+msgstr "Reduce tot cu excepția PERMANENT și curent"
+
+#: ../gui/wxpython/core/settings.py:696
+msgid "Collapse all except PERMANENT"
+msgstr "Reduce tot cu excepția PERMANENT "
+
+#: ../gui/wxpython/core/settings.py:697
+msgid "Collapse all except current"
+msgstr "Reduce tot cu excepția curent"
+
+#: ../gui/wxpython/core/settings.py:698
+msgid "Collapse all"
+msgstr "Reduce tot"
+
+#: ../gui/wxpython/core/settings.py:699
+msgid "Expand all"
+msgstr "Extinde tot"
+
+#: ../gui/wxpython/core/settings.py:703
+msgid "Display selected"
+msgstr "Afișare selectată"
+
+#: ../gui/wxpython/core/settings.py:713
+msgid "Classic (labels only)"
+msgstr "Clasic (doar etichetele)"
+
+#: ../gui/wxpython/core/settings.py:714
+msgid "Combined (labels and module names)"
+msgstr "Combinate (etichetele și numele modulelor)"
+
+#: ../gui/wxpython/core/settings.py:715
+msgid "Professional (module names only)"
+msgstr "Profesional (doar numele modulelor)"
+
+#: ../gui/wxpython/core/settings.py:722
+msgid "Zoom and recenter"
+msgstr "Mărește și recentrează"
+
+#: ../gui/wxpython/core/settings.py:723
+msgid "Zoom to mouse cursor"
+msgstr "Mărește cu mouse-ul"
+
+#: ../gui/wxpython/core/settings.py:724
+msgid "Nothing"
+msgstr "Nimic"
+
+#: ../gui/wxpython/core/settings.py:725
+msgid "Scroll forward to zoom in"
+msgstr "Derulare înainte pentru a mări"
+
+#: ../gui/wxpython/core/settings.py:726
+msgid "Scroll back to zoom in"
+msgstr "Derulare inapoi pentru a mări"
+
+#: ../gui/wxpython/core/settings.py:759
+msgid "box"
+msgstr "cutie"
+
+#: ../gui/wxpython/core/settings.py:760
+msgid "sphere"
+msgstr "sferă"
+
+#: ../gui/wxpython/core/settings.py:761
+msgid "cube"
+msgstr "cub"
+
+#: ../gui/wxpython/core/settings.py:762
+msgid "diamond"
+msgstr "romb"
+
+#: ../gui/wxpython/core/settings.py:763
+msgid "aster"
+msgstr "aster"
+
+#: ../gui/wxpython/core/settings.py:764
+msgid "gyro"
+msgstr "gyro"
+
+#: ../gui/wxpython/core/settings.py:765
+msgid "histogram"
+msgstr "histrogramă"
+
+#: ../gui/wxpython/core/settings.py:802
+#, python-format
+msgid "Unable to read settings file <%s>\n"
+msgstr "Nu s-a putut citi fișierul <%s>\n"
+
+#: ../gui/wxpython/core/settings.py:826
+#, python-format
+msgid ""
+"Error: Reading settings from file <%(file)s> failed.\n"
+"\t\tDetails: %(detail)s\n"
+"\t\tLine: '%(line)s'\n"
+msgstr ""
+"Eroare: Citirea parametrilor din fișierul <%(file)s> a eșuat.\n"
+"\t\tDetalii: %(detail)s\n"
+"\t\tLinia: '%(line)s'\n"
+
+#: ../gui/wxpython/core/settings.py:845
+msgid "Unable to create settings directory"
+msgstr "Nu s-a putut crea directorul pentru setări"
+
+#: ../gui/wxpython/core/settings.py:881
+#, python-format
+msgid ""
+"Writing settings to file <%(file)s> failed.\n"
+"\n"
+"Details: %(detail)s"
+msgstr ""
+"Scrierea parametrilor în fișierul <%(file)s> a eșuat.\n"
+"\n"
+"Detalii: %(detail)s"
+
+#: ../gui/wxpython/core/settings.py:980
+msgid "Unable to set "
+msgstr "Nu s-a putut seta"
+
+#: ../gui/wxpython/core/settings.py:1006 ../gui/wxpython/core/settings.py:1012
+#, python-format
+msgid "Unable to parse settings '%s'"
+msgstr "Nu s-au putut analiza setările '%s'"
+
+#: ../gui/wxpython/core/menudata.py:84
+msgid "Unknow tag"
+msgstr "Tag necunoscut"
+
+#: ../gui/wxpython/core/gcmd.py:82
+#, python-format
+msgid "ERROR: %s\n"
+msgstr "EROARE: %s\n"
+
+#: ../gui/wxpython/core/gcmd.py:123
+msgid "Reason"
+msgstr "Motiv"
+
+#: ../gui/wxpython/core/gcmd.py:135 ../gui/wxpython/core/workspace.py:1017
+#: ../gui/wxpython/mapdisp/mapwindow.py:1653
+#: ../gui/wxpython/wxplot/dialogs.py:493
+msgid "Warning"
+msgstr "Atenție"
+
+#: ../gui/wxpython/core/gcmd.py:385
+msgid "Execution failed:"
+msgstr "Execuție eșuată:"
+
+#: ../gui/wxpython/core/gcmd.py:388 ../gui/wxpython/core/render.py:643
+#: ../gui/wxpython/core/render.py:646
+msgid "Details:"
+msgstr "Detalii:"
+
+#: ../gui/wxpython/core/gcmd.py:390 ../gui/wxpython/core/gcmd.py:394
+msgid "Error: "
+msgstr "Eroare:"
+
+#: ../gui/wxpython/core/gcmd.py:469
+#, python-format
+msgid "Unable to exectute command: '%s'"
+msgstr "Nu s-a putut executa comanda: '%s'"
+
+#: ../gui/wxpython/core/workspace.py:1000
+#, python-format
+msgid "Unable to open file <%s> for reading."
+msgstr "Nu s-a putut deschide fișierul <%s> pentru citire."
+
+#: ../gui/wxpython/core/workspace.py:1013
+#, python-format
+msgid ""
+"Some lines were skipped when reading settings from file <%(file)s>.\n"
+"See 'Command output' window for details.\n"
+"\n"
+"Number of skipped lines: %(line)d"
+msgstr ""
+"Unele linii au fost omise la citirea parametrilor din fișier<%(file)s>.\n"
+"Vedeți fereastra 'Comanda de ieșire' pentru detalii.\n"
+"\n"
+"Număr de linii omise: %(line)d"
+
+#: ../gui/wxpython/core/workspace.py:1231
+#, python-format
+msgid " row %d:"
+msgstr " rând %d:"
+
+#: ../gui/wxpython/core/render.py:125
+#, python-format
+msgid "<%(name)s>: layer type <%(type)s> is not supported"
+msgstr "<%(name)s>: tipul stratului <%(type)s> nu este acceptat"
+
+#: ../gui/wxpython/core/render.py:180
+#, python-format
+msgid "Command '%s' failed\n"
+msgstr "Comandă '%s' eșuată\n"
+
+#: ../gui/wxpython/core/render.py:182
+#, python-format
+msgid "Details: %s\n"
+msgstr "Detalii: %s\n"
+
+#: ../gui/wxpython/core/render.py:280
+#, python-format
+msgid "Unsupported map layer type '%s'"
+msgstr "Tipul stratutului neacceptat '%s'"
+
+#: ../gui/wxpython/core/render.py:421
+msgid "GISBASE not set. You must be in GRASS GIS to run this program."
+msgstr "GISBASE nu este setat. Trebuie să fiți în GRASS GIS pentru a rula acest program."
+
+#: ../gui/wxpython/core/render.py:466
+#, python-format
+msgid "Error: Unable to open '%(file)s'. Reason: %(ret)s. wxGUI exited.\n"
+msgstr "Eroare: Nu s-a putut deschide '%(file)s'. Motiv: %(ret)s. wxGUI închisă.\n"
+
+#: ../gui/wxpython/core/render.py:642
+#, python-format
+msgid "Unable to zoom to raster map <%s>."
+msgstr "Nu s-a putut da zoom la harta raster<%s>."
+
+#: ../gui/wxpython/core/render.py:645
+#, python-format
+msgid "Unable to zoom to vector map <%s>."
+msgstr "Nu s-a putut da zoom la harta vectorială<%s>."
+
+#: ../gui/wxpython/core/render.py:648
+msgid "Unable to get current geographic extent. Force quiting wxGUI. Please manually run g.region to fix the problem."
+msgstr "Nu s-a putut obține extinderea geografică curentă. Forțați închiderea wxGUI. Vă rugăm rulați manual g.region pentru a rezolva problema."
+
+#: ../gui/wxpython/core/render.py:931
+#, python-format
+msgid "ERROR: Rendering failed. Details: %s"
+msgstr "EROARE: Redarea a eșuat. Detalii: %s"
+
+#: ../gui/wxpython/core/render.py:980 ../gui/wxpython/core/render.py:1064
+#, python-format
+msgid "Unable to render map layer <%s>."
+msgstr "Nu s-a putut reda stratul <%s>."
+
+#: ../gui/wxpython/core/render.py:1173 ../gui/wxpython/core/render.py:1212
+#, python-format
+msgid "Unable to render overlay <%s>."
+msgstr "Nu s-a putut reda suprapunerea <%s>."
+
+#: ../gui/wxpython/core/utils.py:313 ../gui/wxpython/core/utils.py:354
+#, python-format
+msgid "Vector map <%(map)s>: %(msg)s\n"
+msgstr "Harta vectorială <%(map)s>: %(msg)s\n"
+
+#: ../gui/wxpython/core/utils.py:573
+#, python-format
+msgid "failed to open '%s'"
+msgstr "eșec în deschiderea '%s'"
+
+#: ../gui/wxpython/core/utils.py:808
+#, python-format
+msgid "ERROR: Unable to determine GRASS version. Details: %s"
+msgstr "EROARE: Nu s-a putut determina versiunea GRASS. Detalii: %s"
+
+#: ../gui/wxpython/core/utils.py:844
+#, python-format
+msgid "Unable to open file '%s'\n"
+msgstr "Nu s-a putut deschide fișierul '%s'\n"
+
+#: ../gui/wxpython/core/utils.py:852
+#, fuzzy, python-format
+msgid "%(env)s: line skipped - unable to parse Reason: %(e)s\n"
+msgstr "%(env)s: linii omise - nu s-a putut analiza Motivul: %(e)s\n"
+
+#: ../gui/wxpython/core/utils.py:858
+#, python-format
+msgid "Duplicated key: %s\n"
+msgstr "Cheie duplicată: %s\n"
+
+#: ../gui/wxpython/core/utils.py:873
+#, python-format
+msgid "Unable to create file '%s'\n"
+msgstr "Nu s-a putut crea fișierul'%s'\n"
+
+#: ../gui/wxpython/gmodeler/model.py:58
+msgid "model"
+msgstr "model"
+
+#: ../gui/wxpython/gmodeler/model.py:59
+msgid "Script generated by wxGUI Graphical Modeler."
+msgstr "Script generat de  wxGUI Modelare Grafică."
+
+#: ../gui/wxpython/gmodeler/model.py:388 ../gui/wxpython/gmodeler/model.py:450
+#, python-format
+msgid "undefined variable '%s'"
+msgstr "variabilă nedefinită '%s'"
+
+#: ../gui/wxpython/gmodeler/model.py:483
+msgid "Running model..."
+msgstr "Rularea modelului..."
+
+#: ../gui/wxpython/gmodeler/model.py:502
+msgid "Model is empty. Nothing to run."
+msgstr "Modelul este gol. Nimic nu este de rulat."
+
+#: ../gui/wxpython/gmodeler/model.py:511 ../gui/wxpython/gmodeler/frame.py:508
+msgid "Validating model..."
+msgstr "Validarea modelului..."
+
+#: ../gui/wxpython/gmodeler/model.py:517
+#, python-format
+msgid ""
+"Model is not valid. Do you want to run the model anyway?\n"
+"\n"
+"%s"
+msgstr ""
+"Modelul nu este valid. Mai doriți să rulați modelul?\n"
+"\n"
+"%s"
+
+#: ../gui/wxpython/gmodeler/model.py:519
+msgid "Run model?"
+msgstr "Rulați modelul?"
+
+#: ../gui/wxpython/gmodeler/model.py:554
+msgid "Variables below not defined:"
+msgstr "Variabilele de mai jos nu sunt definite:"
+
+#: ../gui/wxpython/gmodeler/model.py:662
+msgid "Raster maps"
+msgstr "Hărți raster"
+
+#: ../gui/wxpython/gmodeler/model.py:665
+msgid "3D raster maps"
+msgstr "hărți raster 3D"
+
+#: ../gui/wxpython/gmodeler/model.py:1242
+msgid "<not defined>"
+msgstr "<nedefinit>"
+
+#: ../gui/wxpython/gmodeler/model.py:1352
+msgid "Condition: "
+msgstr "Condiție:"
+
+#: ../gui/wxpython/gmodeler/model.py:1354
+msgid "Condition: not defined"
+msgstr "Condiție: nedefinită"
+
+#: ../gui/wxpython/gmodeler/model.py:1415
+msgid "loop"
+msgstr "buclă"
+
+#: ../gui/wxpython/gmodeler/model.py:1456
+msgid "if-else"
+msgstr "dacă-altfel"
+
+#: ../gui/wxpython/gmodeler/model.py:2150
+msgid "Model parameters"
+msgstr "Parametrii modelului"
+
+#: ../gui/wxpython/gmodeler/model.py:2167
+msgid "Delete intermediate data when finish"
+msgstr "Șterge datele intermediare când termină"
+
+#: ../gui/wxpython/gmodeler/model.py:2219
+#: ../gui/wxpython/gmodeler/frame.py:115
+msgid "Variables"
+msgstr "Variabile"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:47
+msgid "Data properties"
+msgstr "Proprietățile datelor"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:73
+msgid "Name of raster map:"
+msgstr "Numele hărții raster:"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:75
+msgid "Name of vector map:"
+msgstr "Numele hărții vectoriale:"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:78
+msgid "Name of element:"
+msgstr "Numele elementului:"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:118
+msgid "Add new GRASS module to the model"
+msgstr "Adaugă modul nou GRASS la model"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:205
+msgid ""
+"Command not defined.\n"
+"\n"
+"Unable to add new action to the model."
+msgstr ""
+"Comanda nu a fost definită.\n"
+"\n"
+"Nu se poate adăuga acțiune nouă la model."
+
+#: ../gui/wxpython/gmodeler/dialogs.py:211
+#, python-format
+msgid ""
+"'%s' is not a GRASS module.\n"
+"\n"
+"Unable to add new action to the model."
+msgstr ""
+"'%s' nu este un modul GRASS.\n"
+"\n"
+"Nu se poate adăuga acțiune nouă la model."
+
+#: ../gui/wxpython/gmodeler/dialogs.py:246
+msgid "Relation properties"
+msgstr "Proprietățile relației"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:263
+msgid "From"
+msgstr "De la"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:307
+#, python-format
+msgid "Data: %s"
+msgstr "Data: %s"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:313
+msgid "Command:"
+msgstr "Comandă:"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:319
+msgid "Option:"
+msgstr "Opțiune:"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:334
+msgid ""
+"Relation doesn't start with data item.\n"
+"Unable to add relation."
+msgstr ""
+"Relația nu începe cu elemente date.\n"
+"Nu s-a putut adăuga relație."
+
+#: ../gui/wxpython/gmodeler/dialogs.py:341
+msgid ""
+"Relation doesn't point to GRASS command.\n"
+"Unable to add relation."
+msgstr ""
+"Relația nu poate indica comanda GRASS.\n"
+"Nu s-a putut adăuga relație."
+
+#: ../gui/wxpython/gmodeler/dialogs.py:354
+msgid ""
+"No relevant option found.\n"
+"Unable to add relation."
+msgstr ""
+"Nici o opțiune relevantă găsită.\n"
+"Nu s-a putut adăuga relație."
+
+#: ../gui/wxpython/gmodeler/dialogs.py:385
+msgid "Condition"
+msgstr "Condiție"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:391
+#: ../gui/wxpython/gmodeler/dialogs.py:493
+#: ../gui/wxpython/gmodeler/frame.py:1459
+msgid "ID"
+msgstr "ID"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:410
+msgid "Loop properties"
+msgstr "Proprietățile buclei"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:416
+msgid "List of items in loop"
+msgstr "Lista elementelor din buclă"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:419
+msgid "Series"
+msgstr "Serii"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:420
+msgid "Define map series as condition for the loop"
+msgstr "Definește seriile hărții ca o condiție pentru buclă"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:464
+msgid "Define series of maps"
+msgstr "Definește serii ale hărților"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:479
+msgid "If-else properties"
+msgstr "Proprietăți if-else"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:485
+msgid "List of items in 'if' block"
+msgstr "Lista elementelor din blocul 'if' "
+
+#: ../gui/wxpython/gmodeler/dialogs.py:490
+msgid "List of items in 'else' block"
+msgstr "Lista elementelor din blocul 'else' "
+
+#: ../gui/wxpython/gmodeler/dialogs.py:654
+#, python-format
+msgid "Variable <%s> already exists in the model. Adding variable failed."
+msgstr "Variabila <%s> există deja în model. Adăugarea variabilei a eșuat."
+
+#: ../gui/wxpython/gmodeler/dialogs.py:683
+msgid "Do you want to delete all variables from the model?"
+msgstr "Doriți să ștergeți toate variabilele din model?"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:685
+msgid "Delete variables"
+msgstr "Șterge variabile"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:724
+#: ../gui/wxpython/gmodeler/dialogs.py:898
+#: ../gui/wxpython/vdigit/dialogs.py:272
+msgid "Delete selected"
+msgstr "Ștergere selectată"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:725
+#: ../gui/wxpython/gmodeler/dialogs.py:899
+#: ../gui/wxpython/vdigit/dialogs.py:276
+msgid "Delete all"
+msgstr "Șterge tot"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:848
+#, python-format
+msgid "Selected data records (%d) will permanently deleted from table. Do you want to delete them?"
+msgstr "Datele înregistrate selectate (%d) vor fi șterse definitv din tabel. Doriți să le ștergeți?"
+
+#: ../gui/wxpython/gmodeler/dialogs.py:905
+msgid "Normalize"
+msgstr "Normaliza"
+
+#: ../gui/wxpython/gmodeler/preferences.py:28
+#: ../gui/wxpython/menustrings.py:876
+msgid "Modeler settings"
+msgstr "Setări de modelare"
+
+#: ../gui/wxpython/gmodeler/preferences.py:50
+msgid "Item properties"
+msgstr "Proprietăți element"
+
+#: ../gui/wxpython/gmodeler/preferences.py:58
+msgid "Disabled:"
+msgstr "Dezactivat:"
+
+#: ../gui/wxpython/gmodeler/preferences.py:83
+msgid "Action"
+msgstr "Acțiune"
+
+#: ../gui/wxpython/gmodeler/preferences.py:96
+#: ../gui/wxpython/gmodeler/preferences.py:334
+msgid "Valid:"
+msgstr "Valid:"
+
+#: ../gui/wxpython/gmodeler/preferences.py:113
+msgid "Invalid:"
+msgstr "Invalid:"
+
+#: ../gui/wxpython/gmodeler/preferences.py:130
+msgid "Running:"
+msgstr "Execuție:"
+
+#: ../gui/wxpython/gmodeler/preferences.py:150
+#: ../gui/wxpython/gmodeler/preferences.py:269
+#: ../gui/wxpython/gmodeler/preferences.py:354
+msgid "Shape size"
+msgstr "Dimensiunea formei"
+
+#: ../gui/wxpython/gmodeler/preferences.py:202
+#: ../gui/wxpython/nviz/tools.py:87
+msgid "Data"
+msgstr "Data"
+
+#: ../gui/wxpython/gmodeler/preferences.py:215
+msgid "Raster:"
+msgstr "Raster:"
+
+#: ../gui/wxpython/gmodeler/preferences.py:232
+msgid "3D raster:"
+msgstr "3D raster:"
+
+#: ../gui/wxpython/gmodeler/preferences.py:249
+msgid "Vector:"
+msgstr "Vector:"
+
+#: ../gui/wxpython/gmodeler/preferences.py:321
+msgid "Loop"
+msgstr "Buclă"
+
+#: ../gui/wxpython/gmodeler/preferences.py:421
+#: ../gui/wxpython/menustrings.py:890
+msgid "Model properties"
+msgstr "Proprietățile modelului"
+
+#: ../gui/wxpython/gmodeler/preferences.py:428
+#: ../gui/wxpython/lmgr/layertree.py:430 ../gui/wxpython/lmgr/layertree.py:463
+msgid "Metadata"
+msgstr "Metadata"
+
+#: ../gui/wxpython/gmodeler/preferences.py:430
+msgid "Commands"
+msgstr "Comenzi"
+
+#: ../gui/wxpython/gmodeler/preferences.py:450
+msgid "Apply properties"
+msgstr "Aplică proprietăți"
+
+#: ../gui/wxpython/gmodeler/preferences.py:473
+msgid "Description:"
+msgstr "Descriere:"
+
+#: ../gui/wxpython/gmodeler/preferences.py:482
+msgid "Author(s):"
+msgstr "Autori:"
+
+#: ../gui/wxpython/gmodeler/frame.py:61
+msgid "GRASS GIS Graphical Modeler (experimental prototype)"
+msgstr "Modelare Grafică GRASS GIS (prototip experimental)"
+
+#: ../gui/wxpython/gmodeler/frame.py:113
+msgid "Model"
+msgstr "Model"
+
+#: ../gui/wxpython/gmodeler/frame.py:114
+msgid "Items"
+msgstr "Elemente:"
+
+#: ../gui/wxpython/gmodeler/frame.py:116
+msgid "Python editor"
+msgstr "Editor Python"
+
+#: ../gui/wxpython/gmodeler/frame.py:188
+#: ../gui/wxpython/gmodeler/frame.py:1643
+msgid "Python script is up-to-date"
+msgstr "Scriptul Python este actualizat"
+
+#: ../gui/wxpython/gmodeler/frame.py:203
+msgid "Redrawing model..."
+msgstr "Redesenarea modelului..."
+
+#: ../gui/wxpython/gmodeler/frame.py:238
+msgid "Do you want to save changes in the model?"
+msgstr "Doriți să salvați modificările din model?"
+
+#: ../gui/wxpython/gmodeler/frame.py:240
+msgid "Do you want to store current model settings to model file?"
+msgstr "Doriți să stocați setările modelului curent ca fișier model?"
+
+#: ../gui/wxpython/gmodeler/frame.py:246
+msgid "Quit Graphical Modeler"
+msgstr "Închide Modelare Grafică"
+
+#: ../gui/wxpython/gmodeler/frame.py:307
+msgid "No intermediate data to delete."
+msgstr "Nici o data intermediară pentru ștergere."
+
+#: ../gui/wxpython/gmodeler/frame.py:311
+#, python-format
+msgid "Do you want to permanently delete data?%s"
+msgstr "Doriți să ștergeți definitiv data?%s"
+
+#: ../gui/wxpython/gmodeler/frame.py:312
+msgid "Delete intermediate data?"
+msgstr "Ștergeți data intermediară?"
+
+#: ../gui/wxpython/gmodeler/frame.py:326
+#, python-format
+msgid "%d maps deleted from current mapset"
+msgstr "%d hărți șterse din mapset-ul curent"
+
+#: ../gui/wxpython/gmodeler/frame.py:341 ../gui/wxpython/gmodeler/frame.py:456
+msgid "Current model is not empty. Do you want to store current settings to model file?"
+msgstr "Modelul curent este gol. Doriți să stocați setările curente ca fișier model?"
+
+#: ../gui/wxpython/gmodeler/frame.py:344 ../gui/wxpython/gmodeler/frame.py:459
+msgid "Create new model?"
+msgstr "Creați model nou?"
+
+#: ../gui/wxpython/gmodeler/frame.py:371
+msgid "Choose model file"
+msgstr "Alegeți fișierul model"
+
+#: ../gui/wxpython/gmodeler/frame.py:373 ../gui/wxpython/gmodeler/frame.py:417
+#: ../gui/wxpython/lmgr/frame.py:413
+msgid "GRASS Model File (*.gxm)|*.gxm"
+msgstr "Fișier Model GRASS (*.gxm)|*.gxm"
+
+#: ../gui/wxpython/gmodeler/frame.py:389
+#, python-format
+msgid "%(items)d items (%(actions)d actions) loaded into model"
+msgstr "%(items)d elemente (%(actions)d actions) încărcate in model"
+
+#: ../gui/wxpython/gmodeler/frame.py:396 ../gui/wxpython/gmodeler/frame.py:433
+#, python-format
+msgid "Model file <%s> already exists. Do you want to overwrite this file?"
+msgstr "Fișierul model <%s> există deja. Doriți să suprascrieți fișierul?"
+
+#: ../gui/wxpython/gmodeler/frame.py:399 ../gui/wxpython/menustrings.py:863
+msgid "Save model"
+msgstr "Salvează model"
+
+#: ../gui/wxpython/gmodeler/frame.py:406 ../gui/wxpython/gmodeler/frame.py:446
+#, python-format
+msgid "File <%s> saved"
+msgstr "Fișier <%s> salvat"
+
+#: ../gui/wxpython/gmodeler/frame.py:415
+msgid "Choose file to save current model"
+msgstr "Alege fișierul pentru a salca modelul curent"
+
+#: ../gui/wxpython/gmodeler/frame.py:435
+msgid "File already exists"
+msgstr "Fișierul există deja"
+
+#: ../gui/wxpython/gmodeler/frame.py:504
+msgid "Model is empty. Nothing to validate."
+msgstr "Modelul este gol. Nimic nu este validat."
+
+#: ../gui/wxpython/gmodeler/frame.py:514
+#, python-format
+msgid ""
+"Model is not valid.\n"
+"\n"
+"%s"
+msgstr ""
+"Modelul nu este valid.\n"
+"\n"
+"%s"
+
+#: ../gui/wxpython/gmodeler/frame.py:517
+msgid "Model is valid."
+msgstr "Modelul este valid."
+
+#: ../gui/wxpython/gmodeler/frame.py:550
+#: ../gui/wxpython/modules/histogram.py:414
+#: ../gui/wxpython/mapdisp/frame.py:576 ../gui/wxpython/gcp/mapdisplay.py:456
+msgid "Choose a file name to save the image (no need to add extension)"
+msgstr "Alege un nume de fișier pentru a salva imaginea (nu este nevoie de adăugarea unui extensii)"
+
+#: ../gui/wxpython/gmodeler/frame.py:578 ../gui/wxpython/gmodeler/frame.py:585
+#, python-format
+msgid "Model exported to <%s>"
+msgstr "Model exportat ca <%s>"
+
+#: ../gui/wxpython/gmodeler/frame.py:713
+msgid "wxGUI Graphical Modeler"
+msgstr "wxGUI Modelare Grafică"
+
+#: ../gui/wxpython/gmodeler/frame.py:716
+#, python-format
+msgid ""
+"(C) 2010-%s by the GRASS Development Team\n"
+"\n"
+msgstr ""
+"(C) 2010-%s Echipa de Dezvoltare GRASS\n"
+"\n"
+
+#: ../gui/wxpython/gmodeler/frame.py:815
+#, python-format
+msgid ""
+"Reading model file <%s> failed.\n"
+"Invalid file, unable to parse XML document."
+msgstr ""
+"Citirea fișierului model <%s> a eșuat.\n"
+"Fișier nevalid, nu s-a putut analiza documentul XML."
+
+#: ../gui/wxpython/gmodeler/frame.py:821
+msgid "Please wait, loading model..."
+msgstr "Vă rugăm să așteptați, încărcare model..."
+
+#: ../gui/wxpython/gmodeler/frame.py:881
+msgid "Writing current settings to model file failed."
+msgstr "Scrierea setărilor curente pentru fișierul model a eșuat."
+
+#: ../gui/wxpython/gmodeler/frame.py:891 ../gui/wxpython/lmgr/frame.py:1118
+#, python-format
+msgid "Unable to open file <%s> for writing."
+msgstr "Nu s-a putut deschide fișierul <%s> pentru scriere."
+
+#: ../gui/wxpython/gmodeler/frame.py:1196
+#: ../gui/wxpython/lmgr/layertree.py:336
+msgid "Remove"
+msgstr "Elimină"
+
+#: ../gui/wxpython/gmodeler/frame.py:1200
+msgid "Disable"
+msgstr "Dezactivează"
+
+#: ../gui/wxpython/gmodeler/frame.py:1203
+msgid "Enable"
+msgstr "Activează"
+
+#: ../gui/wxpython/gmodeler/frame.py:1208
+msgid "Add control point"
+msgstr "Adaugă punct de control"
+
+#: ../gui/wxpython/gmodeler/frame.py:1210
+msgid "Remove control point"
+msgstr "Elimină punctul de control"
+
+#: ../gui/wxpython/gmodeler/frame.py:1217
+msgid "Intermediate"
+msgstr "Intermediar"
+
+#: ../gui/wxpython/gmodeler/frame.py:1228
+#: ../gui/wxpython/lmgr/layertree.py:350
+msgid "Properties"
+msgstr "Proprietăți"
+
+#: ../gui/wxpython/gmodeler/frame.py:1311
+msgid "List of variables - right-click to delete"
+msgstr "Lista variabilelor - click dreapta pentru a șterge"
+
+#: ../gui/wxpython/gmodeler/frame.py:1315
+#: ../gui/wxpython/gmodeler/frame.py:1370
+msgid "Default value"
+msgstr "Valoare implicită"
+
+#: ../gui/wxpython/gmodeler/frame.py:1319
+msgid "Add new variable"
+msgstr "Adaugă variabilă nouă"
+
+#: ../gui/wxpython/gmodeler/frame.py:1323
+msgid "integer"
+msgstr "întreg"
+
+#: ../gui/wxpython/gmodeler/frame.py:1324
+msgid "float"
+msgstr "real"
+
+#: ../gui/wxpython/gmodeler/frame.py:1325
+msgid "string"
+msgstr "șir de caractere"
+
+#: ../gui/wxpython/gmodeler/frame.py:1328
+msgid "mapset"
+msgstr "mapset"
+
+#: ../gui/wxpython/gmodeler/frame.py:1329
+msgid "file"
+msgstr "fișier"
+
+#: ../gui/wxpython/gmodeler/frame.py:1336
+msgid "Add new variable to the model"
+msgstr "Adaugă variabilă nouă la model"
+
+#: ../gui/wxpython/gmodeler/frame.py:1456
+msgid "List of items - right-click to delete"
+msgstr "Lista elementelor - click dreapta pentru a șterge"
+
+#: ../gui/wxpython/gmodeler/frame.py:1459
+msgid "In block"
+msgstr "ÃŽn bloc"
+
+#: ../gui/wxpython/gmodeler/frame.py:1460
+msgid "Command / Condition"
+msgstr "Comandă / Condiție"
+
+#: ../gui/wxpython/gmodeler/frame.py:1493
+msgid "Python script"
+msgstr "Script Python"
+
+#: ../gui/wxpython/gmodeler/frame.py:1497
+msgid "Run python script"
+msgstr "Rulează script python"
+
+#: ../gui/wxpython/gmodeler/frame.py:1500
+msgid "Save python script to file"
+msgstr "Salvează scriptul python ca fișier"
+
+#: ../gui/wxpython/gmodeler/frame.py:1503
+msgid ""
+"Refresh python script based on the model.\n"
+"It will discards all local changes."
+msgstr ""
+"Reîncarcă script python bazat pe model.\n"
+"Acest lucru va înlătura modificările locale."
+
+#: ../gui/wxpython/gmodeler/frame.py:1541
+#, python-format
+msgid "Unable to launch Python script. %s"
+msgstr "Nu s-a putut lansa scriptul Python. %s"
+
+#: ../gui/wxpython/gmodeler/frame.py:1566
+msgid "Choose file to save"
+msgstr "Alege fișier pentru salvare"
+
+#: ../gui/wxpython/gmodeler/frame.py:1568
+msgid "Python script (*.py)|*.py"
+msgstr "Script Python (*.py)|*.py"
+
+#: ../gui/wxpython/gmodeler/frame.py:1582
+#: ../gui/wxpython/wxplot/profile.py:343
+#, python-format
+msgid "File <%s> already exists. Do you want to overwrite this file?"
+msgstr "Fișierul <%s> există deja. Doriți să suprascrieți fișierul?"
+
+#: ../gui/wxpython/gmodeler/frame.py:1584
+msgid "Save file"
+msgstr "Salvează fișier"
+
+#: ../gui/wxpython/gmodeler/frame.py:1619
+msgid "Python script is locally modificated. Refresh will discard all changes. Do you really want to continue?"
+msgstr "Scriptul Python a fost modificat local. Reîncărcarea va înlătura toate modificările. Doriți să continuați acest lucru?"
+
+#: ../gui/wxpython/gmodeler/frame.py:1622
+msgid "Update"
+msgstr "Actualizare"
+
+#: ../gui/wxpython/menustrings.py:2 ../gui/wxpython/menustrings.py:857
+msgid "&File"
+msgstr "&Fișier"
+
+#: ../gui/wxpython/menustrings.py:3
+msgid "Workspace"
+msgstr "Spațiu de lucru"
+
+#: ../gui/wxpython/menustrings.py:4 ../gui/wxpython/menustrings.py:858
+#: ../gui/wxpython/nviz/tools.py:1090
+msgid "New"
+msgstr "Nou"
+
+#: ../gui/wxpython/menustrings.py:5
+msgid "Create new workspace"
+msgstr "Crează spațiu de lucru nou"
+
+#: ../gui/wxpython/menustrings.py:6 ../gui/wxpython/menustrings.py:860
+msgid "Open"
+msgstr "Deschide"
+
+#: ../gui/wxpython/menustrings.py:7
+msgid "Load workspace from file"
+msgstr "Încarcă spațiu de lucru din fișierul"
+
+#: ../gui/wxpython/menustrings.py:8 ../gui/wxpython/menustrings.py:862
+#: ../gui/wxpython/modules/colorrules.py:406
+msgid "Save"
+msgstr "Salvează"
+
+#: ../gui/wxpython/menustrings.py:9 ../gui/wxpython/lmgr/frame.py:1069
+#: ../gui/wxpython/lmgr/frame.py:1086
+msgid "Save workspace"
+msgstr "Salvează spațiu de lucru"
+
+#: ../gui/wxpython/menustrings.py:10 ../gui/wxpython/menustrings.py:864
+msgid "Save as"
+msgstr "Salvează ca "
+
+#: ../gui/wxpython/menustrings.py:11
+msgid "Save workspace to file"
+msgstr "Salvează spațiu de lucru în fișierul"
+
+#: ../gui/wxpython/menustrings.py:12 ../gui/wxpython/menustrings.py:866
+msgid "Close"
+msgstr "ÃŽnchide"
+
+#: ../gui/wxpython/menustrings.py:13
+msgid "Close workspace file"
+msgstr "Închide fișierul spațiului de lucru"
+
+#: ../gui/wxpython/menustrings.py:14
+msgid "Load GRC file (Tcl/Tk GUI)"
+msgstr "Încarcă fișier GRC (Tcl/Tk GUI)"
+
+#: ../gui/wxpython/menustrings.py:15
+msgid "Load map layers from GRC file to layer tree"
+msgstr "Încarcă layere din fișierul GRC în arborele de straturi"
+
+#: ../gui/wxpython/menustrings.py:16
+msgid "Map display"
+msgstr "Afișare hartă"
+
+#: ../gui/wxpython/menustrings.py:17
+msgid "Add raster"
+msgstr "Adaugă raster"
+
+#: ../gui/wxpython/menustrings.py:18
+msgid "Add raster map layer to current display"
+msgstr "Adaugă strat raster la afișarea actuală"
+
+#: ../gui/wxpython/menustrings.py:19
+msgid "Add vector"
+msgstr "Adaugă vector"
+
+#: ../gui/wxpython/menustrings.py:20
+msgid "Add vector map layer to current display"
+msgstr "Adaugă strat vectorial la afișarea actuală"
+
+#: ../gui/wxpython/menustrings.py:21
+msgid "Add multiple rasters or vectors"
+msgstr "Adaugă multiplu raster sau vectori"
+
+#: ../gui/wxpython/menustrings.py:22
+msgid "Add multiple raster or vector map layers to current display"
+msgstr "Adaugă multiplu raster sau vectori la afișarea actuală"
+
+#: ../gui/wxpython/menustrings.py:23
+msgid "New map display window"
+msgstr "Fereastră de vizualizare nouă"
+
+#: ../gui/wxpython/menustrings.py:24
+msgid "Open new map display window"
+msgstr "Deschide fereastră de vizualizare nouă"
+
+#: ../gui/wxpython/menustrings.py:25 ../gui/wxpython/menustrings.py:26
+msgid "Close current map display window"
+msgstr "Închide fereastra de vizualizare curentă"
+
+#: ../gui/wxpython/menustrings.py:27 ../gui/wxpython/menustrings.py:28
+msgid "Close all open map display windows"
+msgstr "ÃŽnchide toate ferestrele de vizualizare deschise"
+
+#: ../gui/wxpython/menustrings.py:30
+msgid "Common formats import"
+msgstr "Importă formate comune"
+
+#: ../gui/wxpython/menustrings.py:31
+msgid "Import raster data into a GRASS map layer using GDAL."
+msgstr "Importă date raster în GRASS folosing GDAL."
+
+#: ../gui/wxpython/menustrings.py:32
+msgid "ASCII x,y,z point import and gridding"
+msgstr "Importă puncte ASCII x,y,z și gridează"
+
+#: ../gui/wxpython/menustrings.py:33
+msgid "Create a raster map from an assemblage of many coordinates using univariate statistics."
+msgstr "Crează hartă raster dintr-un ansamblu de coordonate folosind statistici univariate."
+
+#: ../gui/wxpython/menustrings.py:34
+msgid "ASCII grid import"
+msgstr "Importă grid ASCII"
+
+#: ../gui/wxpython/menustrings.py:35
+msgid "Converts ASCII raster file to binary raster map layer."
+msgstr "Convertește fișier raster ASCII în strat raster binar."
+
+#: ../gui/wxpython/menustrings.py:36
+msgid "ASCII polygons and lines import"
+msgstr "Importă linii și poligoane ASCII"
+
+#: ../gui/wxpython/menustrings.py:37
+msgid "Creates raster maps from ASCII polygon/line/point data files."
+msgstr "Crează hărți raster din date de tip punct/linie/poligon ASCII"
+
+#: ../gui/wxpython/menustrings.py:38
+msgid "Binary file import"
+msgstr "Importă fișier binar"
+
+#: ../gui/wxpython/menustrings.py:39
+msgid "Import a binary raster file into a GRASS raster map."
+msgstr "Importă fișier raster binar într-o hartă raster GRASS."
+
+#: ../gui/wxpython/menustrings.py:40
+msgid "ESRI ASCII grid import"
+msgstr "Importă grid ESRI ASCII"
+
+#: ../gui/wxpython/menustrings.py:41
+msgid "Converts an ESRI ARC/INFO ascii raster file (GRID) into a (binary) raster map layer."
+msgstr "Convertește un fișier raster ascii ESRI ARC/INFO (GRID) într-un strat raster (binar)."
+
+#: ../gui/wxpython/menustrings.py:42
+msgid "GRIDATB.FOR import"
+msgstr "Importă GRIDATB.FOR"
+
+#: ../gui/wxpython/menustrings.py:43
+msgid "Imports GRIDATB.FOR map file (TOPMODEL) into GRASS raster map"
+msgstr "Importă fișier GRIDATB.FOR (TOPMODEL) într-o hartă raster GRASS"
+
+#: ../gui/wxpython/menustrings.py:44
+msgid "Matlab 2D array import"
+msgstr "Importă șir 2D Matlab"
+
+#: ../gui/wxpython/menustrings.py:45
+msgid "Imports a binary MAT-File(v4) to a GRASS raster."
+msgstr "Importă un fișier binar MAT-File(v4) la un raster GRASS."
+
+#: ../gui/wxpython/menustrings.py:46
+msgid "SPOT NDVI import"
+msgstr "Importă SPOT NDVI"
+
+#: ../gui/wxpython/menustrings.py:47
+msgid "Import of SPOT VGT NDVI file into a raster map"
+msgstr "Importă un fișier SPOT VGT NDVI într-o hartă raster"
+
+#: ../gui/wxpython/menustrings.py:48
+msgid "SRTM HGT import"
+msgstr "Importă SRTM HGT"
+
+#: ../gui/wxpython/menustrings.py:49
+msgid "Import SRTM HGT files into GRASS"
+msgstr "Importă fișiere SRTM HGT în GRASS"
+
+#: ../gui/wxpython/menustrings.py:50
+msgid "Terra ASTER HDF import"
+msgstr "Importă Terra ASTER HDF"
+
+#: ../gui/wxpython/menustrings.py:51
+msgid "Georeference, rectify and import Terra-ASTER imagery and relative DEM's using gdalwarp."
+msgstr "Georeferențiază, rectifică și importă imaginii Terra-ASTER și DEM folosind gdalwarp."
+
+#: ../gui/wxpython/menustrings.py:52
+msgid "WMS import"
+msgstr "Importă WMS"
+
+#: ../gui/wxpython/menustrings.py:53
+msgid "Downloads and imports data from WMS servers"
+msgstr "Descarcă și importă date prin servicii WMS"
+
+#: ../gui/wxpython/menustrings.py:54
+msgid "Unpack raster map"
+msgstr "Despachetează hartă raster"
+
+#: ../gui/wxpython/menustrings.py:55
+msgid "Unpacks a raster map packed with r.pack."
+msgstr "Despachetează o hartă raster, care a fost împachetatp cu r.pack."
+
+#: ../gui/wxpython/menustrings.py:57
+msgid "Common import formats"
+msgstr "Importă formate comune"
+
+#: ../gui/wxpython/menustrings.py:58
+msgid "Converts vector layers into a GRASS vector map using OGR."
+msgstr "Convertește straturi vectoriale în hartă vectorială GRASS folosind OGR."
+
+#: ../gui/wxpython/menustrings.py:59
+msgid "ASCII points/GRASS ASCII vector import"
+msgstr "Importă puncte ASCII/vectori GRASS ASCII"
+
+#: ../gui/wxpython/menustrings.py:60
+msgid "Creates a vector map from ASCII points file or ASCII vector file."
+msgstr "Crează o hartă vectorială din puncte ASCII sau fișier vectorial ASCII."
+
+#: ../gui/wxpython/menustrings.py:61
+msgid "ASCII points as a vector lines"
+msgstr "Puncte ASCII ca linii vectoriale"
+
+#: ../gui/wxpython/menustrings.py:62
+msgid "Import ASCII x,y[,z] coordinates as a series of lines."
+msgstr "Importă coordonate ASCII x,y[,z] ca serii de linii."
+
+#: ../gui/wxpython/menustrings.py:63
+msgid "Historical GRASS vector import"
+msgstr "Importă vector realizat într-o versiune mai veche de GRASS"
+
+#: ../gui/wxpython/menustrings.py:64
+msgid "Imports older versions of GRASS vector maps."
+msgstr "Importă hărți vectoriale realizate în versiuni mai vechi de GRASS."
+
+#: ../gui/wxpython/menustrings.py:65
+msgid "Historical GRASS vector import (all maps)"
+msgstr "Importă vector realizat într-o versiune mai veche de GRASS (toate hărțile)"
+
+#: ../gui/wxpython/menustrings.py:66
+msgid "Converts all older versions of GRASS vector maps in current mapset to current format."
+msgstr "Convertește toate hărțile vectoriale din versiunile vechi de GRASS din mapset-ul curent în formatul actual."
+
+#: ../gui/wxpython/menustrings.py:67
+msgid "DXF import"
+msgstr "Importă DXF"
+
+#: ../gui/wxpython/menustrings.py:68
+msgid "Converts files in DXF format to GRASS vector map format."
+msgstr "Convertește fișierele din format DXF în format hartă vectorială GRASS."
+
+#: ../gui/wxpython/menustrings.py:69
+msgid "WFS"
+msgstr "WFS"
+
+#: ../gui/wxpython/menustrings.py:70
+msgid "Import GetFeature from WFS"
+msgstr "Importă GetFeature prin WFS"
+
+#: ../gui/wxpython/menustrings.py:71
+msgid "ESRI e00 import"
+msgstr "Importă ESRI e00"
+
+#: ../gui/wxpython/menustrings.py:72
+msgid "Import E00 file into a vector map."
+msgstr "Importă fișier E00 într-o hartă vectorială."
+
+#: ../gui/wxpython/menustrings.py:73
+msgid "Garmin GPS import"
+msgstr "Importă de pe Garmin GPS"
+
+#: ../gui/wxpython/menustrings.py:74
+msgid "Download waypoints, routes, and tracks from a Garmin GPS receiver into a vector map."
+msgstr "Descarcă punctele de referință, rutele și traseele dintr-un dispozitiv GarminGPS intr-o hartă vectorială."
+
+#: ../gui/wxpython/menustrings.py:75
+msgid "GPSBabel GPS import"
+msgstr "Importă GPSBabel GPS"
+
+#: ../gui/wxpython/menustrings.py:76
+msgid "Import waypoints, routes, and tracks from a GPS receiver or GPS download file into a vector map."
+msgstr "Importă punctele de referință, rutele și traseele dintr-un dispozitiv GPS sau descarcă fișierul GPS intr-o hartă vectorială."
+
+#: ../gui/wxpython/menustrings.py:77
+msgid "Geonames import"
+msgstr "Importă Geonames"
+
+#: ../gui/wxpython/menustrings.py:78
+msgid "Imports geonames.org country files into a GRASS vector points map."
+msgstr "Importă fișierele de țară geonames.org într-o hartă vectorială punctuală GRASS."
+
+#: ../gui/wxpython/menustrings.py:79
+msgid "GEOnet import"
+msgstr "Importă GEOnet"
+
+#: ../gui/wxpython/menustrings.py:80
+msgid "Imports US-NGA GEOnet Names Server (GNS) country files into a GRASS vector points map."
+msgstr "Importă fișiere de țară US-NGA GEOnet Names Server (GNS) într-o hartă vectorială punctuală GRASS."
+
+#: ../gui/wxpython/menustrings.py:81
+msgid "Matlab array or Mapgen format import"
+msgstr "Importă șir Matlab sau format Mapgen"
+
+#: ../gui/wxpython/menustrings.py:82
+msgid "Imports Mapgen or Matlab-ASCII vector maps into GRASS."
+msgstr "Importă hartă vectorială Mapgen sau Matlab-ASCII în GRASS."
+
+#: ../gui/wxpython/menustrings.py:83
+msgid "Import 3D raster data"
+msgstr "Importă date raster 3D"
+
+#: ../gui/wxpython/menustrings.py:84
+msgid "ASCII 3D import"
+msgstr "Importă ASCII 3D"
+
+#: ../gui/wxpython/menustrings.py:85
+msgid "Converts a 3D ASCII raster text file into a (binary) 3D raster map layer."
+msgstr "Convertește fișier text raster 3D ASCII într-o hartă raster 3D."
+
+#: ../gui/wxpython/menustrings.py:86
+msgid "Vis5D import"
+msgstr "Importă Vis5D"
+
+#: ../gui/wxpython/menustrings.py:87
+msgid "Imports 3-dimensional Vis5D files (i.e. the V5D file with 1 variable and 1 time step)."
+msgstr "Importă fișier 3D Vis5D (ex. fișier V5D cu o variabilă și cel mai scurt timp)"
+
+#: ../gui/wxpython/menustrings.py:88
+msgid "Import database table"
+msgstr "Importă tabela bazei de date"
+
+#: ../gui/wxpython/menustrings.py:89
+msgid "Multiple import formats using OGR"
+msgstr "Importă formate multiple folosind OGR"
+
+#: ../gui/wxpython/menustrings.py:90
+msgid "Imports attribute tables in various formats."
+msgstr "Importă tabele de atribute în formate diferite."
+
+#: ../gui/wxpython/menustrings.py:91
+msgid "Export raster map"
+msgstr "Exportă harta raster"
+
+#: ../gui/wxpython/menustrings.py:92 ../gui/wxpython/menustrings.py:125
+msgid "Common export formats"
+msgstr "Exportă formate comune"
+
+#: ../gui/wxpython/menustrings.py:93
+msgid "Exports GRASS raster maps into GDAL supported formats."
+msgstr "Exportă hartă raster GRASS în formate acceptate."
+
+#: ../gui/wxpython/menustrings.py:94
+msgid "ASCII grid export"
+msgstr "Exportă grid ASCII"
+
+#: ../gui/wxpython/menustrings.py:95
+msgid "Converts a raster map layer into an ASCII text file."
+msgstr "Convertește hartă raster într-un fișier text ASCII."
+
+#: ../gui/wxpython/menustrings.py:96
+msgid "ASCII x,y,z points export"
+msgstr "Exportă puncte ASCII x,y,z"
+
+#: ../gui/wxpython/menustrings.py:97
+msgid "Export a raster map to a text file as x,y,z values based on cell centers."
+msgstr "Exportă hartă raster în fișier text ca valori x,y,z bazate doar pe centrul celulelor."
+
+#: ../gui/wxpython/menustrings.py:98
+msgid "ESRI ASCII grid export"
+msgstr "Exportă grid ESRI ASCII"
+
+#: ../gui/wxpython/menustrings.py:99
+msgid "Converts a raster map layer into an ESRI ARCGRID file."
+msgstr "Convertește hartă raster într-un fișier ESRI ARCGRID."
+
+#: ../gui/wxpython/menustrings.py:100
+msgid "GRIDATB.FOR export"
+msgstr "Exportă GRIDATB.FOR "
+
+#: ../gui/wxpython/menustrings.py:101
+msgid "Exports GRASS raster map to GRIDATB.FOR map file (TOPMODEL)"
+msgstr "Exportă hartă raster GRASS în fișier GRIDATB.FOR (TOPMODEL)"
+
+#: ../gui/wxpython/menustrings.py:102
+msgid "Matlab 2D array export"
+msgstr "Exportă șir 2D Matlab"
+
+#: ../gui/wxpython/menustrings.py:103
+msgid "Exports a GRASS raster to a binary MAT-File."
+msgstr "Exportă raster GRASS în fișier binar MAT-File."
+
+#: ../gui/wxpython/menustrings.py:104
+msgid "Raw binary array export"
+msgstr "Exportă șirul binar brut "
+
+#: ../gui/wxpython/menustrings.py:105
+msgid "Exports a GRASS raster map to a binary array."
+msgstr "Exportă harta raster GRASS ca un șir binar."
+
+#: ../gui/wxpython/menustrings.py:106
+msgid "MPEG-1 export"
+msgstr "Exportă MPEG-1 "
+
+#: ../gui/wxpython/menustrings.py:107
+msgid "Raster File Series to MPEG Conversion."
+msgstr "Convertește serii de fișiere raster în MPEG."
+
+#: ../gui/wxpython/menustrings.py:108
+msgid "PNG export"
+msgstr "Exportă PNG"
+
+#: ../gui/wxpython/menustrings.py:109
+msgid "Export GRASS raster as non-georeferenced PNG image."
+msgstr "Exportă raster GRASS ca imagine PNG negeoreferențiată."
+
+#: ../gui/wxpython/menustrings.py:110
+msgid "PPM export"
+msgstr "Exportă PPM"
+
+#: ../gui/wxpython/menustrings.py:111
+msgid "Converts a GRASS raster map to a PPM image file at the pixel resolution of the currently defined region."
+msgstr "Convertește harta raster GRASS într-un fișier imagine PPM cu rezoluția pixelului a regiunii curente definită."
+
+#: ../gui/wxpython/menustrings.py:112
+msgid "PPM from RGB export"
+msgstr "Exportă PPM din RGB"
+
+#: ../gui/wxpython/menustrings.py:113
+msgid "Converts 3 GRASS raster layers (R,G,B) to a PPM image file at the pixel resolution of the CURRENTLY DEFINED REGION."
+msgstr "Convertește 3 straturi raster GRASS (R,G,B) într-un fișier imagine PPM cu rezoluția pixelului a REGIUNII CURENTE DEFINITĂ."
+
+#: ../gui/wxpython/menustrings.py:114 ../gui/wxpython/menustrings.py:133
+msgid "POV-Ray export"
+msgstr "Exportă POV-Ray"
+
+#: ../gui/wxpython/menustrings.py:115
+msgid "Converts a raster map layer into a height-field file for POVRAY."
+msgstr "Convertește harta raster într-un fișier pentru POVRAY."
+
+#: ../gui/wxpython/menustrings.py:116
+msgid "TIFF export"
+msgstr "Exportă TIFF"
+
+#: ../gui/wxpython/menustrings.py:117
+msgid "Exports a GRASS raster map to a 8/24bit TIFF image file at the pixel resolution of the currently defined region."
+msgstr "Exportă hartă raster GRASS în imagine TIFF 8/24bit TIFF cu rezoluția pixelului a regiunii definite curent."
+
+#: ../gui/wxpython/menustrings.py:118
+msgid "VRML export"
+msgstr "Exportă VRML"
+
+#: ../gui/wxpython/menustrings.py:119
+msgid "Export a raster map to the Virtual Reality Modeling Language (VRML)"
+msgstr "Exportă hartă raster în Virtual Reality Modeling Language (VRML)"
+
+#: ../gui/wxpython/menustrings.py:120 ../gui/wxpython/menustrings.py:137
+#: ../gui/wxpython/menustrings.py:144
+msgid "VTK export"
+msgstr "Exportă VTK"
+
+#: ../gui/wxpython/menustrings.py:121
+msgid "Converts raster maps into the VTK-Ascii format"
+msgstr "Convertește hărțile raster în format VTK-Ascii"
+
+#: ../gui/wxpython/menustrings.py:122
+msgid "Pack raster map"
+msgstr "Impachetează hartă raster"
+
+#: ../gui/wxpython/menustrings.py:123
+msgid "Packs up a raster map and support files for copying."
+msgstr "Împachetează harta raster și fișierele suport pentru copiere."
+
+#: ../gui/wxpython/menustrings.py:124
+msgid "Export vector map"
+msgstr "Exportă hartă vectorială"
+
+#: ../gui/wxpython/menustrings.py:126
+msgid "Converts GRASS vector map to one of the supported OGR vector formats."
+msgstr "Convertește hartă vectorială GRASS în formate vector suportate OGR."
+
+#: ../gui/wxpython/menustrings.py:127
+msgid "ASCII points/GRASS ASCII vector export"
+msgstr "Exportă puncte ASCII/vectori GRASS ASCII"
+
+#: ../gui/wxpython/menustrings.py:128
+msgid "Converts a GRASS binary vector map to a GRASS ASCII vector map."
+msgstr "Convertește hartă vectorială binară GRASS în harta vectorială ASCII GRASS."
+
+#: ../gui/wxpython/menustrings.py:129
+msgid "DXF export"
+msgstr "Exportă DXF"
+
+#: ../gui/wxpython/menustrings.py:130
+msgid "Exports GRASS vector map layers to DXF file format."
+msgstr "Exportă hartă vectorială GRASS în fișier format DXF."
+
+#: ../gui/wxpython/menustrings.py:131
+msgid "Multiple GPS export formats using GPSBabel"
+msgstr "Exportă formate multiple GPS folosind GPSBabel"
+
+#: ../gui/wxpython/menustrings.py:132
+msgid "Exports a vector map to a GPS receiver or file format supported by GpsBabel."
+msgstr "Exportă hartă vectorială la un dispozitiv GPS sau format de fișier acceptat de GpsBabel"
+
+#: ../gui/wxpython/menustrings.py:134
+msgid "Converts to POV-Ray format, GRASS x,y,z -> POV-Ray x,z,y"
+msgstr "Convertește în format POV-Ray, GRASS x,y,z -> POV-Ray x,z,y"
+
+#: ../gui/wxpython/menustrings.py:135
+msgid "SVG export"
+msgstr "Exportă SVG"
+
+#: ../gui/wxpython/menustrings.py:136
+msgid "Exports a GRASS vector map to SVG."
+msgstr "Exportă hartă vectorială GRASS în SVG."
+
+#: ../gui/wxpython/menustrings.py:138
+msgid "Converts a GRASS binary vector map to VTK ASCII output."
+msgstr "Convertește hartă vectorială binară GRASS în fișier ASCII VTK."
+
+#: ../gui/wxpython/menustrings.py:139
+msgid "Export 3D raster maps"
+msgstr "Exportă hărți raster 3D"
+
+#: ../gui/wxpython/menustrings.py:140
+msgid "ASCII 3D export"
+msgstr "Exportă ASCII 3D"
+
+#: ../gui/wxpython/menustrings.py:141
+msgid "Converts a 3D raster map layer into an ASCII text file."
+msgstr "Convertește hartă raster 3D în fișier text ASCII."
+
+#: ../gui/wxpython/menustrings.py:142
+msgid "Vis5D export"
+msgstr "Exportă Vis5D"
+
+#: ../gui/wxpython/menustrings.py:143
+msgid "Exports GRASS 3D raster map to 3-dimensional Vis5D file."
+msgstr "Exportă hartă raster GRASS 3D în fișier tridimensional Vis5D."
+
+#: ../gui/wxpython/menustrings.py:145
+msgid "Converts 3D raster maps into the VTK-ASCII format."
+msgstr "Convertește hartă raster 3D în format VTK-ASCII."
+
+#: ../gui/wxpython/menustrings.py:146
+msgid "Export database table"
+msgstr "Exportă tabela bazei de date"
+
+#: ../gui/wxpython/menustrings.py:147
+msgid "Common export formats using OGR"
+msgstr "Exportă formate comune folosind OGR"
+
+#: ../gui/wxpython/menustrings.py:148
+msgid "Exports attribute tables into various formats."
+msgstr "Exportă tabela de atribute în formate diferite."
+
+#: ../gui/wxpython/menustrings.py:149
+msgid "Link external formats"
+msgstr "Leagă formate externe"
+
+#: ../gui/wxpython/menustrings.py:151
+msgid "Link GDAL supported raster data as a pseudo GRASS raster map layer."
+msgstr "Leagă date raster suportate GDAL ca pseudo strat raster GRASS."
+
+#: ../gui/wxpython/menustrings.py:153
+msgid "Creates a new pseudo-vector map as a link to an OGR-supported layer."
+msgstr "Crează pseudo-hartă vectorială nouă ca o legătură la un strat acceptat OGR."
+
+#: ../gui/wxpython/menustrings.py:154
+msgid "Manage maps and volumes"
+msgstr "Gestionează hărți și volume"
+
+#: ../gui/wxpython/menustrings.py:155
+msgid "Copy"
+msgstr "Copiază"
+
+#: ../gui/wxpython/menustrings.py:156
+msgid "Copies available data files in the user's current mapset search path and location to the appropriate element directories under the user's current mapset."
+msgstr "Copiază fișiere de date disponibile în calea de căutare și locația celui mai apropiat director sub care a fost creat mapsetul curent."
+
+#: ../gui/wxpython/menustrings.py:157
+msgid "List"
+msgstr "Listă"
+
+#: ../gui/wxpython/menustrings.py:158
+msgid "Lists available GRASS data base files of the user-specified data type."
+msgstr "Listează fișierele de bază disponibile GRASS specificate de utilizator."
+
+#: ../gui/wxpython/menustrings.py:159
+msgid "List filtered"
+msgstr "Listă filtrată"
+
+#: ../gui/wxpython/menustrings.py:160
+msgid "Lists available GRASS data base files of the user-specified data type optionally using the search pattern."
+msgstr "Listează fișierele de bază disponibile GRASS specificate de utilizator folosind modulul de căutare."
+
+#: ../gui/wxpython/menustrings.py:161 ../gui/wxpython/lmgr/layertree.py:340
+msgid "Rename"
+msgstr "Redenumește"
+
+#: ../gui/wxpython/menustrings.py:162
+msgid "Renames data base element files in the user's current mapset."
+msgstr "Redenumește fișierele de bază în mapsetul curent."
+
+#: ../gui/wxpython/menustrings.py:164 ../gui/wxpython/menustrings.py:166
+msgid "Removes data base element files from the user's current mapset."
+msgstr "Elimină fișierele de bază din mapsetul curent."
+
+#: ../gui/wxpython/menustrings.py:165
+msgid "Delete filtered"
+msgstr "Ștergere filtrată"
+
+#: ../gui/wxpython/menustrings.py:167 ../gui/wxpython/menustrings.py:299
+#: ../gui/wxpython/menustrings.py:578 ../gui/wxpython/menustrings.py:777
+msgid "Map type conversions"
+msgstr "Conversii tip de hărți"
+
+#: ../gui/wxpython/menustrings.py:168 ../gui/wxpython/menustrings.py:300
+msgid "Raster to vector"
+msgstr "Raster în vector"
+
+#: ../gui/wxpython/menustrings.py:169 ../gui/wxpython/menustrings.py:301
+msgid "Converts a raster map into a vector map layer."
+msgstr "Convertește harta raster în hartă vectorială."
+
+#: ../gui/wxpython/menustrings.py:170 ../gui/wxpython/menustrings.py:302
+msgid "Raster series to volume"
+msgstr "Serii raster în volume"
+
+#: ../gui/wxpython/menustrings.py:171 ../gui/wxpython/menustrings.py:303
+#, fuzzy
+msgid "Converts 2D raster map slices to one 3D raster volume map."
+msgstr "Convertește părți de hărți raster 2D într-o hartă raster de volum 3D."
+
+#: ../gui/wxpython/menustrings.py:172 ../gui/wxpython/menustrings.py:304
+msgid "Raster 2.5D to volume"
+msgstr "Raster 2.5D în volume"
+
+#: ../gui/wxpython/menustrings.py:173 ../gui/wxpython/menustrings.py:305
+msgid "Creates a 3D volume map based on 2D elevation and value raster maps."
+msgstr "Crează volum 3D bazat pe elevație 2D și valoare hartă raster."
+
+#: ../gui/wxpython/menustrings.py:174 ../gui/wxpython/menustrings.py:579
+msgid "Vector to raster"
+msgstr "Vector în raster"
+
+#: ../gui/wxpython/menustrings.py:175 ../gui/wxpython/menustrings.py:580
+msgid "Converts (rasterize) a vector map into a raster map."
+msgstr "Convertește hartă vectorială în hartă raster (rasterizare)."
+
+#: ../gui/wxpython/menustrings.py:176 ../gui/wxpython/menustrings.py:581
+msgid "Vector to volume"
+msgstr "Vector în volume"
+
+#: ../gui/wxpython/menustrings.py:177 ../gui/wxpython/menustrings.py:582
+msgid "Converts a binary GRASS vector map (only points) layer into a 3D GRASS raster map layer."
+msgstr "Convertește hartă vectorială binară GRASS (doar puncte) în hartă raster 3D GRASS."
+
+#: ../gui/wxpython/menustrings.py:178 ../gui/wxpython/menustrings.py:583
+msgid "2D vector to 3D vector"
+msgstr "2D vector în 3D vector"
+
+#: ../gui/wxpython/menustrings.py:179 ../gui/wxpython/menustrings.py:584
+msgid "Performs transformation of 2D vector features to 3D."
+msgstr "Efectuează transformarea trăsăturilor 2D în 3D."
+
+#: ../gui/wxpython/menustrings.py:180 ../gui/wxpython/menustrings.py:585
+msgid "Sites to vector"
+msgstr "Situri în vector"
+
+#: ../gui/wxpython/menustrings.py:181 ../gui/wxpython/menustrings.py:586
+msgid "Converts a GRASS site_lists file into a vector map."
+msgstr "Convertește un fișier cu liste de situri GRASS în hartă vectorială."
+
+#: ../gui/wxpython/menustrings.py:182 ../gui/wxpython/menustrings.py:778
+msgid "Volume to raster series"
+msgstr "Volume în serii raster"
+
+#: ../gui/wxpython/menustrings.py:183 ../gui/wxpython/menustrings.py:779
+msgid "Converts 3D raster maps to 2D raster maps"
+msgstr "Convertește hartă raster 3D în hartă raster 2D"
+
+#: ../gui/wxpython/menustrings.py:184
+msgid "Georectify"
+msgstr "Georectificare"
+
+#: ../gui/wxpython/menustrings.py:185
+msgid "Manage Ground Control Points for Georectification"
+msgstr "Gestionare puncte de control pentru georectificare"
+
+#: ../gui/wxpython/menustrings.py:186
+msgid "Graphical modeler"
+msgstr "Modelare grafică"
+
+#: ../gui/wxpython/menustrings.py:187
+msgid "Launch Graphical modeler"
+msgstr "Lansează Modelare grafică"
+
+#: ../gui/wxpython/menustrings.py:188 ../gui/wxpython/menustrings.py:894
+msgid "Run model"
+msgstr "Rulează model"
+
+#: ../gui/wxpython/menustrings.py:189
+msgid "Run model prepared by Graphical modeler"
+msgstr "Rulează model realizat în Modelare grafică"
+
+#: ../gui/wxpython/menustrings.py:190
+msgid "NVIZ (requires Tcl/Tk)"
+msgstr "NVIZ (necesită Tcl/Tk)"
+
+#: ../gui/wxpython/menustrings.py:191
+msgid "nviz - Visualization and animation tool for GRASS data."
+msgstr "nviz - Instrument de vizualizare și animație pentru datele GRASS."
+
+#: ../gui/wxpython/menustrings.py:192
+msgid "3D image rendering"
+msgstr "redarea 3D a imaginii"
+
+#: ../gui/wxpython/menustrings.py:193
+msgid "Creates a 3D rendering of GIS data."
+msgstr "Crează redarea 3D a datelor de GIS."
+
+#: ../gui/wxpython/menustrings.py:194
+msgid "Bearing/distance to coordinates"
+msgstr "Direcția/distanța la coordonate"
+
+#: ../gui/wxpython/menustrings.py:195
+msgid "A simple utility for converting bearing and distance measurements to coordinates and vice versa."
+msgstr "O utilitate simplă de convertire a direcției și a măsurătorilor de distanță la coordonate și viceversa."
+
+#: ../gui/wxpython/menustrings.py:196 ../gui/wxpython/lmgr/toolbars.py:142
+msgid "Cartographic Composer"
+msgstr "Compoziție Cartografică"
+
+#: ../gui/wxpython/menustrings.py:197
+msgid "Launch Cartographic Composer"
+msgstr "Lansează Compoziție Cartografică"
+
+#: ../gui/wxpython/menustrings.py:198
+msgid "Launch script"
+msgstr "Lansare script"
+
+#: ../gui/wxpython/menustrings.py:199
+msgid "Launches script file."
+msgstr "Lansează fișier sript."
+
+#: ../gui/wxpython/menustrings.py:200
+msgid "Exit GUI"
+msgstr "ÃŽnchide GUI"
+
+#: ../gui/wxpython/menustrings.py:201
+msgid "Quit the GRASS wxGUI session."
+msgstr "ÃŽnchide sesiunea GRASS wxGUI."
+
+#: ../gui/wxpython/menustrings.py:202 ../gui/wxpython/menustrings.py:874
+msgid "&Settings"
+msgstr "&Setări"
+
+#: ../gui/wxpython/menustrings.py:203
+msgid "Region"
+msgstr "Regiune"
+
+#: ../gui/wxpython/menustrings.py:204
+msgid "Display region"
+msgstr "Afișează regiune"
+
+#: ../gui/wxpython/menustrings.py:205 ../gui/wxpython/menustrings.py:207
+msgid "Manages the boundary definitions for the geographic region."
+msgstr "Gestionați definirea limitelor pentru regiunea geografică."
+
+#: ../gui/wxpython/menustrings.py:206
+msgid "Set region"
+msgstr "Setați regiunea"
+
+#: ../gui/wxpython/menustrings.py:208
+msgid "GRASS working environment"
+msgstr "Mediul de lucru GRASS"
+
+#: ../gui/wxpython/menustrings.py:209
+msgid "Mapset access"
+msgstr "Acces mapset"
+
+#: ../gui/wxpython/menustrings.py:210
+msgid "Set/unset access to other mapsets in current location"
+msgstr "Activează/dezactivează accesul la alte mapseturi din locația curentă"
+
+#: ../gui/wxpython/menustrings.py:211
+msgid "User access"
+msgstr "Acces utilizator"
+
+#: ../gui/wxpython/menustrings.py:212
+msgid "Controls access to the current mapset for other users on the system."
+msgstr "Controlează accesul la mapsetul curent pentru alți utilizatori ai sistemului."
+
+#: ../gui/wxpython/menustrings.py:213
+msgid "Change working environment"
+msgstr "Schimbă mediul de lucru"
+
+#: ../gui/wxpython/menustrings.py:214
+msgid "Changes current mapset."
+msgstr "Schimbă mapset-ul curent."
+
+#: ../gui/wxpython/menustrings.py:215
+msgid "Change location and mapset"
+msgstr "Schimbă locația și mapset-ul"
+
+#: ../gui/wxpython/menustrings.py:216
+msgid "Change current location and mapset."
+msgstr "Schimbă locația și mapset-ul curente."
+
+#: ../gui/wxpython/menustrings.py:217
+msgid "Change mapset"
+msgstr "Schimbă mapset"
+
+#: ../gui/wxpython/menustrings.py:218
+msgid "Change current mapset."
+msgstr "Schimbă mapset-ul curent."
+
+#: ../gui/wxpython/menustrings.py:219
+msgid "Show settings"
+msgstr "Afișează setările"
+
+#: ../gui/wxpython/menustrings.py:220 ../gui/wxpython/menustrings.py:222
+msgid "Outputs and modifies the user's current GRASS variable settings."
+msgstr "Afișează și modifică setările variabilelor ale utilizatorului GRASS curent."
+
+#: ../gui/wxpython/menustrings.py:221
+msgid "Change settings"
+msgstr "Schimbă setările"
+
+#: ../gui/wxpython/menustrings.py:223
+msgid "Change default GUI"
+msgstr "Schimbă GUI implicită"
+
+#: ../gui/wxpython/menustrings.py:224
+msgid "Changes the default GRASS graphical user interface (GUI) setting."
+msgstr "Modifică setările implicite ale interfeței grafice GRASS (GUI)."
+
+#: ../gui/wxpython/menustrings.py:225
+msgid "Create new location"
+msgstr "Crează locație nouă"
+
+#: ../gui/wxpython/menustrings.py:226
+msgid "Launches location wizard to create new GRASS location."
+msgstr "Lansează locația wizard pentru a crea o locație nouă GRASS."
+
+#: ../gui/wxpython/menustrings.py:227 ../gui/wxpython/lmgr/frame.py:686
+#: ../gui/wxpython/gis_set.py:429 ../gui/wxpython/gis_set.py:796
+msgid "Create new mapset"
+msgstr "Crează mapset nou"
+
+#: ../gui/wxpython/menustrings.py:228
+msgid "Creates new mapset in the current location, changes current mapset."
+msgstr "Crează mapset nou în locația curentă, schimbați mapset-ul curent."
+
+#: ../gui/wxpython/menustrings.py:229
+msgid "Version"
+msgstr "Versiune"
+
+#: ../gui/wxpython/menustrings.py:230
+msgid "Displays version and copyright information."
+msgstr "Afișează versiunea și informațiile privind drepturile de autor."
+
+#: ../gui/wxpython/menustrings.py:231
+msgid "Map projections"
+msgstr "Proiecțiile hărții"
+
+#: ../gui/wxpython/menustrings.py:232
+msgid "Display map projection"
+msgstr "Afișează proiecția hărții"
+
+#: ../gui/wxpython/menustrings.py:233
+msgid "Print projection information (in conventional GRASS format)."
+msgstr "Printează informațiile privind proiecția (în format convențional GRASS)."
+
+#: ../gui/wxpython/menustrings.py:234
+msgid "Manage projections"
+msgstr "Gestionează proiecțiile"
+
+#: ../gui/wxpython/menustrings.py:235
+msgid "Prints and manipulates GRASS projection information files (in various co-ordinate system descriptions)."
+msgstr "Printează și manipulează fișierele de informații cu privire la proiecția GRASS (diverse descrieri la sistemului de coordonate)."
+
+#: ../gui/wxpython/menustrings.py:236
+msgid "Change projection for current location"
+msgstr "Schimbă proiecția în locația curentă"
+
+#: ../gui/wxpython/menustrings.py:237
+msgid "Interactively reset the location's projection settings."
+msgstr "Restabilește interactiv parametrii proiecției locației."
+
+#: ../gui/wxpython/menustrings.py:238
+msgid "Convert coordinates"
+msgstr "Convertește coordonate"
+
+#: ../gui/wxpython/menustrings.py:239
+msgid "Convert coordinates from one projection to another (cs2cs frontend)."
+msgstr "Convertește coordonatele dintr-o proiecție în alta  (interfață cs2cs)"
+
+#: ../gui/wxpython/menustrings.py:240
+msgid "Addons extensions"
+msgstr "Extensiile addon-urilor"
+
+#: ../gui/wxpython/menustrings.py:241
+msgid "Install extension from addons"
+msgstr "Instalează extensii de la addon-uri"
+
+#: ../gui/wxpython/menustrings.py:242
+msgid "Installs new extension from GRASS AddOns SVN repository."
+msgstr "Instalează extensie nouă de la GRASS AddOns SVN."
+
+#: ../gui/wxpython/menustrings.py:243
+msgid "Update installed extensions"
+msgstr "Actualizează extensiile instalate"
+
+#: ../gui/wxpython/menustrings.py:244
+msgid "Rebuilds all locally installed GRASS Addons extensions."
+msgstr "Reconstruiește toate extensiile GRASS Addons instalate local."
+
+#: ../gui/wxpython/menustrings.py:245
+#: ../gui/wxpython/modules/extensions.py:461
+msgid "Remove extension"
+msgstr "Elimină extensie"
+
+#: ../gui/wxpython/menustrings.py:246
+msgid "Removes installed GRASS AddOns extension."
+msgstr "Elimină extensiile addon-urilor GRASS instalate. "
+
+#: ../gui/wxpython/menustrings.py:247 ../gui/wxpython/menustrings.py:875
+msgid "Preferences"
+msgstr "Preferințe"
+
+#: ../gui/wxpython/menustrings.py:248
+msgid "User GUI preferences (display font, commands, digitizer, etc.)"
+msgstr "Preferințele GUI ale utilizatorului (font afișare, comenzi, vectorizare, etc.)"
+
+#: ../gui/wxpython/menustrings.py:249
+msgid "&Raster"
+msgstr "&Raster"
+
+#: ../gui/wxpython/menustrings.py:250
+msgid "Develop raster map"
+msgstr "Dezvoltă harta raster"
+
+#: ../gui/wxpython/menustrings.py:251
+msgid "Digitize raster (requires XTerm)"
+msgstr "Vectorizare raster (necesită XTerm)"
+
+#: ../gui/wxpython/menustrings.py:252
+msgid "Interactive tool used to draw and save vector features on a graphics monitor using a pointing device (mouse) and save to a raster map."
+msgstr "Instrument interactiv utilizat pentru desenarea și salvarea trăsăturilor vectoriale pe un monitor grafic folosind un dispozitiv de indicare (mouse) și salvează harta raster."
+
+#: ../gui/wxpython/menustrings.py:253
+msgid "Compress/decompress"
+msgstr "Comprimă/decomprimă"
+
+#: ../gui/wxpython/menustrings.py:254
+msgid "Compresses and decompresses raster maps."
+msgstr "Comprimă și decomprimă hărți raster."
+
+#: ../gui/wxpython/menustrings.py:255
+msgid "Region boundaries"
+msgstr "Limitele regiunii"
+
+#: ../gui/wxpython/menustrings.py:256
+msgid "Sets the boundary definitions for a raster map."
+msgstr "Stabilește definițiile limită pentru o hartă raster."
+
+#: ../gui/wxpython/menustrings.py:257
+msgid "Manage NULL values"
+msgstr "Gestionează valorile nule"
+
+#: ../gui/wxpython/menustrings.py:258
+msgid "Manages NULL-values of given raster map."
+msgstr "Gestionează valorile nule pentru o hartă raster dată."
+
+#: ../gui/wxpython/menustrings.py:259
+msgid "Quantization"
+msgstr "Cuantificare"
+
+#: ../gui/wxpython/menustrings.py:260
+msgid "Produces the quantization file for a floating-point map."
+msgstr "Produce fișier de cuantificare pentru ă o hartă cu numere reale."
+
+#: ../gui/wxpython/menustrings.py:261
+msgid "Timestamp"
+msgstr "Timestamp"
+
+#: ../gui/wxpython/menustrings.py:262
+msgid "Modifies a timestamp for a raster map."
+msgstr "Modifică timestamp pentru o hartă raster."
+
+#: ../gui/wxpython/menustrings.py:263
+msgid "Resample using aggregate statistics"
+msgstr "Re-eșanționează folosind statistici agregate."
+
+#: ../gui/wxpython/menustrings.py:264
+msgid "Resamples raster map layers to a coarser grid using aggregation."
+msgstr "Re-eșanționează straturi raster într-un grid mai grosier folosind agregarea."
+
+#: ../gui/wxpython/menustrings.py:265
+msgid "Resample using multiple methods"
+msgstr "Re-eșanționează folosind metode multiple"
+
+#: ../gui/wxpython/menustrings.py:266
+msgid "Resamples raster map layers to a finer grid using interpolation."
+msgstr "Re-eșanționează straturi raster într-un grid mai fin folosind interpolarea."
+
+#: ../gui/wxpython/menustrings.py:267
+msgid "Resample using nearest neighbor"
+msgstr "Re-eșanționează folosind cel mai apropiat vecin"
+
+#: ../gui/wxpython/menustrings.py:268
+msgid "GRASS raster map layer data resampling capability."
+msgstr "Capacitatea de re-eșantionare a datelor raster GRASS."
+
+#: ../gui/wxpython/menustrings.py:269
+msgid "Resample using spline tension"
+msgstr "Re-eșanționează folosind spline tension"
+
+#: ../gui/wxpython/menustrings.py:270
+msgid "Reinterpolates and optionally computes topographic analysis from input raster map to a new raster map (possibly with different resolution) using regularized spline with tension and smoothing."
+msgstr "Reinterpolează și opțional calculează analiza topografică de la harta raster de intrare la noua hartă raster (posibil cu rezoluție diferită) folosind metoda regularized spline with tension și netezirea."
+
+#: ../gui/wxpython/menustrings.py:271 ../gui/wxpython/menustrings.py:544
+msgid "Support file maintenance"
+msgstr "Întreținerea fișierului suport"
+
+#: ../gui/wxpython/menustrings.py:272
+msgid "Allows creation and/or modification of raster map layer support files."
+msgstr "Permite crearea și/sau modificarea fișierelor suport a hărților raster."
+
+#: ../gui/wxpython/menustrings.py:273
+msgid "Update map statistics"
+msgstr "Actualizează statistica hărții"
+
+#: ../gui/wxpython/menustrings.py:274
+msgid "Update raster map statistics"
+msgstr "Actualizează statistica hărții raster"
+
+#: ../gui/wxpython/menustrings.py:275
+msgid "Reproject raster map"
+msgstr "Reproiectează harta raster"
+
+#: ../gui/wxpython/menustrings.py:276
+msgid "Re-projects a raster map from one location to the current location."
+msgstr "Reproiectează harta raster de la o locație în locația curentă."
+
+#: ../gui/wxpython/menustrings.py:277
+msgid "Tiling"
+msgstr "Mozaicare"
+
+#: ../gui/wxpython/menustrings.py:278
+msgid "Produces tilings of the source projection for use in the destination region and projection."
+msgstr "Produce o mozaicare a proiecției sursă pentru folosirea în regiunea și proiecția de destinație."
+
+#: ../gui/wxpython/menustrings.py:279 ../gui/wxpython/menustrings.py:563
+msgid "Manage colors"
+msgstr "Gestionează culori"
+
+#: ../gui/wxpython/menustrings.py:280 ../gui/wxpython/menustrings.py:564
+msgid "Color tables"
+msgstr "Tabela de culori"
+
+#: ../gui/wxpython/menustrings.py:281
+msgid "Creates/modifies the color table associated with a raster map layer."
+msgstr "Crează/modifică tabelul de culoare asociat cu un strat raster."
+
+#: ../gui/wxpython/menustrings.py:282
+msgid "Color tables (stddev)"
+msgstr "Tabela de culori (stddev)"
+
+#: ../gui/wxpython/menustrings.py:283
+msgid "Set color rules based on stddev from a map's mean value."
+msgstr "Setează reguli de culoare bazate pe stddev din valorile medii ale hărții."
+
+#: ../gui/wxpython/menustrings.py:284 ../gui/wxpython/menustrings.py:566
+msgid "Color rules"
+msgstr "Reguli pentru culoare"
+
+#: ../gui/wxpython/menustrings.py:285
+msgid "Interactive management of raster color tables."
+msgstr "Gestionează interactiv tabelele de culoare pentru raster."
+
+#: ../gui/wxpython/menustrings.py:286
+msgid "Export color table"
+msgstr "Exportă tabela de culori"
+
+#: ../gui/wxpython/menustrings.py:287
+msgid "Exports the color table associated with a raster map layer."
+msgstr "Exportă tabelul de culoare asociat cu un strat raster."
+
+#: ../gui/wxpython/menustrings.py:288
+msgid "Blend 2 color rasters"
+msgstr "Amestecați 2 culori pentru raster"
+
+#: ../gui/wxpython/menustrings.py:289
+msgid "Blends color components of two raster maps by a given ratio."
+msgstr "Amestecați componentele de culaore a două hărți raster pe baza unei rații date."
+
+#: ../gui/wxpython/menustrings.py:290
+msgid "Create RGB"
+msgstr "Crează RBG"
+
+#: ../gui/wxpython/menustrings.py:291
+msgid "Combines red, green and blue raster maps into a single composite raster map."
+msgstr "Combină roșu, verde și albastru într-o singură hartă raster."
+
+#: ../gui/wxpython/menustrings.py:292 ../gui/wxpython/menustrings.py:713
+msgid "RGB to HIS"
+msgstr "RGB în HIS"
+
+#: ../gui/wxpython/menustrings.py:293
+msgid "Generates red, green and blue raster map layers combining hue, intensity and saturation (HIS) values from user-specified input raster map layers."
+msgstr "Generează straturi raster roșu, verde, albastru în combinație cu valorile nuanței, intensității și saturației (HIS) dintr-un strat raster specificat de utilizator."
+
+#: ../gui/wxpython/menustrings.py:294
+msgid "Query raster maps"
+msgstr "Interoghează hartă raster"
+
+#: ../gui/wxpython/menustrings.py:295
+msgid "Query values by coordinates"
+msgstr "Interoghează valorile pe baza coordonatelor"
+
+#: ../gui/wxpython/menustrings.py:296
+msgid "Queries raster map layers on their category values and category labels."
+msgstr "Interoghează straturi raster pe categorii de valori și etichete."
+
+#: ../gui/wxpython/menustrings.py:297
+msgid "Query colors by value"
+msgstr "Interoghează culorile pe baza valorilor"
+
+#: ../gui/wxpython/menustrings.py:298
+msgid "Queries colors for a raster map layer."
+msgstr "Interoghează culorile pentru un strat raster."
+
+#: ../gui/wxpython/menustrings.py:306
+msgid "Buffer rasters"
+msgstr "Buffer raster"
+
+#: ../gui/wxpython/menustrings.py:307
+msgid "Creates a raster map layer showing buffer zones surrounding cells that contain non-NULL category values."
+msgstr "Crează hartă raster care arată zonele tampon (buffer) în jurul celulelor care conțin valori ne-nule."
+
+#: ../gui/wxpython/menustrings.py:308
+msgid "Concentric circles"
+msgstr "Cercuri concentrice"
+
+#: ../gui/wxpython/menustrings.py:309
+msgid "Creates a raster map containing concentric rings around a given point."
+msgstr "Crează o hartă raster care conține inele concentrice în jurul punctelor date."
+
+#: ../gui/wxpython/menustrings.py:310
+msgid "Closest points"
+msgstr "Punctele mai apropiate"
+
+#: ../gui/wxpython/menustrings.py:311
+msgid "Locates the closest points between objects in two raster maps."
+msgstr "Localizează punctele mai apropiate dintre obiectele din două hărți raster."
+
+#: ../gui/wxpython/menustrings.py:313
+msgid "Creates a MASK for limiting raster operation."
+msgstr "Crează o MASCĂ pentru limitarea operației raster."
+
+#: ../gui/wxpython/menustrings.py:314
+msgid "Raster map calculator"
+msgstr "Calculator raster"
+
+#: ../gui/wxpython/menustrings.py:315
+msgid "Map calculator for raster map algebra."
+msgstr "Calculator pentru algebra hărții raster."
+
+#: ../gui/wxpython/menustrings.py:316
+msgid "Neighborhood analysis"
+msgstr "Analiza vecinătății"
+
+#: ../gui/wxpython/menustrings.py:317
+msgid "Moving window"
+msgstr "Mutarea ferestrei"
+
+#: ../gui/wxpython/menustrings.py:318
+msgid "Makes each cell category value a function of the category values assigned to the cells around it, and stores new cell values in an output raster map layer."
+msgstr "Face fiecare valoare a celulei în funcție de valorile de categorii atribuite celulelor din jurul ei și stochează valorile celulei într-o hartă raster de ieșire."
+
+#: ../gui/wxpython/menustrings.py:319
+msgid "Neighborhood points"
+msgstr "Punctele vecinătății"
+
+#: ../gui/wxpython/menustrings.py:320
+msgid "Makes each cell value a function of the attribute values assigned to the vector points or centroids around it, and stores new cell values in an output raster map layer."
+msgstr "Face fiecare valoare a celulei în funcție de valorile de categorii atribuite punctelor vectoriale sau centroizilor și stochează valorile celulei într-o hartă raster de ieșire."
+
+#: ../gui/wxpython/menustrings.py:321
+msgid "Overlay rasters"
+msgstr "Suprapunere raster"
+
+#: ../gui/wxpython/menustrings.py:322
+msgid "Cross product"
+msgstr "Produse intersectate"
+
+#: ../gui/wxpython/menustrings.py:323
+msgid "Creates a cross product of the category values from multiple raster map layers."
+msgstr "Crează produse intersectate a categoriilor de valori din straturi multiple de rastere."
+
+#: ../gui/wxpython/menustrings.py:324
+msgid "Raster series"
+msgstr "Serii de raster"
+
+#: ../gui/wxpython/menustrings.py:325
+msgid "Makes each output cell value a function of the values assigned to the corresponding cells in the input raster map layers."
+msgstr "Face fiecare valoare a celulei rezultate în funcție de valorile corespunzătoare celulelor din harta raster de intrare."
+
+#: ../gui/wxpython/menustrings.py:326
+msgid "Patch raster maps"
+msgstr "Combină hărți raster"
+
+#: ../gui/wxpython/menustrings.py:327
+msgid "Creates a composite raster map layer by using known category values from one (or more) map layer(s) to fill in areas of \"no data\" in another map layer."
+msgstr "Crează o compoziție de hartă raster folosind valorile de categorii cunoscute de la unul (sau mai multe) straturi pentru a umple arealele cu \"no data\" într-o altă hartă."
+
+#: ../gui/wxpython/menustrings.py:328
+msgid "Statistical overlay"
+msgstr "Recuperarea statistică"
+
+#: ../gui/wxpython/menustrings.py:329
+msgid "Calculates category or object oriented statistics."
+msgstr "Calculează categorii sau statistici orientate obiect."
+
+#: ../gui/wxpython/menustrings.py:330
+msgid "Solar radiance and shadows"
+msgstr "Radiația solară și umbre"
+
+#: ../gui/wxpython/menustrings.py:331
+msgid "Solar irradiance and irradiation"
+msgstr "Iradierea solară și iradiere"
+
+#: ../gui/wxpython/menustrings.py:332
+msgid "Solar irradiance and irradiation model."
+msgstr "Iradierea solară și modelul iradierii."
+
+#: ../gui/wxpython/menustrings.py:333
+msgid "Shadows map"
+msgstr "Harta umbrelor"
+
+#: ../gui/wxpython/menustrings.py:334
+msgid "Calculates cast shadow areas from sun position and elevation raster map."
+msgstr "Calculează zonele umbrite în funcție de poziția soarelui și harta raster de elevație."
+
+#: ../gui/wxpython/menustrings.py:335
+msgid "Terrain analysis"
+msgstr "Analiza terenului"
+
+#: ../gui/wxpython/menustrings.py:336
+msgid "Generate contour lines"
+msgstr "Generează curbe de nivel"
+
+#: ../gui/wxpython/menustrings.py:337
+msgid "Produces a vector map of specified contours from a raster map."
+msgstr "Produce harta vectorială a curbelor de nivel dintr-o hartă raster."
+
+#: ../gui/wxpython/menustrings.py:338
+msgid "Cost surface"
+msgstr "Suprafață de cost"
+
+#: ../gui/wxpython/menustrings.py:339
+msgid "Creates a raster map showing the cumulative cost of moving between different geographic locations on an input raster map whose cell category values represent cost."
+msgstr "Crează o hartă raster care arată costul cumulat a deplasării dintre locații geografice diferite pe o hartă raster a cărui celule are valori ce reprezintă costul."
+
+#: ../gui/wxpython/menustrings.py:340
+msgid "Cumulative movement costs"
+msgstr "Costul cumulat al deplasării"
+
+#: ../gui/wxpython/menustrings.py:341
+msgid "Outputs a raster map layer showing the anisotropic cumulative cost of moving between different geographic locations on an input elevation raster map layer whose cell category values represent elevation combined with an input raster map layer whose cell values represent friction cost."
+msgstr "Crează o hartă raster care arată costul cumulat anisotropic al deplasării dintre locații geografice diferite pe o hartă raster de elevație ale cărui celule are valori ce reprezintă elevația combinată cu stratul raster de intrare, cel din urmă având valori ale celulelor ce reprezintă costul de frecare."
+
+#: ../gui/wxpython/menustrings.py:342
+msgid "Least cost route or flow"
+msgstr "Cel mai scurt drum sau curs de apă"
+
+#: ../gui/wxpython/menustrings.py:343
+msgid "Traces a flow through an elevation model on a raster map."
+msgstr "Trasează un curs de apă printr-un model de elevație pe harta raster."
+
+#: ../gui/wxpython/menustrings.py:344
+msgid "Shaded relief"
+msgstr "Relief umbrit"
+
+#: ../gui/wxpython/menustrings.py:345
+msgid "Creates shaded relief map from an elevation map (DEM)."
+msgstr "Crează harta reliefului umbrit dintr-o hartă a elevației (DEM)."
+
+#: ../gui/wxpython/menustrings.py:346
+msgid "Slope and aspect"
+msgstr "Panta și orientarea versanților"
+
+#: ../gui/wxpython/menustrings.py:347
+msgid "Generates raster maps of slope, aspect, curvatures and partial derivatives from a elevation raster map."
+msgstr "Generează hărți raster ale pantei, orientării, curburii și derivatelor parțiale dintr-o hartă raster de elevație."
+
+#: ../gui/wxpython/menustrings.py:348
+msgid "Terrain parameters"
+msgstr "Parametrii terenului"
+
+#: ../gui/wxpython/menustrings.py:349
+msgid "Extracts terrain parameters from a DEM."
+msgstr "Extrage parametrii terenului dintr-un DEM."
+
+#: ../gui/wxpython/menustrings.py:350
+msgid "Textural features"
+msgstr "Trăsături texturale"
+
+#: ../gui/wxpython/menustrings.py:351
+msgid "Generate images with textural features from a raster map."
+msgstr "Generează imagini cu trăsături texturale dintr-o hartă raster."
+
+#: ../gui/wxpython/menustrings.py:352
+msgid "Visibility"
+msgstr "Vizibilitate"
+
+#: ../gui/wxpython/menustrings.py:353
+msgid "Line-of-sight raster analysis program."
+msgstr "Program de analiză raster a liniei de vedere."
+
+#: ../gui/wxpython/menustrings.py:354
+msgid "Distance to features"
+msgstr "Distanța la trăsături"
+
+#: ../gui/wxpython/menustrings.py:355
+msgid "Generates a raster map layer of distance to features in input layer."
+msgstr "Generează un strat raster pentru distanța dintre trăsături în stratul de intrare."
+
+#: ../gui/wxpython/menustrings.py:356
+msgid "Horizon angle"
+msgstr "Unghiul de orizont"
+
+#: ../gui/wxpython/menustrings.py:357
+msgid "Horizon angle computation from a digital elevation model."
+msgstr "Calculează unghiul de orizont dintr-un model digital al elevației."
+
+#: ../gui/wxpython/menustrings.py:358
+msgid "Transform features"
+msgstr "Transformă trăsături"
+
+#: ../gui/wxpython/menustrings.py:359
+msgid "Clump"
+msgstr "Grup"
+
+#: ../gui/wxpython/menustrings.py:360
+msgid "Recategorizes data in a raster map by grouping cells that form physically discrete areas into unique categories."
+msgstr "Sortează datele dintr-o hartă raster în funcție de gruparea celulelor care formează areale fizice discrete într-o singură categorie."
+
+#: ../gui/wxpython/menustrings.py:361
+msgid "Grow"
+msgstr "Dezvoltă"
+
+#: ../gui/wxpython/menustrings.py:362
+msgid "Generates a raster map layer with contiguous areas grown by one cell."
+msgstr "Generează o hartă raster cu areale continuu dezvoltate după o singură celulă."
+
+#: ../gui/wxpython/menustrings.py:363
+msgid "Thin"
+msgstr "Subțiază"
+
+#: ../gui/wxpython/menustrings.py:364
+msgid "Thins non-zero cells that denote linear features in a raster map."
+msgstr "Subțiază celulele ne-nule care par că aparțin trăsăturilor lineare dintr-o hartă raster."
+
+#: ../gui/wxpython/menustrings.py:365
+msgid "Hydrologic modeling"
+msgstr "Modelare hidrologică"
+
+#: ../gui/wxpython/menustrings.py:366
+msgid "Carve stream channels"
+msgstr "Canale de drenaj"
+
+#: ../gui/wxpython/menustrings.py:367
+msgid "Takes vector stream data, transforms it to raster and subtracts depth from the output DEM."
+msgstr "Sunt luate datele vectoriale privind cursul de apă, le transformă în raster și scade adâncimea dintr-un DEM."
+
+#: ../gui/wxpython/menustrings.py:368
+msgid "Fill lake"
+msgstr "Umple lac"
+
+#: ../gui/wxpython/menustrings.py:369
+msgid "Fills lake at given point to given level."
+msgstr "Umple lacul de la un punct dat pana la un anumit nivel."
+
+#: ../gui/wxpython/menustrings.py:370
+msgid "Depressionless map and flowlines"
+msgstr "Harta depresiunilor și liniilor de scurgere"
+
+#: ../gui/wxpython/menustrings.py:371
+msgid "Filters and generates a depressionless elevation map and a flow direction map from a given elevation raster map."
+msgstr "Filtrează și generează o harta de elevație a depresiunilor și o hartă a direcției de scurgere dintr-un raster dat."
+
+#: ../gui/wxpython/menustrings.py:372
+msgid "Flow accumulation"
+msgstr "Acumularea scurgerii"
+
+#: ../gui/wxpython/menustrings.py:373
+msgid "Flow computation for massive grids (float version)."
+msgstr "Calculează scurgerea pentru griduri mari (versiunea float)"
+
+#: ../gui/wxpython/menustrings.py:374
+msgid "Flow lines"
+msgstr "Liniile de scurgere"
+
+#: ../gui/wxpython/menustrings.py:375
+msgid "Construction of slope curves (flowlines), flowpath lengths, and flowline densities (upslope areas) from a raster digital elevation model (DEM)."
+msgstr "Construiește curbe de pante (linii de scurgere), lungimea cursului și densitatea cursurilor de scurgere (în amonte) dintr-un model digital al elevației (DEM)."
+
+#: ../gui/wxpython/menustrings.py:376
+msgid "Watershed analysis"
+msgstr "Analiza bazinelor hidrografice"
+
+#: ../gui/wxpython/menustrings.py:377
+msgid "Watershed basin analysis program."
+msgstr "Program de analiză a bazinelor hidrografice."
+
+#: ../gui/wxpython/menustrings.py:378
+msgid "Watershed subbasins"
+msgstr "Subbazine hidrografice"
+
+#: ../gui/wxpython/menustrings.py:379
+msgid "Generates watershed subbasins raster map."
+msgstr "Generează harta raster a subbazinelor hidrografice."
+
+#: ../gui/wxpython/menustrings.py:380
+msgid "Watershed basin creation"
+msgstr "Crearea de bazin hidrografic"
+
+#: ../gui/wxpython/menustrings.py:381
+msgid "Watershed basin creation program."
+msgstr "Program pentru crearea bazinului hidrografic."
+
+#: ../gui/wxpython/menustrings.py:382 ../gui/wxpython/menustrings.py:786
+msgid "Groundwater modeling"
+msgstr "Modelarea apelor subterane"
+
+#: ../gui/wxpython/menustrings.py:383
+msgid "Numerical calculation program for transient, confined and unconfined groundwater flow in two dimensions."
+msgstr "Program de calcul numeric pentru tranzitarea, nelimitată și neînchisă a apelor subterane în două dimensiuni."
+
+#: ../gui/wxpython/menustrings.py:384
+msgid "SIMWE Overland flow modeling"
+msgstr "Modelarea scurgerii apei SIMWE "
+
+#: ../gui/wxpython/menustrings.py:385
+msgid "Overland flow hydrologic simulation using path sampling method (SIMWE)."
+msgstr "Simularea inundației prin metoda (SIMWE)."
+
+#: ../gui/wxpython/menustrings.py:386
+msgid "SIMWE Sediment flux modeling"
+msgstr "Modelarea SIMWE a fluxului de sedimente"
+
+#: ../gui/wxpython/menustrings.py:387
+msgid "Sediment transport and erosion/deposition simulation using path sampling method (SIMWE)."
+msgstr "Simularea transportului de sedimente și eroziune/depozitare folosind metoda (SIMWE)."
+
+#: ../gui/wxpython/menustrings.py:388
+msgid "Topographic index map"
+msgstr "Harta indicelui topografic"
+
+#: ../gui/wxpython/menustrings.py:389
+msgid "Creates topographic index map from elevation raster map."
+msgstr "Crează harta indicelului topografic dintr-o hartă raster de elevație."
+
+#: ../gui/wxpython/menustrings.py:390
+msgid "TOPMODEL simulation"
+msgstr "Simularea TOPMODEL"
+
+#: ../gui/wxpython/menustrings.py:391
+msgid "Simulates TOPMODEL which is a physically based hydrologic model."
+msgstr "Simulează TOPMODEL, care este un model hidrologic bazat pe fizică."
+
+#: ../gui/wxpython/menustrings.py:392
+msgid "Landscape structure modeling"
+msgstr "Modelarea structurii peisajului"
+
+#: ../gui/wxpython/menustrings.py:393
+msgid "Set up (requires XTerm)"
+msgstr "Configurează (necesită XTerm)"
+
+#: ../gui/wxpython/menustrings.py:394
+msgid "Interactive tool used to setup the sampling and analysis framework that will be used by the other r.le programs."
+msgstr "Instrument interactiv folosit pentru a seta prelevarea de probe și analiza cadrului care vor fi utilizate de alte r.le programs."
+
+#: ../gui/wxpython/menustrings.py:395
+msgid "Analyze landscape"
+msgstr "Analiza peisajului"
+
+#: ../gui/wxpython/menustrings.py:396
+msgid "Contains a set of measures for attributes, diversity, texture, juxtaposition, and edge."
+msgstr "Conține un set de măsuri pentru atribute, diversitate, textură, juxtapunere și unghiuri."
+
+#: ../gui/wxpython/menustrings.py:397
+msgid "Analyze patches"
+msgstr "Analizează parcele"
+
+#: ../gui/wxpython/menustrings.py:398
+msgid "Calculates attribute, patch size, core (interior) size, shape, fractal dimension, and perimeter measures for sets of patches in a landscape."
+msgstr "Calculează atribute, dimensiunea parcelei, dimensiunea de bază (interior), forma, dimensiunea fractală și măsoară perimetrul pentru un set de parcele a peisajului."
+
+#: ../gui/wxpython/menustrings.py:399
+msgid "Summary and display (requires XTerm)"
+msgstr "Rezumat și afișare (necesită XTerm)"
+
+#: ../gui/wxpython/menustrings.py:400
+msgid "Displays the boundary of each r.le patch and shows how the boundary is traced, displays the attribute, size, perimeter and shape indices for each patch and saves the data in an output file."
+msgstr "Afișează limitele pentru fiecare  r.le patch și arată cum limitele sunt urmărite, afișează indici precum atributele, dimensiunea, perimetrul și forma pentru fiecare parcelă și salvează datele într-un fișier."
+
+#: ../gui/wxpython/menustrings.py:401
+msgid "Landscape patch analysis"
+msgstr "Analiza de parcele ale peisajului"
+
+#: ../gui/wxpython/menustrings.py:402
+msgid "Set up sampling and analysis framework"
+msgstr "Configurează prelevare de probe și analiza cadrului"
+
+#: ../gui/wxpython/menustrings.py:403
+msgid "Configuration editor for r.li.'index'"
+msgstr "Editor de configurare pentru r.li.'index'"
+
+#: ../gui/wxpython/menustrings.py:404
+msgid "Edge density"
+msgstr "Densitatea marginii"
+
+#: ../gui/wxpython/menustrings.py:405
+msgid "Calculates edge density index on a raster map, using a 4 neighbour algorithm"
+msgstr "Calculează indicele densității marginii pe o hartă raster, folosind algoritmul celor 4 vecini "
+
+#: ../gui/wxpython/menustrings.py:406
+msgid "Contrast weighted edge density"
+msgstr "Contrastul ponderat al densității de margine"
+
+#: ../gui/wxpython/menustrings.py:407
+msgid "Calculates contrast weighted edge density index on a raster map"
+msgstr "Calculează constratul ponderat al indicelului densității marginii pe o hartă raster"
+
+#: ../gui/wxpython/menustrings.py:408
+msgid "Patch area mean"
+msgstr "Suprafața medie a parcelei"
+
+#: ../gui/wxpython/menustrings.py:409
+msgid "Calculates mean patch size index on a raster map, using a 4 neighbour algorithm"
+msgstr "Calculează dimensiunea medie a parcelei pe o hartă raster, folosind algoritmul celor 4 vecini"
+
+#: ../gui/wxpython/menustrings.py:410
+msgid "Patch area range"
+msgstr "Rândurile parcelei"
+
+#: ../gui/wxpython/menustrings.py:411
+msgid "Calculates range of patch area size on a raster map"
+msgstr "Calculează dimensiunea rândurilor parcelei pe o hartă raster"
+
+#: ../gui/wxpython/menustrings.py:412
+msgid "Patch area Std Dev"
+msgstr "Deviația standard a parcelei"
+
+#: ../gui/wxpython/menustrings.py:413
+msgid "Calculates standard deviation of patch area a raster map"
+msgstr "Calculează deviația standard a parcelei pe o hartă raster"
+
+#: ../gui/wxpython/menustrings.py:414
+msgid "Patch area Coeff Var"
+msgstr "Coeficientul de variație a parcelei"
+
+#: ../gui/wxpython/menustrings.py:415
+msgid "Calculates coefficient of variation of patch area on a raster map"
+msgstr "Calculează coeficientul de variație a parcelei pe o hartă raster"
+
+#: ../gui/wxpython/menustrings.py:416
+msgid "Patch density"
+msgstr "Densitatea parcelelor"
+
+#: ../gui/wxpython/menustrings.py:417
+msgid "Calculates patch density index on a raster map, using a 4 neighbour algorithm"
+msgstr "Calculează densitatea parcelelor pe o hartă raster, folosind algoritmul celor 4 vecini"
+
+#: ../gui/wxpython/menustrings.py:418
+msgid "Patch number"
+msgstr "Număr de parcele"
+
+#: ../gui/wxpython/menustrings.py:419
+msgid "Calculates patch number index on a raster map, using a 4 neighbour algorithm."
+msgstr "Calculează numărul de parcele pe o hartă raster, folosind algoritmul celor 4 vecini"
+
+#: ../gui/wxpython/menustrings.py:420
+msgid "Dominance's diversity"
+msgstr "Diversitatea Dominance"
+
+#: ../gui/wxpython/menustrings.py:421 ../gui/wxpython/menustrings.py:427
+msgid "Calculates dominance's diversity index on a raster map"
+msgstr "Calculează indicele diversității dominante pe o hartă raster"
+
+#: ../gui/wxpython/menustrings.py:422
+msgid "Shannon's diversity"
+msgstr "Diversitatea Shannon"
+
+#: ../gui/wxpython/menustrings.py:423
+msgid "Calculates Shannon's diversity index on a raster map"
+msgstr "Calculează indicele diversității Shannon pe o hartă raster"
+
+#: ../gui/wxpython/menustrings.py:424
+msgid "Simpson's diversity"
+msgstr "Diversitatea Simpson"
+
+#: ../gui/wxpython/menustrings.py:425
+msgid "Calculates Simpson's diversity index on a raster map"
+msgstr "Calculează indicele diversității Shannon pe o hartă raster"
+
+#: ../gui/wxpython/menustrings.py:426
+msgid "Richness"
+msgstr "Abundența"
+
+#: ../gui/wxpython/menustrings.py:428
+msgid "Shape index"
+msgstr "Indicele de formă"
+
+#: ../gui/wxpython/menustrings.py:429
+msgid "Calculates shape index on a raster map"
+msgstr "Calculează indicele de formă pe o hartă raster"
+
+#: ../gui/wxpython/menustrings.py:430
+msgid "Wildfire modeling"
+msgstr "Modelarea incendiilor "
+
+#: ../gui/wxpython/menustrings.py:431
+msgid "Rate of spread"
+msgstr "Rata de răspândire"
+
+#: ../gui/wxpython/menustrings.py:432
+msgid "Generates three, or four raster map layers showing 1) the base (perpendicular) rate of spread (ROS), 2) the maximum (forward) ROS, 3) the direction of the maximum ROS, and optionally 4) the maximum potential spotting distance."
+msgstr "Generează trei sau patru straturi raster care arată 1) rata de răspândire (ROS) de bază (perpendiculară), 2) ROS maxim (înainte), 3) direcția pentru ROS maxim și opțional 4) potențialul maxim de propagare."
+
+#: ../gui/wxpython/menustrings.py:433
+msgid "Least-cost spread paths"
+msgstr "Căi de propagare pentru cost minim"
+
+#: ../gui/wxpython/menustrings.py:434
+msgid "Recursively traces the least cost path backwards to cells from which the cumulative cost was determined."
+msgstr "Trasează recursiv cea mai scurtă cale la celulele de la care a fost determinat costul cumulativ."
+
+#: ../gui/wxpython/menustrings.py:435
+msgid "Anisotropic spread simulation"
+msgstr "Simulare de difuzie \"anisotropic\""
+
+#: ../gui/wxpython/menustrings.py:436
+msgid "Simulates elliptically anisotropic spread on a graphics window and generates a raster map of the cumulative time of spread, given raster maps containing the rates of spread (ROS), the ROS directions and the spread origins."
+msgstr "Simulează răspândirea eliptică \"anisotropic\" pe fereastra grafică și generează o hartă raster a răspândirii cumulative în timp, care conține ratele de răspândire (ROS), direcția ROS și originile răspândirii."
+
+#: ../gui/wxpython/menustrings.py:437
+msgid "Change category values and labels"
+msgstr "Schimbă categoriile de valori și etichete"
+
+#: ../gui/wxpython/menustrings.py:438
+msgid "Interactively edit category values"
+msgstr "Editează interactiv valorile"
+
+#: ../gui/wxpython/menustrings.py:439
+msgid "Interactively edit cell values in a raster map."
+msgstr "Editează interactiv valorile celulelor dintr-un raster."
+
+#: ../gui/wxpython/menustrings.py:440
+msgid "Reclassify by size"
+msgstr "Reclasifică în funcție de dimensiune"
+
+#: ../gui/wxpython/menustrings.py:441
+msgid "Reclasses a raster map greater or less than user specified area size (in hectares)."
+msgstr "Reclasifică o hartă raster la o dimensiune mai mare sau egală cu valoarea specificată (în hectare) de utilizator."
+
+#: ../gui/wxpython/menustrings.py:442 ../gui/wxpython/menustrings.py:648
+msgid "Reclassify"
+msgstr "Reclasifică"
+
+#: ../gui/wxpython/menustrings.py:443
+msgid "Creates a new map layer whose category values are based upon a reclassification of the categories in an existing raster map layer."
+msgstr "Crează un strat nou ale cărui valori sunt bazate pe reclasificarea categoriilor din stratul raster existent."
+
+#: ../gui/wxpython/menustrings.py:444
+msgid "Recode"
+msgstr "Recodează"
+
+#: ../gui/wxpython/menustrings.py:445
+msgid "Recodes categorical raster maps."
+msgstr "Recodează categorii de hărți raster."
+
+#: ../gui/wxpython/menustrings.py:446
+msgid "Rescale"
+msgstr "Redimensionează"
+
+#: ../gui/wxpython/menustrings.py:447
+msgid "Rescales the range of category values in a raster map layer."
+msgstr "Redimensionează seria de valori pentru un strat raster."
+
+#: ../gui/wxpython/menustrings.py:448
+msgid "Rescale with histogram"
+msgstr "Redimensionează cu histogramă"
+
+#: ../gui/wxpython/menustrings.py:449
+msgid "Rescales histogram equalized the range of category values in a raster map layer."
+msgstr "Redimensionează histograma egalizată cu gama de valori din stratul raster."
+
+#: ../gui/wxpython/menustrings.py:450
+msgid "Generate random cells"
+msgstr "Generează celule aleator"
+
+#: ../gui/wxpython/menustrings.py:451
+msgid "Random cells"
+msgstr "Celule aleatorii"
+
+#: ../gui/wxpython/menustrings.py:452
+msgid "Generates random cell values with spatial dependence."
+msgstr "Generează aleator valorile celulelor cu dependență spațială."
+
+#: ../gui/wxpython/menustrings.py:453
+msgid "Random cells and vector points"
+msgstr "Celule și puncte vectoriale aleatorii"
+
+#: ../gui/wxpython/menustrings.py:454
+msgid "Creates a raster map layer and vector point map containing randomly located points."
+msgstr "Crează strat raster și puncte vectoriale care conțin puncte localizate aleatoriu."
+
+#: ../gui/wxpython/menustrings.py:455
+msgid "Generate surfaces"
+msgstr "Generează suprafețe"
+
+#: ../gui/wxpython/menustrings.py:456
+msgid "Fractal surface"
+msgstr "Suprafață fractal"
+
+#: ../gui/wxpython/menustrings.py:457
+msgid "Creates a fractal surface of a given fractal dimension."
+msgstr "Crează o suprafață fractal pentru o dimensiune fractală dată."
+
+#: ../gui/wxpython/menustrings.py:458
+msgid "Gaussian kernel density surface"
+msgstr "Suprafața densității Gaussian kernel"
+
+#: ../gui/wxpython/menustrings.py:459
+msgid "Generates a raster density map from vector point data using a moving kernel or optionally generates a vector density map on a vector network."
+msgstr "Generează harta densității de tip raster din puncte vectoriale folosind mutarea kernel sau opțional generează harta densității de tip vector pe o rețea vectorială."
+
+#: ../gui/wxpython/menustrings.py:460
+msgid "Gaussian deviates surface"
+msgstr "Suprafața deviației Gaussiene"
+
+#: ../gui/wxpython/menustrings.py:461
+msgid "GRASS module to produce a raster map layer of gaussian deviates whose mean and standard deviation can be expressed by the user. It uses a gaussian random number generator."
+msgstr "Modul GRASS pentru a produce o hartă raster a deviației gaussiene a căror deviație standard și medie pot fi exprimate de utilizator. Folosește o generare aleatorie gaussiană de numere."
+
+#: ../gui/wxpython/menustrings.py:462 ../gui/wxpython/nviz/tools.py:4307
+msgid "Plane"
+msgstr "Plan"
+
+#: ../gui/wxpython/menustrings.py:463
+msgid "Creates raster plane map given dip (inclination), aspect (azimuth) and one point."
+msgstr "Crează un pan de hartă raster cu un anumit dip (înclinație), orientare (azimut) și un punct."
+
+#: ../gui/wxpython/menustrings.py:464
+msgid "Random deviates surface"
+msgstr "Abaterea aleatorie a suprafeței"
+
+#: ../gui/wxpython/menustrings.py:465
+msgid "Produces a raster map of uniform random deviates whose range can be expressed by the user."
+msgstr "Produce o hartă raster a deviației aleatorii uniforme a cărui interval poate fi exprimat de către utilizator."
+
+#: ../gui/wxpython/menustrings.py:466
+msgid "Random surface with spatial dependence"
+msgstr "Suprafață aleatorie cu dependență spațială"
+
+#: ../gui/wxpython/menustrings.py:467
+msgid "Generates random surface(s) with spatial dependence."
+msgstr "Generează suprafețe aleatorii cu dependență spațială."
+
+#: ../gui/wxpython/menustrings.py:468
+msgid "Interpolate surfaces"
+msgstr "Interpolarea suprafețelor"
+
+#: ../gui/wxpython/menustrings.py:469
+msgid "Bilinear from raster points"
+msgstr "Bilinear din puncte raster"
+
+#: ../gui/wxpython/menustrings.py:470
+msgid "Bilinear interpolation utility for raster map layers."
+msgstr "Utilitate de interpolare bilineară pentru straturile raster."
+
+#: ../gui/wxpython/menustrings.py:471
+msgid "Bilinear and bicubic from vector points"
+msgstr "Bilinear și bicubic din puncte vectoriale"
+
+#: ../gui/wxpython/menustrings.py:472
+msgid "Bicubic or bilinear spline interpolation with Tykhonov regularization."
+msgstr "Interpolare spline bicubică sau bilineară cu regularizare Tykhonov."
+
+#: ../gui/wxpython/menustrings.py:473
+msgid "IDW from raster points"
+msgstr "IDW din puncte raster"
+
+#: ../gui/wxpython/menustrings.py:474
+msgid "Surface interpolation utility for raster map."
+msgstr "Utilitate de interpolare a suprafeței pentru harta raster."
+
+#: ../gui/wxpython/menustrings.py:475
+msgid "IDW from raster points (alternate method for sparse points)"
+msgstr "IDW din puncte raster (metodă alternativă pentru puncte rare)"
+
+#: ../gui/wxpython/menustrings.py:476
+msgid "Surface generation program."
+msgstr "Program pentru generarea suprafeței."
+
+#: ../gui/wxpython/menustrings.py:477
+msgid "IDW from vector points"
+msgstr "IDW din puncte vectoriale"
+
+#: ../gui/wxpython/menustrings.py:478
+msgid "Surface interpolation from vector point data by Inverse Distance Squared Weighting."
+msgstr "Interpolarea suprafeței din puncte vectoriale în funcție de Inversul Distanței de Pondere Pătratică."
+
+#: ../gui/wxpython/menustrings.py:479
+msgid "Raster contours"
+msgstr "Contururi raster"
+
+#: ../gui/wxpython/menustrings.py:480
+msgid "Surface generation program from rasterized contours."
+msgstr "Program pentru generarea suprafeței din curbe de nivel rasterizate."
+
+#: ../gui/wxpython/menustrings.py:481
+msgid "Regularized spline tension"
+msgstr "Regularized spline tension"
+
+#: ../gui/wxpython/menustrings.py:482
+msgid "Spatial approximation and topographic analysis from given point or isoline data in vector format to floating point raster format using regularized spline with tension."
+msgstr "Aproximarea spațială și analiza topografică de la un punct dat sau date de tip izolinii în format vectorial în format raster de puncte reale folosind metoda regularized spline with tension."
+
+#: ../gui/wxpython/menustrings.py:483
+msgid "Ordinary or block kriging"
+msgstr "Kriging ordinar sau pe blocuri"
+
+#: ../gui/wxpython/menustrings.py:484
+msgid "Performs ordinary or block kriging."
+msgstr "Efectuează Kriging ordinar sau pe blocuri."
+
+#: ../gui/wxpython/menustrings.py:485
+msgid "Fill NULL cells"
+msgstr "Umple celulele nule"
+
+#: ../gui/wxpython/menustrings.py:486
+msgid "Fills no-data areas in raster maps using spline interpolation."
+msgstr "Umple arealele fără date din harta raster folosind interpolarea spline."
+
+#: ../gui/wxpython/menustrings.py:487 ../gui/wxpython/menustrings.py:764
+msgid "Report and statistics"
+msgstr "Raport și statistici"
+
+#: ../gui/wxpython/menustrings.py:488
+msgid "Basic raster metadata"
+msgstr "Metadate de bază pentru raster"
+
+#: ../gui/wxpython/menustrings.py:489
+msgid "Output basic information about a raster map layer."
+msgstr "Afișează informații de bază despre harta raster."
+
+#: ../gui/wxpython/menustrings.py:490
+msgid "Manage category information"
+msgstr "Gestionează categorii de informații"
+
+#: ../gui/wxpython/menustrings.py:491
+msgid "Manages category values and labels associated with user-specified raster map layers."
+msgstr "Gestionează categorii de valori și etichete asociate cu o hartă raster specificată de utilizator."
+
+#: ../gui/wxpython/menustrings.py:492
+msgid "General statistics"
+msgstr "Statistici generale"
+
+#: ../gui/wxpython/menustrings.py:493
+msgid "Generates area statistics for raster map layers."
+msgstr "Generează statistici pentru harta raster."
+
+#: ../gui/wxpython/menustrings.py:494
+msgid "Quantiles for large data sets"
+msgstr "Cuantile pentru seturile mari de date"
+
+#: ../gui/wxpython/menustrings.py:495
+msgid "Compute quantiles using two passes."
+msgstr "Calculează cuantile folosind două treceri."
+
+#: ../gui/wxpython/menustrings.py:496
+msgid "Range of category values"
+msgstr "Interval al valorilor"
+
+#: ../gui/wxpython/menustrings.py:497
+msgid "Prints terse list of category values found in a raster map layer."
+msgstr "Printează lista categoriilor de valori găsite în harta raster."
+
+#: ../gui/wxpython/menustrings.py:498
+msgid "Sum category values"
+msgstr "Suma valorilor"
+
+#: ../gui/wxpython/menustrings.py:499
+msgid "Sums up the raster cell values."
+msgstr "Însumează valorile celulelor raster."
+
+#: ../gui/wxpython/menustrings.py:500
+msgid "Sum area by raster map and category"
+msgstr "Sumă areal în funcție de harta raster și categorii"
+
+#: ../gui/wxpython/menustrings.py:501
+msgid "Reports statistics for raster map layers."
+msgstr "Raporturi de statistici pentru harta raster."
+
+#: ../gui/wxpython/menustrings.py:502
+msgid "Statistics for clumped cells"
+msgstr "Statistici pentru grupuri de celule"
+
+#: ../gui/wxpython/menustrings.py:503
+msgid "Calculates the volume of data \"clumps\", and (optionally) produces a GRASS vector points map containing the calculated centroids of these clumps."
+msgstr "Calculează volumul grupurilor de date și opțional produce hărți ale punctelor vectoriale GRASS care au calculat centroidul acestor grupuri."
+
+#: ../gui/wxpython/menustrings.py:504
+msgid "Total corrected area"
+msgstr "Areale totale corectate"
+
+#: ../gui/wxpython/menustrings.py:505
+msgid "Surface area estimation for rasters."
+msgstr "Estimarea arealului de suprafață pentru rastere."
+
+#: ../gui/wxpython/menustrings.py:506 ../gui/wxpython/lmgr/layertree.py:459
+msgid "Univariate raster statistics"
+msgstr "Statistici univariate pentru raster"
+
+#: ../gui/wxpython/menustrings.py:507
+msgid "Calculates univariate statistics from the non-null cells of a raster map."
+msgstr "Calculează statistici univariate din celule ne-nule ale hărții raster."
+
+#: ../gui/wxpython/menustrings.py:508
+msgid "Sample transects"
+msgstr "Exemple de transects"
+
+#: ../gui/wxpython/menustrings.py:509
+msgid "Outputs the raster map layer values lying on user-defined line(s)."
+msgstr "Afișează valorile stratului raster situate de-a lungul liniei definită de utilizator."
+
+#: ../gui/wxpython/menustrings.py:510
+msgid "Sample transects (bearing/distance)"
+msgstr "Exemple de transects (direcție/distanță)"
+
+#: ../gui/wxpython/menustrings.py:511
+msgid "Outputs raster map layer values lying along user defined transect line(s)."
+msgstr "Afișează valorile stratului raster situate de-a lungul liniei transect definită de utilizator."
+
+#: ../gui/wxpython/menustrings.py:512
+msgid "Covariance/correlation"
+msgstr "Covarianță/corelație"
+
+#: ../gui/wxpython/menustrings.py:513
+msgid "Outputs a covariance/correlation matrix for user-specified raster map layer(s)."
+msgstr "Crează matricea de covarianță/corelație pentru o hartă raster specificată de utilizator."
+
+#: ../gui/wxpython/menustrings.py:514
+msgid "Linear regression"
+msgstr "Regresie lineară"
+
+#: ../gui/wxpython/menustrings.py:515
+msgid "Calculates linear regression from two raster maps: y = a + b*x."
+msgstr "Calculează regresia lineară din două hărți raster: y = a + b*x."
+
+#: ../gui/wxpython/menustrings.py:516
+msgid "Mutual category occurrences"
+msgstr "Apariția reciprocă a categoriilor"
+
+#: ../gui/wxpython/menustrings.py:517
+msgid "Tabulates the mutual occurrence (coincidence) of categories for two raster map layers."
+msgstr "Cataloghează apariția reciprocă (coincidență) a categoriilor pentru două straturi raster."
+
+#: ../gui/wxpython/menustrings.py:518
+msgid "&Vector"
+msgstr "&Vector"
+
+#: ../gui/wxpython/menustrings.py:519
+msgid "Develop vector map"
+msgstr "Dezvoltă hartă vectorială"
+
+#: ../gui/wxpython/menustrings.py:521
+msgid "Create new empty vector map"
+msgstr "Crează o hartă vectorială goală"
+
+#: ../gui/wxpython/menustrings.py:522
+msgid "Digitize vector map using Tcl/Tk digitizer"
+msgstr "Digitizează o hartă vectorială folosind interfața Tcl/Tk"
+
+#: ../gui/wxpython/menustrings.py:523
+msgid "Interactive editing and digitization of vector maps."
+msgstr "Editarea și vectorizarea interactivă a hărților vectoriale."
+
+#: ../gui/wxpython/menustrings.py:524
+msgid "Edit vector map (non-interactively)"
+msgstr "Editează harta vectorială (neinteractiv)"
+
+#: ../gui/wxpython/menustrings.py:525
+msgid "Edits a vector map, allows adding, deleting and modifying selected vector features."
+msgstr "Editarea unei hărți vectoriale, permite adăugarea, ștergerea și modificarea trăsăturilor vectoriale selectate."
+
+#: ../gui/wxpython/menustrings.py:526
+msgid "Convert object types"
+msgstr "Convertește tipul de obiect"
+
+#: ../gui/wxpython/menustrings.py:527
+msgid "Change the type of geometry elements."
+msgstr "Schimbă tipul de geometrie a elementelor."
+
+#: ../gui/wxpython/menustrings.py:528
+msgid "Parallel lines"
+msgstr "Linii paralele"
+
+#: ../gui/wxpython/menustrings.py:529
+msgid "Creates parallel line to input vector lines."
+msgstr "Crează linie paralelă cu liniile vectorului de intrare."
+
+#: ../gui/wxpython/menustrings.py:530
+msgid "Dissolve boundaries"
+msgstr "Dizolvă limitele"
+
+#: ../gui/wxpython/menustrings.py:531
+msgid "Dissolves boundaries between adjacent areas sharing a common category number or attribute."
+msgstr "Se dizolvă limitele dintre arealele adiacente un număr comun de categorii sau atribute."
+
+#: ../gui/wxpython/menustrings.py:532
+msgid "Create 3D vector over raster"
+msgstr "Crează vector 3D peste raster "
+
+#: ../gui/wxpython/menustrings.py:533
+msgid "Converts vector map to 3D by sampling of elevation raster map."
+msgstr "Convertește harta vectorială 3D în funcție de harta raster de elevație."
+
+#: ../gui/wxpython/menustrings.py:534
+msgid "Extrude 3D vector map"
+msgstr "Extrudarea 3D  a hărții vectoriale"
+
+#: ../gui/wxpython/menustrings.py:535
+msgid "Extrudes flat vector object to 3D with defined height."
+msgstr "Extrudarea obiectului vectorial plat la 3D în funcție de înălțimea definită."
+
+#: ../gui/wxpython/menustrings.py:536
+msgid "Create labels"
+msgstr "Crează etichete"
+
+#: ../gui/wxpython/menustrings.py:537
+msgid "Creates paint labels for a vector map from attached attributes."
+msgstr "Crează etichete de culoare pentru harta vectorială în funcție de atribute."
+
+#: ../gui/wxpython/menustrings.py:538
+msgid "Create optimally placed labels"
+msgstr "Crează etichete plasate optim"
+
+#: ../gui/wxpython/menustrings.py:539
+msgid "Create optimally placed labels for vector map(s)"
+msgstr "Crează etichete plasate optim pe o hartă vectorială"
+
+#: ../gui/wxpython/menustrings.py:540
+msgid "Reposition vector map"
+msgstr "Repoziționează harta vectorială"
+
+#: ../gui/wxpython/menustrings.py:541
+msgid "Performs an affine transformation (shift, scale and rotate, or GPCs) on vector map."
+msgstr "Se efectuează o transformare afină (deplasare, scară și rotire, sau puncte de control) pe harta vectorială."
+
+#: ../gui/wxpython/menustrings.py:542
+msgid "Reproject vector map"
+msgstr "Reproiectarea hărții vectoriale"
+
+#: ../gui/wxpython/menustrings.py:543
+msgid "Re-projects a vector map from one location to the current location."
+msgstr "Reproiectează harta vectorială de la o locație la locația curentă."
+
+#: ../gui/wxpython/menustrings.py:545
+msgid "Updates vector map metadata."
+msgstr "Actualizări de metadate a hărții vectoriale."
+
+#: ../gui/wxpython/menustrings.py:546
+msgid "Topology maintenance"
+msgstr "Topologie de întreținere"
+
+#: ../gui/wxpython/menustrings.py:547
+msgid "Create or rebuild topology"
+msgstr "Crează sau reconstruiește topologia"
+
+#: ../gui/wxpython/menustrings.py:548
+msgid "Creates topology for GRASS vector map."
+msgstr "Crează topologie pentru harta vectorială GRASS."
+
+#: ../gui/wxpython/menustrings.py:549
+msgid "Rebuild topology on all vector maps"
+msgstr "Reconstruiește topologie pentru toate hărțile vectoriale"
+
+#: ../gui/wxpython/menustrings.py:550
+msgid "Rebuilds topology on all vector maps in the current mapset."
+msgstr "Reconstruiește topologie pentru toate hărțile vectoriale din mapset-ul curent."
+
+#: ../gui/wxpython/menustrings.py:551
+msgid "Build polylines"
+msgstr "Construiește polinii"
+
+#: ../gui/wxpython/menustrings.py:552
+msgid "Builds polylines from lines or boundaries."
+msgstr "Construiește polinii din linii sau limite."
+
+#: ../gui/wxpython/menustrings.py:553
+msgid "Split lines"
+msgstr "Desparte liniile"
+
+#: ../gui/wxpython/menustrings.py:554
+msgid "Split lines to shorter segments."
+msgstr "Desparte liniile în segmente mai scurte."
+
+#: ../gui/wxpython/menustrings.py:555
+msgid "Split polylines"
+msgstr "Desparte poliliniile"
+
+#: ../gui/wxpython/menustrings.py:556
+msgid "Creates points/segments from input vector lines and positions."
+msgstr "Crează puncte/segmente din liniile vectoriale de intrare și poziții."
+
+#: ../gui/wxpython/menustrings.py:557
+msgid "Clean vector map"
+msgstr "Curăță harta vectorială"
+
+#: ../gui/wxpython/menustrings.py:558
+msgid "Toolset for cleaning topology of vector map."
+msgstr "Set de intrumente pentru curățarea topologiei hărții vectoriale."
+
+#: ../gui/wxpython/menustrings.py:559
+msgid "Smooth or simplify"
+msgstr "Netezire sau simplificare"
+
+#: ../gui/wxpython/menustrings.py:560
+msgid "Vector based generalization."
+msgstr "Vectori bazați pe generalizare."
+
+#: ../gui/wxpython/menustrings.py:561
+msgid "Add centroids"
+msgstr "Adăugă centroizi"
+
+#: ../gui/wxpython/menustrings.py:562
+msgid "Adds missing centroids to closed boundaries."
+msgstr "Adaugă centroizi pentru a închide limitele."
+
+#: ../gui/wxpython/menustrings.py:565
+msgid "Set color rules for features in a vector using a numeric attribute column."
+msgstr "Stabilește reguli de culoare a trasăturilor vectoriale folosind o coloană de atribute numerice."
+
+#: ../gui/wxpython/menustrings.py:567
+msgid "Interactive management of vector color tables."
+msgstr "Gestionează interactiv tabela de culori pentru vector."
+
+#: ../gui/wxpython/menustrings.py:568
+msgid "Query vector map"
+msgstr "Interoghează harta vectorială"
+
+#: ../gui/wxpython/menustrings.py:569
+msgid "Query with coordinate(s)"
+msgstr "Interoghează cu coordonate"
+
+#: ../gui/wxpython/menustrings.py:570
+msgid "Queries a vector map layer at given locations."
+msgstr "Interoghează harta vectorială din anumite locații."
+
+#: ../gui/wxpython/menustrings.py:571 ../gui/wxpython/menustrings.py:823
+msgid "Query vector attribute data"
+msgstr "Interoghează data de atribut vectorială"
+
+#: ../gui/wxpython/menustrings.py:572 ../gui/wxpython/menustrings.py:824
+msgid "Prints vector map attributes."
+msgstr "Printează aytibutele hărții vectoriale."
+
+#: ../gui/wxpython/menustrings.py:573
+msgid "Feature selection"
+msgstr "Selectează trăsătura"
+
+#: ../gui/wxpython/menustrings.py:574
+msgid "Attribute query"
+msgstr "Interoghează atribute"
+
+#: ../gui/wxpython/menustrings.py:575
+msgid "Selects vector objects from an existing vector map and creates a new map containing only the selected objects."
+msgstr "Selectează obiectele vectoriale dintr-o hartă vectorială existentă și crează o hartă nouă care să conțină doar obiectele selectate."
+
+#: ../gui/wxpython/menustrings.py:576
+msgid "Spatial query"
+msgstr "Interoghează spațial"
+
+#: ../gui/wxpython/menustrings.py:577
+msgid "Selects features from vector map (A) by features from other vector map (B)."
+msgstr "Selectează trăsături din harta vectorială (A) în funcție de trăsăturile din harta vectorială (B)."
+
+#: ../gui/wxpython/menustrings.py:587
+msgid "Buffer vectors"
+msgstr "Buffer pentru vectori"
+
+#: ../gui/wxpython/menustrings.py:588
+msgid "Creates a buffer around features of given type (areas must contain centroid)."
+msgstr "Crează o zonă tampon în jurul trăsăturii pentru un tip dat (arealele trebuie să conțină centroizi)."
+
+#: ../gui/wxpython/menustrings.py:589
+msgid "Lidar analysis"
+msgstr "Analiză Lidar"
+
+#: ../gui/wxpython/menustrings.py:590
+msgid "Detect edges"
+msgstr "Detectează marginile"
+
+#: ../gui/wxpython/menustrings.py:591
+msgid "Detects the object's edges from a LIDAR data set."
+msgstr "Detectează marginile obiectului dintr-un set de date LIDAR."
+
+#: ../gui/wxpython/menustrings.py:592
+msgid "Detect interiors"
+msgstr "Detectează interioare"
+
+#: ../gui/wxpython/menustrings.py:593
+msgid "Building contour determination and Region Growing algorithm for determining the building inside"
+msgstr "Determinarea conturului de construcție și algoritmul Regiunii de Creștere pentru determinarea interiorului clădirii"
+
+#: ../gui/wxpython/menustrings.py:594
+msgid "Correct and reclassify objects"
+msgstr "Corectează și reclasifică obiectele"
+
+#: ../gui/wxpython/menustrings.py:595
+msgid "Correction of the v.lidar.growing output. It is the last of the three algorithms for LIDAR filtering."
+msgstr "Corectarea de ieșire cu v.lidar.growing. Acesta este ultimul din cei trei algoritmi de filtrare pentru LIDAR."
+
+#: ../gui/wxpython/menustrings.py:596
+msgid "Linear referencing"
+msgstr "Referențiere lineară"
+
+#: ../gui/wxpython/menustrings.py:597
+msgid "Create LRS"
+msgstr "Crează LRS"
+
+#: ../gui/wxpython/menustrings.py:598
+msgid "Creates Linear Reference System"
+msgstr "Crează Sistem de Referință Linear"
+
+#: ../gui/wxpython/menustrings.py:599
+msgid "Create stationing"
+msgstr "Crează staționare"
+
+#: ../gui/wxpython/menustrings.py:600
+msgid "Creates stationing from input lines, and linear reference system"
+msgstr "Crează staționare pentru liniile de intrare, și sistem de referință linear"
+
+#: ../gui/wxpython/menustrings.py:601
+msgid "Create points/segments"
+msgstr "Crează puncte/segmente"
+
+#: ../gui/wxpython/menustrings.py:602
+msgid "Creates points/segments from input lines, linear reference system and positions read from stdin or a file."
+msgstr "Crează puncte/segmente din linii de intrare, sistem de referință linear și poziții citite din stdin sau din fișier."
+
+#: ../gui/wxpython/menustrings.py:603
+msgid "Find line id and offset"
+msgstr "Găsește id-ul liniei și offset"
+
+#: ../gui/wxpython/menustrings.py:604
+msgid "Finds line id and real km+offset for given points in vector map using linear reference system."
+msgstr "Găsește id-ul liniei și km real+offset pentru anumite puncte din harta vectorială folosind sistemul de referință linear."
+
+#: ../gui/wxpython/menustrings.py:605
+msgid "Nearest features"
+msgstr "Cele mai apropiate trăsături"
+
+#: ../gui/wxpython/menustrings.py:606
+msgid "Finds the nearest element in vector map 'to' for elements in vector map 'from'."
+msgstr "Găsește cele mai apropiate elemente din harta vectorială 'to' cu elementele din harta vectorială 'from'."
+
+#: ../gui/wxpython/menustrings.py:607
+msgid "Network analysis"
+msgstr "Analiza rețelei"
+
+#: ../gui/wxpython/menustrings.py:608
+msgid "Network maintenance"
+msgstr "Întreșinerea rețelei"
+
+#: ../gui/wxpython/menustrings.py:609
+msgid "Performs network maintenance."
+msgstr "Efectuează întreținerea rețelei."
+
+#: ../gui/wxpython/menustrings.py:610
+msgid "Allocate subnets"
+msgstr "Alocare de subrețele"
+
+#: ../gui/wxpython/menustrings.py:611
+msgid "Allocate subnets for nearest centres (direction from centre)."
+msgstr "Alocarea subrețelelor pentru cei mai apropiați centrii (direcție dinspre centru)."
+
+#: ../gui/wxpython/menustrings.py:612
+msgid "Split net"
+msgstr "Desparte rețea"
+
+#: ../gui/wxpython/menustrings.py:613
+msgid "Splits net by cost isolines."
+msgstr "Desparte rețea în funcție de costul izoliniilor."
+
+#: ../gui/wxpython/menustrings.py:614
+msgid "Shortest path"
+msgstr "Calea cea mai scurtă"
+
+#: ../gui/wxpython/menustrings.py:615
+msgid "Finds shortest path on vector network."
+msgstr "Găsește calea cea mai scurtă a unei rețele vectoriale."
+
+#: ../gui/wxpython/menustrings.py:616
+msgid "Shortest path for sets of features"
+msgstr "Calea cea mai scurtă pentru seturi de trăsături"
+
+#: ../gui/wxpython/menustrings.py:617
+msgid "Computes shortest distance via the network between the given sets of features."
+msgstr "Calculează distanța cea mai scurtă prin intermediul rețelei dintre anumite seturi de trăsături."
+
+#: ../gui/wxpython/menustrings.py:618
+msgid "Shortest path using timetables"
+msgstr "Calea cea mai scurtă folosind orar"
+
+#: ../gui/wxpython/menustrings.py:619
+msgid "Finds shortest path using timetables."
+msgstr "Găsește calea cea mai scurtă folosind orar."
+
+#: ../gui/wxpython/menustrings.py:620
+msgid "Shortest path for all pairs"
+msgstr "Calea cea mai scurtă pentru toate perechile"
+
+#: ../gui/wxpython/menustrings.py:621
+msgid "Computes the shortest path between all pairs of nodes in the network."
+msgstr "Calculează calea cea mai scurtă dintre toate perechile de noduri din rețea."
+
+#: ../gui/wxpython/menustrings.py:622
+msgid "Visibility network"
+msgstr "Vizibilitatea rețelei"
+
+#: ../gui/wxpython/menustrings.py:623
+msgid "Visibility graph construction."
+msgstr "Construcția graph-ului de vizibilitate."
+
+#: ../gui/wxpython/menustrings.py:624
+msgid "Bridges and articulation points"
+msgstr "Poduri și puncte de articulație"
+
+#: ../gui/wxpython/menustrings.py:625
+msgid "Computes bridges and articulation points in the network."
+msgstr "Calculează podurile și punctele de articulație din rețea."
+
+#: ../gui/wxpython/menustrings.py:626
+msgid "Maximum flow"
+msgstr "Fluxul maxim"
+
+#: ../gui/wxpython/menustrings.py:627
+msgid "Computes the maximum flow between two sets of nodes in the network."
+msgstr "Calculează fluxul maxim dintre două seturi de noduri din rețea."
+
+#: ../gui/wxpython/menustrings.py:628
+msgid "Vertex connectivity"
+msgstr "Conectivitatea vertex-ului"
+
+#: ../gui/wxpython/menustrings.py:629
+msgid "Computes vertex connectivity between two sets of nodes in the network."
+msgstr "Calculează conectivitatea punctelor de inflexiune dintre două seturi de noduri din rețea."
+
+#: ../gui/wxpython/menustrings.py:630
+msgid "Components"
+msgstr "Componente"
+
+#: ../gui/wxpython/menustrings.py:631
+msgid "Computes strongly and weakly connected components in the network."
+msgstr "Calculează componentele cele mai puternic și cele mai slab conectate din rețea."
+
+#: ../gui/wxpython/menustrings.py:632
+msgid "Centrality"
+msgstr "Centralitate"
+
+#: ../gui/wxpython/menustrings.py:633
+msgid "Computes degree, centrality, betweeness, closeness and eigenvector centrality measures in the network."
+msgstr "Calculează gradele, centralitatea, aproprierea și vectorii eigen din rețea."
+
+#: ../gui/wxpython/menustrings.py:634
+msgid "Steiner tree"
+msgstr "Arborele Steiner"
+
+#: ../gui/wxpython/menustrings.py:635
+msgid "Create Steiner tree for the network and given terminals"
+msgstr "Creaze un arbore Steiner pentru rețea și anumite terminale"
+
+#: ../gui/wxpython/menustrings.py:636
+msgid "Minimum spanning tree"
+msgstr "Întinderea minimă a arborelui"
+
+#: ../gui/wxpython/menustrings.py:637
+msgid "Computes minimum spanning tree for the network."
+msgstr "Calculează întinderea minimă a arborelui pentru rețea."
+
+#: ../gui/wxpython/menustrings.py:638
+msgid "Traveling salesman analysis"
+msgstr "Analiză de tip 'vânzător călător'"
+
+#: ../gui/wxpython/menustrings.py:639
+msgid "Creates a cycle connecting given nodes (Traveling salesman problem)."
+msgstr "Crearea de ciclu conectat la anumite noduri (Problema 'vânzătorului călător')."
+
+#: ../gui/wxpython/menustrings.py:640 ../gui/wxpython/menustrings.py:641
+msgid "Overlay vector maps"
+msgstr "Suprapunerea hărții vectoriale"
+
+#: ../gui/wxpython/menustrings.py:642
+msgid "Overlays two vector maps."
+msgstr "Suprapunerea două hărți vectoriale."
+
+#: ../gui/wxpython/menustrings.py:643
+msgid "Patch vector maps"
+msgstr "Combină harta vectorială"
+
+#: ../gui/wxpython/menustrings.py:644
+msgid "Create a new vector map layer by combining other vector map layers."
+msgstr "Crează o hartă vectorială prin combinarea altor hărți vectoriale."
+
+#: ../gui/wxpython/menustrings.py:645
+msgid "Change attributes"
+msgstr "Schimbă atributele"
+
+#: ../gui/wxpython/menustrings.py:646
+msgid "Manage or report categories"
+msgstr "Gestionează sau raportează categoriile"
+
+#: ../gui/wxpython/menustrings.py:647
+msgid "Attach, delete or report vector categories to map geometry."
+msgstr "Atașează, șterge sau raportează categoriile vectoriale din harta geometrică."
+
+#: ../gui/wxpython/menustrings.py:649
+msgid "Changes vector category values for an existing vector map according to results of SQL queries or a value in attribute table column."
+msgstr "Schimbă valorile de categorie vectorială pentru o hartă vectorială existentă în funcție de rezultatele interogărilor SQL sau de valorile din coloana de atribute din tabel."
+
+#: ../gui/wxpython/menustrings.py:651
+msgid "Update area attributes from raster"
+msgstr "Actualizează atributele zonei dintr-un raster"
+
+#: ../gui/wxpython/menustrings.py:652
+msgid "Calculates univariate statistics from a raster map based on vector polygons and uploads statistics to new attribute columns."
+msgstr "Calculează statistici univariate dintr-o hartă raster bazată pe poligoane vectoriale și încarcă statisticile în coloane noi de atribute."
+
+#: ../gui/wxpython/menustrings.py:653
+msgid "Update point attributes from areas"
+msgstr "Actualizează atributele punctelor din areale"
+
+#: ../gui/wxpython/menustrings.py:654
+msgid "Uploads vector values at positions of vector points to the table."
+msgstr "Încarcă valorile vectorilor în pozițiile punctelor vectoriale din tabel."
+
+#: ../gui/wxpython/menustrings.py:655
+msgid "Update database values from vector"
+msgstr "Încarcă valorile bazei de date dintr-un vector"
+
+#: ../gui/wxpython/menustrings.py:656
+msgid "Populates database values from vector features."
+msgstr "Populează valorile bazei de date din trăsăturile vectoriale."
+
+#: ../gui/wxpython/menustrings.py:657
+msgid "Sample raster maps at point locations"
+msgstr "Eșantionează harta raster în punctele locației"
+
+#: ../gui/wxpython/menustrings.py:658
+msgid "Uploads raster values at positions of vector points to the table."
+msgstr "Încarcă valorile rasterului la poziția punctelor vectoriale din tabel."
+
+#: ../gui/wxpython/menustrings.py:659
+msgid "Sample raster neighborhood around points"
+msgstr "Eșantionează rasterul în jurul punctelor vecine"
+
+#: ../gui/wxpython/menustrings.py:660
+msgid "Samples a raster map at vector point locations."
+msgstr "Eșantionează harta raster la locația punctelor vectoriale."
+
+#: ../gui/wxpython/menustrings.py:661
+msgid "Generate area for current region"
+msgstr "Generează areal pentru regiunea curentă"
+
+#: ../gui/wxpython/menustrings.py:662
+msgid "Creates a vector polygon from the current region extent."
+msgstr "Crează poligon vectorial în funcție de extinderea regiunii curente."
+
+#: ../gui/wxpython/menustrings.py:663
+msgid "Generate areas from points"
+msgstr "Generează areal din puncte"
+
+#: ../gui/wxpython/menustrings.py:664
+msgid "Convex hull"
+msgstr "ÃŽnveliÈ™ convex"
+
+#: ../gui/wxpython/menustrings.py:665
+msgid "Produces a convex hull for a given vector map."
+msgstr "Produce un înveliș convex pentru o anumită hartă vectorială."
+
+#: ../gui/wxpython/menustrings.py:666
+msgid "Delaunay triangles"
+msgstr "Triunghiuri Delaunay"
+
+#: ../gui/wxpython/menustrings.py:667
+msgid "Creates a Delaunay triangulation from an input vector map containing points or centroids."
+msgstr "Crează triangulația Delaunay dintr-o hartă vectorială de intrare care conține puncte sau centrozi."
+
+#: ../gui/wxpython/menustrings.py:668
+msgid "Voronoi diagram/Thiessen polygons"
+msgstr "Diagrama Voronoi/Poligoane Thiessen"
+
+#: ../gui/wxpython/menustrings.py:669
+msgid "Creates a Voronoi diagram from an input vector map containing points or centroids."
+msgstr "Crează diagrama Voronoi dintr-o hartă vectorială de intrare care conține puncte sau centrozi."
+
+#: ../gui/wxpython/menustrings.py:670
+msgid "Generate grid"
+msgstr "Generează grid"
+
+#: ../gui/wxpython/menustrings.py:671
+msgid "Creates a GRASS vector map of a user-defined grid."
+msgstr "Crează o hartă vectorială GRASS pentru gridul definit de utilizator."
+
+#: ../gui/wxpython/menustrings.py:672
+msgid "Generate points"
+msgstr "Generează puncte"
+
+#: ../gui/wxpython/menustrings.py:673
+msgid "Generate from database"
+msgstr "Generează din baza de date"
+
+#: ../gui/wxpython/menustrings.py:674
+msgid "Creates new vector (points) map from database table containing coordinates."
+msgstr "Crează hartă vectorială nouă (puncte) din tabelul bazei de date care conține coordonate."
+
+#: ../gui/wxpython/menustrings.py:675
+msgid "Generate points along lines"
+msgstr "Generează puncte de-a lungul liniilor"
+
+#: ../gui/wxpython/menustrings.py:676
+msgid "Create points along input lines in new vector with 2 layers."
+msgstr "Crează puncte de-a lungul liniilor de intrare în vector nou cu 2 straturi."
+
+#: ../gui/wxpython/menustrings.py:677
+msgid "Generate random points"
+msgstr "Generează puncte aleatorii"
+
+#: ../gui/wxpython/menustrings.py:678
+msgid "Randomly generate a 2D/3D vector points map."
+msgstr "Generarea aleatorie a punctelor 2D/3D pe harta vectorială."
+
+#: ../gui/wxpython/menustrings.py:679
+msgid "Perturb points"
+msgstr "Puncte pertubate"
+
+#: ../gui/wxpython/menustrings.py:680
+msgid "Random location perturbations of GRASS vector points"
+msgstr "Locația aleatorie a punctelor vectoriale perturbate GRASS"
+
+#: ../gui/wxpython/menustrings.py:681
+msgid "Remove outliers in point sets"
+msgstr "Elimină seturile de puncte aberante"
+
+#: ../gui/wxpython/menustrings.py:682
+msgid "Removes outliers from vector point data."
+msgstr "Elimină datele aberante din punctele vectoriale."
+
+#: ../gui/wxpython/menustrings.py:683
+msgid "Test/training point sets"
+msgstr "Testare/pregătire seturi de puncte"
+
+#: ../gui/wxpython/menustrings.py:684
+msgid "Randomly partition points into test/train sets."
+msgstr "Puncte de partiție aleatoriu în seturile test/pregătire."
+
+#: ../gui/wxpython/menustrings.py:685
+msgid "Reports and statistics"
+msgstr "Rapoarte și statistici"
+
+#: ../gui/wxpython/menustrings.py:686
+msgid "Basic vector metadata"
+msgstr "Metadata vectorului de bază"
+
+#: ../gui/wxpython/menustrings.py:687
+msgid "Outputs basic information about a user-specified vector map."
+msgstr "Transmite informații de bază despre harta vectorială specificată de utilizator."
+
+#: ../gui/wxpython/menustrings.py:688
+msgid "Classify attribute data"
+msgstr "Clasifică datele de atribut"
+
+#: ../gui/wxpython/menustrings.py:689
+msgid "Classifies attribute data, e.g. for thematic mapping"
+msgstr "Clasifică datele de atribut, de ex. pentru cartografierea tematică"
+
+#: ../gui/wxpython/menustrings.py:690
+msgid "Report topology by category"
+msgstr "Raport topologie în funcție de categorie"
+
+#: ../gui/wxpython/menustrings.py:691
+msgid "Reports geometry statistics for vectors."
+msgstr "Raportează statistici geometrice pentru vectori."
+
+#: ../gui/wxpython/menustrings.py:692
+msgid "Univariate attribute statistics for points"
+msgstr "Statistici univariate de atribute pentru puncte"
+
+#: ../gui/wxpython/menustrings.py:693
+msgid "Calculates univariate statistics for attribute. Variance and standard deviation is calculated only for points if specified."
+msgstr "Calculează statistici univariate pentru atribute. Varianța și deviația standard sunt calculate doar pentru punctele specificate."
+
+#: ../gui/wxpython/menustrings.py:694
+msgid "Univariate statistics for attribute columns"
+msgstr "Statistici univariate pentru coloanele de atribute"
+
+#: ../gui/wxpython/menustrings.py:695
+msgid "Calculates univariate statistics on selected table column for a GRASS vector map."
+msgstr "Calculează statistici univariate pe coloana tabelului selectat pentru o hartă vectorială GRASS."
+
+#: ../gui/wxpython/menustrings.py:696
+msgid "Quadrat indices"
+msgstr "Indicii Quadrat"
+
+#: ../gui/wxpython/menustrings.py:697
+msgid "Indices for quadrat counts of sites lists."
+msgstr "Indicii pentru totalul quadrat a siturile din liste."
+
+#: ../gui/wxpython/menustrings.py:698
+msgid "Test normality"
+msgstr "Test de normalitate"
+
+#: ../gui/wxpython/menustrings.py:699
+msgid "Tests for normality for points."
+msgstr "Test pentru normalitatea punctelor."
+
+#: ../gui/wxpython/menustrings.py:700
+msgid "&Imagery"
+msgstr "&Imagini"
+
+#: ../gui/wxpython/menustrings.py:701
+msgid "Develop images and groups"
+msgstr "Dezvoltă imagini și grupuri"
+
+#: ../gui/wxpython/menustrings.py:702
+msgid "Create/edit group"
+msgstr "Crează/editează grup"
+
+#: ../gui/wxpython/menustrings.py:703
+msgid "Creates, edits, and lists groups of imagery files."
+msgstr "Crează, editează și listează grupurile fișierelor de imagine."
+
+#: ../gui/wxpython/menustrings.py:704
+msgid "Target group"
+msgstr "Grupul țintă"
+
+#: ../gui/wxpython/menustrings.py:705
+msgid "Targets an imagery group to a GRASS location and mapset."
+msgstr "Vizarea grupului de imagini pentru locația și mapsetul GRASS."
+
+#: ../gui/wxpython/menustrings.py:706
+msgid "Mosaic images"
+msgstr "Mozaic de imagini"
+
+#: ../gui/wxpython/menustrings.py:707
+msgid "Mosaics up to 4 images and extends colormap; creates map *.mosaic"
+msgstr "Mozaic de până la 4 imagini și extiderea hărții de culoare; crează hartă *.mozaic"
+
+#: ../gui/wxpython/menustrings.py:708
+msgid "Manage image colors"
+msgstr "Gestionează culorile imaginii"
+
+#: ../gui/wxpython/menustrings.py:709
+msgid "Color balance for RGB"
+msgstr "Balans de culoare pentru RGB"
+
+#: ../gui/wxpython/menustrings.py:710
+msgid "Performs auto-balancing of colors for LANDSAT images."
+msgstr "Efectuează balansul-auto a culorilor pentru imaginile LANDSAT."
+
+#: ../gui/wxpython/menustrings.py:711
+msgid "HIS to RGB"
+msgstr "HIS - RGB"
+
+#: ../gui/wxpython/menustrings.py:712
+msgid "Transforms raster maps from HIS (Hue-Intensity-Saturation) color space to RGB (Red-Green-Blue) color space."
+msgstr "Transformă harta raster din sistemul HIS (Valoare-Intensitate-Saturație) în sistemul de culori RGB (Roșu-Verde-Albastru)."
+
+#: ../gui/wxpython/menustrings.py:714
+msgid "Transforms raster maps from RGB (Red-Green-Blue) color space to HIS (Hue-Intensity-Saturation) color space."
+msgstr "Transformă harta raster din sistemul de culori RGB (Roșu-Verde-Albastru) în sistemul HIS (Valoare-Intensitate-Saturație)."
+
+#: ../gui/wxpython/menustrings.py:715
+msgid "Rectify image or raster"
+msgstr "Rectifică imagine sau raster"
+
+#: ../gui/wxpython/menustrings.py:716
+msgid "Rectifies an image by computing a coordinate transformation for each pixel in the image based on the control points."
+msgstr "Rectifică o imagine în funcție de calculul transformării coordonatelor fiecărui pixel din imagine, pe baza punctelor de control."
+
+#: ../gui/wxpython/menustrings.py:717 ../gui/wxpython/lmgr/layertree.py:457
+msgid "Histogram"
+msgstr "Histogramă"
+
+#: ../gui/wxpython/menustrings.py:718
+msgid "Generate histogram of image"
+msgstr "Generează histograma imaginii"
+
+#: ../gui/wxpython/menustrings.py:719
+msgid "Spectral response"
+msgstr "Răspunsul spectral"
+
+#: ../gui/wxpython/menustrings.py:720
+msgid "Displays spectral response at user specified locations in group or images."
+msgstr "Afișează răspunsul spectral în locațiile specificate de utilizator din grup sau imagini."
+
+#: ../gui/wxpython/menustrings.py:721
+msgid "Brovey sharpening"
+msgstr "Transformarea Brovey"
+
+#: ../gui/wxpython/menustrings.py:722
+msgid "Brovey transform to merge multispectral and high-res panchromatic channels"
+msgstr "Transformarea Brovey pentru a fuziona canele multispectral și pancromatic de rezoluție înaltă"
+
+#: ../gui/wxpython/menustrings.py:723
+msgid "Classify image"
+msgstr "Clasifică imaginea"
+
+#: ../gui/wxpython/menustrings.py:724
+msgid "Clustering input for unsupervised classification"
+msgstr "Gruparea pixelilor de intrare pentru clasificarea nesupervizată"
+
+#: ../gui/wxpython/menustrings.py:725
+msgid "Generates spectral signatures for land cover types in an image using a clustering algorithm."
+msgstr "Generează signaturi spectrale pentru tipurile de acoperire a terenului intr-o imagine folosind un algoritm de grupare."
+
+#: ../gui/wxpython/menustrings.py:726
+msgid "Input for supervised MLC"
+msgstr "Intrare pentru MLC supervizată"
+
+#: ../gui/wxpython/menustrings.py:727
+msgid "Generates statistics for i.maxlik from raster map."
+msgstr "Generează statistici pentru i.maxlik dintr-o hartă raster."
+
+#: ../gui/wxpython/menustrings.py:728
+msgid "Maximum likelihood classification (MLC)"
+msgstr "Algoritmul Gaussian de asemănare maximă"
+
+#: ../gui/wxpython/menustrings.py:729
+msgid "Classifies the cell spectral reflectances in imagery data."
+msgstr "Clasifică celule de reflectanță spectrală dintr-o imagine."
+
+#: ../gui/wxpython/menustrings.py:730
+msgid "Interactive input for supervised classification (requires Xterm)"
+msgstr "Intrare interactivă pentru clasificarea superfivată (necesită Xtermeni)"
+
+#: ../gui/wxpython/menustrings.py:731
+msgid "Generates spectral signatures for an image by allowing the user to outline regions of interest."
+msgstr "Generează signaturi spectrale pentru o imagine, permițând utilizatorului să evidențieze regiunile de interes."
+
+#: ../gui/wxpython/menustrings.py:732
+msgid "Input for supervised SMAP"
+msgstr "Intrare pentru SMAP supervizată"
+
+#: ../gui/wxpython/menustrings.py:733
+msgid "Generates statistics for i.smap from raster map."
+msgstr "Generează statistici pentru i.smap dintr-o hartă raster."
+
+#: ../gui/wxpython/menustrings.py:734
+msgid "Sequential maximum a posteriori classification (SMAP)"
+msgstr "Clasificarea maximă secvențială posterioară (SMAP)"
+
+#: ../gui/wxpython/menustrings.py:735
+msgid "Performs contextual image classification using sequential maximum a posteriori (SMAP) estimation."
+msgstr "Efectuează o clasificare contextuală a imagii folosind estimarea maximă secvențială posterioară (SMAP)."
+
+#: ../gui/wxpython/menustrings.py:736
+msgid "Filter image"
+msgstr "Filtru de imagine"
+
+#: ../gui/wxpython/menustrings.py:737
+msgid "Edge detection"
+msgstr "Detectarea marginilor"
+
+#: ../gui/wxpython/menustrings.py:738
+msgid "Zero-crossing \"edge detection\" raster function for image processing."
+msgstr "Funcția raster \"detectarea marginilor\" fără trecere pentru procesarea imaginii."
+
+#: ../gui/wxpython/menustrings.py:739
+msgid "Matrix/convolving filter"
+msgstr "Matricea/Filtrul de convoluție"
+
+#: ../gui/wxpython/menustrings.py:740
+msgid "Performs raster map matrix filter."
+msgstr "Aplică un filtru de matrice hărții raster."
+
+#: ../gui/wxpython/menustrings.py:741
+msgid "Transform image"
+msgstr "Transformarea imaginii"
+
+#: ../gui/wxpython/menustrings.py:742
+msgid "Canonical correlation"
+msgstr "Corelație canonică"
+
+#: ../gui/wxpython/menustrings.py:743
+msgid "Canonical components analysis (cca) program for image processing."
+msgstr "Programul de analiză canonică a componentelor (cca) pentru procesarea imaginilor."
+
+#: ../gui/wxpython/menustrings.py:744
+msgid "Principal components"
+msgstr "Componente principale"
+
+#: ../gui/wxpython/menustrings.py:745
+msgid "Principal components analysis (PCA) for image processing."
+msgstr "Analiza componentelor principale (PCA) pentru procesarea imaginii."
+
+#: ../gui/wxpython/menustrings.py:746
+msgid "Fast Fourier"
+msgstr "Fourier Rapid"
+
+#: ../gui/wxpython/menustrings.py:747
+msgid "Fast Fourier Transform (FFT) for image processing."
+msgstr "Transformarea Fourier Rapid (FFT) pentru procesarea imaginii."
+
+#: ../gui/wxpython/menustrings.py:748
+msgid "Inverse Fast Fourier"
+msgstr "Invers Fourier Rapid"
+
+#: ../gui/wxpython/menustrings.py:749
+msgid "Inverse Fast Fourier Transform (IFFT) for image processing."
+msgstr "Transformarea Invers Fourier Rapid (IFFT) pentru procesarea imaginii."
+
+#: ../gui/wxpython/menustrings.py:750
+msgid "Satellite images tools"
+msgstr "Intrumentele imaginilor satelitare"
+
+#: ../gui/wxpython/menustrings.py:751
+msgid "Landsat DN to radiance/reflectance"
+msgstr "Număr digital Landsat în radianță/reflectanță"
+
+#: ../gui/wxpython/menustrings.py:752
+msgid "Calculates top-of-atmosphere radiance or reflectance and temperature for Landsat MSS/TM/ETM+."
+msgstr "Calculează radianța sau reflectanța atmosferei înalte și temperatura pentru Landsat MSS/TM/ETM+."
+
+#: ../gui/wxpython/menustrings.py:753
+msgid "Landsat cloud cover assessment"
+msgstr "Aprecierea acoperiri cu nori a imaginii Landsat"
+
+#: ../gui/wxpython/menustrings.py:754
+msgid "Performs Landsat TM/ETM+ Automatic Cloud Cover Assessment (ACCA)."
+msgstr "Evaluează automat acoperirea cu nori a imaginilor Landsat TM/ETM+ (ACCA)."
+
+#: ../gui/wxpython/menustrings.py:755
+msgid "Modis quality control"
+msgstr "Control de calitate Modis"
+
+#: ../gui/wxpython/menustrings.py:756
+msgid "Extracts quality control parameters from Modis QC layers."
+msgstr "Extrage parametrii de control de calitate din stratele QC Modis."
+
+#: ../gui/wxpython/menustrings.py:757
+msgid "Atmospheric correction"
+msgstr "Corecție atmosferică"
+
+#: ../gui/wxpython/menustrings.py:758
+msgid "Performs atmospheric correction using the 6S algorithm."
+msgstr "Efectuează corecție atmosferică folosind algoritmul 6S."
+
+#: ../gui/wxpython/menustrings.py:759
+msgid "Topographic correction"
+msgstr "Corecție topografică"
+
+#: ../gui/wxpython/menustrings.py:760
+msgid "Computes topographic correction of reflectance."
+msgstr "Calculează corecția topografică a reflectanței."
+
+#: ../gui/wxpython/menustrings.py:761
+msgid "Satellite images products"
+msgstr "Produse ale imaginilor satelitare"
+
+#: ../gui/wxpython/menustrings.py:762
+msgid "Tasseled cap vegetation index"
+msgstr "Indicele de vegetație Tasseled cap"
+
+#: ../gui/wxpython/menustrings.py:763
+msgid "Tasseled Cap (Kauth Thomas) transformation for LANDSAT-TM data"
+msgstr "Transformarea Tasseled Cap (Kauth Thomas) pentru datele LANDSAT-TM"
+
+#: ../gui/wxpython/menustrings.py:765
+msgid "Bit pattern comparison "
+msgstr "Comparația model 'parte cu parte'"
+
+#: ../gui/wxpython/menustrings.py:766
+msgid "Compares bit patterns with a raster map."
+msgstr "Compară modelul 'parte cu parte' cu harta raster."
+
+#: ../gui/wxpython/menustrings.py:767
+msgid "Kappa analysis"
+msgstr "Analiza Kappa"
+
+#: ../gui/wxpython/menustrings.py:768
+msgid "Calculate error matrix and kappa parameter for accuracy assessment of classification result."
+msgstr "Calculează eroare matricii și parametrul kappa pentru evaluarea acurateții rezultatului de clasificare."
+
+#: ../gui/wxpython/menustrings.py:769
+msgid "OIF for LandSat TM"
+msgstr "OIF pentru LandSat TM"
+
+#: ../gui/wxpython/menustrings.py:770
+msgid "Calculates Optimum-Index-Factor table for LANDSAT TM bands 1-5, & 7"
+msgstr "Calculează Indicele de Factor Optim pentru benzile 1-5,  & 7 LANDSAT TM"
+
+#: ../gui/wxpython/menustrings.py:771
+msgid "V&olumes"
+msgstr "V&olume"
+
+#: ../gui/wxpython/menustrings.py:772
+msgid "Develop volumes"
+msgstr "Dezvoltare volume"
+
+#: ../gui/wxpython/menustrings.py:773
+msgid "Manage 3D NULL values"
+msgstr "Gestionează valorile 3D nule"
+
+#: ../gui/wxpython/menustrings.py:774
+msgid "Explicitly create the 3D NULL-value bitmap file."
+msgstr "Crează în mod explicit un fișier bitmap cu valorile 3D nule."
+
+#: ../gui/wxpython/menustrings.py:775
+msgid "Manage timestamp"
+msgstr "Gestionează timestamp"
+
+#: ../gui/wxpython/menustrings.py:776
+msgid "Print/add/remove a timestamp for a 3D raster map"
+msgstr "Printează/adaugă/elimină timestamp pentru o hartă raster 3D"
+
+#: ../gui/wxpython/menustrings.py:780
+msgid "3D Mask"
+msgstr "Mască 3D"
+
+#: ../gui/wxpython/menustrings.py:781
+msgid "Establishes the current working 3D raster mask."
+msgstr "Stabilește o mască 3D pentru rasterul curent."
+
+#: ../gui/wxpython/menustrings.py:782
+msgid "Volume calculator"
+msgstr "Calculator pentru volume"
+
+#: ../gui/wxpython/menustrings.py:783
+msgid "Map calculator for 3D raster map algebra."
+msgstr "Calculator pentru algebra hărților raster 3D."
+
+#: ../gui/wxpython/menustrings.py:784
+msgid "Cross section"
+msgstr "Secțiune transversală"
+
+#: ../gui/wxpython/menustrings.py:785
+msgid "Creates cross section 2D raster map from 3D raster map based on 2D elevation map."
+msgstr "Crează secțiune transversală pentru harta raster 2D dintr-o hartă raster 3D, bazată pe harta de elevație 2D."
+
+#: ../gui/wxpython/menustrings.py:787
+msgid "Calculates numerically transient, confined groundwater flow in three dimensions."
+msgstr "Calculează numeric scurgerea apei subterane tranzitorie în trei dimensiuni."
+
+#: ../gui/wxpython/menustrings.py:788
+msgid "Interpolate volume from points"
+msgstr "Interpolează volume din puncte"
+
+#: ../gui/wxpython/menustrings.py:789
+msgid "Interpolates point data to a 3D raster map using regularized spline with tension (RST) algorithm."
+msgstr "Interpolează datele punctuale într-o hartă raster 3D folosind algoritmul regular spline with tension (RST)."
+
+#: ../gui/wxpython/menustrings.py:790
+msgid "Report and Statistics"
+msgstr "Raport și statistici"
+
+#: ../gui/wxpython/menustrings.py:791
+msgid "Basic volume metadata"
+msgstr "Metadata volumului de bază"
+
+#: ../gui/wxpython/menustrings.py:792
+msgid "Outputs basic information about a user-specified 3D raster map layer."
+msgstr "Transmite informații de bază despre harta raster 3D specificată de utilizator."
+
+#: ../gui/wxpython/menustrings.py:793
+msgid "Voxel statistics"
+msgstr "Statistici pentru voxel"
+
+#: ../gui/wxpython/menustrings.py:794
+msgid "Generates volume statistics for 3D raster maps."
+msgstr "Generează statistici de volume pentru harta raster 3D."
+
+#: ../gui/wxpython/menustrings.py:795
+msgid "Univariate statistics for volumes"
+msgstr "Statistici univariate pentru volume"
+
+#: ../gui/wxpython/menustrings.py:796
+msgid "Calculates univariate statistics from the non-null 3d cells of a raster3d map."
+msgstr "Calculează statistici univariate din celulele 3D nenule ale hărții raster3d."
+
+#: ../gui/wxpython/menustrings.py:797
+msgid "&Database"
+msgstr "&Baza de date"
+
+#: ../gui/wxpython/menustrings.py:798
+msgid "Database information"
+msgstr "Informații baza de date"
+
+#: ../gui/wxpython/menustrings.py:799
+msgid "List drivers"
+msgstr "Listează driverele"
+
+#: ../gui/wxpython/menustrings.py:800
+msgid "Lists all database drivers."
+msgstr "Listează toate driverele bazei de date."
+
+#: ../gui/wxpython/menustrings.py:801
+msgid "List tables"
+msgstr "Listează tabelele"
+
+#: ../gui/wxpython/menustrings.py:802
+msgid "Lists all tables for a given database."
+msgstr "Listează toate tabelele pentru o bază de date dată."
+
+#: ../gui/wxpython/menustrings.py:803
+msgid "Describe table"
+msgstr "Descrie tabel"
+
+#: ../gui/wxpython/menustrings.py:804
+msgid "Describes a table in detail."
+msgstr "Descrie în detaliu un tabel."
+
+#: ../gui/wxpython/menustrings.py:805
+msgid "List columns"
+msgstr "Listează coloane"
+
+#: ../gui/wxpython/menustrings.py:806
+msgid "List all columns for a given table."
+msgstr "Listează toate coloanele pentru un tabel dat."
+
+#: ../gui/wxpython/menustrings.py:807
+msgid "Manage databases"
+msgstr "Gestionează baza de date"
+
+#: ../gui/wxpython/menustrings.py:808
+msgid "Connect"
+msgstr "Conectează"
+
+#: ../gui/wxpython/menustrings.py:809
+msgid "Prints/sets general DB connection for current mapset and exits."
+msgstr "Printează/setează conexiunea generală BD pentru mapsetul curent și după aceea ieși."
+
+#: ../gui/wxpython/menustrings.py:810
+msgid "Login"
+msgstr "Autentificare"
+
+#: ../gui/wxpython/menustrings.py:811
+msgid "Sets user/password for driver/database."
+msgstr "Setarea utilizator/parolă pentru driver/baza de date."
+
+#: ../gui/wxpython/menustrings.py:812
+msgid "Drop table"
+msgstr "Șterge tabel"
+
+#: ../gui/wxpython/menustrings.py:813
+msgid "Drops an attribute table."
+msgstr "Șterge tabela de atribute."
+
+#: ../gui/wxpython/menustrings.py:814
+msgid "Copy table"
+msgstr "Copiază tabel"
+
+#: ../gui/wxpython/menustrings.py:815
+msgid "Copy a table."
+msgstr "Copiază un tabel."
+
+#: ../gui/wxpython/menustrings.py:816 ../gui/wxpython/menustrings.py:836
+msgid "Drop column"
+msgstr "Șterge coloana"
+
+#: ../gui/wxpython/menustrings.py:817
+msgid "Drops a column from selected attribute table"
+msgstr "Șterge coloana de atribute selectată dintr-un tabel"
+
+#: ../gui/wxpython/menustrings.py:818
+msgid "Test"
+msgstr "Test"
+
+#: ../gui/wxpython/menustrings.py:819
+msgid "Test database driver, database must exist and set by db.connect."
+msgstr "Testare driver bază de date; baza de date trebuie să existe și să fie conectată prin db.connect."
+
+#: ../gui/wxpython/menustrings.py:821
+msgid "Query any table"
+msgstr "Interoghează orice tabel"
+
+#: ../gui/wxpython/menustrings.py:822
+msgid "Selects data from attribute table (performs SQL query statement(s))."
+msgstr "Selectează date din tabela de atribute (efectuează declarație de interogare SQL)"
+
+#: ../gui/wxpython/menustrings.py:825
+msgid "SQL statement"
+msgstr "Declarație SQL"
+
+#: ../gui/wxpython/menustrings.py:826
+msgid "Executes any SQL statement."
+msgstr "Execută orice declarație SQL."
+
+#: ../gui/wxpython/menustrings.py:827
+msgid "Vector database connections"
+msgstr "Conectează vector la baza de date"
+
+#: ../gui/wxpython/menustrings.py:828
+msgid "New table"
+msgstr "Tabel nou"
+
+#: ../gui/wxpython/menustrings.py:829
+msgid "Creates and connects a new attribute table to a given layer of an existing vector map."
+msgstr "Crează și conectează o tabelă de atribute nouă la un anumit strat a hărții vectoriale existente."
+
+#: ../gui/wxpython/menustrings.py:830
+msgid "Remove table"
+msgstr "Elimină tabel"
+
+#: ../gui/wxpython/menustrings.py:831
+msgid "Removes existing attribute table of a vector map."
+msgstr "Elimină tabela de atribute existentă a hărții vectoriale."
+
+#: ../gui/wxpython/menustrings.py:832
+msgid "Join table"
+msgstr "Alătură tabel"
+
+#: ../gui/wxpython/menustrings.py:833
+msgid "Allows to join a table to a vector map table."
+msgstr "Permite alăturarea unui tabel la tabela hărții vectoriale"
+
+#: ../gui/wxpython/menustrings.py:834
+msgid "Add columns"
+msgstr "Adaugă coloane"
+
+#: ../gui/wxpython/menustrings.py:835
+msgid "Adds one or more columns to the attribute table connected to a given vector map."
+msgstr "Adaugă una sau mai multe coloane la tabela de atribute conectată la o anumită hartă vectorială."
+
+#: ../gui/wxpython/menustrings.py:837
+msgid "Drops a column from the attribute table connected to a given vector map."
+msgstr "Șterge o coloană din tabela de atribute conectată la o anumită hartă vectorială."
+
+#: ../gui/wxpython/menustrings.py:839
+msgid "Renames a column in the attribute table connected to a given vector map."
+msgstr "Redenumește o coloană din tabela de atribute conectată la o anumită hartă vectorială."
+
+#: ../gui/wxpython/menustrings.py:840
+msgid "Change values"
+msgstr "Schimbă valorile"
+
+#: ../gui/wxpython/menustrings.py:841
+msgid "Allows to update a column in the attribute table connected to a vector map."
+msgstr "Permite actualizarea unei coloane din tabela de atribute conectată la harta vectorială."
+
+#: ../gui/wxpython/menustrings.py:842
+msgid "Reconnect vectors to database"
+msgstr "Reconectează vectorii la baza de date"
+
+#: ../gui/wxpython/menustrings.py:843
+msgid "Reconnects vectors to a new database."
+msgstr "Reconectează vectorii la o baza de date nouă."
+
+#: ../gui/wxpython/menustrings.py:844
+msgid "Set vector map - database connection"
+msgstr "Definirea conexiunii dintre harta vectorială și baza de date."
+
+#: ../gui/wxpython/menustrings.py:845
+msgid "Prints/sets DB connection for a vector map to attribute table."
+msgstr "Printează/setează conexiunea BD pentru o hartă vectorială la tabela de atribute."
+
+#: ../gui/wxpython/menustrings.py:846 ../gui/wxpython/menustrings.py:898
+msgid "&Help"
+msgstr "&Ajutor"
+
+#: ../gui/wxpython/menustrings.py:847
+msgid "GRASS help"
+msgstr "Ajutor GRASS"
+
+#: ../gui/wxpython/menustrings.py:848 ../gui/wxpython/menustrings.py:850
+msgid "Display the HTML man pages of GRASS"
+msgstr "Afișează principala pagină HTML a GRASS"
+
+#: ../gui/wxpython/menustrings.py:849
+msgid "GUI help"
+msgstr "Ajutor GUI"
+
+#: ../gui/wxpython/menustrings.py:851
+msgid "About system"
+msgstr "Despre sistem"
+
+#: ../gui/wxpython/menustrings.py:852
+msgid "Prints system information"
+msgstr "Afișează informații despre sistem"
+
+#: ../gui/wxpython/menustrings.py:859
+msgid "Create new model"
+msgstr "Crează model nou"
+
+#: ../gui/wxpython/menustrings.py:861
+msgid "Load model from file"
+msgstr "Încarcă model nou din fișierul"
+
+#: ../gui/wxpython/menustrings.py:865
+msgid "Save model to file"
+msgstr "Salvează model nou ca fișier"
+
+#: ../gui/wxpython/menustrings.py:867
+msgid "Close model file"
+msgstr "Închide fișierul model"
+
+#: ../gui/wxpython/menustrings.py:868
+msgid "Export to image"
+msgstr "Exportă ca imagine"
+
+#: ../gui/wxpython/menustrings.py:869
+msgid "Export model to image"
+msgstr "Exportă modelul ca imagine"
+
+#: ../gui/wxpython/menustrings.py:870
+msgid "Export to Python"
+msgstr "Exportă ca Python"
+
+#: ../gui/wxpython/menustrings.py:871
+msgid "Export model to Python script"
+msgstr "Exportă modelul ca script Python"
+
+#: ../gui/wxpython/menustrings.py:872
+msgid "Quit modeler"
+msgstr "ÃŽnchide modelarea"
+
+#: ../gui/wxpython/menustrings.py:873
+msgid "Close modeler window"
+msgstr "ÃŽnchide fereastra de modelare"
+
+#: ../gui/wxpython/menustrings.py:877
+msgid "&Model"
+msgstr "&Model"
+
+#: ../gui/wxpython/menustrings.py:878
+msgid "Add command"
+msgstr "Adaugă comandă"
+
+#: ../gui/wxpython/menustrings.py:879
+msgid "Add action (GRASS command) to model"
+msgstr "Adaugă acțiune (comandă GRASS) la model"
+
+#: ../gui/wxpython/menustrings.py:880
+msgid "Add data"
+msgstr "Adaugă data"
+
+#: ../gui/wxpython/menustrings.py:881
+msgid "Add data item to model"
+msgstr "Adaugă un element de date la model"
+
+#: ../gui/wxpython/menustrings.py:882
+msgid "Define relation"
+msgstr "Definește relația"
+
+#: ../gui/wxpython/menustrings.py:883
+msgid "Define relation between data and action items"
+msgstr "Definește relația dintre elementele de date și acțiune"
+
+#: ../gui/wxpython/menustrings.py:884
+msgid "Add loop / series"
+msgstr "Adaugă buclă / serii"
+
+#: ../gui/wxpython/menustrings.py:885
+msgid "Adds loop (series) to model"
+msgstr "Adaugă buclă (serii) la model"
+
+#: ../gui/wxpython/menustrings.py:886
+msgid "Add condition"
+msgstr "Adaugă condiție"
+
+#: ../gui/wxpython/menustrings.py:887
+msgid "Adds condition (if/else) to model"
+msgstr "Adaugă condiție (daca/altfel) la model"
+
+#: ../gui/wxpython/menustrings.py:888
+msgid "Remove item"
+msgstr "Elimină element"
+
+#: ../gui/wxpython/menustrings.py:889
+msgid "Remove action/data from model"
+msgstr "Elimină acțiune/date din model"
+
+#: ../gui/wxpython/menustrings.py:891
+msgid "Model properties (name, purpose, etc.)"
+msgstr "Proprietățile modelului (nume, scop, etc.)"
+
+#: ../gui/wxpython/menustrings.py:892
+msgid "Delete intermediate data"
+msgstr "Șterge datele intermediare"
+
+#: ../gui/wxpython/menustrings.py:893
+msgid "Delete intermediate data defined in the model"
+msgstr "Șterge datele intermediare definite în model"
+
+#: ../gui/wxpython/menustrings.py:895
+msgid "Run entire model"
+msgstr "Rulează întregul model"
+
+#: ../gui/wxpython/menustrings.py:896
+msgid "Validate model"
+msgstr "Validează model"
+
+#: ../gui/wxpython/menustrings.py:897
+msgid "Validate entire model"
+msgstr "Validează întregul model"
+
+#: ../gui/wxpython/menustrings.py:899
+msgid "Help"
+msgstr "Ajutor"
+
+#: ../gui/wxpython/menustrings.py:900
+msgid "Display the HTML man pages of Graphical modeler"
+msgstr "Afișează principala pagină HTML a aplicației de modelare grafică"
+
+#: ../gui/wxpython/menustrings.py:901
+msgid "About Graphical Modeler"
+msgstr "Despre Modelare Grafică"
+
+#: ../gui/wxpython/menustrings.py:902
+msgid "Display information about Graphical Modeler"
+msgstr "Afișează informații despre Modelare Grafică"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:52
+msgid "GRASS GIS Raster Map Calculator"
+msgstr "Calculator GRASS GIS pentru harta raster"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:55
+msgid "GRASS GIS 3D Raster Map Calculator"
+msgstr "Calculator GRASS GIS pentru harta raster 3D"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:66
+msgid "mapcalc statement"
+msgstr "declarația mapcalc"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:122
+msgid "Operators"
+msgstr "Operatori"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:124
+msgid "Operands"
+msgstr "Operanzi"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:126
+msgid "Expression"
+msgstr "Expresie"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:138
+msgid "Save expression to file"
+msgstr "Salvează expresia ca fișier"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:141
+msgid "Load expression from file"
+msgstr "Încarcă expresia din fișier"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:145
+msgid "exponent"
+msgstr "exponent"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:147
+msgid "divide"
+msgstr "împarte"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:149
+msgid "add"
+msgstr "plus"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:151
+msgid "subtract"
+msgstr "scade"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:153
+msgid "modulus"
+msgstr "coeficient"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:155
+msgid "multiply"
+msgstr "multiplică"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:160
+msgid "left shift"
+msgstr "deplasare stânga"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:162
+msgid "right shift"
+msgstr "deplasare dreapta"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:164
+msgid "right shift (unsigned)"
+msgstr "deplasare dreapta (nesemnat)"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:166
+msgid "greater than"
+msgstr "mai mare de"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:168
+msgid "greater than or equal to"
+msgstr "mai mare de sau egal cu"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:170
+msgid "less than"
+msgstr "mai puțin de"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:172
+msgid "less than or equal to"
+msgstr "mai puțin de sau egal cu"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:174
+msgid "equal to"
+msgstr "egal cu"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:176
+msgid "not equal to"
+msgstr "diferit de"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:179
+msgid "one's complement"
+msgstr "asemănător cu"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:181
+msgid "NOT"
+msgstr "NU"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:183
+msgid "bitwise AND"
+msgstr "la nivel ȘI"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:185
+msgid "bitwise OR"
+msgstr "la nivel SAU"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:187
+msgid "logical AND"
+msgstr "ȘI logic"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:189
+msgid "logical AND (ignores NULLs)"
+msgstr "ȘI logic (ignoră NULLs)"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:191
+msgid "logical OR"
+msgstr "SAU logic"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:193
+msgid "logical OR (ignores NULLs)"
+msgstr "SAU logic (ignoră NULLs)"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:195
+msgid "conditional"
+msgstr "condițional"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:208
+msgid "Name for new 3D raster map to create"
+msgstr "Nume pentru harta raster 3D creată nouă"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:210
+msgid "Name for new raster map to create"
+msgstr "Nume pentru harta raster creată nouă"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:214
+msgid "Insert existing 3D raster map"
+msgstr "Inserează o hartă raster 3D existentă"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:216
+msgid "Insert existing raster map"
+msgstr "Inserează o hartă raster existentă"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:220
+msgid "Insert mapcalc function"
+msgstr "Inserează funcția mapcalc"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:227
+msgid "Add created raster map into layer tree"
+msgstr "Adaugă harta raster creată într-un arbore de straturi"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:466
+msgid "You must enter the name of a new raster map to create."
+msgstr "Trebuie introdus numele hărții raster nou creată."
+
+#: ../gui/wxpython/modules/mcalc_builder.py:476
+msgid "You must enter an expression to create a new raster map."
+msgstr "Trebuie introdusă o expresie pentru a crea o nouă hartă raster."
+
+#: ../gui/wxpython/modules/mcalc_builder.py:516
+msgid "Choose a file name to save the expression"
+msgstr "Alege un nume de fișier pentru a salva expresia"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:517
+#: ../gui/wxpython/modules/mcalc_builder.py:538
+msgid "Expression file (*)|*"
+msgstr "Fișier al expresiei (*)|*"
+
+#: ../gui/wxpython/modules/mcalc_builder.py:537
+msgid "Choose a file name to load the expression"
+msgstr "Alege un nume de fișier pentru a încărca expresia"
+
+#: ../gui/wxpython/modules/vclean.py:31 ../gui/wxpython/modules/vclean.py:113
+msgid "Set up vector cleaning tools"
+msgstr "Configurează instrumentele pentru curățarea vectorului"
+
+#: ../gui/wxpython/modules/vclean.py:68
+msgid "break lines/boundaries"
+msgstr "linii întrerupte/limite"
+
+#: ../gui/wxpython/modules/vclean.py:69
+msgid "remove duplicates"
+msgstr "elimină dublicate"
+
+#: ../gui/wxpython/modules/vclean.py:70
+msgid "remove dangles"
+msgstr "elimină liniile deplasate"
+
+#: ../gui/wxpython/modules/vclean.py:71
+msgid "change boundary dangles to lines"
+msgstr "modifică liniile neconectate ale limitei în linii"
+
+#: ../gui/wxpython/modules/vclean.py:72
+msgid "remove bridges"
+msgstr "elimină podurile"
+
+#: ../gui/wxpython/modules/vclean.py:73
+msgid "change bridges to lines"
+msgstr "schimbă podurile în linii"
+
+#: ../gui/wxpython/modules/vclean.py:74
+msgid "snap lines/boundaries"
+msgstr "aplică snap la linii/limite"
+
+#: ../gui/wxpython/modules/vclean.py:75
+msgid "remove duplicate area centroids"
+msgstr "elimină centroizii dublii ai unui areal"
+
+#: ../gui/wxpython/modules/vclean.py:76
+msgid "break polygons"
+msgstr "poligoane întrerupte"
+
+#: ../gui/wxpython/modules/vclean.py:77
+msgid "prune lines/boundaries"
+msgstr "linii/limite de tip prune"
+
+#: ../gui/wxpython/modules/vclean.py:78
+msgid "remove small areas"
+msgstr "elimină arealele mici"
+
+#: ../gui/wxpython/modules/vclean.py:79
+msgid "remove lines/boundaries of zero length"
+msgstr "elimină liniile/limitele de lungime zero"
+
+#: ../gui/wxpython/modules/vclean.py:80
+msgid "remove small angles at nodes"
+msgstr "elimină unghiurile și nodurile mici"
+
+#: ../gui/wxpython/modules/vclean.py:115
+msgid "Choose cleaning tools and set thresholds"
+msgstr "Alege instrumentele de curățare și setați pragurile"
+
+#: ../gui/wxpython/modules/vclean.py:119
+msgid "Select input vector map:"
+msgstr "Selectează harta vectorială de intrare:"
+
+#: ../gui/wxpython/modules/vclean.py:125
+msgid " Feature type: "
+msgstr "Tipul trăsăturii:"
+
+#: ../gui/wxpython/modules/vclean.py:129
+msgid "Select output vector map:"
+msgstr "Selectează harta vectorială de ieșire:"
+
+#: ../gui/wxpython/modules/vclean.py:195
+msgid "line"
+msgstr "linie"
+
+#: ../gui/wxpython/modules/vclean.py:196
+msgid "boundary"
+msgstr "limită"
+
+#: ../gui/wxpython/modules/vclean.py:197
+msgid "centroid"
+msgstr "centroid"
+
+#: ../gui/wxpython/modules/vclean.py:198
+#: ../gui/wxpython/vdigit/preferences.py:417
+msgid "area"
+msgstr "areal"
+
+#: ../gui/wxpython/modules/vclean.py:199
+msgid "face"
+msgstr "suprafață"
+
+#: ../gui/wxpython/modules/vclean.py:355
+#, python-format
+msgid "%s. cleaning tool removed, will be ignored"
+msgstr "%s. curățarea instrumentului eliminat, va fi ignorată"
+
+#: ../gui/wxpython/modules/vclean.py:357
+msgid "Please select a cleaning tool to remove"
+msgstr "Vă rugăm să selectați instrumentul de curățare pentru a elimina"
+
+#: ../gui/wxpython/modules/vclean.py:378
+#, python-format
+msgid "%s. cleaning tool moved up"
+msgstr "%s. instrumentul de curățare mutat sus"
+
+#: ../gui/wxpython/modules/vclean.py:380
+msgid "1. cleaning tool can not be moved up "
+msgstr "1. instrumentul de curățare nu poate fi mutat sus"
+
+#: ../gui/wxpython/modules/vclean.py:382
+msgid "Please select a cleaning tool to move up"
+msgstr "Vă rugăm să selectați instrumentul de curățare pentru a muta sus"
+
+#: ../gui/wxpython/modules/vclean.py:405
+#, python-format
+msgid "%s. cleaning tool moved down"
+msgstr "%s. instrumentul de curățare mutat jos"
+
+#: ../gui/wxpython/modules/vclean.py:407
+msgid "Last cleaning tool can not be moved down "
+msgstr "Ultimul instrument de curățare nu poate fi mutat jos"
+
+#: ../gui/wxpython/modules/vclean.py:409
+msgid "Please select a cleaning tool to move down"
+msgstr "Vă rugăm să selectați instrumentul de curățare pentru a muta jos"
+
+#: ../gui/wxpython/modules/vclean.py:420
+#, python-format
+msgid "cleaning tool: '%s'"
+msgstr "curățarea intrumentului: '%s'"
+
+#: ../gui/wxpython/modules/vclean.py:428
+#, python-format
+msgid "Threshold for %(num)s. tool '%(tool)s': %(thresh)s"
+msgstr "Pragul pentru %(num)s. instrument '%(tool)s': %(thresh)s"
+
+#: ../gui/wxpython/modules/vclean.py:456
+msgid "Name of input vector map"
+msgstr "Nume pentru harta vectorială de intrare"
+
+#: ../gui/wxpython/modules/vclean.py:457
+msgid "Name for output vector map"
+msgstr "Nume pentru harta vectorială de ieșire"
+
+#: ../gui/wxpython/modules/vclean.py:458
+msgid "Tools"
+msgstr "Instrumente"
+
+#: ../gui/wxpython/modules/vclean.py:459
+msgid "Threshold"
+msgstr "Prag"
+
+#: ../gui/wxpython/modules/vclean.py:461
+#, python-format
+msgid "'%s' not defined"
+msgstr "'%s' nu este definit"
+
+#: ../gui/wxpython/modules/vclean.py:463
+#, python-format
+msgid ""
+"Some parameters not defined. Operation canceled.\n"
+"\n"
+"%s"
+msgstr ""
+"Unii parametrii nu sunt definiți. Operațiune anulată.\n"
+"\n"
+"%s"
+
+#: ../gui/wxpython/modules/vclean.py:468
+msgid "Executing selected cleaning operations..."
+msgstr "Executarea operațiunilor de curățare selectate..."
+
+#: ../gui/wxpython/modules/vclean.py:524
+msgid "Vector cleaning command copied to clipboard"
+msgstr "Comanda de curățare vector copiată în clipboard"
+
+#: ../gui/wxpython/modules/colorrules.py:71
+msgid "Check all"
+msgstr "Verifică toate"
+
+#: ../gui/wxpython/modules/colorrules.py:74
+msgid "Clear all"
+msgstr "Curăță tot"
+
+#: ../gui/wxpython/modules/colorrules.py:130
+msgid "Enter vector attribute values"
+msgstr "Introduceți valori atributelor vectoriale"
+
+#: ../gui/wxpython/modules/colorrules.py:287
+msgid "Bad color format. Use color format '0:0:0'"
+msgstr "Format de culoare greșit. Folosește formatul de culoare '0:0:0'"
+
+#: ../gui/wxpython/modules/colorrules.py:369
+msgid "Select raster map:"
+msgstr "Selectează hartă raster:"
+
+#: ../gui/wxpython/modules/colorrules.py:371
+msgid "Select vector map:"
+msgstr "Selectează hartă vectorială:"
+
+#: ../gui/wxpython/modules/colorrules.py:388
+msgid "Import or export color table:"
+msgstr "Importă sau exportă tabela de culoare:"
+
+#: ../gui/wxpython/modules/colorrules.py:393
+msgid "Load color table from file:"
+msgstr "Încarcă tabela de culoare din fișier:"
+
+#: ../gui/wxpython/modules/colorrules.py:394
+msgid "Choose file to load color table"
+msgstr "Alege fișier pentru a încărca tabela de culoare"
+
+#: ../gui/wxpython/modules/colorrules.py:395
+msgid "Load"
+msgstr "Încarcă"
+
+#: ../gui/wxpython/modules/colorrules.py:396
+msgid "Type filename or click to choose file and load color table"
+msgstr "Introduceți un nume de fișier și click pentru a alege fișierul și pentru a încărca tabela de culoare"
+
+#: ../gui/wxpython/modules/colorrules.py:402
+msgid "Save color table to file:"
+msgstr "Salvează tabela de culoare ca fișier:"
+
+#: ../gui/wxpython/modules/colorrules.py:403
+msgid "Choose file to save color table"
+msgstr "Alege fișier pentru a salva tabela de culoare"
+
+#: ../gui/wxpython/modules/colorrules.py:404
+msgid "Type filename or click to choose file and save color table"
+msgstr "Introduceți un nume de fișier și click pentru a alege fișierul și pentru a salva tabela de culoare"
+
+#: ../gui/wxpython/modules/colorrules.py:410
+msgid "Reload default table"
+msgstr "Reîncarcă tabelul implicit"
+
+#: ../gui/wxpython/modules/colorrules.py:500
+msgid "Preview"
+msgstr "Previzualizare"
+
+#: ../gui/wxpython/modules/colorrules.py:504
+msgid "Show preview of map (current Map Display extent is used)."
+msgstr "Afișează harta previzualizată (extinderea curentă a fereastrei de vizualizare este utilizată)."
+
+#: ../gui/wxpython/modules/colorrules.py:534
+msgid "No valid color rules given."
+msgstr "Nici o regulă de culoare validă."
+
+#: ../gui/wxpython/modules/colorrules.py:600
+msgid "Invalid color table format"
+msgstr "Format nevalid al tabelului de culoare"
+
+#: ../gui/wxpython/modules/colorrules.py:677
+#, python-format
+msgid "Invalid rule value '%s'. Unable to apply color table."
+msgstr "Valoare nevalidă %s'. Nu a putut fi aplicată tabelului de culoare."
+
+#: ../gui/wxpython/modules/colorrules.py:752
+msgid "Create new color table for raster map"
+msgstr "Crează tabel nou de culoare pentru harta raster"
+
+#: ../gui/wxpython/modules/colorrules.py:830
+msgid "Enter raster category values or percents"
+msgstr "Introduceți valorile de categorie raster sau procente"
+
+#: ../gui/wxpython/modules/colorrules.py:836
+msgid "fp range"
+msgstr "gama"
+
+#: ../gui/wxpython/modules/colorrules.py:837
+#, python-format
+msgid "Enter raster category values or percents (%(range)s = %(min)d-%(max)d)"
+msgstr "Introduceți valorile de categorie raster sau procente (%(range)s = %(min)d-%(max)d)"
+
+#: ../gui/wxpython/modules/colorrules.py:926
+msgid "Create new color rules for vector map"
+msgstr "Crează reguli noi de culori pentru harta vectorială"
+
+#: ../gui/wxpython/modules/colorrules.py:937
+#: ../gui/wxpython/modules/colorrules.py:1462
+msgid "Enter vector attribute values or percents:"
+msgstr "Introduceți valorile atributelor vectorului sau procentele:"
+
+#: ../gui/wxpython/modules/colorrules.py:939
+#: ../gui/wxpython/modules/colorrules.py:1464
+msgid "Enter vector attribute values:"
+msgstr "Introduceți valorile atributelor vectorului:"
+
+#: ../gui/wxpython/modules/colorrules.py:950
+msgid "Select vector columns"
+msgstr "Selectează coloanele vectorului"
+
+#: ../gui/wxpython/modules/colorrules.py:952
+msgid "Layer:"
+msgstr "Strat:"
+
+#: ../gui/wxpython/modules/colorrules.py:954
+msgid "Attribute column:"
+msgstr "Coloana atribut:"
+
+#: ../gui/wxpython/modules/colorrules.py:957
+msgid "Load color from column:"
+msgstr "Încarcă culoare din coloana:"
+
+#: ../gui/wxpython/modules/colorrules.py:957
+msgid "Save color to column:"
+msgstr "Salvează culoare la coloana:"
+
+#: ../gui/wxpython/modules/colorrules.py:959
+msgid "Load size from column:"
+msgstr "Încarcă dimensiunea din coloana:"
+
+#: ../gui/wxpython/modules/colorrules.py:959
+msgid "Save size to column:"
+msgstr "Salvează dimensiunea la coloana:"
+
+#: ../gui/wxpython/modules/colorrules.py:961
+msgid "Load width from column:"
+msgstr "Încarcă lățimea din coloana:"
+
+#: ../gui/wxpython/modules/colorrules.py:961
+msgid "Save width to column:"
+msgstr "Salvează lățimea la coloana:"
+
+#: ../gui/wxpython/modules/colorrules.py:965
+msgid "Use color column instead of color table:"
+msgstr "Folosiți coloana de culoare in loc de tabelul de culoare:"
+
+#: ../gui/wxpython/modules/colorrules.py:980
+msgid "Add GRASSRGB column to current attribute table."
+msgstr "Adaugă coloana GRASSRGB la tabela de atribute curentă."
+
+#: ../gui/wxpython/modules/colorrules.py:1035
+#: ../gui/wxpython/modules/colorrules.py:1084
+msgid "Import or export color table"
+msgstr "Importă sau exportă tabela de culoare"
+
+#: ../gui/wxpython/modules/colorrules.py:1096
+#, python-format
+msgid "Database connection for vector map <%s> is not defined in DB file.  Do you want to create and connect new attribute table?"
+msgstr "Conexiunea bazei de date pentru harta vectorială <%s> nu este definită în fișierul BD.  Doriți să creați și să conectați noua tabelă de atribute?"
+
+#: ../gui/wxpython/modules/colorrules.py:1099
+msgid "No database connection defined"
+msgstr "Nici o conexiune a bazei de date nu este definită"
+
+#: ../gui/wxpython/modules/colorrules.py:1171
+#, python-format
+msgid "Selected map <%(map)s> is not in current mapset <%(mapset)s>. Color rules cannot be edited."
+msgstr "Harta selectată <%(map)s>nu este în mapset-ul curent <%(mapset)s>. Regulile de culoare nu pot fi editate."
+
+#: ../gui/wxpython/modules/colorrules.py:1176
+#, python-format
+msgid "Selected map <%(map)s> is not in current mapset <%(mapset)s>. Attribute table cannot be edited."
+msgstr "Harta selectată <%(map)s>nu este în mapset-ul curent <%(mapset)s>. Tabela de atribute nu poate fi editată."
+
+#: ../gui/wxpython/modules/colorrules.py:1318
+#, python-format
+msgid "%s column already exists."
+msgstr "%s coloana există deja"
+
+#: ../gui/wxpython/modules/colorrules.py:1350
+msgid "Please wait, loading data from attribute table..."
+msgstr "Vă rugăm să așteptați, încărcarea datelor din tabela de atribute..."
+
+#: ../gui/wxpython/modules/colorrules.py:1411
+#, python-format
+msgid "Number of loaded records reached %d, displaying all the records will be time-consuming and may lead to computer freezing, do you still want to continue?"
+msgstr "Număr de înregistrări încărcate atins %d, afișarea tuturor înregistrărilor va fi consumatoare de timp și poate duce la blocarea calculatorului, doriți să continuați?"
+
+#: ../gui/wxpython/modules/colorrules.py:1415
+msgid "Too many records"
+msgstr "Prea multe înregistrări"
+
+#: ../gui/wxpython/modules/colorrules.py:1457
+#, python-format
+msgid "Enter vector attribute values or percents %s:"
+msgstr "Introduceți valorile atributelor vectorului sau procentele %s:"
+
+#: ../gui/wxpython/modules/colorrules.py:1459
+#, python-format
+msgid "Enter vector attribute values %s:"
+msgstr "Introduceți valorile atributelor vectorului %s:"
+
+#: ../gui/wxpython/modules/colorrules.py:1596
+msgid "Please select column to save values to."
+msgstr "Selectează coloana pentru a salva valorile ca."
+
+#: ../gui/wxpython/modules/colorrules.py:1633
+msgid "No color column defined. Operation canceled."
+msgstr "Nici o coloană definită. Operațiune anulată."
+
+#: ../gui/wxpython/modules/extensions.py:43
+msgid "Fetch & install extension from GRASS Addons"
+msgstr "Obține & Instalează extensie de la GRASS Addons"
+
+#: ../gui/wxpython/modules/extensions.py:53
+msgid "Repository"
+msgstr "Depozit"
+
+#: ../gui/wxpython/modules/extensions.py:55
+msgid "List of extensions"
+msgstr "Lista extensiilor"
+
+#: ../gui/wxpython/modules/extensions.py:59
+msgid "Fetch full info including description and keywords"
+msgstr "Obține informații complete care includ descrierea și cuvintele cheie"
+
+#: ../gui/wxpython/modules/extensions.py:94
+msgid "&Fetch"
+msgstr "&Obține"
+
+#: ../gui/wxpython/modules/extensions.py:95
+msgid "Fetch list of available modules from GRASS Addons SVN repository"
+msgstr "Obțina lista modulelor disponibile de la GRASS Addons SVN"
+
+#: ../gui/wxpython/modules/extensions.py:98
+msgid "&Install"
+msgstr "&Instalează"
+
+#: ../gui/wxpython/modules/extensions.py:99
+msgid "Install selected add-ons GRASS module"
+msgstr "Instalează addon-urile modulului GRASS selectat"
+
+#: ../gui/wxpython/modules/extensions.py:172
+msgid "Extension not defined"
+msgstr "Extensia nu este definită"
+
+#: ../gui/wxpython/modules/extensions.py:186
+msgid "Fetch list of available extensions by clicking on 'Fetch' button"
+msgstr "Obține lista extensiilor disponibile, dând click pe butonul 'Obține'"
+
+#: ../gui/wxpython/modules/extensions.py:194
+#, python-format
+msgid "%d items match"
+msgstr "%d elemente potrivite"
+
+#: ../gui/wxpython/modules/extensions.py:207
+msgid "Fetching list of modules from GRASS-Addons SVN (be patient)..."
+msgstr "Obține lista de module de la GRASS-Addons SVN (fi răbdător)..."
+
+#: ../gui/wxpython/modules/extensions.py:386
+msgid "Uninstall GRASS Addons extensions"
+msgstr "Dezinstalează extensiile Addon-urilor GRASS"
+
+#: ../gui/wxpython/modules/extensions.py:395
+msgid "List of installed extensions"
+msgstr "Lista extensiilor instalate"
+
+#: ../gui/wxpython/modules/extensions.py:401
+msgid "&Uninstall"
+msgstr "&Dezinstalează"
+
+#: ../gui/wxpython/modules/extensions.py:402
+msgid "Uninstall selected AddOns extensions"
+msgstr "Dezinstalează extensiile Addon-urilor GRASS selectate"
+
+#: ../gui/wxpython/modules/extensions.py:449
+msgid "No extension selected for removal. Operation canceled."
+msgstr "Nici o extensie selectată pentru eliminare. Operațiune anulată."
+
+#: ../gui/wxpython/modules/extensions.py:458
+#, python-format
+msgid ""
+"List of files to be removed:\n"
+"%(files)s\n"
+"\n"
+"Do you want really to remove <%(ext)s> extension?"
+msgstr ""
+"Lista fișierelor pentru a fi eliminate:\n"
+"%(files)s\n"
+"\n"
+"Doriți să eliminați <%(ext)s> extensia?"
+
+#: ../gui/wxpython/modules/extensions.py:491
+msgid "Extension"
+msgstr "Extensie"
+
+#: ../gui/wxpython/modules/ogc_services.py:38
+msgid "Import data from WMS server"
+msgstr "Importă date prin serviciu WMS"
+
+#: ../gui/wxpython/modules/ogc_services.py:54
+msgid " Server settings "
+msgstr "Setările server-ului"
+
+#: ../gui/wxpython/modules/ogc_services.py:56
+msgid "Server:"
+msgstr "Server:"
+
+#: ../gui/wxpython/modules/ogc_services.py:63
+msgid " List of layers "
+msgstr "Lista straturilor"
+
+#: ../gui/wxpython/modules/ogc_services.py:79
+msgid "&Connect"
+msgstr "&Conectează"
+
+#: ../gui/wxpython/modules/ogc_services.py:80
+msgid "Connect to the server"
+msgstr "Conectează la server"
+
+#: ../gui/wxpython/modules/ogc_services.py:167
+msgid "The 'xml2' parser is required, please install it first. You may also try running r.in.wms directly from the command line."
+msgstr "Este necesar parser 'xml2' , vă rugăm să-l instalați mai întâi. De asemenea, puteți să încercați să rulați r.in.wms direct în linia de comandă."
+
+#: ../gui/wxpython/modules/ogc_services.py:251
+msgid "Layer / Style"
+msgstr "Strat / Stil"
+
+#: ../gui/wxpython/modules/ogc_services.py:252
+msgid "Title"
+msgstr "Titlu"
+
+#: ../gui/wxpython/modules/ogc_services.py:262
+msgid "Layers"
+msgstr "Straturi"
+
+#: ../gui/wxpython/modules/histogram.py:176
+#: ../gui/wxpython/mapdisp/mapwindow.py:438
+msgid "Please wait, exporting image..."
+msgstr "Vă rugăm să așteptați, exportarea imaginii..."
+
+#: ../gui/wxpython/modules/histogram.py:266
+msgid "GRASS GIS Histogramming Tool (d.histogram)"
+msgstr "Intrument GRASS GIS pentru histogramă (d.histogram)"
+
+#: ../gui/wxpython/modules/histogram.py:343 ../gui/wxpython/nviz/wxnviz.py:321
+#: ../gui/wxpython/nviz/wxnviz.py:332
+#, python-format
+msgid "Raster map <%s> not found"
+msgstr "Harta raster <%s> nu este găsită"
+
+#: ../gui/wxpython/modules/histogram.py:368
+msgid "Select font for histogram text"
+msgstr "Selectează font pentru textul histogramei"
+
+#: ../gui/wxpython/modules/histogram.py:447
+#: ../gui/wxpython/mapdisp/frame.py:609 ../gui/wxpython/wxplot/base.py:484
+#: ../gui/wxpython/gcp/mapdisplay.py:489
+msgid "Print preview"
+msgstr "Printează previzualizare"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:28
+msgid "Query raster/vector map(s)"
+msgstr "Interoghează raster/vector"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:29
+msgid "Query selected raster/vector map(s)"
+msgstr "Interoghează rasterul/vectorul selectat"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:31
+msgid "Add scalebar and north arrow"
+msgstr "Adaugă scara și săgeata nord"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:33
+msgid "Add legend"
+msgstr "Adaugă legenda"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:37
+msgid "Analyze map"
+msgstr "Analizează harta"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:38
+msgid "Measuring, profiling, histogramming, ..."
+msgstr "Măsurare, profile, histogramă,...."
+
+#: ../gui/wxpython/mapdisp/toolbars.py:40
+msgid "Measure distance"
+msgstr "Măsoară distanța"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:42
+msgid "Profile surface map"
+msgstr "Profilul suprafeței"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:44
+msgid "Create bivariate scatterplot of raster maps"
+msgstr "Crează punctele de dispersie bivariată a hărții raster"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:46
+#: ../gui/wxpython/mapdisp/frame.py:1183
+msgid "Add text layer"
+msgstr "Adaugă text stratului"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:48
+msgid "Create histogram of raster map"
+msgstr "Crează histograma hărții raster"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:53
+msgid "Rotate 3D scene"
+msgstr "Rotește scena 3D"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:54
+msgid "Drag with mouse to rotate 3D scene"
+msgstr "Trage cu mouse-ul pentru a roti scena 3D"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:56
+#: ../gui/wxpython/nviz/preferences.py:208
+msgid "Fly-through mode"
+msgstr "Mod de zbor"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:57
+msgid "Drag with mouse, hold Ctrl down for different mode or Shift to accelerate"
+msgstr "Trage cu mouse-ul, ține apăsat Ctrl down pentru un mod diferit sau Shift pentru a accelera"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:59
+msgid "Click mouse to zoom"
+msgstr "Click pe mouse pentru a mări"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:60
+msgid "Click mouse to unzoom"
+msgstr "Click pe mouse pentru a micșora"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:78 ../gui/wxpython/mapdisp/frame.py:206
+#: ../gui/wxpython/mapdisp/frame.py:217 ../gui/wxpython/mapdisp/frame.py:269
+#: ../gui/wxpython/mapdisp/frame.py:416
+msgid "2D view"
+msgstr "Vizualizare 2D"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:84 ../gui/wxpython/lmgr/frame.py:303
+msgid "3D view"
+msgstr "Vizualizare 3D"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:88
+msgid "3D view mode not available"
+msgstr "Modul de vizualizare 3D nu este disponibil"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:89
+#: ../gui/wxpython/mapdisp/toolbars.py:106
+#, python-format
+msgid "Reason: %s"
+msgstr "Motiv: %s"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:90
+msgid "Note that the wxGUI's 3D view mode is currently disabled on MS Windows (hopefully this will be fixed soon). Please keep an eye out for updated versions of GRASS. In the meantime you can use \"NVIZ\" from the File menu."
+msgstr "Notă asupra faptului că wxGUI's pentru vizualizarea  3D nu este disponibilă, pentru moment, pe MS Windows (sperăm să rezolvăm acest lucru cât mai curând). Vă rugăm să fiți atenți la actualizarea versiunilor de GRASS. Între timp puteți utiliza \"NVIZ\" din meniul Fișier."
+
+#: ../gui/wxpython/mapdisp/toolbars.py:98
+#: ../gui/wxpython/vdigit/toolbars.py:695
+msgid "Digitize"
+msgstr "Digitizează"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:105
+msgid "Vector digitizer not available"
+msgstr "Vectorizarea nu este disponibilă"
+
+#: ../gui/wxpython/mapdisp/toolbars.py:107
+msgid "Note that the wxGUI's vector digitizer is currently disabled (hopefully this will be fixed soon). Please keep an eye out for updated versions of GRASS. In the meantime you can use \"v.digit\" from the Develop Vector menu."
+msgstr "Notă asupra faptului că wxGUI's pentru vectorizare nu este disponibilă (sperăm să rezolvăm acest lucru cât mai curând). Vă rugăm să fiți atenți la actualizarea versiunilor de GRASS. Între timp puteți utiliza \"v.digit\" din meniul Dezvoltă vector."
+
+#: ../gui/wxpython/mapdisp/gprint.py:285
+msgid ""
+"There was a problem printing.\n"
+"Perhaps your current printer is not set correctly?"
+msgstr ""
+"A fost o problemă de printare.\n"
+"Probabil imprimanta nu este setată corect?"
+
+#: ../gui/wxpython/mapdisp/main.py:116
+#, python-format
+msgid "Starting map display <%s>..."
+msgstr "Pornește afișarea hărții <%s>..."
+
+#: ../gui/wxpython/mapdisp/main.py:123
+msgid "GRASS GIS Map Display: "
+msgstr "Fereastra de vizualizare GRASS GIS:"
+
+#: ../gui/wxpython/mapdisp/main.py:129
+#, python-format
+msgid "Stopping map display <%s>..."
+msgstr "Oprește afișarea hărții <%s>..."
+
+#: ../gui/wxpython/mapdisp/statusbar.py:357
+msgid "Render"
+msgstr "Redare"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:363
+msgid "Enable/disable auto-rendering"
+msgstr "Activează/dezactivează auto-redarea"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:385
+msgid "Show comp. extent"
+msgstr "Afișează gama"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:388
+msgid "Show computational extent"
+msgstr "Afișează extinderea regiunii de calcul"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:392
+msgid "Show/hide computational region extent (set with g.region). Display region drawn as a blue box inside the computational region, computational region inside a display region as a red box)."
+msgstr "Afișează/ascunde extinderea regiunii de calcul (setează cu g.region). Afișează regiunea desenată ca un dreptunghi albastru în interiorul regiunii de calcul, iar regiunea de calcul desenat ca un dreptunchi roșu în centrul ecranului)."
+
+#: ../gui/wxpython/mapdisp/statusbar.py:432
+msgid "Display mode"
+msgstr "Modul de afișare"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:439
+msgid "Align region extent based on display size from center point. Default value for new map displays can be set up in 'User GUI settings' dialog."
+msgstr "Aliniează extinderea regiunii bazată pe dimensiunea ecranului de la punctul central. Valoarea implicită pentru afișarea unei hărți noi poate fi stabilită în caseta  'Setări GUI '. "
+
+#: ../gui/wxpython/mapdisp/statusbar.py:452
+msgid "Display resolution"
+msgstr "Rezoluția de afișare"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:459
+msgid "Constrain display resolution to computational region settings. Default value for new map displays can be set up in 'User GUI settings' dialog."
+msgstr "Forțează rezoluția de afișare la setările regiunii de calcul. Valoarea implicită pentru afișarea unei hărți noi poate fi stabilită în caseta  'Setări GUI '. "
+
+#: ../gui/wxpython/mapdisp/statusbar.py:483
+msgid "Map scale"
+msgstr "Scara hărții"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:497
+msgid "As everyone's monitors and resolutions are set differently these values are not true map scales, but should get you into the right neighborhood."
+msgstr "Pentru că toate monitoarele și rezoluțiile sunt setate diferit, aceste valori nu sunt reale, dar rămân apropiate."
+
+#: ../gui/wxpython/mapdisp/statusbar.py:550
+msgid "Go to"
+msgstr "Du-te la"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:571
+#: ../gui/wxpython/mapdisp/statusbar.py:635
+#: ../gui/wxpython/mapdisp/statusbar.py:809
+#: ../gui/wxpython/mapdisp/statusbar.py:875
+msgid "Projection not defined (check the settings)"
+msgstr "Proiecția nu este definită (verifică setările)"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:649
+#: ../gui/wxpython/mapdisp/statusbar.py:822
+#: ../gui/wxpython/mapdisp/statusbar.py:905
+msgid "Error in projection (check the settings)"
+msgstr "Eroare la proiecție  (verifică setările)"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:683
+msgid "Use defined projection"
+msgstr "Utilizează o proiecție definită"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:695
+msgid "Reproject coordinates displayed in the statusbar. Projection can be defined in GUI preferences dialog (tab 'Projection')"
+msgstr "Reproiectează coordonatele afișate în bara de stare. Proiecția poate fi definită în caseta de preferințe GUI (tab 'Proiecție')"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:720
+msgid "MASK"
+msgstr "MASCÄ‚"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:764
+msgid "Display geometry"
+msgstr "Geometria afișării"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:780
+msgid "Coordinates"
+msgstr "Coordonate"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:834
+msgid "Extent"
+msgstr "Extindere"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:929
+msgid "Comp. region"
+msgstr "Regiune de calcul"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:978
+msgid "Go to GCP No."
+msgstr "Du-te la Nr. GCP"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:994
+msgid "Valid Range:"
+msgstr "Interval valid:"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:1056
+msgid "RMS error"
+msgstr "Eroare RMS"
+
+#: ../gui/wxpython/mapdisp/statusbar.py:1059
+#, python-format
+msgid "Forward: %(forw)s, Backward: %(back)s"
+msgstr "ÃŽnainte: %(forw)s, ÃŽnapoi: %(back)s"
+
+#: ../gui/wxpython/mapdisp/mapwindow.py:1121
+#: ../gui/wxpython/nviz/mapwindow.py:792
+msgid "Querying is not implemented in standalone mode of Map Display"
+msgstr "Interogarea nu este implementată în modul de afișare"
+
+#: ../gui/wxpython/mapdisp/mapwindow.py:1611
+msgid "Zoom to saved region extents"
+msgstr "Zoom pentru a salva extinderea regiunii"
+
+#: ../gui/wxpython/mapdisp/mapwindow.py:1620
+#, python-format
+msgid "Region <%s> not found. Operation canceled."
+msgstr "Regiunea <%s> nu a fost găsită. Operațiune anulată."
+
+#: ../gui/wxpython/mapdisp/mapwindow.py:1641
+msgid "Save display extents to region file"
+msgstr "Salvează extinderea afișării în fișierul regiunii"
+
+#: ../gui/wxpython/mapdisp/mapwindow.py:1651
+#, python-format
+msgid "Region file <%s> already exists. Do you want to overwrite it?"
+msgstr "Fișierul regiunii <%s> există deja. Doriți să-l suprascrieți?"
+
+#: ../gui/wxpython/mapdisp/frame.py:64
+msgid "GRASS GIS - Map display"
+msgstr "GRASS GIS - Fereastra de vizualizare"
+
+#: ../gui/wxpython/mapdisp/frame.py:202
+#, python-format
+msgid ""
+"Unable to start wxGUI vector digitizer.\n"
+"Do you want to start TCL/TK digitizer (v.digit) instead?\n"
+"\n"
+"Details: %s"
+msgstr ""
+"Nu s-a putut deschide wxGUI pentru vectorizare.\n"
+"Doriți să porniți interfața TCL/TK pentru vectorizare (v.digit)?\n"
+"\n"
+"Detalii: %s"
+
+#: ../gui/wxpython/mapdisp/frame.py:209
+msgid "Vector digitizer failed"
+msgstr "Vectorizare eșuată"
+
+#: ../gui/wxpython/mapdisp/frame.py:250
+msgid "Vector Digitizer Toolbar"
+msgstr "Bara de instrumente pentru vectorizare"
+
+#: ../gui/wxpython/mapdisp/frame.py:271
+#, python-format
+msgid ""
+"Unable to switch to 3D display mode.\n"
+"The Nviz python extension was not found or loaded properly.\n"
+"Switching back to 2D display mode.\n"
+"\n"
+"Details: %s"
+msgstr ""
+"Nu s-a putut trece la modul de afișare 3D.\n"
+"Extensia Nviz python nu a fost găsită sau încărcată corect.\n"
+"Reveniți la modul de afișare 2D .\n"
+"\n"
+"Detalii: %s"
+
+#: ../gui/wxpython/mapdisp/frame.py:296
+msgid "Starting 3D view mode..."
+msgstr "Pornirea modului de vizualizare 3D..."
+
+#: ../gui/wxpython/mapdisp/frame.py:298
+msgid "Please wait, loading data..."
+msgstr "Vă rugăm să așteptați, încărcarea datelor..."
+
+#: ../gui/wxpython/mapdisp/frame.py:354
+msgid "Please wait, unloading data..."
+msgstr "Vă rugăm să așteptați, descărcarea datelor..."
+
+#: ../gui/wxpython/mapdisp/frame.py:355
+msgid "Switching back to 2D view mode..."
+msgstr "Revenirea la modul de vizualizare 2D..."
+
+#: ../gui/wxpython/mapdisp/frame.py:385 ../gui/wxpython/gcp/mapdisplay.py:222
+msgid "Map Toolbar"
+msgstr "Bara de instrumente pentru hartă"
+
+#: ../gui/wxpython/mapdisp/frame.py:561 ../gui/wxpython/gcp/mapdisplay.py:441
+msgid "Nothing to render (empty map). Operation canceled."
+msgstr "Nimic de redat (hartă goală). Operațiune anulată."
+
+#: ../gui/wxpython/mapdisp/frame.py:663
+msgid "No raster or vector map layer selected for querying."
+msgstr "Nici un raster sau vector selectat pentru interogare."
+
+#: ../gui/wxpython/mapdisp/frame.py:754
+#, python-format
+msgid "Vector map <%s> opened for editing - skipped."
+msgstr "Harta vectorială <%s> deschisă pentru editare - sărită."
+
+#: ../gui/wxpython/mapdisp/frame.py:759
+msgid "Nothing to query."
+msgstr "Nimic de interogat."
+
+#: ../gui/wxpython/mapdisp/frame.py:827
+msgid "Nothing found."
+msgstr "Nimic găsit."
+
+#: ../gui/wxpython/mapdisp/frame.py:955
+msgid ""
+"Click and drag with left mouse button to measure.\n"
+"Double click with left button to clear."
+msgstr ""
+"Clik și trageți cu butonul stâng al mouse-lui pentru a măsura.\n"
+"Dublu click cu butonul stâng pentru a șterge."
+
+#: ../gui/wxpython/mapdisp/frame.py:961
+msgid "Measuring distance"
+msgstr "Distanța de măsurare"
+
+#: ../gui/wxpython/mapdisp/frame.py:964
+msgid "Measuring distance:"
+msgstr "Distanța de măsurare:"
+
+#: ../gui/wxpython/mapdisp/frame.py:974
+#, python-format
+msgid ""
+"Geodesic distance is not yet supported by this tool.\n"
+"Reason: %s"
+msgstr ""
+"Distanța geodezică nu este suportată de acest intrument.\n"
+"Motivul: %s"
+
+#: ../gui/wxpython/mapdisp/frame.py:1004 ../gui/wxpython/mapdisp/frame.py:1010
+msgid "segment"
+msgstr "segment"
+
+#: ../gui/wxpython/mapdisp/frame.py:1005 ../gui/wxpython/mapdisp/frame.py:1011
+msgid "total distance"
+msgstr "distanța totală"
+
+#: ../gui/wxpython/mapdisp/frame.py:1006
+msgid "bearing"
+msgstr "depozit"
+
+#: ../gui/wxpython/mapdisp/frame.py:1006
+msgid "degrees (clockwise from grid-north)"
+msgstr "grade (în sensul acelor de ceasornic de la nord)"
+
+#: ../gui/wxpython/mapdisp/frame.py:1121
+msgid "Scale and North arrow"
+msgstr "Scara și săgeata Nord"
+
+#: ../gui/wxpython/mapdisp/frame.py:1274 ../gui/wxpython/gcp/mapdisplay.py:578
+msgid "Zoom to computational region (set with g.region)"
+msgstr "Mărește la regiunea de calcul (stabilește cu g.region)"
+
+#: ../gui/wxpython/mapdisp/frame.py:1278 ../gui/wxpython/gcp/mapdisplay.py:582
+msgid "Zoom to default region"
+msgstr "Mărește la regiunea implicită"
+
+#: ../gui/wxpython/mapdisp/frame.py:1282 ../gui/wxpython/gcp/mapdisplay.py:586
+msgid "Zoom to saved region"
+msgstr "Mărește la regiunea salvată"
+
+#: ../gui/wxpython/mapdisp/frame.py:1286
+msgid "Set computational region from display extent"
+msgstr "Setați regiunea de calcul de la extinderea de afișare"
+
+#: ../gui/wxpython/mapdisp/frame.py:1290 ../gui/wxpython/gcp/mapdisplay.py:594
+msgid "Save display geometry to named region"
+msgstr "Salvează geometria afișării la regiunea numită"
+
+#: ../gui/wxpython/nviz/tools.py:83 ../gui/wxpython/nviz/preferences.py:55
+#: ../gui/wxpython/nviz/preferences.py:60
+msgid "View"
+msgstr "Vizualizare"
+
+#: ../gui/wxpython/nviz/tools.py:95
+msgid "Analysis"
+msgstr "Analiză"
+
+#: ../gui/wxpython/nviz/tools.py:98 ../gui/wxpython/nviz/tools.py:378
+msgid "Animation"
+msgstr "Animație"
+
+#: ../gui/wxpython/nviz/tools.py:218
+msgid "Control View"
+msgstr "Vizualizare de control"
+
+#: ../gui/wxpython/nviz/tools.py:239
+msgid "Adjusts the distance and angular perspective of the image viewpoint"
+msgstr "Reglează distanța și perspectiva unghiulară de vedere a imaginii"
+
+#: ../gui/wxpython/nviz/tools.py:244 ../gui/wxpython/nviz/preferences.py:68
+msgid "Perspective:"
+msgstr "Perspectivă:"
+
+#: ../gui/wxpython/nviz/tools.py:252
+msgid "Tilts the plane of the surface from the horizontal"
+msgstr "Înclinarea planului de suprafață față de orizontală"
+
+#: ../gui/wxpython/nviz/tools.py:256 ../gui/wxpython/nviz/tools.py:1020
+msgid "Tilt:"
+msgstr "ÃŽnclinarea:"
+
+#: ../gui/wxpython/nviz/tools.py:263
+msgid "Adjusts the viewing height above the surface (angle of view automatically adjusts to maintain the same center of view)"
+msgstr "Reglează înălțimea de vizualizare deasupra suprafeței (unghiul de vedere se reglează automat pentru a menține același centru de vedere)"
+
+#: ../gui/wxpython/nviz/tools.py:268
+msgid "Adjusts the relative height of features above the plane of the surface"
+msgstr "Reglează înălțimea relativă a trăsăturilor peste planul suprafeței"
+
+#: ../gui/wxpython/nviz/tools.py:282 ../gui/wxpython/nviz/preferences.py:149
+msgid "Z-exag:"
+msgstr "Exagerarea Z:"
+
+#: ../gui/wxpython/nviz/tools.py:295
+msgid "Look:"
+msgstr "Aspect:"
+
+#: ../gui/wxpython/nviz/tools.py:298
+msgid "here"
+msgstr "aici"
+
+#: ../gui/wxpython/nviz/tools.py:301
+msgid "Allows you to select a point on the surface that becomes the new center of view. Click on the button and then on the surface."
+msgstr "Permite selectarea unui punct de pe suprafață, care devine noul centru al vizualizării. Click pe buton si după aceea pe suprafață."
+
+#: ../gui/wxpython/nviz/tools.py:307
+msgid "center"
+msgstr "centru"
+
+#: ../gui/wxpython/nviz/tools.py:310
+msgid "Resets the view to the original default center of view"
+msgstr "Resetează vizualizare la centrul de vizualizare inițial implicit"
+
+#: ../gui/wxpython/nviz/tools.py:314
+msgid "top"
+msgstr "de sus"
+
+#: ../gui/wxpython/nviz/tools.py:317
+msgid "Sets the viewer directly over the scene's center position. This top view orients approximately north south."
+msgstr "Setează privitorul direct pe poziția centrală a scenei.  Acest punct de vizualizare de sus orientezaă aproximativ nord - sud."
+
+#: ../gui/wxpython/nviz/tools.py:321
+msgid "reset"
+msgstr "resetează"
+
+#: ../gui/wxpython/nviz/tools.py:322
+msgid "Reset to default view"
+msgstr "Resetează vizualizare implicită"
+
+#: ../gui/wxpython/nviz/tools.py:340 ../gui/wxpython/nviz/preferences.py:171
+msgid "Image Appearance"
+msgstr "Aspectul Imaginii"
+
+#: ../gui/wxpython/nviz/tools.py:385
+msgid "Press 'Record' button and start changing the view. It is recommended to use fly-through mode (Map Display toolbar) to achieve smooth motion."
+msgstr "Apăsați pe butonul 'Înregistrează' și începeți să modificați vizualizare. Se recomandă să utilizați modul zboară prin (bara de instrumente din fereastra de vizualizare) pentru a realiza o mișcare fluidă."
+
+#: ../gui/wxpython/nviz/tools.py:396
+msgid "Record"
+msgstr "Înregistrează"
+
+#: ../gui/wxpython/nviz/tools.py:398
+msgid "Play"
+msgstr "Rulează"
+
+#: ../gui/wxpython/nviz/tools.py:400
+msgid "Pause"
+msgstr "Pauză"
+
+#: ../gui/wxpython/nviz/tools.py:402
+msgid "Stop"
+msgstr "Oprește"
+
+#: ../gui/wxpython/nviz/tools.py:414
+msgid "Total number of frames :"
+msgstr "Număr total de cadre:"
+
+#: ../gui/wxpython/nviz/tools.py:418
+msgid "Frame rate (FPS):"
+msgstr "Rata de cadru (FPS):"
+
+#: ../gui/wxpython/nviz/tools.py:424
+msgid "Frames are recorded with given frequency (FPS). "
+msgstr "Cadrele sunt înregistrate cu o frecvență dată (FPS)."
+
+#: ../gui/wxpython/nviz/tools.py:467
+msgid "Save image sequence"
+msgstr "Salvează secvență de imagini"
+
+#: ../gui/wxpython/nviz/tools.py:475
+msgid "Choose a directory for images"
+msgstr "Alege un director pentru imagini"
+
+#: ../gui/wxpython/nviz/tools.py:479
+msgid "File prefix:"
+msgstr "Prefix fișier:"
+
+#: ../gui/wxpython/nviz/tools.py:483
+msgid "Generated files names will look like this: prefix_1.ppm, prefix_2.ppm, ..."
+msgstr "Numele fișierelor generate va arăta astfel: prefix_1.ppm, prefix_2.ppm, ..."
+
+#: ../gui/wxpython/nviz/tools.py:484
+msgid "File format:"
+msgstr "Format fișier:"
+
+#: ../gui/wxpython/nviz/tools.py:542 ../gui/wxpython/nviz/tools.py:1766
+#: ../gui/wxpython/nviz/preferences.py:360
+msgid "Surface"
+msgstr "Suprafață"
+
+#: ../gui/wxpython/nviz/tools.py:548 ../gui/wxpython/nviz/tools.py:1079
+msgid "Constant surface"
+msgstr "Suprafață constantă"
+
+#: ../gui/wxpython/nviz/tools.py:553 ../gui/wxpython/nviz/preferences.py:462
+msgid "Vector"
+msgstr "Vector"
+
+#: ../gui/wxpython/nviz/tools.py:559
+msgid "Volume"
+msgstr "Volume"
+
+#: ../gui/wxpython/nviz/tools.py:594 ../gui/wxpython/nviz/preferences.py:252
+msgid "Lighting"
+msgstr "Iluminare"
+
+#: ../gui/wxpython/nviz/tools.py:599
+#, fuzzy
+msgid "Fringe"
+msgstr "Franjuri"
+
+#: ../gui/wxpython/nviz/tools.py:606
+msgid "Decorations"
+msgstr "Cadrul extern"
+
+#: ../gui/wxpython/nviz/tools.py:626 ../gui/wxpython/nviz/tools.py:937
+msgid "Cutting planes"
+msgstr "Planuri de tăiere"
+
+#: ../gui/wxpython/nviz/tools.py:671 ../gui/wxpython/nviz/tools.py:1467
+#: ../gui/wxpython/nviz/preferences.py:367
+msgid "Draw"
+msgstr "Desenează"
+
+#: ../gui/wxpython/nviz/tools.py:678 ../gui/wxpython/nviz/tools.py:1474
+#: ../gui/wxpython/nviz/preferences.py:373
+msgid "Mode:"
+msgstr "Mod:"
+
+#: ../gui/wxpython/nviz/tools.py:681 ../gui/wxpython/nviz/preferences.py:376
+msgid "coarse"
+msgstr "grosier"
+
+#: ../gui/wxpython/nviz/tools.py:682 ../gui/wxpython/nviz/preferences.py:377
+msgid "fine"
+msgstr "fin"
+
+#: ../gui/wxpython/nviz/tools.py:683 ../gui/wxpython/nviz/preferences.py:378
+msgid "both"
+msgstr "ambele"
+
+#: ../gui/wxpython/nviz/tools.py:692 ../gui/wxpython/nviz/tools.py:953
+#: ../gui/wxpython/nviz/tools.py:1488
+msgid "Shading:"
+msgstr "Umbrire:"
+
+#: ../gui/wxpython/nviz/tools.py:695 ../gui/wxpython/nviz/tools.py:1254
+#: ../gui/wxpython/nviz/tools.py:1491
+msgid "flat"
+msgstr "plat"
+
+#: ../gui/wxpython/nviz/tools.py:696 ../gui/wxpython/nviz/tools.py:1492
+msgid "gouraud"
+msgstr "gouraud"
+
+#: ../gui/wxpython/nviz/tools.py:704
+msgid "Set to all"
+msgstr "Setează tot"
+
+#: ../gui/wxpython/nviz/tools.py:705
+msgid "Use draw settings for all loaded surfaces"
+msgstr "Folosește parametrii de desenat pentru încărcarea tuturor suprafețelor"
+
+#: ../gui/wxpython/nviz/tools.py:713 ../gui/wxpython/nviz/preferences.py:405
+msgid "Coarse mode:"
+msgstr "Mod grosier:"
+
+#: ../gui/wxpython/nviz/tools.py:716 ../gui/wxpython/nviz/tools.py:756
+#: ../gui/wxpython/nviz/preferences.py:392
+#: ../gui/wxpython/nviz/preferences.py:409
+msgid "resolution:"
+msgstr "rezoluție:"
+
+#: ../gui/wxpython/nviz/tools.py:729 ../gui/wxpython/nviz/preferences.py:421
+msgid "style:"
+msgstr "stil:"
+
+#: ../gui/wxpython/nviz/tools.py:732 ../gui/wxpython/nviz/preferences.py:424
+#, fuzzy
+msgid "wire"
+msgstr "fir"
+
+#: ../gui/wxpython/nviz/tools.py:733 ../gui/wxpython/nviz/preferences.py:425
+msgid "surface"
+msgstr "suprafață"
+
+#: ../gui/wxpython/nviz/tools.py:745
+#, fuzzy
+msgid "Change wire color"
+msgstr "Schimbă culoarea firului"
+
+#: ../gui/wxpython/nviz/tools.py:752 ../gui/wxpython/nviz/preferences.py:388
+msgid "Fine mode:"
+msgstr "Mod fin:"
+
+#: ../gui/wxpython/nviz/tools.py:777
+msgid "Surface attributes"
+msgstr "Atributele suprafeței"
+
+#: ../gui/wxpython/nviz/tools.py:787 ../gui/wxpython/nviz/tools.py:2272
+msgid "Transparency"
+msgstr "Transparență"
+
+#: ../gui/wxpython/nviz/tools.py:788 ../gui/wxpython/nviz/tools.py:2273
+msgid "Shininess"
+msgstr "Luminozitate"
+
+#: ../gui/wxpython/nviz/tools.py:794 ../gui/wxpython/nviz/tools.py:2284
+msgid "map"
+msgstr "hartă"
+
+#: ../gui/wxpython/nviz/tools.py:797 ../gui/wxpython/nviz/tools.py:2289
+msgid "unset"
+msgstr "dezactivat"
+
+#: ../gui/wxpython/nviz/tools.py:802 ../gui/wxpython/nviz/tools.py:2294
+msgid "constant"
+msgstr "constantă"
+
+#: ../gui/wxpython/nviz/tools.py:859
+msgid "Changes the x, y, and z position of the current surface"
+msgstr "Modifică pozițiile x,y și z ale suprafeței curente"
+
+#: ../gui/wxpython/nviz/tools.py:869 ../gui/wxpython/nviz/tools.py:1055
+#: ../gui/wxpython/nviz/tools.py:1598 ../gui/wxpython/nviz/tools.py:2454
+msgid "Reset"
+msgstr "Restabilește"
+
+#: ../gui/wxpython/nviz/tools.py:870 ../gui/wxpython/nviz/tools.py:1599
+msgid "Reset to default position"
+msgstr "Restabiliște poziția default"
+
+#: ../gui/wxpython/nviz/tools.py:943
+msgid "Active cutting plane:"
+msgstr "Plan de tăiere activ:"
+
+#: ../gui/wxpython/nviz/tools.py:955
+msgid "clear"
+msgstr "curăță"
+
+#: ../gui/wxpython/nviz/tools.py:956
+msgid "top color"
+msgstr "culoarea de sus"
+
+#: ../gui/wxpython/nviz/tools.py:957
+msgid "bottom color"
+msgstr "butonul culoare"
+
+#: ../gui/wxpython/nviz/tools.py:958
+msgid "blend"
+msgstr "amestec"
+
+#: ../gui/wxpython/nviz/tools.py:959
+msgid "shaded"
+msgstr "umbrit"
+
+#: ../gui/wxpython/nviz/tools.py:971
+msgid "Horizontal X:"
+msgstr "Orizontal X:"
+
+#: ../gui/wxpython/nviz/tools.py:973
+msgid "Sets the X coordinate of the current cutting plane"
+msgstr "Setează coordonata X a planului de tăiere curent"
+
+#: ../gui/wxpython/nviz/tools.py:987
+msgid "Horizontal Y:"
+msgstr "Orizontal Y:"
+
+#: ../gui/wxpython/nviz/tools.py:989
+msgid "Sets the Y coordinate of the current cutting plane"
+msgstr "Setează coordonata Y a planului de tăiere curent"
+
+#: ../gui/wxpython/nviz/tools.py:1006
+msgid "Rotates the current cutting plane about vertical axis"
+msgstr "Efectuează o rotație în jurul axei verticale a planului de tăiere curent"
+
+#: ../gui/wxpython/nviz/tools.py:1022
+msgid "Rotates the current cutting plane about horizontal axis"
+msgstr "Efectuează o rotație în jurul axei orizontale a planului de tăiere curent"
+
+#: ../gui/wxpython/nviz/tools.py:1038
+msgid "Sets the Z coordinate of the current cutting plane (only meaningful when tilt is not 0)"
+msgstr "Setează coordonata Z a planului de tăiere curent (semnificativ doar când tilt nu este 0)"
+
+#: ../gui/wxpython/nviz/tools.py:1107
+msgid "Fine resolution:"
+msgstr "Rezoluție fină:"
+
+#: ../gui/wxpython/nviz/tools.py:1119
+msgid "Value:"
+msgstr "Valoare:"
+
+#: ../gui/wxpython/nviz/tools.py:1131 ../gui/wxpython/nviz/tools.py:2443
+msgid "Transparency:"
+msgstr "Transparență:"
+
+#: ../gui/wxpython/nviz/tools.py:1197
+msgid "Show vector lines"
+msgstr "Arată linii vectoriale"
+
+#: ../gui/wxpython/nviz/tools.py:1207 ../gui/wxpython/nviz/preferences.py:468
+msgid "Vector lines"
+msgstr "Linii vectoriale"
+
+#: ../gui/wxpython/nviz/tools.py:1214
+msgid "Line:"
+msgstr "Linie:"
+
+#: ../gui/wxpython/nviz/tools.py:1217
+msgid "width:"
+msgstr "lățime:"
+
+#: ../gui/wxpython/nviz/tools.py:1233 ../gui/wxpython/nviz/tools.py:1339
+msgid "color:"
+msgstr "culoare:"
+
+#: ../gui/wxpython/nviz/tools.py:1248
+#: ../gui/wxpython/vdigit/preferences.py:125
+msgid "Display"
+msgstr "Afișare"
+
+#: ../gui/wxpython/nviz/tools.py:1253
+msgid "on surface(s):"
+msgstr "pe suprafață:"
+
+#: ../gui/wxpython/nviz/tools.py:1263 ../gui/wxpython/nviz/tools.py:1390
+msgid "Height above surface:"
+msgstr "Înălțimea deasupra suprafeței:"
+
+#: ../gui/wxpython/nviz/tools.py:1298
+msgid "Show vector points"
+msgstr "Arată puncte vectoriale"
+
+#: ../gui/wxpython/nviz/tools.py:1307 ../gui/wxpython/nviz/preferences.py:508
+msgid "Vector points"
+msgstr "puncte vectoriale"
+
+#: ../gui/wxpython/nviz/tools.py:1318
+msgid "Icon:"
+msgstr "Pictogramă:"
+
+#: ../gui/wxpython/nviz/tools.py:1387
+msgid "Display on surface(s):"
+msgstr "Afișare pe suprafață:"
+
+#: ../gui/wxpython/nviz/tools.py:1444
+msgid "3D raster map"
+msgstr "3D raster"
+
+#: ../gui/wxpython/nviz/tools.py:1477
+msgid "isosurfaces"
+msgstr "izosuprafață"
+
+#: ../gui/wxpython/nviz/tools.py:1478
+#, fuzzy
+msgid "slices"
+msgstr "felii"
+
+#: ../gui/wxpython/nviz/tools.py:1501
+msgid "Resolution:"
+msgstr "Rezoluție:"
+
+#: ../gui/wxpython/nviz/tools.py:1523 ../gui/wxpython/nviz/tools.py:3512
+msgid "List of isosurfaces"
+msgstr "Lista izosuprafețelor"
+
+#: ../gui/wxpython/nviz/tools.py:1639
+msgid "Show light model"
+msgstr "Arată modelul de iluminare"
+
+#: ../gui/wxpython/nviz/tools.py:1652
+msgid "Light source position"
+msgstr "Poziția sursei de lumină"
+
+#: ../gui/wxpython/nviz/tools.py:1668
+msgid "Adjusts the light height"
+msgstr "Ajustează înălțimea luminii"
+
+#: ../gui/wxpython/nviz/tools.py:1692
+msgid "Light color and intensity"
+msgstr "Culoarea luminii și intensitatea"
+
+#: ../gui/wxpython/nviz/tools.py:1706 ../gui/wxpython/nviz/preferences.py:306
+msgid "Brightness:"
+msgstr "Luminozitate:"
+
+#: ../gui/wxpython/nviz/tools.py:1708
+msgid "Adjusts the brightness of the light"
+msgstr "Ajustează luminozitatea luminii"
+
+#: ../gui/wxpython/nviz/tools.py:1717 ../gui/wxpython/nviz/preferences.py:320
+msgid "Ambient:"
+msgstr "Ambient:"
+
+#: ../gui/wxpython/nviz/tools.py:1719
+msgid "Adjusts the ambient light"
+msgstr "Ajustează lumina ambientului"
+
+#: ../gui/wxpython/nviz/tools.py:1780
+#, fuzzy
+msgid "Edges with fringe"
+msgstr "Margini cu franjuri"
+
+#: ../gui/wxpython/nviz/tools.py:1782
+msgid "N && W"
+msgstr "N && V"
+
+#: ../gui/wxpython/nviz/tools.py:1783
+msgid "N && E"
+msgstr "N && E"
+
+#: ../gui/wxpython/nviz/tools.py:1784
+msgid "S && W"
+msgstr "S && V"
+
+#: ../gui/wxpython/nviz/tools.py:1785
+msgid "S && E"
+msgstr "S && E"
+
+#: ../gui/wxpython/nviz/tools.py:1805
+#, fuzzy
+msgid "Elevation of fringe from bottom:"
+msgstr "Altitudinea franjului din partea de jos:"
+
+#: ../gui/wxpython/nviz/tools.py:1858
+msgid "Arrow length (in map units):"
+msgstr "Lungimea săgeții (în unități de hartă):"
+
+#: ../gui/wxpython/nviz/tools.py:1868
+msgid "Arrow color:"
+msgstr "Culoarea săgeții:"
+
+#: ../gui/wxpython/nviz/tools.py:1877
+msgid "Place arrow"
+msgstr "Poziționează săgeată "
+
+#: ../gui/wxpython/nviz/tools.py:1900
+msgid "Scale bar length (in map units):"
+msgstr "Lungimea barei de scară (în unități de hartă):"
+
+#: ../gui/wxpython/nviz/tools.py:1910
+msgid "Scale bar color:"
+msgstr "Culoarea barei de scară:"
+
+#: ../gui/wxpython/nviz/tools.py:1919
+msgid "Place scalebar"
+msgstr "Poziționează bara de scară"
+
+#: ../gui/wxpython/nviz/tools.py:1925
+msgid "Delete last"
+msgstr "Șterge ultimul"
+
+#: ../gui/wxpython/nviz/tools.py:1958
+msgid "Do you want to record new animation without saving the previous one?"
+msgstr "Doriți să înregistrați o animație nouă fără să o salvați pe cea dinainte?"
+
+#: ../gui/wxpython/nviz/tools.py:1961
+msgid "Animation already axists"
+msgstr "Animația există deja"
+
+#: ../gui/wxpython/nviz/tools.py:2123
+msgid "No file prefix given."
+msgstr "Nici un prefix dat fișierului."
+
+#: ../gui/wxpython/nviz/tools.py:2127
+#, python-format
+msgid "Directory %s does not exist."
+msgstr "Directorul %s nu există."
+
+#: ../gui/wxpython/nviz/tools.py:2146 ../gui/wxpython/nviz/tools.py:2191
+#: ../gui/wxpython/nviz/tools.py:4299 ../gui/wxpython/nviz/mapwindow.py:2131
+#: ../gui/wxpython/nviz/mapwindow.py:2149
+msgid "constant#"
+msgstr "constantă#"
+
+#: ../gui/wxpython/nviz/tools.py:2257
+msgid "Isosurface attributes"
+msgstr "Atributele suprafeței de nivel"
+
+#: ../gui/wxpython/nviz/tools.py:2263
+msgid "toggle normal direction"
+msgstr "schimbă la direcția normală"
+
+#: ../gui/wxpython/nviz/tools.py:2269
+msgid "Isosurface value"
+msgstr "Valoarea suprafeței de nivel"
+
+#: ../gui/wxpython/nviz/tools.py:2372
+msgid "Slice attributes"
+msgstr "Atributele rândurilor"
+
+#: ../gui/wxpython/nviz/tools.py:2378
+msgid "Slice parallel to axis:"
+msgstr "Rând paral cu axa:"
+
+#: ../gui/wxpython/nviz/tools.py:2511
+msgid "W"
+msgstr "V"
+
+#: ../gui/wxpython/nviz/tools.py:2512
+msgid "N"
+msgstr "N"
+
+#: ../gui/wxpython/nviz/tools.py:2513
+msgid "S"
+msgstr "S"
+
+#: ../gui/wxpython/nviz/tools.py:2514
+msgid "E"
+msgstr "E"
+
+#: ../gui/wxpython/nviz/tools.py:2515
+msgid "NW"
+msgstr "NV"
+
+#: ../gui/wxpython/nviz/tools.py:2516
+msgid "NE"
+msgstr "NE"
+
+#: ../gui/wxpython/nviz/tools.py:2517
+msgid "SE"
+msgstr "SE"
+
+#: ../gui/wxpython/nviz/tools.py:2518
+msgid "SW"
+msgstr "SV"
+
+#: ../gui/wxpython/nviz/tools.py:3007 ../gui/wxpython/nviz/tools.py:3699
+#: ../gui/wxpython/nviz/tools.py:3701 ../gui/wxpython/nviz/tools.py:4602
+msgid "Level"
+msgstr "Nivel"
+
+#: ../gui/wxpython/nviz/tools.py:3518
+#, fuzzy
+msgid "List of slices"
+msgstr "Lista de felii"
+
+#: ../gui/wxpython/nviz/tools.py:3708 ../gui/wxpython/nviz/tools.py:3710
+#: ../gui/wxpython/nviz/tools.py:3987 ../gui/wxpython/nviz/tools.py:4615
+msgid "Slice parallel to"
+msgstr "Rând paralel cu"
+
+#: ../gui/wxpython/nviz/tools.py:4305
+msgid "None"
+msgstr "Nici unul"
+
+#: ../gui/wxpython/nviz/tools.py:4467
+msgid "Vector map is 3D"
+msgstr "Harta vectorială este 3D"
+
+#: ../gui/wxpython/nviz/tools.py:4470
+msgid "Vector map is 2D"
+msgstr "Harta vectoriala este 2D"
+
+#: ../gui/wxpython/nviz/tools.py:4472
+#, python-format
+msgid "%(features)d features (%(points)d points)"
+msgstr "%(features)d trăsături (%(points)d puncte)"
+
+#: ../gui/wxpython/nviz/tools.py:4635
+msgid "range:"
+msgstr "interval:"
+
+#: ../gui/wxpython/nviz/tools.py:4703 ../gui/wxpython/nviz/tools.py:4714
+msgid "North edge:"
+msgstr "Marginea de Nord:"
+
+#: ../gui/wxpython/nviz/tools.py:4704 ../gui/wxpython/nviz/tools.py:4715
+msgid "South edge:"
+msgstr "Marginea de Sud:"
+
+#: ../gui/wxpython/nviz/tools.py:4705 ../gui/wxpython/nviz/tools.py:4712
+#: ../gui/wxpython/nviz/tools.py:4721
+msgid "West edge:"
+msgstr "Marginea de Vest:"
+
+#: ../gui/wxpython/nviz/tools.py:4706 ../gui/wxpython/nviz/tools.py:4713
+#: ../gui/wxpython/nviz/tools.py:4722
+msgid "East edge:"
+msgstr "Marginea de Est:"
+
+#: ../gui/wxpython/nviz/tools.py:4708 ../gui/wxpython/nviz/tools.py:4719
+#: ../gui/wxpython/nviz/tools.py:4727
+msgid "Northing (Y):"
+msgstr "Nordul (Y):"
+
+#: ../gui/wxpython/nviz/tools.py:4709 ../gui/wxpython/nviz/tools.py:4718
+#: ../gui/wxpython/nviz/tools.py:4728
+msgid "Height (Z):"
+msgstr "Înălțimea (Z):"
+
+#: ../gui/wxpython/nviz/tools.py:4710 ../gui/wxpython/nviz/tools.py:4717
+#: ../gui/wxpython/nviz/tools.py:4726
+msgid "Easting (X):"
+msgstr "Estul (X):"
+
+#: ../gui/wxpython/nviz/tools.py:4723
+msgid "Bottom edge:"
+msgstr "Marginea de jos:"
+
+#: ../gui/wxpython/nviz/tools.py:4724
+msgid "Top edge:"
+msgstr "Marginea de sus:"
+
+#: ../gui/wxpython/nviz/tools.py:4828
+msgid "Adjusts the distance and direction of the image viewpoint"
+msgstr "Reglează distanța și direcția punctului de vedere a imaginii"
+
+#: ../gui/wxpython/nviz/tools.py:4860
+msgid "Adjusts the light direction. Click and drag the puck to change the light direction."
+msgstr "Reglează direcția de lumină. Faceți click și trageți pucul pentru a schimba direcția de lumină."
+
+#: ../gui/wxpython/nviz/preferences.py:31
+msgid "3D view settings"
+msgstr "Setările vizualizării 3D"
+
+#: ../gui/wxpython/nviz/preferences.py:48
+msgid "Revert settings to default, changes are not applied"
+msgstr "Reveniți la setările implicite, modificările nu sunt aplicate"
+
+#: ../gui/wxpython/nviz/preferences.py:71
+#: ../gui/wxpython/nviz/preferences.py:134
+#: ../gui/wxpython/nviz/preferences.py:152
+msgid "value:"
+msgstr "valoare:"
+
+#: ../gui/wxpython/nviz/preferences.py:83
+msgid "step:"
+msgstr "pas:"
+
+#: ../gui/wxpython/nviz/preferences.py:98
+#: ../gui/wxpython/nviz/preferences.py:265
+msgid "Position:"
+msgstr "Poziția:"
+
+#: ../gui/wxpython/nviz/preferences.py:101
+#: ../gui/wxpython/nviz/preferences.py:268
+msgid "x:"
+msgstr "x:"
+
+#: ../gui/wxpython/nviz/preferences.py:131
+msgid "Twist:"
+msgstr "Răsucește:"
+
+#: ../gui/wxpython/nviz/preferences.py:204
+msgid "Fly-through"
+msgstr "Zboară"
+
+#: ../gui/wxpython/nviz/preferences.py:215
+msgid "Move exag:"
+msgstr "Exagerarea de deplasare:"
+
+#: ../gui/wxpython/nviz/preferences.py:227
+msgid "Turn exag:"
+msgstr "Exagerarea:"
+
+#: ../gui/wxpython/nviz/preferences.py:257
+msgid "Light"
+msgstr "Lumina"
+
+#: ../gui/wxpython/nviz/preferences.py:292
+msgid "z:"
+msgstr "z:"
+
+#: ../gui/wxpython/nviz/preferences.py:436
+msgid "wire color:"
+msgstr "culoare fir:"
+
+#: ../gui/wxpython/nviz/preferences.py:515
+msgid "Size:"
+msgstr "Dimensiune:"
+
+#: ../gui/wxpython/nviz/preferences.py:530
+msgid "Marker:"
+msgstr "Marker:"
+
+#: ../gui/wxpython/nviz/preferences.py:628
+#, python-format
+msgid "3D view settings saved to file <%s>."
+msgstr "Setările de vizualizare 3D salvate ca fișier <%s>."
+
+#: ../gui/wxpython/nviz/mapwindow.py:204
+msgid "Opening 3D view was not successful. Please try to change the value of depth buffer in GUI Settings dialog > tab Map Display > Advanced and restart GUI."
+msgstr "Vizualizarea 3D nu a fost realizată cu succes. Vă rugăm să încercați să modificați valoare adâncimii zonei tampon din caseta de dialog Setări GUI > tabul Afișare hartă > Avansați și restartați GUI."
+
+#: ../gui/wxpython/nviz/mapwindow.py:530
+#, python-format
+msgid "Image is too large, your OpenGL implementation supports maximum texture size %d px."
+msgstr "Imagine este prea mare, implementarea OpenGL suportă o dimensiune maximă de  %d px."
+
+#: ../gui/wxpython/nviz/mapwindow.py:1026
+msgid "Easting"
+msgstr "Estic"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1027
+msgid "Northing"
+msgstr "Nordic"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1028
+msgid "Elevation"
+msgstr "Elevație"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1035
+msgid "Surface map name"
+msgstr "Numele hărții de suprafață"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1036
+msgid "Surface map elevation"
+msgstr "Harta suprafeței de elevație"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1037
+msgid "Surface map color"
+msgstr "Culoarea hărții de suprafață"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1046
+msgid "XY distance from previous"
+msgstr "distanța XY de la precedentul"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1047
+msgid "XYZ distance from previous"
+msgstr "distanța XYZ de la precedentul"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1048
+msgid "Distance along surface"
+msgstr "Distanța de-a lungul suprafeței"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1053
+msgid "Distance along exag. surface"
+msgstr "Distanța de-a lungul suprafeței exag."
+
+#: ../gui/wxpython/nviz/mapwindow.py:1060
+msgid "No point on surface"
+msgstr "Nici un punct pe suprafață"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1505
+msgid "Loading raster map"
+msgstr "Încărcarea hărții raster"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1509
+msgid "Loading 3d raster map"
+msgstr "Încărcarea hărții raster 3D"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1515
+msgid "failed"
+msgstr "eșuat"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1517
+#, python-format
+msgid "Unsupported layer type '%s'"
+msgstr "Tip de strat neacceptat '%s'"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1629
+msgid "Unable to unload raster map"
+msgstr "Nu se poate descărca harta raster"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1634
+msgid "Unable to unload 3d raster map"
+msgstr "Nu se poate descărca harta raster 3D"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1635
+msgid "3d raster map"
+msgstr "Hartă raster 3D"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1645
+msgid "unloaded successfully"
+msgstr "descărcat cu succes"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1697
+#, python-format
+msgid "Loading vector map <%(name)s> (%(type)s) failed"
+msgstr "Încărcarea hărții vectoriale  <%(name)s> (%(type)s) a eșuat"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1756
+#, python-format
+msgid "Unable to unload vector map <%(name)s> (%(type)s)"
+msgstr "Nu se poate descărca harta vectorială <%(name)s> (%(type)s)"
+
+#: ../gui/wxpython/nviz/mapwindow.py:1759
+#, python-format
+msgid "Vector map <%(name)s> (%(type)s) unloaded successfully"
+msgstr "Harta vectorială <%(name)s> (%(type)s) a fost descărcată cu succes"
+
+#: ../gui/wxpython/nviz/mapwindow.py:2094
+#, python-format
+msgid "Vector point layer not found (id = %d)"
+msgstr "Punctul vectorial nu a fost găsit (id = %d)"
+
+#: ../gui/wxpython/nviz/mapwindow.py:2096
+#, python-format
+msgid "Unable to set data layer properties (id = %d)"
+msgstr "Nu pot fi setate proprietățile stratului (id = %d)"
+
+#: ../gui/wxpython/nviz/mapwindow.py:2099
+#, python-format
+msgid ""
+"Setting data layer properties failed.\n"
+"\n"
+"%s"
+msgstr ""
+"Setarea proprietăților stratului a eșuat.\n"
+"\n"
+"%s"
+
+#: ../gui/wxpython/nviz/mapwindow.py:2206
+msgid "At least one raster map required"
+msgstr "Este necesară cel puțin o hartă raster"
+
+#: ../gui/wxpython/nviz/wxnviz.py:32 ../gui/wxpython/wxplot/profile.py:30
+msgid "This module requires the NumPy module, which could not be imported. It probably is not installed (it's not part of the standard Python distribution). See the Numeric Python site (http://numpy.scipy.org) for information on downloading source or binaries."
+msgstr "Acest modul necesită modulul NumPy, care nu a putut fi importat. Probabil nu este instalat (nu este parte a distribuției standard de Python). Vezi site-ul Numeric Python (http://numpy.scipy.org) pentru informații despre descărcarea codului sursă."
+
+#: ../gui/wxpython/nviz/wxnviz.py:49
+#, python-format
+msgid "3D view mode: %s\n"
+msgstr "Mod de vizualizare 3D: %s\n"
+
+#: ../gui/wxpython/nviz/wxnviz.py:409
+#, python-format
+msgid "Vector map <%s> not found"
+msgstr "Harta vectorială <%s> nu a fost găsită"
+
+#: ../gui/wxpython/nviz/wxnviz.py:474 ../gui/wxpython/nviz/wxnviz.py:486
+#, python-format
+msgid "3d raster map <%s> not found"
+msgstr "harta raster 3D <%s> nu a fost găsită"
+
+#: ../gui/wxpython/wxplot/base.py:35
+msgid "Draw/re-draw plot"
+msgstr "Desenează/redesenează graficul"
+
+#: ../gui/wxpython/wxplot/base.py:37
+msgid "Draw transect in map display window to profile"
+msgstr "Desenează linia de profil în fereastra de vizualizare"
+
+#: ../gui/wxpython/wxplot/base.py:39
+msgid "Plot options"
+msgstr "Opțiuni ale graficului"
+
+#: ../gui/wxpython/wxplot/base.py:41
+msgid "Plot statistics"
+msgstr "Statistici ale graficului"
+
+#: ../gui/wxpython/wxplot/base.py:43
+msgid "Save profile data to CSV file"
+msgstr "Salvează datele profilului ca fișier CSV"
+
+#: ../gui/wxpython/wxplot/base.py:44
+msgid "Quit plot tool"
+msgstr "ÃŽnchide instrumentul pentru grafic"
+
+#: ../gui/wxpython/wxplot/base.py:381
+msgid "Left Mouse Down at Point:"
+msgstr "Apăsați pe butonul din stânga:"
+
+#: ../gui/wxpython/wxplot/base.py:411 ../gui/wxpython/wxplot/base.py:457
+#: ../gui/wxpython/wxplot/dialogs.py:247
+msgid "Text settings"
+msgstr "Setările textului"
+
+#: ../gui/wxpython/wxplot/base.py:415 ../gui/wxpython/wxplot/base.py:471
+#: ../gui/wxpython/wxplot/dialogs.py:503
+msgid "Plot settings"
+msgstr "Setările graficului"
+
+#: ../gui/wxpython/wxplot/base.py:428
+msgid "This feature is not yet functional"
+msgstr "Această trăsătură nu este încă funcțională"
+
+#: ../gui/wxpython/wxplot/base.py:429
+msgid "Under Construction"
+msgstr "În construcție"
+
+#: ../gui/wxpython/wxplot/profile.py:52
+msgid "GRASS Profile Analysis Tool"
+msgstr "Instrument de analiză a profilului GRASS"
+
+#: ../gui/wxpython/wxplot/profile.py:63 ../gui/wxpython/wxplot/profile.py:152
+msgid "Profile of"
+msgstr "Profil"
+
+#: ../gui/wxpython/wxplot/profile.py:77
+#, python-format
+msgid "Distance (%s)"
+msgstr "Distanța (%s)"
+
+#: ../gui/wxpython/wxplot/profile.py:79
+msgid "Distance along transect"
+msgstr "Distanța de-a lungul transectului"
+
+#: ../gui/wxpython/wxplot/profile.py:80
+msgid "Cell values"
+msgstr "Valorile celulei"
+
+#: ../gui/wxpython/wxplot/profile.py:145
+msgid "Not all points of profile lie inside computational region."
+msgstr "Nu toate punctele de profil se află în interiorul regiunii de calcul."
+
+#: ../gui/wxpython/wxplot/profile.py:213
+msgid "Raster values"
+msgstr "Valorile rasterului"
+
+#: ../gui/wxpython/wxplot/profile.py:264
+msgid "You must draw a transect to profile in the map display window."
+msgstr "Trebuie să desenați un transect la profil în fereastra de vizualizare."
+
+#: ../gui/wxpython/wxplot/profile.py:265
+msgid "Nothing to profile"
+msgstr "Nimic pentru realizarea profilului"
+
+#: ../gui/wxpython/wxplot/profile.py:333
+msgid "Choose prefix for file(s) where to save profile values..."
+msgstr "Alege un prefix pentru fișierul(ele) unde vor fi salvate valorile profilului..."
+
+#: ../gui/wxpython/wxplot/profile.py:335
+msgid "Comma separated value (*.csv)|*.csv"
+msgstr "Valori separate prin virgulă (*.csv)|*.csv"
+
+#: ../gui/wxpython/wxplot/profile.py:345
+msgid "Overwrite file?"
+msgstr "Suprascrieți fișierul?"
+
+#: ../gui/wxpython/wxplot/profile.py:356
+#, python-format
+msgid ""
+"Unable to open file <%(file)s> for writing.\n"
+"Reason: %(e)s"
+msgstr ""
+"Nu s-a putut deschide fișierul <%(file)s> pentru scriere.\n"
+"Motivul: %(e)s"
+
+#: ../gui/wxpython/wxplot/profile.py:369
+#, python-format
+msgid ""
+"%(l)d files created:\n"
+"%(p)s"
+msgstr ""
+"%(l)d fișiere create:\n"
+"%(p)s"
+
+#: ../gui/wxpython/wxplot/profile.py:372
+msgid "No files generated."
+msgstr "Nici un fișier generat."
+
+#: ../gui/wxpython/wxplot/profile.py:380
+msgid "Statistics for Profile(s)"
+msgstr "Statistici pentru profil(e)"
+
+#: ../gui/wxpython/wxplot/dialogs.py:34
+msgid "Select raster maps to profile"
+msgstr "Selectează hărți raster la profil"
+
+#: ../gui/wxpython/wxplot/dialogs.py:63
+msgid "Select raster map(s) to profile:"
+msgstr "Selectează hartă raster la profil:"
+
+#: ../gui/wxpython/wxplot/dialogs.py:110
+msgid "Statistics"
+msgstr "Statistici"
+
+#: ../gui/wxpython/wxplot/dialogs.py:161
+msgid "C&opy"
+msgstr "C&opiază"
+
+#: ../gui/wxpython/wxplot/dialogs.py:162
+msgid "Copy regression statistics the clipboard (Ctrl+C)"
+msgstr "Copiază statisticile de regresie în clipboard (Ctrl+C)"
+
+#: ../gui/wxpython/wxplot/dialogs.py:191
+msgid "Regression statistics copied to clipboard"
+msgstr "Statistici de regresie copiate pe clipboard"
+
+#: ../gui/wxpython/wxplot/dialogs.py:254
+msgid "Profile title:"
+msgstr "Titlul profilului:"
+
+#: ../gui/wxpython/wxplot/dialogs.py:264
+msgid "Title font size (pts):"
+msgstr "Dimensiunea fontului pentru titlu (pts):"
+
+#: ../gui/wxpython/wxplot/dialogs.py:275
+msgid "X-axis label:"
+msgstr "Eticheta axei X:"
+
+#: ../gui/wxpython/wxplot/dialogs.py:285
+msgid "Y-axis label:"
+msgstr "Eticheta axei Y:"
+
+#: ../gui/wxpython/wxplot/dialogs.py:295
+msgid "Label font size (pts):"
+msgstr "Dimensiunea fontului pentru etichetă (pts):"
+
+#: ../gui/wxpython/wxplot/dialogs.py:318
+msgid "Font family:"
+msgstr "Familia de fonturi:"
+
+#: ../gui/wxpython/wxplot/dialogs.py:332
+msgid "Style:"
+msgstr "Stilul:"
+
+#: ../gui/wxpython/wxplot/dialogs.py:346
+msgid "Weight:"
+msgstr "Lățimea:"
+
+#: ../gui/wxpython/wxplot/dialogs.py:378 ../gui/wxpython/wxplot/dialogs.py:764
+msgid "Apply changes for the current session and close dialog"
+msgstr "Aplică schimbările pentru sesiunea curentă și închide caseta de dialog"
+
+#: ../gui/wxpython/wxplot/dialogs.py:434
+#, python-format
+msgid "Plot text sizes saved to file '%s'."
+msgstr "Dimensiuni text grafic salvate ca fișier '%s'."
+
+#: ../gui/wxpython/wxplot/dialogs.py:492
+msgid "No map or image group selected to plot."
+msgstr "Nici o hartă sau grup de imagine selectat(ă) pentru reprezentare grafică."
+
+#: ../gui/wxpython/wxplot/dialogs.py:523
+msgid "Map/image plotted"
+msgstr "Hartă/imagine reprezentată"
+
+#: ../gui/wxpython/wxplot/dialogs.py:535
+msgid "Settings for selected map"
+msgstr "Setări pentru harta selectată"
+
+#: ../gui/wxpython/wxplot/dialogs.py:550
+msgid "Line color"
+msgstr "Culoarea liniei"
+
+#: ../gui/wxpython/wxplot/dialogs.py:557
+#: ../gui/wxpython/vdigit/preferences.py:130
+msgid "Line width"
+msgstr "Lățimea liniei"
+
+#: ../gui/wxpython/wxplot/dialogs.py:590
+msgid "Transect segment marker settings"
+msgstr "Setările segmentului transect"
+
+#: ../gui/wxpython/wxplot/dialogs.py:641
+msgid "Axis settings"
+msgstr "Setările axelor"
+
+#: ../gui/wxpython/wxplot/dialogs.py:647
+msgid "X-Axis"
+msgstr "Axa X"
+
+#: ../gui/wxpython/wxplot/dialogs.py:648
+msgid "Y-Axis"
+msgstr "Axa Y"
+
+#: ../gui/wxpython/wxplot/dialogs.py:657
+msgid "Scale"
+msgstr "Scara"
+
+#: ../gui/wxpython/wxplot/dialogs.py:662
+msgid "Automatic axis scaling, custom max and min, or scale matches data range (min)"
+msgstr "Scalare automatică, personalizare maximă și minimă sau scalare în funcție de un interval (min)"
+
+#: ../gui/wxpython/wxplot/dialogs.py:667
+msgid "Custom min"
+msgstr "Personalizare minimă"
+
+#: ../gui/wxpython/wxplot/dialogs.py:675
+msgid "Custom max"
+msgstr "Personalizare maximă"
+
+#: ../gui/wxpython/wxplot/dialogs.py:683
+msgid "Log scale"
+msgstr "Scara înregistrată"
+
+#: ../gui/wxpython/wxplot/dialogs.py:707
+msgid "Grid and Legend settings"
+msgstr "Setările gridului și legendei"
+
+#: ../gui/wxpython/wxplot/dialogs.py:712
+msgid "Grid color"
+msgstr "Culoarea gridului"
+
+#: ../gui/wxpython/wxplot/dialogs.py:719
+msgid "Show grid"
+msgstr "Afișează grid"
+
+#: ../gui/wxpython/wxplot/dialogs.py:725
+msgid "Legend font size"
+msgstr "Dimensiunea fontului pentru legendă"
+
+#: ../gui/wxpython/wxplot/dialogs.py:735
+msgid "Show legend"
+msgstr "Afișează legendă"
+
+#: ../gui/wxpython/wxplot/dialogs.py:857
+#, python-format
+msgid "Plot settings saved to file '%s'."
+msgstr "Setările graficului salvate ca fișier '%s'."
+
+#: ../gui/wxpython/lmgr/layertree.py:56
+msgid "Set raster output format"
+msgstr "Setează formatul de ieșire al rasterului"
+
+#: ../gui/wxpython/lmgr/layertree.py:62
+msgid "Set vector output format"
+msgstr "Setează formatul de ieșire al vectorului"
+
+#: ../gui/wxpython/lmgr/layertree.py:64
+msgid "Add command layer"
+msgstr "Adaugă comandă"
+
+#: ../gui/wxpython/lmgr/layertree.py:68
+msgid "Add RGB map layer"
+msgstr "Adaugă un strat RGB"
+
+#: ../gui/wxpython/lmgr/layertree.py:70
+msgid "Add HIS map layer"
+msgstr "Adaugă un strat HIS"
+
+#: ../gui/wxpython/lmgr/layertree.py:72
+msgid "Add shaded relief map layer"
+msgstr "Adaugă strat de hartă al reliefului umbrit"
+
+#: ../gui/wxpython/lmgr/layertree.py:74
+msgid "Add raster flow arrows"
+msgstr "Adaugă săgeți de flux la raster"
+
+#: ../gui/wxpython/lmgr/layertree.py:76
+msgid "Add raster cell numbers"
+msgstr "Adaugă număr de celule la raster"
+
+#: ../gui/wxpython/lmgr/layertree.py:78
+msgid "Add thematic area (choropleth) map layer"
+msgstr "Adaugă hartă-areal tematică (choropleth)"
+
+#: ../gui/wxpython/lmgr/layertree.py:80
+msgid "Add thematic chart layer"
+msgstr "Adaugă diagramă tematică"
+
+#: ../gui/wxpython/lmgr/layertree.py:82
+msgid "Add grid layer"
+msgstr "Adaugă grid stratului"
+
+#: ../gui/wxpython/lmgr/layertree.py:84
+msgid "Add geodesic line layer"
+msgstr "Adaugă strat linie geodezică"
+
+#: ../gui/wxpython/lmgr/layertree.py:86
+msgid "Add rhumbline layer"
+msgstr "Adaugă strat de linie loxodromă"
+
+#: ../gui/wxpython/lmgr/layertree.py:88
+msgid "Add labels"
+msgstr "Adaugă etichete"
+
+#: ../gui/wxpython/lmgr/layertree.py:90
+msgid "Add 3D raster map layer"
+msgstr "Adaugă strat raster 3D"
+
+#: ../gui/wxpython/lmgr/layertree.py:91
+msgid "Note that 3D raster data are rendered only in 3D view mode"
+msgstr "Notă: datele raster 3D sunt redate doar în modul de vizualizare 3D"
+
+#: ../gui/wxpython/lmgr/layertree.py:161
+#, python-format
+msgid "GRASS GIS Map Display: %(id)d  - Location: %(loc)s"
+msgstr "Fereastra de vizualizare GRASS GIS: %(id)d  - Locația: %(loc)s"
+
+#: ../gui/wxpython/lmgr/layertree.py:171
+msgid "Map Layers"
+msgstr "Straturile de hartă"
+
+#: ../gui/wxpython/lmgr/layertree.py:348
+msgid "Change opacity level"
+msgstr "Modifică nivelul opacității"
+
+#: ../gui/wxpython/lmgr/layertree.py:358
+msgid "3D view properties"
+msgstr "Proprietăți vizualizare 3D"
+
+#: ../gui/wxpython/lmgr/layertree.py:362
+msgid "Zoom to selected map(s)"
+msgstr "Zoom la harta selectată"
+
+#: ../gui/wxpython/lmgr/layertree.py:364
+msgid "Set computational region from selected map(s)"
+msgstr "Setează regiunea de calcul pentru harta selectată"
+
+#: ../gui/wxpython/lmgr/layertree.py:376 ../gui/wxpython/lmgr/layertree.py:449
+msgid "Export"
+msgstr "Exportă"
+
+#: ../gui/wxpython/lmgr/layertree.py:383 ../gui/wxpython/lmgr/layertree.py:455
+msgid "Set color table"
+msgstr "Setează tabela de culoare"
+
+#: ../gui/wxpython/lmgr/layertree.py:386
+msgid "Show attribute data"
+msgstr "Arată datele de atribut"
+
+#: ../gui/wxpython/lmgr/layertree.py:389
+msgid "Start editing"
+msgstr "ÃŽncepe editarea"
+
+#: ../gui/wxpython/lmgr/layertree.py:390
+msgid "Stop editing"
+msgstr "ÃŽnchide editarea"
+
+#: ../gui/wxpython/lmgr/layertree.py:401
+msgid "Use as background vector map for digitizer"
+msgstr "Folosește ca hartă vectorială de fundal pentru vectorizare"
+
+#: ../gui/wxpython/lmgr/layertree.py:408
+msgid "Rebuild topology"
+msgstr "Reconstruiește topologia"
+
+#: ../gui/wxpython/lmgr/layertree.py:443
+msgid "Zoom to selected map(s) (ignore NULLs)"
+msgstr "Zoom la harta selectată (ignoră valorile nule)"
+
+#: ../gui/wxpython/lmgr/layertree.py:445
+msgid "Set computational region from selected map(s) (ignore NULLs)"
+msgstr "Setează regiunea de calcul pentru harta selectată (ignoră valorile nule)"
+
+#: ../gui/wxpython/lmgr/layertree.py:461
+msgid "Profile"
+msgstr "Profil"
+
+#: ../gui/wxpython/lmgr/layertree.py:553
+msgid "Unable to create profile of raster map."
+msgstr "Nu se poate crea profil pe harta raster."
+
+#: ../gui/wxpython/lmgr/layertree.py:589
+msgid "Unable to display histogram of raster map. No map name defined."
+msgstr "Nu se poate afișa histograma harții raster. Nici un nume de hartă nu este definit."
+
+#: ../gui/wxpython/lmgr/layertree.py:669
+#, python-format
+msgid "Set opacity of <%s>"
+msgstr "Setează opacitatea la <%s>"
+
+#: ../gui/wxpython/lmgr/layertree.py:773
+msgid "Layer group:"
+msgstr "Grup de straturi:"
+
+#: ../gui/wxpython/lmgr/layertree.py:778
+#: ../gui/wxpython/lmgr/layertree.py:1380
+msgid "Click to edit layer settings"
+msgstr "Click pentru a edita setările stratului"
+
+#: ../gui/wxpython/lmgr/layertree.py:820
+msgid "(double click to set properties)"
+msgstr "(dublu clik pentru setarea proprietăților)"
+
+#: ../gui/wxpython/lmgr/layertree.py:829
+msgid "RGB"
+msgstr "RGB"
+
+#: ../gui/wxpython/lmgr/layertree.py:832
+msgid "HIS"
+msgstr "HIS"
+
+#: ../gui/wxpython/lmgr/layertree.py:835
+msgid "shaded relief"
+msgstr "relief umbrit"
+
+#: ../gui/wxpython/lmgr/layertree.py:838
+msgid "raster cell numbers"
+msgstr "numărul celulelor raster"
+
+#: ../gui/wxpython/lmgr/layertree.py:841
+msgid "raster flow arrows"
+msgstr "săgeți pentru fluxul raster"
+
+#: ../gui/wxpython/lmgr/layertree.py:847
+msgid "thematic map"
+msgstr "hartă tematică"
+
+#: ../gui/wxpython/lmgr/layertree.py:850
+msgid "thematic charts"
+msgstr "grafic tematic"
+
+#: ../gui/wxpython/lmgr/layertree.py:853
+msgid "grid"
+msgstr "grid"
+
+#: ../gui/wxpython/lmgr/layertree.py:856
+msgid "geodesic line"
+msgstr "linie geodezică"
+
+#: ../gui/wxpython/lmgr/layertree.py:859
+msgid "rhumbline"
+msgstr "linie loxodromă (direcție constantă)"
+
+#: ../gui/wxpython/lmgr/layertree.py:862
+msgid "vector labels"
+msgstr "etichete vector"
+
+#: ../gui/wxpython/lmgr/layertree.py:1097
+#: ../gui/wxpython/lmgr/layertree.py:1156
+msgid "Please wait, updating data..."
+msgstr "Vă rugăm să așteptați, actualizarea datelor..."
+
+#: ../gui/wxpython/lmgr/layertree.py:1451
+msgid "opacity:"
+msgstr "opacitate:"
+
+#: ../gui/wxpython/lmgr/layertree.py:1468
+#, python-format
+msgid "Map <%s> not found."
+msgstr "Harta <%s> nu a fost găsită."
+
+#: ../gui/wxpython/lmgr/toolbars.py:50
+msgid "Start new map display"
+msgstr "Începe afișarea unei noi hărți"
+
+#: ../gui/wxpython/lmgr/toolbars.py:52
+msgid "Create new workspace (Ctrl+N)"
+msgstr "Crează un spațiu de lucru nou (Ctrl+N)"
+
+#: ../gui/wxpython/lmgr/toolbars.py:54
+msgid "Open existing workspace file (Ctrl+O)"
+msgstr "Deschide fișierul din spațiul de lucru existent (Ctrl+O)"
+
+#: ../gui/wxpython/lmgr/toolbars.py:56
+msgid "Save current workspace to file (Ctrl+S)"
+msgstr "Salvează spațiul de lucru curent în fișierul (Ctrl+S)"
+
+#: ../gui/wxpython/lmgr/toolbars.py:85
+msgid "Add multiple raster or vector map layers (Ctrl+Shift+L)"
+msgstr "Adaugă straturi multiple de raster sau vector (Ctrl+Shift+L)"
+
+#: ../gui/wxpython/lmgr/toolbars.py:86
+msgid "Add raster map layer (Ctrl+Shift+R)"
+msgstr "Adaugă strat raster (Ctrl+Shift+R)"
+
+#: ../gui/wxpython/lmgr/toolbars.py:88
+msgid "Add various raster map layers (RGB, HIS, shaded relief...)"
+msgstr "Adaugă straturi raster diferite (RGB, HIS, relief umbrit...)"
+
+#: ../gui/wxpython/lmgr/toolbars.py:89
+msgid "Add vector map layer (Ctrl+Shift+V)"
+msgstr "Adaugă strat vector (Ctrl+Shift+V)"
+
+#: ../gui/wxpython/lmgr/toolbars.py:91
+msgid "Add various vector map layers (thematic, chart...)"
+msgstr "Adaugă straturi vectoriale diferite (tematic, grafic...)"
+
+#: ../gui/wxpython/lmgr/toolbars.py:93
+msgid "Add group"
+msgstr "Adaugă grup"
+
+#: ../gui/wxpython/lmgr/toolbars.py:95
+msgid "Add grid or vector labels overlay"
+msgstr "Adaugă grid sau etichete vectoriale"
+
+#: ../gui/wxpython/lmgr/toolbars.py:97
+msgid "Remove selected map layer(s) from layer tree"
+msgstr "Elimină straturile selectate din arborele de straturi"
+
+#: ../gui/wxpython/lmgr/toolbars.py:134
+msgid "Import/link raster or vector data"
+msgstr "Importă/leago date raster sau vector"
+
+#: ../gui/wxpython/lmgr/toolbars.py:136
+msgid "Raster Map Calculator"
+msgstr "Calculator pentru raster"
+
+#: ../gui/wxpython/lmgr/toolbars.py:138
+msgid "Graphical Modeler"
+msgstr "Modelare Grafică"
+
+#: ../gui/wxpython/lmgr/toolbars.py:140
+msgid "Georectifier"
+msgstr "Georectificare"
+
+#: ../gui/wxpython/lmgr/toolbars.py:173
+msgid "GUI settings"
+msgstr "Setări GUI"
+
+#: ../gui/wxpython/lmgr/toolbars.py:174
+msgid "GRASS manual"
+msgstr "Manual GRASS"
+
+#: ../gui/wxpython/lmgr/toolbars.py:199
+msgid "Edit vector maps"
+msgstr "Editare hărți vectoriale"
+
+#: ../gui/wxpython/lmgr/toolbars.py:201
+msgid "Show attribute table"
+msgstr "Arată tabela de atribute"
+
+#: ../gui/wxpython/lmgr/toolbars.py:230
+msgid "Generate command for m.nviz.image"
+msgstr "Generează comandă pentru m.nviz.image"
+
+#: ../gui/wxpython/lmgr/toolbars.py:231
+msgid "Generate command for m.nviz.image based on current state"
+msgstr "Generează comandă pentru m.nviz.image, bazată pe starea actuală"
+
+#: ../gui/wxpython/lmgr/toolbars.py:233
+msgid "3D view mode settings"
+msgstr "Setările modului de vizualizare 3D"
+
+#: ../gui/wxpython/lmgr/toolbars.py:234
+msgid "Show 3D view mode settings dialog"
+msgstr "Afișează parametrii vizualizării 3D"
+
+#: ../gui/wxpython/lmgr/toolbars.py:236
+msgid "Show 3D view mode manual"
+msgstr "Afișează manual pentru modul de vizualizare 3D"
+
+#: ../gui/wxpython/lmgr/pyshell.py:35
+#, python-format
+msgid "Welcome to wxGUI Interactive Python Shell %s"
+msgstr "Bine ați venit în consola interactivă Python wxGUI %s"
+
+#: ../gui/wxpython/lmgr/pyshell.py:36
+#, python-format
+msgid "Type %s for more GRASS scripting related information."
+msgstr "Tip %s pentru mai multe informații relative de scripting GRASS."
+
+#: ../gui/wxpython/lmgr/pyshell.py:37
+#, python-format
+msgid "Type %s to add raster or vector to the layer tree."
+msgstr "Tip %s pentru adăugarea de raster sau vector la arborele de strat."
+
+#: ../gui/wxpython/lmgr/pyshell.py:46
+msgid "Delete all text from the shell"
+msgstr "Șterge tot textul din consolă"
+
+#: ../gui/wxpython/lmgr/pyshell.py:96
+#, python-format
+msgid "Raster or vector map <%s> not found"
+msgstr "Harta raster sau vectorială  <%s> nu a fost găsită"
+
+#: ../gui/wxpython/lmgr/pyshell.py:103
+#, python-format
+msgid "Raster map <%s> added"
+msgstr "Harta raster <%s> adăugată"
+
+#: ../gui/wxpython/lmgr/pyshell.py:105
+#, python-format
+msgid "Vector map <%s> added"
+msgstr "Harta vectorială <%s> adăugată"
+
+#: ../gui/wxpython/lmgr/frame.py:76
+msgid "GRASS GIS Layer Manager"
+msgstr "GRASS GIS Gestionare Strat"
+
+#: ../gui/wxpython/lmgr/frame.py:119
+msgid "Workspace Toolbar"
+msgstr "Bara de instrumente a spațiului de lucru"
+
+#: ../gui/wxpython/lmgr/frame.py:122
+msgid "Data Toolbar"
+msgstr "Bara de instrumente a datelor"
+
+#: ../gui/wxpython/lmgr/frame.py:125
+msgid "Misc Toolbar"
+msgstr "Bara de instrumente diverse"
+
+#: ../gui/wxpython/lmgr/frame.py:128
+msgid "Tools Toolbar"
+msgstr "Bara de instrumente a instrumentelor"
+
+#: ../gui/wxpython/lmgr/frame.py:131
+msgid "Vector Toolbar"
+msgstr "Bara de instrumente pentru vector"
+
+#: ../gui/wxpython/lmgr/frame.py:134
+msgid "3D view Toolbar"
+msgstr "Bara de instrumente pentru vizualizarea 3D"
+
+#: ../gui/wxpython/lmgr/frame.py:228 ../gui/wxpython/lmgr/frame.py:1159
+msgid "Rename Map Display"
+msgstr "Afișează harta redenumită"
+
+#: ../gui/wxpython/lmgr/frame.py:256
+msgid "Map layers"
+msgstr "Straturile tematice ale hărții"
+
+#: ../gui/wxpython/lmgr/frame.py:260 ../gui/wxpython/lmgr/frame.py:456
+msgid "Command console"
+msgstr "Consola de comandă"
+
+#: ../gui/wxpython/lmgr/frame.py:338
+#, python-format
+msgid ""
+"Location <%s> created.\n"
+"\n"
+"Do you want to switch to the new location?"
+msgstr ""
+"Locația <%s> creată.\n"
+"\n"
+"Doriți să comutați la noua locație?"
+
+#: ../gui/wxpython/lmgr/frame.py:341
+msgid "Switch to new location?"
+msgstr "Comutați la noua locație?"
+
+#: ../gui/wxpython/lmgr/frame.py:354 ../gui/wxpython/lmgr/frame.py:678
+#, python-format
+msgid ""
+"Current location is <%(loc)s>.\n"
+"Current mapset is <%(mapset)s>."
+msgstr ""
+"Locația curentă este <%(loc)s>.\n"
+"Mapset-ul curent este<%(mapset)s>."
+
+#: ../gui/wxpython/lmgr/frame.py:360 ../gui/wxpython/gis_set.py:442
+msgid "Do you want to set the default region extents and resolution now?"
+msgstr "Doriți să setați extinderea regiunii și rezoluția acum?"
+
+#: ../gui/wxpython/lmgr/frame.py:362 ../gui/wxpython/gis_set.py:444
+#, python-format
+msgid "Location <%s> created"
+msgstr "Locația <%s> creată"
+
+#: ../gui/wxpython/lmgr/frame.py:411
+msgid "Choose model to run"
+msgstr "Alege model pentru a rula"
+
+#: ../gui/wxpython/lmgr/frame.py:470 ../gui/wxpython/lmgr/frame.py:1787
+msgid "Do you want to save changes in the workspace?"
+msgstr "Doriți să salvați modificările din spațiul de lucru?"
+
+#: ../gui/wxpython/lmgr/frame.py:472 ../gui/wxpython/lmgr/frame.py:1789
+msgid "Do you want to store current settings to workspace file?"
+msgstr "Doriți să stocați setările curente în fișierul spațiului de lucru?"
+
+#: ../gui/wxpython/lmgr/frame.py:480
+#, python-format
+msgid "Close Map Display %s"
+msgstr "ÃŽnchide fereastra de vizualizare %s"
+
+#: ../gui/wxpython/lmgr/frame.py:581 ../gui/wxpython/lmgr/frame.py:1404
+msgid "Selected map layer is not vector."
+msgstr "Stratul selectat nu este un vector."
+
+#: ../gui/wxpython/lmgr/frame.py:586
+msgid "Editing is allowed only for vector maps from the current mapset."
+msgstr "Editarea este permisă doar pentru hărțile vectoriale din mapset-ul curent."
+
+#: ../gui/wxpython/lmgr/frame.py:601
+msgid "Choose script file to run"
+msgstr "Alege scriptul pentru a rula"
+
+#: ../gui/wxpython/lmgr/frame.py:603
+msgid "Python script (*.py)|*.py|Bash script (*.sh)|*.sh"
+msgstr "Script Python (*.py)|*.py|Bash script (*.sh)|*.sh"
+
+#: ../gui/wxpython/lmgr/frame.py:614
+#, python-format
+msgid "Script file '%s' doesn't exist. Operation canceled."
+msgstr "Scriptul '%s' nu există. Operațiune anulată."
+
+#: ../gui/wxpython/lmgr/frame.py:621
+#, python-format
+msgid "Script <%s> is not executable. Do you want to set the permissions that allows you to run this script (note that you must be the owner of the file)?"
+msgstr "Scriptul <%s> nu este executabil. Doriți să setați permisiunea care vă oferă posibilitatea de a rula acest script (notă: trebuie să fiți administratorul fișierului)"
+
+#: ../gui/wxpython/lmgr/frame.py:626
+msgid "Set permission?"
+msgstr "Setați permisiune?"
+
+#: ../gui/wxpython/lmgr/frame.py:635
+msgid "Unable to set permission. Operation canceled."
+msgstr "Nu s-a putut seta permisiunea. Operațiune anulată."
+
+#: ../gui/wxpython/lmgr/frame.py:646
+#, python-format
+msgid "Directory '%s' is not defined in GRASS_ADDON_PATH. Do you want add this directory to GRASS_ADDON_PATH?"
+msgstr "Directorul '%s' nu este definit în  GRASS_ADDON_PATH. Doriți să adăugați acest director la GRASS_ADDON_PATH?"
+
+#: ../gui/wxpython/lmgr/frame.py:649
+msgid "Update Addons path?"
+msgstr "Actualizați calea pentru addon-uri?"
+
+#: ../gui/wxpython/lmgr/frame.py:654
+#, python-format
+msgid "Launching script '%s'..."
+msgstr "Lansarea scriptului '%s'..."
+
+#: ../gui/wxpython/lmgr/frame.py:666
+msgid "No location/mapset provided. Operation canceled."
+msgstr "Nici un o locație/nici un mapset selectat(ă). Operațiune anulată."
+
+#: ../gui/wxpython/lmgr/frame.py:685 ../gui/wxpython/gis_set.py:795
+msgid "Enter name for new mapset:"
+msgstr "Introduceți nume pentru mapset nou:"
+
+#: ../gui/wxpython/lmgr/frame.py:692 ../gui/wxpython/lmgr/frame.py:713
+msgid "No mapset provided. Operation canceled."
+msgstr "Nici un mapset selectat. Operațiune anulată."
+
+#: ../gui/wxpython/lmgr/frame.py:701 ../gui/wxpython/lmgr/frame.py:720
+#, python-format
+msgid "Current mapset is <%s>."
+msgstr "Mapset-ul curent este <%s>."
+
+#: ../gui/wxpython/lmgr/frame.py:765
+msgid "System Info"
+msgstr "Informații Sistem"
+
+#: ../gui/wxpython/lmgr/frame.py:773
+msgid "GRASS version"
+msgstr "Versiunea GRASS"
+
+#: ../gui/wxpython/lmgr/frame.py:774
+msgid "GRASS SVN Revision"
+msgstr "Revizia GRASS SVN"
+
+#: ../gui/wxpython/lmgr/frame.py:779
+msgid "Platform"
+msgstr "Platformă"
+
+#: ../gui/wxpython/lmgr/frame.py:831
+msgid "Current workspace is not empty. Do you want to store current settings to workspace file?"
+msgstr "Spațiul de lucru curent nu este gol. Doriți să stocați setările curente pentru fișierul din spațiul de lucru?"
+
+#: ../gui/wxpython/lmgr/frame.py:834
+msgid "Create new workspace?"
+msgstr "Creați spațiu de lucru nou?"
+
+#: ../gui/wxpython/lmgr/frame.py:860
+msgid "Choose workspace file"
+msgstr "Alege fișierul spațiului de lucru"
+
+#: ../gui/wxpython/lmgr/frame.py:861 ../gui/wxpython/lmgr/frame.py:1053
+msgid "GRASS Workspace File (*.gxw)|*.gxw"
+msgstr "Fișierul spațiului de lucru GRASS (*.gxw)|*.gxw"
+
+#: ../gui/wxpython/lmgr/frame.py:896
+#, python-format
+msgid ""
+"Reading workspace file <%s> failed.\n"
+"Invalid file, unable to parse XML document."
+msgstr ""
+"Citirea fișierului spațiului de lucru <%s> a eșuat.\n"
+"Fișier nevalid, nu s-a putut analiza documentul XML."
+
+#: ../gui/wxpython/lmgr/frame.py:900 ../gui/wxpython/lmgr/frame.py:1030
+msgid "Please wait, loading workspace..."
+msgstr "Vă rugăm să așteptați, încărcarea spațiului de lucru..."
+
+#: ../gui/wxpython/lmgr/frame.py:1014
+msgid "Choose GRC file to load"
+msgstr "Alege fișier GRC pentru încărcare"
+
+#: ../gui/wxpython/lmgr/frame.py:1015
+msgid "Old GRASS Workspace File (*.grc)|*.grc"
+msgstr "Fișier mai vechi al spațiului de lucru GRASS (*.grc)|*.grc"
+
+#: ../gui/wxpython/lmgr/frame.py:1052
+msgid "Choose file to save current workspace"
+msgstr "Alege fișier pentru a salva spațiul de lucru curent"
+
+#: ../gui/wxpython/lmgr/frame.py:1067 ../gui/wxpython/lmgr/frame.py:1083
+#, python-format
+msgid "Workspace file <%s> already exists. Do you want to overwrite this file?"
+msgstr "Fișierul spațiului de lucru <%s> există deja. Doriți să suprascrieți acest fișier?"
+
+#: ../gui/wxpython/lmgr/frame.py:1107
+msgid "Writing current settings to workspace file failed."
+msgstr "Scrierea setărilor curente la fișierul spațiului de lucru a eșuat."
+
+#: ../gui/wxpython/lmgr/frame.py:1158
+msgid "Enter new name:"
+msgstr "Introduceți nume nou:"
+
+#: ../gui/wxpython/lmgr/frame.py:1164
+#, python-format
+msgid "GRASS GIS Map Display: %(name)s  - Location: %(loc)s"
+msgstr "Fereastra de vizualizare GRASS GIS: %(name)s  - Locație: %(loc)s"
+
+#: ../gui/wxpython/lmgr/frame.py:1377
+msgid "Nothing to import. No WMS layer selected."
+msgstr "Nimic de importat. Nici un strat WMS selectat."
+
+#: ../gui/wxpython/lmgr/frame.py:1413
+msgid "Please wait, loading attribute data..."
+msgstr "Vă rugăm să așteptați, încărcarea atributelor..."
+
+#: ../gui/wxpython/lmgr/frame.py:1492
+msgid "Add selected map layers into layer tree"
+msgstr "Adaugă straturile selectate la arborele de strat"
+
+#: ../gui/wxpython/lmgr/frame.py:1517
+#, python-format
+msgid "Unsupported map layer type <%s>."
+msgstr "Tip de strat neacceptat <%s>."
+
+#: ../gui/wxpython/lmgr/frame.py:1642
+msgid "Note that cell values can only be displayed for regions of less than 10,000 cells."
+msgstr "Reține faptul că valorile celulelor pot fi afișate numai pentru regiunile cu mai puțin de 10,000 celule."
+
+#: ../gui/wxpython/lmgr/frame.py:1724
+#, python-format
+msgid ""
+"Do you want to remove map layer(s)\n"
+"%s\n"
+"from layer tree?"
+msgstr ""
+"Doriți să eliminați stratul(urile)\n"
+"%s\n"
+"din arborele de strat?"
+
+#: ../gui/wxpython/lmgr/frame.py:1727
+msgid "Do you want to remove selected map layer(s) from layer tree?"
+msgstr ""
+"Doriți să eliminați stratul(urile) selectat(e)\n"
+"%s\n"
+"din arborele de strat?"
+
+#: ../gui/wxpython/lmgr/frame.py:1731
+msgid "Remove map layer"
+msgstr "Elimină strat"
+
+#: ../gui/wxpython/lmgr/frame.py:1796
+msgid "Quit GRASS GUI"
+msgstr "ÃŽnchide GRASS GUI"
+
+#: ../gui/wxpython/lmgr/frame.py:1827
+msgid "No map layer selected. Operation canceled."
+msgstr "Nici un strat selectat. Operațiune anulată."
+
+#: ../gui/wxpython/lmgr/frame.py:1837
+msgid "Display resolution is currently not constrained to computational settings. It's suggested to constrain map to region geometry. Do you want to constrain the resolution?"
+msgstr "Rezoluția eranului nu este în prezent limitată de setările de calcul. Este recomandat să limitați harta la geometria regiunii. Doriți să limitați rezoluția?"
+
+#: ../gui/wxpython/lmgr/frame.py:1846
+msgid "Constrain map to region geometry?"
+msgstr "Limitați harta la geometria regiunii?"
+
+#: ../gui/wxpython/scripts/p.cmd.py:53 ../gui/wxpython/scripts/p.rast.py:99
+#: ../gui/wxpython/scripts/p.vect.py:356
+msgid "GRASS_PYCMDFILE - File not found. Run p.mon."
+msgstr "GRASS_PYCMDFILE - Fișierul nu a fost găsit. Rulați p.mon."
+
+#: ../gui/wxpython/scripts/vkrige.py:33
+msgid "No GRASS-python library found."
+msgstr "Nici o bibliotecă python-GRASS nu a fost găsită."
+
+#: ../gui/wxpython/scripts/vkrige.py:65
+msgid "Input Data"
+msgstr "Date de intrare"
+
+#: ../gui/wxpython/scripts/vkrige.py:71
+msgid "Point dataset:"
+msgstr "Seturi de date punctuale:"
+
+#: ../gui/wxpython/scripts/vkrige.py:83
+msgid "Numeric column:"
+msgstr "Coloană numerică:"
+
+#: ../gui/wxpython/scripts/vkrige.py:94
+msgid "Kriging"
+msgstr "Kriging"
+
+#: ../gui/wxpython/scripts/vkrige.py:114
+msgid "Output"
+msgstr "Rezultat"
+
+#: ../gui/wxpython/scripts/vkrige.py:118
+msgid "Name for the output raster map:"
+msgstr "Nume pentru harta raster rezultată:"
+
+#: ../gui/wxpython/scripts/vkrige.py:126
+msgid "Export variance map as well: "
+msgstr "Exportă harta de varianță ca:"
+
+#: ../gui/wxpython/scripts/vkrige.py:267
+msgid "Kriging Module"
+msgstr "Modulul Kriging"
+
+#: ../gui/wxpython/scripts/vkrige.py:271
+msgid "Ready."
+msgstr "Gata."
+
+#: ../gui/wxpython/scripts/vkrige.py:295
+msgid "Variogram fitting"
+msgstr "Ajustarea variogramelor"
+
+#: ../gui/wxpython/scripts/vkrige.py:305
+msgid "Plot/refresh variogram"
+msgstr "Desenează/Recrează variograma"
+
+#: ../gui/wxpython/scripts/vkrige.py:316
+msgid ":"
+msgstr ":"
+
+#: ../gui/wxpython/scripts/vkrige.py:341
+msgid "Kriging techniques"
+msgstr "Tehnici Kriging"
+
+#: ../gui/wxpython/scripts/vkrige.py:355
+msgid "Block size:"
+msgstr "Dimensiunea blocului:"
+
+#: ../gui/wxpython/scripts/vkrige.py:388
+msgid "Auto-fit variogram"
+msgstr "Ajustarea automată a variogramei"
+
+#: ../gui/wxpython/scripts/vkrige.py:412
+msgid "Model: "
+msgstr "Model:"
+
+#: ../gui/wxpython/scripts/vkrige.py:496
+msgid "Work in progress! No functionality provided."
+msgstr "Lucru în progres! Nici o funcționalitatea nu este furnizată."
+
+#: ../gui/wxpython/gcp/mapdisplay.py:45
+msgid "GRASS GIS Manage Ground Control Points"
+msgstr "Gestionează puncte de control"
+
+#: ../gui/wxpython/gcp/mapdisplay.py:151
+msgid "GCP List"
+msgstr "Lista punctelor de control"
+
+#: ../gui/wxpython/gcp/mapdisplay.py:156
+msgid "Source Display"
+msgstr "Afișează sursa"
+
+#: ../gui/wxpython/gcp/mapdisplay.py:160
+msgid "Target Display"
+msgstr "Afișează ținta"
+
+#: ../gui/wxpython/gcp/mapdisplay.py:235
+msgid "GCP Display toolbar"
+msgstr "Afișează bara de instrumente pentru punctele de control"
+
+#: ../gui/wxpython/gcp/mapdisplay.py:248
+msgid "GCP Manager toolbar"
+msgstr "Afișează bara de instrumente pentru gestionarea punctelor de control"
+
+#: ../gui/wxpython/gcp/mapdisplay.py:590
+msgid "Set computational region from display"
+msgstr "Setează regiunea de calcul de la ecran"
+
+#: ../gui/wxpython/gcp/manager.py:129
+msgid "Setup for georectification"
+msgstr "Configurare pentru georectificare"
+
+#: ../gui/wxpython/gcp/manager.py:162 ../gui/wxpython/gcp/manager.py:166
+msgid "Georectifying setup canceled."
+msgstr "Configurarea pentru georectificare a fost anulată."
+
+#: ../gui/wxpython/gcp/manager.py:299
+msgid "Select map type and location/mapset"
+msgstr "Selectează tipul hărții și locația/mapset"
+
+#: ../gui/wxpython/gcp/manager.py:313
+msgid "Map type to georectify"
+msgstr "Tipul hărții pentru georectifiacre"
+
+#: ../gui/wxpython/gcp/manager.py:321
+msgid "Select source location:"
+msgstr "Selectează locația sursă:"
+
+#: ../gui/wxpython/gcp/manager.py:330
+msgid "Select source mapset:"
+msgstr "Selectează mapsetul sursă:"
+
+#: ../gui/wxpython/gcp/manager.py:383
+msgid "You must select a valid location before selecting a mapset"
+msgstr "Trebuie să selectați o locație validă înainte de a selecta un mapset"
+
+#: ../gui/wxpython/gcp/manager.py:396
+msgid "You must select a valid location and mapset in order to continue"
+msgstr "Trebuie să selectați o locație validă și un mapset pentru a continua"
+
+#: ../gui/wxpython/gcp/manager.py:415
+msgid "Select image/map group to georectify"
+msgstr "Selectează imaginea/grupul de hărți pentru georectificare"
+
+#: ../gui/wxpython/gcp/manager.py:434
+msgid "Select group:"
+msgstr "Selectează grup:"
+
+#: ../gui/wxpython/gcp/manager.py:445
+msgid "Create group if none exists"
+msgstr "Crează grup, în cazul în care nu există"
+
+#: ../gui/wxpython/gcp/manager.py:449
+msgid "Create/edit group..."
+msgstr "Crează/editează grup..."
+
+#: ../gui/wxpython/gcp/manager.py:450
+msgid "Add vector map to group..."
+msgstr "Adaugă hartă vectorială la grup..."
+
+#: ../gui/wxpython/gcp/manager.py:462 ../gui/wxpython/gcp/manager.py:2618
+msgid "Extension for output maps:"
+msgstr "Extensie pentru hărțile de ieșire:"
+
+#: ../gui/wxpython/gcp/manager.py:521
+msgid "You must select a valid image/map group in order to continue"
+msgstr "Trebuie să selectați o imagine/grup de hărți pentru a continua"
+
+#: ../gui/wxpython/gcp/manager.py:528
+msgid "You must enter an map name extension in order to continue"
+msgstr "Trenuie să introduceți numele extensiei hărții pentru a continua"
+
+#: ../gui/wxpython/gcp/manager.py:594
+msgid "Select maps to display for ground control point (GCP) creation"
+msgstr "Selectează hărți pentru a afișa crearea punctului de control (GCP)"
+
+#: ../gui/wxpython/gcp/manager.py:602 ../gui/wxpython/gcp/manager.py:2560
+msgid "Select source map to display:"
+msgstr "Selectează harta sursă pentru a afișa:"
+
+#: ../gui/wxpython/gcp/manager.py:613 ../gui/wxpython/gcp/manager.py:2565
+msgid "Select target map to display:"
+msgstr "Selectează harta destinație pentru a afișa:"
+
+#: ../gui/wxpython/gcp/manager.py:669
+msgid "You must select a source map in order to continue"
+msgstr "Trebuie să selectați o hartă sursă pentru a continua"
+
+#: ../gui/wxpython/gcp/manager.py:693
+#, python-format
+msgid ""
+"No maps in selected group <%s>.\n"
+"Please edit group or select another group."
+msgstr ""
+"Nici o hartă în grupul selectat.p <%s>.\n"
+"Vă rugăm să editați grupul sau să selectați un alt grup."
+
+#: ../gui/wxpython/gcp/manager.py:719
+msgid "Manage Ground Control Points"
+msgstr "Gestionarea punctelor de control"
+
+#: ../gui/wxpython/gcp/manager.py:950
+#, python-format
+msgid "At least %d GCPs required. Operation canceled."
+msgstr "Cel puțin %d puncte de control necesare. Operațiune anulată."
+
+#: ../gui/wxpython/gcp/manager.py:1037
+msgid "mapwin not defined for "
+msgstr "fereastra hărții nu este definită pentru"
+
+#: ../gui/wxpython/gcp/manager.py:1107
+msgid "source"
+msgstr "sursa"
+
+#: ../gui/wxpython/gcp/manager.py:1109
+msgid "target"
+msgstr "destinație"
+
+#: ../gui/wxpython/gcp/manager.py:1111
+msgid "Set GCP coordinates"
+msgstr "Setează coordonatele punctelor de control"
+
+#: ../gui/wxpython/gcp/manager.py:1112
+#, python-format
+msgid ""
+"Set %(coor)s coordinates for GCP No. %(key)s? \n"
+"\n"
+"East: %(coor0)s \n"
+"North: %(coor1)s"
+msgstr ""
+"Setează %(coor)s coordonatele pentru Nr. GCP. %(key)s? \n"
+"\n"
+"Est: %(coor0)s \n"
+"Nord: %(coor1)s "
+
+#: ../gui/wxpython/gcp/manager.py:1176
+msgid "Writing POINTS file failed"
+msgstr "Scrierea fișierului PUNCTE a eșuat"
+
+#: ../gui/wxpython/gcp/manager.py:1185
+#, python-format
+msgid "POINTS file saved for group <%s>"
+msgstr "Fișierul PUNCTE salvat pentru grupul <%s>"
+
+#: ../gui/wxpython/gcp/manager.py:1201
+msgid "source mapwin not defined"
+msgstr "fereastra sursă nu este definită"
+
+#: ../gui/wxpython/gcp/manager.py:1206
+msgid "target mapwin not defined"
+msgstr "fereastra destinație nu este definită"
+
+#: ../gui/wxpython/gcp/manager.py:1234
+msgid "Reading POINTS file failed"
+msgstr "Citirea fișierului POINTS a eșuat"
+
+#: ../gui/wxpython/gcp/manager.py:1305
+msgid ""
+"Insufficient points defined and active (checked) for selected rectification method.\n"
+"3+ points needed for 1st order,\n"
+"6+ points for 2nd order, and\n"
+"10+ points for 3rd order."
+msgstr ""
+"Insuficiente puncte definite și active (verificate) pentru metoda de rectificare selectată.\n"
+"3+ puncte necesare pentru prima transformare,\n"
+"6+puncte pentru a doua transformare, and\n"
+"10+puncte pentru a treia transformare."
+
+#: ../gui/wxpython/gcp/manager.py:1332
+msgid "Rectifying images, please wait..."
+msgstr "Rectificarea imaginii, vă rugăm să așteptați..."
+
+#: ../gui/wxpython/gcp/manager.py:1384
+#, python-format
+msgid "Transforming <%s>..."
+msgstr "Transformarea <%s>..."
+
+#: ../gui/wxpython/gcp/manager.py:1401 ../gui/wxpython/gcp/manager.py:1472
+#, python-format
+msgid "Georectification of vector map <%s> failed"
+msgstr "Georectificare hărții vectoriale <%s> a eșuat"
+
+#: ../gui/wxpython/gcp/manager.py:1443
+#, python-format
+msgid "Vector map <%s> already exists. Change extension name and georectify again."
+msgstr "Harta vectorială <%s> există deja. Alege numele extensiei și georectifică încă o dată."
+
+#: ../gui/wxpython/gcp/manager.py:1453
+msgid "For all vector maps georectified successfully,"
+msgstr "Pentru toate hărțile vectoriale georectificate cu succes,"
+
+#: ../gui/wxpython/gcp/manager.py:1454
+msgid "you will need to copy any attribute tables"
+msgstr "va trebui să copiați orice tabelă de atribute"
+
+#: ../gui/wxpython/gcp/manager.py:1455
+msgid "and reconnect them to the georectified vectors"
+msgstr "și să le reconectați la vectorii georectificați"
+
+#: ../gui/wxpython/gcp/manager.py:1478
+msgid "GCP Manager settings"
+msgstr "Setări Gestionare GCP"
+
+#: ../gui/wxpython/gcp/manager.py:1523
+msgid "Quit GCP Manager"
+msgstr "ÃŽnchide Gestionare GCP"
+
+#: ../gui/wxpython/gcp/manager.py:1524
+msgid "Save ground control points?"
+msgstr "Salvați punctele de control?"
+
+#: ../gui/wxpython/gcp/manager.py:1603
+msgid ""
+"Could not calculate RMS Error.\n"
+"Possible error with g.transform."
+msgstr ""
+"Nu s-a putut calcula eroarea RMS.\n"
+"Posibilă eroare cu g.transform."
+
+#: ../gui/wxpython/gcp/manager.py:1728
+msgid ""
+"Could not calculate new extends.\n"
+"Possible error with g.transform."
+msgstr ""
+"Nu s-a putut calcula noua extindere.\n"
+"Posibilă eroare cu g.transform."
+
+#: ../gui/wxpython/gcp/manager.py:1859
+msgid "Adjust source display to target display"
+msgstr "Reglați sursa de afișare la afișarea destinației"
+
+#: ../gui/wxpython/gcp/manager.py:1863
+msgid "Adjust target display to source display"
+msgstr "Reglați destinația de afișare la afișarea sursă"
+
+#: ../gui/wxpython/gcp/manager.py:1924 ../gui/wxpython/gcp/manager.py:1941
+msgid "use"
+msgstr "utilizează"
+
+#: ../gui/wxpython/gcp/manager.py:1925 ../gui/wxpython/gcp/manager.py:1942
+msgid "source E"
+msgstr "sursa E"
+
+#: ../gui/wxpython/gcp/manager.py:1926 ../gui/wxpython/gcp/manager.py:1943
+msgid "source N"
+msgstr "sursa N"
+
+#: ../gui/wxpython/gcp/manager.py:1927 ../gui/wxpython/gcp/manager.py:1944
+msgid "target E"
+msgstr "destinația E"
+
+#: ../gui/wxpython/gcp/manager.py:1928 ../gui/wxpython/gcp/manager.py:1945
+msgid "target N"
+msgstr "destinația N"
+
+#: ../gui/wxpython/gcp/manager.py:1929 ../gui/wxpython/gcp/manager.py:1946
+msgid "Forward error"
+msgstr "Eroare înainte"
+
+#: ../gui/wxpython/gcp/manager.py:1930 ../gui/wxpython/gcp/manager.py:1947
+msgid "Backward error"
+msgstr "Eroare înapoi"
+
+#: ../gui/wxpython/gcp/manager.py:2078
+msgid "Invalid coordinate value. Operation canceled."
+msgstr "Invalidă valoarea de coordonată. Operațiune anulată."
+
+#: ../gui/wxpython/gcp/manager.py:2117
+msgid "Create vector map group"
+msgstr "Crează un grup de hartă vectorială"
+
+#: ../gui/wxpython/gcp/manager.py:2190
+msgid "Select vector map(s) to add to group:"
+msgstr "Selectează harta vectorială pentru a adauga la grup:"
+
+#: ../gui/wxpython/gcp/manager.py:2237
+msgid "Edit GCP"
+msgstr "Editați GCP"
+
+#: ../gui/wxpython/gcp/manager.py:2248
+msgid "Ground Control Point No."
+msgstr "Nr. puncte de control"
+
+#: ../gui/wxpython/gcp/manager.py:2267
+msgid "source E:"
+msgstr "sursa E:"
+
+#: ../gui/wxpython/gcp/manager.py:2268
+msgid "target E:"
+msgstr "destinația E:"
+
+#: ../gui/wxpython/gcp/manager.py:2269
+msgid "source N:"
+msgstr "sursa N:"
+
+#: ../gui/wxpython/gcp/manager.py:2270
+msgid "target N:"
+msgstr "destinația N:"
+
+#: ../gui/wxpython/gcp/manager.py:2405
+msgid "Highlight highest RMS error only"
+msgstr "Evidențiează cea mai mare eroare RMS numai"
+
+#: ../gui/wxpython/gcp/manager.py:2411
+msgid "Highlight RMS error > M + SD * factor:"
+msgstr "Evidențiează eroara RMS  > M + SD * factor:"
+
+#: ../gui/wxpython/gcp/manager.py:2412
+msgid ""
+"Highlight GCPs with an RMS error larger than \n"
+"mean + standard deviation * given factor. \n"
+"Recommended values for this factor are between 1 and 2."
+msgstr ""
+"Evidențiează GCP -urile cu eroare RMS mai mare decât \n"
+"media + deviația standard * factor dat. \n"
+"Valorile recomandate pentru acest factor sunt între 1 și 2."
+
+#: ../gui/wxpython/gcp/manager.py:2428
+msgid "Symbol settings"
+msgstr "Setări simbol"
+
+#: ../gui/wxpython/gcp/manager.py:2454
+msgid "Color for high RMS error:"
+msgstr "Culoare pentru cea mai mare eroare RMS:"
+
+#: ../gui/wxpython/gcp/manager.py:2471
+msgid "Color for selected GCP:"
+msgstr "Culoare pentru GCP selectate:"
+
+#: ../gui/wxpython/gcp/manager.py:2488
+msgid "Color for unused GCPs:"
+msgstr "Culoare pentru GCP-urile neutilizate:"
+
+#: ../gui/wxpython/gcp/manager.py:2504
+msgid "Show unused GCPs"
+msgstr "Arată GCP-urile neutilizate"
+
+#: ../gui/wxpython/gcp/manager.py:2513
+msgid "Symbol size:"
+msgstr "Dimensiune simbol:"
+
+#: ../gui/wxpython/gcp/manager.py:2585
+msgid "Rectification"
+msgstr "Rectificare"
+
+#: ../gui/wxpython/gcp/manager.py:2591
+msgid "Select rectification order"
+msgstr "Selectați pentru rectificare"
+
+#: ../gui/wxpython/gcp/manager.py:2592
+msgid "1st order"
+msgstr "prima transformare"
+
+#: ../gui/wxpython/gcp/manager.py:2592
+msgid "2nd order"
+msgstr "a doua transformare"
+
+#: ../gui/wxpython/gcp/manager.py:2592
+msgid "3rd order"
+msgstr "a treia transformare"
+
+#: ../gui/wxpython/gcp/manager.py:2601
+msgid "Select interpolation method:"
+msgstr "Selectați metoda de interpolare:"
+
+#: ../gui/wxpython/gcp/manager.py:2612
+msgid "clip to computational region in target location"
+msgstr "decupează regiunea de calcul în funcție de locație"
+
+#: ../gui/wxpython/gcp/manager.py:2651
+msgid "RMS threshold factor must be > 0"
+msgstr "Factorul de prag RMS trebuie să fie > 0"
+
+#: ../gui/wxpython/gcp/manager.py:2654
+msgid ""
+"RMS threshold factor is < 1\n"
+"Too many points might be highlighted"
+msgstr ""
+"Factorul de prag RMS este < 1\n"
+"Prea multe puncte ar putea fi evidențiate"
+
+#: ../gui/wxpython/gcp/manager.py:2773
+#, python-format
+msgid "GCP Manager settings saved to file '%s'."
+msgstr "Setările Gestionează GCP salvate ca fișier '%s'."
+
+#: ../gui/wxpython/gis_set.py:100
+msgid "Choose project location and mapset"
+msgstr "Alege proiecția locației și mapset-ului"
+
+#: ../gui/wxpython/gis_set.py:103
+msgid "Manage"
+msgstr "Gestionează"
+
+#: ../gui/wxpython/gis_set.py:105
+#, python-format
+msgid ""
+"Welcome to GRASS GIS %s\n"
+"The world's leading open source GIS"
+msgstr ""
+"Bine ați venit la GRASS GIS %s\n"
+"Liderul mondial SIG open source"
+
+#: ../gui/wxpython/gis_set.py:109
+msgid ""
+"Select an existing project location and mapset\n"
+"or define a new location"
+msgstr ""
+"Selectează o locație și un mapset existente\n"
+"sau definește o locație nouă"
+
+#: ../gui/wxpython/gis_set.py:115
+msgid ""
+"Project location\n"
+"(projection/coordinate system)"
+msgstr ""
+"Proiecția locației\n"
+"(proiecție/sistem de coordonate)"
+
+#: ../gui/wxpython/gis_set.py:118
+msgid ""
+"Accessible mapsets\n"
+"(directories of GIS files)"
+msgstr ""
+"Mapset-uri accesibile\n"
+"(directoare ale fișierelor SIG)"
+
+#: ../gui/wxpython/gis_set.py:121
+msgid ""
+"Create new mapset\n"
+"in selected location"
+msgstr ""
+"Crează mapset nou\n"
+"în locația selectată"
+
+#: ../gui/wxpython/gis_set.py:124
+msgid "Define new location"
+msgstr "Definește locație nouă"
+
+#: ../gui/wxpython/gis_set.py:127
+msgid ""
+"Rename/delete selected\n"
+"mapset or location"
+msgstr ""
+"Redenumire/ștergere selectată\n"
+"mapset sau locație"
+
+#: ../gui/wxpython/gis_set.py:132
+msgid "Start &GRASS"
+msgstr "Pornește &GRASS"
+
+#: ../gui/wxpython/gis_set.py:138
+msgid "&Browse"
+msgstr "&Navigator"
+
+#: ../gui/wxpython/gis_set.py:140
+msgid "&Create mapset"
+msgstr "&Crează mapset"
+
+#: ../gui/wxpython/gis_set.py:142
+msgid "&Location wizard"
+msgstr "&Locație wizard"
+
+#: ../gui/wxpython/gis_set.py:143
+msgid "Start location wizard. After location is created successfully, GRASS session is started."
+msgstr "Pornește locație wizard. După ce locația va fi creată cu succes, sesiunea GRASS va porni."
+
+#: ../gui/wxpython/gis_set.py:147
+msgid "Rename mapset"
+msgstr "Redenumește mapset"
+
+#: ../gui/wxpython/gis_set.py:147
+msgid "Rename location"
+msgstr "Redenumește locația"
+
+#: ../gui/wxpython/gis_set.py:148
+msgid "Delete mapset"
+msgstr "Șterge mapset"
+
+#: ../gui/wxpython/gis_set.py:148
+msgid "Delete location"
+msgstr "Șterge locație"
+
+#: ../gui/wxpython/gis_set.py:190
+msgid "Welcome to GRASS GIS"
+msgstr "Bine ați venit în GRASS GIS"
+
+#: ../gui/wxpython/gis_set.py:198
+msgid "Enter GRASS session"
+msgstr "Introduceți sesiunea GRASS"
+
+#: ../gui/wxpython/gis_set.py:214 ../gui/wxpython/gis_set.py:655
+msgid "Unable to set GRASS database. Check your locale settings."
+msgstr "Nu se poate stabili baza de date GRASS. Verificați setările de localizare."
+
+#: ../gui/wxpython/gis_set.py:232
+#, python-format
+msgid "ERROR: Location <%s> not found"
+msgstr "EROARE: Locația <%s> nu a fost găsită"
+
+#: ../gui/wxpython/gis_set.py:244
+#, python-format
+msgid "ERROR: Mapset <%s> not found"
+msgstr "EROARE: Mapset <%s> nu a fost găsit"
+
+#: ../gui/wxpython/gis_set.py:383
+#, python-format
+msgid "Invalid line in GISRC file (%(e)s):%(l)s\n"
+msgstr "Linie invalidă în fișierul GISRC (%(e)s):%(l)s\n"
+
+#: ../gui/wxpython/gis_set.py:412
+#, python-format
+msgid "Do you want to import data source <%(name)s> to created location? Default region will be set to match imported map."
+msgstr "Doriți să importați sursa datei<%(name)s> pentru crearea locației? Regiunea va fi setată implicit pentru a se potrivi cu harta importată."
+
+#: ../gui/wxpython/gis_set.py:416
+msgid "Import data"
+msgstr "Importă data"
+
+#: ../gui/wxpython/gis_set.py:428
+msgid "Do you want to create new mapset?"
+msgstr "Doriți să creați un mapset nou?"
+
+#: ../gui/wxpython/gis_set.py:471
+#, python-format
+msgid "Import of vector data source <%(name)s> failed."
+msgstr "Importul datelor vectoriale <%(name)s> a eșuat."
+
+#: ../gui/wxpython/gis_set.py:475
+#, python-format
+msgid "Vector data source <%(name)s> imported successfully."
+msgstr "Datele vectoriale <%(name)s> au fost importate cu succes."
+
+#: ../gui/wxpython/gis_set.py:490
+#, python-format
+msgid "Attempt to import data source <%(name)s> as raster or vector failed. "
+msgstr "Încercarea de a importa datele <%(name)s> ca raster sau vector a eșuat."
+
+#: ../gui/wxpython/gis_set.py:494
+#, python-format
+msgid "Raster data source <%(name)s> imported successfully."
+msgstr "Datele raster <%(name)s> au fost importate cu succes."
+
+#: ../gui/wxpython/gis_set.py:522
+msgid ""
+"Mapset <PERMANENT> is required for valid GRASS location.\n"
+"\n"
+"This mapset cannot be renamed."
+msgstr ""
+"Mapset <PERMANENT>este necesar pentru o locație GRASS validă.\n"
+"\n"
+"Acest mapset nu poate fi redenumit."
+
+#: ../gui/wxpython/gis_set.py:527 ../gui/wxpython/gis_set.py:563
+#, python-format
+msgid ""
+"Current name: %s\n"
+"\n"
+"Enter new name:"
+msgstr ""
+"Nume curent: %s\n"
+"\n"
+"Introduceți un nume nou:"
+
+#: ../gui/wxpython/gis_set.py:528
+msgid "Rename selected mapset"
+msgstr "Redenumește mapsetul selectat"
+
+#: ../gui/wxpython/gis_set.py:540
+#, python-format
+msgid ""
+"Unable to rename mapset.\n"
+"\n"
+"Mapset <%s> already exists in location."
+msgstr ""
+"Nu s-a putut redenumi mapset-ul.\n"
+"\n"
+"Mapset-ul <%s> există deja în locație."
+
+#: ../gui/wxpython/gis_set.py:552
+#, python-format
+msgid ""
+"Unable to rename mapset.\n"
+"\n"
+"%s"
+msgstr ""
+"Nu s-a putut redenumi mapset-ul.\n"
+"\n"
+"%s"
+
+#: ../gui/wxpython/gis_set.py:564
+msgid "Rename selected location"
+msgstr "Redenumește locația selectată"
+
+#: ../gui/wxpython/gis_set.py:576
+#, python-format
+msgid ""
+"Unable to rename location.\n"
+"\n"
+"Location <%s> already exists in GRASS database."
+msgstr ""
+"Nu s-a putut redenumi locația.\n"
+"\n"
+"Locația <%s> există deja în baza de date GRASS."
+
+#: ../gui/wxpython/gis_set.py:589
+#, python-format
+msgid ""
+"Unable to rename location.\n"
+"\n"
+"%s"
+msgstr ""
+"Nu s-a putut redenumi locația.\n"
+"\n"
+"%s"
+
+#: ../gui/wxpython/gis_set.py:601
+msgid ""
+"Mapset <PERMANENT> is required for valid GRASS location.\n"
+"\n"
+"This mapset cannot be deleted."
+msgstr ""
+"Mapset <PERMANENT> este necesar pentru locația GRASS validă.\n"
+"\n"
+"Acest mapset nu poate fi șters."
+
+#: ../gui/wxpython/gis_set.py:605
+#, python-format
+msgid ""
+"Do you want to continue with deleting mapset <%(mapset)s> from location <%(location)s>?\n"
+"\n"
+"ALL MAPS included in this mapset will be PERMANENTLY DELETED!"
+msgstr ""
+"Doriți continuarea ștergerii mapset-ului <%(mapset)s> din locația <%(location)s>?\n"
+"\n"
+"TOATE HĂRȚILE incluse în acest mapset vor fi ȘTERSE DEFINITIV!"
+
+#: ../gui/wxpython/gis_set.py:610
+msgid "Delete selected mapset"
+msgstr "Șterge mapset selectat"
+
+#: ../gui/wxpython/gis_set.py:619
+msgid "Unable to delete mapset"
+msgstr "Nu s-a putut șterge mapset"
+
+#: ../gui/wxpython/gis_set.py:630
+#, python-format
+msgid ""
+"Do you want to continue with deleting location <%s>?\n"
+"\n"
+"ALL MAPS included in this location will be PERMANENTLY DELETED!"
+msgstr ""
+"Doriți continuarea ștergerii locației <%s>?\n"
+"\n"
+" TOATE HĂRȚILE incluse în acestă locație vor fi ȘTERSE DEFINITIV!"
+
+#: ../gui/wxpython/gis_set.py:634
+msgid "Delete selected location"
+msgstr "Șterge locație selectată"
+
+#: ../gui/wxpython/gis_set.py:645
+msgid "Unable to delete location"
+msgstr "Nu s-a putut șterge locația"
+
+#: ../gui/wxpython/gis_set.py:809
+#, python-format
+msgid "Mapset <%s> already exists."
+msgstr "Mapset <%s> există deja."
+
+#: ../gui/wxpython/gis_set.py:826
+#, python-format
+msgid "Unable to create new mapset: %s"
+msgstr "Nu s-a putut crea mapset nou: %s"
+
+#: ../gui/wxpython/gis_set.py:839
+#, python-format
+msgid ""
+"GRASS is already running in selected mapset <%(mapset)s>\n"
+"(file %(lock)s found).\n"
+"\n"
+"Concurrent use not allowed.\n"
+"\n"
+"Do you want to try to remove .gislock (note that you need permission for this operation) and continue?"
+msgstr ""
+"GRASS deja rulează în mapset-ul selectat<%(mapset)s>\n"
+"(fișier %(lock)s găsit).\n"
+"\n"
+"Utilizarea concomitentă nu este permisă.\n"
+"\n"
+"Doriți să încercați să eliminați .gislock (notă: pentru această operațiune aveți nevoie de permisiune) și să continuați?"
+
+#: ../gui/wxpython/gis_set.py:845 ../gui/wxpython/gis_set.py:857
+msgid "Lock file found"
+msgstr "Blocare fișier găsit"
+
+#: ../gui/wxpython/gis_set.py:853
+msgid ""
+"ARE YOU REALLY SURE?\n"
+"\n"
+"If you really are running another GRASS session doing this could corrupt your data. Have another look in the processor manager just to be sure..."
+msgstr ""
+"SUNTEÈšI SIGUR?\n"
+"\n"
+"Dacă rulați o altă sesiune de GRASS, aceasta vă poate afecta datele. Uitați-vă în gestionează procesor pentru a fi siguri..."
+
+#: ../gui/wxpython/gis_set.py:868
+#, python-format
+msgid ""
+"Unable to remove '%(lock)s'.\n"
+"\n"
+"Details: %(reason)s"
+msgstr ""
+"Nu poate fi eliminat '%(lock)s'.\n"
+"\n"
+"Detalii: %(reason)s"
+
+#: ../gui/wxpython/gis_set.py:918
+#, python-format
+msgid "Name <%(name)s> is not a valid name for location or mapset. Please use only ASCII characters excluding %(chars)s and space."
+msgstr "Nume <%(name)s> nu este un nume valid pentru locație și mapset. Vă rugăm să folosiți doar caractere ASCII fără %(chars)s și spații."
+
+#: ../gui/wxpython/gis_set.py:921
+msgid "Invalid name"
+msgstr "Nume invalid"
+
+#: ../gui/wxpython/gis_set.py:984
+msgid "Starting GRASS for the first time"
+msgstr "Pornește GRASS pentru prima dată"
+
+#: ../gui/wxpython/gis_set.py:985
+msgid "GRASS needs a directory in which to store its data. Create one now if you have not already done so. A popular choice is \"grassdata\", located in your home directory."
+msgstr "GRASS are nevoie de un director în care să stocheze datele. Crează unul acum, în cazul în care nu ai făcut deja acest lucru. Alegerea cea mai întâlnită este \"grassdata\", aflată în directorul acasă."
+
+#: ../gui/wxpython/icons/icon.py:83
+#, python-format
+msgid "Unable to load icon theme. Reason: %s"
+msgstr "Nu s-a putut încărca tema imaginii. Motivul: %s"
+
+#: ../gui/wxpython/vdigit/toolbars.py:84
+msgid "Digitize new point"
+msgstr "Vectorizează punct nou"
+
+#: ../gui/wxpython/vdigit/toolbars.py:85 ../gui/wxpython/vdigit/toolbars.py:94
+#: ../gui/wxpython/vdigit/toolbars.py:97
+msgid "Left: new point"
+msgstr "Stânga: punct nou"
+
+#: ../gui/wxpython/vdigit/toolbars.py:87
+msgid "Digitize new line"
+msgstr "Vectorizează linie nouă"
+
+#: ../gui/wxpython/vdigit/toolbars.py:88 ../gui/wxpython/vdigit/toolbars.py:91
+#: ../gui/wxpython/vdigit/toolbars.py:112
+msgid "Left: new point; Ctrl+Left: undo last point; Right: close line"
+msgstr "Stânga: punct nou; Ctrl+Left: anulează ultimul punct; Dreapta: închide linie"
+
+#: ../gui/wxpython/vdigit/toolbars.py:90
+msgid "Digitize new boundary"
+msgstr "Vectorizează limită nouă"
+
+#: ../gui/wxpython/vdigit/toolbars.py:93
+msgid "Digitize new centroid"
+msgstr "Vectorizează centroid nou"
+
+#: ../gui/wxpython/vdigit/toolbars.py:96
+msgid "Digitize new area (composition of boundaries without category and one centroid with category)"
+msgstr "Vectorizează un areal nou (crează o limită fără categori și un centroid cu categorie)"
+
+#: ../gui/wxpython/vdigit/toolbars.py:99
+msgid "Add new vertex"
+msgstr "Adaugă vertex nou"
+
+#: ../gui/wxpython/vdigit/toolbars.py:100
+#: ../gui/wxpython/vdigit/toolbars.py:103
+#: ../gui/wxpython/vdigit/toolbars.py:115
+#: ../gui/wxpython/vdigit/toolbars.py:118
+#: ../gui/wxpython/vdigit/toolbars.py:121
+#: ../gui/wxpython/vdigit/toolbars.py:130
+msgid "Left: Select; Ctrl+Left: Unselect; Right: Confirm"
+msgstr "Stânga: Selectează; Ctrl+Left: Deselectează; Dreapta: Confirmă"
+
+#: ../gui/wxpython/vdigit/toolbars.py:102
+msgid "Delete feature(s)"
+msgstr "Șterge trăsătură(i)"
+
+#: ../gui/wxpython/vdigit/toolbars.py:105
+msgid "Display/update attributes"
+msgstr "Afișează/actualizează atributele"
+
+#: ../gui/wxpython/vdigit/toolbars.py:106
+#: ../gui/wxpython/vdigit/toolbars.py:109
+msgid "Left: Select"
+msgstr "Stânga: Selectează"
+
+#: ../gui/wxpython/vdigit/toolbars.py:108
+msgid "Display/update categories"
+msgstr "Afișează/actualizează categorii"
+
+#: ../gui/wxpython/vdigit/toolbars.py:111
+msgid "Edit line/boundary"
+msgstr "Editează linie/limită"
+
+#: ../gui/wxpython/vdigit/toolbars.py:114
+msgid "Move feature(s)"
+msgstr "Mută trăsătură(i)"
+
+#: ../gui/wxpython/vdigit/toolbars.py:117
+msgid "Move vertex"
+msgstr "Mută vertex"
+
+#: ../gui/wxpython/vdigit/toolbars.py:120
+msgid "Remove vertex"
+msgstr "Elimină vertex"
+
+#: ../gui/wxpython/vdigit/toolbars.py:122
+#: ../gui/wxpython/vdigit/toolbars.py:377
+msgid "Digitization settings"
+msgstr "Setările vectorizării"
+
+#: ../gui/wxpython/vdigit/toolbars.py:123
+msgid "Quit digitizer"
+msgstr "ÃŽnchide vectorizarea"
+
+#: ../gui/wxpython/vdigit/toolbars.py:124
+msgid "Quit digitizer and save changes"
+msgstr "Închide vectorizarea și salvează modificările"
+
+#: ../gui/wxpython/vdigit/toolbars.py:125
+msgid "Vector Digitizer manual"
+msgstr "Manual pentru vectorizare"
+
+#: ../gui/wxpython/vdigit/toolbars.py:126
+msgid "Show Vector Digitizer manual"
+msgstr "Afișează manual pentru vectorizare"
+
+#: ../gui/wxpython/vdigit/toolbars.py:128
+msgid "Additional tools (copy, flip, connect, etc.)"
+msgstr "Instrumente suplimentare (copiază, întoarce, conectează, etc.)"
+
+#: ../gui/wxpython/vdigit/toolbars.py:132
+msgid "Undo"
+msgstr "ÃŽnapoi"
+
+#: ../gui/wxpython/vdigit/toolbars.py:133
+msgid "Undo previous changes"
+msgstr "Inapoi la modificările anterioare"
+
+#: ../gui/wxpython/vdigit/toolbars.py:393
+msgid "Break selected lines/boundaries at intersection"
+msgstr "Linii întrerupte selectate/limite la intersecție"
+
+#: ../gui/wxpython/vdigit/toolbars.py:395
+msgid "Connect selected lines/boundaries"
+msgstr "Conectează liniile/limitele selectate"
+
+#: ../gui/wxpython/vdigit/toolbars.py:397
+msgid "Copy categories"
+msgstr "Copiază categorii"
+
+#: ../gui/wxpython/vdigit/toolbars.py:399
+msgid "Copy features from (background) vector map"
+msgstr "Copiază trăsăturile din (fundal) harta vectorială"
+
+#: ../gui/wxpython/vdigit/toolbars.py:401
+msgid "Copy attributes"
+msgstr "Copiază atributele"
+
+#: ../gui/wxpython/vdigit/toolbars.py:403
+msgid "Feature type conversion"
+msgstr "Conversia tipului de trăsătură"
+
+#: ../gui/wxpython/vdigit/toolbars.py:405
+msgid "Flip selected lines/boundaries"
+msgstr "Revine la liniile/limitele selectate"
+
+#: ../gui/wxpython/vdigit/toolbars.py:407
+msgid "Merge selected lines/boundaries"
+msgstr "Imbină liniile/limitele selectate"
+
+#: ../gui/wxpython/vdigit/toolbars.py:409
+msgid "Snap selected lines/boundaries (only to nodes)"
+msgstr "Aplică snap la liniile/limitele selectate (doar la noduri)"
+
+#: ../gui/wxpython/vdigit/toolbars.py:411
+msgid "Split line/boundary"
+msgstr "Împarte linie/limită"
+
+#: ../gui/wxpython/vdigit/toolbars.py:413
+msgid "Query features"
+msgstr "Interoghează trăsăturile"
+
+#: ../gui/wxpython/vdigit/toolbars.py:415
+#, fuzzy
+msgid "Z bulk-labeling of 3D lines"
+msgstr "Etichetarea liniilor 3D de altitudine"
+
+#: ../gui/wxpython/vdigit/toolbars.py:571
+msgid "Vector map is not 3D. Operation canceled."
+msgstr "Harta vectorială nu este 3D. Operațiune anulată."
+
+#: ../gui/wxpython/vdigit/toolbars.py:640
+#: ../gui/wxpython/vdigit/toolbars.py:723
+#: ../gui/wxpython/vdigit/toolbars.py:802
+msgid "Select vector map"
+msgstr "Selectează harta vectorială"
+
+#: ../gui/wxpython/vdigit/toolbars.py:678
+#, python-format
+msgid "Please wait, opening vector map <%s> for editing..."
+msgstr "Vă rugăm să așteptați, deschiderea hărții vectoriale <%s> pentru editare..."
+
+#: ../gui/wxpython/vdigit/toolbars.py:731
+#, python-format
+msgid "Do you want to save changes in vector map <%s>?"
+msgstr "Doriți să salvați modificările din harta vectorială <%s>?"
+
+#: ../gui/wxpython/vdigit/toolbars.py:733
+msgid "Save changes?"
+msgstr "Salvați modificările?"
+
+#: ../gui/wxpython/vdigit/toolbars.py:740
+#, python-format
+msgid "Please wait, closing and rebuilding topology of vector map <%s>..."
+msgstr "Vă rugăm să așteptați, închiderea și reconstruirea topologiei hărții vectoriale<%s>..."
+
+#: ../gui/wxpython/vdigit/toolbars.py:750
+#, python-format
+msgid "Editing of vector map <%s> successfully finished"
+msgstr "Editarea hărții vectoriale <%s> a fost finalizată cu succes"
+
+#: ../gui/wxpython/vdigit/toolbars.py:808
+#: ../gui/wxpython/vdigit/toolbars.py:813
+msgid "New vector map"
+msgstr "Harta vectorială nouă"
+
+#: ../gui/wxpython/vdigit/dialogs.py:74
+msgid "List of categories - right-click to delete"
+msgstr "Listă de categorii - click dreapta pentru a șterge"
+
+#: ../gui/wxpython/vdigit/dialogs.py:105
+msgid "Add new category"
+msgstr "Adaugă categorie nouă"
+
+#: ../gui/wxpython/vdigit/dialogs.py:144
+msgid "Ignore changes and close dialog"
+msgstr "Ignoră modificările și închide caseta de dialog"
+
+#: ../gui/wxpython/vdigit/dialogs.py:146
+msgid "Apply changes and close dialog"
+msgstr "Aplică modificările și închide caseta de dialog"
+
+#: ../gui/wxpython/vdigit/dialogs.py:236 ../gui/wxpython/vdigit/dialogs.py:455
+#, python-format
+msgid ""
+"Unable to add new layer/category <%(layer)s/%(category)s>.\n"
+"Layer and category number must be integer.\n"
+"Layer number must be greater than zero."
+msgstr ""
+"Nu s-a putut adăuga strat nou/categorie<%(layer)s/%(category)s>.\n"
+"Numărul de strat și de categorie trebuie să fie integer.\n"
+"Numărul de strat trebuie să fie mai mare decât zero."
+
+#: ../gui/wxpython/vdigit/dialogs.py:432
+msgid "Unable to update vector map."
+msgstr "Nu s-a putut actualiza harta vectorială."
+
+#: ../gui/wxpython/vdigit/dialogs.py:592
+#, python-format
+msgid "%d lines selected for z bulk-labeling"
+msgstr "%d linii selectate pentru etichetarea altitudinii"
+
+#: ../gui/wxpython/vdigit/dialogs.py:595
+msgid "Set value"
+msgstr "Setează valoare"
+
+#: ../gui/wxpython/vdigit/dialogs.py:602
+msgid "Starting value"
+msgstr "Valoare de pornire"
+
+#: ../gui/wxpython/vdigit/dialogs.py:611
+msgid "Step"
+msgstr "Pas"
+
+#: ../gui/wxpython/vdigit/dialogs.py:641
+msgid "List of duplicates"
+msgstr "Lista dublurilor"
+
+#: ../gui/wxpython/vdigit/dialogs.py:737
+msgid "Feature id"
+msgstr "Id trăsătură"
+
+#: ../gui/wxpython/vdigit/dialogs.py:738
+msgid "Layer (Categories)"
+msgstr "Strat (Categorii)"
+
+#: ../gui/wxpython/vdigit/preferences.py:53
+msgid "Apply changes for this session"
+msgstr "Aplică modificările pentru această sesiune"
+
+#: ../gui/wxpython/vdigit/preferences.py:56
+msgid "Close dialog and save changes to user settings file"
+msgstr "Închide caseta de dialog și salvează modificările din fișierul de setări"
+
+#: ../gui/wxpython/vdigit/preferences.py:148
+msgid "Snapping"
+msgstr "Snapping"
+
+#: ../gui/wxpython/vdigit/preferences.py:154
+msgid "Snapping threshold"
+msgstr "Aplică snapping la prag"
+
+#: ../gui/wxpython/vdigit/preferences.py:161
+msgid "screen pixels"
+msgstr "pixelii ecranului"
+
+#: ../gui/wxpython/vdigit/preferences.py:161
+msgid "map units"
+msgstr "unitățile hărții"
+
+#: ../gui/wxpython/vdigit/preferences.py:170
+msgid "Snap also to vertex"
+msgstr "Aplică snap la vertex"
+
+#: ../gui/wxpython/vdigit/preferences.py:175
+#: ../gui/wxpython/vdigit/preferences.py:603
+#: ../gui/wxpython/vdigit/preferences.py:617
+#: ../gui/wxpython/vdigit/preferences.py:621
+#, python-format
+msgid "Snapping threshold is %(value).1f %(units)s"
+msgstr "Snapping pentru prag este %(value).1f %(units)s"
+
+#: ../gui/wxpython/vdigit/preferences.py:188
+msgid "Select vector features"
+msgstr "Selectează trăsăturile vectoriale"
+
+#: ../gui/wxpython/vdigit/preferences.py:205
+msgid "Select threshold"
+msgstr "Selectează prag"
+
+#: ../gui/wxpython/vdigit/preferences.py:218
+msgid "Select only features inside of selection bounding box"
+msgstr "Selectează doar trăsăturile din interiorul casetei de încadrare de selecție"
+
+#: ../gui/wxpython/vdigit/preferences.py:220
+msgid "By default are selected all features overlapping selection bounding box "
+msgstr "Implicit sunt selectate toate trăsăturile casetei de încadrare selectată care se suprapun"
+
+#: ../gui/wxpython/vdigit/preferences.py:223
+msgid "Check for duplicates"
+msgstr "Caută dublurile"
+
+#: ../gui/wxpython/vdigit/preferences.py:235
+msgid "Digitize line features"
+msgstr "Vectorizează trăsături lineare"
+
+#: ../gui/wxpython/vdigit/preferences.py:238
+msgid "Break lines at intersection"
+msgstr "Întrerupe liniile la intersecție"
+
+#: ../gui/wxpython/vdigit/preferences.py:248
+msgid "Save changes"
+msgstr "Salvează modificările"
+
+#: ../gui/wxpython/vdigit/preferences.py:251
+msgid "Save changes on exit"
+msgstr "Salvează modificările la ieșire"
+
+#: ../gui/wxpython/vdigit/preferences.py:263
+msgid "Query tool"
+msgstr "Instrument de interogare"
+
+#: ../gui/wxpython/vdigit/preferences.py:270
+msgid "Choose query tool"
+msgstr "Alege instrument de interogare"
+
+#: ../gui/wxpython/vdigit/preferences.py:275
+msgid "Select by box"
+msgstr "Selectați după casetă"
+
+#: ../gui/wxpython/vdigit/preferences.py:284
+#: ../gui/wxpython/vdigit/preferences.py:416
+msgid "length"
+msgstr "lungime"
+
+#: ../gui/wxpython/vdigit/preferences.py:289
+msgid "Select lines"
+msgstr "Selectează linii"
+
+#: ../gui/wxpython/vdigit/preferences.py:291
+#: ../gui/wxpython/vdigit/preferences.py:314
+msgid "shorter than"
+msgstr "mai scurt de"
+
+#: ../gui/wxpython/vdigit/preferences.py:291
+#: ../gui/wxpython/vdigit/preferences.py:314
+msgid "longer than"
+msgstr "mai lung de"
+
+#: ../gui/wxpython/vdigit/preferences.py:307
+msgid "dangle"
+msgstr "linie deplasată"
+
+#: ../gui/wxpython/vdigit/preferences.py:312
+msgid "Select dangles"
+msgstr "Selectează linie deplasată"
+
+#: ../gui/wxpython/vdigit/preferences.py:351
+msgid "Digitize new feature"
+msgstr "Vectorizează o nouă trăsătură"
+
+#: ../gui/wxpython/vdigit/preferences.py:356
+msgid "Add new record into table"
+msgstr "Adaugă înregistrare nouă în tabel"
+
+#: ../gui/wxpython/vdigit/preferences.py:362
+msgid "Mode"
+msgstr "Mod"
+
+#: ../gui/wxpython/vdigit/preferences.py:362
+#: ../gui/wxpython/vdigit/preferences.py:384
+msgid "Next to use"
+msgstr "Următorul pentru a utiliza"
+
+#: ../gui/wxpython/vdigit/preferences.py:372
+msgid "Category number"
+msgstr "Număr de categorie"
+
+#: ../gui/wxpython/vdigit/preferences.py:382
+msgid "Category mode"
+msgstr "Mod de categorie"
+
+#: ../gui/wxpython/vdigit/preferences.py:384
+msgid "Manual entry"
+msgstr "Intrare manual"
+
+#: ../gui/wxpython/vdigit/preferences.py:384
+msgid "No category"
+msgstr "Nici o categorie"
+
+#: ../gui/wxpython/vdigit/preferences.py:397
+msgid "Delete existing feature(s)"
+msgstr "Șterge trăsătura existentă"
+
+#: ../gui/wxpython/vdigit/preferences.py:402
+msgid "Delete record from table"
+msgstr "Șterge înregistrare din tabel"
+
+#: ../gui/wxpython/vdigit/preferences.py:412
+msgid "Geometry attributes"
+msgstr "Atributele geometriei"
+
+#: ../gui/wxpython/vdigit/preferences.py:418
+msgid "perimeter"
+msgstr "perimetru"
+
+#: ../gui/wxpython/vdigit/preferences.py:484
+msgid "Note: These settings are stored in the workspace not in the vector digitizer preferences."
+msgstr "Notă: Aceste setări sunt stocate în spațiul de lucru, nu în preferințele pentru vectorizare."
+
+#: ../gui/wxpython/vdigit/preferences.py:512
+msgid "Digitize new line segment"
+msgstr "Vectorizează un nou segment de linie"
+
+#: ../gui/wxpython/vdigit/preferences.py:513
+msgid "Digitize new line/boundary"
+msgstr "Vectorizează o nouă linie/limită"
+
+#: ../gui/wxpython/vdigit/preferences.py:514
+msgid "Highlight"
+msgstr "Luminozitate"
+
+#: ../gui/wxpython/vdigit/preferences.py:515
+msgid "Highlight (duplicates)"
+msgstr "Luminozitate (dubluri)"
+
+#: ../gui/wxpython/vdigit/preferences.py:518
+msgid "Boundary (no area)"
+msgstr "Limită (nici un areal)"
+
+#: ../gui/wxpython/vdigit/preferences.py:519
+msgid "Boundary (one area)"
+msgstr "Limită (un singur areal)"
+
+#: ../gui/wxpython/vdigit/preferences.py:520
+msgid "Boundary (two areas)"
+msgstr "Limită (două areale)"
+
+#: ../gui/wxpython/vdigit/preferences.py:521
+msgid "Centroid (in area)"
+msgstr "Centroid (în areal)"
+
+#: ../gui/wxpython/vdigit/preferences.py:522
+msgid "Centroid (outside area)"
+msgstr "Centroid (în afara arealului)"
+
+#: ../gui/wxpython/vdigit/preferences.py:523
+msgid "Centroid (duplicate in area)"
+msgstr "Centroid (dublu în areal)"
+
+#: ../gui/wxpython/vdigit/preferences.py:524
+msgid "Node (one line)"
+msgstr "Nod (o linie)"
+
+#: ../gui/wxpython/vdigit/preferences.py:525
+msgid "Node (two lines)"
+msgstr "Nod (două linie)"
+
+#: ../gui/wxpython/vdigit/preferences.py:526
+msgid "Vertex"
+msgstr "Vertex"
+
+#: ../gui/wxpython/vdigit/preferences.py:527
+msgid "Area (closed boundary + centroid)"
+msgstr "Areal (limită închisă+ centroid)"
+
+#: ../gui/wxpython/vdigit/preferences.py:528
+msgid "Direction"
+msgstr "Direcție"
+
+#: ../gui/wxpython/vdigit/preferences.py:596
+msgid "Snapping disabled"
+msgstr "Snapping dezactivat"
+
+#: ../gui/wxpython/vdigit/preferences.py:598
+#, python-format
+msgid "Snapping threshold is %(value).1f %(units)s (based on comp. resolution)"
+msgstr "Snapping pentru prag este %(value).1f %(units)s (bazat pe rezoluția de calcul)"
+
+#: ../gui/wxpython/vdigit/preferences.py:654
+#, python-format
+msgid "Vector digitizer settings saved to file <%s>."
+msgstr "Parametrii vectorizării salvați în fișierul <%s>."
+
+#: ../gui/wxpython/vdigit/mapwindow.py:371
+msgid "Update categories"
+msgstr "Actualizează categorii"
+
+#: ../gui/wxpython/vdigit/mapwindow.py:494
+#: ../gui/wxpython/vdigit/mapwindow.py:859
+msgid "No vector map selected for editing."
+msgstr "Nici o hartă vectorială selectată pentru editare."
+
+#: ../gui/wxpython/vdigit/mapwindow.py:502
+msgid "Nothing to do. Choose appropriate tool from digitizer toolbar."
+msgstr "Nimic de făcut. Alege cel mai apropiat instrument de pe bara pentru vectorizare."
+
+#: ../gui/wxpython/vdigit/mapwindow.py:992
+#, fuzzy
+msgid "Z bulk-labeling dialog"
+msgstr "Caseta de dialog pentru etichetarea altitudinii"
+
+#: ../gui/wxpython/vdigit/wxdisplay.py:869
+#, python-format
+msgid "Topology for vector map <%s> is not available. Topology is required by digitizer. Do you want to rebuild topology (takes some time) and open the vector map for editing?"
+msgstr "Topologia pentru harta vectorială <%s> nu este disponibilă. Topologia este necesară pentru vectorizare. Doriți să reconstruiți topologia (va lua ceva timp) și să deschideți harta vectorială pentru editare?"
+
+#: ../gui/wxpython/vdigit/wxdisplay.py:873
+msgid "Topology missing"
+msgstr "Lipsește topologia"
+
+#: ../gui/wxpython/vdigit/wxdigit.py:50
+msgid "Digitization Error"
+msgstr "Eroare vectorizare"
+
+#: ../gui/wxpython/vdigit/wxdigit.py:55
+#, python-format
+msgid "Unable to open vector map <%s>."
+msgstr "Nu s-a putut deschide harta vectorială <%s>."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:57
+msgid "No vector map open for editing."
+msgstr "Nici o hartă vectorială deschisă pentru editare."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:58
+msgid "Operation canceled."
+msgstr "Operațiune anulată."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:65
+msgid "Writing new feature failed. Operation cancelled."
+msgstr "Scrierea unei trăsături noi a eșuat. Opearțiune anulată."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:73
+#, python-format
+msgid "Reading feature id %d failed. Operation canceled."
+msgstr "Citirea id-ului trăsăturii %d a eșuat. Operațiune anulată."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:81
+#, python-format
+msgid "Database link %d not available. Operation canceled."
+msgstr "Legătura bazei de date %d nu este disponibilă. Operațiune anulată."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:89
+#, python-format
+msgid "Unable to start database driver <%s>. Operation canceled."
+msgstr "Nu s-a putut deschide driver-ul bazei de date <%s>. Operațiune anulată."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:97
+#, python-format
+msgid "Unable to open database <%(db)s> by driver <%(driver)s>. Operation canceled."
+msgstr "Nu s-a putut deschide baza de date <%(db)s> cu driver-ul <%(driver)s>. Operațiune anulată."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:105
+#, python-format
+msgid "Unable to execute SQL query '%s'. Operation canceled."
+msgstr "Nu s-a putut executa interogarea SQL '%s'. Operațiune anulată."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:113
+#, python-format
+msgid "Feature id %d is marked as dead. Operation canceled."
+msgstr "Id-ul trăsăturii  %d este marcat ca inactiv. Operațiune anulată."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:121
+#, python-format
+msgid "Unsupported feature type %d. Operation canceled."
+msgstr "Tip de trăsătură nesuportat '%d'. Operațiunea este anulată."
+
+#: ../gui/wxpython/vdigit/wxdigit.py:467
+#, python-format
+msgid "Unknown feature type '%s'"
+msgstr "Tip de trăsătură necunoscut '%s'"
+
+#: ../gui/wxpython/vdigit/wxdigit.py:472
+msgid "Not enough points for line"
+msgstr "Nu sunt suficiente puncte pentru linie"
+
+#~ msgid "Select WKT or PRJ file"
+#~ msgstr "Selectați fișierul WKT sau PRJ"
diff --git a/misc/m.nviz.image/cplane.c b/misc/m.nviz.image/cplane.c
new file mode 100644
index 0000000..8fc2a46
--- /dev/null
+++ b/misc/m.nviz.image/cplane.c
@@ -0,0 +1,72 @@
+/*!
+   \file cplane.c
+
+   \brief Cutting plane subroutine
+
+   (C) 2011 by the GRASS Development Team
+
+   This program is free software under the GNU General Public
+   License (>=v2). Read the file COPYING that comes with GRASS
+   for details.
+
+   \author Anna Kratochvilova <kratochanna gmail.com> (Google SoC 2010/2011)
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <grass/glocale.h>
+
+#include "local_proto.h"
+
+/*!
+   \brief Draw cutting planes and set their attributes
+
+   \param params module parameters
+   \param data nviz data
+ */
+void draw_cplane(const struct GParams *params, nv_data * data)
+{
+    int i, id, ncplanes;
+    float trans_x, trans_y, trans_z;
+    float rot_x, rot_y, rot_z;
+    int fence;
+
+    ncplanes = opt_get_num_answers(params->cplane);
+    for (i = 0; i < ncplanes; i++) {
+	id = atoi(params->cplane->answers[i]);
+
+	if (id < 0 || id > Nviz_num_cplanes(data))
+	    G_fatal_error(_("Cutting plane number <%d> not found"), id);
+
+	Nviz_on_cplane(data, id);
+
+	trans_x = atof(params->cplane_pos->answers[i * 3 + 0]);
+	trans_y = atof(params->cplane_pos->answers[i * 3 + 1]);
+	trans_z = atof(params->cplane_pos->answers[i * 3 + 2]);
+	Nviz_set_cplane_translation(data, id, trans_x, trans_y, trans_z);
+
+	rot_x = 0;
+	rot_y = atof(params->cplane_tilt->answers[i]);
+	rot_z = atof(params->cplane_rot->answers[i]);
+	Nviz_set_cplane_rotation(data, id, rot_x, rot_y, rot_z);
+    }
+
+    const char *shading = params->cplane_shading->answers[0];
+
+    if (strcmp(shading, "clear") == 0)
+	fence = 0;
+    else if (strcmp(shading, "top") == 0)
+	fence = 1;
+    else if (strcmp(shading, "bottom") == 0)
+	fence = 2;
+    else if (strcmp(shading, "blend") == 0)
+	fence = 3;
+    else if (strcmp(shading, "shaded") == 0)
+	fence = 4;
+    else
+	fence = 0;
+    Nviz_set_fence_color(data, fence);
+
+    return;
+}
diff --git a/mswindows/GRASS-Installer.nsi b/mswindows/GRASS-Installer.nsi.tmpl
similarity index 74%
rename from mswindows/GRASS-Installer.nsi
rename to mswindows/GRASS-Installer.nsi.tmpl
index 1ea5002..a8a9da0 100644
--- a/mswindows/GRASS-Installer.nsi
+++ b/mswindows/GRASS-Installer.nsi.tmpl
@@ -1,16 +1,16 @@
 ;----------------------------------------------------------------------------------------------------------------------------
 
-;GRASS Installer for Windows
+;GRASS GIS Installer for Windows
 ;Written by Marco Pasetti
 ;Updated for OSGeo4W by Colin Nielsen, Helmut Kudrnovsky, and Martin Landa
-;Last Update: $Id: GRASS-Installer.nsi 50739 2012-02-09 10:28:30Z martinl $
+;Last Update: $Id: GRASS-Installer.nsi.tmpl 57038 2013-07-08 08:54:02Z hamish $
 ;Mail to: grass-dev at lists.osgeo.org 
 
 ;----------------------------------------------------------------------------------------------------------------------------
 
 ;Define the source path of the demolocation files
 
-!define DEMOLOCATION_PATH "c:\osgeo4w\usr\src\grass64_release\demolocation"
+!define DEMOLOCATION_PATH "c:\OSGeo4W\usr\src\grass64_release\demolocation"
 
 ;Define the source of the patched msys.bat
 
@@ -21,7 +21,6 @@
 !define INSTALLER_TYPE "Devel"
 
 ;----------------------------------------------------------------------------------------------------------------------------
-
 ;set compression configuration
 
 SetCompressor /SOLID lzma
@@ -31,16 +30,14 @@ SetCompressorDictSize 64
 
 ;Version variables
 
-!define SVN_REVISION "36599"
+!define SVN_REVISION "@GRASS_VERSION_SVN@"
 !define BINARY_REVISION "1"
+!define VERSION_NUMBER "@GRASS_VERSION_MAJOR at .@GRASS_VERSION_MINOR at .@GRASS_VERSION_RELEASE@"
+!define GRASS_BASE "GRASS GIS @GRASS_VERSION_MAJOR at .@GRASS_VERSION_MINOR at .@GRASS_VERSION_RELEASE@"
 !if ${INSTALLER_TYPE} == "Release"
-	!define VERSION_NUMBER "6.4.2"
-	!define GRASS_COMMAND "grass64"
-	!define GRASS_BASE "GRASS 6.4.2"
+        !define GRASS_COMMAND "grass at GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR@"
 !else
-	!define VERSION_NUMBER "6.4.2svn"
-	!define GRASS_COMMAND "grass64svn"
-	!define GRASS_BASE "GRASS 6.4.2svn"
+        !define GRASS_COMMAND "grass at GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR at svn"
 !endif
 
 ;----------------------------------------------------------------------------------------------------------------------------
@@ -58,15 +55,15 @@ SetCompressorDictSize 64
 
 ;Set the installer variables, depending on the selected version to build
 
-!define PACKAGE_FOLDER ".\GRASS-64-Package"
+!define PACKAGE_FOLDER ".\GRASS- at GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR at -Package"
 !if ${INSTALLER_TYPE} == "Release"
 	!define INSTALLER_NAME "WinGRASS-${VERSION_NUMBER}-${BINARY_REVISION}-Setup.exe"
-	!define DISPLAYED_NAME "GRASS ${VERSION_NUMBER}-${BINARY_REVISION}"
-	!define CHECK_INSTALL_NAME "GRASS 64"
+	!define DISPLAYED_NAME "GRASS GIS ${VERSION_NUMBER}-${BINARY_REVISION}"
+	!define CHECK_INSTALL_NAME "GRASS GIS @GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR@"
 !else
 	!define INSTALLER_NAME "WinGRASS-${VERSION_NUMBER}-r${SVN_REVISION}-${BINARY_REVISION}-Setup.exe"
-	!define DISPLAYED_NAME "GRASS ${VERSION_NUMBER}-r${SVN_REVISION}-${BINARY_REVISION}"
-	!define CHECK_INSTALL_NAME "GRASS 64 SVN"
+	!define DISPLAYED_NAME "GRASS GIS ${VERSION_NUMBER}-r${SVN_REVISION}-${BINARY_REVISION}"
+	!define CHECK_INSTALL_NAME "GRASS GIS @GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR@ SVN"
 !endif
 
 ;----------------------------------------------------------------------------------------------------------------------------
@@ -93,9 +90,9 @@ InstallDir "$PROGRAMFILES\${GRASS_BASE}"
 ;Request application privileges for Windows Vista
 RequestExecutionLevel admin
 
-;Tell the installer to show Install and Uninstall details as default
-ShowInstDetails show
-ShowUnInstDetails show
+;Tell the installer to hide Install and Uninstall details as default
+ShowInstDetails hide
+ShowUnInstDetails hide
 
 ;----------------------------------------------------------------------------------------------------------------------------
 
@@ -339,6 +336,70 @@ FunctionEnd
 ;FunctionEnd
 
 ;----------------------------------------------------------------------------------------------------------------------------
+;ReplaceLineString Function
+;Replace String in an existing file
+; code taken from http://nsis.sourceforge.net/Replace_line_that_starts_with_specified_string
+
+Function ReplaceLineStr
+ Exch $R0 ; string to replace that whole line with
+ Exch
+ Exch $R1 ; string that line should start with
+ Exch
+ Exch 2
+ Exch $R2 ; file
+ Push $R3 ; file handle
+ Push $R4 ; temp file
+ Push $R5 ; temp file handle
+ Push $R6 ; global
+ Push $R7 ; input string length
+ Push $R8 ; line string length
+ Push $R9 ; global
+ 
+  StrLen $R7 $R1
+ 
+  GetTempFileName $R4
+ 
+  FileOpen $R5 $R4 w
+  FileOpen $R3 $R2 r
+ 
+  ReadLoop:
+  ClearErrors
+   FileRead $R3 $R6
+    IfErrors Done
+ 
+   StrLen $R8 $R6
+   StrCpy $R9 $R6 $R7 -$R8
+   StrCmp $R9 $R1 0 +3
+ 
+    FileWrite $R5 "$R0$\r$\n"
+    Goto ReadLoop
+ 
+    FileWrite $R5 $R6
+    Goto ReadLoop
+ 
+  Done:
+ 
+  FileClose $R3
+  FileClose $R5
+ 
+  SetDetailsPrint none
+   Delete $R2
+   Rename $R4 $R2
+  SetDetailsPrint both
+ 
+ Pop $R9
+ Pop $R8
+ Pop $R7
+ Pop $R6
+ Pop $R5
+ Pop $R4
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R0
+FunctionEnd
+
+;----------------------------------------------------------------------------------------------------------------------------
 
 ;Interface Settings
 
@@ -402,7 +463,7 @@ FunctionEnd
 
 Function LaunchGrass
 
-     ExecShell "" "$DESKTOP\GRASS ${VERSION_NUMBER}.lnk"
+     ExecShell "" "$DESKTOP\${GRASS_BASE}.lnk"
 
 FunctionEnd
 
@@ -449,20 +510,12 @@ Section "GRASS" SecGRASS
 	;Set the GIS_DATABASE directory
 	SetShellVarContext current
 	Var /GLOBAL GIS_DATABASE	
-	StrCpy $GIS_DATABASE "$DOCUMENTS\GIS DataBase"
+	StrCpy $GIS_DATABASE "$DOCUMENTS\grassdata"
 	
 	;Create the GIS_DATABASE directory
 	CreateDirectory "$GIS_DATABASE"
 
 	;add Installer files
-	SetOutPath "$INSTALL_DIR\icons"
-	File .\Installer-Files\GRASS.ico
-	File .\Installer-Files\GRASS_Web.ico
-	File .\Installer-Files\GRASS_tcltk.ico
-	File .\Installer-Files\GRASS_MSys.ico
-	File .\Installer-Files\GRASS_CMD.ico
-	File .\Installer-Files\MSYS_Custom_Icon.ico
-	File .\Installer-Files\WinGRASS.ico	
 	SetOutPath "$INSTALL_DIR"
 	File .\Installer-Files\GRASS-WebSite.url
 	File .\Installer-Files\WinGRASS-README.url
@@ -531,7 +584,13 @@ Section "GRASS" SecGRASS
 	;Install demolocation into the GIS_DATABASE directory
 	SetOutPath "$GIS_DATABASE\demolocation"
 	File /r ${DEMOLOCATION_PATH}\*.*
-	
+	RMDir /r "$GIS_DATABASE\demolocation\.svn"
+	RMDir /r "$GIS_DATABASE\demolocation\PERMANENT\.svn"
+	RMDir /r "$GIS_DATABASE\demolocation\PERMANENT\vector\.svn"
+	RMDir /r "$GIS_DATABASE\demolocation\PERMANENT\vector\mysites\.svn"
+	RMDir /r "$GIS_DATABASE\demolocation\PERMANENT\vector\point\.svn"
+	RMDir /r "$GIS_DATABASE\demolocation\PERMANENT\dbf\.svn"
+
 	;add msys.bat into the INSTALL_DIR\msys directory
 	SetOutPath "$INSTALL_DIR\msys"
 	File /r ${MSYS_BATCH}	
@@ -543,7 +602,7 @@ Section "GRASS" SecGRASS
 	
 	;HKEY_LOCAL_MACHINE Install entries
 	;Set the Name, Version and Revision of GRASS + PublisherInfo + InstallPath	
-	WriteRegStr HKLM "Software\${GRASS_BASE}" "Name" "GRASS 6.4"
+	WriteRegStr HKLM "Software\${GRASS_BASE}" "Name" "${GRASS_BASE}"
 	WriteRegStr HKLM "Software\${GRASS_BASE}" "VersionNumber" "${VERSION_NUMBER}"
 	WriteRegStr HKLM "Software\${GRASS_BASE}" "SvnRevision" "${SVN_REVISION}"
 	WriteRegStr HKLM "Software\${GRASS_BASE}" "BinaryRevision" "${BINARY_REVISION}"
@@ -552,7 +611,7 @@ Section "GRASS" SecGRASS
 	WriteRegStr HKLM "Software\${GRASS_BASE}" "InstallPath" "$INSTALL_DIR"
 	
 	;HKEY_LOCAL_MACHINE Uninstall entries
-	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GRASS_BASE}" "DisplayName" "GRASS 6.4"
+	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GRASS_BASE}" "DisplayName" "GRASS @GRASS_VERSION_MAJOR at .@GRASS_VERSION_MINOR@"
 	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GRASS_BASE}" "UninstallString" "$INSTALL_DIR\Uninstall-GRASS.exe"
 	
 	!if ${INSTALLER_TYPE} == "Release"
@@ -563,7 +622,7 @@ Section "GRASS" SecGRASS
 		"DisplayVersion" "${VERSION_NUMBER}-r${SVN_REVISION}-${BINARY_REVISION}"
 	!endif
 	
-	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GRASS_BASE}" "DisplayIcon" "$INSTALL_DIR\icons\GRASS.ico"
+	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GRASS_BASE}" "DisplayIcon" "$INSTALL_DIR\etc\gui\icons\grass.ico"
 	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GRASS_BASE}" "EstimatedSize" 1
 	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GRASS_BASE}" "HelpLink" "${WIKI_PAGE}"
 	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${GRASS_BASE}" "URLInfoAbout" "${WEB_SITE}"
@@ -572,41 +631,41 @@ Section "GRASS" SecGRASS
 	;Create the Desktop Shortcut
 	SetShellVarContext current
 	
-	CreateShortCut "$DESKTOP\GRASS ${VERSION_NUMBER}.lnk" "$INSTALL_DIR\${GRASS_COMMAND}.bat" "-wx"\
-	"$INSTALL_DIR\icons\GRASS.ico" "" SW_SHOWMINIMIZED "" "Launch GRASS ${VERSION_NUMBER} with wxGUI"
+	CreateShortCut "$DESKTOP\${GRASS_BASE}.lnk" "$INSTALL_DIR\${GRASS_COMMAND}.bat" "-wx"\
+	"$INSTALL_DIR\etc\gui\icons\grass.ico" "" SW_SHOWMINIMIZED "" "Launch GRASS ${VERSION_NUMBER} with wxGUI"
 	
 	;Create the Windows Start Menu Shortcuts
 	SetShellVarContext all
 	
 	CreateDirectory "$SMPROGRAMS\${GRASS_BASE}"
 	
-	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\GRASS ${VERSION_NUMBER} Old TclTk GUI.lnk" "$INSTALL_DIR\${GRASS_COMMAND}.bat" "-tcltk"\
-	"$INSTALL_DIR\icons\GRASS_tcltk.ico" "" SW_SHOWMINIMIZED "" "Launch GRASS ${VERSION_NUMBER} with the old TclTk GUI"
-
-	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\GRASS ${VERSION_NUMBER} GUI.lnk" "$INSTALL_DIR\${GRASS_COMMAND}.bat" "-wx"\
-	"$INSTALL_DIR\icons\GRASS.ico" "" SW_SHOWMINIMIZED "" "Launch GRASS ${VERSION_NUMBER} with wxGUI"
-
-	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\GRASS ${VERSION_NUMBER} GUI with MSYS.lnk" "$INSTALL_DIR\msys\msys.bat" "/grass/${GRASS_COMMAND}.sh -wx"\
-	"$INSTALL_DIR\icons\GRASS_MSys.ico" "" SW_SHOWNORMAL "" "Launch GRASS ${VERSION_NUMBER} with wxGUI and a MSYS UNIX terminal"
+	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\${GRASS_BASE} GUI.lnk" "$INSTALL_DIR\${GRASS_COMMAND}.bat" "-wx"\
+	"$INSTALL_DIR\etc\gui\icons\grass.ico" "" SW_SHOWMINIMIZED "" "Launch GRASS ${VERSION_NUMBER} with wxGUI"
+	
+	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\${GRASS_BASE} GUI with MSYS.lnk" "$INSTALL_DIR\msys\msys.bat" "/grass/${GRASS_COMMAND}.sh -wx"\
+	"$INSTALL_DIR\etc\gui\icons\grass_msys.ico" "" SW_SHOWNORMAL "" "Launch GRASS ${VERSION_NUMBER} with wxGUI and MSYS UNIX console"
+	
+	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\${GRASS_BASE} Command Line.lnk" "$INSTALL_DIR\${GRASS_COMMAND}.bat" "-text"\
+	"$INSTALL_DIR\etc\gui\icons\grass_cmd.ico" "" SW_SHOWNORMAL "" "Launch GRASS ${VERSION_NUMBER} in text mode"
 	
-	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\GRASS ${VERSION_NUMBER} Command Line.lnk" "$INSTALL_DIR\${GRASS_COMMAND}.bat" "-text"\
-	"$INSTALL_DIR\icons\GRASS_CMD.ico" "" SW_SHOWNORMAL "" "Launch GRASS ${VERSION_NUMBER} in text mode"
+	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\${GRASS_BASE} Old TclTk GUI.lnk" "$INSTALL_DIR\${GRASS_COMMAND}.bat" "-tcltk"\
+	"$INSTALL_DIR\etc\gui\icons\grass_tcltk.ico" "" SW_SHOWMINIMIZED "" "Launch GRASS ${VERSION_NUMBER} with the old TclTk GUI"
 	
 	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\MSYS UNIX Console.lnk" "$INSTALL_DIR\msys\msys.bat" ""\
-	"$INSTALL_DIR\icons\MSYS_Custom_Icon.ico" "" SW_SHOWNORMAL "" "Open a MSYS UNIX console"
+	"$INSTALL_DIR\etc\gui\icons\msys.ico" "" SW_SHOWNORMAL "" "Open a MSYS UNIX console"
 	
 	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\GRASS Web Site.lnk" "$INSTALL_DIR\GRASS-WebSite.url" ""\
-	"$INSTALL_DIR\icons\GRASS_Web.ico" "" SW_SHOWNORMAL "" "Visit the GRASS website"
+	"$INSTALL_DIR\etc\gui\icons\grass_web.ico" "" SW_SHOWNORMAL "" "Visit the GRASS website"
 	
 ; FIXME: ship the WinGrass release notes .html file instead of URL
-; http://trac.osgeo.org/grass/browser/grass-web/trunk/grass64/binary/mswindows/native/README.html?format=raw
+; http://trac.osgeo.org/grass/browser/grass-web/trunk/grass@GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR@/binary/mswindows/native/README.html?format=raw
 ; probably ship with devel versions too? ie Release Notes, not the Release Announcement press release.
 	!if ${INSTALLER_TYPE} == "Release"
-		CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\Release Notes.lnk" "$INSTALL_DIR\WinGRASS-README.url" ""\
-		"$INSTALL_DIR\icons\WinGRASS.ico" "" SW_SHOWNORMAL "" "Visit the WinGRASS Project Web Page"
+		CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\${GRASS_BASE} Release Notes.lnk" "$INSTALL_DIR\WinGRASS-README.url" ""\
+		"$INSTALL_DIR\etc\gui\icons\wingrass.ico" "" SW_SHOWNORMAL "" "Visit the WinGRASS Project Web Page"
 	!endif
 	
-	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\Uninstall GRASS ${VERSION_NUMBER}.lnk" "$INSTALL_DIR\Uninstall-GRASS.exe" ""\
+	CreateShortCut "$SMPROGRAMS\${GRASS_BASE}\Uninstall ${GRASS_BASE}.lnk" "$INSTALL_DIR\Uninstall-GRASS.exe" ""\
 	"$INSTALL_DIR\Uninstall-GRASS.exe" "" SW_SHOWNORMAL "" "Uninstall GRASS ${VERSION_NUMBER}"
 	
 	;Create the grass_command.bat
@@ -624,7 +683,6 @@ Section "GRASS" SecGRASS
 	FileWrite $0 'rem #$\r$\n'
 	FileWrite $0 'rem #########################################################################$\r$\n'
 	FileWrite $0 '$\r$\n'
-	FileWrite $0 'rem Set GRASS Installation Directory Variable$\r$\n'
 	FileWrite $0 'set GISBASE=$INSTALL_DIR$\r$\n'
 	FileWrite $0 '$\r$\n'
 	${If} $R_HKLM_INSTALL_PATH != ""
@@ -642,7 +700,7 @@ Section "GRASS" SecGRASS
 	FileWrite $0 '"%GISBASE%\etc\Init.bat" %*'
 	FileClose $0
 	done_create_grass_command.bat:
-	
+		
 	;Set the UNIX_LIKE GRASS Path
 	Var /GLOBAL UNIX_LIKE_DRIVE
 	Var /GLOBAL UNIX_LIKE_GRASS_PATH
@@ -681,12 +739,8 @@ Section "GRASS" SecGRASS
 			${StrReplace} "$USERNAME" "$PROFILE_DRIVE\Documents and Settings\" "" "$PROFILE"
 		${EndIf}
 	${EndIf}
-	
-	;Create the $INSTALL_DIR\msys\home and the $INSTALL_DIR\msys\home\$USERNAME directories
-	CreateDirectory $INSTALL_DIR\msys\home
-	CreateDirectory $INSTALL_DIR\msys\home\$USERNAME
-  
-	;create the $INSTALL_DIR\bin grass_command
+		
+	;create the grass_command.sh
 	ClearErrors
 	FileOpen $0 $INSTALL_DIR\${GRASS_COMMAND}.sh w
 	IfErrors done_create_grass_command
@@ -705,7 +759,7 @@ Section "GRASS" SecGRASS
 	FileWrite $0 '#   	    	requires a source file because the definition of GISBASE$\r$\n'
 	FileWrite $0 '#   	    	is not known until compile time and is substituted from the$\r$\n'
 	FileWrite $0 '#   	    	Makefile. Any command line options are passed to Init.sh.$\r$\n'
-	FileWrite $0 '# COPYRIGHT:  	(C) 2000-2010 by the GRASS Development Team$\r$\n'
+	FileWrite $0 '# COPYRIGHT:  	(C) 2000-2013 by the GRASS Development Team$\r$\n'
 	FileWrite $0 '#$\r$\n'
 	FileWrite $0 '#             	This program is free software under the GNU General Public$\r$\n'
 	FileWrite $0 '#   	    	License (>=v2). Read the file COPYING that comes with GRASS$\r$\n'
@@ -729,8 +783,12 @@ Section "GRASS" SecGRASS
 	FileWrite $0 '$\r$\n'
 	FileWrite $0 '# Set the PATH variable$\r$\n'
 	FileWrite $0 'PATH="$$GISBASE/extrabin:$$GISBASE/extralib:$$PATH"$\r$\n'
-	FileWrite $0 'PATH="$$GISBASE/tcl-tk/bin:$$GISBASE/sqlite/bin:$$GISBASE/gpsbabel:$$PATH"$\r$\n'
+	FileWrite $0 'PATH="$$GISBASE/tcl-tk/bin:$$GISBASE/sqlite/bin:$$PATH"$\r$\n'
 	FileWrite $0 'export PATH$\r$\n'
+	FileWrite $0 '$\r$\n'
+	FileWrite $0 'GRASS_PAGER=more$\r$\n'
+	FileWrite $0 'export GRASS_PAGER$\r$\n'
+	FileWrite $0 '$\r$\n'
 	FileWrite $0 '# Set the PYTHONPATH variable$\r$\n'
 	FileWrite $0 'PYTHONPATH="$$GISBASE/etc/python:$$GISBASE/Python27:$$PYTHONPATH"$\r$\n'
 	FileWrite $0 'export PYTHONPATH$\r$\n'
@@ -741,7 +799,7 @@ Section "GRASS" SecGRASS
 	FileWrite $0 '   export GRASS_PYTHON$\r$\n'
 	FileWrite $0 'fi$\r$\n'
 	FileWrite $0 '$\r$\n'
-	FileWrite $0 '# Set to default web browser$\r$\n'
+	FileWrite $0 '# Set the default web browser$\r$\n'
 	FileWrite $0 'GRASS_HTML_BROWSER=explorer$\r$\n'
 	FileWrite $0 'export GRASS_HTML_BROWSER$\r$\n'
 	FileWrite $0 '$\r$\n'
@@ -752,22 +810,21 @@ Section "GRASS" SecGRASS
 	FileWrite $0 '# Set the GDAL_DATA variable$\r$\n'
 	FileWrite $0 'GDAL_DATA="$INSTALL_DIR\share\gdal"$\r$\n'
 	FileWrite $0 'export GDAL_DATA$\r$\n'
+	FileWrite $0 '$\r$\n'
 	FileWrite $0 '# Set the PROJ_LIB variable$\r$\n'
 	FileWrite $0 'PROJ_LIB="$INSTALL_DIR\proj"$\r$\n'
 	FileWrite $0 'export PROJ_LIB $\r$\n'
+	FileWrite $0 '$\r$\n'
 	FileWrite $0 '# Set the GEOTIFF_CSV variable$\r$\n'
 	FileWrite $0 'GEOTIFF_CSV="$INSTALL_DIR\share\epsg_csv"$\r$\n'
-	FileWrite $0 'export GEOTIFF_CSV $\r$\n'
+	FileWrite $0 'export GEOTIFF_CSV$\r$\n'
 	FileWrite $0 '$\r$\n'
-	FileWrite $0 'cd "$USERPROFILE"'
+	FileWrite $0 'cd "$$USERPROFILE"'
 	FileWrite $0 '$\r$\n' 
 	FileWrite $0 'exec "$$GISBASE/etc/Init.sh" "$$@"'
 	FileClose $0
 	done_create_grass_command:
-
-	;Create the $INSTALL_DIR\msys\grass link directory
-	CreateDirectory $INSTALL_DIR\msys\grass
-	
+		
 	;Get the short form of the install path (to allow for paths with spaces)
 	VAR /GLOBAL INST_DIR_SHORT
 	GetFullPathName /SHORT $INST_DIR_SHORT $INSTALL_DIR
@@ -781,31 +838,126 @@ Section "GRASS" SecGRASS
 	done_create_fstab:
 	
 	;Set the Unix-Like GIS_DATABASE Path
-	Var /GLOBAL UNIX_LIKE_GIS_DATABASE_PATH
+ 	;Var /GLOBAL UNIX_LIKE_GIS_DATABASE_PATH
   
 	;replace \ with / in $GIS_DATABASE
-	${StrReplace} "$UNIX_LIKE_GIS_DATABASE_PATH" "\" "/" "$GIS_DATABASE"
-  
+	;${StrReplace} "$UNIX_LIKE_GIS_DATABASE_PATH" "\" "/" "$GIS_DATABASE"
+
 	SetShellVarContext current  
-	${If} ${FileExists} "$APPDATA\GRASS6\grassrc6"
-	      DetailPrint "File $APPDATA\GRASS6\grassrc6 already exists. Skipping."
+	${If} ${FileExists} "$APPDATA\GRASS at GRASS_VERSION_MAJOR@\grassrc6"
+	      DetailPrint "File $APPDATA\GRASS at GRASS_VERSION_MAJOR@\grassrc6 already exists. Skipping."
 	${Else}
-	      ;create $APPDATA\GRASS6\grassrc6
+	      ;create $APPDATA\GRASS at GRASS_VERSION_MAJOR@\grassrc6
 	      ClearErrors
-	      CreateDirectory	$APPDATA\GRASS6
-	      FileOpen $0 $APPDATA\GRASS6\grassrc6 w
-	      IfErrors done_create_grass6_rc
-	      FileWrite $0 'GISDBASE: $UNIX_LIKE_GIS_DATABASE_PATH$\r$\n'
+	      CreateDirectory	$APPDATA\GRASS at GRASS_VERSION_MAJOR@
+	      FileOpen $0 $APPDATA\GRASS at GRASS_VERSION_MAJOR@\grassrc6 w
+	      IfErrors done_create_grass_rc
+	      FileWrite $0 'GISDBASE: $GIS_DATABASE$\r$\n'
 	      FileWrite $0 'LOCATION_NAME: demolocation$\r$\n'
 	      FileWrite $0 'MAPSET: PERMANENT$\r$\n'
 	      FileClose $0	
-	      done_create_grass6_rc:
+	      done_create_grass_rc:
 	${EndIf}
-	
-	CopyFiles $APPDATA\GRASS6\grassrc6 $INSTALL_DIR\msys\home\$USERNAME\.grassrc6
+
+	;replace gisbase = "/c/OSGeo4W/apps/grass/grass- at GRASS_VERSION_MAJOR@. at GRASS_VERSION_MINOR@. at GRASS_VERSION_RELEASE@" in grass at GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR at .py with $INSTDIR
+	Push "$INSTDIR\etc\grass at GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR at .py" ; file to modify
+	Push 'gisbase = "/c/OSGeo4W/apps/grass/grass- at GRASS_VERSION_MAJOR@. at GRASS_VERSION_MINOR@. at GRASS_VERSION_RELEASE@"' ; string that a line must begin with *WS Sensitive*
+	Push 'gisbase = "$INSTDIR"' ; string to replace whole line with
+	Call ReplaceLineStr
+	
+	;replace config_projshare = "/c/OSGeo4W/share/proj" i n grass at GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR at .py with $INSTDIR\proj
+	Push "$INSTDIR\etc\grass at GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR at .py" ; file to modify
+	Push 'config_projshare = "/c/OSGeo4W/share/proj"' ; string that a line must begin with *WS Sensitive*
+	Push 'config_projshare = "$INSTDIR\proj"' ; string to replace whole line with
+	Call ReplaceLineStr
                  
 SectionEnd
 
+;--------------------------------------------------------------------------
+
+Function DownloadInstallMSRuntime
+
+	IntOp $ARCHIVE_SIZE_MB $ARCHIVE_SIZE_KB / 1024
+
+	StrCpy $DOWNLOAD_MESSAGE_ "The installer will download the $EXTENDED_ARCHIVE_NAME.$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_These system libraries from Microsoft are needed for programs"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ built with Microsoft's Visual C++ compiler, such as Python and"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ GDAL which ship with GRASS, since MS does not include them by"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ default. You might already have them installed by other software,"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ if so you don't need to install them again, but if not GRASS will"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ fail to start and you will see errors like 'Missing MSVCR71.dll"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ or MSVCP100.dll'.$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_The archive is about $ARCHIVE_SIZE_MB MB and may take"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ several minutes to download.$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_The $EXTENDED_ARCHIVE_NAME will be copied to:$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_$TEMP\$CUSTOM_UNTAR_FOLDER.$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_Press OK to continue and install the runtimes, or Cancel"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ to skip the download and complete the GRASS"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ installation without the $EXTENDED_ARCHIVE_NAME.$\r$\n"
+
+	MessageBox MB_OKCANCEL "$DOWNLOAD_MESSAGE_" IDOK download IDCANCEL cancel_download
+	
+	download:	
+	SetShellVarContext current	
+	InitPluginsDir
+	NSISdl::download "$HTTP_PATH/$ARCHIVE_NAME" "$TEMP\$ARCHIVE_NAME"
+	Pop $0
+	StrCmp $0 "success" download_ok download_failed
+		
+	download_ok:	
+	InitPluginsDir
+	untgz::extract "-d" "$TEMP\$ORIGINAL_UNTAR_FOLDER" "-zbz2" "$TEMP\$ARCHIVE_NAME"
+	Pop $0
+	StrCmp $0 "success" untar_ok untar_failed
+	
+	untar_ok:
+	ExecWait "$TEMP\$ORIGINAL_UNTAR_FOLDER\bin\vcredist_2005_x86.exe /q"
+	ExecWait "$TEMP\$ORIGINAL_UNTAR_FOLDER\bin\vcredist_2008_x86.exe /q"	
+	ExecWait "$TEMP\$ORIGINAL_UNTAR_FOLDER\bin\vcredist_2010_x86.exe /q"
+	CopyFiles "$TEMP\$ORIGINAL_UNTAR_FOLDER\bin\*.dll" "$INSTDIR\extralib"
+	Delete "$TEMP\$ARCHIVE_NAME"
+	RMDir /r "$TEMP\$ORIGINAL_UNTAR_FOLDER"
+	;the following doesn't work. Maybe because the installer is still running?
+	RMDir "$TEMP\$ORIGINAL_UNTAR_FOLDER"
+	Goto end
+	
+	download_failed:
+	DetailPrint "$0" ;print error message to log
+	MessageBox MB_OK "Download Failed.$\r$\nGRASS will be installed without the $EXTENDED_ARCHIVE_NAME."
+	Goto end
+	
+	cancel_download:
+	MessageBox MB_OK "Download Cancelled.$\r$\nGRASS will be installed without the $EXTENDED_ARCHIVE_NAME."
+	Goto end
+	
+	untar_failed:
+	DetailPrint "$0" ;print error message to log
+	
+	end:
+
+FunctionEnd
+
+Section /O "Important Microsoft Runtime DLLs" SecMSRuntime
+
+	;Set the size (in KB)  of the archive file
+	StrCpy $ARCHIVE_SIZE_KB 12521
+	
+	;Set the size (in KB) of the unpacked archive file
+	AddSize 13500
+	
+	StrCpy $HTTP_PATH "http://download.osgeo.org/osgeo4w/release/msvcrt/"
+	StrCpy $ARCHIVE_NAME "msvcrt-1.0.1-8.tar.bz2"
+	StrCpy $EXTENDED_ARCHIVE_NAME "Microsoft Visual C++ Redistributable Packages"
+	StrCpy $ORIGINAL_UNTAR_FOLDER "install_msruntime"
+	
+	Call DownloadInstallMSRuntime
+
+SectionEnd
+
 Function DownloadDataSet
 
 	IntOp $ARCHIVE_SIZE_MB $ARCHIVE_SIZE_KB / 1024
@@ -813,9 +965,9 @@ Function DownloadDataSet
 	StrCpy $DOWNLOAD_MESSAGE_ "The installer will download the $EXTENDED_ARCHIVE_NAME sample data set.$\r$\n"
 	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_$\r$\n"
 	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_The archive is about $ARCHIVE_SIZE_MB MB and may take"
-	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ several minutes to be downloaded.$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_ several minutes to download.$\r$\n"
 	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_$\r$\n"
-	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_The $EXTENDED_ARCHIVE_NAME will be copyed to:$\r$\n"
+	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_The $EXTENDED_ARCHIVE_NAME dataset will be copied to:$\r$\n"
 	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_$GIS_DATABASE\$CUSTOM_UNTAR_FOLDER.$\r$\n"
 	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_$\r$\n"
 	StrCpy $DOWNLOAD_MESSAGE_ "$DOWNLOAD_MESSAGE_Press OK to continue or Cancel to skip the download and complete the GRASS"
@@ -869,7 +1021,7 @@ Section /O "North Carolina (Wake County) Data Set" SecNorthCarolinaSDB
 	StrCpy $ARCHIVE_NAME "nc_spm_latest.tar.gz"
 	StrCpy $EXTENDED_ARCHIVE_NAME "North Carolina (Wake County)"
 	StrCpy $ORIGINAL_UNTAR_FOLDER "nc_spm_08"
-	StrCpy $CUSTOM_UNTAR_FOLDER "North-Carolina"
+	StrCpy $CUSTOM_UNTAR_FOLDER "North_Carolina"
 	
 	Call DownloadDataSet	
 	
@@ -893,29 +1045,28 @@ Section /O "South Dakota (Spearfish County) Data Set" SecSpearfishSDB
 
 SectionEnd
 
-;----------------------------------------------------------------------------------------------------------------------------
+;--------------------------------------------------------------------------
 
 ;Uninstaller Section
 
 Section "Uninstall"
 	;remove files & folders
 	RMDir /r "$INSTDIR"
-		
+		        	
 	;remove the Desktop ShortCut
 	SetShellVarContext current
-	Delete "$DESKTOP\GRASS ${VERSION_NUMBER}.lnk"
-	Delete "$DESKTOP\GRASS ${VERSION_NUMBER} with MSYS.lnk"
+	Delete "$DESKTOP\${GRASS_BASE}.lnk"
 	
 	;remove the Programs Start ShortCuts
 	SetShellVarContext all
 	RMDir /r "$SMPROGRAMS\${GRASS_BASE}"
 	
-	;remove the $APPDATA\GRASS6 folder
+	;remove the $APPDATA\GRASS at GRASS_VERSION_MAJOR@ folder
 	;disabled, don't remove user settings
-	;SetShellVarContext current
-	;RMDir /r "$APPDATA\GRASS6"	
-	;${If} ${FileExists} "$APPDATA\GRASS6\addons\*.*"
-	;      RMDir /r "$APPDATA\GRASS6\addons"
+	; SetShellVarContext current
+	;RMDir /r "$APPDATA\GRASS at GRASS_VERSION_MAJOR@"	
+	;${If} ${FileExists} "$APPDATA\GRASS at GRASS_VERSION_MAJOR@\addons\*.*"
+	;      RMDir /r "$APPDATA\GRASS at GRASS_VERSION_MAJOR@\addons"
 	;${EndIf}
 	
 	;remove the Registry Entries
@@ -924,13 +1075,14 @@ Section "Uninstall"
 
 SectionEnd
 
-;----------------------------------------------------------------------------------------------------------------------------
+;--------------------------------------------------------------------------
 
 ;Installer Section Descriptions
 !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
 	!insertmacro MUI_DESCRIPTION_TEXT ${SecGRASS} "Install GRASS ${VERSION_NUMBER}"
-	!insertmacro MUI_DESCRIPTION_TEXT ${SecNorthCarolinaSDB} "Download and install the North Carolina (Wake County) sample data set"
-	!insertmacro MUI_DESCRIPTION_TEXT ${SecSpearfishSDB} "Download and install the South Dakota (Spearfish County) sample data set"
+	!insertmacro MUI_DESCRIPTION_TEXT ${SecMSRuntime} "Some software included in this installer (e.g. GDAL, Python) may need Microsoft's Visual C++ redistributable system libraries.$\r$\nDownload and install the Redistributable Package. (12 MB)"
+	!insertmacro MUI_DESCRIPTION_TEXT ${SecNorthCarolinaSDB} "Download and install the North Carolina (Wake County) sample data set. (135 MB)"
+	!insertmacro MUI_DESCRIPTION_TEXT ${SecSpearfishSDB} "Download and install the South Dakota (Spearfish County) sample data set. (20 MB)"
 !insertmacro MUI_FUNCTION_DESCRIPTION_END
 
-;----------------------------------------------------------------------------------------------------------------------------
+;--------------------------------------------------------------------------
diff --git a/mswindows/GRASS-Packager.bat b/mswindows/GRASS-Packager.bat.tmpl
similarity index 91%
rename from mswindows/GRASS-Packager.bat
rename to mswindows/GRASS-Packager.bat.tmpl
index e38cdf0..56a0e53 100644
--- a/mswindows/GRASS-Packager.bat
+++ b/mswindows/GRASS-Packager.bat.tmpl
@@ -1,22 +1,23 @@
- at echo off
-
 rem -----------------------------------------------------------------------------------------------------------------------
 rem Self Contained GRASS Automated Packager
 rem -----------------------------------------------------------------------------------------------------------------------
 rem Edited by: Marco Pasetti
 rem Revised for OSGeo4W by: Colin Nielsen, Helmut Kudrnovsky, and Martin Landa
-rem Last Update: $Id: GRASS-Packager.bat 50399 2012-01-23 22:14:19Z martinl $
+rem Last Update: $Id: GRASS-Packager.bat.tmpl 56046 2013-04-30 09:59:46Z hamish $
 rem -----------------------------------------------------------------------------------------------------------------------
 
+ at echo off
+
 rem --------------------------------------------------------------------------------------------------------------------------
 rem Set the script variables
 rem --------------------------------------------------------------------------------------------------------------------------
 
-set PACKAGE_DIR=.\GRASS-64-Package
+set PACKAGE_DIR=.\GRASS- at GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR at -Package
 
 set OSGEO4W_DIR=c:\osgeo4w
 
-set GRASS_PREFIX=%OSGEO4W_DIR%\apps\grass\grass-6.4.2
+set GRASS_PREFIX=%OSGEO4W_DIR%\apps\grass\grass- at GRASS_VERSION_MAJOR@. at GRASS_VERSION_MINOR@. at GRASS_VERSION_RELEASE@
+set GRASS_BIN_PREFIX=%OSGEO4W_DIR%\bin
 
 set SVN_PATH=c:\Subversion
 
@@ -31,10 +32,11 @@ mkdir %PACKAGE_DIR%
 
 @echo.
 @echo -----------------------------------------------------------------------------------------------------------------------
- at echo Copy %GRASS_PREFIX% content to PACKAGE_DIR
+ at echo Copy %GRASS_PREFIX% & %GRASS_BIN_PREFIX% content to PACKAGE_DIR
 @echo -----------------------------------------------------------------------------------------------------------------------
 @echo.
 
+rem xcopy %GRASS_BIN_PREFIX%\grass at GRASS_VERSION_MAJOR@@GRASS_VERSION_MINOR at .py %PACKAGE_DIR% /S/V/F
 xcopy %GRASS_PREFIX% %PACKAGE_DIR% /S/V/F
 
 @echo.
@@ -46,11 +48,11 @@ xcopy %GRASS_PREFIX% %PACKAGE_DIR% /S/V/F
 mkdir %PACKAGE_DIR%\extralib
 
 copy %OSGEO4W_DIR%\bin\*.dll %PACKAGE_DIR%\extralib
-del %PACKAGE_DIR%\extralib\libgrass_*6.4.0*.dll
-del %PACKAGE_DIR%\extralib\libgrass_*6.4.1*.dll
+del %PACKAGE_DIR%\extralib\libgrass_*6.4*.dll
 del %PACKAGE_DIR%\extralib\libgrass_*6.5*.dll
-del %PACKAGE_DIR%\extralib\libgrass_*7.0*.dll
 del %PACKAGE_DIR%\extralib\Qt*4.dll
+del %PACKAGE_DIR%\extralib\msvcp*
+del %PACKAGE_DIR%\extralib\msvcr*
 rem copy %OSGEO4W_DIR%\pgsql\lib\libpq.dll %PACKAGE_DIR%\extralib
 
 @echo.
@@ -100,17 +102,6 @@ copy %OSGEO4W_DIR%\lib\sqlite3_i.lib %PACKAGE_DIR%\sqlite\lib
 
 @echo.
 @echo -----------------------------------------------------------------------------------------------------------------------
- at echo Copy GPSBABEL executable and dll to PACKAGE_DIR\gpsbabel
- at echo -----------------------------------------------------------------------------------------------------------------------
- at echo.
-
-mkdir %PACKAGE_DIR%\gpsbabel
-
-copy %OSGEO4W_DIR%\gpsbabel.exe %PACKAGE_DIR%\gpsbabel
-rem copy %OSGEO4W_DIR%\libexpat.dll %PACKAGE_DIR%\gpsbabel
-
- at echo.
- at echo -----------------------------------------------------------------------------------------------------------------------
 @echo Copy shared PROJ.4 files to PACKAGE_DIR\proj
 @echo -----------------------------------------------------------------------------------------------------------------------
 @echo.
@@ -148,7 +139,6 @@ mkdir %PACKAGE_DIR%\tcl-tk\include
 mkdir %PACKAGE_DIR%\tcl-tk\lib
 mkdir %PACKAGE_DIR%\tcl-tk\lib\tcl8.5
 mkdir %PACKAGE_DIR%\tcl-tk\lib\tk8.5
-mkdir %PACKAGE_DIR%\tcl-tk\lib\tcl8.5\encoding
 mkdir %PACKAGE_DIR%\tcl-tk\lib\tcl8\8.5
 
 xcopy %OSGEO4W_DIR%\bin\tclpip85.dll %PACKAGE_DIR%\tcl-tk\bin /S/V/F/I
@@ -167,7 +157,6 @@ copy %OSGEO4W_DIR%\include\ttkDecls.h %PACKAGE_DIR%\tcl-tk\include
 
 copy %OSGEO4W_DIR%\lib\tcl8.5\*.tcl %PACKAGE_DIR%\tcl-tk\lib\tcl8.5
 copy %OSGEO4W_DIR%\lib\tcl8.5\tclIndex %PACKAGE_DIR%\tcl-tk\lib\tcl8.5
-copy %OSGEO4W_DIR%\lib\tcl8.5\encoding\*.enc %PACKAGE_DIR%\tcl-tk\lib\tcl8.5\encoding
 
 copy %OSGEO4W_DIR%\lib\tk8.5\*.tcl %PACKAGE_DIR%\tcl-tk\lib\tk8.5
 copy %OSGEO4W_DIR%\lib\tk8.5\tclIndex %PACKAGE_DIR%\tcl-tk\lib\tk8.5
diff --git a/mswindows/Installer-Files/GRASS.ico b/mswindows/Installer-Files/GRASS.ico
deleted file mode 100644
index baeb388..0000000
Binary files a/mswindows/Installer-Files/GRASS.ico and /dev/null differ
diff --git a/mswindows/Makefile b/mswindows/Makefile
new file mode 100644
index 0000000..c745987
--- /dev/null
+++ b/mswindows/Makefile
@@ -0,0 +1,28 @@
+MODULE_TOPDIR = ..
+
+include $(MODULE_TOPDIR)/include/Make/Platform.make
+include $(MODULE_TOPDIR)/include/Make/Grass.make
+include $(MODULE_TOPDIR)/include/Make/Rules.make
+
+EXTRA_CLEAN_FILES = GRASS-Packager.bat GRASS-Installer.nsi
+
+ifneq ($(MINGW),)
+default: GRASS-Packager.bat GRASS-Installer.nsi
+else
+default:
+endif	
+
+GRASS-Packager.bat: GRASS-Packager.bat.tmpl
+	sed \
+	-e 's#@GRASS_VERSION_MAJOR@#$(GRASS_VERSION_MAJOR)#' \
+	-e 's#@GRASS_VERSION_MINOR@#$(GRASS_VERSION_MINOR)#' \
+	-e 's#@GRASS_VERSION_RELEASE@#$(GRASS_VERSION_RELEASE)#' \
+	$< > $@
+
+GRASS-Installer.nsi: GRASS-Installer.nsi.tmpl
+	sed \
+	-e 's#@GRASS_VERSION_SVN@#$(GRASS_VERSION_SVN)#' \
+	-e 's#@GRASS_VERSION_MAJOR@#$(GRASS_VERSION_MAJOR)#' \
+	-e 's#@GRASS_VERSION_MINOR@#$(GRASS_VERSION_MINOR)#' \
+	-e 's#@GRASS_VERSION_RELEASE@#$(GRASS_VERSION_RELEASE)#' \
+	$< > $@
diff --git a/ps/ps.map/decorations/NorthArrow1.eps b/ps/ps.map/decorations/NorthArrow1.eps
new file mode 100644
index 0000000..76999da
--- /dev/null
+++ b/ps/ps.map/decorations/NorthArrow1.eps
@@ -0,0 +1,91 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 87 101
+%%HiResBoundingBox: 0.450000 0.448828 86.608984 100.048828
+%%Creator: GPL Ghostscript 871 (epswrite)
+%%CreationDate: 2012/02/20 11:20:49
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+% This copyright applies to everything between here and the %%EndProlog:
+% Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
+%%BeginResource: procset GS_epswrite_2_0_1001 1.001 0
+/GS_epswrite_2_0_1001 80 dict dup begin
+/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch
+4 index eq and{ pop pop pop}{ PageSize dup  1
+5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec}
+{ pop/setpagedevice where
+{ pop 1 dict dup /PageSize PageSize put setpagedevice}
+{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat
+setpage}if}ifelse}ifelse}ifelse} bind def
+/!{bind def}bind def/#{load def}!/N/counttomark #
+/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}!
+/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}!
+/w/setlinewidth #/J/setlinecap #
+/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat #
+/m/moveto #/l/lineto #/c/rcurveto #
+/p{N 2 idiv{N -2 roll rlineto}repeat}!
+/P{N 0 gt{N -2 roll moveto p}if}!
+/h{p closepath}!/H{P closepath}!
+/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}!
+/re{4 -2 roll m exch dup lx exch ly neg lx h}!
+/^{3 index neg 3 index neg}!
+/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}!
+/q/gsave #/Q/grestore #/rf{re fill}!
+/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}!
+/|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}!
+/|{exch string readstring |=}!
+/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}!
+/@/currentfile #/${+ @ |}!
+/B{{2 copy string{readstring pop}aload pop 4 array astore cvx
+3 1 roll}repeat pop pop true}!
+/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}!
+/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
+/Ic{exch Ix false 3 colorimage}!
+/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>>
+/CCITTFaxDecode filter}!/FX{<</EndOfBlock false F}!
+/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
+/@F{@ &2<<F}!/@C{@X &2 FX}!
+/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
+/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
+/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
+currentdict end image}!
+/~{@ read {pop} if}!
+end def
+%%EndResource
+/pagesave null def
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+GS_epswrite_2_0_1001 begin
+/pagesave save store 197 dict begin
+0.1 0.1 scale
+%%EndPageSetup
+gsave mark
+Q q
+0 0 250000 250000 re
+Y
+K
+435.27 846.6 27.66 -393.75 402.66 -27.04 -402.66 -27.03 -27.66 -393.79 -27.65 393.79 -402.62 27.03 402.62 27.04 
+27.65 393.75 H
+f
+10 w
+4 M
+435.27 846.59 27.66 -393.75 402.66 -27.03 -402.66 -27.03 -27.66 -393.79 -27.65 393.79 -402.62 27.03 402.62 27.03 
+27.65 393.75 H
+435.27 846.59 S
+374.34 859.95 0 140.04 22.65 0 50.78 -70.86 P
+11.57 -16.4 20.98 -30.97 28.32 -45.5 c
+0.71 0.19 p
+-1.88 18.71 -2.35 35.74 -2.35 57.35 c
+0 58.82 19.34 0 0 -140.04 -20.78 0 -50.51 71.06 p
+-11.09 15.59 -21.72 31.56 -29.53 46.76 c
+-0.7 -0.2 p
+1.21 -17.69 1.4 -34.49 1.4 -57.81 c
+0 -59.81 -19.33 0 h
+f
+cleartomark end end pagesave restore
+ showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
diff --git a/ps/ps.map/decorations/NorthArrow3.eps b/ps/ps.map/decorations/NorthArrow3.eps
new file mode 100644
index 0000000..3e056a0
--- /dev/null
+++ b/ps/ps.map/decorations/NorthArrow3.eps
@@ -0,0 +1,93 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 28 100
+%%HiResBoundingBox: 0.000000 0.000000 27.209766 99.950000
+%%Creator: GPL Ghostscript 871 (epswrite)
+%%CreationDate: 2012/02/20 11:21:50
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+% This copyright applies to everything between here and the %%EndProlog:
+% Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
+%%BeginResource: procset GS_epswrite_2_0_1001 1.001 0
+/GS_epswrite_2_0_1001 80 dict dup begin
+/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch
+4 index eq and{ pop pop pop}{ PageSize dup  1
+5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec}
+{ pop/setpagedevice where
+{ pop 1 dict dup /PageSize PageSize put setpagedevice}
+{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat
+setpage}if}ifelse}ifelse}ifelse} bind def
+/!{bind def}bind def/#{load def}!/N/counttomark #
+/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}!
+/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}!
+/w/setlinewidth #/J/setlinecap #
+/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat #
+/m/moveto #/l/lineto #/c/rcurveto #
+/p{N 2 idiv{N -2 roll rlineto}repeat}!
+/P{N 0 gt{N -2 roll moveto p}if}!
+/h{p closepath}!/H{P closepath}!
+/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}!
+/re{4 -2 roll m exch dup lx exch ly neg lx h}!
+/^{3 index neg 3 index neg}!
+/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}!
+/q/gsave #/Q/grestore #/rf{re fill}!
+/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}!
+/|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}!
+/|{exch string readstring |=}!
+/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}!
+/@/currentfile #/${+ @ |}!
+/B{{2 copy string{readstring pop}aload pop 4 array astore cvx
+3 1 roll}repeat pop pop true}!
+/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}!
+/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
+/Ic{exch Ix false 3 colorimage}!
+/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>>
+/CCITTFaxDecode filter}!/FX{<</EndOfBlock false F}!
+/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
+/@F{@ &2<<F}!/@C{@X &2 FX}!
+/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
+/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
+/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
+currentdict end image}!
+/~{@ read {pop} if}!
+end def
+%%EndResource
+/pagesave null def
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+GS_epswrite_2_0_1001 begin
+/pagesave save store 197 dict begin
+0.1 0.1 scale
+%%EndPageSetup
+gsave mark
+Q q
+0 0 250000 250000 re
+Y
+K
+63.28 843.69 0 155.31 25.16 0 56.25 -78.55 P
+12.81 -18.2 23.28 -34.37 31.44 -50.47 c
+0.75 0.24 p
+-2.08 20.74 -2.62 39.61 -2.62 63.55 c
+0 65.23 21.44 0 0 -155.31 -23 0 -56.02 78.79 p
+-12.3 17.31 -24.1 35.04 -32.73 51.88 c
+-0.79 -0.24 p
+1.33 -19.61 1.57 -38.24 1.57 -64.06 c
+0 -66.37 -21.45 0 h
+f
+88.75 4.98047 85.8984 589.848 re
+f
+10 w
+4 M
+88.75 4.98438 85.8984 589.84 re
+S
+134.1 821.7 64.53 -111.8 64.57 -111.83 -258.2 0 64.57 111.83 64.53 111.8 H
+f
+134.1 821.7 64.53 -111.8 64.57 -111.84 -258.2 0 64.57 111.84 64.53 111.8 H
+134.1 821.7 S
+cleartomark end end pagesave restore
+ showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
diff --git a/ps/ps.map/decorations/NorthArrow5.eps b/ps/ps.map/decorations/NorthArrow5.eps
new file mode 100644
index 0000000..3693a12
--- /dev/null
+++ b/ps/ps.map/decorations/NorthArrow5.eps
@@ -0,0 +1,108 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -1 0 40 101
+%%HiResBoundingBox: -0.048828 0.001172 39.033984 100.403125
+%%Creator: GPL Ghostscript 871 (epswrite)
+%%CreationDate: 2012/02/20 11:22:00
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+% This copyright applies to everything between here and the %%EndProlog:
+% Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
+%%BeginResource: procset GS_epswrite_2_0_1001 1.001 0
+/GS_epswrite_2_0_1001 80 dict dup begin
+/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch
+4 index eq and{ pop pop pop}{ PageSize dup  1
+5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec}
+{ pop/setpagedevice where
+{ pop 1 dict dup /PageSize PageSize put setpagedevice}
+{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat
+setpage}if}ifelse}ifelse}ifelse} bind def
+/!{bind def}bind def/#{load def}!/N/counttomark #
+/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}!
+/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}!
+/w/setlinewidth #/J/setlinecap #
+/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat #
+/m/moveto #/l/lineto #/c/rcurveto #
+/p{N 2 idiv{N -2 roll rlineto}repeat}!
+/P{N 0 gt{N -2 roll moveto p}if}!
+/h{p closepath}!/H{P closepath}!
+/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}!
+/re{4 -2 roll m exch dup lx exch ly neg lx h}!
+/^{3 index neg 3 index neg}!
+/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}!
+/q/gsave #/Q/grestore #/rf{re fill}!
+/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}!
+/|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}!
+/|{exch string readstring |=}!
+/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}!
+/@/currentfile #/${+ @ |}!
+/B{{2 copy string{readstring pop}aload pop 4 array astore cvx
+3 1 roll}repeat pop pop true}!
+/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}!
+/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
+/Ic{exch Ix false 3 colorimage}!
+/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>>
+/CCITTFaxDecode filter}!/FX{<</EndOfBlock false F}!
+/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
+/@F{@ &2<<F}!/@C{@X &2 FX}!
+/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
+/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
+/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
+currentdict end image}!
+/~{@ read {pop} if}!
+end def
+%%EndResource
+/pagesave null def
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+GS_epswrite_2_0_1001 begin
+/pagesave save store 197 dict begin
+0.1 0.1 scale
+%%EndPageSetup
+gsave mark
+Q q
+0 0 250000 250000 re
+Y
+K
+372.3 370.25 m
+0 -101.45 -82.22 -183.67 -183.63 -183.67 c
+-101.44 0 -183.67 82.22 -183.67 183.67 c
+0 101.44 82.23 183.67 183.67 183.67 c
+101.45 0 183.67 -82.23 183.67 -183.67 c
+-0.04 0 h
+f
+10 w
+4 M
+372.3 370.25 m
+0 -101.45 -82.22 -183.67 -183.63 -183.67 c
+-101.44 0 -183.67 82.22 -183.67 183.67 c
+0 101.44 82.23 183.67 183.67 183.67 c
+101.45 0 183.67 -82.23 183.67 -183.67 c
+-0.04 0 h
+372.3 370.25 S
+128.871 5.01172 123.707 714.77 re
+f
+128.871 5.01172 123.707 714.77 re
+S
+194.22 994.7 92.97 -135.51 93.01 -135.47 -371.96 0 92.97 135.47 93.01 135.51 H
+f
+194.22 994.7 92.97 -135.51 93.01 -135.47 -371.96 0 92.97 135.47 93.01 135.51 H
+194.22 994.7 S
+255 G
+94.49 273.18 0 188.24 36.17 0 81.1 -95.24 P
+18.47 -22.07 33.55 -41.64 45.23 -61.13 c
+1.13 0.24 p
+-3 25.15 -3.74 48.04 -3.74 77.11 c
+0 79.02 30.93 0 0 -188.24 -33.2 0 -80.7 95.5 p
+-17.7 20.94 -34.69 42.47 -47.15 62.86 c
+-1.1 -0.32 p
+1.88 -23.71 2.27 -46.32 2.27 -77.61 c
+0 -80.43 -30.94 0 h
+f
+cleartomark end end pagesave restore
+ showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
diff --git a/ps/ps.map/decorations/n_arrow1.eps b/ps/ps.map/decorations/n_arrow1.eps
new file mode 100644
index 0000000..82fec35
--- /dev/null
+++ b/ps/ps.map/decorations/n_arrow1.eps
@@ -0,0 +1,80 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -1 0 51 102
+%%HiResBoundingBox: -0.039453 0.000000 50.700000 101.114453
+%%Creator: GPL Ghostscript 871 (epswrite)
+%%CreationDate: 2012/02/20 11:23:35
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+% This copyright applies to everything between here and the %%EndProlog:
+% Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
+%%BeginResource: procset GS_epswrite_2_0_1001 1.001 0
+/GS_epswrite_2_0_1001 80 dict dup begin
+/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch
+4 index eq and{ pop pop pop}{ PageSize dup  1
+5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec}
+{ pop/setpagedevice where
+{ pop 1 dict dup /PageSize PageSize put setpagedevice}
+{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat
+setpage}if}ifelse}ifelse}ifelse} bind def
+/!{bind def}bind def/#{load def}!/N/counttomark #
+/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}!
+/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}!
+/w/setlinewidth #/J/setlinecap #
+/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat #
+/m/moveto #/l/lineto #/c/rcurveto #
+/p{N 2 idiv{N -2 roll rlineto}repeat}!
+/P{N 0 gt{N -2 roll moveto p}if}!
+/h{p closepath}!/H{P closepath}!
+/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}!
+/re{4 -2 roll m exch dup lx exch ly neg lx h}!
+/^{3 index neg 3 index neg}!
+/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}!
+/q/gsave #/Q/grestore #/rf{re fill}!
+/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}!
+/|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}!
+/|{exch string readstring |=}!
+/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}!
+/@/currentfile #/${+ @ |}!
+/B{{2 copy string{readstring pop}aload pop 4 array astore cvx
+3 1 roll}repeat pop pop true}!
+/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}!
+/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
+/Ic{exch Ix false 3 colorimage}!
+/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>>
+/CCITTFaxDecode filter}!/FX{<</EndOfBlock false F}!
+/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
+/@F{@ &2<<F}!/@C{@X &2 FX}!
+/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
+/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
+/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
+currentdict end image}!
+/~{@ read {pop} if}!
+end def
+%%EndResource
+/pagesave null def
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+GS_epswrite_2_0_1001 begin
+/pagesave save store 197 dict begin
+0.1 0.1 scale
+%%EndPageSetup
+gsave mark
+Q q
+0 0 250000 250000 re
+Y
+K
+247.93 254.47 -11.33 740.78 263.13 -983.95 -251.8 243.17 f
+255 G
+247.93 254.47 -11.33 740.78 -232.85 -991.48 244.18 250.7 f
+7.5 w
+K
+247.93 254.47 -244.18 -250.7 232.85 991.48 263.13 -983.95 -251.8 243.17 H
+247.93 254.47 S
+cleartomark end end pagesave restore
+ showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
diff --git a/ps/ps.map/decorations/n_arrow1_fancy.eps b/ps/ps.map/decorations/n_arrow1_fancy.eps
new file mode 100644
index 0000000..3e3c8a9
--- /dev/null
+++ b/ps/ps.map/decorations/n_arrow1_fancy.eps
@@ -0,0 +1,92 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 76 100
+%%HiResBoundingBox: 0.000000 0.000000 75.355078 99.013281
+%%Creator: GPL Ghostscript 871 (epswrite)
+%%CreationDate: 2012/02/20 11:23:18
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+% This copyright applies to everything between here and the %%EndProlog:
+% Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
+%%BeginResource: procset GS_epswrite_2_0_1001 1.001 0
+/GS_epswrite_2_0_1001 80 dict dup begin
+/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch
+4 index eq and{ pop pop pop}{ PageSize dup  1
+5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec}
+{ pop/setpagedevice where
+{ pop 1 dict dup /PageSize PageSize put setpagedevice}
+{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat
+setpage}if}ifelse}ifelse}ifelse} bind def
+/!{bind def}bind def/#{load def}!/N/counttomark #
+/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}!
+/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}!
+/w/setlinewidth #/J/setlinecap #
+/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat #
+/m/moveto #/l/lineto #/c/rcurveto #
+/p{N 2 idiv{N -2 roll rlineto}repeat}!
+/P{N 0 gt{N -2 roll moveto p}if}!
+/h{p closepath}!/H{P closepath}!
+/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}!
+/re{4 -2 roll m exch dup lx exch ly neg lx h}!
+/^{3 index neg 3 index neg}!
+/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}!
+/q/gsave #/Q/grestore #/rf{re fill}!
+/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}!
+/|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}!
+/|{exch string readstring |=}!
+/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}!
+/@/currentfile #/${+ @ |}!
+/B{{2 copy string{readstring pop}aload pop 4 array astore cvx
+3 1 roll}repeat pop pop true}!
+/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}!
+/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
+/Ic{exch Ix false 3 colorimage}!
+/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>>
+/CCITTFaxDecode filter}!/FX{<</EndOfBlock false F}!
+/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
+/@F{@ &2<<F}!/@C{@X &2 FX}!
+/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
+/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
+/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
+currentdict end image}!
+/~{@ read {pop} if}!
+end def
+%%EndResource
+/pagesave null def
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+GS_epswrite_2_0_1001 begin
+/pagesave save store 197 dict begin
+0.1 0.1 scale
+%%EndPageSetup
+gsave mark
+Q q
+0 0 250000 250000 re
+Y
+K
+379.18 219.06 -7.23 473.12 167.35 -628.43 -160.12 155.31 f
+255 G
+379.18 219.06 -7.23 473.12 -148.04 -633.24 155.27 160.12 f
+7.5 w
+K
+379.18 219.06 -155.27 -160.12 148.04 633.25 167.35 -628.44 -160.12 155.31 H
+379.18 219.06 S
+17.5 w
+744.8 376.8 m
+0 -203.29 -164.76 -368.05 -368 -368.05 c
+-203.28 0 -368.05 164.76 -368.05 368.05 c
+0 203.24 164.77 368 368.05 368 c
+203.24 0 368 -164.76 368 -368 c
+h
+744.8 376.8 S
+0.2 i
+428.03 990.14 -17.99 -0.28 1.92 -125.09 -81.93 123.86 -21.21 -0.33 2.36 -153.44 18 0.28 -1.92 124.66 
+81.07 -123.44 22.05 0.34 H
+f
+cleartomark end end pagesave restore
+ showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
diff --git a/ps/ps.map/decorations/n_arrow2.eps b/ps/ps.map/decorations/n_arrow2.eps
new file mode 100644
index 0000000..9738787
--- /dev/null
+++ b/ps/ps.map/decorations/n_arrow2.eps
@@ -0,0 +1,82 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 22 100
+%%HiResBoundingBox: 0.025000 0.000000 22.000000 99.766406
+%%Creator: GPL Ghostscript 871 (epswrite)
+%%CreationDate: 2012/02/20 11:23:00
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+% This copyright applies to everything between here and the %%EndProlog:
+% Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
+%%BeginResource: procset GS_epswrite_2_0_1001 1.001 0
+/GS_epswrite_2_0_1001 80 dict dup begin
+/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch
+4 index eq and{ pop pop pop}{ PageSize dup  1
+5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec}
+{ pop/setpagedevice where
+{ pop 1 dict dup /PageSize PageSize put setpagedevice}
+{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat
+setpage}if}ifelse}ifelse}ifelse} bind def
+/!{bind def}bind def/#{load def}!/N/counttomark #
+/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}!
+/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}!
+/w/setlinewidth #/J/setlinecap #
+/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat #
+/m/moveto #/l/lineto #/c/rcurveto #
+/p{N 2 idiv{N -2 roll rlineto}repeat}!
+/P{N 0 gt{N -2 roll moveto p}if}!
+/h{p closepath}!/H{P closepath}!
+/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}!
+/re{4 -2 roll m exch dup lx exch ly neg lx h}!
+/^{3 index neg 3 index neg}!
+/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}!
+/q/gsave #/Q/grestore #/rf{re fill}!
+/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}!
+/|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}!
+/|{exch string readstring |=}!
+/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}!
+/@/currentfile #/${+ @ |}!
+/B{{2 copy string{readstring pop}aload pop 4 array astore cvx
+3 1 roll}repeat pop pop true}!
+/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}!
+/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
+/Ic{exch Ix false 3 colorimage}!
+/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>>
+/CCITTFaxDecode filter}!/FX{<</EndOfBlock false F}!
+/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
+/@F{@ &2<<F}!/@C{@X &2 FX}!
+/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
+/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
+/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
+currentdict end image}!
+/~{@ read {pop} if}!
+end def
+%%EndResource
+/pagesave null def
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+GS_epswrite_2_0_1001 begin
+/pagesave save store 197 dict begin
+0.1 0.1 scale
+%%EndPageSetup
+gsave mark
+Q q
+0 0 250000 250000 re
+Y
+20.2885 w
+4 M
+K
+q 0.83196 1.16804 scale
+132.22 852.68 -94.29 -648.26 47.04 -6.86 102.45 -112.16 -7.98 112.16 47.04 6.86 -94.28 648.26 H
+132.22 852.68 S
+Q
+q 0.83196 1.16804 scale
+15.49 49.79 -3.47 -32.48 60.1 -8.77 8.22 122.54 111.97 -122.54 60.1 8.77 -3.48 32.48 S
+Q
+cleartomark end end pagesave restore
+ showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
diff --git a/ps/ps.map/decorations/north-arrow_1_simple_half_arrow.eps b/ps/ps.map/decorations/north-arrow_1_simple_half_arrow.eps
new file mode 100644
index 0000000..4d22ccf
--- /dev/null
+++ b/ps/ps.map/decorations/north-arrow_1_simple_half_arrow.eps
@@ -0,0 +1,78 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: -1 -1 20 101
+%%HiResBoundingBox: -0.049609 -0.049609 19.191016 100.050000
+%%Creator: GPL Ghostscript 871 (epswrite)
+%%CreationDate: 2012/02/20 11:22:27
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%EndComments
+%%BeginProlog
+% This copyright applies to everything between here and the %%EndProlog:
+% Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
+%%BeginResource: procset GS_epswrite_2_0_1001 1.001 0
+/GS_epswrite_2_0_1001 80 dict dup begin
+/PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch
+4 index eq and{ pop pop pop}{ PageSize dup  1
+5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec}
+{ pop/setpagedevice where
+{ pop 1 dict dup /PageSize PageSize put setpagedevice}
+{ /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat
+setpage}if}ifelse}ifelse}ifelse} bind def
+/!{bind def}bind def/#{load def}!/N/counttomark #
+/rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}!
+/r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}!
+/w/setlinewidth #/J/setlinecap #
+/j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat #
+/m/moveto #/l/lineto #/c/rcurveto #
+/p{N 2 idiv{N -2 roll rlineto}repeat}!
+/P{N 0 gt{N -2 roll moveto p}if}!
+/h{p closepath}!/H{P closepath}!
+/lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}!
+/re{4 -2 roll m exch dup lx exch ly neg lx h}!
+/^{3 index neg 3 index neg}!
+/f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}!
+/q/gsave #/Q/grestore #/rf{re fill}!
+/Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}!
+/|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}!
+/|{exch string readstring |=}!
+/+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}!
+/@/currentfile #/${+ @ |}!
+/B{{2 copy string{readstring pop}aload pop 4 array astore cvx
+3 1 roll}repeat pop pop true}!
+/Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}!
+/,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}!
+/Ic{exch Ix false 3 colorimage}!
+/F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>>
+/CCITTFaxDecode filter}!/FX{<</EndOfBlock false F}!
+/X{/ASCII85Decode filter}!/@X{@ X}!/&2{2 index 2 index}!
+/@F{@ &2<<F}!/@C{@X &2 FX}!
+/$X{+ @X |}!/&4{4 index 4 index}!/$F{+ @ &4<<F |}!/$C{+ @X &4 FX |}!
+/IC{3 1 roll 10 dict begin 1{/ImageType/Interpolate/Decode/DataSource
+/ImageMatrix/BitsPerComponent/Height/Width}{exch def}forall
+currentdict end image}!
+/~{@ read {pop} if}!
+end def
+%%EndResource
+/pagesave null def
+%%EndProlog
+%%Page: 1 1
+%%BeginPageSetup
+GS_epswrite_2_0_1001 begin
+/pagesave save store 197 dict begin
+0.1 0.1 scale
+%%EndPageSetup
+gsave mark
+Q q
+0 0 250000 250000 re
+Y
+K
+32.54 0 3.44 868.67 155.43 -255.58 -107.07 69.06 6.91 -680.43 -58.71 -1.72 H
+f
+0 1000 27.97 0 36.48 -53.59 0 53.59 28.25 0 0 -96.91 ^ -36.29 53.2 
+0 -53.2 -28.16 0 0 96.91 H
+f
+cleartomark end end pagesave restore
+ showpage
+%%PageTrailer
+%%Trailer
+%%Pages: 1
diff --git a/raster/r.lake/r_lake_lidar_dem.jpg b/raster/r.lake/r_lake_lidar_dem.jpg
new file mode 100644
index 0000000..44ba73e
Binary files /dev/null and b/raster/r.lake/r_lake_lidar_dem.jpg differ
diff --git a/raster/r.li/r.li.pielou/r_li_pielou.png b/raster/r.li/r.li.pielou/r_li_pielou.png
new file mode 100644
index 0000000..031a616
Binary files /dev/null and b/raster/r.li/r.li.pielou/r_li_pielou.png differ
diff --git a/raster/r.li/r.li.renyi/r_li_renyi.png b/raster/r.li/r.li.renyi/r_li_renyi.png
new file mode 100644
index 0000000..81e7d99
Binary files /dev/null and b/raster/r.li/r.li.renyi/r_li_renyi.png differ
diff --git a/raster/r.surf.fractal/r_surf_fractal.jpg b/raster/r.surf.fractal/r_surf_fractal.jpg
new file mode 100644
index 0000000..fc9cf38
Binary files /dev/null and b/raster/r.surf.fractal/r_surf_fractal.jpg differ
diff --git a/raster/r.topidx/arc.to.gridatb b/raster/r.topidx/arc.to.gridatb.pl
similarity index 100%
rename from raster/r.topidx/arc.to.gridatb
rename to raster/r.topidx/arc.to.gridatb.pl
diff --git a/raster/r.topidx/gridatb.to.arc b/raster/r.topidx/gridatb.to.arc.pl
similarity index 100%
rename from raster/r.topidx/gridatb.to.arc
rename to raster/r.topidx/gridatb.to.arc.pl
diff --git a/scripts/i.spectral/i_spectral.png b/scripts/i.spectral/i_spectral.png
new file mode 100644
index 0000000..a3fc715
Binary files /dev/null and b/scripts/i.spectral/i_spectral.png differ
diff --git a/scripts/r.in.wms/r_in_wms_nc_landcover_wms.jpg b/scripts/r.in.wms/r_in_wms_nc_landcover_wms.jpg
new file mode 100644
index 0000000..00600b6
Binary files /dev/null and b/scripts/r.in.wms/r_in_wms_nc_landcover_wms.jpg differ
diff --git a/scripts/r.pack/Makefile b/scripts/r.pack/Makefile
new file mode 100644
index 0000000..478daeb
--- /dev/null
+++ b/scripts/r.pack/Makefile
@@ -0,0 +1,7 @@
+MODULE_TOPDIR = ../..
+
+PGM = r.pack
+
+include $(MODULE_TOPDIR)/include/Make/Script.make
+
+default: script
diff --git a/scripts/r.pack/description.html b/scripts/r.pack/description.html
new file mode 100644
index 0000000..97b93ff
--- /dev/null
+++ b/scripts/r.pack/description.html
@@ -0,0 +1,28 @@
+<h2>DESCRIPTION</h2>
+
+<em>r.pack</em> packs up a GRASS raster map and related support files
+(color table etc) for copying to another computer as a single compressed
+file (gzip compression).
+
+
+<h2>EXAMPLE</h2>
+
+This command saves the raster map "elevation.dem" into the export
+file "elevation.dem.pack" which can be transferred to another computer:
+
+<div class="code"><pre> 
+r.pack elevation.dem
+</pre></div>
+
+
+<h2>SEE ALSO</h2>
+
+<em><a href="r.unpack.html">r.unpack</a></em>
+
+
+<h2>AUTHOR</h2>
+
+Hamish Bowman, Otago University, New Zealand
+
+<p>
+<i>Last changed: $Date: 2013-02-22 00:57:37 -0800 (Fri, 22 Feb 2013) $</i>
diff --git a/scripts/r.pack/experiment/r.pack.mat b/scripts/r.pack/experiment/r.pack.mat
new file mode 100755
index 0000000..ed948e3
--- /dev/null
+++ b/scripts/r.pack/experiment/r.pack.mat
@@ -0,0 +1,88 @@
+#!/bin/sh
+#  r.pack   --  pack up a raster map as binary MAT-File:
+#     r.out.mat file + support files => gzip
+#
+#   (c) 2004 GRASS Development Team
+#   AUTHOR: Hamish Bowman, Otago University, New Zealand
+#
+#   This program is free software under the GNU General Public
+#   License (>=v2). Read the file COPYING that comes with GRASS
+#   for details.
+#
+
+#%Module
+#%  description: Packs up a raster map as binary MAT-File and support files for copying
+#%End
+#%option
+#% key: input
+#% type: string
+#% gisprompt: old,cell,raster
+#% description: Name of an existing raster map
+#% required : yes
+#%end
+
+if [ -z "$GISBASE" ] ; then
+   echo "You must be in GRASS GIS to run this program." >&2
+   exit 1
+fi
+
+if [ "$1" != "@ARGS_PARSED@" ] ; then
+  exec g.parser "$0" "$@"
+fi
+
+# check for tar  (is there a better way?)
+if [ -z "`which tar`" ] ; then
+   echo "ERROR: tar must be installed to use this program."
+   exit 1
+fi
+# check for gzip
+if [ -z "`which gzip`" ] ; then
+   echo "ERROR: gzip must be installed to use this program."
+   exit 1
+fi
+
+
+# create temporary directory to hold bits
+TMP_DIR="`g.tempfile pid=$$`"
+if [ $? -ne 0 ] || [ -z "$TMP_DIR" ] ; then
+   echo "ERROR: unable to create temporary files" 1>&2
+   exit 1
+fi
+rm -f "$TMP_DIR"
+mkdir "$TMP_DIR"
+if [ ! -d "$TMP_DIR" ] ; then
+   echo "ERROR: unable to create temporary directory" 1>&2
+   exit 1
+fi
+
+# output map
+r.out.mat input="$GIS_OPT_INPUT" output="$TMP_DIR"/map.mat
+
+
+# copy support files
+for SUPPORT in colr hist cats ; do 
+    eval `g.findfile element=$SUPPORT file="$GIS_OPT_INPUT"`
+    if [ ! -z "$file" ] ; then
+        cp "$file" "$TMP_DIR"/$SUPPORT
+    fi
+done
+
+
+# copy projection info
+#   (would prefer to use g.proj*, but this way is 5.3 and 5.7 compat)
+eval `g.gisenv`
+cp "$GISDBASE"/"$LOCATION_NAME"/PERMANENT/PROJ_INFO "$TMP_DIR"/proj_info
+
+
+# pack it all up
+OLD_DIR="`pwd`"
+cd "$TMP_DIR"/
+tar czf "$OLD_DIR"/"$GIS_OPT_INPUT".pack *
+
+
+# clean up
+cd "$OLD_DIR"
+rm -rf "$TMP_DIR"
+
+echo Finished.
+exit 0
diff --git a/scripts/r.pack/r.pack b/scripts/r.pack/r.pack
new file mode 100755
index 0000000..8866e95
--- /dev/null
+++ b/scripts/r.pack/r.pack
@@ -0,0 +1,138 @@
+#!/bin/sh
+#  r.pack   --  pack up a raster map:
+#     collect raster map elements => gzip
+#
+#   (c) 2004-2013 GRASS Development Team
+#   AUTHOR: Hamish Bowman, Otago University, New Zealand
+#
+#   This program is free software under the GNU General Public License
+#   (>=v2). Read the file COPYING that comes with GRASS for details.
+#
+
+#%module
+#% description: Packs up a raster map and support files for copying.
+#% keywords: raster, copying
+#%end
+#%option
+#% key: input
+#% type: string
+#% gisprompt: old,cell,raster
+#% description: Name of raster map to pack up
+#% key_desc: name
+#% required : yes
+#%end
+#%option
+#% key: output
+#% type: string
+#% gisprompt: new_file,file,output
+#% description: Name for output file (default is input-map.pack)
+#% key_desc: name
+#% required: no
+#%end
+
+
+if [ -z "$GISBASE" ] ; then
+   echo "You must be in GRASS GIS to run this program." >&2
+   exit 1
+fi
+
+if [ "$1" != "@ARGS_PARSED@" ] ; then
+  exec g.parser "$0" "$@"
+fi
+
+# check for tar  (is there a better way?)
+if [ -z "`which tar`" ] ; then
+   echo "ERROR: tar must be installed to use this program."
+   exit 1
+fi
+# check for gzip
+if [ -z "`which gzip`" ] ; then
+   echo "ERROR: gzip must be installed to use this program."
+   exit 1
+fi
+
+if [ -n "$GIS_OPT_OUTPUT" ] ; then
+   outfile="$GIS_OPT_OUTPUT"
+else
+   outfile="`echo $GIS_OPT_INPUT | cut -d'@' -f1`.pack"
+fi
+
+#be overly helpful
+outfile="`basename "$outfile" .pack`.pack"
+
+
+eval `g.findfile elem=cell file="$GIS_OPT_INPUT"`
+if [ -z "$name" ] ; then
+   g.message -e "Map not found"
+   exit 1
+else
+   # strip off mapset to remove fully qualified input
+   name=`echo "$name" | cut -d'@' -f1`
+fi
+
+
+# create temporary directory to hold bits
+TMP="`g.tempfile pid=$$`"
+if [ $? -ne 0 ] || [ -z "$TMP" ] ; then
+   g.message -e "Unable to create temporary files"
+fi
+rm -f "$TMP"
+mkdir "$TMP"
+TMP_DIR="$TMP/$name"
+mkdir "$TMP_DIR"
+
+if [ ! -d "$TMP_DIR" ] ; then
+   g.message -e "Unable to create temporary directory"
+   exit 1
+fi
+
+
+BASEDIR=`echo "$file" | sed -e 's+/cell/.*$++'`
+OLDDIR=`pwd`
+
+for ELEMENT in cats cell cellhd colr fcell grid3 hist ; do
+    if [ -e "$BASEDIR/$ELEMENT/$name" ] ; then
+	cp "$BASEDIR/$ELEMENT/$name" "$TMP_DIR/$ELEMENT"
+    fi
+done
+
+if [ -d "$BASEDIR/cell_misc/$name/" ] ; then
+    mkdir "$TMP_DIR/cell_misc/"
+    cp "$BASEDIR/cell_misc/$name/"* "$TMP_DIR/cell_misc/"
+fi
+
+
+if [ -z "`ls $TMP_DIR`" ] ; then
+   g.message -e "No map components found"
+   exit 1
+fi
+
+# copy projection info
+#   (would prefer to use g.proj*, but this way is 5.3 and 5.7 compat)
+LOCATION_NAME=`g.gisenv get=LOCATION_NAME`
+GISDBASE=`g.gisenv get=GISDBASE`
+
+for SUPPORT in INFO UNITS EPSG ; do
+   if [ -e "$GISDBASE/$LOCATION_NAME/PERMANENT/PROJ_$SUPPORT" ] ; then
+       cp "$GISDBASE/$LOCATION_NAME/PERMANENT/PROJ_$SUPPORT" "$TMP_DIR"
+   fi
+done
+
+
+# pack it all up
+cd "$TMP"
+tar czf "$outfile" *
+
+# clean up
+mv "$outfile" "$OLDDIR/"
+if [ $? -ne 0 ] ; then
+   g.message -e "Saving file to <$OLDDIR/$outfile>"
+   rm -rf "$TMP"
+   exit 1
+fi
+
+cd "$OLD_DIR"
+rm -rf "$TMP"
+
+g.message -v "Done. Map saved to <$OLDDIR/$outfile>"
+exit 0
diff --git a/scripts/r.unpack/Makefile b/scripts/r.unpack/Makefile
new file mode 100644
index 0000000..2fe584e
--- /dev/null
+++ b/scripts/r.unpack/Makefile
@@ -0,0 +1,7 @@
+MODULE_TOPDIR = ../..
+
+PGM = r.unpack
+
+include $(MODULE_TOPDIR)/include/Make/Script.make
+
+default: script
diff --git a/scripts/r.unpack/description.html b/scripts/r.unpack/description.html
new file mode 100644
index 0000000..1d09bdf
--- /dev/null
+++ b/scripts/r.unpack/description.html
@@ -0,0 +1,23 @@
+<h2>DESCRIPTION</h2>
+
+<em>r.unpack</em> unpacks a GRASS raster map and related support files
+(color table etc) packed with r.pack.
+
+<h2>EXAMPLE</h2>
+
+This command restores the raster map "elevation.dem" from the export
+file "elevation.dem.pack" for example transferred from another computer:
+
+<div class="code"><pre> 
+r.unpack elevation.dem.pack
+</pre></div>
+
+<h2>SEE ALSO</h2>
+
+<em><a href="r.pack.html">r.pack</a></em>
+
+<h2>AUTHOR</h2>
+
+Hamish Bowman, Otago University, New Zealand
+
+<p><i>Last changed: $Date: 2011-02-27 09:33:36 -0800 (Sun, 27 Feb 2011) $</i>
diff --git a/scripts/r.unpack/experiment/r.unpack.mat b/scripts/r.unpack/experiment/r.unpack.mat
new file mode 100755
index 0000000..bfe2000
--- /dev/null
+++ b/scripts/r.unpack/experiment/r.unpack.mat
@@ -0,0 +1,116 @@
+#!/bin/sh
+#  r.unpack.mat   --  unpack up a binary MAT-File(v4) map packed with r.pack.mat:
+#     tar+gzip => r.in.mat + support files
+#
+#   (c) 2004 GRASS Development Team
+#   AUTHOR: Hamish Bowman, Otago University, New Zealand
+#
+#   This program is free software under the GNU General Public
+#   License (>=v2). Read the file COPYING that comes with GRASS
+#   for details.
+#
+
+#%Module
+#%  description: Unpacks a binary MAT-File map packed with r.pack.mat
+#%End
+#%option
+#% key: input
+#% type: string
+#% gisprompt: file,file,file
+#% description: Name of an existing pack file
+#% required : yes
+#%end
+#%flag
+#%  key: o
+#%  description: Override projection (use location's projection)
+#%end
+
+
+if [ -z "$GISBASE" ] ; then
+   echo "You must be in GRASS GIS to run this program." >&2
+   exit 1
+fi   
+if [ "$1" != "@ARGS_PARSED@" ] ; then
+   exec g.parser "$0" "$@"
+fi
+
+# check for tar  (is there a better way?)
+if [ -z "`which tar`" ] ; then
+   echo "ERROR: tar must be installed to use this program."
+   exit 1
+fi
+# check for gzip
+if [ -z "`which gzip`" ] ; then
+   echo "ERROR: gzip must be installed to use this program."
+   exit 1
+fi
+
+
+eval `g.gisenv`
+MSET_DIR="$GISDBASE/$LOCATION_NAME/$MAPSET"
+
+
+if [ ! -e "$GIS_OPT_INPUT" ] ; then
+   echo "ERROR: file not found [$GIS_OPT_INPUT]"
+   exit 1
+fi
+
+# remove .pack and path from $GIS_OPT_INPUT
+MAP_NAME="`basename "$GIS_OPT_INPUT" | sed -e 's/\.pack$//'`"
+echo "The imported map will be named [$MAP_NAME]."
+
+eval `g.findfile element=cell file="$MAP_NAME"`
+if [ ! -z "$file" ] ; then
+   echo "ERROR: '$MAP_NAME' already exists."
+   exit 1
+fi
+
+
+# create temporary directory to hold bits
+TMP_DIR="`g.tempfile pid=$$`"
+if [ $? -ne 0 ] || [ -z "$TMP_DIR" ] ; then
+   echo "ERROR: unable to create temporary files" 1>&2
+   exit 1
+fi
+rm -f "$TMP_DIR"
+mkdir "$TMP_DIR"
+if [ ! -d "$TMP_DIR" ] ; then
+   echo "ERROR: unable to create temporary directory" 1>&2
+   exit 1
+fi
+
+
+cp "$GIS_OPT_INPUT" "$TMP_DIR"/
+cd "$TMP_DIR"/
+tar xzf "`basename $GIS_OPT_INPUT`"
+
+
+# check projection compatibility in a rather crappy way
+if [ ! -z "`diff proj_info "$MSET_DIR"/../PERMANENT/PROJ_INFO`" ] ; then
+    if [ $GIS_FLAG_O -eq 1 ] ; then
+        echo "WARNING: Projection information does not match. Proceeding.."
+    else
+        echo "ERROR: Projection information does not match. Aborting."
+        # clean up
+        cd "$MSET_DIR"
+        rm -rf "$TMP_DIR"
+        exit 1
+    fi
+fi
+
+
+r.in.mat input=map.mat output="$MAP_NAME"
+
+for SUPPORT in colr hist cats ; do 
+    if [ -e $SUPPORT ] ; then
+        cp $SUPPORT "$MSET_DIR"/$SUPPORT/"$MAP_NAME"
+    fi
+done
+
+
+# clean up
+cd "$MSET_DIR"
+rm -rf "$TMP_DIR"
+
+echo Finished.
+exit 0
diff --git a/scripts/r.unpack/r.unpack b/scripts/r.unpack/r.unpack
new file mode 100755
index 0000000..8a761d6
--- /dev/null
+++ b/scripts/r.unpack/r.unpack
@@ -0,0 +1,168 @@
+#!/bin/sh
+#  r.unpack   --  unpack up a raster map packed with r.pack:
+#     tar+gzip'd map elements => GRASS 6 mapset structure
+#
+#   (c) 2004-2008, 2012 GRASS Development Team
+#   AUTHOR: Hamish Bowman, Otago University, New Zealand
+#
+#   This program is free software under the GNU General Public
+#   License (>=v2). Read the file COPYING that comes with GRASS
+#   for details.
+#
+
+#%module
+#% description: Unpacks a raster map packed with r.pack.
+#% keywords: raster, copying
+#%end
+#%option
+#% key: input
+#% type: string
+#% gisprompt: old,file,input
+#% description: Name of input pack file
+#% required: yes
+#%end
+#%option
+#% key: output
+#% type: string
+#% key_desc: name
+#% gisprompt: new,cell,raster
+#% description: Name for output raster map (default: taken from input file internals)
+#% required : no
+#%end
+#%flag
+#% key: o
+#% description: Override projection check (use current location's projection)
+#%end
+
+
+if [ -z "$GISBASE" ] ; then
+   echo "You must be in GRASS GIS to run this program." >&2
+   exit 1
+fi   
+if [ "$1" != "@ARGS_PARSED@" ] ; then
+   exec g.parser "$0" "$@"
+fi
+
+# check for tar,gzip
+for PRGM in tar gzip ; do
+   if [ -z "`which $PRGM`" ] ; then
+      g.message -e "$PRGM must be installed to use this program."
+      exit 1
+   fi
+done
+
+
+if [ -z "$GRASS_OVERWRITE" ] ; then
+   GRASS_OVERWRITE=0
+fi
+
+
+if [ ! -e "$GIS_OPT_INPUT" ] ; then
+   g.message -e "File not found <$GIS_OPT_INPUT>"
+   exit 1
+fi
+
+MAPSET=`g.gisenv get=MAPSET`
+LOCATION_NAME=`g.gisenv get=LOCATION_NAME`
+GISDBASE=`g.gisenv get=GISDBASE`
+MSET_DIR="$GISDBASE/$LOCATION_NAME/$MAPSET"
+
+# create temporary directory to hold bits
+TMP_DIR="`g.tempfile pid=$$`"
+if [ $? -ne 0 ] || [ -z "$TMP_DIR" ] ; then
+   g.message -e "Unable to create temporary files"
+   exit 1
+fi
+
+rm -f "$TMP_DIR"
+mkdir "$TMP_DIR"
+
+if [ ! -d "$TMP_DIR" ] ; then
+   g.message -e "Unable to create temporary directory"
+   exit 1
+fi
+
+
+cleanup()
+{
+   g.message -v "Cleaning up ..."
+   cd "$MSET_DIR"
+   rm -rf "$TMP_DIR"
+}
+#### trap ctrl-c so that we can clean up tmp
+trap 'cleanup' 2 3 15
+
+
+cp "$GIS_OPT_INPUT" "$TMP_DIR"/
+cd "$TMP_DIR"/
+
+# remove .pack and path from $GIS_OPT_INPUT
+#MAP_NAME="`basename "$GIS_OPT_INPUT" | sed -e 's/\.pack$//'`"
+
+INPUT_BASE=`basename $GIS_OPT_INPUT`
+DATA_NAME=`tar tzf "$INPUT_BASE" | head -n 1 | cut -f1 -d'/'`
+if [ -z "$DATA_NAME" ] ; then
+   g.message -e "Pack file unreadable"
+   cleanup
+   exit 1
+fi
+
+if [ -z "$GIS_OPT_OUTPUT" ] ; then
+   MAP_NAME="$DATA_NAME"
+else
+   MAP_NAME="$GIS_OPT_OUTPUT"
+fi
+
+eval `g.findfile element=cell file="$MAP_NAME" mapset=.`
+if [ ! -z "$file" ] && [ "$GRASS_OVERWRITE" -ne 1 ] ; then
+   g.message -e "Raster map <$MAP_NAME> already exists"
+   cleanup
+   exit 1
+fi
+
+
+# extract data
+tar xzf "$INPUT_BASE"
+if [ $? -ne 0 ] ; then
+   g.message -e "Pack file unreadable"
+   cleanup
+   exit 1
+fi
+
+
+cd "$DATA_NAME"/
+
+# check projection compatibility in a rather crappy way
+if [ ! -z `diff PROJ_INFO "$MSET_DIR"/../PERMANENT/PROJ_INFO` ] ; then
+    if [ $GIS_FLAG_O -eq 1 ] ; then
+        g.message -w "Projection information does not match. Proceeding.."
+    else
+        g.message -e "Projection information does not match. Aborting."
+        cleanup
+        exit 1
+    fi
+fi
+
+
+# install in $MAPSET
+for ELEMENT in cats cell cellhd colr fcell grid3 hist ; do
+    if [ -e "$ELEMENT" ] ; then
+	if [ ! -d "$MSET_DIR/$ELEMENT/" ] ; then
+	   mkdir "$MSET_DIR/$ELEMENT/"
+	fi
+	cp "$ELEMENT" "$MSET_DIR/$ELEMENT/$MAP_NAME"
+    fi
+done
+
+if [ -d "cell_misc" ] ; then
+    if [ ! -d "$MSET_DIR/cell_misc" ] ; then
+	mkdir "$MSET_DIR/cell_misc"
+    fi
+    cp -r "cell_misc"/ "$MSET_DIR/cell_misc/$MAP_NAME"
+fi
+
+
+cleanup
+
+g.message -v "Done. Map saved to <$MAP_NAME>"
+exit 0
diff --git a/tools/g.echo.c b/tools/g.echo.c
new file mode 100644
index 0000000..6c9de27
--- /dev/null
+++ b/tools/g.echo.c
@@ -0,0 +1,9 @@
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+    if (argc != 2)
+	return 1;
+    fputs(argv[1], stdout);
+    return 0;
+}
diff --git a/vector/v.overlay/v_overlay_census_wake2000.png b/vector/v.overlay/v_overlay_census_wake2000.png
new file mode 100644
index 0000000..d3f39f2
Binary files /dev/null and b/vector/v.overlay/v_overlay_census_wake2000.png differ
diff --git a/vector/v.overlay/v_overlay_urban_census2000.png b/vector/v.overlay/v_overlay_urban_census2000.png
new file mode 100644
index 0000000..bd27195
Binary files /dev/null and b/vector/v.overlay/v_overlay_urban_census2000.png differ
diff --git a/vector/v.overlay/v_overlay_urbanarea.png b/vector/v.overlay/v_overlay_urbanarea.png
new file mode 100644
index 0000000..cc96fd0
Binary files /dev/null and b/vector/v.overlay/v_overlay_urbanarea.png differ
diff --git a/vector/v.vect.stats/Makefile b/vector/v.vect.stats/Makefile
new file mode 100644
index 0000000..681b874
--- /dev/null
+++ b/vector/v.vect.stats/Makefile
@@ -0,0 +1,15 @@
+
+MODULE_TOPDIR = ../..
+
+PGM=v.vect.stats
+
+LIBES     = $(VECTLIB) $(VECTLIB_REAL) $(STATSLIB) $(GISLIB)
+DEPENDENCIES= $(VECTDEP) $(STATSDEP) $(GISDEP)
+
+EXTRA_INC = $(VECT_INC)
+EXTRA_CFLAGS = $(VECT_CFLAGS)
+ 
+include $(MODULE_TOPDIR)/include/Make/Module.make
+
+default: cmd	
+
diff --git a/vector/v.vect.stats/description.html b/vector/v.vect.stats/description.html
new file mode 100644
index 0000000..8a285c0
--- /dev/null
+++ b/vector/v.vect.stats/description.html
@@ -0,0 +1,95 @@
+<h2>DESCRIPTION</h2>
+
+<em>v.vect.stats</em> counts the number of points in vector map
+<em>points</em> falling into each area in vector map <em>areas</em>.
+Optionally statistics on point attributes in <em>points</em> are
+calculated for each area. The results are either uploaded to the
+attribute table of the vector map <em>areas</em> or printed to stdout.
+
+<h3>OPTIONS</h3>
+
+<em>Statistical Methods:</em>
+Using numeric attribute values of all points falling into a given area,
+a new value is detmined with the selected method.
+<em>v.vect.stats</em> can perform the following operations:
+
+<p>
+<dl>
+
+<dt><b>sum</b> 
+
+<dd>The sum of values.
+
+<dt><b>average</b> 
+
+<dd>The average value of all point attributes (sum / count).
+
+<dt><b>median</b> 
+
+<dd>The value found half-way through a list of the
+attribute values, when these are ranged in numerical order.
+
+<dt><b>mode</b> 
+
+<dd>The most frequently occurring value.
+
+<dt><b>minimum</b> 
+
+<dd>The minimum observed value.
+
+<dt><b>min_cat</b> 
+
+<dd>The point category corresponding to the minimum observed value.
+
+<dt><b>maximum</b> 
+
+<dd>The maximum observed value.
+
+<dt><b>max_cat</b> 
+
+<dd>The point category corresponding to the maximum observed value.
+
+<dt><b>range</b> 
+
+<dd>The range of the observed values.
+
+<dt><b>stddev</b> 
+
+<dd>The statistical standard deviation of the attribute values.
+
+<dt><b>variance</b> 
+
+<dd>The statistical variance of the attribute values.
+
+<dt><b>diversity</b> 
+
+<dd>The number of different attribute values.
+
+</dl>
+
+
+<h2>NOTES</h2>
+
+Points not falling into any area are ignored. Areas without category
+(no centroid attached or centroid without category) are ignored. 
+If no points are falling into a given area, the point count is set to 0
+(zero) and the statistics result to "null".
+<p>
+The columns <em>count_column</em> and <em>stats_column</em> are created if not
+existing. If they do already exist, the <em>count_column</em> must be of
+type integer and the <em>stats_column</em> of type double.
+
+<h2>SEE ALSO</h2>
+
+<em>
+<a href="v.distance.html">v.distance</a>,
+<a href="r.distance.html">r.distance</a>,
+<a href="v.what.vect.html">v.what.vect</a>
+</em>
+
+
+<h2>AUTHOR</h2>
+
+Markus Metz
+
+<p><i>Last changed: $Date: 2008-08-13 21:52:37 +0200 (Wed, 13 Aug 2008) $</i>
diff --git a/vector/v.vect.stats/main.c b/vector/v.vect.stats/main.c
new file mode 100644
index 0000000..92d0202
--- /dev/null
+++ b/vector/v.vect.stats/main.c
@@ -0,0 +1,721 @@
+
+/***************************************************************
+ *
+ * MODULE:       v.vect.stats
+ * 
+ * AUTHOR(S):    Markus Metz
+ *               
+ * PURPOSE:      Counts points per area and calculates aggregate statistics. 
+ *               
+ * COPYRIGHT:    (C) 2002-2010 by the GRASS Development Team
+ *
+ *               This program is free software under the 
+ *               GNU General Public License (>=v2). 
+ *               Read the file COPYING that comes with GRASS
+ *               for details.
+ *
+ **************************************************************/
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <math.h>
+#include <grass/gis.h>
+#include <grass/glocale.h>
+#include <grass/stats.h>
+#include <grass/dbmi.h>
+#include <grass/Vect.h>
+
+struct menu
+{
+    stat_func *method;		/* routine to compute new value */
+    int half;			/* whether to add 0.5 to result */
+    char *name;			/* method name */
+    char *text;			/* menu display - full description */
+};
+
+/* modify this table to add new methods */
+static struct menu menu[] = {
+    {c_sum, 0, "sum", "sum of values"},
+    {c_ave, 1, "average", "average value"},
+    {c_median, 0, "median", "median value"},
+    {c_mode, 0, "mode", "most frequently occuring value"},
+    {c_min, 0, "minimum", "lowest value"},
+    {c_minx, 0, "min_cat", "category number of lowest value"},
+    {c_max, 0, "maximum", "highest value"},
+    {c_maxx, 0, "max_cat", "category number of highest value"},
+    {c_range, 0, "range", "range of values"},
+    {c_stddev, 1, "stddev", "standard deviation"},
+    {c_var, 1, "variance", "statistical variance"},
+    {c_divr, 0, "diversity", "number of different values"},
+    {0, 0, 0, 0}
+};
+
+/* Structure to store info for each area category */
+typedef struct
+{
+    int area_cat;		/* area category */
+    int count;			/* number of points in areas with area_cat */
+    double *values;
+    int *cats;
+    int nvalues, nalloc;
+
+} AREA_CAT;
+
+/* compare function for qsort and bsearch */
+static int cmp_area(const void *pa, const void *pb)
+{
+    AREA_CAT *p1 = (AREA_CAT *) pa;
+    AREA_CAT *p2 = (AREA_CAT *) pb;
+
+    if (p1->area_cat < p2->area_cat)
+	return -1;
+    if (p1->area_cat > p2->area_cat)
+	return 1;
+    return 0;
+}
+
+int main(int argc, char *argv[])
+{
+    char *p;
+    int i, j, k;
+    int method, half, use_catno;
+    char *mapset;
+    struct GModule *module;
+    struct Option *point_opt,	/* point vector */
+     *area_opt,			/* area vector */
+     *point_type_opt,		/* point type */
+     *point_field_opt,		/* point layer */
+     *area_field_opt,		/* area layer */
+     *method_opt,		/* stats method */
+     *point_column_opt,		/* point column for stats */
+     *count_column_opt,		/* area column for point count */
+     *stats_column_opt,		/* area column for stats result */
+     *fs_opt;			/* field separator for printed output */
+    struct Flag *print_flag;
+    char fs[2];
+    struct Map_info PIn, AIn;
+    int point_type, point_field, area_field;
+    struct line_pnts *Points;
+    struct line_cats *ACats, *PCats;
+    AREA_CAT *Area_cat;
+    int pline, ptype, count;
+    int area, nareas, nacats, nacatsalloc;
+    int ctype, nrec;
+    struct field_info *PFi, *AFi;
+    dbString stmt;
+    dbDriver *Pdriver, *Adriver;
+    char buf[2000];
+    int update_ok, update_err;
+    struct ilist *List;
+    BOUND_BOX box;
+    dbCatValArray cvarr;
+    dbColumn *column;
+    struct pvalcat
+    {
+	double dval;
+	int catno;
+    } *pvalcats;
+    int npvalcats, npvalcatsalloc;
+    stat_func *statsvalue = NULL;
+    double result;
+
+    column = NULL;
+
+    G_gisinit(argv[0]);
+
+    module = G_define_module();
+    module->keywords = _("vector, database, attribute table");
+    module->description = _("Count points in areas, calculate statistics.");
+
+    point_opt = G_define_standard_option(G_OPT_V_INPUT);
+    point_opt->key = "points";
+    point_opt->description = _("Name of existing vector map with points");
+    /* point_opt->guisection = _("Required"); */
+
+    area_opt = G_define_standard_option(G_OPT_V_INPUT);
+    area_opt->key = "areas";
+    area_opt->description = _("Name of existing vector map with areas");
+    /* area_opt->guisection = _("Required"); */
+
+    point_type_opt = G_define_standard_option(G_OPT_V_TYPE);
+    point_type_opt->key = "type";
+    point_type_opt->options = "point,centroid";
+    point_type_opt->answer = "point";
+    point_type_opt->label = _("Feature type");
+    point_type_opt->required = NO;
+
+    point_field_opt = G_define_standard_option(G_OPT_V_FIELD);
+    point_field_opt->key = "player";
+    point_field_opt->label = _("Layer number for points map");
+
+    area_field_opt = G_define_standard_option(G_OPT_V_FIELD);
+    area_field_opt->key = "alayer";
+    area_field_opt->label = _("Layer number for area map");
+
+    method_opt = G_define_option();
+    method_opt->key = "method";
+    method_opt->type = TYPE_STRING;
+    method_opt->required = NO;
+    method_opt->multiple = NO;
+    p = G_malloc(1024);
+    for (i = 0; menu[i].name; i++) {
+	if (i)
+	    strcat(p, ",");
+	else
+	    *p = 0;
+	strcat(p, menu[i].name);
+    }
+    method_opt->options = p;
+    method_opt->description = _("Method for aggregate statistics");
+
+    point_column_opt = G_define_standard_option(G_OPT_COLUMN);
+    point_column_opt->key = "pcolumn";
+    point_column_opt->required = NO;
+    point_column_opt->multiple = NO;
+    point_column_opt->label =
+	_("Column name of points map to use for statistics");
+    point_column_opt->description = _("Column of points map must be numeric");
+
+    count_column_opt = G_define_option();
+    count_column_opt->key = "ccolumn";
+    count_column_opt->type = TYPE_STRING;
+    count_column_opt->required = NO;
+    count_column_opt->multiple = NO;
+    count_column_opt->label = _("Column name to upload points count");
+    count_column_opt->description =
+	_("Column to hold points count, must be of type integer, will be created if not existing");
+
+    stats_column_opt = G_define_option();
+    stats_column_opt->key = "scolumn";
+    stats_column_opt->type = TYPE_STRING;
+    stats_column_opt->required = NO;
+    stats_column_opt->multiple = NO;
+    stats_column_opt->label = _("Column name to upload statistics");
+    stats_column_opt->description =
+	_("Column to hold statistics, must be of type double, will be created if not existing");
+
+    fs_opt = G_define_standard_option(G_OPT_F_SEP);
+    fs_opt->answer = "|";
+    fs_opt->key_desc = "character|space|tab";
+    fs_opt->description = _("Output field separator");
+
+    print_flag = G_define_flag();
+    print_flag->key = 'p';
+    print_flag->label =
+	_("Print output to stdout, do not update attribute table");
+    print_flag->description = _("First column is always area category");
+
+    if (G_parser(argc, argv))
+	exit(EXIT_FAILURE);
+
+    point_type = Vect_option_to_types(point_type_opt);
+
+    point_field = atoi(point_field_opt->answer);
+    area_field = atoi(area_field_opt->answer);
+
+    strcpy(fs, " ");
+    if (print_flag->answer) {
+	/* get field separator */
+	if (fs_opt->answer) {
+	    if (strcmp(fs_opt->answer, "space") == 0)
+		*fs = ' ';
+	    else if (strcmp(fs_opt->answer, "tab") == 0)
+		*fs = '\t';
+	    else if (strcmp(fs_opt->answer, "\\t") == 0)
+		*fs = '\t';
+	    else
+		*fs = *fs_opt->answer;
+	}
+	else
+	    *fs = '|';
+    }
+
+    /* check for stats */
+    if (method_opt->answer) {
+	if (!point_column_opt->answer) {
+	    G_fatal_error("Method but no point column selected");
+	}
+	if (!print_flag->answer && !stats_column_opt->answer)
+	    G_fatal_error("Name for stats column is missing");
+    }
+
+    if (point_column_opt->answer) {
+	if (!method_opt->answer)
+	    G_fatal_error("No method for statistics selected");
+	if (!print_flag->answer && !stats_column_opt->answer)
+	    G_fatal_error("Name for stats column is missing");
+    }
+    
+    /* Open points vector */
+    if ((mapset = G_find_vector2(point_opt->answer, "")) == NULL)
+	G_fatal_error(_("Vector map <%s> not found"), point_opt->answer);
+
+    Vect_set_open_level(2);
+    Vect_open_old(&PIn, point_opt->answer, mapset);
+
+    /* Open areas vector */
+    if ((mapset = G_find_vector2(area_opt->answer, "")) == NULL)
+	G_fatal_error(_("Vector map <%s> not found"), area_opt->answer);
+    if (!print_flag->answer && strcmp(mapset, G_mapset()) != 0)
+	G_fatal_error(_("Vector map <%s> is not in user mapset and cannot be updated"),
+		      area_opt->answer);
+
+    Vect_set_open_level(2);
+    Vect_open_old(&AIn, area_opt->answer, mapset);
+
+    method = -1;
+    use_catno = 0;
+    half = 0;
+    if (method_opt->answer) {
+	/* get the method */
+	for (method = 0; (p = menu[method].name); method++)
+	    if ((strcmp(p, method_opt->answer) == 0))
+		break;
+	if (!p) {
+	    G_warning(_("<%s=%s> unknown %s"),
+		      method_opt->key, method_opt->answer,
+		      method_opt->answer);
+	    G_usage();
+	    exit(EXIT_FAILURE);
+	}
+
+	/* establish the statsvalue routine */
+	statsvalue = menu[method].method;
+
+	/* category number of lowest/highest value */
+	if ((strcmp(menu[method].name, menu[5].name) == 0) ||
+	    (strcmp(menu[method].name, menu[7].name) == 0))
+	    use_catno = 1;
+
+	G_debug(1, "method: %s, use cat value: %s", menu[method].name,
+		(use_catno == 1 ? "yes" : "no"));
+    }
+
+    /* Open database driver */
+    db_init_string(&stmt);
+    Adriver = NULL;
+
+    if (!print_flag->answer) {
+
+	AFi = Vect_get_field(&AIn, area_field);
+	if (AFi == NULL)
+	    G_fatal_error(_("Database connection not defined for layer %d"),
+			  area_field);
+
+	Adriver = db_start_driver_open_database(AFi->driver, AFi->database);
+	if (Adriver == NULL)
+	    G_fatal_error(_("Unable to open database <%s> with driver <%s>"),
+			  AFi->database, AFi->driver);
+
+	if (!count_column_opt->answer)
+	    G_fatal_error(_("ccolumn is required to upload point counts"));
+
+	/* check if count column exists */
+	G_debug(1, "check if count column exists");
+	db_get_column(Adriver, AFi->table, count_column_opt->answer, &column);
+	if (column) {
+	    /* check count column type */
+	    if (db_column_Ctype(Adriver, AFi->table, count_column_opt->answer)
+		!= DB_C_TYPE_INT)
+		G_fatal_error(_("ccolumn must be of type integer"));
+
+	    db_free_column(column);
+	    column = NULL;
+	}
+	else {
+	    /* create count column */
+	    /* db_add_column() exists but is not implemented,
+	     * see lib/db/stubs/add_col.c */
+	    sprintf(buf, "alter table %s add column %s integer",
+	                    AFi->table, count_column_opt->answer);
+	    db_set_string(&stmt, buf);
+	    if (db_execute_immediate(Adriver, &stmt) != DB_OK)
+		G_fatal_error(_("Unable to add column <%s>"),
+			      count_column_opt->answer);
+	}
+
+	if (method_opt->answer) {
+	    if (!stats_column_opt->answer)
+		G_fatal_error(_("scolumn is required to upload point stats"));
+
+	    /* check if stats column exists */
+	    G_debug(1, "check if stats column exists");
+	    db_get_column(Adriver, AFi->table, stats_column_opt->answer,
+			  &column);
+	    if (column) {
+		/* check stats column type */
+		if (db_column_Ctype
+		    (Adriver, AFi->table,
+		     stats_column_opt->answer) != DB_C_TYPE_DOUBLE)
+		    G_fatal_error(_("scolumn must be of type double"));
+
+		db_free_column(column);
+		column = NULL;
+	    }
+	    else {
+		/* create stats column */
+		/* db_add_column() exists but is not implemented,
+		 * see lib/db/stubs/add_col.c */
+		sprintf(buf, "alter table %s add column %s double",
+				AFi->table, stats_column_opt->answer);
+		db_set_string(&stmt, buf);
+		if (db_execute_immediate(Adriver, &stmt) != DB_OK)
+		    G_fatal_error(_("Unable to add column <%s>"),
+				  stats_column_opt->answer);
+	    }
+	}
+    }
+    else
+	AFi = NULL;
+
+    Pdriver = NULL;
+    if (method_opt->answer) {
+
+	G_verbose_message(_("collecting attributes from points vector..."));
+
+	PFi = Vect_get_field(&PIn, point_field);
+	if (PFi == NULL)
+	    G_fatal_error(_("Database connection not defined for layer %d"),
+			  point_field);
+
+	Pdriver = db_start_driver_open_database(PFi->driver, PFi->database);
+	if (Pdriver == NULL)
+	    G_fatal_error(_("Unable to open database <%s> with driver <%s>"),
+			  PFi->database, PFi->driver);
+
+	/* check if point column exists */
+	db_get_column(Pdriver, PFi->table, point_column_opt->answer, &column);
+	if (column) {
+	    db_free_column(column);
+	    column = NULL;
+	}
+	else {
+	    G_fatal_error(_("Column <%s> not found in table <%s>"),
+			  point_column_opt->answer, PFi->table);
+	}
+
+	/* Check column type */
+	ctype =
+	    db_column_Ctype(Pdriver, PFi->table, point_column_opt->answer);
+
+	if (ctype == DB_C_TYPE_INT)
+	    half = menu[method].half;
+	else if (ctype == DB_C_TYPE_DOUBLE)
+	    half = 0;
+	else
+	    G_fatal_error(_("column for points vector must be numeric"));
+
+	db_CatValArray_init(&cvarr);
+	nrec = db_select_CatValArray(Pdriver, PFi->table, PFi->key,
+				     point_column_opt->answer, NULL, &cvarr);
+	G_debug(1, "selected values = %d", nrec);
+	db_close_database_shutdown_driver(Pdriver);
+    }
+
+    Points = Vect_new_line_struct();
+    ACats = Vect_new_cats_struct();
+    PCats = Vect_new_cats_struct();
+    List = Vect_new_list();
+
+    /* Allocate space ( may be more than needed (duplicate cats and elements without cats) ) */
+    if ((nareas = Vect_get_num_areas(&AIn)) <= 0)
+	G_fatal_error("No areas in area input vector");
+
+    nacatsalloc = nareas;
+    Area_cat = (AREA_CAT *) G_calloc(nacatsalloc, sizeof(AREA_CAT));
+
+    /* Read all cats from 'area' */
+    nacats = 0;
+    for (area = 1; area <= nareas; area++) {
+
+	Vect_get_area_cats(&AIn, area, ACats);
+
+	if (ACats->n_cats <= 0)
+	    continue;
+	for (i = 0; i < ACats->n_cats; i++) {
+
+	    if (ACats->field[i] == area_field) {
+		Area_cat[nacats].area_cat = ACats->cat[i];
+		Area_cat[nacats].count = 0;
+		Area_cat[nacats].nvalues = 0;
+		Area_cat[nacats].nalloc = 0;
+		nacats++;
+		if (nacats >= nacatsalloc) {
+		    nacatsalloc += 100;
+		    Area_cat =
+			(AREA_CAT *) G_realloc(Area_cat,
+					       nacatsalloc *
+					       sizeof(AREA_CAT));
+		}
+	    }
+
+	}
+    }
+
+    G_debug(1, "%d cats loaded from vector (including duplicates)", nacats);
+
+    /* Sort by category */
+    qsort((void *)Area_cat, nacats, sizeof(AREA_CAT), cmp_area);
+
+    /* remove duplicate categories */
+    for (i = 1; i < nacats; i++) {
+	if (Area_cat[i].area_cat == Area_cat[i - 1].area_cat) {
+	    for (j = i; j < nacats - 1; j++) {
+		Area_cat[j].area_cat = Area_cat[j + 1].area_cat;
+	    }
+	    nacats--;
+	}
+    }
+
+    G_debug(1, "%d cats loaded from vector (unique)", nacats);
+
+    /* Go through all areas in area vector and find points in points vector
+     * falling into the area */
+    npvalcatsalloc = 10;
+    npvalcats = 0;
+    pvalcats =
+	(struct pvalcat *)G_calloc(npvalcatsalloc, sizeof(struct pvalcat));
+
+    /* remove for GRASS 7 */
+    G_verbose_message(_("creating spatial index"));
+    Vect_build_spatial_index(&PIn);
+
+    G_message(_("Selecting points for each area..."));
+    count = 0;
+    for (area = 1; area <= nareas; area++) {
+	dbCatVal *catval;
+
+	G_debug(3, "area = %d", area);
+	G_percent(area, nareas, 2);
+
+	Vect_get_area_cats(&AIn, area, ACats);
+
+	if (ACats->n_cats <= 0)
+	    continue;
+
+	/* select points by box */
+	Vect_get_area_box(&AIn, area, &box);
+	box.T = PORT_DOUBLE_MAX;
+	box.B = -PORT_DOUBLE_MAX;
+
+	Vect_select_lines_by_box(&PIn, &box, point_type, List);
+	G_debug(4, "%d points selected by box", List->n_values);
+
+	/* For each point in box check if it is in the area */
+	for (i = 0; i < List->n_values; i++) {
+
+	    pline = List->value[i];
+	    G_debug(4, "%d: point %d", i, pline);
+
+	    ptype = Vect_read_line(&PIn, Points, PCats, pline);
+	    if (!(ptype & point_type))
+		continue;
+
+	    /* point in area */
+	    if (Vect_point_in_area(&AIn, area, Points->x[0], Points->y[0])) {
+		AREA_CAT *area_info, search_ai;
+
+		int tmp_cat;
+
+		/* stats on point column */
+		if (method_opt->answer) {
+		    npvalcats = 0;
+		    tmp_cat = -1;
+		    for (j = 0; j < PCats->n_cats; j++) {
+			if (PCats->field[j] == point_field) {
+			    if (tmp_cat >= 0)
+				G_debug(3,
+					"More cats found in point layer (point=%d)",
+					pline);
+			    tmp_cat = PCats->cat[j];
+
+			    /* find cat in array */
+			    db_CatValArray_get_value(&cvarr, tmp_cat,
+						     &catval);
+
+			    if (catval) {
+				pvalcats[npvalcats].catno = tmp_cat;
+				switch (cvarr.ctype) {
+				case DB_C_TYPE_INT:
+				    pvalcats[npvalcats].dval = catval->val.i;
+				    npvalcats++;
+				    break;
+
+				case DB_C_TYPE_DOUBLE:
+				    pvalcats[npvalcats].dval = catval->val.d;
+				    npvalcats++;
+				    break;
+				}
+				if (npvalcats >= npvalcatsalloc) {
+				    npvalcatsalloc += 10;
+				    pvalcats =
+					(struct pvalcat *)G_realloc(pvalcats,
+								    npvalcatsalloc
+								    *
+								    sizeof
+								    (struct
+								     pvalcat));
+				}
+			    }
+			}
+		    }
+		}
+
+		/* update count for all area cats of given field */
+		search_ai.area_cat = -1;
+		for (j = 0; j < ACats->n_cats; j++) {
+		    if (ACats->field[j] == area_field) {
+			if (search_ai.area_cat >= 0)
+			    G_debug(3,
+				    "More cats found in area layer (area=%d)",
+				    area);
+			search_ai.area_cat = ACats->cat[j];
+
+			/* find cat in array */
+			area_info =
+			    (AREA_CAT *) bsearch((void *)&search_ai, Area_cat,
+						 nacats, sizeof(AREA_CAT),
+						 cmp_area);
+			if (area_info->area_cat != search_ai.area_cat)
+			    G_fatal_error(_("could not find area category %d"),
+					  search_ai.area_cat);
+
+			/* each point is counted once, also if it has
+			 * more than one category or no category
+			 * OK? */
+			area_info->count++;
+
+			if (method_opt->answer) {
+			    /* ensure enough space */
+			    if (area_info->nvalues + npvalcats >=
+				area_info->nalloc) {
+				if (area_info->nalloc == 0) {
+				    area_info->nalloc = npvalcats + 10;
+				    area_info->values =
+					(double *)G_calloc(area_info->nalloc,
+							   sizeof(double));
+				    area_info->cats =
+					(int *)G_calloc(area_info->nalloc,
+							sizeof(int));
+				}
+				else
+				    area_info->nalloc +=
+					area_info->nvalues + npvalcats + 10;
+				area_info->values =
+				    (double *)G_realloc(area_info->values,
+							area_info->nalloc *
+							sizeof(double));
+				area_info->cats =
+				    (int *)G_realloc(area_info->cats,
+						     area_info->nalloc *
+						     sizeof(int));
+			    }
+			    for (k = 0; k < npvalcats; k++) {
+				area_info->cats[area_info->nvalues] =
+				    pvalcats[k].catno;
+				area_info->values[area_info->nvalues] =
+				    pvalcats[k].dval;
+				area_info->nvalues++;
+			    }
+			}
+		    }
+		}
+		count++;
+	    }
+	}			/* next point in box */
+    }				/* next area */
+
+    G_debug(1, "count = %d", count);
+
+    /* release catval array */
+    if (method_opt->answer)
+	db_CatValArray_free(&cvarr);
+
+    Vect_close(&PIn);
+
+    /* Update table or print to stdout */
+    if (print_flag->answer) {	/* print header */
+	fprintf(stdout, "area_cat%scount", fs);
+	if (method_opt->answer)
+	    fprintf(stdout, "%s%s", fs, menu[method].name);
+	fprintf(stdout, "\n");
+    }
+    else {
+	G_message("Updating attributes for area vector...");
+	update_err = update_ok = 0;
+    }
+    if (Adriver)
+	db_begin_transaction(Adriver);
+
+    for (i = 0; i < nacats; i++) {
+	if (!print_flag->answer)
+	    G_percent(i, nacats, 2);
+
+	result = 0;
+
+	if (Area_cat[i].count > 0 && method_opt->answer) {
+	    /* get stats */
+	    statsvalue(&result, Area_cat[i].values, Area_cat[i].nvalues,
+			NULL);
+
+	    if (half)
+		result += 0.5;
+	    else if (use_catno)
+		result = Area_cat[i].cats[(int)result];
+	}
+	if (print_flag->answer) {
+	    fprintf(stdout, "%d%s%d", Area_cat[i].area_cat, fs,
+		    Area_cat[i].count);
+	    if (method_opt->answer) {
+		if (Area_cat[i].count > 0)
+		    fprintf(stdout, "%s%.15g", fs, result);
+		else
+		    fprintf(stdout, "%snull", fs);
+	    }
+	    fprintf(stdout, "\n");
+	}
+	else {
+	    sprintf(buf, "update %s set %s = %d", AFi->table,
+		    count_column_opt->answer, Area_cat[i].count);
+	    db_set_string(&stmt, buf);
+	    if (method_opt->answer) {
+		if (Area_cat[i].count > 0)
+		    sprintf(buf, " , %s = %.15g", stats_column_opt->answer,
+			    result);
+		else
+		    sprintf(buf, " , %s = null", stats_column_opt->answer);
+		db_append_string(&stmt, buf);
+	    }
+	    sprintf(buf, " where %s = %d", AFi->key, Area_cat[i].area_cat);
+	    db_append_string(&stmt, buf);
+	    G_debug(2, "SQL: %s", db_get_string(&stmt));
+	    if (db_execute_immediate(Adriver, &stmt) == DB_OK) {
+		update_ok++;
+	    }
+	    else {
+		update_err++;
+	    }
+
+	}
+    }
+    if (Adriver)
+	db_commit_transaction(Adriver);
+
+    if (!print_flag->answer) {
+	G_percent(nacats, nacats, 2);
+	db_close_database_shutdown_driver(Adriver);
+	db_free_string(&stmt);
+	G_message(_("%d records updated"), update_ok);
+	if (update_err > 0)
+	    G_message(_("%d update errors"), update_err);
+
+	Vect_set_db_updated(&AIn);
+    }
+
+    Vect_close(&AIn);
+
+    G_done_msg(" ");
+
+    exit(EXIT_SUCCESS);
+}

-- 
Geographic Resources Analysis Support System



More information about the Pkg-grass-devel mailing list