Commits

Erik Grinaker  committed f7e311e

initial translation infrastructure

  • Participants
  • Parent commits 86a1950

Comments (0)

Files changed (10)

 #
 
 AUTOMAKE_OPTIONS	= dist-bzip2 no-dist-gzip
-SUBDIRS			= data src
+SUBDIRS			= data po src
 
 dist-hook:
 	svn2cl.sh\
 ============================
 
 New features:
+- translation support
 - ported to gtk+ 2.8 and gnome 2.10
+- use mlock() to ensure memory is never swapped to disk
 - cleaned up preferences dialog
+- only show Revelation files by default in open and save dialogs
 
 Bugfixes:
 - improved error detection during file saving
-- ensure memory is never swapped out to disk
 - handle errors while loading icons [Wade Berrier]
 - password generator now always avoids ambiguous characters
 - password checker and generator follow "show passwords" preference
+- don't use passwords in default goto commands
 - HIG fixes
-- don't use passwords in default goto commands
-- only show Revelation files by default in open and save dialogs
-- added note to lock dialog when quit disabled due to unsaved changes
-- removed the Help > Homepage menu item
 
 Code changes:
 - depend on pygtk 2.8 and gnome-python 2.10
 - improved build scripts
 - generate ChangeLog from subversion log during make dist
-- added mman module
 - removed gnomemisc module
 - don't use deprecated gnome-python modules
-- moved preference dialog from dialog module to main script
 
 
 2006-02-06: Revelation 0.4.7
 - check errors when opening files from dav:// urls
 - port HIG-improvements from sputnik
 - detect XDG prefix and install mime/icons to correct dir
+- restructure the configuration layout
 
 0.6.x:
 - ensure complete UTF-8 support
 - file merging (union - this *really* need unique entry ids)
 - sorting of the tree
 - add a dropdown widget for list fields (like email protocol etc)
-- restructure the configuration layout
 - recent docs
-- string cleanups
-- translations
 - add import/export of GPasMan files
 - add import/export of zsafe files
 - add import/export of gnukeyring files

File acinclude.m4

 	AM_GCONF_SOURCE_2
 ])
 
+AC_DEFUN([RVL_GETTEXT], [
+	GETTEXT_PACKAGE="revelation"
+	IT_PROG_INTLTOOL([0.35.0])
+
+	AC_SUBST(GETTEXT_PACKAGE)
+	AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The gettext package])
+	AM_GLIB_GNU_GETTEXT
+])
+
 AC_DEFUN([RVL_MMAN], [
 	AC_CHECK_FUNCS(mlockall munlockall)
 ])

File configure.ac

 AC_PREREQ(2.53)
 AC_INIT(src/revelation.in)
 AM_INIT_AUTOMAKE(revelation, 0.4.7)
-
+ALL_LINGUAS="nb"
 
 dnl check for dependencies
 AC_PROG_CC()
 
 RVL_PYTHON_PATH(2.3)
 RVL_PYGTK()
+RVL_GETTEXT()
 RVL_CRACKLIB()
 RVL_MMAN()
 RVL_GCONF()
 	data/icons/scalable/Makefile
 	data/mime/Makefile
 	data/ui/Makefile
+	po/Makefile.in
 	src/Makefile
 	src/lib/Makefile
 	src/lib/datahandler/Makefile

File po/POTFILES.in

+src/revelation.in
+# Norwegian translation of Revelation.
+# Copyright (C) 2006 Erik Grinaker
+# This file is distributed under the same license as the Revelation package.
+# Erik Grinaker <erikg@codepoet.no>, 2006.
+# , fuzzy
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Revelation 0.4.7\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-07-22 16:10+0200\n"
+"PO-Revision-Date: 2006-07-22 17:15+0200\n"
+"Last-Translator: Erik Grinaker <erikg@codepoet.no>\n"
+"Language-Team:  <i18n-nb@lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: src/revelation.in:62
+msgid "Missing data files"
+msgstr "Manglende datafiler"
+
+#: src/revelation.in:62
+msgid ""
+"Some of Revelations system files could not be found, please reinstall "
+"Revelation."
+msgstr "Noen av Revelations system-files ble ikke funnet - prøv å installere programmet på nytt."
+
+#: src/revelation.in:66
+msgid "Missing configuration data"
+msgstr "Manglende innstillinger"
+
+#: src/revelation.in:66
+msgid ""
+"Revelation could not find its configuration data, please reinstall "
+"Revelation."
+msgstr "Revelation fant ikke innstillingene sine - prøv å innstallere på nytt."
+
+#: src/revelation.in:70
+msgid "Invalid data files"
+msgstr "Ugyldige data-filer"
+
+#: src/revelation.in:70
+msgid ""
+"Some of Revelations system files contain invalid data, please reinstall "
+"Revelation."
+msgstr "Noen av systemfilene til Revelation inneholder ugyldige data - installer programmet på nytt."
+
+#: src/revelation.in:347
+msgid "New file"
+msgstr "Ny fil"
+
+#: src/revelation.in:360
+msgid "_Undo"
+msgstr "_Angre"
+
+#: src/revelation.in:363
+#, python-format
+msgid "_Undo %s"
+msgstr "_Angre %s"
+
+#: src/revelation.in:371
+msgid "_Redo"
+msgstr ""
+
+#: src/revelation.in:374
+#, python-format
+msgid "_Redo %s"
+msgstr ""
+
+#: src/revelation.in:464 src/revelation.in:1341
+msgid "Open cancelled"
+msgstr "Åpning avbrutt"
+
+#: src/revelation.in:823
+#, python-format
+msgid "Match found for '%s'"
+msgstr "Fant treff for '%s'"
+
+#: src/revelation.in:826
+#, python-format
+msgid "No match found for '%s'"
+msgstr "Ingen treff funnet for '%s'"
+
+#: src/revelation.in:827
+msgid "No match found"
+msgstr "Ingen treff funnet"
+
+#: src/revelation.in:827
+#, python-format
+msgid ""
+"The string '%s' does not match any entries. Try searching for a different "
+"phrase."
+msgstr "Ingen oppføringer inneholdt teksten '%s'. Prøv å søke med en annen tekst."
+
+#: src/revelation.in:859
+msgid "Incorrect password"
+msgstr "Galt passord"
+
+#: src/revelation.in:859
+#, python-format
+msgid "The password you entered for the file '%s' was not correct."
+msgstr "Passordet du ga for filen '%s' var ikke riktig."
+
+#: src/revelation.in:862 src/revelation.in:866 src/revelation.in:870
+#: src/revelation.in:874 src/revelation.in:878
+msgid "Open failed"
+msgstr "Åpning feilet"
+
+#: src/revelation.in:863
+msgid "Invalid file format"
+msgstr "Ugyldig filformat"
+
+#: src/revelation.in:863
+#, python-format
+msgid "The file '%s' contains invalid data."
+msgstr "Filen '%s' inneholder ugyldige data."
+
+#: src/revelation.in:867
+msgid "Unknown data"
+msgstr "Ukjente data"
+
+#: src/revelation.in:867
+#, python-format
+msgid ""
+"The file '%s' contains unknown data. It may have been created by a newer "
+"version of Revelation."
+msgstr "Filen '%s' inneholder ukjente data - den kan ha blitt lagret av en nyere versjon av Revelation."
+
+#: src/revelation.in:871
+msgid "Unknown data version"
+msgstr "Ukjent data-versjon"
+
+#: src/revelation.in:871
+#, python-format
+msgid ""
+"The file '%s' has a future version number, please upgrade Revelation to open "
+"it."
+msgstr "Filen '%s' har et nyere versjonsnummer - oppgrader programmet for å åpne den."
+
+#: src/revelation.in:875
+msgid "Unable to detect filetype"
+msgstr "Kunne ikke gjenkjenne filtype"
+
+#: src/revelation.in:875
+#, python-format
+msgid ""
+"The file type of the file '%s' could not be automatically detected. Try "
+"specifying the file type manually."
+msgstr "Filtypen for filen '%s' ble ikke gjenkjent. Prøv å velge en filtype manuelt."
+
+#: src/revelation.in:879
+msgid "Unable to open file"
+msgstr "Kunne ikke åpne filen"
+
+#: src/revelation.in:879
+#, python-format
+msgid ""
+"The file '%s' could not be opened. Make sure that the file exists, and that "
+"you have permissions to open it."
+msgstr "Filen '%s' kunne ikke åpnes. Sjekk at filen finnes, og at du har tilstrekkelige rettigheter til å lese den."
+
+#: src/revelation.in:920
+msgid "Entry has no password to copy"
+msgstr "Oppføringen har ikke noe passord å kopiere"
+
+#: src/revelation.in:924
+msgid "Password copied to clipboard"
+msgstr "Passord kopiert til utklippstavlen"
+
+#: src/revelation.in:931
+msgid "Entries copied"
+msgstr "Oppføringer kopiert"
+
+#: src/revelation.in:953
+msgid "Cut entries"
+msgstr ""
+
+#: src/revelation.in:960
+msgid "Entries cut"
+msgstr "Oppføringer klippet"
+
+#: src/revelation.in:975
+msgid "Paste entries"
+msgstr ""
+
+#: src/revelation.in:982
+msgid "Entries pasted"
+msgstr ""
+
+#: src/revelation.in:990
+msgid "Add Entry"
+msgstr ""
+
+#: src/revelation.in:997
+msgid "Add entry"
+msgstr ""
+
+#: src/revelation.in:1003
+msgid "Entry added"
+msgstr ""
+
+#: src/revelation.in:1006
+msgid "Add entry cancelled"
+msgstr ""
+
+#: src/revelation.in:1019
+msgid "Edit Folder"
+msgstr ""
+
+#: src/revelation.in:1022
+msgid "Edit Entry"
+msgstr ""
+
+#: src/revelation.in:1031
+msgid "Update entry"
+msgstr ""
+
+#: src/revelation.in:1036
+msgid "Entry updated"
+msgstr ""
+
+#: src/revelation.in:1039
+msgid "Edit entry cancelled"
+msgstr ""
+
+#: src/revelation.in:1055
+msgid "Add Folder"
+msgstr ""
+
+#: src/revelation.in:1060
+msgid "Add folder"
+msgstr ""
+
+#: src/revelation.in:1066
+msgid "Folder added"
+msgstr ""
+
+#: src/revelation.in:1069
+msgid "Add folder cancelled"
+msgstr ""
+
+#: src/revelation.in:1083
+#, python-format
+msgid "No goto command found for %s entries"
+msgstr ""
+
+#: src/revelation.in:1106
+msgid "Entry opened"
+msgstr ""
+
+#: src/revelation.in:1109
+msgid "Invalid goto command format"
+msgstr ""
+
+#: src/revelation.in:1109
+#, python-format
+msgid ""
+"The goto command for '%s' entries is invalid, please correct it in the "
+"preferences."
+msgstr ""
+
+#: src/revelation.in:1112
+msgid "Missing entry data"
+msgstr ""
+
+#: src/revelation.in:1112
+#, python-format
+msgid "The entry '%s' does not have all the data required to open it."
+msgstr ""
+
+#: src/revelation.in:1133
+msgid "Move entry"
+msgstr ""
+
+#: src/revelation.in:1141
+msgid "Entries moved"
+msgstr ""
+
+#: src/revelation.in:1168
+msgid "Remove entry"
+msgstr ""
+
+#: src/revelation.in:1174
+msgid "Entries removed"
+msgstr ""
+
+#: src/revelation.in:1177
+msgid "Entry removal cancelled"
+msgstr ""
+
+#: src/revelation.in:1191
+msgid "Password changed"
+msgstr ""
+
+#: src/revelation.in:1194
+msgid "Password change cancelled"
+msgstr ""
+
+#: src/revelation.in:1212
+#, python-format
+msgid "Data exported to %s"
+msgstr ""
+
+#: src/revelation.in:1215
+msgid "Export cancelled"
+msgstr ""
+
+#: src/revelation.in:1218
+msgid "Unable to write to file"
+msgstr ""
+
+#: src/revelation.in:1218 src/revelation.in:1365
+#, python-format
+msgid ""
+"The file '%s' could not be opened for writing. Make sure that you have the "
+"proper permissions to write to it."
+msgstr ""
+
+#: src/revelation.in:1219
+msgid "Export failed"
+msgstr ""
+
+#: src/revelation.in:1235
+msgid "Import data"
+msgstr ""
+
+#: src/revelation.in:1239
+#, python-format
+msgid "Data imported from %s"
+msgstr ""
+
+#: src/revelation.in:1244
+msgid "Import cancelled"
+msgstr ""
+
+#: src/revelation.in:1267
+msgid "Locked"
+msgstr "Låst"
+
+#: src/revelation.in:1268
+msgid "File locked"
+msgstr "Filen er låst"
+
+#: src/revelation.in:1279
+msgid "Quit disabled due to unsaved changes"
+msgstr ""
+
+#: src/revelation.in:1292
+msgid "File unlocked"
+msgstr ""
+
+#: src/revelation.in:1311
+msgid "New file created"
+msgstr ""
+
+#: src/revelation.in:1314
+msgid "New file cancelled"
+msgstr ""
+
+#: src/revelation.in:1338
+#, python-format
+msgid "Opened file %s"
+msgstr ""
+
+#: src/revelation.in:1356
+#, python-format
+msgid "Data saved to file %s"
+msgstr ""
+
+#: src/revelation.in:1361
+msgid "Save cancelled"
+msgstr ""
+
+#: src/revelation.in:1365
+msgid "Unable to save file"
+msgstr ""
+
+#: src/revelation.in:1366
+msgid "Save failed"
+msgstr ""
+
+#: src/revelation.in:1406
+msgid "Quit cancelled"
+msgstr ""
+
+#: src/revelation.in:1419
+#, python-format
+msgid "%s redone"
+msgstr ""
+
+#: src/revelation.in:1453
+#, python-format
+msgid "%s undone"
+msgstr ""
+
+#: src/revelation.in:1462
+msgid "Preferences"
+msgstr "Innstillinger"
+
+#: src/revelation.in:1469
+msgid "General"
+msgstr "Generelt"
+
+#: src/revelation.in:1473
+msgid "Interface"
+msgstr "Grensesnitt"
+
+#: src/revelation.in:1477 src/revelation.in:1564
+msgid "Goto Commands"
+msgstr ""
+
+#: src/revelation.in:1486
+msgid "Doubleclick Action"
+msgstr "Dobbelklikk-handling"
+
+#: src/revelation.in:1489
+msgid "Go to account, if possible"
+msgstr ""
+
+#: src/revelation.in:1492
+msgid ""
+"Go to the account (open in external application) on doubleclick, if required "
+"data is filled in"
+msgstr ""
+
+#: src/revelation.in:1496
+msgid "Edit account"
+msgstr ""
+
+#: src/revelation.in:1499
+msgid "Edit the account on doubleclick"
+msgstr ""
+
+#: src/revelation.in:1503
+msgid "Copy password to clipboard"
+msgstr ""
+
+#: src/revelation.in:1506
+msgid "Copy the account password to clipboard on doubleclick"
+msgstr ""
+
+#: src/revelation.in:1513
+msgid "Files"
+msgstr "Filer"
+
+#: src/revelation.in:1516
+msgid "Open file on startup:"
+msgstr ""
+
+#: src/revelation.in:1520
+msgid "When enabled, this file will be opened when the program is started"
+msgstr ""
+
+#: src/revelation.in:1522
+msgid "Select File to Automatically Open"
+msgstr ""
+
+#: src/revelation.in:1527
+msgid "File to open when Revelation is started"
+msgstr ""
+
+#: src/revelation.in:1535
+msgid "Automatically save data when changed"
+msgstr ""
+
+#: src/revelation.in:1538
+msgid ""
+"Automatically save the data file when an entry is added, modified or removed"
+msgstr ""
+
+#: src/revelation.in:1542
+msgid "Lock file when inactive for"
+msgstr ""
+
+#: src/revelation.in:1545
+msgid "Automatically lock the data file after a period of inactivity"
+msgstr ""
+
+#: src/revelation.in:1551
+msgid "The period of inactivity before locking the file, in minutes"
+msgstr ""
+
+#: src/revelation.in:1557
+msgid "minutes"
+msgstr ""
+
+#: src/revelation.in:1575
+#, python-format
+msgid ""
+"Goto command for %s accounts. The following expansion variables can be used:"
+msgstr ""
+
+#: src/revelation.in:1581
+#, python-format
+msgid "%%: a % sign"
+msgstr ""
+
+#: src/revelation.in:1582
+msgid "%?x: optional expansion variable"
+msgstr ""
+
+#: src/revelation.in:1583
+msgid "%(...%): optional substring expansion"
+msgstr ""
+
+#: src/revelation.in:1592
+msgid "Passwords"
+msgstr "Passord"
+
+#: src/revelation.in:1595
+msgid "Display passwords and other secrets"
+msgstr ""
+
+#: src/revelation.in:1598
+msgid ""
+"Display passwords and other secrets, such as PIN codes (otherwise, hide with "
+"******)"
+msgstr ""
+
+#: src/revelation.in:1602
+msgid "Also copy username when copying password"
+msgstr ""
+
+#: src/revelation.in:1605
+msgid ""
+"When the password is copied to clipboard, put the username before the "
+"password as a clipboard \"chain\""
+msgstr ""
+
+#: src/revelation.in:1613
+msgid ""
+"The number of characters in generated passwords - 8 or more are recommended"
+msgstr ""
+
+#: src/revelation.in:1614
+msgid "Length of generated passwords"
+msgstr ""
+
+#: src/revelation.in:1620
+msgid "Toolbar Style"
+msgstr "Verktøylinje"
+
+#: src/revelation.in:1623
+msgid "Use desktop default"
+msgstr "Bruk standard"
+
+#: src/revelation.in:1626
+msgid "Show toolbar items with default style"
+msgstr ""
+
+#: src/revelation.in:1630
+msgid "Show icons and text"
+msgstr "Vis ikoner og tekst"
+
+#: src/revelation.in:1633
+msgid "Show toolbar items with both icons and text"
+msgstr ""
+
+#: src/revelation.in:1637
+msgid "Show icons and important text"
+msgstr "Vis ikoner og viktig tekst"
+
+#: src/revelation.in:1640
+msgid "Show toolbar items with text beside important icons"
+msgstr ""
+
+#: src/revelation.in:1644
+msgid "Show icons only"
+msgstr "Vis kun ikoner"
+
+#: src/revelation.in:1647
+msgid "Show toolbar items with icons only"
+msgstr ""
+
+#: src/revelation.in:1651
+msgid "Show text only"
+msgstr "Vis kun tekst"
+
+#: src/revelation.in:1654
+msgid "Show toolbar items with text only"
+msgstr ""
+

File src/lib/Makefile.am

 config.py: config.py.in
 	sed \
 		-e "s|\@GCONFTOOL\@|$(GCONFTOOL)|" \
+		-e "s|\@PACKAGE\@|$(PACKAGE)|" \
 		-e "s|\@VERSION\@|$(VERSION)|" \
 		-e "s|\@datadir\@|$(datadir)|" \
 		-e "s|\@pkgdatadir\@|$(pkgdatadir)|" \

File src/lib/config.py.in

 
 DIR_GCONFSCHEMAS= "@pkgschemadir@"
 DIR_ICONS	= "@datadir@/icons"
+DIR_LOCALE	= "@datadir@/locale"
 DIR_UI		= "@pkgdatadir@/ui"
 
 FILE_GCONFTOOL	= "@GCONFTOOL@"
 
 APPNAME		= "Revelation"
+PACKAGE		= "@PACKAGE@"
 VERSION		= "@VERSION@"
 DATAVERSION	= 1
 RELNAME		= "The decision to flee came suddenly"

File src/revelation.in

 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 #
 
-import gnome, gobject, gtk, gtk.gdk, os, pwd, sys
+import gettext, gnome, gobject, gtk, gtk.gdk, os, pwd, sys
 
 if "@pyexecdir@" not in sys.path:
 	sys.path.insert(0, "@pyexecdir@")
 
 from revelation import config, data, datahandler, dialog, entry, io, mman, ui, util
 
+_ = gettext.gettext
+
 
 class Revelation(ui.App):
 	"The Revelation application"
 		sys.excepthook = self.__cb_exception
 		os.umask(0077)
 
+		gettext.bindtextdomain(config.PACKAGE, config.DIR_LOCALE)
+		gettext.bind_textdomain_codeset(config.PACKAGE, "UTF-8")
+		gettext.textdomain(config.PACKAGE)
+
 		self.program = gnome.init(
 			config.APPNAME, config.APPNAME,
 			gnome.libgnome_module_info_get(), sys.argv, []
 			self.__init_states()
 
 		except IOError:
-			dialog.Error(self, "Missing data files", "Some of Revelations system files could not be found, please reinstall Revelation.").run()
+			dialog.Error(self, _(u'Missing data files'), _(u'Some of Revelations system files could not be found, please reinstall Revelation.')).run()
 			sys.exit(1)
 
 		except config.ConfigError:
-			dialog.Error(self, "Missing configuration data", "Revelation could not find its configuration data, please reinstall Revelation.").run()
+			dialog.Error(self, _(u'Missing configuration data'), _(u'Revelation could not find its configuration data, please reinstall Revelation.')).run()
 			sys.exit(1)
 
 		except ui.DataError:
-			dialog.Error(self, "Invalid data files", "Some of Revelations system files contain invalid data, please reinstall Revelation.").run()
+			dialog.Error(self, _(u'Invalid data files'), _(u'Some of Revelations system files contain invalid data, please reinstall Revelation.')).run()
 			sys.exit(1)
 
 
 
 
 		# set some variables
-		self.entrysearch.string	= ""
+		self.entrysearch.string	= u''
 		self.entrysearch.type	= None
 
 		# set ui widget states
 				os.chdir(os.path.dirname(file))
 
 		else:
-			self.set_title("[New file]")
+			self.set_title(u'[' + _(u'New file') + u']')
 
 
 	def __state_find(self, string):
 		"Sets states based on undoqueue actions"
 
 		if undoaction is None:
-			s, l = False, "_Undo"
+			s, l = False, _(u'_Undo')
 
 		else:
-			s, l = True, "_Undo %s" % undoaction[1].lower()
+			s, l = True, _(u'_Undo %s') % undoaction[1].lower()
 
 		action = self.uimanager.get_action("undo")
 		action.set_property("sensitive", s)
 
 
 		if redoaction is None:
-			s, l = False, "_Redo"
+			s, l = False, _(u'_Redo')
 
 		else:
-			s, l = True, "_Redo %s" % redoaction[1].lower()
+			s, l = True, _(u'_Redo %s') % redoaction[1].lower()
 
 		action = self.uimanager.get_action("redo")
 		action.set_property("sensitive", s)
 				self.file_open(self.datafile.get_file(), self.datafile.get_password())
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Open cancelled")
+			self.statusbar.set_status(_(u'Open cancelled'))
 
 
 	def __cb_file_autolock(self, widget, data = None):
 
 		if match != None:
 			self.tree.select(match)
-			self.statusbar.set_status("Match found for '%s'" % string)
+			self.statusbar.set_status(_(u'Match found for \'%s\'') % string)
 
 		else:
-			self.statusbar.set_status("No match found for '%s'" % string)
-			dialog.Error(parent, "No match found", "The string '%s' does not match any entries. Try searching for a different phrase." % string).run()
+			self.statusbar.set_status(_(u'No match found for \'%s\'') % string)
+			dialog.Error(parent, _(u'No match found'), _(u'The string \'%s\' does not match any entries. Try searching for a different phrase.') % string).run()
 
 
 	def __file_autosave(self):
 					return datafile.load(file, password, lambda: dialog.PasswordOpen(self, os.path.basename(file)).run())
 
 				except datahandler.PasswordError:
-					dialog.Error(self, "Incorrect password", "The password you entered for the file'%s' was not correct." % file).run()
+					dialog.Error(self, _(u'Incorrect password'), _(u'The password you entered for the file \'%s\' was not correct.') % file).run()
 
 		except datahandler.FormatError:
-			self.statusbar.set_status("Open failed")
-			dialog.Error(self, "Invalid file format", "The file '%s' contains invalid data." % file).run()
+			self.statusbar.set_status(_(u'Open failed'))
+			dialog.Error(self, _(u'Invalid file format'), _(u'The file \'%s\' contains invalid data.') % file).run()
 
 		except ( datahandler.DataError, entry.EntryTypeError, entry.EntryFieldError ):
-			self.statusbar.set_status("Open failed")
-			dialog.Error(self, "Unknown data", "The file '%s' contains unknown data. It may have been created by a more recent version of Revelation.." % file).run()
+			self.statusbar.set_status(_(u'Open failed'))
+			dialog.Error(self, _(u'Unknown data'), _(u'The file \'%s\' contains unknown data. It may have been created by a newer version of Revelation.') % file).run()
 
 		except datahandler.VersionError:
-			self.statusbar.set_status("Open failed")
-			dialog.Error(self, "Unknown data version", "The file '%s' has a future version number, please upgrade Revelation to open it." % file).run()
+			self.statusbar.set_status(_(u'Open failed'))
+			dialog.Error(self, _(u'Unknown data version'), _(u'The file \'%s\' has a future version number, please upgrade Revelation to open it.') % file).run()
 
 		except datahandler.DetectError:
-			self.statusbar.set_status("Open failed")
-			dialog.Error(self, "Unable to detect filetype", "The file type of the file '%s' could not be automatically detected. Try specifying the file type manually." % file).run()
+			self.statusbar.set_status(_(u'Open failed'))
+			dialog.Error(self, _(u'Unable to detect filetype'), _(u'The file type of the file \'%s\' could not be automatically detected. Try specifying the file type manually.')% file).run()
 
 		except IOError:
-			self.statusbar.set_status("Open failed")
-			dialog.Error(self, "Unable to open file", "The file '%s' could not be opened. Make sure that the file exists, and that you have permissions to open it." % file).run()
+			self.statusbar.set_status(_(u'Open failed'))
+			dialog.Error(self, _(u'Unable to open file'), _(u'The file \'%s\' could not be opened. Make sure that the file exists, and that you have permissions to open it.') % file).run()
 
 
 	def __get_common_usernames(self, e = None):
 			secrets.insert(0, e[entry.UsernameField])
 
 		if len(secrets) == 0:
-			self.statusbar.set_status("Entry has no password to copy")
+			self.statusbar.set_status(_(u'Entry has no password to copy'))
 
 		else:
 			self.clipboard.set(secrets, True)
-			self.statusbar.set_status("Password copied to clipboard")
+			self.statusbar.set_status(_(u'Password copied to clipboard'))
 
 
 	def clip_copy(self, iters):
 		"Copies entries to the clipboard"
 
 		self.entryclipboard.set(self.entrystore, iters)
-		self.statusbar.set_status("Entries copied")
+		self.statusbar.set_status(_(u'Entries copied'))
 
 
 	def clip_cut(self, iters):
 			self.entrystore.remove_entry(iter)
 
 		self.undoqueue.add_action(
-			"Cut entries", self.__cb_undo_remove, self.__cb_redo_remove,
+			_(u'Cut entries'), self.__cb_undo_remove, self.__cb_redo_remove,
 			undoactions
 		)
 
 		self.__file_autosave()
 
 		self.tree.unselect_all()
-		self.statusbar.set_status("Entries cut")
+		self.statusbar.set_status(_(u'Entries cut'))
 
 
 	def clip_paste(self, entrystore, parent):
 		paths = [ self.entrystore.get_path(iter) for iter in iters ]
 
 		self.undoqueue.add_action(
-			"Paste entries", self.__cb_undo_paste, self.__cb_redo_paste,
+			_(u'Paste entries'), self.__cb_undo_paste, self.__cb_redo_paste,
 			( entrystore, self.entrystore.get_path(parent), paths )
 		)
 
 		if len(iters) > 0:
 			self.tree.select(iters[0])
 
-		self.statusbar.set_status("Entries pasted")
+		self.statusbar.set_status(_(u'Entries pasted'))
 
 
 	def entry_add(self, e = None, parent = None, sibling = None):
 
 		try:
 			if e == None:
-				d = dialog.EntryEdit(self, "Add Entry", None, self.config, self.clipboard)
+				d = dialog.EntryEdit(self, _(u'Add Entry'), None, self.config, self.clipboard)
 				d.set_fieldwidget_data(entry.UsernameField, self.__get_common_usernames())
 				e = d.run()
 
 			iter = self.entrystore.add_entry(e, parent, sibling)
 
 			self.undoqueue.add_action(
-				"Add entry", self.__cb_undo_add, self.__cb_redo_add,
+				_(u'Add entry'), self.__cb_undo_add, self.__cb_redo_add,
 				( self.entrystore.get_path(iter), e.copy() )
 			)
 
 			self.__file_autosave()
 			self.tree.select(iter)
-			self.statusbar.set_status("Entry added")
+			self.statusbar.set_status(_(u'Entry added'))
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Add entry cancelled")
+			self.statusbar.set_status(_(u'Add entry cancelled'))
 
 
 	def entry_edit(self, iter):
 			e = self.entrystore.get_entry(iter)
 
 			if type(e) == entry.FolderEntry:
-				d = dialog.FolderEdit(self, "Edit Folder", e)
+				d = dialog.FolderEdit(self, _(u'Edit Folder'), e)
 
 			else:
-				d = dialog.EntryEdit(self, "Edit Entry", e, self.config, self.clipboard)
+				d = dialog.EntryEdit(self, _(u'Edit Entry'), e, self.config, self.clipboard)
 				d.set_fieldwidget_data(entry.UsernameField, self.__get_common_usernames(e))
 
 
 			self.tree.select(iter)
 
 			self.undoqueue.add_action(
-				"Update entry", self.__cb_undo_edit, self.__cb_redo_edit,
+				_(u'Update entry'), self.__cb_undo_edit, self.__cb_redo_edit,
 				( self.entrystore.get_path(iter), e.copy(), n.copy() )
 			)
 
 			self.__file_autosave()
-			self.statusbar.set_status("Entry updated")
+			self.statusbar.set_status(_(u'Entry updated'))
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Edit entry cancelled")
+			self.statusbar.set_status(_(u'Edit entry cancelled'))
 
 
 	def entry_find(self):
 
 		try:
 			if e == None:
-				e = dialog.FolderEdit(self, "Add Folder").run()
+				e = dialog.FolderEdit(self, _(u'Add Folder')).run()
 
 			iter = self.entrystore.add_entry(e, parent, sibling)
 
 			self.undoqueue.add_action(
-				"Add folder", self.__cb_undo_add, self.__cb_redo_add,
+				_(u'Add folder'), self.__cb_undo_add, self.__cb_redo_add,
 				( self.entrystore.get_path(iter), e.copy() )
 			)
 
 			self.__file_autosave()
 			self.tree.select(iter)
-			self.statusbar.set_status("Folder added")
+			self.statusbar.set_status(_(u'Folder added'))
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Add folder cancelled")
+			self.statusbar.set_status(_(u'Add folder cancelled'))
 
 
 	def entry_goto(self, iters):
 				command = self.config.get("launcher/%s" % e.id)
 
 				if command in ( "", None ):
-					self.statusbar.set_status("No goto command found for " + e.typename + " entries")
+					self.statusbar.set_status(_(u'No goto command found for %s entries') % e.typename)
 					return
 
 				subst = {}
 				command = util.parse_subst(command, subst)
 				util.execute_child(command)
 
-				self.statusbar.set_status("Entry opened")
+				self.statusbar.set_status(_(u'Entry opened'))
 
 			except ( util.SubstFormatError, config.ConfigError ):
-				dialog.Error(self, "Invalid goto command format", "The goto command for '" + e.typename + "' entries is invalid, please correct this in the preferences.").run()
+				dialog.Error(self, _(u'Invalid goto command format'), _(u'The goto command for \'%s\' entries is invalid, please correct it in the preferences.') % e.typename).run()
 
 			except util.SubstValueError:
-				dialog.Error(self, "Missing entry data", "The entry '" + e.name + "' does not have all the data required to go to it.").run()
+				dialog.Error(self, _(u'Missing entry data'), _(u'The entry \'%s\' does not have all the data required to open it.') % e.name).run()
 
 
 	def entry_move(self, sourceiters, parent = None, sibling = None):
 			newiters.append(newiter)
 
 		self.undoqueue.add_action(
-			"Move entry", self.__cb_undo_move, self.__cb_redo_move,
+			_(u'Move entry'), self.__cb_undo_move, self.__cb_redo_move,
 			undoactions
 		)
 
 			self.tree.select(newiters[0])
 
 		self.__file_autosave()
-		self.statusbar.set_status("Entries moved")
+		self.statusbar.set_status(_(u'Entries moved'))
 
 
 	def entry_remove(self, iters):
 				self.entrystore.remove_entry(iter)
 
 			self.undoqueue.add_action(
-				"Remove entry", self.__cb_undo_remove, self.__cb_redo_remove,
+				_(u'Remove entry'), self.__cb_undo_remove, self.__cb_redo_remove,
 				undoactions
 			)
 
 			self.tree.unselect_all()
 			self.__file_autosave()
-			self.statusbar.set_status("Entries removed")
+			self.statusbar.set_status(_(u'Entries removed'))
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Entry removal cancelled")
+			self.statusbar.set_status(_(u'Entry removal cancelled'))
 
 
 	def file_change_password(self, password = None):
 			self.entrystore.changed = True
 
 			self.__file_autosave()
-			self.statusbar.set_status("Password changed")
+			self.statusbar.set_status(_(u'Password changed'))
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Password change cancelled")
+			self.statusbar.set_status(_(u'Password change cancelled'))
 
 
 	def file_export(self):
 				password = None
 
 			datafile.save(self.entrystore, file, password)
-			self.statusbar.set_status("Data exported to %s" % datafile.get_file())
+			self.statusbar.set_status(_(u'Data exported to %s') % datafile.get_file())
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Export cancelled")
+			self.statusbar.set_status(_(u'Export cancelled'))
 
 		except IOError:
-			dialog.Error(self, "Unable to write to file", "The file '%s' could not be opened for writing. Make sure that you have the proper permissions to write to it." % file).run()
-			self.statusbar.set_status("Export failed")
+			dialog.Error(self, _(u'Unable to write to file'), _(u'The file \'%s\' could not be opened for writing. Make sure that you have the proper permissions to write to it.') % file).run()
+			self.statusbar.set_status(_(u'Export failed'))
 
 
 	def file_import(self):
 				paths = [ self.entrystore.get_path(iter) for iter in newiters ]
 
 				self.undoqueue.add_action(
-					"Import data", self.__cb_undo_import, self.__cb_redo_import,
+					_(u'Import data'), self.__cb_undo_import, self.__cb_redo_import,
 					( paths, entrystore )
 				)
 
-				self.statusbar.set_status("Data imported from %s" % datafile.get_file())
+				self.statusbar.set_status(_(u'Data imported from %s') % datafile.get_file())
 
 			self.__file_autosave()
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Import cancelled")
+			self.statusbar.set_status(_(u'Import cancelled'))
 
 
 	def file_lock(self):
 		# clear application contents
 		self.tree.set_model(None)
 		self.entryview.clear()
-		self.set_title("[Locked]")
-		self.statusbar.set_status("File locked")
+		self.set_title('[' + _(u'Locked') + ']')
+		self.statusbar.set_status(_(u'File locked'))
 
 		# hide any dialogs
 		for window in transients:
 			d = dialog.PasswordLock(self, password)
 
 			if self.entrystore.changed == True:
-				l = ui.ImageLabel("Quit disabled due to unsaved changes", ui.STOCK_WARNING)
+				l = ui.ImageLabel(_(u'Quit disabled due to unsaved changes'), ui.STOCK_WARNING)
 				d.contents.pack_start(l)
 				d.get_button(1).set_sensitive(False)
 
 		self.tree.set_model(self.entrystore)
 		self.tree.select(activeiter)
 		self.set_title(oldtitle)
-		self.statusbar.set_status("File unlocked")
+		self.statusbar.set_status(_(u'File unlocked'))
 
 		for window in transients:
 			window.show()
 			self.entrystore.clear()
 			self.datafile.close()
 			self.undoqueue.clear()
-			self.statusbar.set_status("New file created")
+			self.statusbar.set_status(_(u'New file created'))
 
 		except dialog.CancelError:
-			self.statusbar.set_status("New file cancelled")
+			self.statusbar.set_status(_(u'New file cancelled'))
 
 
 	def file_open(self, file = None, password = None):
 			self.entrystore.changed = False
 			self.undoqueue.clear()
 
-			self.statusbar.set_status("Opened file %s" % self.datafile.get_file())
+			self.statusbar.set_status(_(u'Opened file %s') % self.datafile.get_file())
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Open cancelled")
+			self.statusbar.set_status(_(u'Open cancelled'))
 
 
 	def file_save(self, file = None, password = None):
 
 			self.datafile.save(self.entrystore, file, password)
 			self.entrystore.changed = False
-			self.statusbar.set_status("Data saved to file %s" % file)
+			self.statusbar.set_status(_(u'Data saved to file %s') % file)
 
 			return True
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Save cancelled")
+			self.statusbar.set_status(_(u'Save cancelled'))
 			return False
 
 		except IOError:
-			dialog.Error(self, "Unable to save file", "The file '%s' could not be opened for writing. Make sure that you have the proper permissions to write to it." % file).run()
-			self.statusbar.set_status("Save failed")
+			dialog.Error(self, _(u'Unable to save file'), _(u'The file \'%s\' could not be opened for writing. Make sure that you have the proper permissions to write to it.') % file).run()
+			self.statusbar.set_status(_('Save failed'))
 			return False
 
 
 			return True
 
 		except dialog.CancelError:
-			self.statusbar.set_status("Quit cancelled")
+			self.statusbar.set_status(_(u'Quit cancelled'))
 			return False
 
 
 			return
 
 		self.undoqueue.redo()
-		self.statusbar.set_status("%s redone" % action[1])
+		self.statusbar.set_status(_(u'%s redone') % action[1])
 		self.__file_autosave()
 
 
 			return
 
 		self.undoqueue.undo()
-		self.statusbar.set_status("%s undone" % action[1])
+		self.statusbar.set_status(_(u'%s undone') % action[1])
 		self.__file_autosave()
 
 
 	"A preference dialog"
 
 	def __init__(self, parent, cfg):
-		dialog.Utility.__init__(self, parent, "Preferences")
+		dialog.Utility.__init__(self, parent, _(u'Preferences'))
 		self.config = cfg
 		self.set_modal(False)
 
 		self.notebook = ui.Notebook()
 		self.vbox.pack_start(self.notebook)
 
-		self.page_general = self.notebook.create_page("General")
+		self.page_general = self.notebook.create_page(_(u'General'))
 		self.__init_section_files(self.page_general)
 		self.__init_section_password(self.page_general)
 
-		self.page_interface = self.notebook.create_page("Interface")
+		self.page_interface = self.notebook.create_page(_(u'Interface'))
 		self.__init_section_doubleclick(self.page_interface)
 		self.__init_section_toolbar(self.page_interface)
 
-		self.page_gotocmd = self.notebook.create_page("Goto Commands")
+		self.page_gotocmd = self.notebook.create_page(_(u'Goto Commands'))
 		self.__init_section_gotocmd(self.page_gotocmd)
 
 		self.connect("response", lambda w,d: self.destroy())
 	def __init_section_doubleclick(self, page):
 		"Sets up the doubleclick section"
 
-		self.section_doubleclick = page.add_section("Doubleclick Action")
+		self.section_doubleclick = page.add_section(_(u'Doubleclick Action'))
 
 		# radio-button for go to
-		self.radio_doubleclick_goto = ui.RadioButton(None, "Go to account, if possible")
+		self.radio_doubleclick_goto = ui.RadioButton(None, _(u'Go to account, if possible'))
 		ui.config_bind(self.config, "behavior/doubleclick", self.radio_doubleclick_goto, "goto")
 
-		self.tooltips.set_tip(self.radio_doubleclick_goto, "Go to the account (open in external application) on doubleclick, if required data is filled in")
+		self.tooltips.set_tip(self.radio_doubleclick_goto, _(u'Go to the account (open in external application) on doubleclick, if required data is filled in'))
 		self.section_doubleclick.append_widget(None, self.radio_doubleclick_goto)
 
 		# radio-button for edit
-		self.radio_doubleclick_edit = ui.RadioButton(self.radio_doubleclick_goto, "Edit account")
+		self.radio_doubleclick_edit = ui.RadioButton(self.radio_doubleclick_goto, _(u'Edit account'))
 		ui.config_bind(self.config, "behavior/doubleclick", self.radio_doubleclick_edit, "edit")
 
-		self.tooltips.set_tip(self.radio_doubleclick_edit, "Edit the account on doubleclick")
+		self.tooltips.set_tip(self.radio_doubleclick_edit, _(u'Edit the account on doubleclick'))
 		self.section_doubleclick.append_widget(None, self.radio_doubleclick_edit)
 
 		# radio-button for copy
-		self.radio_doubleclick_copy = ui.RadioButton(self.radio_doubleclick_goto, "Copy password to clipboard")
+		self.radio_doubleclick_copy = ui.RadioButton(self.radio_doubleclick_goto, _(u'Copy password to clipboard'))
 		ui.config_bind(self.config, "behavior/doubleclick", self.radio_doubleclick_copy, "copy")
 
-		self.tooltips.set_tip(self.radio_doubleclick_copy, "Copy the account password to clipboard on doubleclick")
+		self.tooltips.set_tip(self.radio_doubleclick_copy, _(u'Copy the account password to clipboard on doubleclick'))
 		self.section_doubleclick.append_widget(None, self.radio_doubleclick_copy)
 
 
 	def __init_section_files(self, page):
 		"Sets up the files section"
 
-		self.section_files = page.add_section("Files")
+		self.section_files = page.add_section(_(u'Files'))
 
 		# checkbutton and file button for autoloading a file
-		self.check_autoload = ui.CheckButton("Open file on startup:")
+		self.check_autoload = ui.CheckButton(_(u'Open file on startup:'))
 		ui.config_bind(self.config, "file/autoload", self.check_autoload)
 
 		self.check_autoload.connect("toggled", lambda w: self.button_autoload_file.set_sensitive(w.get_active()))
-		self.tooltips.set_tip(self.check_autoload, "When enabled, this file will be opened when the program is started")
+		self.tooltips.set_tip(self.check_autoload, _(u'When enabled, this file will be opened when the program is started'))
 
-		self.button_autoload_file = ui.FileButton("Select File to Automatically Open")
+		self.button_autoload_file = ui.FileButton(_(u'Select File to Automatically Open'))
 		ui.config_bind(self.config, "file/autoload_file", self.button_autoload_file)
 		self.button_autoload_file.set_sensitive(self.check_autoload.get_active())
 
 		eventbox = ui.EventBox(self.button_autoload_file)
-		self.tooltips.set_tip(eventbox, "File to open when Revelation is started")
+		self.tooltips.set_tip(eventbox, _(u'File to open when Revelation is started'))
 
 		hbox = ui.HBox()
 		hbox.pack_start(self.check_autoload, False, False)
 		self.section_files.append_widget(None, hbox)
 
 		# check-button for autosave
-		self.check_autosave = ui.CheckButton("Automatically save data when changed")
+		self.check_autosave = ui.CheckButton(_(u'Automatically save data when changed'))
 		ui.config_bind(self.config, "file/autosave", self.check_autosave)
 
-		self.tooltips.set_tip(self.check_autosave, "Automatically save the data file when an entry is added, modified or removed")
+		self.tooltips.set_tip(self.check_autosave, _(u'Automatically save the data file when an entry is added, modified or removed'))
 		self.section_files.append_widget(None, self.check_autosave)
 
 		# autolock file
-		self.check_autolock = ui.CheckButton("Lock file when inactive for")
+		self.check_autolock = ui.CheckButton(_(u'Lock file when inactive for'))
 		ui.config_bind(self.config, "file/autolock", self.check_autolock)
 		self.check_autolock.connect("toggled", lambda w: self.spin_autolock_timeout.set_sensitive(w.get_active()))
-		self.tooltips.set_tip(self.check_autolock, "Automatically lock the data file after a period of inactivity")
+		self.tooltips.set_tip(self.check_autolock, _(u'Automatically lock the data file after a period of inactivity'))
 
 		self.spin_autolock_timeout = ui.SpinEntry()
 		self.spin_autolock_timeout.set_range(1, 120)
 		self.spin_autolock_timeout.set_sensitive(self.check_autolock.get_active())
 		ui.config_bind(self.config, "file/autolock_timeout", self.spin_autolock_timeout)
-		self.tooltips.set_tip(self.spin_autolock_timeout, "The period of inactivity before locking the file, in minutes")
+		self.tooltips.set_tip(self.spin_autolock_timeout, _(u'The period of inactivity before locking the file, in minutes'))
 
 		hbox = ui.HBox()
 		hbox.set_spacing(3)
 		hbox.pack_start(self.check_autolock, False, False)
 		hbox.pack_start(self.spin_autolock_timeout, False, False)
-		hbox.pack_start(ui.Label("minutes"))
+		hbox.pack_start(ui.Label(_(u'minutes')))
 		self.section_files.append_widget(None, hbox)
 
 
 	def __init_section_gotocmd(self, page):
 		"Sets up the goto command section"
 
-		self.section_gotocmd = page.add_section("Goto Commands")
+		self.section_gotocmd = page.add_section(_(u'Goto Commands'))
 
 		for entrytype in entry.ENTRYLIST:
 			if entrytype == entry.FolderEntry:
 			widget = ui.Entry()
 			ui.config_bind(self.config, "launcher/%s" % e.id, widget)
 
-			tooltip = "Goto command for %s accounts. The following expansion variables can be used:\n\n" % e.typename
+			tooltip = _(u'Goto command for %s accounts. The following expansion variables can be used:') % e.typename + "\n\n"
 
 			for field in e.fields:
 				tooltip += "%%%s: %s\n" % ( field.symbol, field.name )
 
 			tooltip += "\n"
-			tooltip += "%%: a % sign\n"
-			tooltip += "%?x: optional expansion variable\n"
-			tooltip += "%(...%): optional substring expansion"
+			tooltip += _(u'%%: a % sign') + "\n"
+			tooltip += _(u'%?x: optional expansion variable') + "\n"
+			tooltip += _(u'%(...%): optional substring expansion')
 
 			self.tooltips.set_tip(widget, tooltip)
 			self.section_gotocmd.append_widget(e.typename, widget)
 	def __init_section_password(self, page):
 		"Sets up the password section"
 
-		self.section_password = page.add_section("Passwords")
+		self.section_password = page.add_section(_(u'Passwords'))
 
 		# show passwords checkbutton
-		self.check_show_passwords = ui.CheckButton("Display passwords and other secrets")
+		self.check_show_passwords = ui.CheckButton(_(u'Display passwords and other secrets'))
 		ui.config_bind(self.config, "view/passwords", self.check_show_passwords)
 
-		self.tooltips.set_tip(self.check_show_passwords, "Display passwords and other secrets, such as PIN codes (otherwise, hide with ******)")
+		self.tooltips.set_tip(self.check_show_passwords, _(u'Display passwords and other secrets, such as PIN codes (otherwise, hide with ******)'))
 		self.section_password.append_widget(None, self.check_show_passwords)
 
 		# chain username checkbutton
-		self.check_chain_username = ui.CheckButton("Also copy username when copying password")
+		self.check_chain_username = ui.CheckButton(_(u'Also copy username when copying password'))
 		ui.config_bind(self.config, "clipboard/chain_username", self.check_chain_username)
 
-		self.tooltips.set_tip(self.check_chain_username, "When the password is copied to clipboard, put the username before the password as a clipboard \"chain\"")
+		self.tooltips.set_tip(self.check_chain_username, _(u'When the password is copied to clipboard, put the username before the password as a clipboard "chain"'))
 		self.section_password.append_widget(None, self.check_chain_username)
 
 		# password length spinbutton
 		self.spin_pwlen.set_range(4, 32)
 		ui.config_bind(self.config, "passwordgen/length", self.spin_pwlen)
 
-		self.tooltips.set_tip(self.spin_pwlen, "The number of characters in generated passwords - 8 or more are recommended")
-		self.section_password.append_widget("Length of generated passwords", self.spin_pwlen)
+		self.tooltips.set_tip(self.spin_pwlen, _(u'The number of characters in generated passwords - 8 or more are recommended'))
+		self.section_password.append_widget(_(u'Length of generated passwords'), self.spin_pwlen)
 
 
 	def __init_section_toolbar(self, page):
 		"Sets up the toolbar section"
 
-		self.section_toolbar = page.add_section("Toolbar Style")
+		self.section_toolbar = page.add_section(_(u'Toolbar Style'))
 
 		# radio-button for desktop default
-		self.radio_toolbar_desktop = ui.RadioButton(None, "Use desktop default")
+		self.radio_toolbar_desktop = ui.RadioButton(None, _(u'Use desktop default'))
 		ui.config_bind(self.config, "view/toolbar_style", self.radio_toolbar_desktop, "desktop")
 
-		self.tooltips.set_tip(self.radio_toolbar_desktop, "Show toolbar items with default style")
+		self.tooltips.set_tip(self.radio_toolbar_desktop, _(u'Show toolbar items with default style'))
 		self.section_toolbar.append_widget(None, self.radio_toolbar_desktop)
 
 		# radio-button for icons and text
-		self.radio_toolbar_both = ui.RadioButton(self.radio_toolbar_desktop, "Show icons and text")
+		self.radio_toolbar_both = ui.RadioButton(self.radio_toolbar_desktop, _(u'Show icons and text'))
 		ui.config_bind(self.config, "view/toolbar_style", self.radio_toolbar_both, "both")
 
-		self.tooltips.set_tip(self.radio_toolbar_both, "Show toolbar items with both icons and text")
+		self.tooltips.set_tip(self.radio_toolbar_both, _(u'Show toolbar items with both icons and text'))
 		self.section_toolbar.append_widget(None, self.radio_toolbar_both)
 
 		# radio-button for icons and important text
-		self.radio_toolbar_bothhoriz = ui.RadioButton(self.radio_toolbar_desktop, "Show icons and important text")
+		self.radio_toolbar_bothhoriz = ui.RadioButton(self.radio_toolbar_desktop, _(u'Show icons and important text'))
 		ui.config_bind(self.config, "view/toolbar_style", self.radio_toolbar_bothhoriz, "both-horiz")
 
-		self.tooltips.set_tip(self.radio_toolbar_bothhoriz, "Show toolbar items with text beside important icons")
+		self.tooltips.set_tip(self.radio_toolbar_bothhoriz, _(u'Show toolbar items with text beside important icons'))
 		self.section_toolbar.append_widget(None, self.radio_toolbar_bothhoriz)
 
 		# radio-button for icons only
-		self.radio_toolbar_icons = ui.RadioButton(self.radio_toolbar_desktop, "Show icons only")
+		self.radio_toolbar_icons = ui.RadioButton(self.radio_toolbar_desktop, _(u'Show icons only'))
 		ui.config_bind(self.config, "view/toolbar_style", self.radio_toolbar_icons, "icons")
 
-		self.tooltips.set_tip(self.radio_toolbar_icons, "Show toolbar items with icons only")
+		self.tooltips.set_tip(self.radio_toolbar_icons, _(u'Show toolbar items with icons only'))
 		self.section_toolbar.append_widget(None, self.radio_toolbar_icons)
 
 		# radio-button for text only
-		self.radio_toolbar_text = ui.RadioButton(self.radio_toolbar_desktop, "Show text only")
+		self.radio_toolbar_text = ui.RadioButton(self.radio_toolbar_desktop, _(u'Show text only'))
 		ui.config_bind(self.config, "view/toolbar_style", self.radio_toolbar_text, "text")
 
-		self.tooltips.set_tip(self.radio_toolbar_text, "Show toolbar items with text only")
+		self.tooltips.set_tip(self.radio_toolbar_text, _(u'Show toolbar items with text only'))
 		self.section_toolbar.append_widget(None, self.radio_toolbar_text)