Added gettext support, made gender system more flexible.
authorGabriel Pérez-Cerezo <gabriel@gpcf.eu>
Tue, 23 Feb 2016 20:12:44 +0000 (21:12 +0100)
committerGabriel Pérez-Cerezo <gabriel@gpcf.eu>
Tue, 23 Feb 2016 20:12:44 +0000 (21:12 +0100)
voctrainer.py

index 2c1b9c7..0268a58 100755 (executable)
@@ -1,5 +1,7 @@
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
+# Copyright (c) 2015, 2016 Gabriel Pérez-Cerezo
+
 import os
 #print("Hello World")
 import cgi
@@ -7,13 +9,22 @@ import cgitb
 from difflib import SequenceMatcher as match
 cgitb.enable()
 from glob import glob
+from gettext import gettext as _
+
+
 WORDPOINTS=2
 #print "200 Ok"
-PRONOUNS_FILE="pronouns.conf"
+PRONOUNS="pronouns.conf"
+GENDERS="genders.conf"
+themata = glob("*.voc")
+conj = glob("*.conj")
+    
 def parse_conjfile (f) :
     ret = {}
     for line in f :
         try :
+            if line.startswith("#") :
+                continue
             s = line.split(":")
             ret[s[0]]=s[1]
         except :
@@ -21,8 +32,8 @@ def parse_conjfile (f) :
     return ret
 def conj_name (f):
     return f.replace(".conj","")
-def import_pronouns ():
-    dt = open(PRONOUNS_FILE,"r")
+def import_conf(f):
+    dt = open(f,"r")
     return parse_conjfile(dt)
 
 def build_solutions (vocfile):
@@ -30,7 +41,7 @@ def build_solutions (vocfile):
     try :
         data = open(vocfile, "r")
     except IOError :
-        print "%s does not exist" % vocfile
+        print _("%s does not exist") % vocfile
         footer()
         exit()
     if vocfile.endswith(".voc") :
@@ -52,18 +63,18 @@ def field(nm):
     return "<input name=\"" + nm +'">'
 def conj_form (name, conj) :
     print '<form action="send%s" name="test" ><table>' % name
-    print thead("Pronomen", "Verbform")
+    print thead(_("Pronomen"), _("Verbform"))
     print "<tbody>"
-    pronouns = import_pronouns()
+    pronouns = import_conf(PRONOUNS)
     for i in sorted(conj) :
         print "<tr>"
         print td(pronouns[i])
         print td(field(i))
     print "</tbody></table>"
-    print '<input type="submit" value="Absenden!">'
+    print '<input type="submit" value="'+_("Absenden")+'!">'
     print '</form>'
 def results_sentence(reached, reachable):
-    return "Du hast %.1f von %d Punkten erreicht. Das Entspricht %d%%." %(reached, reachable, reached*100/reachable)
+    return _("Du hast {0:.1f} von {1:d} Punkten erreicht. Das Entspricht {2:d} %.").format(reached, reachable, reached*100/reachable)
 def score_word(x,y) :
     sim = match(None, x.strip(), y.strip()).ratio() * (WORDPOINTS -0.5)
     if  sim > 0.9*(WORDPOINTS-0.5):
@@ -71,12 +82,14 @@ def score_word(x,y) :
     elif sim < 0.5 * (WORDPOINTS-0.5) :
         sim = 0
     return sim
+
 def check (sol, user) :
+    genders = import_conf(GENDERS)
     if not user :
-        print '<b class="error" >Keine Daten eingesendet!</b><br>'
+        print '<b class="error" >' + _('Keine Daten eingesendet!') + '</b><br>'
         return 0
     print "<table>"
-    print thead("Deutsch", "Artikel", "Punkte", "Wort", "Lösung", "Punkte")
+    print thead(_("Deutsch"), _("Artikel"), _("Punkte"), _("Wort"), _("Lösung"), _("Punkte"))
     print "<tbody>"
     reachable = 0
     reached = 0
@@ -84,19 +97,14 @@ def check (sol, user) :
         print "<tr><td>",i
         if not i in user :
             user[i] = ("","")
-        if sol[i][0] and sol[i][0] in "mf":
+        if sol[i][0] and sol[i][0] in genders.keys():
             reachable +=1
-            print "<td>"
-            if sol[i][0]=="m" :
-                print "El"
-            else:
-                print "La"
-            print "<td>"
+            print td(genders[sol[i][0]])
             if sol[i][0]==user[i][0]:
-                print "1"
+                print td("1")
                 reached +=1
             else :
-                print "0"
+                print td("0")
         else :
             print "<td>-<td>-"
         print "<td>", user[i][1] #Eingabe
@@ -110,11 +118,11 @@ def check (sol, user) :
     print results_sentence(reached, reachable)
     
 def check_conj (sol,user):
-    pronouns = import_pronouns()
+    pronouns = import_conf(PRONOUNS)
     reachable = 0
     reached = 0
     print "<table>"
-    print thead("Pronomen", "Verbform", "Lösung", "Punkte")
+    print thead(_("Pronomen"), _("Verbform"), _("Lösung"), _("Punkte"))
     print "<tbody>"
     for i in sorted(sol) :
         print "<tr>"
@@ -135,14 +143,28 @@ def check_conj (sol,user):
     
 def sort_sol (sol):
     return sorted(sol, cmp=lambda x,y: cmp(x.lower(), y.lower()))
+def list_subjects (prefix="") :
+    print "<h2>" + _("Bitte wähle ein Thema aus:") + "</h2>"
+    if themata:
+        print '<div class="ls" ><h3>' + _("Vokabeln") + '</h3>'
+        print '<ul class="voc" >'
+        for thema in themata:
+            print "<li><a href=\"%s%s\" >%s</a>" % (prefix,thema, thema.replace(".voc",""))
+        print "</ul></div>"
+    if conj:
+        print '<div class="ls" ><h3>' + _('Konjugationen') +' </h3>'
+        print '<ul class="voc" >'
+        for verb in conj :
+            print "<li><a href=\"%s%s\">%s</a>" % (prefix,verb, conj_name(verb))
+        print "</ul></div>"
 
 def footer ():
-    print """<footer>Vokabeltrainer Copyright &copy; 2015 Gabriel
+    print _("""<footer>Vokabeltrainer Copyright &copy; 2015, 2016 Gabriel
 Pérez-Cerezo<br>Freie Software, lizensiert unter der
 MIT-Lizenz <a href="http://git.gpcf.eu/voctrainer.git">Quellcode herunterladen</a><br>
 Der Vokabeltrainer ist noch lange nicht fertig: siehe <a href="/TODO.txt">unsere Liste</a>
 an Sachen, die wir gerne hätten.<br>
-Fehlermeldungen bitte an gabriel -arroba- gpcf -punto- eu</footer></body></html>"""
+Fehlermeldungen bitte an gabriel -arroba- gpcf -punto- eu</footer></body></html>""")
 def header (title="", navbar="") :
     if title :
         title = "– " + title
@@ -157,32 +179,21 @@ def header (title="", navbar="") :
 <div id="header">
 <a href="/voctrainer.py/" ><img style="float:left; width:4em;" src="/logo.png" alt="Vokabeltrainer logo"></a><h1 id="title">Vokabeltrainer</h1>
 %s
-<a class="nav" href="/voctrainer.py/">Hauptmenü</a>
+<a class="nav" href="/voctrainer.py/">%s</a>
+<a class="nav" href="/voctrainer.py/export">%s</a>
 </div>
-''' % (title, navbar)
+''' % (title, navbar, _("Hauptmenü"), _("Lösungen Einsehen"))
 
 print ("Content-Type: text/html; charset=UTF-8\n")
 try:
     url=os.environ["PATH_INFO"]
 except:
     url="/"
-themata = glob("*.voc")
-conj = glob("*.conj")
+
+
 if url == "" or url == "/" :
     header()
-    print "<h2>Bitte wähle ein Thema aus:</h2>"
-    if themata:
-        print '<div class="ls" ><h3>Vokabeln</h3>'
-        print '<ul class="voc" >'
-        for thema in themata:
-            print "<li><a href=\"%s\" >%s</a>" % (thema, thema.replace(".voc",""))
-        print "</ul></div>"
-    if conj:
-        print '<div class="ls" ><h3>Konjugationen</h3>'
-        print '<ul class="voc" >'
-        for verb in conj :
-            print "<li><a href=\"%s\">%s</a>" % (verb, conj_name(verb))
-        print "</ul></div>"
+    list_subjects()
     footer()
     exit()
 if url[1:] in conj :
@@ -195,31 +206,31 @@ if url[1:] in conj :
     
 if url[1:] in themata :
     header(url[1:])
+    genders = import_conf(GENDERS)
     print "<h2>%s</h2>" % (url[1:].replace(".voc",""))
     print "<br>"
     print '<form action="send%s" name="test" ><table>' % url[1:]
     sol = build_solutions(url[1:])
-    print thead("Deutsch", "Artikel", "Übersetzung")
+    print thead(_("Deutsch"), _("Artikel"), _("Übersetzung"))
     print '<tbody>'
     for i in sort_sol(sol) :
         print "<tr><td>%s</td><td>" % i,
-        if sol[i][0] and sol[i][0] in "mf" : # word has gender
-            print '''<input type="radio" name="%s_g" value="m">El
-            <input type="radio" name="%s_g" value="f">La''' % (i, i)
+        if sol[i][0] and sol[i][0] in genders.keys() : # word has gender
+            for j in genders.keys() :
+                print '<input type="radio" name="%s_g" value="%s">' %(i,j) + genders[j]
         else :
             print "—"
         print '<td><input name="%s">' % i
         print "</tr>"
-    print '</tbody></table><input type="submit" value="Absenden!"></form>'
+    print '</tbody></table><input type="submit" value="' + _("Absenden!") + '"></form>'
     footer()
+    exit()
 if url[1:].startswith("send") :
 #    print "you sent it"
     form = cgi.FieldStorage()
     f=url[5:]
-    header("Auswertung zu %s" % f, '<a class="nav" href="%s">Zurück zum Test</a>' % f)
-    print "<h2>Auswertung</h2>"
-    
-
+    header(_("Auswertung zu %s") % f, '<a class="nav" href="%s">Zurück zum Test</a>' % f)
+    print "<h2>" + _("Auswertung") + "</h2>"
     dt = build_solutions(f)
     ut = {} # User solutions
     for i in form :
@@ -241,7 +252,40 @@ if url[1:].startswith("send") :
         check(dt, ut)
     elif f.endswith(".conj"):
         check_conj(dt, ut)
+    footer()
+    exit()
+if url[1:].startswith("export") :
+    f=url[7:]
+    header("Export"+f)
+    if f=="" :
+        list_subjects("export")
+        footer()
+        exit()
+    else :
+        sol = build_solutions(f)
+        print "<table>"
+        if f.endswith(".conj"):
+            pronouns = import_conf(PRONOUNS)
+            print thead(_("Pronomen"),_("Verbform"))
+            print "<tbody>"
+            for i in sorted(sol) :
+                print "<tr>", td(pronouns[i]), td(sol[i]), "</tr>"
+        elif f.endswith(".voc"):
+            genders = import_conf(GENDERS)
+            print thead(_("Deutsch"), _("Artikel"), _("Übersetzung"))
+            print "<tbody>"
+            for i in sort_sol(sol) :
+                print "<tr>", td(i)
+                if sol[i][0] in genders.keys() :
+                    print td(genders[sol[i][0]])
+                else:
+                    print td("—")
+                print td(sol[i][1])
+                print "</tr>"
+        print "</tbody></table>"            
+        footer()
+        exit()
         
 
-    footer()
+