From aacfb61d3b20ebe0858177e87a6e2f7562f3b2a9 Mon Sep 17 00:00:00 2001 From: steffen123 Date: Sun, 15 Aug 2010 23:23:17 +0200 Subject: [PATCH 1/2] add missing gettext imports, gettextify TournamentTracker.py --- pyfpdb/Hand.py | 12 +++++++++++ pyfpdb/PokerStarsToFpdb.py | 12 +++++++++++ pyfpdb/TournamentTracker.py | 42 ++++++++++++++++++++++++------------- 3 files changed, 51 insertions(+), 15 deletions(-) diff --git a/pyfpdb/Hand.py b/pyfpdb/Hand.py index a5f73560..1d390378 100644 --- a/pyfpdb/Hand.py +++ b/pyfpdb/Hand.py @@ -28,6 +28,18 @@ import time,datetime from copy import deepcopy import pprint +import locale +lang=locale.getdefaultlocale()[0][0:2] +if lang=="en": + def _(string): return string +else: + import gettext + try: + trans = gettext.translation("fpdb", localedir="locale", languages=[lang]) + trans.install() + except IOError: + def _(string): return string + import logging # logging has been set up in fpdb.py or HUD_main.py, use their settings: log = logging.getLogger("parser") diff --git a/pyfpdb/PokerStarsToFpdb.py b/pyfpdb/PokerStarsToFpdb.py index f2978c89..58f47517 100644 --- a/pyfpdb/PokerStarsToFpdb.py +++ b/pyfpdb/PokerStarsToFpdb.py @@ -24,6 +24,18 @@ import sys from HandHistoryConverter import * from decimal import Decimal +import locale +lang=locale.getdefaultlocale()[0][0:2] +if lang=="en": + def _(string): return string +else: + import gettext + try: + trans = gettext.translation("fpdb", localedir="locale", languages=[lang]) + trans.install() + except IOError: + def _(string): return string + # PokerStars HH Format class PokerStars(HandHistoryConverter): diff --git a/pyfpdb/TournamentTracker.py b/pyfpdb/TournamentTracker.py index 1c8ee207..da7135b9 100644 --- a/pyfpdb/TournamentTracker.py +++ b/pyfpdb/TournamentTracker.py @@ -34,8 +34,20 @@ import traceback (options, argv) = Options.fpdb_options() +import locale +lang=locale.getdefaultlocale()[0][0:2] +if lang=="en": + def _(string): return string +else: + import gettext + try: + trans = gettext.translation("fpdb", localedir="locale", languages=[lang]) + trans.install() + except IOError: + def _(string): return string + if not options.errorsToConsole: - print "Note: error output is being diverted to fpdb-error-log.txt and HUD-error.txt. Any major error will be reported there _only_." + print _("Note: error output is being diverted to fpdb-error-log.txt and HUD-error.txt. Any major error will be reported there _only_.") errorFile = open('tourneyerror.txt', 'w', 0) sys.stderr = errorFile @@ -96,10 +108,10 @@ class Tournament: self.window.show() # isn't there a better way to bring something to the front? not that GTK focus works right anyway, ever else: self.window = gtk.Window(gtk.WINDOW_TOPLEVEL) - print "tournament edit window=", self.window + print _("tournament edit window="), self.window self.window.connect("delete_event", self.delete_event) self.window.connect("destroy", self.destroy) - self.window.set_title("FPDB Tournament Entry") + self.window.set_title(_("FPDB Tournament Entry")) self.window.set_border_width(1) self.window.set_default_size(480,640) self.window.set_resizable(True) @@ -139,14 +151,14 @@ class ttracker_main(object): self.main_window = gtk.Window() self.main_window.connect("destroy", self.destroy) self.vb = gtk.VBox() - self.label = gtk.Label('Closing this window will stop the Tournament Tracker') + self.label = gtk.Label(_('Closing this window will stop the Tournament Tracker')) self.vb.add(self.label) - self.addbutton = gtk.Button(label="Enter Tournament") + self.addbutton = gtk.Button(label=_("Enter Tournament")) self.addbutton.connect("clicked", self.addClicked, "add tournament") self.vb.add(self.addbutton) self.main_window.add(self.vb) - self.main_window.set_title("FPDB Tournament Tracker") + self.main_window.set_title(_("FPDB Tournament Tracker")) self.main_window.show_all() def addClicked(self, widget, data): # what is "data"? i'm guessing anything i pass in after the function name in connect() but unsure because the documentation sucks @@ -157,10 +169,10 @@ class ttracker_main(object): self.tourney_list.append(t) mylabel = gtk.Label("%s - %s - %s - %s - %s %s - %s - %s - %s - %s - %s" % (t.site, t.id, t.starttime, t.endtime, t.structure, t.game, t.buyin, t.fee, t.numrebuys, t.numplayers, t.prizepool)) print "new label=", mylabel - editbutton = gtk.Button(label="Edit") + editbutton = gtk.Button(label=_("Edit")) print "new button=", editbutton editbutton.connect("clicked", t.openwindow) - rebuybutton = gtk.Button(label="Rebuy") + rebuybutton = gtk.Button(label=_("Rebuy")) rebuybutton.connect("clicked", t.addrebuy) self.vb.add(rebuybutton) self.vb.add(editbutton) # These should probably be put in.. a.. h-box? i don't know.. @@ -259,9 +271,9 @@ class ttracker_main(object): cards['common'] = comm_cards['common'] except Exception, err: err = traceback.extract_tb(sys.exc_info()[2])[-1] - print "db error: skipping "+str(new_hand_id)+" "+err[2]+"("+str(err[1])+"): "+str(sys.exc_info()[1]) + print _("db error: skipping ")+str(new_hand_id)+" "+err[2]+"("+str(err[1])+"): "+str(sys.exc_info()[1]) if new_hand_id: # new_hand_id is none if we had an error prior to the store - sys.stderr.write("Database error %s in hand %d. Skipping.\n" % (err, int(new_hand_id))) + sys.stderr.write(_("Database error %s in hand %d. Skipping.\n") % (err, int(new_hand_id))) continue if type == "tour": # hand is from a tournament @@ -270,8 +282,8 @@ class ttracker_main(object): (tour_number, tab_number) = mat_obj.group(1, 2) temp_key = tour_number else: # tourney, but can't get number and table - print "could not find tournament: skipping " - sys.stderr.write("Could not find tournament %d in hand %d. Skipping.\n" % (int(tour_number), int(new_hand_id))) + print _("could not find tournament: skipping") + sys.stderr.write(_("Could not find tournament %d in hand %d. Skipping.\n") % (int(tour_number), int(new_hand_id))) continue else: @@ -294,15 +306,15 @@ class ttracker_main(object): # If no client window is found on the screen, complain and continue if type == "tour": table_name = "%s %s" % (tour_number, tab_number) - sys.stderr.write("table name "+table_name+" not found, skipping.\n") + sys.stderr.write(_("table name %s not found, skipping.\n")% table_name) else: self.create_HUD(new_hand_id, tablewindow, temp_key, max, poker_game, stat_dict, cards) self.db_connection.connection.rollback() if __name__== "__main__": - sys.stderr.write("tournament tracker starting\n") - sys.stderr.write("Using db name = %s\n" % (options.dbname)) + sys.stderr.write(_("tournament tracker starting\n")) + sys.stderr.write(_("Using db name = %s\n") % (options.dbname)) # start the HUD_main object hm = ttracker_main(db_name = options.dbname) From 027afaa5e10aca022755fa4232a371440c974979 Mon Sep 17 00:00:00 2001 From: steffen123 Date: Sun, 15 Aug 2010 23:28:22 +0200 Subject: [PATCH 2/2] change mo file creation script, add hungarian mo file --- pyfpdb/create-mo-files.sh | 2 +- pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo | Bin 0 -> 42792 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo diff --git a/pyfpdb/create-mo-files.sh b/pyfpdb/create-mo-files.sh index 85937036..2e76648b 100755 --- a/pyfpdb/create-mo-files.sh +++ b/pyfpdb/create-mo-files.sh @@ -1 +1 @@ -python /usr/share/doc/python-2.7/examples/Tools/i18n/msgfmt.py --output-file=locale/de_DE/LC_MESSAGES/fpdb.mo locale/fpdb-de_DE.po +python /usr/share/doc/python-2.7/examples/Tools/i18n/msgfmt.py --output-file=locale/hu/LC_MESSAGES/fpdb.mo locale/fpdb-hu_HU.po diff --git a/pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo b/pyfpdb/locale/hu/LC_MESSAGES/fpdb.mo new file mode 100644 index 0000000000000000000000000000000000000000..07bd06e6654306c6c441100c50bb7facad3a1a1b GIT binary patch literal 42792 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 C25Xc6 literal 0 HcmV?d00001