From 8fe46a012d17eaa874abf63b9be93c6f11b8df97 Mon Sep 17 00:00:00 2001 From: necoro <> Date: Sun, 5 Aug 2007 04:11:46 +0000 Subject: i18n support and german translations --- createpot.sh | 9 + i18n/de_DE.po | 637 +++++++++++++++++++++++++++++++++++ i18n/messages.pot | 623 ++++++++++++++++++++++++++++++++++ pocompile.sh | 11 + portato.py | 31 +- portato/backend/flags.py | 3 +- portato/backend/portage/package.py | 3 +- portato/backend/portage/system.py | 7 +- portato/config_parser.py | 3 +- portato/constants.py | 3 + portato/gui/gtk/dialogs.py | 17 +- portato/gui/gtk/uncaughtException.py | 12 +- portato/gui/gtk/windows.py | 72 ++-- portato/gui/gtk/wrapper.py | 7 +- portato/gui/gui_helper.py | 2 +- portato/helper.py | 3 + portato/plugin.py | 25 +- portato/plugins/etc_proposals.py | 7 +- portato/plugins/resume_loop.py | 3 +- 19 files changed, 1391 insertions(+), 87 deletions(-) create mode 100755 createpot.sh create mode 100644 i18n/de_DE.po create mode 100644 i18n/messages.pot create mode 100755 pocompile.sh diff --git a/createpot.sh b/createpot.sh new file mode 100755 index 0000000..8c73f76 --- /dev/null +++ b/createpot.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# Create the .pot file +# Thanks to porthole for inspiration ;) + +files=$(find -name "*.py") +xgettext -k_ -kN_ -L glade -o i18n/messages.pot portato/gui/templates/portato.glade +xgettext -k_ -kN_ -j --from-code=UTF-8 -o i18n/messages.pot $files + diff --git a/i18n/de_DE.po b/i18n/de_DE.po new file mode 100644 index 0000000..f3abf91 --- /dev/null +++ b/i18n/de_DE.po @@ -0,0 +1,637 @@ +msgid "" +msgstr "" +"Project-Id-Version: Portato\n" +"POT-Creation-Date: \n" +"PO-Revision-Date: 2007-08-04 22:09-0800\n" +"Last-Translator: René 'Necoro' Neumann \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Poedit-Language: German\n" +"X-Poedit-Country: GERMANY\n" +"X-Poedit-SourceCharset: utf-8\n" + +#: portato/gui/templates/portato.glade:20 +msgid "_File" +msgstr "_Datei" + +#: portato/gui/templates/portato.glade:28 +msgid "_Preferences" +msgstr "_Einstellungen" + +#: portato/gui/templates/portato.glade:46 +msgid "Re_load Portage" +msgstr "Aktua_lisiere Portage-Cache" + +#: portato/gui/templates/portato.glade:68 +#: portato/gui/templates/portato.glade:1575 +msgid "gtk-quit" +msgstr "" + +#: portato/gui/templates/portato.glade:81 +#: portato/gui/templates/portato.glade:514 +msgid "_Emerge" +msgstr "_Emerge" + +#: portato/gui/templates/portato.glade:89 +#: portato/gui/templates/portato.glade:719 +#: portato/gui/gtk/windows.py:764 +msgid "E_merge" +msgstr "E_merge" + +#: portato/gui/templates/portato.glade:104 +#: portato/gui/templates/portato.glade:523 +#: portato/gui/templates/portato.glade:728 +msgid "_Unmerge" +msgstr "_Unmerge" + +#: portato/gui/templates/portato.glade:118 +#: portato/gui/templates/portato.glade:740 +msgid "Update _World" +msgstr "Update _World" + +#: portato/gui/templates/portato.glade:127 +msgid "Show Updatable P_ackages" +msgstr "Zeige Pakete mit _Updates" + +#: portato/gui/templates/portato.glade:140 +msgid "_Sync" +msgstr "_Sync" + +#: portato/gui/templates/portato.glade:155 +msgid "Save _Flags" +msgstr "Speichere _Flags" + +#: portato/gui/templates/portato.glade:176 +#: portato/gui/templates/portato.glade:269 +#: portato/gui/templates/portato.glade:1550 +msgid "Emerge _Paused" +msgstr "Emerge _angehalten" + +#: portato/gui/templates/portato.glade:183 +#: portato/gui/templates/portato.glade:251 +#: portato/gui/templates/portato.glade:1557 +msgid "_Kill Emerge" +msgstr "_Kill Emerge" + +#: portato/gui/templates/portato.glade:206 +msgid "_Queue" +msgstr "_Queue" + +#: portato/gui/templates/portato.glade:214 +msgid "Oneshot" +msgstr "Oneshot" + +#: portato/gui/templates/portato.glade:226 +msgid "_Console" +msgstr "_Konsole" + +#: portato/gui/templates/portato.glade:234 +msgid "_Copy" +msgstr "_Kopieren" + +#: portato/gui/templates/portato.glade:280 +#: portato/gui/templates/portato.glade:318 +msgid "_Plugins" +msgstr "_Plugins" + +#: portato/gui/templates/portato.glade:292 +msgid "_?" +msgstr "_?" + +#: portato/gui/templates/portato.glade:300 +msgid "_About" +msgstr "_Über" + +#: portato/gui/templates/portato.glade:334 +msgid "Show _Log" +msgstr "Zeige _Log" + +#: portato/gui/templates/portato.glade:364 +msgid "gtk-find" +msgstr "" + +#: portato/gui/templates/portato.glade:461 +msgid "Installed" +msgstr "Installiert" + +#: portato/gui/templates/portato.glade:474 +#: portato/gui/gtk/windows.py:741 +#: portato/gui/gtk/windows.py:744 +#: portato/gui/gtk/windows.py:747 +#: portato/gui/gtk/windows.py:852 +#: portato/gui/gtk/windows.py:855 +#: portato/gui/gtk/windows.py:862 +#: portato/gui/gtk/windows.py:866 +msgid "Masked" +msgstr "Masked" + +#: portato/gui/templates/portato.glade:488 +#: portato/gui/gtk/windows.py:754 +#: portato/gui/gtk/windows.py:757 +#: portato/gui/gtk/windows.py:824 +#: portato/gui/gtk/windows.py:829 +msgid "Testing" +msgstr "Testing" + +#: portato/gui/templates/portato.glade:535 +msgid "Re_vert" +msgstr "_Wiederherstellen" + +#: portato/gui/templates/portato.glade:547 +msgid "E_build" +msgstr "E_build" + +#: portato/gui/templates/portato.glade:568 +msgid "MISSING KEYWORD" +msgstr "FEHLENDES KEYWORD" + +#: portato/gui/templates/portato.glade:647 +msgid "Installed, but not in portage anymore" +msgstr "Installiert, aber nicht mehr im Portage-Tree vorhanden" + +#: portato/gui/templates/portato.glade:682 +#: portato/gui/gtk/windows.py:201 +msgid "Package" +msgstr "Paket" + +#: portato/gui/templates/portato.glade:752 +msgid "_Remove" +msgstr "_Löschen" + +#: portato/gui/templates/portato.glade:777 +#: portato/gui/gtk/windows.py:1067 +msgid "Queue" +msgstr "Queue" + +#: portato/gui/templates/portato.glade:805 +#: portato/gui/gtk/windows.py:1164 +msgid "Console" +msgstr "Konsole" + +#: portato/gui/templates/portato.glade:835 +msgid "Portato - A Portage GUI" +msgstr "Portato - A Portage GUI" + +#: portato/gui/templates/portato.glade:852 +msgid "Search" +msgstr "Suchen" + +#: portato/gui/templates/portato.glade:892 +#: portato/gui/templates/portato.glade:1502 +#: portato/gui/templates/portato.glade:1706 +msgid "gtk-cancel" +msgstr "" + +#: portato/gui/templates/portato.glade:904 +msgid "gtk-jump-to" +msgstr "" + +#: portato/gui/templates/portato.glade:919 +msgid "gtk-ok" +msgstr "" + +#: portato/gui/templates/portato.glade:940 +msgid "Preferences" +msgstr "Einstellungen" + +#: portato/gui/templates/portato.glade:975 +msgid "Debug" +msgstr "Debug" + +#: portato/gui/templates/portato.glade:988 +msgid "Browser command: " +msgstr "Browser-Befehl: " + +#: portato/gui/templates/portato.glade:1014 +msgid "General Options" +msgstr "Allgemeine Optionen" + +#: portato/gui/templates/portato.glade:1037 +msgid "--deep" +msgstr "--deep" + +#: portato/gui/templates/portato.glade:1048 +msgid "--newuse" +msgstr "--newuse" + +#: portato/gui/templates/portato.glade:1064 +msgid "Update World Options" +msgstr "Optionen für \"update world\"" + +#: portato/gui/templates/portato.glade:1092 +msgid "Sync command: " +msgstr "Sync-Befehl: " + +#: portato/gui/templates/portato.glade:1113 +msgid "Sync Options" +msgstr "Sync Optionen" + +#: portato/gui/templates/portato.glade:1154 +msgid "Masking Keywords" +msgstr "Masking Keywords" + +#: portato/gui/templates/portato.glade:1169 +msgid "Testing Keywords" +msgstr "Testing Keywords" + +#: portato/gui/templates/portato.glade:1184 +msgid "Use-Flags" +msgstr "Use-Flags" + +#: portato/gui/templates/portato.glade:1206 +msgid "" +"You may use the following placeholders:\n" +"\n" +"$(cat): category\n" +"$(pkg): package name\n" +"$(cat-1)/$(cat-2): first/second part of the category" +msgstr "" +"Die folgenden Platzhalter stehen zur Verfügung:\n" +"\n" +"$(cat): Kategorie\n" +"$(pkg): Paketname\n" +"$(cat-1)/$(cat-2): erster/zweiter Teil der Kategorie" + +#: portato/gui/templates/portato.glade:1230 +msgid "Add only exact version to package.mask/package.unmask" +msgstr "Füge nur die exakte Paketversion zu package.mask/package.unmask hinzu" + +#: portato/gui/templates/portato.glade:1244 +msgid "File name to use, if package.mask/package.unmask is a directory: " +msgstr "Zu benutzender Dateiname, wenn package.mask/package.unmask ein Verzeichnis ist:" + +#: portato/gui/templates/portato.glade:1278 +msgid "File name to use, if package.keywords is a directory: " +msgstr "Zu benutzender Dateiname, wenn package.keywords ein Verzeichnis ist:" + +#: portato/gui/templates/portato.glade:1289 +msgid "Add only exact version to package.keywords" +msgstr "Füge nur die exakte Paketversion zu package.keywords hinzu" + +#: portato/gui/templates/portato.glade:1302 +msgid "Add only exact version to package.use" +msgstr "Füge nur die exakte Paketversion zu package.keywords hinzu" + +#: portato/gui/templates/portato.glade:1316 +msgid "File name to use, if package.use is a directory: " +msgstr "Zu benutzender Dateiname, wenn package.use ein Verzeichnis ist:" + +#: portato/gui/templates/portato.glade:1342 +msgid "Use Flag and Keyword Options" +msgstr "Use-Flag- und Keyword-Optionen" + +#: portato/gui/templates/portato.glade:1363 +msgid "General" +msgstr "Allgemein" + +#: portato/gui/templates/portato.glade:1387 +msgid "Show emerge progress in title - similar to the console tab" +msgstr "Zeige den Emerge Prozess im Fenstertitel (wie im Konsolen-Tab)" + +#: portato/gui/templates/portato.glade:1398 +msgid "Turn Use-Tips on" +msgstr "Aktiviere Use-Tips" + +#: portato/gui/templates/portato.glade:1412 +msgid "Enable systray" +msgstr "Aktiviere Systray" + +#: portato/gui/templates/portato.glade:1426 +msgid "Hide on minimization (only if systray is enabled)" +msgstr "Minimiere zu Systray" + +#: portato/gui/templates/portato.glade:1445 +msgid "Console Font" +msgstr "Schriftart in Konsole" + +#: portato/gui/templates/portato.glade:1455 +msgid "Chose a console font" +msgstr "Wähle eine Schriftart" + +#: portato/gui/templates/portato.glade:1483 +msgid "Visual" +msgstr "Oberfläche" + +#: portato/gui/templates/portato.glade:1511 +#: portato/gui/templates/portato.glade:1718 +msgid "gtk-apply" +msgstr "" + +#: portato/gui/templates/portato.glade:1584 +msgid "Updateble Packages" +msgstr "Pakete mit Updates" + +#: portato/gui/templates/portato.glade:1619 +msgid "_Close" +msgstr "_Schließen" + +#: portato/gui/templates/portato.glade:1631 +msgid "Select _All" +msgstr "_Alles auswählen" + +#: portato/gui/templates/portato.glade:1646 +msgid "_Install Selected" +msgstr "_Installiere ausgewählte" + +#: portato/gui/templates/portato.glade:1667 +msgid "Plugins" +msgstr "Plugins" + +#: portato/gui/templates/portato.glade:1739 +msgid "About Portato" +msgstr "Portato" + +#: portato/gui/templates/portato.glade:1749 +msgid "" +"This software is licensed under the terms of the GPLv2.\n" +"Copyright (C) 2006-2007 René 'Necoro' Neumann " +msgstr "" +"This software is licensed under the terms of the GPLv2.\n" +"Copyright (C) 2006-2007 René 'Necoro' Neumann " + +#: portato/gui/templates/portato.glade:1751 +msgid "A Portage GUI" +msgstr "A Portage GUI" + +#: portato/gui/templates/portato.glade:1782 +msgid "Logging Output" +msgstr "Logs" + +#: portato/plugins/resume_loop.py:30 +msgid "Resume-loop called while process is still running!" +msgstr "\"Resume-Loop\" aufgerufen, während Emerge noch lief. Bug!" + +#: portato/plugins/etc_proposals.py:64 +#: portato/plugins/etc_proposals.py:76 +msgid "Cannot start etc-proposals. No graphical frontend installed!" +msgstr "Kann etc-proposals nicht starten. Kein grafisches Frontend installiert." + +#: portato/plugins/etc_proposals.py:78 +msgid "Cannot start etc-proposals. Not root!" +msgstr "Kann etc-proposals nicht starten. Nur root kann das!" + +#: portato/gui/gtk/windows.py:146 +msgid "Plugin" +msgstr "Plugin" + +#: portato/gui/gtk/windows.py:149 +msgid "Authors" +msgstr "Entwickler" + +#: portato/gui/gtk/windows.py:154 +#: portato/gui/gtk/windows.py:200 +#: portato/gui/gtk/windows.py:615 +msgid "Enabled" +msgstr "Aktiviert" + +#: portato/gui/gtk/windows.py:299 +msgid "Results" +msgstr "Ergebnisse" + +#: portato/gui/gtk/windows.py:568 +msgid "" +msgstr "" + +#: portato/gui/gtk/windows.py:597 +msgid "This is an expanded use flag and cannot be selected" +msgstr "Dies ist ein \"Expanded Use Flag\" und kann daher nicht ausgewählt werden." + +#: portato/gui/gtk/windows.py:616 +msgid "Flags" +msgstr "Flags" + +#: portato/gui/gtk/windows.py:617 +msgid "Description" +msgstr "Beschreibung" + +#: portato/gui/gtk/windows.py:696 +#, python-format +msgid "Package could not be found: %s" +msgstr "Paket konnte nicht gefunden werden: %s" + +#: portato/gui/gtk/windows.py:767 +msgid "Re_merge" +msgstr "Re_merge" + +#: portato/gui/gtk/windows.py:1070 +msgid "Options" +msgstr "Optionen" + +#: portato/gui/gtk/windows.py:1088 +msgid "Categories" +msgstr "Kategorien" + +#: portato/gui/gtk/windows.py:1103 +msgid "Packages" +msgstr "Pakete" + +#: portato/gui/gtk/windows.py:1166 +#, python-format +msgid "Console (%(title)s)" +msgstr "Konsole (%(title)s)" + +#: portato/gui/gtk/uncaughtException.py:28 +msgid "A programming error has been detected during the execution of this program." +msgstr "Ein Fehler ist aufgetreten." + +#: portato/gui/gtk/uncaughtException.py:29 +msgid "Bug Detected" +msgstr "Fehler aufgetreten" + +#: portato/gui/gtk/uncaughtException.py:30 +msgid "It probably isn't fatal, but should be reported to the developers nonetheless." +msgstr "Dies ist möglicherweise nicht kritisch, sollte aber trotzdem an die Entwickler weitergeleitet werden." + +#: portato/gui/gtk/uncaughtException.py:32 +msgid "Show Details" +msgstr "Details" + +#: portato/gui/gtk/uncaughtException.py:79 +#, python-format +msgid "" +"An uncaught exception has occured:\n" +"%s" +msgstr "" +"An uncaught exception has occured:\n" +"%s" + +#: portato/gui/gtk/wrapper.py:36 +msgid "oneshot" +msgstr "oneshot" + +#: portato/gui/gtk/wrapper.py:41 +#, python-format +msgid "updating from version %s" +msgstr "Update von Version %s" + +#: portato/gui/gtk/wrapper.py:43 +msgid "updating" +msgstr "Update" + +#: portato/gui/gtk/dialogs.py:17 +msgid "" +"There are some packages in the emerge queue and/or an emerge process is running.\n" +"Do you really want to quit?" +msgstr "" +"Es sind noch Pakete in der Emerge-Queue und/oder emerge läuft noch.\n" +"Wirklich beenden?" + +#: portato/gui/gtk/dialogs.py:33 +#, python-format +msgid "" +"%(blocked)s is blocked by %(blocks)s.\n" +"Please unmerge the blocking package." +msgstr "" +"%(blocks)s blockiert %(blocked)s.\n" +"Bitte deinstalliere das blockierende Paket." + +#: portato/gui/gtk/dialogs.py:45 +#, python-format +msgid "" +"%s seems to be masked.\n" +"Do you want to unmask it and its dependencies?" +msgstr "" +"%s scheint maskiert zu sein.\n" +"Soll das Paket und seine Abhängigkeiten demaskiert werden?" + +#: portato/gui/gtk/dialogs.py:51 +msgid "Package not found!" +msgstr "Paket nicht gefunden!" + +#: portato/gui/gtk/dialogs.py:58 +#, python-format +msgid "You have changed %s. Portato will write these changes into the appropriate files. Please backup them if you think it is necessairy." +msgstr "Du hast %s geändert. Portato wird diese Änderungen speichern. Bitte sichere die Dateien, wenn du es als notwendig erachtest." + +#: portato/gui/gtk/dialogs.py:64 +msgid "You cannot remove dependencies. :)" +msgstr "Du kannst keine Abhängigkeiten löschen ;)." + +#: portato/gui/gtk/dialogs.py:70 +msgid "Do you really want to clear the whole queue?" +msgstr "Wirklich die gesamte Queue löschen?" + +#: portato/gui/gui_helper.py:239 +#, python-format +msgid "Catched KeyError => %s seems not to be an available category. Have you played with rsync-excludes?" +msgstr "Catched KeyError => %s scheint keine valide Kategorie zu sein. Hast du mit rsync-excludes gespielt?" + +#: portato/backend/portage/package.py:93 +#, python-format +msgid "BUG in flags.new_masking_status. It returns '%s'" +msgstr "BUG in flags.new_masking_status. Es gibt '%s' zurück." + +#: portato/backend/portage/system.py:286 +#, python-format +msgid "No best match for %s. It seems not to be in the tree anymore." +msgstr "Es konnte kein bester Treffer für das Paket %s gefunden werden. Es scheint sich nicht mehr im Tree zu befinden." + +#: portato/backend/portage/system.py:343 +#, python-format +msgid "Found a not installed dependency: %s." +msgstr "Nicht installierte Abhängigkeit gefunden: %s" + +#: portato/backend/portage/system.py:383 +#, python-format +msgid "Bug? No best match could be found for '%(package)s'. Needed by: '%(cpv)s'." +msgstr "Es konnte kein bester Treffer für das Paket '%(package)s' ermittelt werden (gebraucht von '%(cpv)s'). Bug?" + +#: portato/backend/flags.py:482 +#, python-format +msgid "Conflicting values for masking status: %s" +msgstr "Konflikt beim Masking-Status: %s" + +#: portato/config_parser.py:211 +#, python-format +msgid "Unrecognized line in configuration: %s" +msgstr "Unbekannte Zeile in Konfiguration: %s" + +#: portato/plugin.py:287 +#: portato/plugin.py:293 +#: portato/plugin.py:298 +#, python-format +msgid "%s cannot be imported." +msgstr "%s kann nicht importiert werden." + +#: portato/plugin.py:325 +#, python-format +msgid "Accessing hook '%(hook)s' of plugin '%(plugin)s' (before)." +msgstr "Zugriff auf den Hook '%(hook)s' vom Plugin '%(plugin)s'. (before)" + +#: portato/plugin.py:329 +#, python-format +msgid "Overriding hook '%(hook)s' with plugin '%(plugin)s'." +msgstr "Überschreibe den Hook '%(hook)s' mit Plugin '%(plugin)s'." + +#: portato/plugin.py:336 +#, python-format +msgid "Accessing hook '%(hook)s' of plugin '%(plugin)s' (after)." +msgstr "Zugriff auf den Hook '%(hook)s' vom Plugin '%(plugin)s'. (after)" + +#: portato/plugin.py:356 +#, python-format +msgid "Loading plugin '%s' failed. Invalid XML syntax." +msgstr "Laden des Plugins '%s\" fehlgeschlagen: XML-Syntax-Fehler." + +#: portato/plugin.py:359 +#, python-format +msgid "Loading plugin '%s' failed. Plugin does not comply with schema." +msgstr "Laden des Plugins '%s\" fehlgeschlagen. Plugin erfüllt nicht das XML-Schema." + +#: portato/plugin.py:388 +#, python-format +msgid "Plugin '%s' loaded." +msgstr "Plugin '%s' geladen." + +#: portato/plugin.py:391 +#, python-format +msgid "Loading plugin '%(plugin)s' failed: Could not import %(import)s" +msgstr "Laden des Plugins '%(plugin)s\" fehlgeschlagen. Konnte '%(import)s' nicht importieren." + +#: portato/plugin.py:456 +#, python-format +msgid "For hook '%(hook)s' an override is already defined by plugin '%(plugin)s'!" +msgstr "Das Plugin '%(plugin)s' definiert bereits einen \"Override\" fürr den Hook '%(hook)s'!" + +#: portato.py:38 +msgid "runs pychecker (should only be used by developers)" +msgstr "Startet \"pychecker\". (Nur Entwickler sollten dies brauchen)." + +#: portato.py:41 +#, python-format +msgid "the frontend to use - possible values are: %s [default: %%default]" +msgstr "Das zu benutzende Frontend. Möglichkeiten: %s [Default: %%default" + +#: portato.py:44 +msgid "opens the ebuild viewer instead of launching Portato" +msgstr "Öffnet den Ebuild Viewer anstatt Portato zu starten" + +#: portato.py:47 +msgid "validates the given plugin xml instead of launching Portato" +msgstr "Validiert die gegebene Plugin-XML. Startet nicht Portato." + +#: portato.py:60 +#, python-format +msgid "Unknown frontend '%(frontend)s'. Correct frontends are: %(list)s" +msgstr "Unbekanntest Frontend '%(frontend)s'. Erlaubte Frontends sind: %(list)s" + +#: portato.py:68 +#, python-format +msgid "'%(frontend)s' should be installed, but cannot be imported. This is definitly a bug. (%(error)s)" +msgstr "'%(frontend)s' sollte installiert sein, aber das Einbinden schlug fehl. Das ist definitiv ein Bug. (%(error)s)" + +#: portato.py:78 +#, python-format +msgid "Verification failed. XML syntax error: %s." +msgstr "Verifikation fehlgeschlagen. XML Syntax Fehler: %s." + +#: portato.py:81 +msgid "Verification failed. Does not comply with schema." +msgstr "Verifkation gegen das Schema fehlgeschlagen." + +#: portato.py:84 +msgid "Verification succeeded." +msgstr "Verifikation erfolgreich." + diff --git a/i18n/messages.pot b/i18n/messages.pot new file mode 100644 index 0000000..42463bc --- /dev/null +++ b/i18n/messages.pot @@ -0,0 +1,623 @@ +# 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 , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2007-08-04 21:44-0700\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: portato/gui/templates/portato.glade:20 +msgid "_File" +msgstr "" + +#: portato/gui/templates/portato.glade:28 +msgid "_Preferences" +msgstr "" + +#: portato/gui/templates/portato.glade:46 +msgid "Re_load Portage" +msgstr "" + +#: portato/gui/templates/portato.glade:68 +#: portato/gui/templates/portato.glade:1575 +msgid "gtk-quit" +msgstr "" + +#: portato/gui/templates/portato.glade:81 +#: portato/gui/templates/portato.glade:514 +msgid "_Emerge" +msgstr "" + +#: portato/gui/templates/portato.glade:89 +#: portato/gui/templates/portato.glade:719 portato/gui/gtk/windows.py:764 +msgid "E_merge" +msgstr "" + +#: portato/gui/templates/portato.glade:104 +#: portato/gui/templates/portato.glade:523 +#: portato/gui/templates/portato.glade:728 +msgid "_Unmerge" +msgstr "" + +#: portato/gui/templates/portato.glade:118 +#: portato/gui/templates/portato.glade:740 +msgid "Update _World" +msgstr "" + +#: portato/gui/templates/portato.glade:127 +msgid "Show Updatable P_ackages" +msgstr "" + +#: portato/gui/templates/portato.glade:140 +msgid "_Sync" +msgstr "" + +#: portato/gui/templates/portato.glade:155 +msgid "Save _Flags" +msgstr "" + +#: portato/gui/templates/portato.glade:176 +#: portato/gui/templates/portato.glade:269 +#: portato/gui/templates/portato.glade:1550 +msgid "Emerge _Paused" +msgstr "" + +#: portato/gui/templates/portato.glade:183 +#: portato/gui/templates/portato.glade:251 +#: portato/gui/templates/portato.glade:1557 +msgid "_Kill Emerge" +msgstr "" + +#: portato/gui/templates/portato.glade:206 +msgid "_Queue" +msgstr "" + +#: portato/gui/templates/portato.glade:214 +msgid "Oneshot" +msgstr "" + +#: portato/gui/templates/portato.glade:226 +msgid "_Console" +msgstr "" + +#: portato/gui/templates/portato.glade:234 +msgid "_Copy" +msgstr "" + +#: portato/gui/templates/portato.glade:280 +#: portato/gui/templates/portato.glade:318 +msgid "_Plugins" +msgstr "" + +#: portato/gui/templates/portato.glade:292 +msgid "_?" +msgstr "" + +#: portato/gui/templates/portato.glade:300 +msgid "_About" +msgstr "" + +#: portato/gui/templates/portato.glade:334 +msgid "Show _Log" +msgstr "" + +#: portato/gui/templates/portato.glade:364 +msgid "gtk-find" +msgstr "" + +#: portato/gui/templates/portato.glade:461 +msgid "Installed" +msgstr "" + +#: portato/gui/templates/portato.glade:474 portato/gui/gtk/windows.py:741 +#: portato/gui/gtk/windows.py:744 portato/gui/gtk/windows.py:747 +#: portato/gui/gtk/windows.py:852 portato/gui/gtk/windows.py:855 +#: portato/gui/gtk/windows.py:862 portato/gui/gtk/windows.py:866 +msgid "Masked" +msgstr "" + +#: portato/gui/templates/portato.glade:488 portato/gui/gtk/windows.py:754 +#: portato/gui/gtk/windows.py:757 portato/gui/gtk/windows.py:824 +#: portato/gui/gtk/windows.py:829 +msgid "Testing" +msgstr "" + +#: portato/gui/templates/portato.glade:535 +msgid "Re_vert" +msgstr "" + +#: portato/gui/templates/portato.glade:547 +msgid "E_build" +msgstr "" + +#: portato/gui/templates/portato.glade:568 +msgid "MISSING KEYWORD" +msgstr "" + +#: portato/gui/templates/portato.glade:647 +msgid "Installed, but not in portage anymore" +msgstr "" + +#: portato/gui/templates/portato.glade:682 portato/gui/gtk/windows.py:201 +msgid "Package" +msgstr "" + +#: portato/gui/templates/portato.glade:752 +msgid "_Remove" +msgstr "" + +#: portato/gui/templates/portato.glade:777 portato/gui/gtk/windows.py:1067 +msgid "Queue" +msgstr "" + +#: portato/gui/templates/portato.glade:805 portato/gui/gtk/windows.py:1164 +msgid "Console" +msgstr "" + +#: portato/gui/templates/portato.glade:835 +msgid "Portato - A Portage GUI" +msgstr "" + +#: portato/gui/templates/portato.glade:852 +msgid "Search" +msgstr "" + +#: portato/gui/templates/portato.glade:892 +#: portato/gui/templates/portato.glade:1502 +#: portato/gui/templates/portato.glade:1706 +msgid "gtk-cancel" +msgstr "" + +#: portato/gui/templates/portato.glade:904 +msgid "gtk-jump-to" +msgstr "" + +#: portato/gui/templates/portato.glade:919 +msgid "gtk-ok" +msgstr "" + +#: portato/gui/templates/portato.glade:940 +msgid "Preferences" +msgstr "" + +#: portato/gui/templates/portato.glade:975 +msgid "Debug" +msgstr "" + +#: portato/gui/templates/portato.glade:988 +msgid "Browser command: " +msgstr "" + +#: portato/gui/templates/portato.glade:1014 +msgid "General Options" +msgstr "" + +#: portato/gui/templates/portato.glade:1037 +msgid "--deep" +msgstr "" + +#: portato/gui/templates/portato.glade:1048 +msgid "--newuse" +msgstr "" + +#: portato/gui/templates/portato.glade:1064 +msgid "Update World Options" +msgstr "" + +#: portato/gui/templates/portato.glade:1092 +msgid "Sync command: " +msgstr "" + +#: portato/gui/templates/portato.glade:1113 +msgid "Sync Options" +msgstr "" + +#: portato/gui/templates/portato.glade:1154 +msgid "Masking Keywords" +msgstr "" + +#: portato/gui/templates/portato.glade:1169 +msgid "Testing Keywords" +msgstr "" + +#: portato/gui/templates/portato.glade:1184 +msgid "Use-Flags" +msgstr "" + +#: portato/gui/templates/portato.glade:1206 +msgid "" +"You may use the following placeholders:\n" +"\n" +"$(cat): category\n" +"$(pkg): package name\n" +"$(cat-1)/$(cat-2): first/second part of the category" +msgstr "" + +#: portato/gui/templates/portato.glade:1230 +msgid "Add only exact version to package.mask/package.unmask" +msgstr "" + +#: portato/gui/templates/portato.glade:1244 +msgid "File name to use, if package.mask/package.unmask is a directory: " +msgstr "" + +#: portato/gui/templates/portato.glade:1278 +msgid "File name to use, if package.keywords is a directory: " +msgstr "" + +#: portato/gui/templates/portato.glade:1289 +msgid "Add only exact version to package.keywords" +msgstr "" + +#: portato/gui/templates/portato.glade:1302 +msgid "Add only exact version to package.use" +msgstr "" + +#: portato/gui/templates/portato.glade:1316 +msgid "File name to use, if package.use is a directory: " +msgstr "" + +#: portato/gui/templates/portato.glade:1342 +msgid "Use Flag and Keyword Options" +msgstr "" + +#: portato/gui/templates/portato.glade:1363 +msgid "General" +msgstr "" + +#: portato/gui/templates/portato.glade:1387 +msgid "Show emerge progress in title - similar to the console tab" +msgstr "" + +#: portato/gui/templates/portato.glade:1398 +msgid "Turn Use-Tips on" +msgstr "" + +#: portato/gui/templates/portato.glade:1412 +msgid "Enable systray" +msgstr "" + +#: portato/gui/templates/portato.glade:1426 +msgid "Hide on minimization (only if systray is enabled)" +msgstr "" + +#: portato/gui/templates/portato.glade:1445 +msgid "Console Font" +msgstr "" + +#: portato/gui/templates/portato.glade:1455 +msgid "Chose a console font" +msgstr "" + +#: portato/gui/templates/portato.glade:1483 +msgid "Visual" +msgstr "" + +#: portato/gui/templates/portato.glade:1511 +#: portato/gui/templates/portato.glade:1718 +msgid "gtk-apply" +msgstr "" + +#: portato/gui/templates/portato.glade:1584 +msgid "Updateble Packages" +msgstr "" + +#: portato/gui/templates/portato.glade:1619 +msgid "_Close" +msgstr "" + +#: portato/gui/templates/portato.glade:1631 +msgid "Select _All" +msgstr "" + +#: portato/gui/templates/portato.glade:1646 +msgid "_Install Selected" +msgstr "" + +#: portato/gui/templates/portato.glade:1667 +msgid "Plugins" +msgstr "" + +#: portato/gui/templates/portato.glade:1739 +msgid "About Portato" +msgstr "" + +#: portato/gui/templates/portato.glade:1749 +msgid "" +"This software is licensed under the terms of the GPLv2.\n" +"Copyright (C) 2006-2007 René 'Necoro' Neumann " +msgstr "" + +#: portato/gui/templates/portato.glade:1751 +msgid "A Portage GUI" +msgstr "" + +#: portato/gui/templates/portato.glade:1782 +msgid "Logging Output" +msgstr "" + +#: portato/plugins/resume_loop.py:30 +msgid "Resume-loop called while process is still running!" +msgstr "" + +#: portato/plugins/etc_proposals.py:64 portato/plugins/etc_proposals.py:76 +msgid "Cannot start etc-proposals. No graphical frontend installed!" +msgstr "" + +#: portato/plugins/etc_proposals.py:78 +msgid "Cannot start etc-proposals. Not root!" +msgstr "" + +#: portato/gui/gtk/windows.py:146 +msgid "Plugin" +msgstr "" + +#: portato/gui/gtk/windows.py:149 +msgid "Authors" +msgstr "" + +#: portato/gui/gtk/windows.py:154 portato/gui/gtk/windows.py:200 +#: portato/gui/gtk/windows.py:615 +msgid "Enabled" +msgstr "" + +#: portato/gui/gtk/windows.py:299 +msgid "Results" +msgstr "" + +#: portato/gui/gtk/windows.py:568 +msgid "" +msgstr "" + +#: portato/gui/gtk/windows.py:597 +msgid "This is an expanded use flag and cannot be selected" +msgstr "" + +#: portato/gui/gtk/windows.py:616 +msgid "Flags" +msgstr "" + +#: portato/gui/gtk/windows.py:617 +msgid "Description" +msgstr "" + +#: portato/gui/gtk/windows.py:696 +#, python-format +msgid "Package could not be found: %s" +msgstr "" + +#: portato/gui/gtk/windows.py:767 +msgid "Re_merge" +msgstr "" + +#: portato/gui/gtk/windows.py:1070 +msgid "Options" +msgstr "" + +#: portato/gui/gtk/windows.py:1088 +msgid "Categories" +msgstr "" + +#: portato/gui/gtk/windows.py:1103 +msgid "Packages" +msgstr "" + +#: portato/gui/gtk/windows.py:1166 +#, python-format +msgid "Console (%(title)s)" +msgstr "" + +#: portato/gui/gtk/uncaughtException.py:28 +msgid "" +"A programming error has been detected during the execution of this program." +msgstr "" + +#: portato/gui/gtk/uncaughtException.py:29 +msgid "Bug Detected" +msgstr "" + +#: portato/gui/gtk/uncaughtException.py:30 +msgid "" +"It probably isn't fatal, but should be reported to the developers " +"nonetheless." +msgstr "" + +#: portato/gui/gtk/uncaughtException.py:32 +msgid "Show Details" +msgstr "" + +#: portato/gui/gtk/uncaughtException.py:79 +#, python-format +msgid "" +"An uncaught exception has occured:\n" +"%s" +msgstr "" + +#: portato/gui/gtk/wrapper.py:36 +msgid "oneshot" +msgstr "" + +#: portato/gui/gtk/wrapper.py:41 +#, python-format +msgid "updating from version %s" +msgstr "" + +#: portato/gui/gtk/wrapper.py:43 +msgid "updating" +msgstr "" + +#: portato/gui/gtk/dialogs.py:17 +msgid "" +"There are some packages in the emerge queue and/or an emerge process is " +"running.\n" +"Do you really want to quit?" +msgstr "" + +#: portato/gui/gtk/dialogs.py:33 +#, python-format +msgid "" +"%(blocked)s is blocked by %(blocks)s.\n" +"Please unmerge the blocking package." +msgstr "" + +#: portato/gui/gtk/dialogs.py:45 +#, python-format +msgid "" +"%s seems to be masked.\n" +"Do you want to unmask it and its dependencies?" +msgstr "" + +#: portato/gui/gtk/dialogs.py:51 +msgid "Package not found!" +msgstr "" + +#: portato/gui/gtk/dialogs.py:58 +#, python-format +msgid "" +"You have changed %s. Portato will write these changes into the appropriate " +"files. Please backup them if you think it is necessairy." +msgstr "" + +#: portato/gui/gtk/dialogs.py:64 +msgid "You cannot remove dependencies. :)" +msgstr "" + +#: portato/gui/gtk/dialogs.py:70 +msgid "Do you really want to clear the whole queue?" +msgstr "" + +#: portato/gui/gui_helper.py:239 +#, python-format +msgid "" +"Catched KeyError => %s seems not to be an available category. Have you " +"played with rsync-excludes?" +msgstr "" + +#: portato/backend/portage/package.py:93 +#, python-format +msgid "BUG in flags.new_masking_status. It returns '%s'" +msgstr "" + +#: portato/backend/portage/system.py:286 +#, python-format +msgid "No best match for %s. It seems not to be in the tree anymore." +msgstr "" + +#: portato/backend/portage/system.py:343 +#, python-format +msgid "Found a not installed dependency: %s." +msgstr "" + +#: portato/backend/portage/system.py:383 +#, python-format +msgid "" +"Bug? No best match could be found for '%(package)s'. Needed by: '%(cpv)s'." +msgstr "" + +#: portato/backend/flags.py:482 +#, python-format +msgid "Conflicting values for masking status: %s" +msgstr "" + +#: portato/config_parser.py:211 +#, python-format +msgid "Unrecognized line in configuration: %s" +msgstr "" + +#: portato/plugin.py:287 portato/plugin.py:293 portato/plugin.py:298 +#, python-format +msgid "%s cannot be imported." +msgstr "" + +#: portato/plugin.py:325 +#, python-format +msgid "Accessing hook '%(hook)s' of plugin '%(plugin)s' (before)." +msgstr "" + +#: portato/plugin.py:329 +#, python-format +msgid "Overriding hook '%(hook)s' with plugin '%(plugin)s'." +msgstr "" + +#: portato/plugin.py:336 +#, python-format +msgid "Accessing hook '%(hook)s' of plugin '%(plugin)s' (after)." +msgstr "" + +#: portato/plugin.py:356 +#, python-format +msgid "Loading plugin '%s' failed. Invalid XML syntax." +msgstr "" + +#: portato/plugin.py:359 +#, python-format +msgid "Loading plugin '%s' failed. Plugin does not comply with schema." +msgstr "" + +#: portato/plugin.py:388 +#, python-format +msgid "Plugin '%s' loaded." +msgstr "" + +#: portato/plugin.py:391 +#, python-format +msgid "Loading plugin '%(plugin)s' failed: Could not import %(import)s" +msgstr "" + +#: portato/plugin.py:456 +#, python-format +msgid "" +"For hook '%(hook)s' an override is already defined by plugin '%(plugin)s'!" +msgstr "" + +#: portato.py:38 +msgid "runs pychecker (should only be used by developers)" +msgstr "" + +#: portato.py:41 +#, python-format +msgid "the frontend to use - possible values are: %s [default: %%default]" +msgstr "" + +#: portato.py:44 +msgid "opens the ebuild viewer instead of launching Portato" +msgstr "" + +#: portato.py:47 +msgid "validates the given plugin xml instead of launching Portato" +msgstr "" + +#: portato.py:60 +#, python-format +msgid "Unknown frontend '%(frontend)s'. Correct frontends are: %(list)s" +msgstr "" + +#: portato.py:68 +#, python-format +msgid "" +"'%(frontend)s' should be installed, but cannot be imported. This is " +"definitly a bug. (%(error)s)" +msgstr "" + +#: portato.py:78 +#, python-format +msgid "Verification failed. XML syntax error: %s." +msgstr "" + +#: portato.py:81 +msgid "Verification failed. Does not comply with schema." +msgstr "" + +#: portato.py:84 +msgid "Verification succeeded." +msgstr "" diff --git a/pocompile.sh b/pocompile.sh new file mode 100755 index 0000000..b895b9a --- /dev/null +++ b/pocompile.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# Helper script to compile all .po files in the i18n directroy into .mo files. + +# Copied from porthole :) +cd i18n +for ITEM in *.po; do + ITEM2=${ITEM/.po/} + LANG=${ITEM2/_??/} + mkdir ${LANG}/LC_MESSAGES -p + msgfmt ${ITEM} -o ${LANG}/LC_MESSAGES/portato.mo +done diff --git a/portato.py b/portato.py index 736d2f3..603e23d 100755 --- a/portato.py +++ b/portato.py @@ -12,47 +12,52 @@ # # Written by René 'Necoro' Neumann -from portato.constants import VERSION, FRONTENDS, STD_FRONTEND, XSD_LOCATION +from portato.constants import VERSION, FRONTENDS, STD_FRONTEND, XSD_LOCATION, LOCALE_DIR, APP from optparse import OptionParser -import sys +import sys, os +import gettext, locale def get_frontend_list (): return ", ".join(["'%s'" % x for x in FRONTENDS]) def main (): + # set gettext stuff + locale.setlocale(locale.LC_ALL, '') + gettext.bindtextdomain(APP, LOCALE_DIR) + gettext.textdomain(APP) + _ = gettext.lgettext # build the parser - desc = """Portato - A Portage GUI.""" + desc = "Portato - A Portage GUI." usage = "%prog [options] [frontend]" vers = "%%prog v. %s" % VERSION parser = OptionParser(version = vers, prog = "Portato", description = desc, usage = usage) parser.add_option("--check", action = "store_true", dest = "check", default = False, - help = "runs pychecker (should only be used by developers)") + help = _("runs pychecker (should only be used by developers)")) parser.add_option("-f", "--frontend", action = "store", choices = FRONTENDS, default = STD_FRONTEND, dest = "frontend", - help = "the frontend to use - possible values are: %s [default: %%default]" % get_frontend_list()) + help = _("the frontend to use - possible values are: %s [default: %%default]") % get_frontend_list()) parser.add_option("-e", "--ebuild", action = "store", dest = "ebuild", - help = "opens the ebuild viewer instead of launching Portato") + help = _("opens the ebuild viewer instead of launching Portato")) parser.add_option("-x", "--validate", action = "store", dest = "validate", metavar="PLUGIN", - help = "validates the given plugin xml instead of launching Portato") + help = _("validates the given plugin xml instead of launching Portato")) # run parser (options, args) = parser.parse_args() # evaluate parser's results if options.check: # run pychecker - import os os.environ['PYCHECKER'] = "--limit 50" import pychecker.checker if len(args): # additional arguments overwrite given frontend arg = args[0] if arg not in FRONTENDS: - print "Unknown frontend '%s'. Correct frontends are: %s" % (arg, get_frontend_list()) + print _("Unknown frontend '%(frontend)s'. Correct frontends are: %(list)s") % {"frontend": arg, "list": get_frontend_list()} sys.exit(2) else: options.frontend = arg @@ -60,7 +65,7 @@ def main (): try: exec ("from portato.gui.%s import run, show_ebuild" % options.frontend) except ImportError, e: - print "'%s' should be installed, but cannot be imported. This is definitly a bug. (%s)" % (options.frontend, e[0]) + print _("'%(frontend)s' should be installed, but cannot be imported. This is definitly a bug. (%(error)s)") % {"frontend": options.frontend, "error": e[0]} sys.exit(1) if options.ebuild: @@ -70,13 +75,13 @@ def main (): try: etree.XMLSchema(file = XSD_LOCATION).assertValid(etree.parse(options.validate)) except etree.XMLSyntaxError, e: - print "Verification failed. XML syntax error: %s." % e[0] + print _("Verification failed. XML syntax error: %s.") % e[0] sys.exit(3) except etree.DocumentInvalid: - print "Verification failed. Does not comply with schema." + print _("Verification failed. Does not comply with schema.") sys.exit(3) else: - print "Verification succeeded." + print _("Verification succeeded.") return else: run() diff --git a/portato/backend/flags.py b/portato/backend/flags.py index 6c2a159..dd1e462 100644 --- a/portato/backend/flags.py +++ b/portato/backend/flags.py @@ -13,6 +13,7 @@ import os import os.path from subprocess import Popen, PIPE # needed for grep +from gettext import lgettext as _ from portato.helper import * from portato.backend import system @@ -478,7 +479,7 @@ def new_masking_status (cpv): for file, line in list[cpv]: _ret = (int(line) == -1) if ret is not None and _ret != ret: - error("Conflicting values for masking status: %s", list) + error(_("Conflicting values for masking status: %s"), list) else: ret = _ret return ret diff --git a/portato/backend/portage/package.py b/portato/backend/portage/package.py index a1bf433..7ab1713 100644 --- a/portato/backend/portage/package.py +++ b/portato/backend/portage/package.py @@ -18,6 +18,7 @@ import portage, portage_dep from portage_util import unique_array import os.path +from gettext import lgettext as _ class PortagePackage (Package): """This is a class abstracting a normal package which can be installed for the portage-system.""" @@ -89,7 +90,7 @@ class PortagePackage (Package): if status == "masked": return True elif status == "unmasked": return False else: - error("BUG in flags.new_masking_status. It returns \'%s\'", status) + error(_("BUG in flags.new_masking_status. It returns \'%s\'"), status) else: # we have not touched the status if self._status and ("profile" in self._status or "package.mask" in self._status): return True diff --git a/portato/backend/portage/system.py b/portato/backend/portage/system.py index 44ac404..bf1b821 100644 --- a/portato/backend/portage/system.py +++ b/portato/backend/portage/system.py @@ -12,6 +12,7 @@ import re, os import types +from gettext import lgettext as _ import portage import package @@ -282,7 +283,7 @@ class PortageSystem (SystemInterface): best_p = self.find_best_match(p) if best_p is None: - warning("No best match for %s. It seems not to be in the tree anymore." % p) + warning(_("No best match for %s. It seems not to be in the tree anymore.") % p) continue if len(inst) > 1: @@ -339,7 +340,7 @@ class PortageSystem (SystemInterface): oldList = self.sort_package_list(self.find_installed_packages(p.get_cp())) if not oldList: if add_not_installed: - info("Found a not installed dependency: %s." % p.get_cpv()) + info(_("Found a not installed dependency: %s.") % p.get_cpv()) oldList = [p] else: return @@ -379,7 +380,7 @@ class PortageSystem (SystemInterface): raw_checked.append(i) bm = self.get_new_packages([i]) if not bm: - warning("Bug? No best match could be found for '%s'. Needed by: '%s'.", i, p.get_cpv()) + warning(_("Bug? No best match could be found for '%(package)s'. Needed by: '%(cpv)s'."), {"package" : i, "cpv": p.get_cpv()}) else: for pkg in bm: if not pkg: continue diff --git a/portato/config_parser.py b/portato/config_parser.py index 32e0518..8555fc0 100644 --- a/portato/config_parser.py +++ b/portato/config_parser.py @@ -31,6 +31,7 @@ Currently supported are the values (case insensitive): false, 0, off, falsch, ne """ from helper import debug +from gettext import lgettext as _ import re import types @@ -207,7 +208,7 @@ class ConfigParser: self.vars[section][key] = Value(val, count, bool = bool) self.pos[count] = match.span(2) else: # neither comment nor empty nor expression nor section => error - error("Unrecognized line in configuration: %s", line) + error(_("Unrecognized line in configuration: %s"), line) def get (self, key, section = "MAIN"): """Returns the value of a given key in a section. diff --git a/portato/constants.py b/portato/constants.py index c17ee24..80e7452 100644 --- a/portato/constants.py +++ b/portato/constants.py @@ -39,6 +39,7 @@ These should be set during the installation. """ from os.path import join as pjoin +APP = "portato" VERSION = "9999" CONFIG_DIR = "/etc/portato/" @@ -53,5 +54,7 @@ XSD_LOCATION = pjoin(XSD_DIR, "plugin.xsd") ICON_DIR = "icons/" APP_ICON = pjoin(ICON_DIR, "portato-icon.png") +LOCALE_DIR = "i18n/" + FRONTENDS = ["gtk" ,"qt"] STD_FRONTEND = "gtk" diff --git a/portato/gui/gtk/dialogs.py b/portato/gui/gtk/dialogs.py index 24d1a20..4750bb2 100644 --- a/portato/gui/gtk/dialogs.py +++ b/portato/gui/gtk/dialogs.py @@ -11,9 +11,10 @@ # Written by René 'Necoro' Neumann import gtk +from gettext import lgettext as _ def queue_not_empty_dialog(): - dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, "There are some packages in the emerge queue and/or an emerge process is running.\nDo you really want to quit?") + dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_OK_CANCEL, _("There are some packages in the emerge queue and/or an emerge process is running.\nDo you really want to quit?")) ret = dialog.run() dialog.destroy() return ret @@ -29,44 +30,44 @@ def io_ex_dialog (io_ex): return ret def blocked_dialog (blocked, blocks): - dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, blocked+" is blocked by "+blocks+".\nPlease unmerge the blocking package.") + dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("%(blocked)s is blocked by %(blocks)s.\nPlease unmerge the blocking package.") % {"blocked":blocked, "blocks" : blocks}) ret = dialog.run() dialog.destroy() return ret def not_root_dialog (): - errorMB = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "You are not root.") + errorMB = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "_(You are not root.")) ret = errorMB.run() errorMB.destroy() return ret def unmask_dialog (cpv): - dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, cpv+" seems to be masked.\nDo you want to unmask it and its dependencies?") + dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, _("%s seems to be masked.\nDo you want to unmask it and its dependencies?") % cpv) ret = dialog.run() dialog.destroy() return ret def nothing_found_dialog (): - dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, "Package not found!") + dialog = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("Package not found!")) ret = dialog.run() dialog.destroy() return ret def changed_flags_dialog (what = "flags"): hintMB = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, - "You have changed %s. Portato will write these changes into the appropriate files. Please backup them if you think it is necessairy." % what) + _("You have changed %s. Portato will write these changes into the appropriate files. Please backup them if you think it is necessairy.") % what) ret = hintMB.run() hintMB.destroy() return ret def remove_deps_dialog (): - infoMB = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, "You cannot remove dependencies. :)") + infoMB = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("You cannot remove dependencies. :)")) ret = infoMB.run() infoMB.destroy() return ret def remove_queue_dialog (): - askMB = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, "Do you really want to clear the whole queue?") + askMB = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, _("Do you really want to clear the whole queue?")) ret = askMB.run() askMB.destroy() return ret diff --git a/portato/gui/gtk/uncaughtException.py b/portato/gui/gtk/uncaughtException.py index d8ea13d..04f1a6e 100644 --- a/portato/gui/gtk/uncaughtException.py +++ b/portato/gui/gtk/uncaughtException.py @@ -17,17 +17,19 @@ import sys import gtk, pango from StringIO import StringIO import traceback +from gettext import lgettext as _ + from portato.helper import error class UncaughExceptionDialog(gtk.MessageDialog): def __init__(self, type, value, tb): - super(UncaughExceptionDialog,self).__init__(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_NONE, message_format="A programming error has been detected during the execution of this program.") - self.set_title("Bug Detected") - self.format_secondary_text("It probably isn't fatal, but should be reported to the developers nonetheless.") + super(UncaughExceptionDialog,self).__init__(parent=None, flags=0, type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_NONE, message_format=_("A programming error has been detected during the execution of this program.")) + self.set_title(_("Bug Detected")) + self.format_secondary_text(_("It probably isn't fatal, but should be reported to the developers nonetheless.")) - self.add_button("Show Details", 1) + self.add_button(_("Show Details"), 1) self.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) # Details @@ -74,7 +76,7 @@ def get_trace(type, value, tb): def register_ex_handler(): def handler(*args): - error("An uncaught exception has occured: %s", get_trace(*args)) + error(_("An uncaught exception has occured:\n%s"), get_trace(*args)) UncaughExceptionDialog(*args).run() sys.excepthook = handler diff --git a/portato/gui/gtk/windows.py b/portato/gui/gtk/windows.py index 8cf9fb7..cc70122 100644 --- a/portato/gui/gtk/windows.py +++ b/portato/gui/gtk/windows.py @@ -12,14 +12,13 @@ # gtk stuff import pygtk -pygtk.require("2.0") import gtk import gtk.glade import gobject # our backend stuff from portato.helper import * -from portato.constants import CONFIG_LOCATION, VERSION, DATA_DIR, APP_ICON +from portato.constants import CONFIG_LOCATION, VERSION, DATA_DIR, APP_ICON, APP, LOCALE_DIR from portato.backend import flags, system from portato.backend.exceptions import * @@ -36,7 +35,10 @@ from usetips import UseTips import types, logging from subprocess import Popen from threading import Thread +from gettext import lgettext as _ +gtk.glade.bindtextdomain (APP, LOCALE_DIR) +gtk.glade.textdomain (APP) GLADE_FILE = DATA_DIR+"portato.glade" class Window: @@ -66,7 +68,7 @@ class Window: return wrapper def get_tree (self, name): - return gtk.glade.XML(GLADE_FILE, root = name) + return gtk.glade.XML(GLADE_FILE, name) class Popup: @@ -141,15 +143,15 @@ class PluginWindow (AbstractDialog): view.set_model(self.store) cell = gtk.CellRendererText() - col = gtk.TreeViewColumn("Plugin", cell, markup = 0) + col = gtk.TreeViewColumn(_("Plugin"), cell, markup = 0) view.append_column(col) - col = gtk.TreeViewColumn("Authors", cell, text = 1) + col = gtk.TreeViewColumn(_("Authors"), cell, text = 1) view.append_column(col) bcell = gtk.CellRendererToggle() bcell.connect("toggled", self.cb_plugin_toggled) - col = gtk.TreeViewColumn("Enabled", bcell, active = 2) + col = gtk.TreeViewColumn(_("Enabled"), bcell, active = 2) view.append_column(col) for p in [(""+p.name+"", p.author, p.is_enabled()) for p in plugins]: @@ -195,8 +197,8 @@ class UpdateWindow (AbstractDialog): tCell.set_property("activatable", True) tCell.connect("toggled", self.cb_check_toggled) # emulate the normal toggle behavior ... - self.view.append_column(gtk.TreeViewColumn("Enabled", tCell, active = 0)) - self.view.append_column(gtk.TreeViewColumn("Package", cell, text = 1)) + self.view.append_column(gtk.TreeViewColumn(_("Enabled"), tCell, active = 0)) + self.view.append_column(gtk.TreeViewColumn(_("Package"), cell, text = 1)) for p in self.packages: store.append([False, p.get_cpv()]) @@ -294,7 +296,7 @@ class SearchWindow (AbstractDialog): store.append(["%s/%s" % tuple(p.split("/"))]) cell = gtk.CellRendererText() - col = gtk.TreeViewColumn("Results", cell, markup = 0) + col = gtk.TreeViewColumn(_("Results"), cell, markup = 0) self.searchList.append_column(col) def ok (self, *args): @@ -563,7 +565,7 @@ class PackageTable: def set_desc_label (self): desc = self.actual_package().get_package_settings("DESCRIPTION").replace("&","&") if not desc: - desc = "" + desc = _("") use_markup = False else: desc = ""+desc+"" @@ -592,7 +594,7 @@ class PackageTable: exp = pkg.use_expanded(use, suggest = actual_exp) if exp is not None: if exp != actual_exp: - actual_exp_it = store.append(None, [None, exp, "This is an expanded use flag and cannot be selected"]) + actual_exp_it = store.append(None, [None, exp, "%s" % _("This is an expanded use flag and cannot be selected")]) actual_exp = exp else: actual_exp_it = None @@ -610,9 +612,9 @@ class PackageTable: tCell = gtk.CellRendererToggle() tCell.set_property("activatable", True) tCell.connect("toggled", self.cb_use_flag_toggled, store) - self.useList.append_column(gtk.TreeViewColumn("Enabled", tCell, active = 0)) - self.useList.append_column(gtk.TreeViewColumn("Flags", cell, text = 1)) - self.useList.append_column(gtk.TreeViewColumn("Description", cell, markup = 2)) + self.useList.append_column(gtk.TreeViewColumn(_("Enabled"), tCell, active = 0)) + self.useList.append_column(gtk.TreeViewColumn(_("Flags"), cell, text = 1)) + self.useList.append_column(gtk.TreeViewColumn(_("Description"), cell, markup = 2)) self.useList.set_search_column(1) self.useList.set_enable_tree_lines(True) @@ -627,7 +629,7 @@ class PackageTable: # build view self.versList.set_model(store) - col = gtk.TreeViewColumn("Versions") + col = gtk.TreeViewColumn(("Versions")) # adding the pixbuf cell = gtk.CellRendererPixbuf() @@ -691,7 +693,7 @@ class PackageTable: try: self.queue.append(self.actual_package().get_cpv(), unmerge = True) except PackageNotFoundException, e: - error("Package could not be found: %s", e[0]) + error(_("Package could not be found: %s"), e[0]) #masked_dialog(e[0]) def cb_vers_list_changed (self, *args): @@ -736,33 +738,33 @@ class PackageTable: gtk.Tooltips().set_tip(self.maskedCheck, pkg.get_masking_reason()) # this returns None if it is not masked =) if pkg.is_masked(use_changed = False) and not pkg.is_masked(use_changed = True): - self.maskedCheck.set_label("(Masked)") + self.maskedCheck.set_label("(%s)" % _("Masked")) self.maskedCheck.get_child().set_use_markup(True) else: - self.maskedCheck.set_label("Masked") + self.maskedCheck.set_label(_("Masked")) if pkg.is_locally_masked(): - self.maskedCheck.set_label("Masked") + self.maskedCheck.set_label("%s" % _("Masked")) self.maskedCheck.get_child().set_use_markup(True) self.maskedCheck.set_active(True) else: self.maskedCheck.set_active(pkg.is_masked(use_changed = False)) if pkg.is_testing(use_keywords = False) and not pkg.is_testing(use_keywords = True): - self.testingCheck.set_label("(Testing)") + self.testingCheck.set_label("(%s)" % _("Testing")) self.testingCheck.get_child().set_use_markup(True) else: - self.testingCheck.set_label("Testing") + self.testingCheck.set_label(_("Testing")) self.testingCheck.set_active(pkg.is_testing(use_keywords = False)) if self.doEmerge: # set emerge-button-label if not self.actual_package().is_installed(): - self.emergeBtn.set_label("E_merge") + self.emergeBtn.set_label(_("E_merge")) self.unmergeBtn.set_sensitive(False) else: - self.emergeBtn.set_label("Re_merge") + self.emergeBtn.set_label(_("Re_merge")) self.unmergeBtn.set_sensitive(True) self.table.show_all() @@ -819,12 +821,12 @@ class PackageTable: if not self.actual_package().is_testing(use_keywords = True): self.actual_package().set_testing(False) - button.set_label("Testing") + button.set_label(_("Testing")) button.set_active(True) else: self.actual_package().set_testing(True) if self.actual_package().is_testing(use_keywords=False): - button.set_label("(Testing)") + button.set_label("(%s)" % _("Testing")) button.get_child().set_use_markup(True) button.set_active(True) @@ -847,21 +849,21 @@ class PackageTable: if not pkg.is_masked(use_changed = True): pkg.set_masked(True) if pkg.is_locally_masked(): - button.set_label("Masked") + button.set_label("%s" % _("Masked")) button.get_child().set_use_markup(True) else: - button.set_label("Masked") + button.set_label(_("Masked")) button.set_active(True) else: locally = pkg.is_locally_masked() pkg.set_masked(False) if pkg.is_masked(use_changed=False) and not locally: - button.set_label("(Masked)") + button.set_label("(%s)" % _("Masked")) button.get_child().set_use_markup(True) button.set_active(True) else: - button.set_label("Masked") + button.set_label(_("Masked")) if self.instantChange: self._update_keywords(True, update = True) @@ -1062,10 +1064,10 @@ class MainWindow (Window): self.queueList.set_model(store) cell = gtk.CellRendererText() - col = gtk.TreeViewColumn("Queue", cell, text = 0) + col = gtk.TreeViewColumn(_("Queue"), cell, text = 0) self.queueList.append_column(col) - col = gtk.TreeViewColumn("Options", cell, markup = 1) + col = gtk.TreeViewColumn(_("Options"), cell, markup = 1) self.queueList.append_column(col) self.useTips.add_view(self.queueList) @@ -1083,7 +1085,7 @@ class MainWindow (Window): self.catList.set_model(store) cell = gtk.CellRendererText() - col = gtk.TreeViewColumn("Categories", cell, text = 0) + col = gtk.TreeViewColumn(_("Categories"), cell, text = 0) self.catList.append_column(col) def build_pkg_list (self, name = None): @@ -1098,7 +1100,7 @@ class MainWindow (Window): # build view self.pkgList.set_model(store) - col = gtk.TreeViewColumn("Packages") + col = gtk.TreeViewColumn(_("Packages")) col.set_clickable(True) col.connect("clicked", self.cb_pkg_list_header_clicked) @@ -1159,9 +1161,9 @@ class MainWindow (Window): window_title_update(title) if title is None: - title = "Console" + title = _("Console") else: - title = ("Console (%s)" % title) + title = (_("Console (%(title)s)") % {"title" : title}) return False diff --git a/portato/gui/gtk/wrapper.py b/portato/gui/gtk/wrapper.py index bce4e07..dd06fac 100644 --- a/portato/gui/gtk/wrapper.py +++ b/portato/gui/gtk/wrapper.py @@ -33,13 +33,14 @@ class GtkTree (Tree): string = "" if oneshot: - string += "oneshot" + string += "%s" % _("oneshot") if update: string += "; " if update: - string += "updating" if version is not None: - string += " from version %s" % version + string += "%s" % (_("updating from version %s") % version) + else: + string += "%s" % _("updating") return [cpv, string] diff --git a/portato/gui/gui_helper.py b/portato/gui/gui_helper.py index 5c26f58..062a5c3 100644 --- a/portato/gui/gui_helper.py +++ b/portato/gui/gui_helper.py @@ -236,7 +236,7 @@ class Database: return inst+ninst except KeyError: # cat is in category list - but not in portage - info("Catched KeyError => %s seems not to be an available category. Have you played with rsync-excludes?", cat) + info(_("Catched KeyError => %s seems not to be an available category. Have you played with rsync-excludes?"), cat) return [] def reload (self, cat): diff --git a/portato/helper.py b/portato/helper.py index d7a5366..abb91f9 100644 --- a/portato/helper.py +++ b/portato/helper.py @@ -22,6 +22,9 @@ warning = logging.getLogger("portatoLogger").warning error = logging.getLogger("portatoLogger").error critical = logging.getLogger("portatoLogger").critical +def N_ (s): + return s + def set_log_level (lvl): logging.getLogger("portatoLogger").setLevel(lvl) diff --git a/portato/plugin.py b/portato/plugin.py index ea11c3a..3b065b9 100644 --- a/portato/plugin.py +++ b/portato/plugin.py @@ -15,6 +15,7 @@ import os, os.path from xml.dom.minidom import parse from lxml import etree +from gettext import lgettext as _ from constants import PLUGIN_DIR, XSD_LOCATION from helper import * @@ -283,18 +284,18 @@ class PluginQueue: try: mod = __import__(imp, globals(), locals(), [cmd.hook.call]) except ImportError: - error("%s cannot be imported.", imp) + error(_("%s cannot be imported."), imp) return try: f = eval("mod."+cmd.hook.call) # build function except AttributeError: - error("%s cannot be imported.", cmd.hook.call) + error(_("%s cannot be imported."), cmd.hook.call) else: try: f = eval(cmd.hook.call) except AttributeError: - error("%s cannot be imported", cmd.hook.call) + error(_("%s cannot be imported."), cmd.hook.call) return f(*hargs, **hkwargs) # call function @@ -321,18 +322,18 @@ class PluginQueue: # before for cmd in list[0]: - debug("Accessing hook '%s' of plugin '%s' (before).", hook, cmd.hook.plugin.name) + debug(_("Accessing hook '%(hook)s' of plugin '%(plugin)s' (before)."), {"hook" : hook, "plugin": cmd.hook.plugin.name}) call(cmd) if list[1]: # override - info("Overriding hook '%s' with plugin '%s'.", hook, list[1][0].hook.plugin.name) + info(_("Overriding hook '%(hook)s' with plugin '%(plugin)s'."), {"hook": hook, "plugin": list[1][0].hook.plugin.name}) ret = call(list[1][0]) else: # normal ret = func(*args, **kwargs) # after for cmd in list[2]: - debug("Accessing hook '%s' of plugin '%s' (after).", hook, cmd.hook.plugin.name) + debug(_("Accessing hook '%(hook)s' of plugin '%(plugin)s' (after)."), {"hook":hook, "plugin": cmd.hook.plugin.name}) call(cmd) return ret @@ -352,10 +353,10 @@ class PluginQueue: try: schema.assertValid(etree.parse(p)) except etree.XMLSyntaxError: - error("Loading plugin '%s' failed. Invalid XML syntax.", p) + error(_("Loading plugin '%s' failed. Invalid XML syntax."), p) continue except etree.DocumentInvalid: - error("Loading plugin '%s' failed. Plugin does not comply with schema.", p) + error(_("Loading plugin '%s' failed. Plugin does not comply with schema."), p) continue doc = parse(p) @@ -384,10 +385,10 @@ class PluginQueue: plugin.parse_options(elem.getElementsByTagName("options")) self.list.append(plugin) - info("Plugin '%s' loaded.", p) + info(_("Plugin '%s' loaded."), p) except PluginImportException, e: - error("Loading plugin '%s' failed: Could not import %s", p, e[0]) + error(_("Loading plugin '%(plugin)s' failed: Could not import %(import)s"), {"plugin": p, "import": e[0]}) finally: doc.unlink() @@ -452,7 +453,7 @@ class PluginQueue: # type = "override" elif connect.is_override_type(): if self.hooks[hook.hook][1]: - warn("For hook '%s' an override is already defined by plugin '%s'!", hook.hook, self.hooks[hook.hook][1][0]) + warn(_("For hook '%(hook)s' an override is already defined by plugin '%(plugin)s'!"), {"hook": hook.hook, "plugin": self.hooks[hook.hook][1][0]}) self.hooks[hook.hook][1][:1] = [connect] continue @@ -483,7 +484,7 @@ class PluginQueue: resolve(hook, list, idx, add) for l in list: - warn("Command for hook '%s' in plugin '%s' could not be added due to missing dependant: '%s'!", hook, l.hook.plugin.name, l.depend_plugin) + warn("Command for hook '%(hook)s' in plugin '%(plugin)s' could not be added due to missing dependant: '%(dep)s'!", {"hook": hook, "plugin": l.hook.plugin.name, "dep": l.depend_plugin}) for hook in before: resolve(hook, before[hook], 0, 0) diff --git a/portato/plugins/etc_proposals.py b/portato/plugins/etc_proposals.py index e6c3187..81370e0 100644 --- a/portato/plugins/etc_proposals.py +++ b/portato/plugins/etc_proposals.py @@ -14,6 +14,7 @@ from portato.helper import * from portato.backend import system from subprocess import Popen +from gettext import lgettext as _ from etcproposals.etcproposals_lib import EtcProposals, __version__ try: @@ -60,7 +61,7 @@ def etc_prop (*args, **kwargs): if f: Popen([PROG, "--fastexit"]+f) else: - error("Cannot start etc-proposals. No graphical frontend installed!") + error(_("Cannot start etc-proposals. No graphical frontend installed!")) def etc_prop_menu (*args, **kwargs): if am_i_root(): @@ -72,6 +73,6 @@ def etc_prop_menu (*args, **kwargs): if f: Popen([PROG]+f) else: - error("Cannot start etc-proposals. No graphical frontend installed!") + error(_("Cannot start etc-proposals. No graphical frontend installed!")) else: - error("Cannot start etc-proposals. Not root!") + error(_("Cannot start etc-proposals. Not root!")) diff --git a/portato/plugins/resume_loop.py b/portato/plugins/resume_loop.py index b33f4c7..c4191a8 100644 --- a/portato/plugins/resume_loop.py +++ b/portato/plugins/resume_loop.py @@ -12,6 +12,7 @@ import pty, time from subproces