--- dogtail/Makefile.orig	2007-11-29 13:37:05.613003000 +0900
+++ dogtail/Makefile	2007-11-29 13:40:08.824043000 +0900
@@ -1,9 +1,17 @@
 # dogtail *development* Makefile
 
+SUBDIRS = po recorder sniff
+
 all:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  (cd $$subdir && $(MAKE) all) \
+	done; \
 	python setup.py build_ext --inplace
 
 install:
+	list='$(SUBDIRS)'; for subdir in $$list; do \
+	  (cd $$subdir && $(MAKE) DESTDIR=$(DESTDIR) install) \
+	done; \
 	python setup.py install
 
 clean:
--- dogtail/configure.in.orig	1970-01-01 09:00:00.000000000 +0900
+++ dogtail/configure.in	2007-11-29 13:39:55.053565000 +0900
@@ -0,0 +1,21 @@
+AC_INIT([dogtail], [0.6.1],
+        [http://bugzilla.gnome.org/enter_bug.cgi?product=dogtail])
+AM_INIT_AUTOMAKE
+
+IT_PROG_INTLTOOL([0.35.0])
+AC_PROG_LIBTOOL
+
+dnl Language Support 
+
+GETTEXT_PACKAGE=dogtail
+AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Define the gettext package to be used])
+AC_SUBST(GETTEXT_PACKAGE)
+
+AM_GLIB_GNU_GETTEXT
+
+AC_OUTPUT([
+po/Makefile.in
+recorder/Makefile
+sniff/Makefile
+])
+
--- dogtail/dogtail.spec.orig	2007-11-29 13:38:57.778459000 +0900
+++ dogtail/dogtail.spec	2007-11-29 13:39:55.057723000 +0900
@@ -1,15 +1,20 @@
 Summary: GUI test tool and automation framework
 Name: dogtail
 Version: 0.6.2
-Release: 1%{?dist}
+Release: 2%{?dist}
 License: GPL
 Group: User Interface/X
 URL: http://people.redhat.com/zcerza/dogtail/
 Source0: http://people.redhat.com/zcerza/dogtail/releases/dogtail-%{version}.tar.gz
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildArch: noarch
-BuildRequires: python
+BuildRequires: autoconf
+BuildRequires: automake
 BuildRequires: desktop-file-utils
+BuildRequires: glib2-devel
+BuildRequires: intltool >= 0.35
+BuildRequires: libtool
+BuildRequires: python
 Requires: pyspi >= 0.6.0
 Requires: pygtk2
 Requires: gnome-python2-gconf
@@ -26,10 +31,18 @@ communicate with desktop applications.
 %setup -q
 
 %build
+libtoolize -f
+intltoolize -c -f --automake
+aclocal
+autoconf
+automake -a -c -f
+./configure --prefix=/usr
+make
 python ./setup.py build
 
 %install
 rm -rf $RPM_BUILD_ROOT
+make DESTDIR=$RPM_BUILD_ROOT install
 python ./setup.py install -O2 --root=$RPM_BUILD_ROOT --record=%{name}.files
 rm -rf $RPM_BUILD_ROOT/%{_docdir}/dogtail
 find examples -type f -exec chmod 0644 \{\} \;
@@ -62,6 +75,9 @@ rm -rf $RPM_BUILD_ROOT
 %doc examples/
 
 %changelog
+* Mon May 13 2007 Takao Fujiwara <takao.fujiwara@sun.com> - 0.6.2-2
+- Add intltoolize.
+
 * Mon Oct 23 2006 Zack Cerza <zcerza@redhat.com> - 0.6.2-1
 - Post-release version bump.
 
--- dogtail/dogtail/config.py.orig	2007-11-28 23:13:01.122548000 +0900
+++ dogtail/dogtail/config.py	2007-11-28 23:57:38.939748000 +0900
@@ -6,6 +6,13 @@ __author__ = "Zack Cerza <zcerza@redhat.
 import os
 import sys
 import locale
+import gettext
+
+GNOMELOCALEDIR="/usr/share/locale"
+
+gettext.bindtextdomain('dogtail')
+gettext.textdomain('dogtail')
+_ = gettext.gettext
 
 def _scriptName():
     return os.path.basename(sys.argv[0]).replace('.py','')
@@ -158,7 +165,7 @@ class _Config(object):
 
     def __setattr__(self, name, value):
         if not config.defaults.has_key(name):
-            raise AttributeError, name + " is not a valid option."
+            raise AttributeError, name + _(" is not a valid option.")
 
         elif _Config.defaults[name] != value or \
                 _Config.options.get(name, _Config.invalidValue) != value:
@@ -182,7 +189,7 @@ class _Config(object):
         try: return _Config.options[name]
         except KeyError:
             try: return _Config.defaults[name]
-            except KeyError: raise AttributeError, name + " is not a valid option."
+            except KeyError: raise AttributeError, name + _(" is not a valid option.")
 
     def __createDir(cls, dirName, perms = None):
         """
@@ -200,12 +207,12 @@ class _Config(object):
                 #print "Not found."
                 #print "Parent %s ..." % parentDirName
                 _Config.__createDir(parentDirName, perms)
-                print "Creating %s ..." % dirName
+                print _("Creating %s ...") % dirName
                 os.mkdir(dirName)
                 if perms: os.chmod(dirName, perms)
             else:
                 #print "Found."
-                print "Creating %s ..." % dirName
+                print _("Creating %s ...") % dirName
                 os.mkdir(dirName)
                 if perms: os.chmod(dirName, perms)
         #else: print "Found."
@@ -231,8 +238,8 @@ if __name__ == '__main__':
     def failOrPass(failure, description):
         if failure:
             anyFailed = True
-            print "FAILED: " + description
-        else: print "PASSED: " + description
+            print _("FAILED: ") + description
+        else: print _("PASSED: ") + description
 
     # BEGIN tests
 
@@ -240,7 +247,7 @@ if __name__ == '__main__':
     for option in config.defaults.keys():
         print failure, getattr(config, option), config.defaults[option]
         failure = failure or not (getattr(config, option) == config.defaults[option])
-    failOrPass(failure, "Reading all default values")
+    failOrPass(failure, _("Reading all default values"))
 
     failure = True
     failure = config.ensureSensitivity != config.defaults['ensureSensitivity']
@@ -248,13 +255,13 @@ if __name__ == '__main__':
     failure = failure or config.ensureSensitivity == True
     config.ensureSensitivity = True
     failure = failure or config.ensureSensitivity != True
-    failOrPass(failure, "Setting ensureSensitivity")
+    failOrPass(failure, _("Setting ensureSensitivity"))
 
     failure = True
     failure = not os.path.isdir(config.defaults['scratchDir'])
     failure = failure or not os.path.isdir(config.defaults['logDir'])
     failure = failure or not os.path.isdir(config.defaults['dataDir'])
-    failOrPass(failure, "Looking for default directories")
+    failOrPass(failure, _("Looking for default directories"))
 
     failure = True
     config.scratchDir = '/tmp/dt'
@@ -263,7 +270,7 @@ if __name__ == '__main__':
     failure = failure or not os.path.isdir('/tmp/dt_log/')
     config.dataDir = '/tmp/dt_data'
     failure = failure or not os.path.isdir('/tmp/dt_data')
-    failOrPass(failure, "Changing default directories")
+    failOrPass(failure, _("Changing default directories"))
 
     failure = True
     config.useIconLogger = True
@@ -272,7 +279,7 @@ if __name__ == '__main__':
         if isinstance(logging.debugLogger.iconLogger, logging.IconLogger):
             failure = False
     except AttributeError: pass
-    failOrPass(failure, "Setting useIconLogger")
+    failOrPass(failure, _("Setting useIconLogger"))
 
     # END tests
 
--- dogtail/dogtail/distro.py.orig	2007-11-28 23:12:55.869978000 +0900
+++ dogtail/dogtail/distro.py	2007-11-29 00:51:57.139558000 +0900
@@ -3,6 +3,7 @@
 Authors: Dave Malcolm <dmalcolm@redhat.com>, Zack Cerza <zcerza@redhat.com>"""
 __author__ = "Dave Malcolm <dmalcolm@redhat.com>, Zack Cerza <zcerza@redhat.com>"
 
+from config import _
 import os
 import re
 from version import Version
@@ -15,7 +16,7 @@ class DistributionNotSupportedError(Exce
     Arguments:
             distro: the distribution that is not supported.
     """
-    PATCH_MESSAGE = "Please send patches to dogtail-devel-list@gnome.org"
+    PATCH_MESSAGE = _("Please send patches to ") + 'dogtail-devel-list@gnome.org'
 
     def __init__(self, distro):
         self.distro = distro
@@ -297,40 +298,40 @@ class JHBuild(Distro):
     def __init__(self):
         self.packageDb = JhBuildPackageDb()
 
-message = "Detecting distribution: "
+message = _("Detecting distribution: ")
 if os.environ.get("CERTIFIED_GNOMIE", "no") == "yes":
-    logger.log(message + "JHBuild environment")
+    logger.log(message + _("JHBuild environment"))
     distro = JHBuild()
 elif os.path.exists ("/etc/SuSE-release"):
-    logger.log(message + "SuSE (or derived distribution)")
+    logger.log(message + _("SuSE (or derived distribution)"))
     distro = Suse()
 elif os.path.exists ("/etc/fedora-release"):
-    logger.log(message + "Fedora (or derived distribution)")
+    logger.log(message + _("Fedora (or derived distribution)"))
     distro = RedHatOrFedora()
 elif os.path.exists ("/etc/redhat-release"):
-    logger.log(message + "Red Hat/Fedora/derived distribution")
+    logger.log(message + _("Red Hat/Fedora/derived distribution"))
     distro = RedHatOrFedora()
 elif os.path.exists ("/usr/share/doc/ubuntu-minimal"):
-    logger.log(message + "Ubuntu (or derived distribution)")
+    logger.log(message + _("Ubuntu (or derived distribution)"))
     distro = Ubuntu()
 elif os.path.exists ("/etc/debian_version"):
-    logger.log(message + "Debian (or derived distribution)")
+    logger.log(message + _("Debian (or derived distribution)"))
     distro = Debian()
 elif os.path.exists ("/etc/gentoo-release"):
-    logger.log(message + "Gentoo (or derived distribution)")
+    logger.log(message + _("Gentoo (or derived distribution)"))
     distro = Gentoo()
 elif os.path.exists ("/etc/slackware-version"):
-    logger.log(message + "Slackware")
+    logger.log(message + _("Slackware"))
     raise DistributionNotSupportedError("Slackware")
 elif os.path.exists ("/var/lib/conarydb/conarydb"):
-    logger.log(message + "Conary-based distribution")
+    logger.log(message + _("Conary-based distribution"))
     distro = Conary()
 elif os.path.exists ("/etc/release") and \
         re.match (".*Solaris", open ("/etc/release").readline()):
-    print "Solaris distribution"
+    print _("Solaris distribution")
     distro = Solaris()
 else:
-    logger.log(message + "Unknown")
-    raise DistributionNotSupportedError("Unknown")
+    logger.log(message + _("Unknown"))
+    raise DistributionNotSupportedError(_("Unknown"))
 
 packageDb = distro.packageDb
--- dogtail/dogtail/errors.py.orig	2007-11-28 23:13:16.766857000 +0900
+++ dogtail/dogtail/errors.py	2007-11-29 13:52:26.143274000 +0900
@@ -3,6 +3,7 @@
 General exceptions; not overly module-specific
 """
 __author__ = "Zack Cerza <zcerza@redhat.com>"
+from config import _
 from logging import debugLogger as logger
 
 import inspect
@@ -11,7 +12,7 @@ def warn(message, caller = True):
     Generate a warning, and pass it to the debug logger.
     """
     frameRec = inspect.stack()[-1]
-    message = "Warning: %s:%s: %s" % (frameRec[1], frameRec[2], message)
+    message = _("Warning: %s:%s: %s") % (frameRec[1], frameRec[2], message)
     if caller and frameRec[1] != '<stdin>' and frameRec[1] != '<string>': 
         message = message + ':\n  ' + frameRec[4][0]
     del frameRec
--- dogtail/dogtail/i18n.py.orig	2007-11-28 23:13:21.824026000 +0900
+++ dogtail/dogtail/i18n.py	2007-11-29 13:52:51.755193000 +0900
@@ -13,6 +13,7 @@ import config
 import os
 import re
 import gettext
+from config import _
 
 from logging import debugLogger as logger
 
@@ -109,7 +110,7 @@ def translate(srcString):
     # No translations found:
     if len(results)==0:
         if config.config.debugTranslation:
-            logger.log('Translation not found for "%s"'%srcString)
+            logger.log(_("Translation not found for '%s'") % srcString)
     return results.keys()
 
 class TranslatableString:
@@ -246,7 +247,7 @@ def loadTranslationsFromPackageMoFiles(p
                     if config.config.debugTranslation:
                         #import traceback
                         #logger.log(traceback.format_exc())
-                        logger.log("Warning: Failed to load mo-file for translation: " + moFile)
+                        logger.log(_("Warning: Failed to load mo-file for translation: ") + moFile)
 
     # Hack alert:
     #
--- dogtail/dogtail/logging.py.orig	2007-11-28 23:13:26.482124000 +0900
+++ dogtail/dogtail/logging.py	2007-11-28 23:58:48.864322000 +0900
@@ -14,6 +14,7 @@ import sys
 import time
 import datetime
 from config import config
+from config import _
 import codecs
 
 # Timestamp class for file logs
@@ -96,7 +97,7 @@ class IconLogger:
             iconPath = '/usr/share/icons/hicolor/48x48/apps/' + iconName
             if os.path.exists(iconPath):
                 IconLogger.trayicon.set_icon(iconPath)
-            self.message('dogtail running...')
+            self.message(_("dogtail running..."))
 
     def message(self, msg):
         """
@@ -151,17 +152,17 @@ class Logger:
                 i += 1
         else:
             # If path doesn't exist, raise an exception
-            raise IOError, "Log path %s does not exist or is not a directory" % logDir
+            raise IOError, _("Log path %s does not exist or is not a directory") % logDir
 
         # Try to create the file and write the header info
         try:
-            print "Creating logfile at %s ..." % self.fileName
+            print _("Creating logfile at %s ...") % self.fileName
             self.file = codecs.open(self.fileName, mode = 'wb', encoding = 'utf-8')
             self.file.write("##### " + os.path.basename(self.fileName) + '\n')
             self.file.flush()
             #self.file.close()
         except IOError:
-            print "Could not create and write to " + self.fileName
+            print _("Could not create and write to ") + self.fileName
             self.file = False
 
     def log(self, message):
@@ -186,7 +187,7 @@ class Logger:
             self.file.flush()
             #self.file.close()
         except IOError:
-            print "Could not write to file " + self.fileName
+            print _("Could not write to file ") + self.fileName
 
 class ResultsLogger(Logger):
     """
@@ -213,7 +214,7 @@ class ResultsLogger(Logger):
             entry = str(key) + ":      " + str(value)
         else:
             raise ValueError, entry
-            print "Method argument requires a 1 {key: value} dict. Supplied argument not one {key: value}"
+            print _("Method argument requires a 1 {key: value} dict. Supplied argument not one {key: value}")
 
         Logger.log(self, self.stamper.entryStamp() + "      " + entry)
 
--- dogtail/dogtail/path.py.orig	2007-11-28 23:12:25.371447000 +0900
+++ dogtail/dogtail/path.py	2007-11-29 13:41:15.603639000 +0900
@@ -4,6 +4,8 @@ Author: David Malcolm <dmalcolm@redhat.c
 """
 __author__ = """David Malcolm <dmalcolm@redhat.com>"""
 
+from config import _
+
 class SearchPath:
     """
     Class used by the recording framework (and for more verbose script
@@ -86,10 +88,10 @@ class SearchPath:
 
             if False:
                 print "...................."
-                print "from %s"%self
-                print "to %s"%other
-                print "i=%s"%i
-                print "relative path %s"%result
+                print _("from %s")%self
+                print _("to %s")%other
+                print _("i=%s")%i
+                print _("relative path %s")%result
                 print "...................."
 
             return result
--- dogtail/dogtail/predicate.py.orig	2007-11-28 23:12:50.942087000 +0900
+++ dogtail/dogtail/predicate.py	2007-11-29 13:50:45.597832000 +0900
@@ -3,6 +3,7 @@
 Author: David Malcolm <dmalcolm@redhat.com>"""
 __author__ = 'David Malcolm <dmalcolm@redhat.com>'
 
+from config import _
 import unittest
 
 from i18n import TranslatableString
@@ -16,7 +17,7 @@ def makeScriptRecursiveArgument(isRecurs
     if isRecursive==defaultValue:
         return ""
     else:
-        return ", recursive=%s"%isRecursive
+        return _(", recursive=%s")%isRecursive
 
 def makeCamel(string):
     """
@@ -96,7 +97,7 @@ class IsAnApplicationNamed(Predicate):
         return node.roleName=='application' and stringMatches(self.appName, node.name)
 
     def describeSearchResult(self):
-        return '%s application'%self.appName
+        return _("%s application")%self.appName
 
     def makeScriptMethodCall(self, isRecursive):
         # ignores the isRecursive parameter
@@ -124,15 +125,15 @@ class GenericPredicate(Predicate):
             self.debugName = debugName
         else:
             if label:
-                self.debugName = "labelled '%s'"%self.label
+                self.debugName = _("labelled '%s'")%self.label
             else:
-                self.debugName = "child with"
+                self.debugName = _("child with")
             if name:
-                self.debugName += " name=%s" % self.name
+                self.debugName += _(" name=%s") % self.name
             if roleName:
-                self.debugName += " roleName='%s'"%roleName
+                self.debugName += _(" roleName='%s'")%roleName
             if description:
-                self.debugName += " description='%s'"%description
+                self.debugName += _(" description='%s'")%description
         assert self.debugName
 
 
@@ -193,7 +194,7 @@ class IsNamed(Predicate):
         return stringMatches(self.name, node.name)
 
     def describeSearchResult(self):
-        return "named %s"%self.name
+        return _("named %s")%self.name
 
     def makeScriptMethodCall(self, isRecursive):
         return "child(name=%s%s)"%(self.name, makeScriptRecursiveArgument(isRecursive, True))
@@ -210,7 +211,7 @@ class IsAWindowNamed(Predicate):
         return node.roleName=='frame' and stringMatches(self.windowName, node.name)
 
     def describeSearchResult(self):
-        return "%s window"%self.windowName
+        return _("%s window")%self.windowName
 
     def makeScriptMethodCall(self, isRecursive):
         return "window(%s%s)"%(self.windowName, makeScriptRecursiveArgument(isRecursive, False))
@@ -224,7 +225,7 @@ class IsAWindow(Predicate):
         return node.roleName=='frame'
 
     def describeSearchResult(self):
-        return "window"
+        return _("window")
 
 class IsADialogNamed(Predicate):
     """Predicate subclass that looks for a top-level dialog by name"""
@@ -236,7 +237,7 @@ class IsADialogNamed(Predicate):
         return node.roleName=='dialog' and stringMatches(self.dialogName, node.name)
 
     def describeSearchResult(self):
-        return '%s dialog'%self.dialogName
+        return _("%s dialog")%self.dialogName
 
     def makeScriptMethodCall(self, isRecursive):
         return "dialog(%s%s)"%(self.dialogName, makeScriptRecursiveArgument(isRecursive, False))
@@ -261,7 +262,7 @@ class IsLabelledAs(Predicate):
         else: return False
 
     def describeSearchResult(self):
-        return 'labelled %s'%self.labelText
+        return _("labelled %s")%self.labelText
 
     def makeScriptMethodCall(self, isRecursive):
         return "child(label=%s%s)"%(self.labelText, makeScriptRecursiveArgument(isRecursive, True))
@@ -279,7 +280,7 @@ class IsAMenuNamed(Predicate):
         return node.roleName=='menu' and stringMatches(self.menuName, node.name)
 
     def describeSearchResult(self):
-        return '%s menu'%(self.menuName)
+        return _("%s menu")%(self.menuName)
 
     def makeScriptMethodCall(self, isRecursive):
         return "menu(%s%s)"%(self.menuName, makeScriptRecursiveArgument(isRecursive, True))
@@ -298,7 +299,7 @@ class IsAMenuItemNamed(Predicate):
         return (roleName=='menu item' or roleName=='check menu item' or roleName=='radio menu item') and stringMatches(self.menuItemName, node.name)
 
     def describeSearchResult(self):
-        return '%s menuitem'%(self.menuItemName)
+        return _("%s menuitem")%(self.menuItemName)
 
     def makeScriptMethodCall(self, isRecursive):
         return "menuItem(%s%s)"%(self.menuItemName, makeScriptRecursiveArgument(isRecursive, True))
@@ -316,7 +317,7 @@ class IsATextEntryNamed(Predicate):
         return node.roleName=='text' and stringMatches(self.textEntryName, node.name)
 
     def describeSearchResult(self):
-        return '%s textentry'%(self.textEntryName)
+        return _("%s textentry")%(self.textEntryName)
 
     def makeScriptMethodCall(self, isRecursive):
         return "textentry(%s%s)"%(self.textEntryName, makeScriptRecursiveArgument(isRecursive, True))
@@ -334,7 +335,7 @@ class IsAButtonNamed(Predicate):
         return node.roleName=='push button' and stringMatches(self.buttonName, node.name)
 
     def describeSearchResult(self):
-        return '%s button'%(self.buttonName)
+        return _("%s button")%(self.buttonName)
 
     def makeScriptMethodCall(self, isRecursive):
         return "button(%s%s)"%(self.buttonName, makeScriptRecursiveArgument(isRecursive, True))
@@ -352,7 +353,7 @@ class IsATabNamed(Predicate):
         return node.roleName=='page tab' and stringMatches(self.tabName, node.name)
 
     def describeSearchResult(self):
-        return '%s tab'%(self.tabName)
+        return _("%s tab")%(self.tabName)
 
     def makeScriptMethodCall(self, isRecursive):
         return "tab(%s%s)"%(self.tabName, makeScriptRecursiveArgument(isRecursive, True))
--- dogtail/dogtail/procedural.py.orig	2007-11-28 23:12:41.946058000 +0900
+++ dogtail/dogtail/procedural.py	2007-11-29 13:24:07.146505000 +0900
@@ -18,6 +18,7 @@ __author__ = 'Zack Cerza <zcerza@redhat.
 import tree
 from predicate import GenericPredicate, IsADialogNamed, IsAnApplicationNamed
 from config import config
+from config import _
 import rawinput
 from time import sleep
 
@@ -28,10 +29,10 @@ class FocusError(Exception):
 import errors
 def focusFailed(type, name):
     if type is None or type == '':
-        type = "widget"
-    errors.warn('The requested %s \'%s\' could not be focused.' % (type, name))
+        type = _("widget")
+    errors.warn(_("The requested %s \'%s\' could not be focused.") % (type, name))
 
-ENOARGS = "At least one argument is needed"
+ENOARGS = _("At least one argument is needed")
 
 class FocusBase:
     """
@@ -69,7 +70,7 @@ class FocusApplication (FocusBase):
         except tree.SearchError, desc:
             if config.fatalErrors: raise FocusError, name
             else:
-                focusFailed('Application', name)
+                focusFailed(_("Application"), name)
                 return False
         if app: 
             FocusApplication.node = app
@@ -102,7 +103,7 @@ class FocusDialog (FocusBase):
         else: 
             if config.fatalErrors: raise FocusError, predicate.debugName
             else:
-                focusFailed('Dialog', name)
+                focusFailed(_("Dialog"), name)
                 return False
         return True
 
--- dogtail/dogtail/rawinput.py.orig	2007-11-28 23:13:11.157393000 +0900
+++ dogtail/dogtail/rawinput.py	2007-11-29 13:52:04.486558000 +0900
@@ -14,6 +14,7 @@ import atspi
 import gtk.keysyms
 import gtk.gdk
 from config import config
+from config import _
 from utils import doDelay
 from logging import debugLogger as logger
 ev = atspi.EventGenerator()
@@ -25,7 +26,7 @@ def click (x, y, button = 1):
     """
     Synthesize a mouse button click at (x,y)
     """
-    logger.log("Mouse button %s click at (%s,%s)"%(button,x,y))
+    logger.log(_("Mouse button %s click at (%s,%s)")%(button,x,y))
     ev.click(x, y, button)
     doDelay()
 
@@ -33,7 +34,7 @@ def doubleClick (x, y, button = 1):
     """
     Synthesize a mouse button double-click at (x,y)
     """
-    logger.log("Mouse button %s doubleclick at (%s,%s)"%(button,x,y))
+    logger.log(_("Mouse button %s doubleclick at (%s,%s)")%(button,x,y))
     ev.doubleClick(x,y,button)
     doDelay()
 
@@ -41,7 +42,7 @@ def press (x, y, button = 1):
     """
     Synthesize a mouse button press at (x,y)
     """
-    logger.log("Mouse button %s press at (%s,%s)"%(button,x,y))
+    logger.log(_("Mouse button %s press at (%s,%s)")%(button,x,y))
     ev.press(x,y, button)
     doDelay()
 
@@ -49,7 +50,7 @@ def release (x, y, button = 1):
     """
     Synthesize a mouse button release at (x,y)
     """
-    logger.log("Mouse button %s release at (%s,%s)"%(button,x,y))
+    logger.log(_("Mouse button %s release at (%s,%s)")%(button,x,y))
     ev.release(x,y,button)
     doDelay()
 
@@ -57,12 +58,12 @@ def absoluteMotion (x, y):
     """
     Synthesize mouse absolute motion to (x,y)
     """
-    logger.log("Mouse absolute motion to (%s,%s)"%(x,y))
+    logger.log(_("Mouse absolute motion to (%s,%s)")%(x,y))
     ev.absoluteMotion(x,y)
     doDelay()
 
 def relativeMotion (x, y):
-    logger.log("Mouse relative motion of (%s,%s)"%(x,y))
+    logger.log(_("Mouse relative motion of (%s,%s)")%(x,y))
     ev.relativeMotion(x,y)
     doDelay()
 
@@ -71,7 +72,7 @@ def drag(fromXY, toXY, button = 1):
     Synthesize a mouse press, drag, and release on the screen.
     Wraps atspi.EventGenerator.drag, but with logging and delays.
     """
-    logger.log("Mouse button %s drag from %s to %s"%(button, fromXY, toXY))
+    logger.log(_("Mouse button %s drag from %s to %s")%(button, fromXY, toXY))
 
     # A direct call to ev.drag doesn't work, delays seem to be needed
     # for nautilus icon view to work, at least:
@@ -181,7 +182,7 @@ def keyCombo(comboString):
                     strings.append(S)
     for s in strings:
         if not keySyms.has_key(s):
-            raise ValueError, "Cannot find key %s" % s
+            raise ValueError, _("Cannot find key %s") % s
 
     ev.generateKeyCombo(strings)
     doDelay()
--- dogtail/dogtail/tc.py.orig	2007-11-28 23:13:06.253844000 +0900
+++ dogtail/dogtail/tc.py	2007-11-29 13:51:45.936614000 +0900
@@ -12,6 +12,7 @@ import time
 import datetime
 import os.path
 from config import config
+from config import _
 from logging import ResultsLogger, TimeStamp, debugLogger
 from errors import DependencyNotFoundError
 
@@ -54,16 +55,16 @@ class TC:
             self.undertest = (self.undertest).encode(self.encoding)
             # Compare the strings
             if self.baseline == self.undertest:
-                self.result = {self.label: "Passed"}
+                self.result = {self.label: _("Passed")}
             else:
-                self.result = {self.label: "Failed - " + self.encoding + " strings do not match. " + self.baseline + " expected: Got " + self.undertest}
+                self.result = {self.label: _("Failed - ") + self.encoding + _(" strings do not match. ") + self.baseline + _(" expected; Got ") + self.undertest}
             # Pass the test result to the ResultsLogger for writing
             TC.logger.log(self.result)
             return self.result
 
         else:
             # We should probably raise an exception here
-            self.result = {self.label: "ERROR - " + self.encoding + " is not a supported encoding type"}
+            self.result = {self.label: _("ERROR - ") + self.encoding + _(" is not a supported encoding type")}
             TC.logger.log(self.result)
             return self.result
 
@@ -138,10 +139,10 @@ determining pass/fail criteria.
                 # os.popen returns a list; if it is empty then we have passed
                 answer = os.popen(cmd).readlines()
                 if answer == []:
-                    self.result = {self.label: "Passed - Images are the same size"}
+                    self.result = {self.label: _("Passed - Images are the same size")}
                 else:
                     fanswer = answer[0].strip()
-                    self.result = {self.label: "Failed - " + fanswer}
+                    self.result = {self.label: _("Failed - ") + fanswer}
                 TC.logger.log(self.result)
                 return self.result
             else: # otherwise run the metric code
@@ -159,7 +160,7 @@ determining pass/fail criteria.
                 if IMVersion >= '6.2.4' and len(answer) != 1: metricFailed = False
                 if metricFailed:
                     fanswer = answer[0]
-                    self.result = {self.label: "Failed - " + fanswer}
+                    self.result = {self.label: _("Failed - ") + fanswer}
                 else: # grab the metric from answer and convert it to a number
                     fanswer = answer[0].strip()
                     fanswer = fanswer.split(" ")
@@ -167,13 +168,13 @@ determining pass/fail criteria.
                     fanswer = float(fanswer)
 
                     if fanswer == float("inf"): #same under PSNR returns inf dB:
-                        self.result = {self.label: "Passed - " + "compare results: " + str(fanswer) + " dB"}
+                        self.result = {self.label: _("Passed - ") + _("compare results: ") + str(fanswer) + _(" dB")}
                     elif fanswer > self.threshold:
                         excess = fanswer - self.threshold
-                        self.result = {self.label: "Failed - " + "compare result exceeds threshold by: " + str(excess) + " dB"}
+                        self.result = {self.label: _("Failed - ") + _("compare result exceeds threshold by: ") + str(excess) + _(" dB")}
                     else:
                         under = self.threshold - fanswer
-                        self.result = {self.label: "Passed - " + "compare results under threshold by: " + str(under) + " dB"}
+                        self.result = {self.label: _("Passed - ") + _("compare results under threshold by: ") + str(under) + _(" dB")}
                 TC.logger.log(self.result)
                 return self.result
 
@@ -182,10 +183,10 @@ determining pass/fail criteria.
                 try:
                     os.remove(self.dfile)
                 except IOError:
-                    debugLogger.log("Could not delete tempfile " + self.dfile)
+                    debugLogger.log(_("Could not delete tempfile ") + self.dfile)
 
         else: # unsupported metric given
-            self.result = {self.label: "Failed - " + self.metric + " is not in the list of supported metrics"}
+            self.result = {self.label: _("Failed - ") + self.metric + _(" is not in the list of supported metrics")}
             TC.logger.log(self.result)
             return self.result
 
@@ -228,13 +229,13 @@ class TCNumber(TC):
 
             #compare
             if self.baseline == self.undertest:
-                self.result = {self.label: "Passed - numbers are the same"}
+                self.result = {self.label: _("Passed - numbers are the same")}
             else:
-                self.result = {self.label: "Failed - " + str(self.baseline) + " expected: Got " + str(self.undertest)}
+                self.result = {self.label: _("Failed - ") + str(self.baseline) + _(" expected; Got ") + str(self.undertest)}
             TC.logger.log(self.result)
             return self.result
         else:
-            self.result = {self.label: "Failed - " + self.type + " is not in list of supported types"}
+            self.result = {self.label: _("Failed - ") + self.type + _(" is not in list of supported types")}
             TC.logger.log(self.result)
             return self.result
 
--- dogtail/dogtail/tree.py.orig	2007-11-29 00:48:53.778151000 +0900
+++ dogtail/dogtail/tree.py	2007-11-29 00:49:57.642930000 +0900
@@ -60,6 +60,8 @@ __author__ = """Zack Cerza <zcerza@redha
 David Malcolm <dmalcolm@redhat.com>
 """
 
+from config import _
+
 from utils import checkForA11y
 checkForA11y()
 
@@ -79,7 +81,7 @@ try:
     import atspi
 except ImportError:
     # If atspi can't be imported, fail.
-    raise ImportError, "Error importing the AT-SPI bindings"
+    raise ImportError, _("Error importing the AT-SPI bindings")
 
 # We optionally import the bindings for libwnck.
 try:
@@ -99,7 +101,7 @@ class ReadOnlyError(TypeError):
     """
     This attribute is not writeable.
     """
-    message = "Cannot set %s. It is read-only."
+    message = _("Cannot set %s. It is read-only.")
     def __init__(self, attr):
         self.attr = attr
 
@@ -110,7 +112,7 @@ class NotSensitiveError(Exception):
     """
     The widget is not sensitive.
     """
-    message = "Cannot %s %s. It is not sensitive."
+    message = _("Cannot %s %s. It is not sensitive.")
     def __init__(self, action):
         self.action = action
 
@@ -121,7 +123,7 @@ class ActionNotSupported(Exception):
     """
     The widget does not support the requested action.
     """
-    message = "Cannot do '%s' action on %s"
+    message = _("Cannot do '%s' action on %s")
     def __init__(self, actionName, node):
         self.actionName = actionName
         self.node = node
@@ -163,7 +165,7 @@ class Action:
         """
         Plain-text representation of the Action.
         """
-        string = "Action node='%s' name='%s' description='%s' keybinding='%s'" % (self.node, self.name, self.description, self.keyBinding)
+        string = _("Action node='%s' name='%s' description='%s' keybinding='%s'") % (self.node, self.name, self.description, self.keyBinding)
         return string
 
     def do (self):
@@ -171,13 +173,13 @@ class Action:
         Performs the given tree.Action, with appropriate delays and logging.
         """
         assert isinstance(self, Action)
-        logger.log("%s on %s"%(self.name, self.node.getLogString()))
+        logger.log(_("%s on %s")%(self.name, self.node.getLogString()))
         if not self.node.sensitive:
             if config.ensureSensitivity:
                 raise NotSensitiveError, self
             else:
                 nSE = NotSensitiveError(self)
-                logger.log("Warning: " + str(nSE))
+                logger.log(_("Warning: ") + str(nSE))
         if config.blinkOnActions: self.node.blink()
         result = self.__action.doAction (self.__index)
         doDelay()
@@ -320,7 +322,7 @@ class Node:
             self.__accessible = initializer.__accessible
             self.debugName = getattr(initializer, 'debugName', None)
         else:
-            raise "Unknown Node initializer"
+            raise _("Unknown Node initializer")
         assert self.__accessible
 
         # Swallow the Action object, if it exists
@@ -360,7 +362,7 @@ class Node:
                 clickX = position[0] + 0.5 * size[0]
                 clickY = position[1] + 0.5 * size[1]
                 if config.debugSearching:
-                    logger.log("raw click on %s %s at (%s,%s)"%(self.name, self.getLogString(), str(clickX), str(clickY)))
+                    logger.log(_("raw click on %s %s at (%s,%s)")%(self.name, self.getLogString(), str(clickX), str(clickY)))
                 rawinput.click(clickX, clickY, button)
             self.rawClick = rawClick
 
@@ -468,7 +470,7 @@ class Node:
             if childCount > config.childrenLimit:
                 global haveWarnedAboutChildrenLimit
                 if not haveWarnedAboutChildrenLimit:
-                    logger.log("Only returning %s children. You may change config.childrenLimit if you wish. This message will only be printed once." % str(config.childrenLimit))
+                    logger.log(_("Only returning %s children. You may change config.childrenLimit if you wish. This message will only be printed once.") % str(config.childrenLimit))
                     haveWarnedAboutChildrenLimit = True
                 childCount = config.childrenLimit
             for i in xrange (childCount):
@@ -609,7 +611,7 @@ class Node:
             """
             if not self.__editableText:
                 raise ReadOnlyError, attr
-            if config.debugSearching: logger.log("Setting text of %s to '%s'"%(self.getLogString(), value))
+            if config.debugSearching: logger.log(_("Setting text of %s to '%s'")%(self.getLogString(), value))
             self.__editableText.setTextContents (value)
             doDelay()
 
@@ -625,7 +627,7 @@ class Node:
             """
             if not self.__editableText:
                 raise ReadOnlyError, attr
-            logger.log("Setting text %s to password '%s'"%(self.getLogString(), value))
+            logger.log(_("Setting text %s to password '%s'")%(self.getLogString(), value))
             self.__editableText.setTextContents (value)
             doDelay()
 
@@ -634,7 +636,7 @@ class Node:
             Set the combobox to the given value, with appropriate delays and
             logging.
             """
-            logger.log("Setting combobox %s to '%s'"%(self.getLogString(), value))
+            logger.log(_("Setting combobox %s to '%s'")%(self.getLogString(), value))
             self.childNamed(childName=value).click()
             doDelay()
         else:
@@ -646,33 +648,33 @@ class Node:
         Type the given text into the node, with appropriate delays and
         logging.
         """
-        logger.log("Typing text into %s: '%s'"%(self.getLogString(), string))
+        logger.log(_("Typing text into %s: '%s'")%(self.getLogString(), string))
 
         # Non-working implementation
         # Unfortunately, the call to AccessibleText_setCaretOffset fails for Evolution's gtkhtml composer for some reason
         if False:
-            logger.log("caret offset: %s" % self.caretOffset)
+            logger.log(_("caret offset: %s") % self.caretOffset)
             self.__editableText.insertText (self.caretOffset, text)
             self.caretOffset+=len(string) # FIXME: is this correct?
-            logger.log("new caret offset: %s" % self.caretOffset)
+            logger.log(_("new caret offset: %s") % self.caretOffset)
 
         if self.focusable:
             if not self.focused:
                 try: self.grabFocus()
-                except Exception: logger.log("Node is focusable but I can't grabFocus!")
+                except Exception: logger.log(_("Node is focusable but I can't grabFocus!"))
             rawinput.typeText(string)
         else:
-            logger.log("Node is not focusable; falling back to setting text")
+            logger.log(_("Node is not focusable; falling back to setting text"))
             node.text += string
             doDelay()
 
     def keyCombo(self, comboString):
-        if config.debugSearching: logger.log("Pressing keys '%s' into %s"%(combo, self.getLogString()))
+        if config.debugSearching: logger.log(_("Pressing keys '%s' into %s")%(combo, self.getLogString()))
         if self.focusable:
             if not self.focused:
                 try: self.grabFocus()
-                except Exception: logger.log("Node is focusable but I can't grabFocus!")
-        else: logger.log("Node is not focusable; trying key combo anyway")
+                except Exception: logger.log(_("Node is focusable but I can't grabFocus!"))
+        else: logger.log(_("Node is not focusable; trying key combo anyway"))
         rawinput.keyCombo(comboString)
 
     def __str__ (self):
@@ -685,11 +687,11 @@ class Node:
         if self.debugName:
             return "{" + self.debugName + "}"
         else:
-            string = "Node"
-            string = string + " roleName='%s'" % self.roleName
-            string = string + " name='%s' description='%s'" % (self.name, self.description)
+            string = _("Node")
+            string = string + _(" roleName='%s'") % self.roleName
+            string = string + _(" name='%s' description='%s'") % (self.name, self.description)
             if self.text is not None:
-                string = string + " text='%s'" % self.text
+                string = string + _(" text='%s'") % self.text
             return string
 
     def getLogString(self):
@@ -745,7 +747,7 @@ class Node:
             if self.parent:
                 (ancestor, pred, isRecursive) = self.getRelativeSearch()
                 if config.debugSearchPaths:
-                    logger.log("got ancestor: %s" % ancestor)
+                    logger.log(_("got ancestor: %s") % ancestor)
 
                 ancestorPath = ancestor.getAbsoluteSearchPath()
                 ancestorPath.append(pred, isRecursive)
@@ -850,9 +852,9 @@ class Node:
             Internal helper function
             """
             if recursive:
-                noun = "descendent"
+                noun = _("descendent")
             else:
-                noun = "child"
+                noun = _("child")
 
             if debugName == None:
                 debugName = pred.describeSearchResult()
@@ -863,7 +865,7 @@ class Node:
         numAttempts = 0
         while numAttempts<config.searchCutoffCount:
             if numAttempts>=config.searchWarningThreshold or config.debugSearching:
-                logger.log("searching for %s (attempt %i)" % (describeSearch(self, pred, recursive, debugName), numAttempts))
+                logger.log(_("searching for %s (attempt %i)") % (describeSearch(self, pred, recursive, debugName), numAttempts))
 
             result = findFirstChildSatisfying(self, pred, recursive)
             if result:
@@ -877,7 +879,7 @@ class Node:
                 if not retry: break
                 numAttempts+=1
                 if config.debugSearching or config.debugSleep:
-                    logger.log("sleeping for %f" % config.searchBackoffDuration)
+                    logger.log(_("sleeping for %f") % config.searchBackoffDuration)
                 sleep(config.searchBackoffDuration)
         if requireResult:
             raise SearchError(describeSearch(self, pred, recursive, debugName))
@@ -1195,7 +1197,7 @@ class Wizard (Window):
         Node.__init__(self, node)
         if debugName:
             self.debugName = debugName
-        logger.log("%s is on '%s' page"%(self, self.getPageTitle()))
+        logger.log(_("%s is on '%s' page")%(self, self.getPageTitle()))
 
     def currentPage(self):
         """
@@ -1210,7 +1212,7 @@ class Wizard (Window):
             #print child.showing
             if child.showing:
                 return child
-        raise "Unable to determine current page of %s"%self
+        raise _("Unable to determine current page of %s")%self
 
     def getPageTitle(self):
         """
@@ -1236,7 +1238,7 @@ class Wizard (Window):
         fwd.click()
 
         # Log the new wizard page; it's helpful when debugging scripts
-        logger.log("%s is now on '%s' page"%(self, self.getPageTitle()))
+        logger.log(_("%s is now on '%s' page")%(self, self.getPageTitle()))
         # FIXME disabled for now (can't get valid page titles)
 
     def clickApply(self):
@@ -1257,12 +1259,12 @@ try:
     root.debugName= 'root'
 except AssertionError:
     # Warn if AT-SPI's desktop object doesn't show up.
-    logger.log("Error: AT-SPI's desktop is not visible. Do you have accessibility enabled?")
+    logger.log(_("Error: AT-SPI's desktop is not visible. Do you have accessibility enabled?"))
 
 # Check that there are applications running. Warn if none are.
 children = root.children
 if not children:
-    logger.log("Warning: AT-SPI's desktop is visible but it has no children. Are you running any AT-SPI-aware applications?")
+    logger.log(_("Warning: AT-SPI's desktop is visible but it has no children. Are you running any AT-SPI-aware applications?"))
 del children
 
 # Convenient place to set some debug variables:
--- dogtail/dogtail/utils.py.orig	2007-11-28 23:12:31.334203000 +0900
+++ dogtail/dogtail/utils.py	2007-11-29 13:24:18.143088000 +0900
@@ -13,6 +13,7 @@ David Malcolm <dmalcolm@redhat.com>
 import os
 import re
 from config import config
+from config import _
 from time import sleep
 from logging import debugLogger as logger
 from logging import TimeStamp
@@ -29,7 +30,7 @@ def screenshot(file = 'screenshot.png', 
     The timeStamp argument may be set to False to name the file foo.png.
     """
     if not isinstance(timeStamp, bool):
-        raise TypeError, "timeStampt must be True or False"
+        raise TypeError, _("timeStampt must be True or False")
     # config is supposed to create this for us. If it's not there, bail.
     assert os.path.isdir(config.scratchDir)
 
@@ -59,9 +60,9 @@ def screenshot(file = 'screenshot.png', 
     if fileExt == 'jpg': fileExt = 'jpeg'
     try: pixbuf.save(path, fileExt)
     except gobject.GError:
-        raise ValueError, "Failed to save screenshot in %s format" % fileExt
+        raise ValueError, _("Failed to save screenshot in %s format") % fileExt
     assert os.path.exists(path)
-    logger.log("Screenshot taken: " + path)
+    logger.log(_("Screenshot taken: ") + path)
     return path
 
 def run(string, timeout=config.runTimeout, interval=config.runInterval, desktop=None, dumb=False, appName=''):
@@ -110,7 +111,7 @@ def doDelay(delay=None):
     if delay is None:
         delay = config.defaultDelay
     if config.debugSleep:
-        logger.log("sleeping for %f" % delay)
+        logger.log(_("sleeping for %f") % delay)
     sleep(delay)
 
 class Blinker:
@@ -164,7 +165,7 @@ def isA11yEnabled():
     return (gconfEnabled or envEnabled)
 
 def bailBecauseA11yIsDisabled():
-    logger.log("Dogtail requires that Assistive Technology support be enabled. Aborting...")
+    logger.log(_("Dogtail requires that Assistive Technology support be enabled. Aborting..."))
     sys.exit(1)
 
 def enableA11y():
@@ -186,15 +187,15 @@ def checkForA11yInteractively():
     """
     if isA11yEnabled(): return
     import gtk
-    dialog = gtk.Dialog('Enable Assistive Technology Support?',
+    dialog = gtk.Dialog(_("Enable Assistive Technology Support?"),
                      None,
                      gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
                      (gtk.STOCK_QUIT, gtk.RESPONSE_CLOSE, 
                          "_Enable", gtk.RESPONSE_ACCEPT))
-    question = """Dogtail requires that Assistive Technology Support be enabled for it to function. Would you like to enable Assistive Technology support now?
+    question = _("""Dogtail requires that Assistive Technology Support be enabled for it to function. Would you like to enable Assistive Technology support now?
 
 Note that you will have to log out for the change to fully take effect.
-    """.strip()
+    """).strip()
     dialog.set_default_response(gtk.RESPONSE_ACCEPT)
     questionLabel = gtk.Label(question)
     questionLabel.set_line_wrap(True)
@@ -202,7 +203,7 @@ Note that you will have to log out for t
     dialog.show_all()
     result = dialog.run()
     if result == gtk.RESPONSE_ACCEPT:
-        logger.log("Enabling accessibility...")
+        logger.log(_("Enabling accessibility..."))
         enableA11y()
     elif result == gtk.RESPONSE_CLOSE:
        bailBecauseA11yIsDisabled()
--- dogtail/po/LINGUAS.orig	1970-01-01 09:00:00.000000000 +0900
+++ dogtail/po/LINGUAS		2007-11-29 13:39:55.054016000 +0900
@@ -0,0 +1 @@
+#
--- dogtail/po/POTFILES.in.orig	2007-11-29 00:24:36.458069000 +0900
+++ dogtail/po/POTFILES.in	2007-11-29 13:30:24.064781000 +0900
@@ -0,0 +1,30 @@
+# List of source files containing translatable strings.
+# Please keep this file sorted alphabetically.
+[encoding: UTF-8]
+build/lib/dogtail/config.py
+build/lib/dogtail/distro.py
+build/lib/dogtail/errors.py
+build/lib/dogtail/i18n.py
+build/lib/dogtail/logging.py
+build/lib/dogtail/path.py
+build/lib/dogtail/predicate.py
+build/lib/dogtail/procedural.py
+build/lib/dogtail/rawinput.py
+build/lib/dogtail/tc.py
+build/lib/dogtail/tree.py
+build/lib/dogtail/utils.py
+dogtail/config.py
+dogtail/distro.py
+dogtail/errors.py
+dogtail/i18n.py
+dogtail/logging.py
+dogtail/path.py
+dogtail/predicate.py
+dogtail/procedural.py
+dogtail/rawinput.py
+dogtail/tc.py
+dogtail/tree.py
+dogtail/utils.py
+recorder/recorder.glade
+sniff/sniff.glade
+sniff/sniff
--- dogtail/po/dogtail.pot.orig	2007-11-29 14:13:20.633821000 +0900
+++ dogtail/po/dogtail.pot	2007-11-29 00:34:26.157172000 +0900
@@ -0,0 +1,660 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-11-29 00:34+0900\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../build/lib/dogtail/config.py:161 ../build/lib/dogtail/config.py:185
+#: ../dogtail/config.py:168 ../dogtail/config.py:192
+msgid " is not a valid option."
+msgstr ""
+
+#. print "Found."
+#: ../build/lib/dogtail/config.py:203 ../build/lib/dogtail/config.py:208
+#: ../dogtail/config.py:210 ../dogtail/config.py:215
+#, python-format
+msgid "Creating %s ..."
+msgstr ""
+
+#: ../build/lib/dogtail/config.py:234 ../dogtail/config.py:241
+msgid "FAILED: "
+msgstr ""
+
+#: ../build/lib/dogtail/config.py:235 ../dogtail/config.py:242
+msgid "PASSED: "
+msgstr ""
+
+#: ../build/lib/dogtail/config.py:243 ../dogtail/config.py:250
+msgid "Reading all default values"
+msgstr ""
+
+#: ../build/lib/dogtail/config.py:251 ../dogtail/config.py:258
+msgid "Setting ensureSensitivity"
+msgstr ""
+
+#: ../build/lib/dogtail/config.py:257 ../dogtail/config.py:264
+msgid "Looking for default directories"
+msgstr ""
+
+#: ../build/lib/dogtail/config.py:266 ../dogtail/config.py:273
+msgid "Changing default directories"
+msgstr ""
+
+#: ../build/lib/dogtail/config.py:275 ../dogtail/config.py:282
+msgid "Setting useIconLogger"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:18 ../dogtail/distro.py:18
+msgid "Please send patches to "
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:300 ../dogtail/distro.py:300
+msgid "Detecting distribution: "
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:302 ../dogtail/distro.py:302
+msgid "JHBuild environment"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:305 ../dogtail/distro.py:305
+msgid "SuSE (or derived distribution)"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:308 ../dogtail/distro.py:308
+msgid "Fedora (or derived distribution)"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:311 ../dogtail/distro.py:311
+msgid "Red Hat/Fedora/derived distribution"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:314 ../dogtail/distro.py:314
+msgid "Ubuntu (or derived distribution)"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:317 ../dogtail/distro.py:317
+msgid "Debian (or derived distribution)"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:320 ../dogtail/distro.py:320
+msgid "Gentoo (or derived distribution)"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:323 ../dogtail/distro.py:323
+msgid "Slackware"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:326 ../dogtail/distro.py:326
+msgid "Conary-based distribution"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:330 ../dogtail/distro.py:330
+msgid "Solaris distribution"
+msgstr ""
+
+#: ../build/lib/dogtail/distro.py:333 ../build/lib/dogtail/distro.py:334
+#: ../dogtail/distro.py:333 ../dogtail/distro.py:334
+msgid "Unknown"
+msgstr ""
+
+#: ../build/lib/dogtail/errors.py:14 ../dogtail/errors.py:14
+#, python-format
+msgid "Warning: %s:%s: %s"
+msgstr ""
+
+#: ../build/lib/dogtail/i18n.py:112 ../dogtail/i18n.py:112
+#, python-format
+msgid "Translation not found for '%s'"
+msgstr ""
+
+#. import traceback
+#. logger.log(traceback.format_exc())
+#: ../build/lib/dogtail/i18n.py:249 ../dogtail/i18n.py:249
+msgid "Warning: Failed to load mo-file for translation: "
+msgstr ""
+
+#: ../build/lib/dogtail/logging.py:99 ../dogtail/logging.py:100
+msgid "dogtail running..."
+msgstr ""
+
+#. If path doesn't exist, raise an exception
+#: ../build/lib/dogtail/logging.py:154 ../dogtail/logging.py:155
+#, python-format
+msgid "Log path %s does not exist or is not a directory"
+msgstr ""
+
+#: ../build/lib/dogtail/logging.py:158 ../dogtail/logging.py:159
+#, python-format
+msgid "Creating logfile at %s ..."
+msgstr ""
+
+#: ../build/lib/dogtail/logging.py:164 ../dogtail/logging.py:165
+msgid "Could not create and write to "
+msgstr ""
+
+#: ../build/lib/dogtail/logging.py:189 ../dogtail/logging.py:190
+msgid "Could not write to file "
+msgstr ""
+
+#: ../build/lib/dogtail/logging.py:216 ../dogtail/logging.py:217
+msgid ""
+"Method argument requires a 1 {key: value} dict. Supplied argument not one "
+"{key: value}"
+msgstr ""
+
+#: ../build/lib/dogtail/path.py:89 ../dogtail/path.py:89
+#, python-format
+msgid "from %s"
+msgstr ""
+
+#: ../build/lib/dogtail/path.py:90 ../dogtail/path.py:90
+#, python-format
+msgid "to %s"
+msgstr ""
+
+#: ../build/lib/dogtail/path.py:91 ../dogtail/path.py:91
+#, python-format
+msgid "i=%s"
+msgstr ""
+
+#: ../build/lib/dogtail/path.py:92 ../dogtail/path.py:92
+#, python-format
+msgid "relative path %s"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:19 ../dogtail/predicate.py:19
+#, python-format
+msgid ", recursive=%s"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:99 ../dogtail/predicate.py:99
+#, python-format
+msgid "%s application"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:127 ../dogtail/predicate.py:127
+#, python-format
+msgid "labelled '%s'"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:129 ../dogtail/predicate.py:129
+msgid "child with"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:131 ../dogtail/predicate.py:131
+#, python-format
+msgid " name=%s"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:133 ../build/lib/dogtail/tree.py:692
+#: ../dogtail/predicate.py:133 ../dogtail/tree.py:692
+#, python-format
+msgid " roleName='%s'"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:135 ../dogtail/predicate.py:135
+#, python-format
+msgid " description='%s'"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:196 ../dogtail/predicate.py:196
+#, python-format
+msgid "named %s"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:213 ../dogtail/predicate.py:213
+#, python-format
+msgid "%s window"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:227 ../dogtail/predicate.py:227
+msgid "window"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:239 ../dogtail/predicate.py:239
+#, python-format
+msgid "%s dialog"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:264 ../dogtail/predicate.py:264
+#, python-format
+msgid "labelled %s"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:282 ../dogtail/predicate.py:282
+#, python-format
+msgid "%s menu"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:301 ../dogtail/predicate.py:301
+#, python-format
+msgid "%s menuitem"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:319 ../dogtail/predicate.py:319
+#, python-format
+msgid "%s textentry"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:337 ../dogtail/predicate.py:337
+#, python-format
+msgid "%s button"
+msgstr ""
+
+#: ../build/lib/dogtail/predicate.py:355 ../dogtail/predicate.py:355
+#, python-format
+msgid "%s tab"
+msgstr ""
+
+#: ../build/lib/dogtail/procedural.py:31 ../dogtail/procedural.py:31
+msgid "widget"
+msgstr ""
+
+#: ../build/lib/dogtail/procedural.py:32 ../dogtail/procedural.py:32
+#, python-format
+msgid "The requested %s '%s' could not be focused."
+msgstr ""
+
+#: ../build/lib/dogtail/procedural.py:34 ../dogtail/procedural.py:34
+msgid "At least one argument is needed"
+msgstr ""
+
+#: ../build/lib/dogtail/procedural.py:72 ../dogtail/procedural.py:72
+msgid "Application"
+msgstr ""
+
+#: ../build/lib/dogtail/procedural.py:105 ../dogtail/procedural.py:105
+msgid "Dialog"
+msgstr ""
+
+#: ../build/lib/dogtail/rawinput.py:28 ../dogtail/rawinput.py:28
+#, python-format
+msgid "Mouse button %s click at (%s,%s)"
+msgstr ""
+
+#: ../build/lib/dogtail/rawinput.py:36 ../dogtail/rawinput.py:36
+#, python-format
+msgid "Mouse button %s doubleclick at (%s,%s)"
+msgstr ""
+
+#: ../build/lib/dogtail/rawinput.py:44 ../dogtail/rawinput.py:44
+#, python-format
+msgid "Mouse button %s press at (%s,%s)"
+msgstr ""
+
+#: ../build/lib/dogtail/rawinput.py:52 ../dogtail/rawinput.py:52
+#, python-format
+msgid "Mouse button %s release at (%s,%s)"
+msgstr ""
+
+#: ../build/lib/dogtail/rawinput.py:60 ../dogtail/rawinput.py:60
+#, python-format
+msgid "Mouse absolute motion to (%s,%s)"
+msgstr ""
+
+#: ../build/lib/dogtail/rawinput.py:65 ../dogtail/rawinput.py:65
+#, python-format
+msgid "Mouse relative motion of (%s,%s)"
+msgstr ""
+
+#: ../build/lib/dogtail/rawinput.py:74 ../dogtail/rawinput.py:74
+#, python-format
+msgid "Mouse button %s drag from %s to %s"
+msgstr ""
+
+#: ../build/lib/dogtail/rawinput.py:184 ../dogtail/rawinput.py:184
+#, python-format
+msgid "Cannot find key %s"
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:57 ../dogtail/tc.py:57
+msgid "Passed"
+msgstr ""
+
+#. unsupported metric given
+#: ../build/lib/dogtail/tc.py:59 ../build/lib/dogtail/tc.py:144
+#: ../build/lib/dogtail/tc.py:162 ../build/lib/dogtail/tc.py:173
+#: ../build/lib/dogtail/tc.py:188 ../build/lib/dogtail/tc.py:233
+#: ../build/lib/dogtail/tc.py:237 ../dogtail/tc.py:59 ../dogtail/tc.py:144
+#: ../dogtail/tc.py:162 ../dogtail/tc.py:173 ../dogtail/tc.py:188
+#: ../dogtail/tc.py:233 ../dogtail/tc.py:237
+msgid "Failed - "
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:59 ../dogtail/tc.py:59
+msgid " strings do not match. "
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:59 ../build/lib/dogtail/tc.py:233
+#: ../dogtail/tc.py:59 ../dogtail/tc.py:233
+msgid " expected; Got "
+msgstr ""
+
+#. We should probably raise an exception here
+#: ../build/lib/dogtail/tc.py:66 ../dogtail/tc.py:66
+msgid "ERROR - "
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:66 ../dogtail/tc.py:66
+msgid " is not a supported encoding type"
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:141 ../dogtail/tc.py:141
+msgid "Passed - Images are the same size"
+msgstr ""
+
+#. same under PSNR returns inf dB:
+#: ../build/lib/dogtail/tc.py:170 ../build/lib/dogtail/tc.py:176
+#: ../dogtail/tc.py:170 ../dogtail/tc.py:176
+msgid "Passed - "
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:170 ../dogtail/tc.py:170
+msgid "compare results: "
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:170 ../build/lib/dogtail/tc.py:173
+#: ../build/lib/dogtail/tc.py:176 ../dogtail/tc.py:170 ../dogtail/tc.py:173
+#: ../dogtail/tc.py:176
+msgid " dB"
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:173 ../dogtail/tc.py:173
+msgid "compare result exceeds threshold by: "
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:176 ../dogtail/tc.py:176
+msgid "compare results under threshold by: "
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:185 ../dogtail/tc.py:185
+msgid "Could not delete tempfile "
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:188 ../dogtail/tc.py:188
+msgid " is not in the list of supported metrics"
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:231 ../dogtail/tc.py:231
+msgid "Passed - numbers are the same"
+msgstr ""
+
+#: ../build/lib/dogtail/tc.py:237 ../dogtail/tc.py:237
+msgid " is not in list of supported types"
+msgstr ""
+
+#. If atspi can't be imported, fail.
+#: ../build/lib/dogtail/tree.py:85 ../dogtail/tree.py:85
+msgid "Error importing the AT-SPI bindings"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:105 ../dogtail/tree.py:105
+#, python-format
+msgid "Cannot set %s. It is read-only."
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:116 ../dogtail/tree.py:116
+#, python-format
+msgid "Cannot %s %s. It is not sensitive."
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:127 ../dogtail/tree.py:127
+#, python-format
+msgid "Cannot do '%s' action on %s"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:169 ../dogtail/tree.py:169
+#, python-format
+msgid "Action node='%s' name='%s' description='%s' keybinding='%s'"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:177 ../dogtail/tree.py:177
+#, python-format
+msgid "%s on %s"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:183 ../dogtail/tree.py:183
+msgid "Warning: "
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:326 ../dogtail/tree.py:326
+msgid "Unknown Node initializer"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:366 ../dogtail/tree.py:366
+#, python-format
+msgid "raw click on %s %s at (%s,%s)"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:474 ../dogtail/tree.py:474
+#, python-format
+msgid ""
+"Only returning %s children. You may change config.childrenLimit if you wish. "
+"This message will only be printed once."
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:615 ../dogtail/tree.py:615
+#, python-format
+msgid "Setting text of %s to '%s'"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:631 ../dogtail/tree.py:631
+#, python-format
+msgid "Setting text %s to password '%s'"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:640 ../dogtail/tree.py:640
+#, python-format
+msgid "Setting combobox %s to '%s'"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:652 ../dogtail/tree.py:652
+#, python-format
+msgid "Typing text into %s: '%s'"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:657 ../dogtail/tree.py:657
+#, python-format
+msgid "caret offset: %s"
+msgstr ""
+
+#. FIXME: is this correct?
+#: ../build/lib/dogtail/tree.py:660 ../dogtail/tree.py:660
+#, python-format
+msgid "new caret offset: %s"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:665 ../build/lib/dogtail/tree.py:677
+#: ../dogtail/tree.py:665 ../dogtail/tree.py:677
+msgid "Node is focusable but I can't grabFocus!"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:668 ../dogtail/tree.py:668
+msgid "Node is not focusable; falling back to setting text"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:673 ../dogtail/tree.py:673
+#, python-format
+msgid "Pressing keys '%s' into %s"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:678 ../dogtail/tree.py:678
+msgid "Node is not focusable; trying key combo anyway"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:691 ../dogtail/tree.py:691
+msgid "Node"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:693 ../dogtail/tree.py:693
+#, python-format
+msgid " name='%s' description='%s'"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:695 ../dogtail/tree.py:695
+#, python-format
+msgid " text='%s'"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:751 ../dogtail/tree.py:751
+#, python-format
+msgid "got ancestor: %s"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:856 ../dogtail/tree.py:856
+msgid "descendent"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:858 ../dogtail/tree.py:858
+msgid "child"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:869 ../dogtail/tree.py:869
+#, python-format
+msgid "searching for %s (attempt %i)"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:883 ../build/lib/dogtail/utils.py:113
+#: ../dogtail/tree.py:883 ../dogtail/utils.py:114
+#, python-format
+msgid "sleeping for %f"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:1201 ../dogtail/tree.py:1201
+#, python-format
+msgid "%s is on '%s' page"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:1216 ../dogtail/tree.py:1216
+#, python-format
+msgid "Unable to determine current page of %s"
+msgstr ""
+
+#. Log the new wizard page; it's helpful when debugging scripts
+#: ../build/lib/dogtail/tree.py:1242 ../dogtail/tree.py:1242
+#, python-format
+msgid "%s is now on '%s' page"
+msgstr ""
+
+#. Warn if AT-SPI's desktop object doesn't show up.
+#: ../build/lib/dogtail/tree.py:1263 ../dogtail/tree.py:1263
+msgid ""
+"Error: AT-SPI's desktop is not visible. Do you have accessibility enabled?"
+msgstr ""
+
+#: ../build/lib/dogtail/tree.py:1268 ../dogtail/tree.py:1268
+msgid ""
+"Warning: AT-SPI's desktop is visible but it has no children. Are you running "
+"any AT-SPI-aware applications?"
+msgstr ""
+
+#: ../build/lib/dogtail/utils.py:32 ../dogtail/utils.py:33
+msgid "timeStampt must be True or False"
+msgstr ""
+
+#: ../build/lib/dogtail/utils.py:62 ../dogtail/utils.py:63
+#, python-format
+msgid "Failed to save screenshot in %s format"
+msgstr ""
+
+#: ../build/lib/dogtail/utils.py:64 ../dogtail/utils.py:65
+msgid "Screenshot taken: "
+msgstr ""
+
+#: ../build/lib/dogtail/utils.py:167 ../dogtail/utils.py:168
+msgid ""
+"Dogtail requires that Assistive Technology support be enabled. Aborting..."
+msgstr ""
+
+#: ../build/lib/dogtail/utils.py:189 ../dogtail/utils.py:190
+msgid "Enable Assistive Technology Support?"
+msgstr ""
+
+#: ../build/lib/dogtail/utils.py:194 ../dogtail/utils.py:195
+msgid ""
+"Dogtail requires that Assistive Technology Support be enabled for it to "
+"function. Would you like to enable Assistive Technology support now?\n"
+"\n"
+"Note that you will have to log out for the change to fully take effect.\n"
+"    "
+msgstr ""
+
+#: ../build/lib/dogtail/utils.py:205 ../dogtail/utils.py:206
+msgid "Enabling accessibility..."
+msgstr ""
+
+#: ../recorder/dogtail-recorder:114
+msgid "Procedural"
+msgstr ""
+
+#: ../recorder/dogtail-recorder:116
+msgid "Object-Oriented"
+msgstr ""
+
+#: ../recorder/dogtail-recorder:175
+msgid "Save Script..."
+msgstr ""
+
+#: ../recorder/recorder.glade.h:1
+msgid " Script:"
+msgstr ""
+
+#: ../recorder/recorder.glade.h:2
+msgid "Script Recorder"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:1
+msgid "AT-SPI Browser"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:2
+msgid "Actions:"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:3
+msgid "Description:"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:4
+msgid "Name:"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:5
+msgid "None"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:6
+msgid "Role Name:"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:7
+msgid "Text:"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:8
+msgid "_Collapse All"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:9
+msgid "_Expand All"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:10
+msgid "_Refresh"
+msgstr ""
+
+#: ../sniff/sniff.glade.h:11
+msgid "_Sniff"
+msgstr ""
--- dogtail/recorder/Makefile.am.orig	1970-01-01 09:00:00.000000000 +0900
+++ dogtail/recorder/Makefile.am	2007-11-29 13:39:55.054478000 +0900
@@ -0,0 +1,13 @@
+@INTLTOOL_DESKTOP_RULE@
+
+desktopdir       = $(datadir)/applications
+desktop_DATA     = $(desktop_in_files:.desktop.in=.desktop)
+desktop_in_files = \
+	dogtail-recorder.desktop.in
+
+EXTRA_DIST = \
+	$(desktop_in_files) \
+	$(desktop_DATA)
+
+CLEANFILES = $(desktop_DATA)
+
--- dogtail/recorder/dogtail-recorder.desktop.in.orig	1970-01-01 09:00:00.000000000 +0900
+++ dogtail/recorder/dogtail-recorder.desktop.in	2007-11-29 13:39:55.054925000 +0900
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Encoding=UTF-8
+_Name=Dogtail Script Recorder
+_Comment=Automate your desktop using Dogtail
+Exec=dogtail-recorder
+Terminal=false
+Type=Application
+Icon=dogtail-head.svg
+StartupNotify=true
+Categories=Application;Development;
--- dogtail/recorder/dogtail-recorder.orig	2007-11-29 00:00:42.418400000 +0900
+++ dogtail/recorder/dogtail-recorder	2007-11-29 13:18:45.152056000 +0900
@@ -4,6 +4,8 @@ appName = 'Script Recorder'
 import os
 os.environ['GTK_MODULES']=''
 
+from dogtail import config
+from dogtail.config import _
 from dogtail.utils import checkForA11yInteractively
 checkForA11yInteractively()
 
@@ -27,6 +29,9 @@ import gobject
 import gnome
 import gtk.glade
 
+gtk.glade.bindtextdomain('dogtail', config.GNOMELOCALEDIR)
+gtk.glade.textdomain('dogtail')
+
 try:
     import gtksourceview
     useGtkSourceView = True
@@ -104,9 +109,9 @@ class RecorderGUI(gnome.Program):
 
     def setWriterClass (self, comboBox):
         selected = comboBox.get_active_text()
-        if selected == "Procedural":
+        if selected == _("Procedural"):
             recorder.writerClass = ProceduralScriptWriter
-        elif selected == "Object-Oriented":
+        elif selected == _("Object-Oriented"):
             recorder.writerClass = OOScriptWriter
         else:
             print selected, "isn't a ScriptWriter, but it is selected. How?"
@@ -165,7 +170,7 @@ class RecorderGUI(gnome.Program):
         """
         Brings up a file chooser dialog asking where to save the script.
         """
-        self.saveFileChooser = gtk.FileChooserDialog("Save Script...", None, \
+        self.saveFileChooser = gtk.FileChooserDialog(_("Save Script..."), None, \
             gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, \
             gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK))
         self.saveFileChooser.set_default_response(gtk.RESPONSE_OK)
@@ -174,11 +179,11 @@ class RecorderGUI(gnome.Program):
         self.saveFileChooser.set_do_overwrite_confirmation(True)
 
         filter = gtk.FileFilter()
-        filter.set_name('Python files')
+        filter.set_name(_("Python files"))
         filter.add_pattern('*.py')
         self.saveFileChooser.add_filter(filter)
         filter = gtk.FileFilter()
-        filter.set_name('All Files')
+        filter.set_name(_("All files"))
         filter.add_pattern('*')
         self.saveFileChooser.add_filter(filter)
 
--- dogtail/sniff/Makefile.am.orig	1970-01-01 09:00:00.000000000 +0900
+++ dogtail/sniff/Makefile.am		2007-11-29 13:39:55.055374000 +0900
@@ -0,0 +1,13 @@
+@INTLTOOL_DESKTOP_RULE@
+
+desktopdir       = $(datadir)/applications
+desktop_DATA     = $(desktop_in_files:.desktop.in=.desktop)
+desktop_in_files = \
+	sniff.desktop.in
+
+EXTRA_DIST = \
+	$(desktop_in_files) \
+	$(desktop_DATA)
+
+CLEANFILES = $(desktop_DATA)
+
--- dogtail/sniff/sniff.desktop.in.orig	1970-01-01 09:00:00.000000000 +0900
+++ dogtail/sniff/sniff.desktop.in	2007-11-29 13:39:55.055817000 +0900
@@ -0,0 +1,10 @@
+[Desktop Entry]
+Encoding=UTF-8
+_Name=AT-SPI Browser
+_Comment=Browse your Assistive Technology-enabled desktop
+Exec=sniff
+Terminal=false
+Type=Application
+Icon=dogtail-head.svg
+StartupNotify=true
+Categories=Application;Development;
--- dogtail/sniff/sniff.glade.orig	2007-11-28 23:13:31.651189000 +0900
+++ dogtail/sniff/sniff.glade	2007-11-28 23:13:48.087101000 +0900
@@ -273,7 +273,7 @@
 		<widget class="GtkLabel" id="nameTextLabel">
 		  <property name="visible">True</property>
 		  <property name="can_focus">True</property>
-		  <property name="label" translatable="yes">name</property>
+		  <property name="label" translatable="yes">None</property>
 		  <property name="use_underline">False</property>
 		  <property name="use_markup">False</property>
 		  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -302,7 +302,7 @@
 		<widget class="GtkLabel" id="roleNameTextLabel">
 		  <property name="visible">True</property>
 		  <property name="can_focus">True</property>
-		  <property name="label" translatable="yes">roleName</property>
+		  <property name="label" translatable="yes">None</property>
 		  <property name="use_underline">False</property>
 		  <property name="use_markup">False</property>
 		  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -331,7 +331,7 @@
 		<widget class="GtkLabel" id="descTextLabel">
 		  <property name="visible">True</property>
 		  <property name="can_focus">True</property>
-		  <property name="label" translatable="yes">description</property>
+		  <property name="label" translatable="yes">None</property>
 		  <property name="use_underline">False</property>
 		  <property name="use_markup">False</property>
 		  <property name="justify">GTK_JUSTIFY_LEFT</property>
@@ -415,7 +415,7 @@
 	      <child>
 		<widget class="GtkLabel" id="actionsTextLabel">
 		  <property name="visible">True</property>
-		  <property name="label" translatable="yes">actions</property>
+		  <property name="label" translatable="yes">None</property>
 		  <property name="use_underline">False</property>
 		  <property name="use_markup">False</property>
 		  <property name="justify">GTK_JUSTIFY_LEFT</property>
--- dogtail/sniff/sniff.orig	2007-11-28 23:13:37.354652000 +0900
+++ dogtail/sniff/sniff	2007-11-29 13:24:31.385889000 +0900
@@ -9,11 +9,16 @@ checkForA11yInteractively()
 
 from dogtail import tree
 from dogtail import utils
+from dogtail import config
+from dogtail.config import _
 import gobject
 import gnome
 import atspi
 program = gnome.program_init(appName, '0.1')
 import gtk.glade
+import gnome.ui
+gtk.glade.bindtextdomain('dogtail', config.GNOMELOCALEDIR)
+gtk.glade.textdomain('dogtail')
 
 import os
 if os.path.exists('sniff.glade'):
@@ -60,7 +65,7 @@ def showAbout(*args):
     about = gtk.AboutDialog()
     about.set_name(appName)
     about.set_authors(appAuthors)
-    about.set_comments('Explore your desktop with Dogtail')
+    about.set_comments(_("Explore your desktop with Dogtail"))
     about.set_website('http://people.redhat.com/zcerza/dogtail/')
     about.show_all()
 
@@ -352,7 +357,7 @@ def getNodeAttr(column, cell, model, ite
     try:
         text = getattr(node, attr)
     except atspi.SpiException:
-        text = "(broken node)"
+        text = _("(broken node)")
     cell.set_property('text', text)
 
 def getCellPixbufForNode(column, cell, model, iter):
@@ -381,7 +386,7 @@ def main():
     col.pack_end(cellRenderer, expand = False)
     col.set_cell_data_func(cellRenderer, getNodeAttr, 'name')
 
-    col.set_title('Name')
+    col.set_title(_("Name"))
 
     view.insert_column(col, -1)
     #view.insert_column_with_data_func(-1, "Role Name", \
