diff --git a/README.md b/README.md
index 9a5519bfc40a91c5f56a03198ea0d38f3d81e5e8..c6d2bbc8e9cf1979bc2b5bbfdb4f8c745a2dac43 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,5 @@
 # Helios Election System
 
-Helios is an end-to-end verifiable voting system.
-
-[![Travis Build Status](https://travis-ci.org/benadida/helios-server.svg?branch=master)](https://travis-ci.org/benadida/helios-server)
+Fork used by the Czech Pirate Party. Includes PirateID integration and Czech translation.
 
-[![Stories in Ready](https://badge.waffle.io/benadida/helios-server.png?label=ready&title=Ready)](https://waffle.io/benadida/helios-server)
+Helios is an end-to-end verifiable voting system.
diff --git a/helios/forms.py b/helios/forms.py
index d7919675863641cd24abd5ba3082b0e6014d4e84..f7540a54c150eed4c4edf384e6b3dd8553c17d3b 100644
--- a/helios/forms.py
+++ b/helios/forms.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 """
 Forms for Helios
 """
@@ -11,40 +12,40 @@ from .widgets import SplitSelectDateTimeWidget
 
 
 class ElectionForm(forms.Form):
-  short_name = forms.SlugField(max_length=40, help_text='no spaces, will be part of the URL for your election, e.g. my-club-2010')
-  name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'size':60}), help_text='the pretty name for your election, e.g. My Club 2010 Election')
-  description = forms.CharField(max_length=4000, widget=forms.Textarea(attrs={'cols': 70, 'wrap': 'soft'}), required=False)
-  election_type = forms.ChoiceField(label="type", choices = Election.ELECTION_TYPES)
-  use_voter_aliases = forms.BooleanField(required=False, initial=False, help_text='If selected, voter identities will be replaced with aliases, e.g. "V12", in the ballot tracking center')
+  short_name = forms.SlugField(max_length=40, help_text=u'bez mezer, bude použita jako část URL vašeho hlasování, např. kf-msk-20-2018-zmena-rozpoctu', label=u"Zkratka")
+  name = forms.CharField(max_length=100, widget=forms.TextInput(attrs={'size':60}), help_text=u'plný název vašeho hlasování, např. KF MSK 20/2018 Změna rozpočtu', label=u"Název")
+  description = forms.CharField(max_length=32000, widget=forms.Textarea(attrs={'cols': 70, 'wrap': 'soft'}), required=False, label=u"Popis")
+  election_type = forms.ChoiceField(label=u"Typ", choices = Election.ELECTION_TYPES)
+  use_voter_aliases = forms.BooleanField(required=False, initial=False, help_text=u'zvolíte-li tuto možnost, na stránce pro sledování hlasovacích lístků budou jména voličů nahrazena aliasy, např. "V12"', label=u"Použít aliasy voličů")
   #use_advanced_audit_features = forms.BooleanField(required=False, initial=True, help_text='disable this only if you want a simple election with reduced security but a simpler user interface')
-  randomize_answer_order = forms.BooleanField(required=False, initial=False, help_text='enable this if you want the answers to questions to appear in random order for each voter')
-  private_p = forms.BooleanField(required=False, initial=False, label="Private?", help_text='A private election is only visible to registered voters.')
-  help_email = forms.CharField(required=False, initial="", label="Help Email Address", help_text='An email address voters should contact if they need help.')
-  
+  randomize_answer_order = forms.BooleanField(required=False, initial=False, help_text=u'zvolte, pokud chcete, aby se každému voliči zobrazovaly odpovědi na otázky v náhodně zvoleném pořadí', label=u"Odpovědi v náhodném pořadí")
+  private_p = forms.BooleanField(required=False, initial=False, label=u"Soukromé?", help_text=u'Soukromé hlasování je viditelné jen pro registrované voliče.')
+  help_email = forms.CharField(required=False, initial="", label=u"E-mail pro nápovědu", help_text=u'e-mailová adresa, na kterou se budou voliči obracet s žádostmi o pomoc.')
+  voting_starts_at = SplitDateTimeField(help_text = u'datum a čas zahájení hlasování; v UTC, takže oproti časovému pásmu ČR je menší o 1 hodinu v zimním, resp. o 2 hodiny v letním čase',
+                                   widget=SplitSelectDateTimeWidget, required=False, label=u"Hlasování začíná v")
+  voting_ends_at = SplitDateTimeField(help_text = u'datum a čas ukončení hlasování; v UTC, takže oproti časovému pásmu ČR je menší o 1 v zimním, resp. o 2 hodiny v letním čase',
+                                   widget=SplitSelectDateTimeWidget, required=False, label=u"Hlasování končí v")
+
   if settings.ALLOW_ELECTION_INFO_URL:
-    election_info_url = forms.CharField(required=False, initial="", label="Election Info Download URL", help_text="the URL of a PDF document that contains extra election information, e.g. candidate bios and statements")
-  
-  # times
-  voting_starts_at = SplitDateTimeField(help_text = 'UTC date and time when voting begins',
-                                   widget=SplitSelectDateTimeWidget, required=False)
-  voting_ends_at = SplitDateTimeField(help_text = 'UTC date and time when voting ends',
-                                   widget=SplitSelectDateTimeWidget, required=False)
+    election_info_url = forms.CharField(required=False, initial="", label=u"URL pro stažení informací o hlasování", help_text=u"URL dokumentu ve formátu PDF, obsahujícího doplňkové informace k hlasování, např. životopisy a profily kandidátů")
+
+  pass
 
 class ElectionTimeExtensionForm(forms.Form):
-  voting_extended_until = SplitDateTimeField(help_text = 'UTC date and time voting extended to',
-                                   widget=SplitSelectDateTimeWidget, required=False)
-  
+  voting_extended_until = SplitDateTimeField(help_text = u'datum a čas prodlouženého ukončení hlasování; v UTC',
+                                   widget=SplitSelectDateTimeWidget, required=False, label=u"Hlasování prodlouženo do")
+
 class EmailVotersForm(forms.Form):
   subject = forms.CharField(max_length=80)
   body = forms.CharField(max_length=4000, widget=forms.Textarea)
-  send_to = forms.ChoiceField(label="Send To", initial="all", choices= [('all', 'all voters'), ('voted', 'voters who have cast a ballot'), ('not-voted', 'voters who have not yet cast a ballot')])
+  send_to = forms.ChoiceField(label=u"Poslat", initial="all", choices= [('all', u'všem voličům'), ('voted', u'voličům, kteří již odevzdali lístek'), ('not-voted', u'voličům, kteří ještě neodevzdali lístek')])
 
 class TallyNotificationEmailForm(forms.Form):
   subject = forms.CharField(max_length=80)
   body = forms.CharField(max_length=2000, widget=forms.Textarea, required=False)
-  send_to = forms.ChoiceField(label="Send To", choices= [('all', 'all voters'), ('voted', 'only voters who cast a ballot'), ('none', 'no one -- are you sure about this?')])
+  send_to = forms.ChoiceField(label=u"Poslat", choices= [('all', u'všem voličům'), ('voted', u'jen voličům, kteří odevzdali lístek'), ('none', u'nikomu -- jste si tím jist?')])
 
 class VoterPasswordForm(forms.Form):
-  voter_id = forms.CharField(max_length=50, label="Voter ID")
+  voter_id = forms.CharField(max_length=50, label=u"ID voliče")
   password = forms.CharField(widget=forms.PasswordInput(), max_length=100)
 
diff --git a/helios/media/static_templates/question.html b/helios/media/static_templates/question.html
index 15b3882530a331e78165c33d0ff078b08d038cf5..fe6709f7faf52b38111d13913315dac4a68078eb 100644
--- a/helios/media/static_templates/question.html
+++ b/helios/media/static_templates/question.html
@@ -4,12 +4,12 @@
 <h4>
 {#if $T.admin_p}[
 {#if $T.question$index > 0}<a href="javascript:question_move_up({$T.question$index});">^</a>]&nbsp;[{#/if}
-<a onclick="return confirm('Are you sure you want to remove this question?');" href="javascript:question_remove({$T.question$index})">x</a>] [<a href="javascript:question_edit({$T.question$index})">edit</a>] {#/if}{$T.question$index + 1}. {$T.question.question} ({$T.question.choice_type}, select between {$T.question.min} and {#if $T.question.max != null}{$T.question.max}{#else}unlimited{#/if} answers, result type {$T.question.result_type}{#if $T.question.randomize_answer_order}, random answer order{#/if}.)</h4>
+<a onclick="return confirm('Určitě chcete odstranit tuto otázku?');" href="javascript:question_remove({$T.question$index})">x</a>] [<a href="javascript:question_edit({$T.question$index})">upravit</a>] {#/if}{$T.question$index + 1}. {$T.question.question} ({$T.question.choice_type}, zvolte mezi {$T.question.min} a {#if $T.question.max != null}{$T.question.max}{#else}neomezeně{#/if} odpověďmi, typ výsledku {$T.question.result_type}.)</h4>
 <ul>
 {#foreach $T.question.answers as answer}
 <li> {$T.answer}
 {#if $T.question.answer_urls[$T.answer$index]}
-  [<a target="_new" href="{$T.question.answer_urls[$T.answer$index]}">more</a>]
+  [<a target="_new" href="{$T.question.answer_urls[$T.answer$index]}">podrobnosti</a>]
 {#/if}
 </li>
 {#/for}
@@ -25,15 +25,16 @@
   </select>
 -->
 <input type="hidden" name="choice_type" value="approval" />
-<b>{$T.question$index + 1}.</b> &nbsp;&nbsp;&nbsp;Select between &nbsp;&nbsp;
+<b>{$T.question$index + 1}.</b> &nbsp;&nbsp;&nbsp;Zvolte mezi &nbsp;&nbsp;
 <select name="min">
-    <option selected>0</option>
-{#for option_index = 1 to 20}
+    <option>0</option>
+    <option selected>1</option>
+{#for option_index = 2 to 20}
     <option>{$T.option_index}</option>
 {#/for}
 </select>
 
-&nbsp;&nbsp; and  &nbsp;&nbsp;
+&nbsp;&nbsp; a  &nbsp;&nbsp;
 
 <select name="max">
     <option>0</option>
@@ -45,14 +46,14 @@
 </select>
 
 &nbsp;&nbsp;
-answers.
+odpověďmi.
 
 &nbsp;&nbsp;
 &nbsp;&nbsp;
-Result Type:&nbsp;
+Typ výsledku:&nbsp;
 <select name="result_type">
-    <option selected>absolute</option>
-    <option>relative</option>
+    <option selected>absolutní</option>
+    <option>relativní</option>
 </select>
 
 &nbsp;&nbsp;
@@ -66,23 +67,23 @@ Random Answer Order:&nbsp;
 
 <table id="answer_table_{$T.question$index}">
   <tbody>
-    <tr><th colspan="2">Question:</th><td><input type="text" name="question" size="70" /></td></tr>
+    <tr><th colspan="2">Otázka:</th><td><input type="text" name="question" size="70" /></td></tr>
     <tr><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th></tr>
   </tbody>
   <tfoot>
-    <tr><th colspan="2"></th><th><a href="javascript:add_answers($('#answer_table_{$T.question$index}'),5)">add 5 more answers</a></th></tr>
-    <tr><td colspan="3"><input type="submit" value="update question" /> &nbsp; <input type="reset" value="cancel" onclick="question_edit_cancel({$T.question$index});" /></td></tr>
+    <tr><th colspan="2"></th><th><a href="javascript:add_answers($('#answer_table_{$T.question$index}'),5)">přidat 5 dalších odpovědí</a></th></tr>
+    <tr><td colspan="3"><input type="submit" value="změnit otázku" /> &nbsp; <input type="reset" value="zpět" onclick="question_edit_cancel({$T.question$index});" /></td></tr>
   </tfoot>
 
 </table>
 </form>
 </div>
 {#else}
-no questions yet
+zatím žádné otázky
 {#/for}
 
 {#if $T.admin_p}
-<h4>Add a Question:</h4>
+<h4>Přidat otázku:</h4>
 <form id="question_form" onsubmit="question_add(this); return false;" action="#">
 <p>
 <!--
@@ -92,15 +93,16 @@ no questions yet
   </select>
 -->
 <input type="hidden" name="choice_type" value="approval" />
-&nbsp;&nbsp;&nbsp;Select between &nbsp;&nbsp;
+&nbsp;&nbsp;&nbsp;Zvolte mezi &nbsp;&nbsp;
 <select name="min">
-    <option selected>0</option>
-{#for option_index = 1 to 20}
+    <option>0</option>
+    <option selected>1</option>
+{#for option_index = 2 to 20}
     <option>{$T.option_index}</option>
 {#/for}
 </select>
 
-&nbsp;&nbsp; and  &nbsp;&nbsp;
+&nbsp;&nbsp; a  &nbsp;&nbsp;
 
 <select name="max">
     <option>0</option>
@@ -112,14 +114,14 @@ no questions yet
 </select>
 
 &nbsp;&nbsp;
-answers.
+odpověďmi.
 
 &nbsp;&nbsp;
 &nbsp;&nbsp;
-Result Type:&nbsp;
+Typ výsledku:&nbsp;
 <select name="result_type">
-    <option selected>absolute</option>
-    <option>relative</option>
+    <option selected>absolutní</option>
+    <option>relativní</option>
 </select>
 
 &nbsp;&nbsp;
@@ -135,12 +137,12 @@ Random Answer Order:&nbsp;
 
 <table id="answer_table" style="width:100%;">
   <tbody>
-    <tr><th colspan="2">Question:</th><td><input type="text" name="question" size="70" /></td></tr>
+    <tr><th colspan="2">Otázka:</th><td><input type="text" name="question" size="70" /></td></tr>
     <tr><th>&nbsp;</th><th>&nbsp;</th><th>&nbsp;</th></tr>
   </tbody>
   <tfoot>
-    <tr><th colspan="2"></th><th><a href="javascript:add_answers($('#answer_table'), 5)">add 5 more answers</a></th></tr>
-    <tr><td colspan="2"><input type="submit" value="add question" /></td></tr>
+    <tr><th colspan="2"></th><th><a href="javascript:add_answers($('#answer_table'), 5)">přidat 5 dalších odpovědí</a></th></tr>
+    <tr><td colspan="2"><input type="submit" value="přidat otázku" /></td></tr>
   </tfoot>
 
 </table>
diff --git a/helios/models.py b/helios/models.py
index d8faa777478b1b98c9bbda823883dabf61665e0a..c8cae97c223633a8ddb036a537203bb1a0569d1a 100644
--- a/helios/models.py
+++ b/helios/models.py
@@ -35,7 +35,7 @@ class HeliosModel(models.Model, datatypes.LDObjectContainer):
 
 class Election(HeliosModel):
   admin = models.ForeignKey(User, on_delete=models.CASCADE)
-  
+
   uuid = models.CharField(max_length=50, null=False)
 
   # keep track of the type and version of election, which will help dispatch to the right
@@ -44,10 +44,10 @@ class Election(HeliosModel):
   # v3.1 will still use legacy/Election
   # later versions, at some point will upgrade to "2011/01/Election"
   datatype = models.CharField(max_length=250, null=False, default="legacy/Election")
-  
+
   short_name = models.CharField(max_length=100, unique=True)
   name = models.CharField(max_length=250)
-  
+
   ELECTION_TYPES = (
     ('election', 'Election'),
     ('referendum', 'Referendum')
@@ -61,10 +61,10 @@ class Election(HeliosModel):
                              null=True)
   private_key = LDObjectField(type_hint = 'legacy/EGSecretKey',
                               null=True)
-  
+
   questions = LDObjectField(type_hint = 'legacy/Questions',
                             null=True)
-  
+
   # eligibility is a JSON field, which lists auth_systems and eligibility details for that auth_system, e.g.
   # [{'auth_system': 'cas', 'constraint': [{'year': 'u12'}, {'year':'u13'}]}, {'auth_system' : 'password'}, {'auth_system' : 'openid', 'constraint': [{'host':'http://myopenid.com'}]}]
   eligibility = LDObjectField(type_hint = 'legacy/Eligibility',
@@ -74,10 +74,10 @@ class Election(HeliosModel):
   # this is now used to indicate the state of registration,
   # whether or not the election is frozen
   openreg = models.BooleanField(default=False)
-  
+
   # featured election?
   featured_p = models.BooleanField(default=False)
-    
+
   # voter aliases?
   use_voter_aliases = models.BooleanField(default=False)
 
@@ -86,18 +86,18 @@ class Election(HeliosModel):
 
   # randomize candidate order?
   randomize_answer_order = models.BooleanField(default=False, null=False)
-  
+
   # where votes should be cast
   cast_url = models.CharField(max_length = 500)
 
   # dates at which this was touched
   created_at = models.DateTimeField(auto_now_add=True)
   modified_at = models.DateTimeField(auto_now_add=True)
-  
+
   # dates at which things happen for the election
   frozen_at = models.DateTimeField(auto_now_add=False, default=None, null=True)
   archived_at = models.DateTimeField(auto_now_add=False, default=None, null=True)
-  
+
   # dates for the election steps, as scheduled
   # these are always UTC
   registration_starts_at = models.DateTimeField(auto_now_add=False, default=None, null=True)
@@ -111,7 +111,7 @@ class Election(HeliosModel):
   complaint_period_ends_at = models.DateTimeField(auto_now_add=False, default=None, null=True)
 
   tallying_starts_at = models.DateTimeField(auto_now_add=False, default=None, null=True)
-  
+
   # dates when things were forced to be performed
   voting_started_at = models.DateTimeField(auto_now_add=False, default=None, null=True)
   voting_extended_until = models.DateTimeField(auto_now_add=False, default=None, null=True)
@@ -125,7 +125,7 @@ class Election(HeliosModel):
 
   # the hash of all voters (stored for large numbers)
   voters_hash = models.CharField(max_length=100, null=True)
-  
+
   # encrypted tally, each a JSON string
   # used only for homomorphic tallies
   encrypted_tally = LDObjectField(type_hint = 'legacy/Tally',
@@ -182,7 +182,7 @@ class Election(HeliosModel):
     """
     if not self.use_voter_aliases:
       return None
-    
+
     return utils.one_val_raw_sql("select max(cast(substr(alias, 2) as integer)) from " + Voter._meta.db_table + " where election_id = %s", [self.id]) or 0
 
   @property
@@ -207,7 +207,7 @@ class Election(HeliosModel):
   @classmethod
   def get_featured(cls):
     return cls.objects.filter(featured_p = True).order_by('short_name')
-    
+
   @classmethod
   def get_or_create(cls, **kwargs):
     return cls.objects.get_or_create(short_name = kwargs['short_name'], defaults=kwargs)
@@ -224,7 +224,7 @@ class Election(HeliosModel):
       return query[:limit]
     else:
       return query
-    
+
   @classmethod
   def get_by_user_as_voter(cls, user, archived_p=None, limit=None):
     query = cls.objects.filter(voter__user = user)
@@ -237,21 +237,21 @@ class Election(HeliosModel):
       return query[:limit]
     else:
       return query
-    
+
   @classmethod
   def get_by_uuid(cls, uuid):
     try:
       return cls.objects.select_related().get(uuid=uuid)
     except cls.DoesNotExist:
       return None
-  
+
   @classmethod
   def get_by_short_name(cls, short_name):
     try:
       return cls.objects.get(short_name=short_name)
     except cls.DoesNotExist:
       return None
-    
+
   def save_questions_safely(self, questions):
     """
     Because Django doesn't let us override properties in a Pythonic way... doing the brute-force thing.
@@ -261,11 +261,11 @@ class Election(HeliosModel):
       for answer_url in q['answer_urls']:
         if not answer_url or answer_url == "":
           continue
-          
+
         # abort saving if bad URL
         if not (answer_url[:7] == "http://" or answer_url[:8]== "https://"):
           return False
-    
+
     self.questions = questions
     return True
 
@@ -280,13 +280,13 @@ class Election(HeliosModel):
       voter_file_content = voter_file_content_bytes.decode('utf-8')
     except:
       voter_file_content = voter_file_content_bytes.decode('latin-1')
-    
+
     new_voter_file = VoterFile(election = self, voter_file_content = voter_file_content)
     new_voter_file.save()
-    
+
     self.append_log(ElectionLog.VOTER_FILE_ADDED)
     return new_voter_file
-  
+
   def user_eligible_p(self, user):
     """
     Checks if a user is eligible for this election.
@@ -294,15 +294,15 @@ class Election(HeliosModel):
     # registration closed, then eligibility doesn't come into play
     if not self.openreg:
       return False
-    
+
     if self.eligibility is None:
       return True
-      
+
     # is the user eligible for one of these cases?
     for eligibility_case in self.eligibility:
       if user.is_eligible_for(eligibility_case):
         return True
-        
+
     return False
 
   def eligibility_constraint_for(self, user_type):
@@ -320,21 +320,21 @@ class Election(HeliosModel):
     "when eligibility is by category, this returns the category_id"
     if not self.eligibility:
       return None
-    
+
     constraint_for = self.eligibility_constraint_for(user_type)
     if len(constraint_for) > 0:
       constraint = constraint_for[0]
       return AUTH_SYSTEMS[user_type].eligibility_category_id(constraint)
     else:
       return None
-    
+
   @property
   def pretty_eligibility(self):
     if not self.eligibility:
       return "Anyone can vote."
     else:
       return_val = "<ul>"
-      
+
       for constraint in self.eligibility:
         if 'constraint' in constraint:
           for one_constraint in constraint['constraint']:
@@ -345,7 +345,7 @@ class Election(HeliosModel):
       return_val += "</ul>"
 
       return return_val
-  
+
   @property
   def voting_start_at(self):
     voting_start_at = self.voting_starts_at
@@ -367,7 +367,7 @@ class Election(HeliosModel):
     has voting begun? voting begins if the election is frozen, at the prescribed date or at the date that voting was forced to start
     """
     return self.frozen_at is not None and (self.voting_starts_at is None or (datetime.datetime.utcnow() >= (self.voting_started_at or self.voting_starts_at)))
-    
+
   def voting_has_stopped(self):
     """
     has voting stopped? if tally computed, yes, otherwise if we have passed the date voting was manually stopped at,
@@ -382,30 +382,30 @@ class Election(HeliosModel):
     if self.questions is None or len(self.questions) == 0:
       issues.append(
         {'type': 'questions',
-         'action': "add questions to the ballot"}
+         'action': u"přidat do hlasovacího lístku otázky"}
         )
-  
+
     trustees = Trustee.get_by_election(self)
     if len(trustees) == 0:
       issues.append({
           'type': 'trustees',
-          'action': "add at least one trustee"
+          'action': u"přidat aspoň jednoho trusteeho"
           })
 
     for t in trustees:
       if t.public_key is None:
         issues.append({
             'type': 'trustee keypairs',
-            'action': 'have trustee %s generate a keypair' % t.name
+            'action': u'nechat trusteeho %s vytvořit si svůj pár klíčů' % t.name
             })
 
     if self.voter_set.count() == 0 and not self.openreg:
       issues.append({
           "type" : "voters",
-          "action" : 'enter your voter list (or open registration to the public)'
+          "action" : u'zadat seznam voličů (nebo ponechat veřejné registrace)'
           })
 
-    return issues    
+    return issues
 
   def ready_for_tallying(self):
     return datetime.datetime.utcnow() >= self.tallying_starts_at
@@ -419,8 +419,8 @@ class Election(HeliosModel):
       tally.add_vote(voter.vote, verify_p=False)
 
     self.encrypted_tally = tally
-    self.save()    
-  
+    self.save()
+
   def ready_for_decryption(self):
     return self.encrypted_tally is not None
 
@@ -431,9 +431,9 @@ class Election(HeliosModel):
     for t in Trustee.get_by_election(self):
       if not t.decryption_factors:
         return False
-    
+
     return True
-    
+
   def release_result(self):
     """
     release the result that should already be computed
@@ -442,22 +442,22 @@ class Election(HeliosModel):
       return
 
     self.result_released_at = datetime.datetime.utcnow()
-  
+
   def combine_decryptions(self):
     """
     combine all of the decryption results
     """
-    
+
     # gather the decryption factors
     trustees = Trustee.get_by_election(self)
     decryption_factors = [t.decryption_factors for t in trustees]
-    
+
     self.result = self.encrypted_tally.decrypt_from_factors(decryption_factors, self.public_key)
 
     self.append_log(ElectionLog.DECRYPTIONS_COMBINED)
 
     self.save()
-  
+
   def generate_voters_hash(self):
     """
     look up the list of voters, make a big file, and hash it
@@ -472,15 +472,50 @@ class Election(HeliosModel):
       voters = Voter.get_by_election(self)
       voters_json = utils.to_json([v.toJSONDict() for v in voters])
       self.voters_hash = hash_b64(voters_json)
-    
+
   def increment_voters(self):
     ## FIXME
     return 0
-    
+
   def increment_cast_votes(self):
     ## FIXME
     return 0
-        
+
+  def load_eligible_voters(self):
+    """
+    try to load voters by eligibility constraints
+    """
+
+    if self.eligibility == None:
+      return
+
+    if self.openreg == False:
+      return
+
+    total_load = True
+
+    for eligibility_case in self.eligibility:
+      auth_system = eligibility_case['auth_system']
+
+      if not 'constraint' in eligibility_case:
+        total_load = False
+      else:
+        if hasattr(AUTH_SYSTEMS[auth_system], 'can_list_category_members'):
+          for constraint in eligibility_case['constraint']:
+            category_id = AUTH_SYSTEMS[auth_system].eligibility_category_id(constraint)
+            user_list = AUTH_SYSTEMS[auth_system].list_category_members(category_id)
+            if self.use_voter_aliases:
+              random.shuffle(user_list)
+            for u in user_list:
+              user = User.update_or_create(user_type = u['type'], user_id = u['id'], name = u['name'], info = u['info'], token = u['token'])
+              Voter.register_user_in_election(user, self)
+        else:
+          total_load = False
+
+    if total_load:
+      self.openreg = False
+
+
   def set_eligibility(self):
     """
     if registration is closed and eligibility has not been
@@ -512,7 +547,7 @@ class Election(HeliosModel):
     else:
       # no password users, remove password from the possible auth systems
       if 'password' in auth_systems:
-        auth_systems.remove('password')        
+        auth_systems.remove('password')
 
     # closed registration: limit the auth_systems to just the ones
     # that have registered voters
@@ -520,8 +555,8 @@ class Election(HeliosModel):
       auth_systems = [vt for vt in voter_types if vt in auth_systems]
 
     self.eligibility = [{'auth_system': auth_system} for auth_system in auth_systems]
-    self.save()    
-    
+    self.save()
+
   def freeze(self):
     """
     election is frozen when the voter registration, questions, and trustees are finalized
@@ -530,20 +565,22 @@ class Election(HeliosModel):
       raise Exception("cannot freeze an election that has issues")
 
     self.frozen_at = datetime.datetime.utcnow()
-    
+
+    self.load_eligible_voters()
+
     # voters hash
     self.generate_voters_hash()
 
     self.set_eligibility()
-    
+
     # public key for trustees
     trustees = list(Trustee.get_by_election(self))
     combined_pk = trustees[0].public_key
     for t in trustees[1:]:
       combined_pk = combined_pk * t.public_key
-      
+
     self.public_key = combined_pk
-    
+
     # log it
     self.append_log(ElectionLog.FROZEN)
 
@@ -565,7 +602,7 @@ class Election(HeliosModel):
     trustee.email = settings.DEFAULT_FROM_EMAIL
     trustee.public_key = keypair.pk
     trustee.secret_key = keypair.sk
-    
+
     # FIXME: is this at the right level of abstraction?
     trustee.public_key_hash = datatypes.LDObject.instantiate(trustee.public_key, datatype='legacy/EGPublicKey').hash
 
@@ -579,7 +616,7 @@ class Election(HeliosModel):
       return trustees_with_sk[0]
     else:
       return None
-    
+
   def has_helios_trustee(self):
     return self.get_helios_trustee() is not None
 
@@ -611,7 +648,7 @@ class Election(HeliosModel):
     # FIXME: create the right kind of tally
     from helios.workflows import homomorphic
     return homomorphic.Tally(election=self)
-        
+
   @property
   def registration_status_pretty(self):
     if self.openreg:
@@ -627,7 +664,7 @@ class Election(HeliosModel):
     # sort the answers , keep track of the index
     counts = sorted(enumerate(result), key=lambda x: x[1])
     counts.reverse()
-    
+
     the_max = question['max'] or 1
     the_min = question['min'] or 0
 
@@ -643,7 +680,7 @@ class Election(HeliosModel):
         return []
     else:
       # assumes that anything non-absolute is relative
-      return [counts[0][0]]    
+      return [counts[0][0]]
 
   @property
   def winners(self):
@@ -653,12 +690,12 @@ class Election(HeliosModel):
     assumes that if there is a max to the question, that's how many winners there are.
     """
     return [self.one_question_winner(self.questions[i], self.result[i], self.num_cast_votes) for i in range(len(self.questions))]
-    
+
   @property
   def pretty_result(self):
     if not self.result:
       return None
-    
+
     # get the winners
     winners = self.winners
 
@@ -669,13 +706,13 @@ class Election(HeliosModel):
     for i in range(len(self.questions)):
       q = self.questions[i]
       pretty_question = []
-      
+
       # go through answers
       for j in range(len(q['answers'])):
         a = q['answers'][j]
         count = raw_result[i][j]
         pretty_question.append({'answer': a, 'count': count, 'winner': (j in winners[i])})
-        
+
       prettified_result.append({'question': q['short_name'], 'answers': pretty_question})
 
     return prettified_result
@@ -710,19 +747,19 @@ def unicode_csv_reader(unicode_csv_data, dialect=csv.excel, **kwargs):
       try:
         yield [str(cell, 'utf-8') for cell in row]
       except:
-        yield [str(cell, 'latin-1') for cell in row]        
+        yield [str(cell, 'latin-1') for cell in row]
 
 def utf_8_encoder(unicode_csv_data):
     for line in unicode_csv_data:
       # FIXME: this used to be line.encode('utf-8'),
       # need to figure out why this isn't consistent
       yield line
-  
+
 class VoterFile(models.Model):
   """
   A model to store files that are lists of voters to be processed
   """
-  # path where we store voter upload 
+  # path where we store voter upload
   PATH = settings.VOTER_UPLOAD_REL_PATH
 
   election = models.ForeignKey(Election, on_delete=models.CASCADE)
@@ -837,7 +874,7 @@ class VoterFile(models.Model):
 
 class Voter(HeliosModel):
   election = models.ForeignKey(Election, on_delete=models.CASCADE)
-  
+
   # let's link directly to the user now
   # FIXME: delete this as soon as migrations are set up
   #name = models.CharField(max_length = 200, null=True)
@@ -855,10 +892,10 @@ class Voter(HeliosModel):
   voter_password = models.CharField(max_length = 100, null=True)
   voter_name = models.CharField(max_length = 200, null=True)
   voter_email = models.CharField(max_length = 250, null=True)
-  
+
   # if election uses aliases
   alias = models.CharField(max_length = 100, null=True)
-  
+
   # we keep a copy here for easy tallying
   vote = LDObjectField(type_hint = 'legacy/EncryptedVote', null=True)
   vote_hash = models.CharField(max_length = 100, null=True)
@@ -896,7 +933,7 @@ class Voter(HeliosModel):
     FIXME: review this for non-GAE?
     """
     query = cls.objects.filter(election = election)
-    
+
     # the boolean check is not stupid, this is ternary logic
     # none means don't care if it's cast or not
     if cast is True:
@@ -908,7 +945,7 @@ class Voter(HeliosModel):
     # order by uuid only when no inequality has been added
     if cast is None or order_by == 'cast_at' or order_by == '-cast_at':
       query = query.order_by(order_by)
-      
+
       # if we want the list after a certain UUID, add the inequality here
       if after:
         if order_by[0] == '-':
@@ -917,12 +954,12 @@ class Voter(HeliosModel):
           field_name = "%s__gt" % order_by
         conditions = {field_name : after}
         query = query.filter (**conditions)
-    
+
     if limit:
       query = query[:limit]
-      
+
     return query
-  
+
   @classmethod
   def get_all_by_election_in_chunks(cls, election, cast=None, chunk=100):
     return cls.get_by_election(election)
@@ -933,14 +970,14 @@ class Voter(HeliosModel):
       return cls.objects.get(election = election, voter_login_id = voter_id)
     except cls.DoesNotExist:
       return None
-    
+
   @classmethod
   def get_by_election_and_user(cls, election, user):
     try:
       return cls.objects.get(election = election, user = user)
     except cls.DoesNotExist:
       return None
-      
+
   @classmethod
   def get_by_election_and_uuid(cls, election, uuid):
     query = cls.objects.filter(election = election, uuid = uuid)
@@ -965,7 +1002,7 @@ class Voter(HeliosModel):
     """
     if not self.vote_hash:
       return None
-    
+
     return CastVote.objects.get(vote_hash = self.vote_hash).vote_tinyhash
 
   @property
@@ -995,7 +1032,7 @@ class Voter(HeliosModel):
       try:
         return hash_b64(value_to_hash.encode('latin-1'))
       except:
-        return hash_b64(value_to_hash.encode('utf-8'))        
+        return hash_b64(value_to_hash.encode('utf-8'))
 
   @property
   def voter_type(self):
@@ -1004,17 +1041,17 @@ class Voter(HeliosModel):
   @property
   def display_html_big(self):
     return self.get_user().display_html_big
-      
+
   def send_message(self, subject, body):
     self.get_user().send_message(subject, body)
-    
+
   def can_update_status(self):
     return self.get_user().can_update_status()
 
   def generate_password(self, length=10):
     if self.voter_password:
       raise Exception("password already exists")
-    
+
     self.voter_password = utils.random_string(length, alphabet='abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')
 
   def store_vote(self, cast_vote):
@@ -1026,15 +1063,15 @@ class Voter(HeliosModel):
     self.vote_hash = cast_vote.vote_hash
     self.cast_at = cast_vote.cast_at
     self.save()
-  
+
   def last_cast_vote(self):
     return CastVote(vote = self.vote, vote_hash = self.vote_hash, cast_at = self.cast_at, voter=self)
-    
-  
+
+
 class CastVote(HeliosModel):
   # the reference to the voter provides the voter_uuid
   voter = models.ForeignKey(Voter, on_delete=models.CASCADE)
-  
+
   # the actual encrypted vote
   vote = LDObjectField(type_hint = 'legacy/EncryptedVote')
 
@@ -1053,7 +1090,7 @@ class CastVote(HeliosModel):
   # when is the vote verified?
   verified_at = models.DateTimeField(null=True)
   invalidated_at = models.DateTimeField(null=True)
-  
+
   # auditing purposes, like too many votes from the same IP, if it isn't expected
   cast_ip = models.GenericIPAddressField(null=True)
 
@@ -1066,8 +1103,8 @@ class CastVote(HeliosModel):
 
   @property
   def voter_uuid(self):
-    return self.voter.uuid  
-    
+    return self.voter.uuid
+
   @property
   def voter_hash(self):
     return self.voter.hash
@@ -1083,14 +1120,14 @@ class CastVote(HeliosModel):
     safe_hash = self.vote_hash.decode() if isinstance(self.vote_hash, bytes) else self.vote_hash
     for c in ['/', '+', '#']:
       safe_hash = safe_hash.replace(c, '')
-    
+
     length = 8
     while True:
       vote_tinyhash = safe_hash[:length]
       if CastVote.objects.filter(vote_tinyhash = vote_tinyhash).count() == 0:
         break
       length += 1
-      
+
     self.vote_tinyhash = vote_tinyhash
 
   def save(self, *args, **kwargs):
@@ -1102,7 +1139,7 @@ class CastVote(HeliosModel):
       self.set_tinyhash()
 
     super(CastVote, self).save(*args, **kwargs)
-  
+
   @classmethod
   def get_by_voter(cls, voter):
     return cls.objects.filter(voter = voter).order_by('-cast_at')
@@ -1118,13 +1155,13 @@ class CastVote(HeliosModel):
       self.verified_at = datetime.datetime.utcnow()
     else:
       self.invalidated_at = datetime.datetime.utcnow()
-      
+
     # save and store the vote as the voter's last cast vote
     self.save()
 
     if result:
       self.voter.store_vote(self)
-    
+
     return result
 
   def issues(self, election):
@@ -1132,13 +1169,13 @@ class CastVote(HeliosModel):
     Look for consistency problems
     """
     issues = []
-    
+
     # check the election
     if self.vote.election_uuid != election.uuid:
       issues.append("the vote's election UUID does not match the election for which this vote is being cast")
-    
+
     return issues
-    
+
 class AuditedBallot(models.Model):
   """
   ballots for auditing
@@ -1171,12 +1208,12 @@ class AuditedBallot(models.Model):
 
 class Trustee(HeliosModel):
   election = models.ForeignKey(Election, on_delete=models.CASCADE)
-  
+
   uuid = models.CharField(max_length=50)
   name = models.CharField(max_length=200)
   email = models.EmailField()
   secret = models.CharField(max_length=100)
-  
+
   # public key
   public_key = LDObjectField(type_hint = 'legacy/EGPublicKey',
                              null=True)
@@ -1187,11 +1224,11 @@ class Trustee(HeliosModel):
   # Helios is playing the role of the trustee.
   secret_key = LDObjectField(type_hint = 'legacy/EGSecretKey',
                              null=True)
-  
+
   # proof of knowledge of secret key
   pok = LDObjectField(type_hint = 'legacy/DLogProof',
                       null=True)
-  
+
   # decryption factors
   decryption_factors = LDObjectField(type_hint = datatypes.arrayOf(datatypes.arrayOf('core/BigInteger')),
                                      null=True)
@@ -1211,9 +1248,9 @@ class Trustee(HeliosModel):
     if not self.secret:
       self.secret = utils.random_string(12)
       self.election.append_log("Trustee %s added" % self.name)
-      
+
     super(Trustee, self).save(*args, **kwargs)
-  
+
   @classmethod
   def get_by_election(cls, election):
     return cls.objects.filter(election = election)
@@ -1221,7 +1258,7 @@ class Trustee(HeliosModel):
   @classmethod
   def get_by_uuid(cls, uuid):
     return cls.objects.get(uuid = uuid)
-    
+
   @classmethod
   def get_by_election_and_uuid(cls, election, uuid):
     return cls.objects.get(election = election, uuid = uuid)
@@ -1235,12 +1272,12 @@ class Trustee(HeliosModel):
 
   @property
   def datatype(self):
-    return self.election.datatype.replace('Election', 'Trustee')    
-    
+    return self.election.datatype.replace('Election', 'Trustee')
+
   def verify_decryption_proofs(self):
     """
     verify that the decryption proofs match the tally for the election
     """
     # verify_decryption_proofs(self, decryption_factors, decryption_proofs, public_key, challenge_generator):
     return self.election.encrypted_tally.verify_decryption_proofs(self.decryption_factors, self.decryption_proofs, self.public_key, algs.EG_fiatshamir_challenge_generator)
-    
+
diff --git a/helios/templates/_castconfirm_docast.html b/helios/templates/_castconfirm_docast.html
index 1a91b213767ad733344124fe487ddc3ec67cfe14..bf7cefc66e1acf4e9391d513737bd0f85636d5ad 100644
--- a/helios/templates/_castconfirm_docast.html
+++ b/helios/templates/_castconfirm_docast.html
@@ -4,7 +4,7 @@
 <div id="cast_form">
 <form id="cast_confirm_form" method="post" action="" onsubmit="show_waiting()">
     <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
-    
+
 {% if status_update_label %}
 <div class="round" style="background: #eee; padding: 10px; border: 1px dashed #888;">
 <input type="checkbox" name="status_update" value="1" checked /> {{status_update_label}}<br />
@@ -16,16 +16,16 @@
 <br />
 {% endif %}
 
-You are logged in as <u>{{voter.display_html_big|safe}}</u><br /><br />
+Jste přihlášeni jako <u>{{voter.display_html_big|safe}}</u><br /><br />
 
-    <button type="submit" class="large">CAST this ballot</button>
-    <span style="font-size:0.8em;"><br />You can cast as many ballots as you want.<br />Only the last one counts.</span>
+    <button type="submit" class="large">ODEVZDAT tento lístek</button>
+    <span style="font-size:0.8em;"><br />Můžete odevzdat tolik lístků, kolik chcete.<br />Pouze poslední se počítá.</span>
 </form>
 
 <p>
-    <button class="tiny" onclick="document.location='{% url "election@view" election.uuid %}';">cancel</button><br />
-    <span style="font-size:0.8em;">If you cancel now, your ballot will <em>NOT</em> be recorded.<br />
-    You can start the voting process over again, of course.</span>
+    <button class="tiny" onclick="document.location='{% url "election@view" election.uuid %}';">zrušit</button><br />
+    <span style="font-size:0.8em;">Pokud zrušíte nyní, váš lístek <em>NEBUDE</em> zaznamenán.<br />
+    Samozřejmě můžete proces hlasování zopakovat od začátku.</span>
 </p>
 
 <!-- for now, for CSRF protection, no auto-submit just yet (benadida) -->
@@ -34,11 +34,11 @@ You are logged in as <u>{{voter.display_html_big|safe}}</u><br /><br />
 </div>
   {% else %}
 <p style="font-size:1.4em;">
-  voting has stopped, sorry.
+  Hlasování bylo ukončeno, sorry.
 </p>
   {% endif %}
 {% else %}
 <p style="font-size:1.4em;">
-  voting has not yet begun, sorry.
+  Hlasování ještě nezačalo, sorry.
 </p>
 {% endif %}
diff --git a/helios/templates/_castconfirm_password.html b/helios/templates/_castconfirm_password.html
index 03e698af7800a10ffae24aec3bd5eacc032d1162..523b49dc4fcf63c8b3e0809580f84168ea7a674b 100644
--- a/helios/templates/_castconfirm_password.html
+++ b/helios/templates/_castconfirm_password.html
@@ -1,4 +1,4 @@
-Please provide the voter ID and password you received by email.<br /><br />
+Prosím zadejte ID voliče a heslo které jste obdrželi emailem.<br /><br />
 <form method="post" action="{% url "election@password-voter-login" election.uuid %}" onsubmit="show_waiting()">
 <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
 <input type="hidden" name="return_url" value="{{return_url}}" />
@@ -8,12 +8,12 @@ Please provide the voter ID and password you received by email.<br /><br />
 </table>
 {% if bad_voter_login %}
 <p style="color: red;">
-bad voter ID or password, please try again.
+špatné ID voliče nebo heslo, zkuste znovu prosím.
 </p>
 {% endif %}
 {% if cast_ballot == "1" %}
 <p class="small">
-You may cast as many ballots as you wish:<br />only the last one counts.
+Můžete vhodit lístků kolik chcete:<br />pouze poslední se počítá.
 </p>
 <input type="submit" class="button" value="cast ballot" />
 {% else %}
diff --git a/helios/templates/cast_done.html b/helios/templates/cast_done.html
index f6a3b0742ae08f56245aa78fb3c2d22e847b30b6..436cb695750ba00686d2b313798c2b89a8c1d63c 100644
--- a/helios/templates/cast_done.html
+++ b/helios/templates/cast_done.html
@@ -2,27 +2,27 @@
 {% block title %}Confirm Vote{% endblock %}
 
 {% block content %}
-<h1>{{election.name}} &mdash; Vote Successfully Cast!</h1>
+<h1>{{election.name}} &mdash; Hlas úspěšně odeslán!</h1>
 
 <p>
-    Congratulations, your vote has been <b><u>successfully cast</u></b>!
+    Gratulujeme, váš hlasy byl <b><u>úspěšně odeslán</u></b>!
 </p>
 
 {% if vote_hash %}
 <p>
-  Your smart ballot tracker is:<br /><br />
+  Váš chytrý sledovač lístku je:<br /><br />
     <tt style="font-size:1.8em; font-weight: bold; padding-left: 20px;">  {{vote_hash}}</tt>
 </p>
 {% endif %}
 
 {% if logout %}
-<p><b>For your safety, we have logged you out.</b></p>
+<p><b>Pro vaši bezpečnost jsme vás odhlásili.</b></p>
 <iframe width="0" height="0" border="0" frameborder="0" src="{% url "auth@logout" %}">
 </iframe>
 {% endif %}
 
 <p style="font-size: 1.4em;">
-[ <a href="{% url "election@view" election.uuid %}">return to election info</a> ]
+[ <a href="{% url "election@view" election.uuid %}">vrátit se k informacím o volbě</a> ]
 </p>
 
 {% endblock %}
diff --git a/helios/templates/castvote.html b/helios/templates/castvote.html
index 21b5fa72fa719c811a449dd881c5e6d33dec3232..b0e2916b9a34ab8ee027bd2e486f55c561cf2be3 100644
--- a/helios/templates/castvote.html
+++ b/helios/templates/castvote.html
@@ -2,9 +2,9 @@
 
 {% block title %}{{cast_vote.vote_tinyhash}} &mdash; {{election.name}}{% endblock %}
 {% block content %}
-<h2 class="title">Cast Vote {{cast_vote.vote_tinyhash}}</h2>
-cast in <a href="{% url "election@view" election.uuid %}">{{election.name}}</a><br />
-Fingerprint: <tt>{{cast_vote.vote_hash}}</tt><br />
+<h2 class="title">Odeslat hlas {{cast_vote.vote_tinyhash}}</h2>
+hlasovat v <a href="{% url "election@view" election.uuid %}">{{election.name}}</a><br />
+Otisk: <tt>{{cast_vote.vote_hash}}</tt><br />
 by <b><u>
 {% if the_voter.alias %}
 {{the_voter.alias}}
@@ -13,7 +13,7 @@ by <b><u>
 {% endif %}
 </u></b>
 <br /><br />
-<a href="#" onclick="$('#castvote_content').slideToggle(250); return false;">details</a><br /><br />
+<a href="#" onclick="$('#castvote_content').slideToggle(250); return false;">podrobnosti</a><br /><br />
 <div style="display:none;" id="castvote_content">
 <textarea cols="100" rows="10">
 {{vote_content}}
diff --git a/helios/templates/combine_decryptions.html b/helios/templates/combine_decryptions.html
index 89d60f120b61cc4c70976d1f74f52a641890f2a7..72a51d1246801eaed05d6474367e11cecd950c4c 100644
--- a/helios/templates/combine_decryptions.html
+++ b/helios/templates/combine_decryptions.html
@@ -1,16 +1,16 @@
 {% extends TEMPLATE_BASE %}
 
-{% block title %}Compute Tally &mdash; {{election.name}}{% endblock %}
+{% block title %}Spočítat výsledek &mdash; {{election.name}}{% endblock %}
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Compute Tally <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">cancel</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Spočítej výsledek <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">zrušit</a>]</span></h2>
 
   <p>
-    You are about to compute the tally for this election. You only will then see the results.
+    Chystáte se spočítat výsledek pro toto hlasování. Pouze vy pak uvidíte výsledek.
   </p>
 
   <form method="POST" action="">
     <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
-    <input type="submit" class="button" value="compute the tally!" />
+    <input type="submit" class="button" value="Spočítat výsledek!" />
   </form>
 
 {% endblock %}
diff --git a/helios/templates/election_badge.html b/helios/templates/election_badge.html
index 3af1b6a88ba426f03cebe22a52d4ac7500361690..0763192d0be253fa460fe1f70a191692fb618d1c 100644
--- a/helios/templates/election_badge.html
+++ b/helios/templates/election_badge.html
@@ -1,3 +1,3 @@
 {% if show_title %}<h3 style="padding:0; margin:0">{{election.name}}</h3>{% endif %}
-<b>{{election.num_cast_votes}}</b> cast votes.{% if show_vote_link %} [<a target="_top" href="{{election_url}}">vote!</a>]{% endif %}<br />
+<b>{{election.num_cast_votes}}</b> odevzdaných hlasů.{% if show_vote_link %} [<a target="_top" href="{{election_url}}">Hlasovat!</a>]{% endif %}<br />
 <span style="font-size:0.7em;">powered by <a target="_top" href="http://heliosvoting.org">Helios Voting</a></span>
diff --git a/helios/templates/election_bboard.html b/helios/templates/election_bboard.html
index 25821934c5227c7a9695d5552c6018787a8afdf4..9ce9322b66306e51111623fa97440b9438d689f7 100644
--- a/helios/templates/election_bboard.html
+++ b/helios/templates/election_bboard.html
@@ -1,46 +1,46 @@
 {% extends TEMPLATE_BASE %}
 
-{% block title %}Ballot Tracking Center for {{election.name}}{% endblock %}
+{% block title %}Sledování hlasovacích lístků pro {{election.name}}{% endblock %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Ballot Tracking Center <span style="font-size:0.7em;">[<a href="{% url "election@view" election_uuid=election.uuid %}">back to election</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Sledování hlasovacích lístků <span style="font-size:0.7em;">[<a href="{% url "election@view" election_uuid=election.uuid %}">zpět k hlasování</a>]</span></h2>
 
 <p>
-  This is the ballot tracking center, which displays the tracking numbers of all cast ballots in this election.
+  Na této stránce lze sledovat hlasovací lístky. Jsou zde zobrazeny sledovací kódy všech hlasovacích lístků odevzdaných v tomto hlasování.
   </p>
 
 <p>
-  <b>{{election.num_cast_votes}}</b> cast votes.
+  <b>{{election.num_cast_votes}}</b> odevzdaných hlasů.
 </p>
 
-Voters {{offset_plus_one}} - {{offset_plus_limit}} &nbsp;&nbsp;
+Voliči {{offset_plus_one}} - {{offset_plus_limit}} &nbsp;&nbsp;
 
 {% if next_after %}
-<a href="{% url "election@bboard" election.uuid %}?after={{next_after}}&offset={{offset_plus_limit}}">next {{limit}}</a> &nbsp;&nbsp;
+<a href="{% url "election@bboard" election.uuid %}?after={{next_after}}&offset={{offset_plus_limit}}">dalších {{limit}}</a> &nbsp;&nbsp;
 {% endif %}
 
 {% ifequal offset 0 %}
 {% else %}
-<a href="{% url "election@bboard" election.uuid %}">back to start</a> &nbsp;&nbsp;
+<a href="{% url "election@bboard" election.uuid %}">zpět na začátek</a> &nbsp;&nbsp;
 {% endifequal %}
 {% if more_p %}
-<a href="{% url "election@bboard" election.uuid %}?after={{next_after}}&offset={{next_offset}}">next {{limit}}</a>
+<a href="{% url "election@bboard" election.uuid %}?after={{next_after}}&offset={{next_offset}}">dalších {{limit}}</a>
 {% endif %}
 <table class="pretty">
 <tr><th>
 {% if election.use_voter_aliases %}
 Alias
 {% else %}
-Name
+Jméno
 {% endif %}
-</th><th>Smart Ballot Tracker</th></tr>
+</th><th>Kód pro sledování hlasovacího lístku</th></tr>
 {% for voter in voters %}
 <tr><td>
 {% if election.use_voter_aliases %}
 {{voter.alias}}
 {% else %}
 <img border="0" height="20" src="/static/auth/login-icons/{{voter.voter_type}}.png" alt="{{voter.voter_type}}" /> {% if voter.name %}{{voter.name}}{% else %}{{voter.voter_id}}{% endif %}
-{% endif %}</td><td><tt style="font-size: 1.4em;;">{% if voter.vote_hash %}{{voter.vote_hash}} <span style="font-size:0.8em;">[<a href="{% url "election@ballots@voter@last" election_uuid=election.uuid voter_uuid=voter.uuid %}">view</a>]</span>{% else %}&mdash;{% endif %}</tt></td></tr>
+{% endif %}</td><td><tt style="font-size: 1.4em;;">{% if voter.vote_hash %}{{voter.vote_hash}} <span style="font-size:0.8em;">[<a href="{% url "election@ballots@voter@last" election_uuid=election.uuid voter_uuid=voter.uuid %}">zobrazit</a>]</span>{% else %}&mdash;{% endif %}</tt></td></tr>
 {% endfor %}
 </table>
 
diff --git a/helios/templates/election_build.html b/helios/templates/election_build.html
index 8f56185fcb93e2c5092168794bfae0cb4c15df72..8a740d788abd209b4fc5c0e782be51f6ceaf3fa9 100644
--- a/helios/templates/election_build.html
+++ b/helios/templates/election_build.html
@@ -1,7 +1,8 @@
 {% extends "helios/templates/cryptobase.html" %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Questions <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Otázky <span style="font-size:0.7em;">[<a href="{% url "helios.views.one_election_view" election.uuid %}">zpět k hlasování</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Otázky <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">zpět k hlasování</a>]</span></h2>
 
   <script language="javascript">
 {% if election.questions %}
@@ -13,26 +14,26 @@
   CSRF_TOKEN = '{{csrf_token}}';
 
   function refresh() {
-      $('#questions').processTemplate({'questions' : QUESTIONS});            
+      $('#questions').processTemplate({'questions' : QUESTIONS});
   }
-  
+
   $(document).ready(function() {
       $('#questions').setTemplateURL("/static/helios/static_templates/question.html");
 
-      $('#questions').processTemplate({'questions' : QUESTIONS});      
+      $('#questions').processTemplate({'questions' : QUESTIONS});
   });
-  
+
   function save_questions(callback) {
       $.post('./save_questions', {'questions_json' : $.toJSON(QUESTIONS), 'csrf_token': CSRF_TOKEN}, function(result) {
-          callback();          
-      });      
+          callback();
+      });
   }
-  
+
   function question_add(form) {
       var max = null;
       if (form.max.value != "")
         max = parseInt(form.max.value);
-        
+
       var new_q = {'question' : form.question.value, 'min': parseInt(form.min.value), 'max': max, 'short_name': form.question.value, 'answers': [], 'answer_urls': [], 'choice_type': form.choice_type.value, 'tally_type': 'homomorphic', 'result_type': form.result_type.value};
       var i = 0;
       while(true) {
@@ -42,12 +43,12 @@
           new_q.answers[i-1] = form['answer_' + i].value;
           new_q.answer_urls[i-1] = form['answer_urls_' + i].value;
       }
-      
+
       QUESTIONS.push(new_q);
-      
+
       save_questions(refresh);
   }
-  
+
   function question_remove(q_num) {
       var new_questions = [];
       $(QUESTIONS).each(function(i, q) {
@@ -63,6 +64,6 @@
 
   <div id="questions">
   </div>
-					
+
 			<!-- end #content -->
 {% endblock %}
diff --git a/helios/templates/election_cast_confirm.html b/helios/templates/election_cast_confirm.html
index 173d729c62997569d22c4b20fbcf081e775cc8c5..5831b2337d1a78b5aedcf759998bb891006fcbc9 100644
--- a/helios/templates/election_cast_confirm.html
+++ b/helios/templates/election_cast_confirm.html
@@ -1,5 +1,5 @@
 {% extends TEMPLATE_BASE %}
-{% block title %}Confirm Vote{% endblock %}
+{% block title %}Potvrďte svůj hlas{% endblock %}
 
 {% block content %}
 <script language="javascript">
@@ -23,21 +23,21 @@ window.onbeforeunload = function(evt) {
   if (typeof evt == 'undefined') {
     evt = window.event;
   }
-  
-  var message = "You have not yet cast your ballot! Make sure to complete the voting process if you want your vote to count.";
+
+  var message = "Ještě jste neodevzdal svůj hlasovací lístek! Chcete-li, aby váš hlas byl započten, musíte hlasovací proces dokončit.";
 
   if (evt) {
     evt.returnValue = message;
   }
-  
+
   return message;
 };
 
 </script>
-<p style="margin-top: 10px">Submitting your vote for <b>{{election.name}}</b>...</p>
+<p style="margin-top: 10px">Odesílám váš hlas v hlasování <b>{{election.name}}</b>...</p>
 
 <div id="waiting_div">
-    Verifying and Casting your ballot<br />
+    Kontroluji a odevzdávám váš hlasovací lístek<br />
     <img src="/static/helios/loading.gif" />
 </div>
 
@@ -51,10 +51,10 @@ window.onbeforeunload = function(evt) {
 
 {% if show_password %}
 {% if user %}
-<h1>Wait!</h1>
+<h1>Pozor!</h1>
 <p>
-You are logged in as <u>{{user.display_html_small|safe}}</u>, but this election<br />
-requires election-specific credentials.
+Jste přihlášen jako <u>{{user.display_html_small|safe}}</u>, ale toto hlasování<br />
+vyžaduje speciální oprávnění.
 </p>
 {% endif %}
 {% with cast_ballot="1" %}
@@ -64,42 +64,42 @@ requires election-specific credentials.
 {% else %}
 
 {% if user %}
-<h1>Sorry!<h1>
-<b>Sorry, you are <em>
+<h1>Je nám líto!<h1>
+<b>Bohužel <em>
   {% if election.openreg %}
-    <u>not eligible</u></em> for this election.
+    <u>nejste oprávněn</u></em> hlasovat v tomto hlasování.
   {% else %}
-    not registered</em> for this election, and registration is closed.
+    nejste v seznamu voličů</em> pro toto hlasování a seznam voličů byl již uzavřen.
   {% endif %}
   </b><br /></p>
 <p>
-    [<a href="{% url "election@view" election.uuid %}">return to the main election page</a>]
+    [<a href="{% url "election@view" election.uuid %}">návrat na úvodní stránku hlasování</a>]
 </p>
 {% else %}
 <p>
-<h1>Wait!  You need to log in.</h1>
+<h1>Pozor!  Musíte se přihlásit.</h1>
 {% if election.openreg %}
 
   {% if election.eligibility %}
   {% else %}
-   This election is open to <em>anyone</em>, so log in with your preferred account.
+   Tohoto hlasování se může zúčastnit <em>kdokoli</em>, přihlaste se tedy uživatelským účtem, kterému dáváte přednost.
   {% endif %}
 
 {% else %}
-  This election is only open to <em>registered voters</em>, so log in with
-  the same account you registered with.
+  Tohoto hlasování se mohou zúčastnit pouze <em>oprávnění voliči</em>, přihlaste se tedy
+  takovým uživatelským účtem, který vás opravňuje volit.
 {% endif %}
 </p>
 
 {{login_box|safe}}
 
 <br />
-Don't worry, we'll remember your ballot while you log in.
+Nemusíte mít obavy, svůj vyplněný hlasovací lístek budete mít k dispozici i po přihlášení.
 {% endif %}
 
 {% endif %}
 <br />
-Your smart ballot tracker is:<br /><br />
+Váš kód pro sledování hlasovacího lístku je:<br /><br />
     <tt style="font-size:1.3em; font-weight: bold; padding-left: 20px;">  {{vote_fingerprint}}</tt>
 </p>
 {# this closes the IF ELSE of this being password_only #}
diff --git a/helios/templates/election_compute_tally.html b/helios/templates/election_compute_tally.html
index 2ad050a0286f6787f84c9349a0b4b3b7170bf8e4..84110da33e6ea473df53b6b3725f7c6565bf06d8 100644
--- a/helios/templates/election_compute_tally.html
+++ b/helios/templates/election_compute_tally.html
@@ -1,30 +1,30 @@
 {% extends TEMPLATE_BASE %}
 
-{% block title %}Compute Encryted Tally for {{election.name}}{% endblock %}
+{% block title %}Spočítat zašifrovaný výsledek pro {{election.name}}{% endblock %}
 
 {% block content %}
-  <h2 class="title">Compute Tally for Election: {{election.name}}</h2>
+  <h2 class="title">Spočítat výsledek pro hlasování: {{election.name}}</h2>
 
 <div id="instructions">
 {% if election.num_cast_votes %}
 <p>
-    You are about to compute the encrypted tally for election <b>{{election.name}}</b>.
+    Chystáte se nechat spočítat zašifrovaný výsledek hlasování <b>{{election.name}}</b>.
 </p>
 
 <p>
-    Once you do this, voters will no longer be able to cast a ballot.
+    Jakmile tak učiníte, voliči již nebudou moci odevzdávat hlasovací lístky.
 </p>
 
-<form method="post" action="" onsubmit="alert('ok, tally has begun')" class="pretty">
+<form method="post" action="" onsubmit="alert('sčítání hlasů bylo zahájeno')" class="pretty">
 <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
-    
-<input class="button" type="submit" value="compute encrypted tally!" />
-<button onclick="document.location='{% url "election@view" election.uuid %}'; return false;">never mind</button>
+
+<input class="button" type="submit" value="Spočítat zašifrovaný výsledek!" />
+<button onclick="document.location='{% url "election@view" election.uuid %}'; return false;">ještě ne</button>
 </form>
 {% else %}
 <p>
-No votes have been cast in this election. At least one vote must be cast before you compute the tally.<br /><br />
-<a href="{% url "election@view" election.uuid %}">back to election</a>
+V tomto hlasování nebyl odevzdán žádný hlas. Aby mohl být spočítán výsledek, musí být odevzdán aspoň jeden hlas.<br /><br />
+<a href="{% url "election@view" election.uuid %}">zpět na hlasování</a>
 </p>
 {% endif %}
 </div>
diff --git a/helios/templates/election_edit.html b/helios/templates/election_edit.html
index 025b2585513d0240f0005e58de3b80e88f24f375..ca19bb65d650f1d114a4411ba0889c38d9d674ab 100644
--- a/helios/templates/election_edit.html
+++ b/helios/templates/election_edit.html
@@ -2,21 +2,21 @@
 
 {% block content %}
 
-  <h2 class="title">{{election.name}} &mdash; Update <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">cancel</a>]</span></h2>
-  
+  <h2 class="title">{{election.name}} &mdash; Upravit <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">zrušit</a>]</span></h2>
+
 {% if error %}
 <p style="color: red;">
     {{error}}
 </p>
 {% endif %}
-  
+
   <form class="prettyform" action="" method="POST" id="edit_election_form">
     <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
     <table class="pretty">
      {{election_form.as_table}}
      </table>
   <div>
-  <label for="">&nbsp;</label><input type="submit" value="Update" id="update_button" />
+  <label for="">&nbsp;</label><input type="submit" value="Upravit" id="update_button" />
   </div>
   </form>
 
diff --git a/helios/templates/election_extend.html b/helios/templates/election_extend.html
index 813afe7fd8309d449a63f505ef0327d3be23bef1..fc640dc4093775d02f31f645d87443b402839a87 100644
--- a/helios/templates/election_extend.html
+++ b/helios/templates/election_extend.html
@@ -2,15 +2,15 @@
 
 {% block content %}
 
-  <h2 class="title">{{election.name}} &mdash; Extend Voting <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">cancel</a>]</span></h2>
-  
+  <h2 class="title">{{election.name}} &mdash; Prodloužit hlasování <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">zrušit</a>]</span></h2>
+
   <form class="prettyform" action="" method="POST" id="edit_election_form">
     <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
     <table class="pretty">
      {{election_form.as_table}}
      </table>
   <div>
-  <label for="">&nbsp;</label><input type="submit" value="Extend Voting" id="update_button" />
+  <label for="">&nbsp;</label><input type="submit" value="Prodloužit hlasování" id="update_button" />
   </div>
   </form>
 
diff --git a/helios/templates/election_freeze.html b/helios/templates/election_freeze.html
index f0229be99638b268af28613b7fc0e83a302f799c..4ad2673958d5240c7f033a4e0d92458d675afa61 100644
--- a/helios/templates/election_freeze.html
+++ b/helios/templates/election_freeze.html
@@ -1,42 +1,42 @@
 {% extends TEMPLATE_BASE %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Freeze Ballot</h2>
+  <h2 class="title">{{election.name}} &mdash; Uzavřít hlasovací lístek</h2>
 <p>
-Once the ballot is frozen, the questions and options can no longer be modified.<br />
-The list of trustees and their public keys will also be frozen.
+Jakmile je hlasovací lístek uzavřen, otázky a možnosti již nemohou být změněny.<br />
+Bude také uzavřen seznam trustees jejich veřejných klíčů.
 </p>
 
 <p>
 {% if election.openreg %}
-Registration for your election is currently <b>open</b>, which means anyone can vote, even after you freeze the ballot.
+Registrace pro toto hlasování je <b>otevřená</b>, což znamená, že hlasovat může kdokoli, a to i po uzavření hlasovacího lístku.
 {% else %}
-Registration for your election is currently <b>closed</b>, which means only the voters you designate will be able to cast a ballot. As the administrator, you will still be able to modify that voter list as the election progresses.
+Registrace pro toto hlasování je <b>uzavřená</b>, což znamená že jen voliči, které určíte, budou moci odevzdat hlasovací lístek. Jste-li administrátor, budete moci upravit seznam voličů i během hlasování.
 {% endif %}
-</p>    
+</p>
 
 {% if helios.VOTERS_EMAIL %}
 <p>
-You must freeze the ballot before you can contact voters.
+Před kontaktováním voličů musíte uzavřít hlasovací lístek.
 </p>
 {% endif %}
 
 {% if issues_p %}
 <p>
-    Before you can freeze the election, you will need to:
+    Před uzavřením tvorby hlasování musíte:
     <ul>
         {% for issue in issues %}
         <li>{{issue.action}}</li>
         {% endfor %}
     </ul>
-    <a href="{% url "election@view" election.uuid %}">go back to the election</a>
+    <a href="{% url "election@view" election.uuid %}">zpět k hlasování</a>
 </p>
 {% else %}
 <form method="post" action="">
 <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
-    
-<input class="button" type="submit" value="Freeze the ballot" />
-<button onclick="document.location='{% url "election@view" election.uuid %}'; return false;">never mind</button>
+
+<input class="button" type="submit" value="Uzavřít hlasovací lístek" />
+<button onclick="document.location='{% url "election@view" election.uuid %}'; return false;">ještě ne</button>
 </form>
 {% endif %}
 
diff --git a/helios/templates/election_keygenerator.html b/helios/templates/election_keygenerator.html
index bce34b8755bce301212faba9ce284908a1d495b6..02d8e5073d704b6abaf20838b4564c9b7d9e6929 100644
--- a/helios/templates/election_keygenerator.html
+++ b/helios/templates/election_keygenerator.html
@@ -48,7 +48,7 @@ $(document).ready(function() {
 
 function generate_keypair() {
     $('#buttons').hide();
-    
+
     try {
         SECRET_KEY = ELGAMAL_PARAMS.generate();
     } catch (e) {
@@ -58,7 +58,7 @@ function generate_keypair() {
     setup_public_key_and_proof();
 }
 
-function setup_public_key_and_proof() {    
+function setup_public_key_and_proof() {
     // generate PoK of secret key
     PROOF = SECRET_KEY.proveKnowledge(ElGamal.fiatshamir_dlog_challenge_generator);
     PUBLIC_KEY = SECRET_KEY.pk;
@@ -99,14 +99,14 @@ function show_pk() {
 
 </script>
 
-<h2 class="title">{{election.name}} &mdash; Trustee {{trustee.name}} &mdash; Key Setup</h2>
+<h2 class="title">{{election.name}} &mdash; Trustee {{trustee.name}} &mdash; nastavení klíče</h2>
 
 <p>
-  As a trustee, it's time to set up your key for this election.
+  Jako trustee nyní musíte nastavit svůj klíč pro toto hlasování.
 </p>
 
 <p id="waiting_message">
-  Please wait for the generator to load...
+  Vyčkejte, prosím, nahrává se generátor...
 </p>
 
 <p id="generator">
@@ -114,64 +114,64 @@ function show_pk() {
 <span id="buttons"><button onclick="generate_keypair(); return false;" id="generate_button">Generate Election Keys</button></span>
 
 <br />
-If you've already generated a keypair, you can <a href="javascript:show_key_reuse()">reuse it</a>.
+Pokud máte již vygenerovaný pár klíčů, můžete jej <a href="javascript:show_key_reuse()">znovu použít</a>.
 </p>
 
 <div id="reuse">
-<h3>Reusing a Key</h3>
+<h3>Opětovné použití klíče</h3>
 
 <p>
-Enter your complete secret key below:
+Vložte celý svůj tajný klíč do okénka níže:
 </p>
 <form onsubmit="reuse_key(this.secret_key.value); return false;">
 <textarea cols="80" rows="5" wrap="soft" name="secret_key">
 </textarea>
 <br />
-<input type="submit" value="reuse" />
+<input type="submit" value="opětovně použít" />
 </form>
 </div>
 
 <div id="sk_download">
 <h3>Your Secret Key</h3>
 <span id="clear_button">
-Your key has been generated, but you may choose to<br /><a href="javascript:clear_keys();">clear it from memory and start from scratch</a> if you prefer.<br />
+Váš klíč byl vytvořen, ale můžete se rozhodnout<br /><a href="javascript:clear_keys();">vymazat ho z paměti a začít znovu</a>.<br />
 </span>
 
 <p>
-    <button style="font-size:16pt;" onclick="download_sk(); $('#pk_link').show();">Show my secret key</button>
+    <button style="font-size:16pt;" onclick="download_sk(); $('#pk_link').show();">Zobrazit tajný klíč</button>
 </p>
 </div>
 
 <div style="display:none;" id="pk_content">
-    <p>Bellow is your trustee secret key content. Please copy its content and save it securely. <br>
-       You can also click to dowload it to a file.
-       And please don't lose it! Otherwise it will not be possible to decrypt the election tally.<br>
+    <p>Níže je zobrazen váš tajný klíč. Prosím zkopírujte si ho a bezpečně uložte. <br>
+       Můžete si ho také kliknutím stáhnout v souboru.
+       A prosím neztraťte ho! Jinak nebude možné hlasování dešifrovat.<br>
     </p>
     <textarea id="sk_content" rows="5" wrap="soft" cols="50" style="height: 25em;"></textarea>
 </div>
 
 <div style="display:none;" id="pk_link">
 <p>
-<a id="download_to_file" href="javascript:download_sk_to_file('trustee_key_for_{{election.name}}.txt');">download private key to a file</a>
+<a id="download_to_file" href="javascript:download_sk_to_file('trustee_key_for_{{election.name}}.txt');">uložit soubor s tajným klíčem</a>
 </p>
 <p>
-  <a href="javascript:show_pk();">ok, I've saved the key, let's move on</a>
+  <a href="javascript:show_pk();">ok, klíč mám uložen, můžeme pokračovat</a>
 </p>
 </div>
 
 <form method="post" id="pk_form" action="{% url "election@trustee@upload-pk" election.uuid trustee.uuid %}">
 <h3>Your Public Key</h3>
 <p>
-    It's time to upload the public key to the server.
+    Nyní je třeba nahrát váš veřejný klíč na server.
 </p>
 <p>
-    The fingerprint of your public key is: <tt id="pk_hash" style="font-size: 1.5em; font-weight: bold;"></tt>.<br />
-    You may want to save this to confirm that your public key was properly stored by the server.<br />
-    (Your public key is not currently being displayed because you do not need to save it, the fingerprint is sufficient.)
+    Otisk vašeho veřejného klíče je: <tt id="pk_hash" style="font-size: 1.5em; font-weight: bold;"></tt>.<br />
+    Můžete si ho uložit kvůli ověření, že váš veřejný klíč byl v pořádku uložen na server.<br />
+    (Nezobrazujeme celý váš veřejný klíč, neboť není potřeba, abyste si ho ukládal, otisk postačuje.)
 </p>
 <textarea id="pk_textarea" name="public_key_json" cols="80" rows="10" style="display:none;">
 </textarea>
-<input type="submit" value="Upload your public key">
+<input type="submit" value="Nahrát veřejný klíč">
 </form>
 
 <div id="applet_div"></div>
diff --git a/helios/templates/election_new.html b/helios/templates/election_new.html
index 1e5e2ec0f97a2eaa1e7f633c4217d0b4732eed0d..bdba5a20bbc7ed15ed0d29575bb4b824eec41160 100644
--- a/helios/templates/election_new.html
+++ b/helios/templates/election_new.html
@@ -2,7 +2,7 @@
 
 {% block content %}
 
-  <h2 class="title">Create a New Election</h2>
+  <h2 class="title">Vytvořit nové hlasování</h2>
   
 {% if error %}
 <p style="color: red;">
@@ -16,7 +16,7 @@
      {{election_form.as_table}}
      </table>
   <div>
-  <label for="">&nbsp;</label><input type="submit" value="Next &gt;&gt;" id="next_button" />
+  <label for="">&nbsp;</label><input type="submit" value="Pokračovat &gt;&gt;" id="next_button" />
   </div>
   </form>
 
diff --git a/helios/templates/election_not_started.html b/helios/templates/election_not_started.html
index 595b9d1e80bb43d6b7c4f7f8969003a0a78eba6a..3735a12a4466af35e9171d9bf42caec1f0ba9c9e 100644
--- a/helios/templates/election_not_started.html
+++ b/helios/templates/election_not_started.html
@@ -2,18 +2,18 @@
 
 {% block content %}
 
-  <h2 class="title">Election {{election.name}} Not Yet Open</h2>
+  <h2 class="title">Hlasování {{election.name}} ještě nebylo zahájeno</h2>
 
   <p>
-      This election is not yet open.
+      Toto hlasování ještě nebylo zahájeno.
   </p>
-  
+
   <p>
-      {% if election.voting_start_at %}Voting start at {{election.voting_start_at}}<br />{% endif %}
-      {% if election.voting_end_at %}Voting end at {{election.voting_end_at}}<br />{% endif %}  
+      {% if election.voting_start_at %}začátek hlasování: {{election.voting_start_at}}<br />{% endif %}
+      {% if election.voting_end_at %}konec hlasování: {{election.voting_end_at}}<br />{% endif %}
   </p>
-  
+
   <p>
-      <a href="{% url "election@view" election.uuid %}">back to the election</a>
+      <a href="{% url "election@view" election.uuid %}">zpět k hlasování</a>
   </p>
 {% endblock %}
diff --git a/helios/templates/election_questions.html b/helios/templates/election_questions.html
index c721c8a349535b7c2f11e362953910e9cc535152..ebe3bc34f259b45f11b1f01abe262033d1e36bf0 100644
--- a/helios/templates/election_questions.html
+++ b/helios/templates/election_questions.html
@@ -1,8 +1,8 @@
 {% extends "helios/templates/cryptobase.html" %}
 
-{% block title %}Questions for {{election.name}}{% endblock %}
+{% block title %}Otázky pro {{election.name}}{% endblock %}
 {% block content %}
-  <h3 class="title">{{election.name}} &mdash; Questions <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h3>
+  <h3 class="title">{{election.name}} &mdash; Otázky <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">zpět k hlasování</a>]</span></h3>
 
   <script language="javascript">
 {% if election.questions %}
@@ -19,26 +19,26 @@
   CSRF_TOKEN = '{{csrf_token}}';
 
   function refresh() {
-      $('#questions').processTemplate({'questions' : QUESTIONS, 'admin_p' : ADMIN_P}); 
+      $('#questions').processTemplate({'questions' : QUESTIONS, 'admin_p' : ADMIN_P});
 
       add_answers($('#answer_table'),DEFAULT_NUM_ANSWERS);
  }
-  
+
   function save_questions(callback) {
       $.post('./save_questions', {'questions_json' : $.toJSON(QUESTIONS), 'csrf_token': CSRF_TOKEN}, function(result) {
           if (result == "FAILURE") {
-            alert("The questions could not be saved. Please check that the URLs you entered are either http:// or https://");
+            alert("Otázky nelze uložit. Zkontrolujte, prosím, že zadané URL jsou typu http:// nebo https://");
           } else {
             callback();
           }
-      });      
+      });
   }
-  
+
   function get_question_from_form(form) {
       var max = null;
       if (form.max.value != "")
         max = parseInt(form.max.value);
-        
+
       var new_q = {'question' : form.question.value, 'min': parseInt(form.min.value), 'max': max, 'short_name': form.question.value, 'answers': [], 'answer_urls': [], 'choice_type': form.choice_type.value, 'tally_type': 'homomorphic', 'result_type': form.result_type.value, 'randomize_answer_order': form.randomize_answer_order.value == "1"};
       var i = 0;
       while(true) {
@@ -48,11 +48,11 @@
           new_q.answers[i-1] = form['answer_' + i].value;
           new_q.answer_urls[i-1] = form['answer_url_' +i].value;
       }
-      
+
       if (new_q.answers.length == 0) {
         return null;
       }
-      
+
       return new_q;
   }
 
@@ -63,7 +63,7 @@
         save_questions(refresh);
       }
   }
-  
+
   function question_remove(q_num) {
       var new_questions = [];
       $(QUESTIONS).each(function(i, q) {
@@ -117,7 +117,7 @@
   function add_answer(el) {
     el = $(el);
     var num_answers = el.find('input.answer').length + 1;
-    el.find('tbody').append('<tr><th>&nbsp;&nbsp;&nbsp;</th><th>Answer #' + num_answers + '</th><td><input type="text" class="answer" name="answer_' + num_answers + '" size="70" /><br /><nobr>Link (optional, <tt>http</tt> or <tt>https</tt> only): <input type="url" name="answer_url_' + num_answers + '" width="50%" /></nobr></td></tr>');
+    el.find('tbody').append('<tr><th>&nbsp;&nbsp;&nbsp;</th><th>Odpověď #' + num_answers + '</th><td><input type="text" class="answer" name="answer_' + num_answers + '" size="70" /><br /><nobr>Odkaz (nepovinný, jen typu <tt>http</tt> nebo <tt>https</tt>): <input type="url" name="answer_url_' + num_answers + '" width="50%" /></nobr></td></tr>');
   }
 
   function add_answers(el, num) {
@@ -137,12 +137,12 @@
 
       refresh();
   });
-  
+
 
   </script>
 
   <div id="questions">
   </div>
-					
+
 			<!-- end #content -->
 {% endblock %}
diff --git a/helios/templates/election_register.html b/helios/templates/election_register.html
index 96a6004559183e637159bf056f614f1ef9da47be..3634c9a311fdae99a37df608566b227416621d78 100644
--- a/helios/templates/election_register.html
+++ b/helios/templates/election_register.html
@@ -1,27 +1,27 @@
 {% extends TEMPLATE_BASE %}
 
 {% block content %}
-  <h2 class="title">{{ election.name }} – Register</h2>
+  <h2 class="title">{{ election.name }} – Registrace</h2>
 
 {% if user %}
 <p>
-    You are currently logged in as {{user.user_id}} [{{user.user_type}}]
+    Jste přihlášen jako {{user.user_id}} [{{user.user_type}}]
 </p>
 {% if voter %}
 <p>
-    You are currently registered for this election.
+    Jste registrován pro toto hlasování.
 </p>
 {% else %}
 <p>
-    You are <em>not</em> registered for this election.
+    <em>Nejste</em> registrován pro toto hlasování.
 </p>
 
 <form method="post" action="{% url "election@register" election.uuid %}">
-<input type="submit" value="register!" />
+<input type="submit" value="registrovat se!" />
 </form>
 {% endif %}
 
 {% else %}
 {% endif %}
 
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/helios/templates/election_tallied.html b/helios/templates/election_tallied.html
index a187e5625d434c90d09ecdcbcbac37242675490f..dd729d281e1df1a542157f443a56b623ed4bc341 100644
--- a/helios/templates/election_tallied.html
+++ b/helios/templates/election_tallied.html
@@ -2,18 +2,18 @@
 
 {% block content %}
 
-  <h2 class="title">Election {{election.name}} Already Tallied</h2>
+  <h2 class="title">Hlasování {{election.name}} bylo sečteno</h2>
 
   <p>
-      This election has already been tallied, you can no longer cast a vote.
+      Toto hlasování bylo sečteno, již nelze odevzdat hlas.
   </p>
-  
+
   <p>
-      {% if election.voting_start_at %}Voting start at {{election.voting_start_at}}<br />{% endif %}
-      {% if election.voting_end_at %}Voting end at {{election.voting_end_at}}<br />{% endif %}
+      {% if election.voting_start_at %}začátek hlasování: {{election.voting_start_at}}<br />{% endif %}
+      {% if election.voting_end_at %}konec hlasování: {{election.voting_end_at}}<br />{% endif %}
   </p>
-  
+
   <p>
-      <a href="{% url "election@view" election.uuid %}">view the election tally</a>
+      <a href="{% url "election@view" election.uuid %}">prohlédnout si výsledek hlasování</a>
   </p>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/helios/templates/election_view.html b/helios/templates/election_view.html
index c89721c7aad7a9e47816587710aebd8524dd5c24..0d04aa626c75e4791aadc6a01618714450ebe77f 100644
--- a/helios/templates/election_view.html
+++ b/helios/templates/election_view.html
@@ -5,30 +5,30 @@
   <h3 class="title">{{ election.name }}
 {% if admin_p %}
 {% if not election.frozen_at %}
-<small><a class="small button" href="{% url "election@edit" election.uuid %}">edit</a></small>
+<small><a class="small button" href="{% url "election@edit" election.uuid %}">upravit</a></small>
 {% endif %}
 {% endif %}</h3>
 <p style="padding-top:0px; margin-top:0px">
-<em>{% if election.private_p %}private{%else%}public{% endif %}</em> {{ election.election_type }}{% if settings.SHOW_USER_INFO %} created by <u><b>{{election.admin.display_html_small|safe}}</b></u>{% endif %}
+<em>{% if election.private_p %}soukromé{%else%}veřejné{% endif %}</em> {{ election.election_type }}{% if settings.SHOW_USER_INFO %} vytvořeno uživatelem <u><b>{{election.admin.display_html_small|safe}}</b></u>{% endif %}
 {% if election.is_archived %}
 [archived]
 {% endif %}
 {% if admin_p %}
-&nbsp;{% if election.is_archived %}<a class="small button" href="{% url "election@archive" election_uuid=election.uuid %}?archive_p=0">unarchive it</a>{% else %}<a class="small button" href="{% url "election@archive" election_uuid=election.uuid %}?archive_p=1">archive it</a>{% endif %}
-<a class="small button" onclick="return window.confirm('Are you sure you want to copy this election?');" href="{% url "election@copy" election_uuid=election.uuid %}">copy</a>
+&nbsp;{% if election.is_archived %}<a class="small button" href="{% url "election@archive" election_uuid=election.uuid %}?archive_p=0">zrušit archivaci</a>{% else %}<a class="small button" href="{% url "election@archive" election_uuid=election.uuid %}?archive_p=1">archivovat</a>{% endif %}
+<a class="small button" onclick="return window.confirm('Jste si jist, že chcete zkopírovat toto hlasování?');" href="{% url "election@copy" election_uuid=election.uuid %}">kopírovat</a>
 {% endif %}
 <br />
 {% if admin_p %}
 {% if not election.private_p %}
 {% if election.featured_p %}
-this {{election.election_type}} is featured on the front page.
+toto {{election.election_type}} je zobrazeno na titulní stránce.
 {% if can_feature_p %}
 [<a href="{% url "election@set-featured" election.uuid %}?featured_p=0">unfeature it</a>]
 {% endif %}
 {% else %}
-this {{election.election_type}} is <u>not</u> featured on the front page.
+toto {{election.election_type}} <u>není</u> zobrazeno na titulní stránce.
 {% if can_feature_p %}
-[<a href="{% url "election@set-featured" election.uuid %}?featured_p=1">feature it</a>]
+[<a href="{% url "election@set-featured" election.uuid %}?featured_p=1">zobrazit</a>]
 {% endif %}
 {% endif %}
 {% endif %}
@@ -42,14 +42,14 @@ this {{election.election_type}} is <u>not</u> featured on the front page.
 
 <br clear="left" />
 
-<div style="margin-bottom: 25px; line-height: 1.3;">
+<div style="margin-bottom: 25px; line-height: 1.3; border: 1px solid #888888; padding: 20px;">
 {{election.description_bleached|safe}}
 </div>
 
 <p>
-{% if election.help_email and admin_p%}Help Email Address: {{election.help_email}}<br />{% endif %}
-{% if election.voting_start_at %}Voting start at {{election.voting_start_at}}<br />{% endif %}
-{% if election.voting_end_at %}Voting end at {{election.voting_end_at}}<br />{% endif %}
+{% if election.help_email and admin_p%}Email pro nápovědu: {{election.help_email}}<br />{% endif %}
+{% if election.voting_start_at %}Hlasování začíná: {{election.voting_start_at}}<br />{% endif %}
+{% if election.voting_end_at %}Hlasování končí: {{election.voting_end_at}}<br />{% endif %}
 </p>
 
 {% if election.election_info_url %}
@@ -57,9 +57,9 @@ this {{election.election_type}} is <u>not</u> featured on the front page.
 {% endif %}
 
 <p align="center" style="font-size: 1.5em;">
-<a href="{% url "election@questions" election.uuid %}">questions ({% if election.questions %}{{election.questions|length}}{% else %}0{% endif %})</a>
+<a href="{% url "election@questions" election.uuid %}">otázky ({% if election.questions %}{{election.questions|length}}{% else %}0{% endif %})</a>
 &nbsp;&nbsp;|&nbsp;&nbsp;
-<a href="{% url "election@voters@list-pretty" election.uuid %}">voters &amp; ballots</a>
+<a href="{% url "election@voters@list-pretty" election.uuid %}">voliči a hlasovací lístky</a>
 &nbsp;&nbsp;|&nbsp;&nbsp;
 <a href="{% url "election@trustees@view" election.uuid %}">trustees ({{trustees|length}})</a>
 </p>
@@ -85,21 +85,21 @@ this {{election.election_type}} is <u>not</u> featured on the front page.
 <!-- election complete, no next step -->
 
 {% else %}
-<b>Next Step:</b>
+<b>Další krok:</b>
 <span style="font-size: 1.3em;">
 {% if not election.frozen_at %}
 {% if election.issues_before_freeze %}
 {% for issue in election.issues_before_freeze %}
-{{issue.action}}{% if forloop.last %}{% else %}, and{% endif %}<br />
+{{issue.action}}{% if forloop.last %}{% else %}, a{% endif %}<br />
 {% endfor %}
 {% else %}
-<a href="{% url "election@freeze" election.uuid %}">freeze ballot and open election.</a>
+<a href="{% url "election@freeze" election.uuid %}">Ukončit tvorbu hlasovacího lístku a zahájit hlasování.</a>
 <br />
 {% if election.voting_starts_at %}
-once you do this, the election will be ready for voting and will open automatically<br />
-at {{election.voting_starts_at}}, as per your settings.
+jakmile to učiníte, hlasování bude připraveno k odevzdávání hlasovacích lístků a bude automaticky zahájeno<br />
+v {{election.voting_starts_at}}, podle vašeho nastavení.
 {% else %}
-once you do this, the election will be immediately open for voting.
+jakmile to učiníte, hlasování bude ihned zahájeno.
 {% endif %}
 {% endif %}
 
@@ -107,37 +107,37 @@ once you do this, the election will be immediately open for voting.
 
 {% if not election.encrypted_tally %}
 {% if election.tallying_started_at %}
-Tally computation is under way.<br />
-Reload this page in a couple of minutes.
+Probíhá výpočet celkových výsledků hlasování.<br />
+Načtěte tuto stránku znovu po uplynutí několika minut.
 {% else %}
-<a href="{% url "election@compute-tally" election.uuid %}">compute encrypted tally</a><br />
-The encrypted votes will be combined into an encrypted tally. Once this is done,<br />
-trustees will be asked to provide their share of the decryption.
+<a href="{% url "election@compute-tally" election.uuid %}">vytvořit šifrováný celkový výsledek hlasování</a><br />
+Ze zašifrovaných hlasů bude vytvořen celkový výsledek, rovněž zašifrovaný. Poté budou<br />
+trustees požádáni, aby provedli jeho dílčí dešifrování.
 {% endif %}
 {% else %}
 
 {% if election.result %}
-<a href="{% url "election@release-result" election.uuid %}">release result</a><br />
-The result displayed below is visible only to you.<br />
-Once you release the result, it will be visible to everyone.
+<a href="{% url "election@release-result" election.uuid %}">zveřejnit výsledek</a><br />
+Zobrazený výsledek hlasování vidíte pouze vy.<br />
+Jakmile ho zveřejníte, bude si ho moci prohlédnout kdokoli.
 {% else %}
 
 {% if election.ready_for_decryption_combination %}
 <a href="{% url "election@combine-decryptions" election.uuid %}">
 {% if election.num_trustees == 1 %}
-compute results
+vypočítat výsledek
 {% else %}
-combine trustee decryptions and compute results
+spojit dílčí výsledky dešifrované trustees a vypočítat výsledek
 {% endif %}
 </a><br />
 {% if election.num_trustees == 1 %}
-The result will be computed and shown to you, the administrator, only.
+Vypočtený výsledek budete vidět pouze vy jakožto zakladatel hlasování.
 {% else %}
-The decryption shares from the trustees will be combined and the tally computed.<br />
-Once you do this, the tally will visible to you, the administrator, only.
+Dílčí výsledky dešifrované trustees budou spojeny a bude vypočten celkový výsledek.<br />
+Poté uvidíte výsledek pouze vy jakožto zakladatel hlasování.
 {% endif %}
 {% else %}
-<a href="{% url "election@trustees@view" election.uuid %}">trustees (for decryption)</a>
+<a href="{% url "election@trustees@view" election.uuid %}">trustees (pro dešifrování)</a>
 {% endif %}
 
 {% endif %}
@@ -158,13 +158,13 @@ Once you do this, the tally will visible to you, the administrator, only.
 {% if show_result %}
 {% if election.result_released_at %}
 <span class="highlight-box round">
-    This election is complete.
+    Toto hlasování bylo ukončeno. Výsledek byl zveřejněn {{election.result_released_at}}. Celkem bylo odevzdáno {{election.num_cast_votes}} hlasů.
 </span><br /><br /><br />
 {% endif %}
 
-<h3 class="highlight-box">Tally</h3>
+<h3 class="highlight-box">Výsledek hlasování</h3>
 {% for question in election.pretty_result %}
-<b><span style="font-size:0.8em;">Question #{{forloop.counter}}</span><br />{{question.question}}</b><br />
+<b><span style="font-size:0.8em;">Otázka #{{forloop.counter}}</span><br />{{question.question}}</b><br />
 <table class="pretty" style="width: auto;">
 {% for answer in question.answers %}
 <tr><td style="padding-right:80px;{% if answer.winner %}font-weight:bold;{% endif %}">{{answer.answer}}</td><td align="right" style="{% if answer.winner %}font-weight:bold;{% endif %}">{{answer.count}}</td></tr>
@@ -176,23 +176,23 @@ Once you do this, the tally will visible to you, the administrator, only.
 
 {% if election.voting_has_stopped %}
 <span class="highlight-box round">
-    Election closed. Results will be released soon.
+    Hlasování bylo uzavřeno. Výsledky budou brzy zveřejněny.
 </span><br /><br />
 {% else %}
 
 {% if election.voting_has_started %}
-<a class="button" href="{{test_cookie_url}}">Vote in this {{election.election_type}} </a>
+<a class="button" href="{{test_cookie_url}}">Hlasovat v tomto {{election.election_type}} </a>
 <br />
 <br />
 {% if election.voting_extended_until %}
-This {{election.election_type}} was initially scheduled to end at {{election.voting_ends_at}} (UTC),<br />
-but has been extended until {{ election.voting_extended_until }} (UTC).
+Toto {{election.election_type}} mělo původně skončit v {{election.voting_ends_at}} (UTC),<br />
+ale bylo prodlouženo do {{ election.voting_extended_until }} (UTC).
 {% else %}
 {% if election.voting_ends_at %}
 <br />
-This {{election.election_type}} is scheduled to end at {{election.voting_ends_at}} (UTC).
+Toto {{election.election_type}} bude uzavřeno v {{election.voting_ends_at}} (UTC).
 {% else %}
-This {{election.election_type}} ends at the administrator's discretion.
+Toto {{election.election_type}} bude uzavřeno podle rozhodnutí jeho zakladatele.
 {% endif %}
 <br />
 {% endif %}
@@ -209,16 +209,16 @@ This election is <em>private</em>. You are signed in as eligible voter <em>{{vot
 <br />
 {% else %}
 <span class="highlight-box round">
-  voting is not yet open
+  hlasování ještě nebylo zahájeno
 </span> <br /><br />
 {% endif %}
 
 {% if user %}
 {% if voter %}
 <p style="padding-top:1px;">
-  You are registered to vote in this {{election.election_type}}.
+  Jste v seznamu voličů pro toto {{election.election_type}}.
 {% if election.use_voter_aliases %}
-Your voter alias is {{voter.alias}}.
+Váš voličský alias je {{voter.alias}}.
 {% endif %}
 </p>
 
@@ -227,12 +227,12 @@ Your voter alias is {{voter.alias}}.
 {% else %}
 {% if election.openreg %}
 {% if eligible_p %}
-You are eligible to vote in this election.
+Jste oprávněn hlasovat v tomto {{election.election_type}}.
 {% else %}
-You are <em>not eligible</em> to vote in this {{election.election_type}}.
+<em>Nejste oprávněn</em> hlasovat v tomto {{election.election_type}}.
 {% endif %}
 {% else %}
-You are <em>not eligible</em> to vote in this {{election.election_type}}.
+<em>Nejste oprávněn</em> hlasovat v tomto {{election.election_type}}.
 <br />
 {% endif %}
 {% endif %}
@@ -241,10 +241,10 @@ You are <em>not eligible</em> to vote in this {{election.election_type}}.
 
 {% if election.openreg %}
 {% if election.eligibility %}
-This election is open to: {{election.pretty_eligibility|safe}}
-<a href="{{settings.SECURE_URL_HOST}}{% url "auth@index" %}?return_url={{CURRENT_URL}}">Log in</a> to check your eligibility.
+V tomto hlasování mohou hlasovat: {{election.pretty_eligibility|safe}}
+<a href="{{settings.SECURE_URL_HOST}}{% url "auth@index" %}?return_url={{CURRENT_URL}}">Přihlaste se</a> pro ověření, zda jste oprávněn hlasovat.
 {% else %}
-Anyone can vote in this election.
+V tomto hlasování může hlasovat kdokoli.
 {% endif %}
 {% endif %}
 
@@ -261,17 +261,17 @@ Anyone can vote in this election.
 <div style="background: lightyellow; padding:5px; padding-left: 10px; margin-top: 15px; border: 1px solid #aaa; width: 720px;" class="round">
 <a href="#" onclick="$('#auditbody').slideToggle(250);">Audit Info</a>
 <div id="auditbody" style="display:none;">
-<br />Election URL:<br />
+<br />URL hlasování:<br />
 <tt style="font-size: 1.2em;"><a href="{{election.url}}">{{election.url}}</a></tt>
 
 {% if election.frozen_at %}
 <br />
-<br />Election Fingerprint:<br />
+<br />Otisk hlasování:<br />
 <tt style="font-size: 1.3em; font-weight: bold;">{{election.hash}}</tt>
 
 
 {% if votes %}
-<p>Your smart ballot tracker:<br />
+<p>Váš kód pro sledování hlasovacího lístku:<br />
 <tt style="font-size:14pt; font-weight: bold;">{{votes.0.vote_hash}}</tt>
 </p>
 {% endif %}
@@ -287,12 +287,12 @@ Anyone can vote in this election.
 <p style="font-size: 1.2em;">
   <a href="{{SECURE_URL_HOST}}/booth/vote.html?election_url={% url "election@home" election.uuid %}">preview booth</a>
 </p>
-{% endif %}  
+{% endif %}
 
 {% if election.voting_has_stopped %}
 <p style="font-size: 1.2em;">
 {% if election.result %}
-verify <a target="_blank" href="/verifier/verify.html?election_url={% url "election@home" election.uuid %}">election tally</a>.
+ověřit <a target="_blank" href="/verifier/verify.html?election_url={% url "election@home" election.uuid %}">výsledek hlasování</a>.
 {% endif %}
 
 review the <a href="{{vote_url}}">voting booth</a>.
diff --git a/helios/templates/elections_administered.html b/helios/templates/elections_administered.html
index 563ecc9fe5450e42a2b2ae9ed144648b4eb5e9bb..366147f4325ad56a0c35a05785065ae1f4f1f71c 100644
--- a/helios/templates/elections_administered.html
+++ b/helios/templates/elections_administered.html
@@ -1,11 +1,11 @@
 {% extends TEMPLATE_BASE %}
 
 {% block content %}
-  <h2 class="title">Elections you Administer <span style="font-size:0.7em;">[<a href="/">back to home</a>]</span></h2>
+  <h2 class="title">Hlasování, která spravujete <span style="font-size:0.7em;">[<a href="/">zpět na úvodní stránku</a>]</span></h2>
 
 <ul>
 {% for election in elections %}
-<li> <a href="{% url "election@view" election.uuid %}">{{election.name}}</a><em> - {{election.num_voters}} voters / {{election.num_cast_votes}} cast votes</em></li>
+<li> <a href="{% url "election@view" election.uuid %}">{{election.name}}</a><em> - {{election.num_voters}} voličů / {{election.num_cast_votes}} odevzdaných hlasů</em></li>
 {% endfor %}
 </ul>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/helios/templates/elections_voted.html b/helios/templates/elections_voted.html
index f013a983b72c4991f9d4a6a353747a55b5708193..08effff233bfd68720b0d0845a9e78a567b029fd 100644
--- a/helios/templates/elections_voted.html
+++ b/helios/templates/elections_voted.html
@@ -1,7 +1,7 @@
 {% extends TEMPLATE_BASE %}
 
 {% block content %}
-  <h2 class="title">Elections where you voted <span style="font-size:0.7em;">[<a href="/">back to home</a>]</span></h2>
+  <h2 class="title">Hlasování, v nichž jste hlasoval <span style="font-size:0.7em;">[<a href="/">zpět na úvodní stránku</a>]</span></h2>
 
 <ul>
 {% for election in elections %}
diff --git a/helios/templates/email/info_body.txt b/helios/templates/email/info_body.txt
index e717a8ae89228f9ae23467b565606e7103683fa9..2a0b68cd876bce342f6f440972d4c513efb9f699 100644
--- a/helios/templates/email/info_body.txt
+++ b/helios/templates/email/info_body.txt
@@ -1,8 +1,8 @@
-Dear {{voter.name}},
+Vážený {{voter.name}},
 
 {{custom_message|safe}}
 
-Election Link: {{election_vote_url}}
+Odkaz na volby: {{election_vote_url}}
 
 --
 Helios
diff --git a/helios/templates/email/info_subject.txt b/helios/templates/email/info_subject.txt
index 6b43baf0eaba00a7824545efec89d74dc56bfa5a..ea0a8886bff4004c8c631820bd7550f0bb2dd9bb 100644
--- a/helios/templates/email/info_subject.txt
+++ b/helios/templates/email/info_subject.txt
@@ -1 +1 @@
-Additional Information: {{custom_subject|safe}}
+Další informace: {{custom_subject|safe}}
diff --git a/helios/templates/email/result_body.txt b/helios/templates/email/result_body.txt
index 69fd3daf53adf9e363625e63a93ef2342856012e..fc71cc972d0e96fab09a953215bd7c398a3b6796 100644
--- a/helios/templates/email/result_body.txt
+++ b/helios/templates/email/result_body.txt
@@ -1,19 +1,19 @@
-Dear {{voter.name}},
+Vážený {{voter.name}},
 
-The tally for {{election.name}} has been computed and released:
+Celkový výsledek pro {{election.name}} byl vypočítán a zveřejněn:
 
   {{election_url}}
 
 {{custom_message|safe}}
 
-{% if voter.vote_hash %}Your smart ballot tracker in this election was:
+{% if voter.vote_hash %}Váš chytry sledovač lístku pro toto hlasování byl:
 
   {{voter.vote_hash}}
 
-If you believe this tracker to be in error, please contact us.
+Pokud myslíte že tento sledovač je chybný, prosím kontaktuje nás.
 {% else %}
-It appears you did not cast a vote in this election.
-Please contact us if you believe you did.
+Vyoadá to, že v těchto volbách jste nehlasovali.
+Prosím kontaktujte nás, pokud si myslíte, že ano.
 {% endif %}
 --
 Helios
diff --git a/helios/templates/email/result_subject.txt b/helios/templates/email/result_subject.txt
index c7ac9f472e3498ec13d570f798d58c051c2239c8..3153c639604b4649e5d7333e4e9bde843035d621 100644
--- a/helios/templates/email/result_subject.txt
+++ b/helios/templates/email/result_subject.txt
@@ -1 +1 @@
-Tally Released - {{custom_subject|safe}}
+Výsledek zveřejněn - {{custom_subject|safe}}
diff --git a/helios/templates/email/simple_body.txt b/helios/templates/email/simple_body.txt
index 695fee4d070355eccba3ad984de0bad4e773dde2..560ff7b1adc31467c93501d003b191ad96fbbe13 100644
--- a/helios/templates/email/simple_body.txt
+++ b/helios/templates/email/simple_body.txt
@@ -1,14 +1,14 @@
-Dear {{voter.name}},
+Vážený {{voter.name}},
 
 {{custom_message|safe}}
 
 ========
-How to Vote
+Jak hlasovat
 
-Election URL:  {{election_vote_url}}
+URL Hlasování:  {{election_vote_url}}
 {% ifequal voter.voter_type "password" %}
-Your voter ID: {{voter.voter_login_id}}
-Your password: {{voter.voter_password}}
+Vaše ID voliče: {{voter.voter_login_id}}
+Vaše heslo: {{voter.voter_password}}
 {% else %}
-Log in with your {{voter.voter_type}} account.
+Přihlašte se svým {{voter.voter_type}} účtem.
 {% endifequal %}
diff --git a/helios/templates/email/vote_body.txt b/helios/templates/email/vote_body.txt
index f4f581bae267e8917326683c7c8ddfaa5ba28e45..8503778eec770ea6ca55df5cdc9ca1708f0148cf 100644
--- a/helios/templates/email/vote_body.txt
+++ b/helios/templates/email/vote_body.txt
@@ -1,33 +1,33 @@
-Dear {{voter.name}},
+Vážený {{voter.name}},
 
 {{custom_message|safe}}
 
-Election URL:  {{election_vote_url}}
-Election Fingerprint:  {{voter.election.hash}}
-{% if election.voting_start_at %}Voting start at {{election.voting_start_at}}
-{% endif %}{% if election.voting_end_at %}Voting end at {{election.voting_end_at}}
+URL Hlasování: {{election_vote_url}}
+Otisk Hlasováné: {{voter.election.hash}}
+{% if election.voting_start_at %}Hlasování začíná {{election.voting_start_at}}
+{% endif %}{% if election.voting_end_at %}Hlasování končí {{election.voting_end_at}}
 {% endif %}
 
 {% ifequal voter.voter_type "password" %}
-Your voter ID: {{voter.voter_login_id}}
-Your password: {{voter.voter_password}}
+Vaše ID voliče: {{voter.voter_login_id}}
+Vaše heslo: {{voter.voter_password}}
 {% else %}
-Log in with your {{voter.voter_type}} account.
+Přihlašte se svým {{voter.voter_type}} účtem.
 {% endifequal %}{% if voter.vote_hash %}
-We have recorded your vote with smart tracker:
+Zaznamenali jsem váš hlas chytrým sledovačem:
 
   {{voter.vote_hash}}
 
-You may re-vote if you wish: only your last vote counts.
+Můžete kdykoli znovu hlasovat: pouze poslední hlas se počítá.
 {% endif %}{% if election.use_voter_aliases %}
-In order to protect your privacy, this election is configured
-to never display your voter login ID, name, or email address to the public.
-Instead, the ballot tracking center will only display your alias.
+Z důvodů ochrany vašeho soukromí, toto hlasování je nastaveno
+aby nikdy nezobrazovalo veřejně Vaše login, ID voliče, jméno, nebo email.
+Centrum sledování lístků bude zobrazovat pouze váš alias.
 
-Your voter alias is {{voter.alias}}.
+Váš alias voliče je {{voter.alias}}.
 
-IMPORTANTLY, when you are prompted to log in to vote,
-please use your *voter ID*, not your alias.
+DŮLEŽITÉ; když jste požádání aby jste se přihlásili pro hlasování,
+prosím použíjte své *ID voliče*, nikoliv svůj alias.
 {% endif %}
 --
 Helios
diff --git a/helios/templates/email/vote_subject.txt b/helios/templates/email/vote_subject.txt
index e048737ddd3580cd18f8199e089859fc53da3b48..786c287c8b25ae2728d08ec8b9331278cb2a3753 100644
--- a/helios/templates/email/vote_subject.txt
+++ b/helios/templates/email/vote_subject.txt
@@ -1 +1 @@
-Vote: {{custom_subject|safe}}
+Hlasování: {{custom_subject|safe}}
diff --git a/helios/templates/list_trustees.html b/helios/templates/list_trustees.html
index 47032c4d1c5e65cf2b476003edba3d24069968b6..5e3f1e345d6b02fa2f078fb570bc3144bfc1e2dd 100644
--- a/helios/templates/list_trustees.html
+++ b/helios/templates/list_trustees.html
@@ -1,31 +1,31 @@
 {% extends "helios/templates/cryptobase.html" %}
 
-{% block title %}Trustees for {{election.name}}{% endblock %}
+{% block title %}Trustees pro {{election.name}}{% endblock %}
 
 {% block content %}
-  <h3 class="title">{{election.name}} &mdash; Trustees <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h3>
+  <h3 class="title">{{election.name}} &mdash; Trustees <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">zpět k hlasování</a>]</span></h3>
 
 <p>
-    Trustees are responsible for decrypting the election result.<br />
-    Each trustee generates a keypair and submits the public portion to Helios.<br />
-    When it's time to decrypt, each trustee needs to provide their secret key.
+    Trustees odpovídají za dešifrování výsledku hlasování.<br />
+    Každý trustee si vygeneruje svůj pár klíčů a nahraje veřejný klíč na Helios.<br />
+    Když je zapotřebí dešifrovat, každý trustee použije svůj soukromý klíč.
 </p>
 
 {% if not election.frozen_at %}
 
 <p>
-  Helios is automatically your first trustee and will handle its keypair generation and decryption automatically.<br />
-  You may add additional trustees if you want, and you can even remove the Helios trustee.<br />
-  However, we recommend you do this only if you have a solid understanding of the trustee's role.
+  Helios je automaticky váš první trustee a automaticky provede generování svého páru klíčů i dešifrování výsledku.<br />
+  Chcete-li, můžete přidat další trustees, a můžete dokonce odstranit z trustees Helios.<br />
+  Nečiňte to však, nejste-li důkladně obeznámeni s rolí, jakou trustee v hlasování hraje.
 </p>
 
 {% if admin_p %}
 <p>
-    [ <a onclick="return(confirm('Adding your own trustee requires a good bit more work to tally the election.\nYou will need to have trustees generate keypairs and safeguard their secret key.\n\nIf you are not sure what that means, we strongly recommend\nclicking Cancel and letting Helios tally the election for you.'));" href="{% url "election@trustees@new" election.uuid %}">add a trustee</a> ]
+    [ <a onclick="return(confirm('Přidání dalších trustees znamená o něco víc práce při určování výsledků hlasování.\nBudete potřebovat aby si trustees vytvořili své páry klíčů a bezpečně uschovali své soukromé klíče.\n\nPokud nevíte, oč jde, doporučujeme vám\nkliknout na Cancel a nechat Helios, aby výsledek hlasování spočítal sám.'));" href="{% url "election@trustees@new" election.uuid %}">přidat trusteeho</a> ]
 </p>
 {% if not election.has_helios_trustee %}
 <p>
-    <a href="{% url "election@trustees@add-helios" election.uuid %}">add Helios as a trustee</a>
+    <a href="{% url "election@trustees@add-helios" election.uuid %}">přidat mezi trustees Helios</a>
 </p>
 {% endif %}
 {% endif %}
@@ -36,31 +36,31 @@
 
 {% else %}
 {% for t in trustees %}
-<h5> Trustee #{{forloop.counter}}: {{t.name}} 
+<h5> Trustee #{{forloop.counter}}: {{t.name}}
 {% if admin_p %}
 {% if t.secret_key %}
-{% if not election.frozen_at %}[<a onclick="return confirm('Are you sure you want to remove Helios as a trustee?');" href="{% url "election@trustees@delete" election.uuid %}?uuid={{t.uuid}}">x</a>]{% endif %}
+{% if not election.frozen_at %}[<a onclick="return confirm('Určitě chcete odstranit Helios jakožto trusteeho?');" href="{% url "election@trustees@delete" election.uuid %}?uuid={{t.uuid}}">x</a>]{% endif %}
 {% else %}
 ({{t.email}})
-{% if not election.frozen_at %}[<a onclick="return confirm('Are you sure you want to remove this Trustee?');" href="{% url "election@trustees@delete" election.uuid %}?uuid={{t.uuid}}">x</a>]{% endif %}
-[<a onclick="return confirm('Are you sure you want to send this trustee his/her admin URL?');" href="{% url "election@trustee@send-url" election.uuid t.uuid %}">send login</a>]
+{% if not election.frozen_at %}[<a onclick="return confirm('Určitě chcete odstranit tohoto trusteeho?');" href="{% url "election@trustees@delete" election.uuid %}?uuid={{t.uuid}}">x</a>]{% endif %}
+[<a onclick="return confirm('Chcete tomuto trusteemu poslat admin URL?');" href="{% url "election@trustee@send-url" election.uuid t.uuid %}">poslat login</a>]
 {% endif %}
 {% endif %}
 </h5>
 
 <p>
 {% if t.public_key_hash %}
-  Public Key Fingerprint: <tt style="font-size:1.5em;">{{t.public_key_hash}}</tt>
+  Otisk veřejného klíče: <tt style="font-size:1.5em;">{{t.public_key_hash}}</tt>
 {% else %}
-No public key uploaded yet.
+Veřejný klíč ještě nebyl nahrán.
 {% endif %}
 </p>
 
 {% if election.encrypted_tally %}
 {% if t.decryption_factors %}
-<b>tally recorded for this trustee.</b>
+<b>Tento trustee již dešifroval výsledek.</b>
 {% else %}
-<em>waiting for this trustee's tally</em>
+<em>Čekáme na dílčí dešifrování výsledku.</em>
 {% endif %}
 {% endif %}
 </li>
diff --git a/helios/templates/notification/result.txt b/helios/templates/notification/result.txt
index 2fc3936d7cd8ce6d4fb9a6be190a7c271d381245..bbc84baff7c55fad0f301d9708190156b72a448e 100644
--- a/helios/templates/notification/result.txt
+++ b/helios/templates/notification/result.txt
@@ -1 +1 @@
-Tally computed for {{voter.election.name}}: {{election_url}}
+Výsledek spočítán pro {{voter.election.name}}: {{election_url}}
diff --git a/helios/templates/release_result.html b/helios/templates/release_result.html
index 5e467e471cb58ccee1319e362109a96d461946a5..ea0d0690bd0a5d9949b4f51f064112bda7867f07 100644
--- a/helios/templates/release_result.html
+++ b/helios/templates/release_result.html
@@ -1,19 +1,19 @@
 {% extends TEMPLATE_BASE %}
 
-{% block title %}Release Result &mdash; {{election.name}}{% endblock %}
+{% block title %}Zveřejnit výsledek &mdash; {{election.name}}{% endblock %}
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Release Result <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">cancel</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Zveřejnit výsledek <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">zrušit</a>]</span></h2>
 
   <p>
-    You are about to release the result for this election.
+    Chystáte se zveřejnit výsledek tohoto hlasování.
   </p>
 
   <form method="POST" action="">
     <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
     <p>
-    <input type="checkbox" name="send_email" value="send_email" checked="checked"/> Send email to voters reporting release of result.
+    <input type="checkbox" name="send_email" value="send_email" checked="checked"/> Poslat voličům e-mail s oznámením o zveřejnění výsledku.
     </p>
-    <input type="submit" class="button" value="release result!" />
+    <input type="submit" class="button" value="Zveřejnit výsledek!" />
   </form>
 
 {% endblock %}
diff --git a/helios/templates/stats.html b/helios/templates/stats.html
index 3f2bffe2b415bf3148bcd716640cbfa7199b9a45..ad00bf5cd75ca6bd937f365aaae1a743e99f7edb 100644
--- a/helios/templates/stats.html
+++ b/helios/templates/stats.html
@@ -1,15 +1,15 @@
 {% extends TEMPLATE_BASE %}
-{% block title %}Statistics{% endblock %}
+{% block title %}Statistiky{% endblock %}
 
 {% block content %}
 <h1>Admin</h1>
 
 <ul>
-<li> <a href="{% url "stats@elections" %}">elections</a></li>
-<li> <a href="{% url "stats@recent-votes" %}">recent votes</a></li>
-<li> <a href="{% url "stats@elections-problems" %}">recent problem elections</a></li>
+<li> <a href="{% url "stats@elections" %}">hlasování</a></li>
+<li> <a href="{% url "stats@recent-votes" %}">naposledy odevzdané hlasy</a></li>
+<li> <a href="{% url "stats@elections-problems" %}">nejnovější problematická hlasování</a></li>
 </ul>
 
-<p><b>{{num_votes_in_queue}}</b> votes in queue. {% if num_votes_in_queue %}[<a href="{% url "stats@force-queue" %}">force it</a>]{% endif %}</p>
+<p><b>{{num_votes_in_queue}}</b> hlasů ve frontě. {% if num_votes_in_queue %}[<a href="{% url "stats@force-queue" %}">vynutit zpracování</a>]{% endif %}</p>
 
 {% endblock %}
diff --git a/helios/templates/stats_elections.html b/helios/templates/stats_elections.html
index e9a498ef8e9a5a21d5069eb3ac5861ff4726dd41..28a353db8266a7ac67149727da09c21a47591c05 100644
--- a/helios/templates/stats_elections.html
+++ b/helios/templates/stats_elections.html
@@ -1,32 +1,32 @@
 {% extends TEMPLATE_BASE %}
-{% block title %}Statistics{% endblock %}
+{% block title %}Statistiky{% endblock %}
 
 {% block content %}
-<h1>Elections</h1>
+<h1>Hlasování</h1>
 
 <p>
 <form method="get" action="{% url "stats@elections" %}">
-<b>search</b>: <input type="text" name="q" value="{{q}}"/> 
-<input class="small button" type="submit" value="search" /> <a class="small button" href="?">clear search</a>
+<b>search</b>: <input type="text" name="q" value="{{q}}"/>
+<input class="small button" type="submit" value="search" /> <a class="small button" href="?">vyčistit výsledek hledání</a>
 </form>
 </p>
 
 
 <p>
 {% if elections_page.has_previous %}
-<a href="?page={{elections_page.previous_page_number}}&limit={{limit}}&q={{q|urlencode}}">previous {{limit}}</a> &nbsp;&nbsp;
+<a href="?page={{elections_page.previous_page_number}}&limit={{limit}}&q={{q|urlencode}}">předchozích {{limit}}</a> &nbsp;&nbsp;
 {% endif %}
 
-Elections {{elections_page.start_index}} - {{elections_page.end_index}} (of {{total_elections}})&nbsp;&nbsp;
+Hlasování {{elections_page.start_index}} - {{elections_page.end_index}} (z {{total_elections}})&nbsp;&nbsp;
 
 {% if elections_page.has_next %}
-<a href="?page={{elections_page.next_page_number}}&limit={{limit}}&q={{q|urlencode}}">next {{limit}}</a> &nbsp;&nbsp;
+<a href="?page={{elections_page.next_page_number}}&limit={{limit}}&q={{q|urlencode}}">dalších {{limit}}</a> &nbsp;&nbsp;
 {% endif %}
 </p>
 
 {% for election in elections %}
 <p>
-<b><a href="{% url "election@view" election.uuid %}">{{election.name}}</a></b> by <a href="mailto:{{election.admin.info.email}}">{{election.admin.pretty_name}}</a> -- {{election.num_voters}} voters / {{election.num_cast_votes}} cast votes
+<b><a href="{% url "election@view" election.uuid %}">{{election.name}}</a></b> vytvořil <a href="mailto:{{election.admin.info.email}}">{{election.admin.pretty_name}}</a> -- {{election.num_voters}} voličů / {{election.num_cast_votes}} odevzdaných hlasů
 </p>
 {% endfor %}
 
diff --git a/helios/templates/stats_problem_elections.html b/helios/templates/stats_problem_elections.html
index 2f82f74b92050540ce84ab43f4e522d87ea0f92d..9838ec5b4b68073542208a3c8b1549ea385dd79e 100644
--- a/helios/templates/stats_problem_elections.html
+++ b/helios/templates/stats_problem_elections.html
@@ -1,14 +1,14 @@
 {% extends TEMPLATE_BASE %}
-{% block title %}Statistics{% endblock %}
+{% block title %}Statistiky{% endblock %}
 
 {% block content %}
-<h1>Problematic Elections</h1>
+<h1>Problematická hlasování</h1>
 
-Unfrozen for more than a day.
+Rozpracovaná déle než den.
 
 {% for election in elections %}
 <p>
-<b><a href="{% url "election@view" election.uuid %}">{{election.name}}</a></b> -- {{election.num_voters}} voters
+<b><a href="{% url "election@view" election.uuid %}">{{election.name}}</a></b> -- {{election.num_voters}} voličů
 </p>
 {% endfor %}
 
diff --git a/helios/templates/trustee_check_sk.html b/helios/templates/trustee_check_sk.html
index 99380d31c5e8024fab0c51edbbb785c233d3c73c..69820bf7285998b9f8ac6c9b306a2a2ca233f6e8 100644
--- a/helios/templates/trustee_check_sk.html
+++ b/helios/templates/trustee_check_sk.html
@@ -32,42 +32,42 @@ function check_sk(sk_value) {
       debugger;
       var key_ok_p = false;
     }
-    
+
     $('#processing').hide();
 
-    var reset_link = "<br /><a href='javascript:reset();'>try again</a>";
+    var reset_link = "<br /><a href='javascript:reset();'>zkusit znovu</a>";
     if (key_ok_p) {
-      $('#result').html("your secret key matches!");
+      $('#result').html("Váš soukromý klíč je správný!");
     } else {
-      $('#result').html("OH OH, your key is bad." + reset_link);
+      $('#result').html("Ajaj, váš klíč není správný." + reset_link);
     }
 }
 </script>
-  <h2 class="title">{{election.name}} &mdash; Trustee {{trustee.name}} &mdash; Check Secret Key <span style="font-size:0.7em;">[<a href="{% url "election@trustee" election_uuid=election.uuid trustee_uuid=trustee.uuid %}">back to trustee home</a>]</span></h2>
+  <h2 class="title">{{election.name}} &mdash; Trustee {{trustee.name}} &mdash; ověřit soukromý klíč <span style="font-size:0.7em;">[<a href="{% url "election@trustee" election_uuid=election.uuid trustee_uuid=trustee.uuid %}">zpět na domovskou stránku trusteeho</a>]</span></h2>
 
 <p>
-Your public key fingerprint is: <b>{{trustee.public_key_hash}}</b>
+Otisk vašeho veřejného klíče je: <b>{{trustee.public_key_hash}}</b>
 </p>
 
 <div id="loading">
-loading crypto functions...
+nahrávám šifrovací funkce...
 </div>
 
 <div id="input" style="display:none;">
 <p>
-To verify that you have the right secret key, paste it here:
+Chcete-li ověřit, že máte správný soukromý klíč, vložte jej sem:
 <p>
 
 <form onsubmit="check_sk(this.secret_key.value); this.secret_key.value=''; return false;">
 <textarea name="secret_key" cols="60" rows ="5" wrap="soft" style="height: 25em;">
 </textarea>
 <br />
-<input type="submit" value="check" />
+<input type="submit" value="ověřit" />
 </form>
 </div>
 
 <div id="processing" style="display:none;">
-checking your secret key...
+ověřuji váš soukromý klíč...
 </div>
 
 <div id="result">
diff --git a/helios/templates/trustee_decrypt_and_prove.html b/helios/templates/trustee_decrypt_and_prove.html
index cb4c2e68caa5b627ffdd12284ba1805105a1f5a8..5c95c153334b860532e155f8995d04639f3feb1d 100644
--- a/helios/templates/trustee_decrypt_and_prove.html
+++ b/helios/templates/trustee_decrypt_and_prove.html
@@ -9,11 +9,11 @@ $(document).ready(function() {
     $('#waiting_submit_div').hide();
     $('#done_div').hide();
     $('#error_div').hide();
-    
+
     BigInt.setup(function() {
         ELECTION_JSON = {{election.toJSON|safe}};
         ELECTION_PK = ElGamal.PublicKey.fromJSONObject(ELECTION_JSON['public_key']);
-        TALLY = HELIOS.Tally.fromJSONObject({{election.encrypted_tally.toJSON|safe}}, ELECTION_PK);   
+        TALLY = HELIOS.Tally.fromJSONObject({{election.encrypted_tally.toJSON|safe}}, ELECTION_PK);
         $('#sk_section').show();
     });
 });
@@ -25,18 +25,18 @@ function decrypt_and_prove_tally(tally, public_key, secret_key) {
     var CURRENT_EXP = 0;
     var CURRENT_RESULT = BigInt.ONE;
     DISCRETE_LOGS[CURRENT_RESULT.toString()] = CURRENT_EXP;
-    
+
     // go through the num_tallied
     while (CURRENT_EXP < tally.num_tallied) {
       CURRENT_EXP += 1;
       CURRENT_RESULT = CURRENT_RESULT.multiply(public_key.g).mod(public_key.p);
-      DISCRETE_LOGS[CURRENT_RESULT.toString()] = CURRENT_EXP;      
+      DISCRETE_LOGS[CURRENT_RESULT.toString()] = CURRENT_EXP;
     }
-    
+
     // initialize the arrays
     var decryption_factors= [];
     var decryption_proofs= [];
-    
+
     // decrypt the tallies
     $(tally.tally).each(function(q_num, q_tally) {
         decryption_factors[q_num] = [];
@@ -44,12 +44,12 @@ function decrypt_and_prove_tally(tally, public_key, secret_key) {
 
         $(q_tally).each(function(choice_num, choice_tally) {
            var one_choice_result = secret_key.decryptionFactorAndProof(choice_tally, ElGamal.fiatshamir_challenge_generator);
-           
+
            decryption_factors[q_num][choice_num] = one_choice_result.decryption_factor
            decryption_proofs[q_num][choice_num] = one_choice_result.decryption_proof;
         });
     });
-    
+
     return {'decryption_factors': decryption_factors, 'decryption_proofs' : decryption_proofs};
 }
 
@@ -60,29 +60,29 @@ function get_secret_key() {
 function do_tally() {
   $('#sk_section').hide();
   $('#waiting_div').show();
-  
+
   var secret_key = get_secret_key();
-  
+
   var factors_and_proof = decrypt_and_prove_tally(TALLY, ELECTION_PK, secret_key);
-  
+
   // json'ify it
   var factors = factors_and_proof.decryption_factors
   var decryption_proofs = $(factors_and_proof.decryption_proofs).map(function(i, q_proof) {
       return $(q_proof).map(function(j, a_proof){
-         return a_proof.toJSONObject(); 
+         return a_proof.toJSONObject();
       });
   });
-  
+
   var factors_and_proofs = {'decryption_factors': factors, 'decryption_proofs': decryption_proofs};
   var factors_and_proofs_json = $.toJSON(factors_and_proofs);
-  
+
   // clear stuff
   secret_key = null;
   $('#sk_textarea').val("");
-  
+
   // display the result in a text area.
   $('#waiting_div').hide();
-  
+
   $('#result_textarea').html(factors_and_proofs_json);
   $('#result_div').show();
   $('#first-step-success').show();
@@ -93,7 +93,7 @@ function submit_result() {
   $('#waiting_submit_div').show();
 
   var result = $('#result_textarea').val();
-  
+
   // do the post
   $.ajax({
       type: 'POST',
@@ -104,7 +104,7 @@ function submit_result() {
         if (result != "FAILURE") {
           $('#done_div').show();
         } else {
-          alert('verification failed, you probably used the wrong key.');
+          alert('Ověření se nezdařilo, pravděpodobně jste použil nesprávný klíč.');
           reset();
         }
       },
@@ -131,75 +131,75 @@ function reset() {
 }
 
 </script>
-  <h2 class="title">Trustee {{trustee.name}} &mdash; Decrypt Result for {{election.name}}</h2>
+  <h2 class="title">Trustee {{trustee.name}} &mdash; výsledek dešifrování pro {{election.name}}</h2>
 
 <p>
     <b>Trustee:</b> <tt>{{trustee.email}}</tt><br />
-    <b>Public Key Fingerprint:</b> <tt>{{trustee.public_key_hash}}</tt><br />
-    <b>Encrypted Tally Fingerprint:</b> <tt>{{election.encrypted_tally_hash}}</tt>
+    <b>Otisk veřejného klíče:</b> <tt>{{trustee.public_key_hash}}</tt><br />
+    <b>Otisk zašifrovaného výsledku hlasování:</b> <tt>{{election.encrypted_tally_hash}}</tt>
 </p>
 
     <p>
-      The encrypted tally for your election has been computed.<br />
-      Now it's time to compute and submit your partial decryption.
+      Zašifrovaný výsledek hlasování byl spočítán.<br />
+      Nyní je třeba provést vaše dílčí dešifrování.
     </p>
 
     <p>
-      This process is performed in two steps.<br /><br />
-      <u>First</u>, your secret key is used to decrypt the tally <em>inside</em> your browser, without connecting to the network.<br />
-      You can choose to take your browser "offline" for this step, if you'd like.<br /><br />
-      <u>Second</u>, once your decryption factors have been computed, your browser will need to be "online" to submit them to the server.<br />
-      If you'd like, you can compute your decryption factors, copy them to your clipboard, restart your browser, and<br />
-      skip to the second step so that your browser is never online when you enter your secret key.
+      Tento proces sestává ze dvou kroků.<br /><br />
+      <u>V prvním kroku</u> bude výsledek hlasování dešifrován vaším soukromým klíčem <em>uvnitř</em> vašeho prohlížeče, bez připojení k síti.<br />
+      Pro tento krok můžete přepnout prohlížeč do režimu "offline", chcete-li.<br /><br />
+      <u>V druhém kroku</u>, poté co je vaše čsát dešifrování provedena, musí být váš prohlížeč "online", aby ji mohl nahrát na server.<br />
+      Chcete-li, můžete provést svou část dešifrování, zkopírovat výsledek do schránky, restartovat prohlížeč a<br />
+      přejít k druhému kroku, takže váš prohlížeč nebude v okamžiku zadávání vašeho soukromého klíče nikdy online.
     </p>
-    
+
   <div id="sk_section" style="display:none;">
 
       <form onsubmit="return false;">
-          <h3>FIRST STEP: enter your secret key</h3>
+          <h3>První krok: zadejte svůj soukromý klíč</h3>
           <textarea id="sk_textarea" cols="60" rows="5" style="height: 25em;"></textarea>
       </form>
       <p id="tally_section">
-          <button onclick="do_tally();">Generate partial decryption</button>
+          <button onclick="do_tally();">Provést částečné dešifrování</button>
       </p>
 
       <p id="skip_to_second_step_instructions">
-        <a href="javascript:skip_to_second_step();">skip to the second step</a><br />
-        (you need to have already computed your decryption factors.)
+        <a href="javascript:skip_to_second_step();">přejít k druhému kroku</a><br />
+        (musíte už mít připravenou svou část dešifrování.)
       </p>
   </div>
-  
+
   <div id="waiting_div">
-      Generating partial decryption factors and proofs...<br />
+      Provádím částečné dešifrování...<br />
       <img src="/static/helios/loading.gif" />
   </div>
 
   <div id="waiting_submit_div">
-      Submitting and checking your decryption factors and proofs...<br />
+      Odesílám a ověřuji výsledek částečného dešifrování...<br />
       <img src="/static/helios/loading.gif" />
   </div>
-  
+
   <div id="result_div">
-      <h3>SECOND STEP: upload your partial decryption</h3>
+      <h3>Druhý krok: nahrát vaši část dešifrování</h3>
       <p id="first-step-success" style="display: none;">
-          Your partial decryption factors and proofs have been generated below.<br />
-          Your secret key has been cleared from memory.<br />
-          When you're ready, you can submit this result to the server.
+          Částečný výsledek dešifrování naleznete níže.<br />
+          Váš soukromý klíč byl odstraněn z paměti.<br />
+          Až budete připraven, můžete nahrát výsledek na server.
       </p>
-      Your partial decryption:<br />
+      Váš částečný výsledek dešifrování:<br />
       <p>
           <textarea id="result_textarea" cols="60" rows="5" wrap="soft" style="height: 25em;"></textarea>
-          <button onclick="submit_result();">Upload decryption factors to server</button>
+          <button onclick="submit_result();">Nahrát výsledek dešifrování na server</button>
       </p>
-      <p><a href="javascript:reset()">reset and restart decryption process</a></p>
+      <p><a href="javascript:reset()">resetovat a znovu spustit dešifrování</a></p>
   </div>
-  
+
   <div id="done_div">
-      Done! <a href="{% url "election@view" election.uuid %}">Back to election</a>
+      Hotovo! <a href="{% url "election@view" election.uuid %}">Zpět k hlasování</a>
   </div>
-  
+
   <div id="error_div">
-      Error: your secret key was likely incorrect.
+      Chyba: váš soukromý klíč patrně nebyl správný.
   </div>
 
   <div id="applet_div">
diff --git a/helios/templates/trustee_home.html b/helios/templates/trustee_home.html
index 8d6dd115179c563bd90cb2886813e6285dd97d71..ec89c16d1c1c5531fdcb7ba6f58f98d981becb35 100644
--- a/helios/templates/trustee_home.html
+++ b/helios/templates/trustee_home.html
@@ -1,29 +1,29 @@
 {% extends "helios/templates/cryptobase.html" %}
 
 {% block content %}
-  <h2 class="title">{{election.name}} &mdash; Trustee {{trustee.name}} Home</span></h2>
+  <h2 class="title">{{election.name}} &mdash; domovská stránka trusteeho {{trustee.name}} </span></h2>
 
 <p>
 {% if trustee.public_key_hash %}
-You have successfully uploaded your public key.<br />
-Your public key fingerprint is: <b>{{trustee.public_key_hash}}</b>.<br />
-You can <a href="{% url "election@trustee@check-sk" election.uuid trustee.uuid %}">verify that you have the right secret key</a>.
+Úspěšně jste nahrál svůj veřejný klíč.<br />
+Otisk vašeho veřejného klíče je: <b>{{trustee.public_key_hash}}</b>.<br />
+Můžete <a href="{% url "election@trustee@check-sk" election.uuid trustee.uuid %}">ověřit, že máte správný soukromý klíč</a>.
 {% else %}
-<a href="{% url "election@trustee@key-generator" election.uuid trustee.uuid %}">setup your key</a>
+<a href="{% url "election@trustee@key-generator" election.uuid trustee.uuid %}">nastavit váš klíč</a>
 {% endif %}
 </p>
 
 <p>
 {% if election.encrypted_tally %}
 {% if trustee.decryption_factors %}
-You have successfully uploaded your decryption.
+Úspěšně jste nahrál vaši část dešifrování.
 {% else %}
-    The encrypted tally for this election is ready.<br />
-    <a href="{% url "election@trustee@decrypt-and-prove" election.uuid trustee.uuid %}">decrypt with your key</a>
+    Zašifrovaný výsledek hlasování je připraven.<br />
+    <a href="{% url "election@trustee@decrypt-and-prove" election.uuid trustee.uuid %}">dešifrovat vaším klíčem</a>
 {% endif %}
 {% else %}
-Once the tally is computed, come back here to provide your secret key for decryption purposes.<br />
-You should keep the email with your trustee homepage link, which contains the credentials needed to get back here.
+Jakmile bude hlasování sečteno, vraťte se na tuto stránku se svým soukromým klíčem určeným k dešifrování.<br />
+Měl byste si uložit e-mail s odkazem na vaši stránku trusteeho, nebuť obsahuje údaje potřebné k návratu na ni.
 {% endif %}
 </p>
 
diff --git a/helios/templates/voters_list.html b/helios/templates/voters_list.html
index fb45c38b602a0b487ad991a66b663d0f6aeb995f..655ccd68efd3575940ed5adabe01ca7b6d62d582 100644
--- a/helios/templates/voters_list.html
+++ b/helios/templates/voters_list.html
@@ -1,29 +1,29 @@
 {% extends TEMPLATE_BASE %}
 
-{% block title %}Voters &amp; Ballot Tracking Center for {{election.name}}{% endblock %}
+{% block title %}Voliči a sledování hlasovacích lístků pro {{election.name}}{% endblock %}
 {% block content %}
-  <h3 class="title">{{election.name}} &mdash; Voters and Ballot Tracking Center <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">back to election</a>]</span></h3>
+  <h3 class="title">{{election.name}} &mdash; voliči a sledování hlasovacích lístků <span style="font-size:0.7em;">[<a href="{% url "election@view" election.uuid %}">zpět k hlasování</a>]</span></h3>
 
 <p>
-<b>Who can vote?</b>
+<b>Kdo může hlasovat?</b>
 {% if election.openreg %}
 {{election.pretty_eligibility|safe}}
 {% else %}
-<em>Only the voters listed here</em>.
+<em>Jen voliči v tomto seznamu</em>.
 {% endif %}
 </p>
 
 {% if admin_p and not election.frozen_at %}
 {% if election.private_p %}
-<em>Your election is marked private, which means you cannot open registration up more widely</em>.<br />
+<em>Vaše hlasování je označeno jako soukromé, takže nemůžete rozšířit okruh hlasujících</em>.<br />
 {% else %}
-You can change this setting:
+Můžete toto nastavení změnit:
 <form method="post" action="{% url "election@voters@eligibility" election.uuid %}">
 <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
-<input type="radio" name="eligibility" value="openreg" {% if election.openreg and not election.eligibility %}CHECKED{% endif %} /> anyone can vote<br />
-<input type="radio" name="eligibility" value="closedreg" {% if not election.openreg %}CHECKED{% endif %} /> only voters listed explicitly below can vote<br />
+<input type="radio" name="eligibility" value="openreg" {% if election.openreg and not election.eligibility %}CHECKED{% endif %} /> kdokoli může hlasovat<br />
+<input type="radio" name="eligibility" value="closedreg" {% if not election.openreg %}CHECKED{% endif %} /> hlasovat mohou jen voliči z následujícího seznamu<br />
 {% if categories %}
-<input type="radio" name="eligibility" value="limitedreg" {% if election.eligibility %}CHECKED{% endif %} /> only voters who are members of 
+<input type="radio" name="eligibility" value="limitedreg" {% if election.eligibility %}CHECKED{% endif %} /> hlasovat mohou jen voliči, kteří jsou ve skupině
 <select name="category_id">
 {% for category in categories %}
 <option value="{{category.id}}" {% if eligibility_category_id == category.id %}SELECTED{% endif %}> {{category.name}}</option>
@@ -31,21 +31,21 @@ You can change this setting:
 </select>
 <br />
 {% endif %}
-<input type="submit" value="update" />
+<input type="submit" value="změnit" />
 </form>
 {% endif %}
 {% endif %}
 
 {% if email_voters and election.frozen_at and admin_p %}
-<p><a class="button" href="{% url "election@voters@email" election.uuid %}">email voters</a></p>
+<p><a class="button" href="{% url "election@voters@email" election.uuid %}">Poslat voličům e-mail</a></p>
 {% endif %}
 
 {% if election.num_voters > 20 %}
 <p>
 {% if q %}
-<p><em>searching for <u>{{q}}</u>.</em> [<a href="?">clear search</a>]</p>
+<p><em>vyhledávám <u>{{q}}</u>.</em> [<a href="?">vyčistit výsledek hledání</a>]</p>
 {% else %}
-<form method="get" action="{% url "election@voters@list-pretty" election.uuid %}"><b>search</b>: <input type="text" name="q" /> <input type="submit" value="search" /></form>
+<form method="get" action="{% url "election@voters@list-pretty" election.uuid %}"><b>hledat</b>: <input type="text" name="q" /> <input type="submit" value="hledat" /></form>
 {% endif %}
 </p>
 {% endif %}
@@ -54,11 +54,11 @@ You can change this setting:
 <!-- Add a Voter: WORK HERE-->
 {% if upload_p and not election.openreg %}
 <p>
-<a class="button" href="{% url "election@voters@upload" election_uuid=election.uuid %}">bulk upload voters</a>
+<a class="button" href="{% url "election@voters@upload" election_uuid=election.uuid %}">hromadné přidání voličů</a>
 </p>
 
 {% if voter_files %}
-Prior Bulk Uploads:
+Předchozí hromadná přidání:
 <ul>
 {% for vf in voter_files %}
 <li>
@@ -69,13 +69,13 @@ Prior Bulk Uploads:
 {% endif %}
  bytes, at {{vf.uploaded_at}}:
 {% if vf.processing_finished_at %}
-<em>done processing: {{vf.num_voters}} voters loaded</em>
+<em>zpracování dokončeno: {{vf.num_voters}} voličů přidáno</em>
 {% else %}
 
 {% if vf.processing_started_at %}
-<em>currently processing</em>
+<em>zpracovávám</em>
 {% else %}
-<em>not yet processed</em>
+<em>ještě nezpracováno</em>
 {% endif %}
 
 {% endif %}
@@ -91,39 +91,39 @@ Prior Bulk Uploads:
 <p>
 <b>
 {% if election.num_cast_votes %}
-{{election.num_cast_votes}} cast vote{% ifequal election.num_cast_votes 1 %}{% else %}s{% endifequal %}
+{{election.num_cast_votes}} odevzdan{% ifequal election.num_cast_votes 1 %}ý hlas{% else %}ých hlasů{% endifequal %}
 {% else %}
-no votes yet
+ještě žádné hlasy
 {% endif %}
 </b>
 </p>
 
 {% if voters_page.has_previous %}
-<a href="{% url "election@voters@list-pretty" election.uuid %}?page={{voters_page.previous_page_number}}&limit={{limit}}&q={{q|urlencode}}">previous {{limit}}</a> &nbsp;&nbsp;
+<a href="{% url "election@voters@list-pretty" election.uuid %}?page={{voters_page.previous_page_number}}&limit={{limit}}&q={{q|urlencode}}">předchozích {{limit}}</a> &nbsp;&nbsp;
 {% endif %}
 
 
-Voters {{voters_page.start_index}} - {{voters_page.end_index}} (of {{total_voters}})&nbsp;&nbsp;
+Voliči {{voters_page.start_index}} - {{voters_page.end_index}} (z {{total_voters}})&nbsp;&nbsp;
 
 {% if voters_page.has_next %}
-<a href="{% url "election@voters@list-pretty" election.uuid %}?page={{voters_page.next_page_number}}&limit={{limit}}&q={{q|urlencode}}">next {{limit}}</a> &nbsp;&nbsp;
+<a href="{% url "election@voters@list-pretty" election.uuid %}?page={{voters_page.next_page_number}}&limit={{limit}}&q={{q|urlencode}}">dalších {{limit}}</a> &nbsp;&nbsp;
 {% endif %}
 
 <table class="pretty">
 <tr>
 {% if admin_p or not election.use_voter_aliases %}
 {% if admin_p %}
-<th style="width: 80px;">Actions</th>
+<th style="width: 80px;">Akce</th>
 <th>Login</th>
-<th>Email Address</th>
+<th>Email</th>
 {% endif %}
-<th>Name</th>
+<th>Jméno</th>
 {% endif %}
 
 {% if election.use_voter_aliases %}
 <th>Alias</th>
 {% endif %}
-<th>Smart Ballot Tracker</th>
+<th>Kód pro sledování lístku</th>
 </tr>
 {% for voter in voters %}
 <tr>
@@ -133,7 +133,7 @@ Voters {{voters_page.start_index}} - {{voters_page.end_index}} (of {{total_voter
 {% if election.frozen_at %}
 [<a href="{% url "election@voters@email" election.uuid %}?voter_id={{voter.voter_login_id}}">email</a>]
 {% endif %}
-[<a onclick="return confirm('are you sure you want to remove {{voter.name}} ?');" href="{% url "election@voter@delete" election.uuid voter.uuid %}">x</a>]
+[<a onclick="return confirm('opravdu chcete odstranit {{voter.name}} ?');" href="{% url "election@voter@delete" election.uuid voter.uuid %}">x</a>]
 </td>
 <td>{{voter.voter_login_id}}</td>
 <td>{{voter.voter_email}}</td>
@@ -150,7 +150,7 @@ Voters {{voters_page.start_index}} - {{voters_page.end_index}} (of {{total_voter
 
 {% else %}
 <br /><br />
-<em>no voters.</em>
+<em>žádní voliči.</em>
 {% endif %}
 
 {% endblock %}
diff --git a/helios/tests.py b/helios/tests.py
index 97d7dba6d989681838e809779e096c6a6f7bbbc9..2c5c5830dfe20ceea098b22f655d1c48e344c918 100644
--- a/helios/tests.py
+++ b/helios/tests.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 """
 Unit Tests for Helios
 """
@@ -43,7 +44,7 @@ class ElectionModelTests(TestCase):
     def setup_openreg(self):
         self.election.openreg=True
         self.election.save()
-    
+
     def setUp(self):
         self.user = auth_models.User.objects.get(user_id='ben@adida.net', user_type='google')
         self.fb_user = auth_models.User.objects.filter(user_type='facebook')[0]
@@ -66,7 +67,7 @@ class ElectionModelTests(TestCase):
 
         election = models.Election.get_by_short_name(self.election.short_name)
         self.assertEqual(self.election, election)
-        
+
     def test_setup_trustee(self):
         self.setup_trustee()
         self.assertEqual(self.election.num_trustees, 1)
@@ -102,7 +103,7 @@ class ElectionModelTests(TestCase):
         # should be two issues: no questions, and no voters
         issues = self.election.issues_before_freeze
         self.assertEqual(len(issues), 2)
-        
+
         self.setup_questions()
 
         # move to open reg
@@ -110,7 +111,7 @@ class ElectionModelTests(TestCase):
 
         issues = self.election.issues_before_freeze
         self.assertEqual(len(issues), 0)
-        
+
     def test_helios_trustee(self):
         self.election.generate_trustee(views.ELGAMAL_PARAMS)
 
@@ -135,7 +136,7 @@ class ElectionModelTests(TestCase):
 
         # without openreg, this should be false
         self.assertFalse(self.election.user_eligible_p(self.user))
-        
+
         # what about after saving?
         self.election.save()
         e = models.Election.objects.get(uuid = self.election.uuid)
@@ -161,7 +162,7 @@ class ElectionModelTests(TestCase):
 
         # without openreg, this should be false
         self.assertFalse(self.election.user_eligible_p(self.fb_user))
-        
+
         self.election.openreg = True
 
         # fake out the facebook constraint checking, since
@@ -169,7 +170,7 @@ class ElectionModelTests(TestCase):
         from helios_auth.auth_systems import facebook
 
         def fake_check_constraint(constraint, user):
-            return constraint == {'group': {'id': '123', 'name':'Fake Group'}} and user == self.fb_user                
+            return constraint == {'group': {'id': '123', 'name':'Fake Group'}} and user == self.fb_user
         facebook.check_constraint = fake_check_constraint
 
         self.assertTrue(self.election.user_eligible_p(self.fb_user))
@@ -182,14 +183,14 @@ class ElectionModelTests(TestCase):
         def try_freeze():
             self.election.freeze()
         self.assertRaises(Exception, try_freeze)
-        
+
         self.setup_questions()
         self.setup_trustee()
         self.setup_openreg()
 
         # this time it should work
         try_freeze()
-        
+
         # make sure it logged something
         self.assertTrue(len(self.election.get_log().all()) > 0)
 
@@ -215,7 +216,7 @@ class ElectionModelTests(TestCase):
 
         # register the voter
         voter = models.Voter.register_user_in_election(self.user, self.election)
-        
+
         # make sure voter is there now
         voter_2 = models.Voter.get_by_election_and_user(self.election, self.user)
 
@@ -248,13 +249,13 @@ class VoterModelTests(TestCase):
         v.generate_password()
 
         v.save()
-        
+
         # password has been generated!
         self.assertFalse(v.voter_password is None)
 
         # can't generate passwords twice
         self.assertRaises(Exception, lambda: v.generate_password())
-        
+
         # check that you can get at the voter user structure
         self.assertEqual(v.get_user().user_id, v.voter_email)
 
@@ -299,9 +300,9 @@ class DatatypeTests(TestCase):
         ld_obj = datatypes.LDObject.fromDict(original_dict, type_hint = 'legacy/EGZKProofCommitment')
 
         self.assertEqual(original_dict, ld_obj.toDict())
-        
-        
-        
+
+
+
 
 ##
 ## Black box tests
@@ -432,7 +433,7 @@ class ElectionBlackboxTests(WebTest):
     def clear_login(self):
         session = self.client.session
         del session['user']
-        session.save()        
+        session.save()
 
     def test_election_params(self):
         response = self.client.get("/helios/elections/params")
@@ -449,11 +450,11 @@ class ElectionBlackboxTests(WebTest):
     def test_get_election_shortcut(self):
         response = self.client.get("/helios/e/%s" % self.election.short_name, follow=True)
         self.assertContains(response, self.election.description_bleached)
-        
+
     def test_get_election_raw(self):
         response = self.client.get("/helios/elections/%s" % self.election.uuid, follow=False)
         self.assertEqual(response.content, self.election.toJSON().encode('utf-8'))
-    
+
     def test_get_election(self):
         response = self.client.get("/helios/elections/%s/view" % self.election.uuid, follow=False)
         self.assertContains(response, self.election.description_bleached)
@@ -462,7 +463,7 @@ class ElectionBlackboxTests(WebTest):
         response = self.client.get("/helios/elections/%s/questions" % self.election.uuid, follow=False)
         for q in self.election.questions:
             self.assertContains(response, q['question'])
-    
+
     def test_get_election_trustees(self):
         response = self.client.get("/helios/elections/%s/trustees" % self.election.uuid, follow=False)
         for t in self.election.trustee_set.all():
@@ -472,14 +473,14 @@ class ElectionBlackboxTests(WebTest):
         response = self.client.get("/helios/elections/%s/voters/list" % self.election.uuid, follow=False)
         # check total count of voters
         if self.election.num_voters == 0:
-            self.assertContains(response, "no voters")
+            self.assertContains(response, u'žádní voliči')
         else:
             self.assertContains(response, "(of %s)" % self.election.num_voters)
 
     def test_get_election_voters_raw(self):
         response = self.client.get("/helios/elections/%s/voters/" % self.election.uuid, follow=False)
         self.assertEqual(len(response.json()), self.election.num_voters)
-        
+
     def test_election_creation_not_logged_in(self):
         response = self.client.post("/helios/elections/new", {
                 "short_name" : "test-complete",
@@ -491,7 +492,7 @@ class ElectionBlackboxTests(WebTest):
                 "private_p" : "False"})
 
         self.assertRedirects(response, "/auth/?return_url=/helios/elections/new")
-    
+
     def test_election_edit(self):
         self.setup_login(from_scratch=True)
         response = self.client.get("/helios/elections/%s/edit" % self.election.uuid)
@@ -591,7 +592,7 @@ class ElectionBlackboxTests(WebTest):
         response = self.client.post("/helios/elections/%s/voters/upload" % election_id, {'voters_file': voters_file})
         voters_file.close()
         self.assertContains(response, "first few rows of this file")
-        
+
         # and we want to check that there are now voters
         response = self.client.get("/helios/elections/%s/voters/" % election_id)
         NUM_VOTERS = 4
@@ -604,7 +605,7 @@ class ElectionBlackboxTests(WebTest):
 
         response = self.client.get("/helios/elections/%s/voters/foobar" % election_id)
         self.assertStatusCode(response, 404)
-        
+
         # add questions
         response = self.client.post("/helios/elections/%s/save_questions" % election_id, {
                 'questions_json': utils.to_json([{"answer_urls": ["http://example.com",None], "answers": ["Alice", "Bob"], "choice_type": "approval", "max": 1, "min": 0, "question": "Who should be president?", "result_type": "absolute", "short_name": "Who should be president?", "tally_type": "homomorphic"}]),
@@ -634,8 +635,8 @@ class ElectionBlackboxTests(WebTest):
         assert "your password" in email_message.subject, "bad subject in email"
 
         # get the username and password
-        username = re.search('voter ID: (.*)', email_message.body).group(1)
-        password = re.search('password: (.*)', email_message.body).group(1)
+        username = re.search(u'ID voliče: (.*)', email_message.body).group(1)
+        password = re.search(u'heslo: (.*)', email_message.body).group(1)
 
         # now log out as administrator
         self.clear_login()
@@ -657,21 +658,21 @@ class ElectionBlackboxTests(WebTest):
         the_ballot = utils.from_json(response.testbody)
         assert 'randomness' in the_ballot['answers'][0], "no randomness"
         assert len(the_ballot['answers'][0]['randomness']) == 2, "not enough randomness"
-        
+
         # parse it as an encrypted vote, and re-serialize it
         ballot = datatypes.LDObject.fromDict(the_ballot, type_hint='legacy/EncryptedVote')
         encrypted_vote = ballot.serialize()
-        
+
         # cast the ballot
         response = self.app.post("/helios/elections/%s/cast" % election_id,
                    params={'encrypted_vote': encrypted_vote})
         self.assertRedirects(response, "%s/helios/elections/%s/cast_confirm" % (settings.SECURE_URL_HOST, election_id))
 
         cast_confirm_page = response.follow()
-        
+
         if need_login:
             if check_user_logged_in:
-                self.assertContains(cast_confirm_page, "You are logged in as")
+                self.assertContains(cast_confirm_page, "Jste přihlášeni jako")
                 self.assertContains(cast_confirm_page, "requires election-specific credentials")
 
             # set the form
@@ -682,11 +683,11 @@ class ElectionBlackboxTests(WebTest):
             response = login_form.submit()
         else:
             # here we should be at the cast-confirm page and logged in
-            self.assertContains(cast_confirm_page, "CAST this ballot")
+            self.assertContains(cast_confirm_page, u"ODEVZDAT tento lístek")
 
             # confirm the vote, now with the actual form
             cast_form = cast_confirm_page.form
-        
+
             if 'status_update' in list(cast_form.fields.keys()):
                 cast_form['status_update'] = False
             response = cast_form.submit()
@@ -710,12 +711,12 @@ class ElectionBlackboxTests(WebTest):
             # if we redirected, that's because we can see the page, I think
             if login_page.status_int != 302:
                 login_form = login_page.form
-                
+
                 # try with extra spaces
                 login_form['voter_id'] = '  ' + username + '   '
                 login_form['password'] = '  ' + password + '      '
                 login_form.submit()
-            
+
         response = self.app.get(url, auto_follow=True)
         self.assertContains(response, ballot.hash)
         self.assertContains(response, html_escape(encrypted_vote))
@@ -732,7 +733,7 @@ class ElectionBlackboxTests(WebTest):
 
         # encrypted tally
         response = self.client.post("/helios/elections/%s/compute_tally" % election_id, {
-                "csrf_token" : self.client.session['csrf_token']                
+                "csrf_token" : self.client.session['csrf_token']
                 })
         self.assertRedirects(response, "/helios/elections/%s/view" % election_id)
 
@@ -759,10 +760,10 @@ class ElectionBlackboxTests(WebTest):
         # check that tally matches
         response = self.client.get("/helios/elections/%s/result" % election_id)
         self.assertEqual(response.json(), [[0,1]])
-        
+
     def test_do_complete_election(self):
         election_id, username, password = self._setup_complete_election()
-        
+
         # cast a ballot while not logged in
         self._cast_ballot(election_id, username, password, check_user_logged_in=False)
 
@@ -771,7 +772,7 @@ class ElectionBlackboxTests(WebTest):
 
         ## for now the above does not work, it's a testing problem
         ## where the cookie isn't properly set. We'll have to figure this out.
-        ## FIXME FIXME FIXME 
+        ## FIXME FIXME FIXME
         #self._cast_ballot(election_id, username, password, check_user_logged_in=True)
         self._cast_ballot(election_id, username, password, check_user_logged_in=False)
         self.clear_login()
@@ -833,7 +834,7 @@ class ElectionBlackboxTests(WebTest):
 
         self.clear_login()
         response = self.client.get("/helios/elections/%s/voters/list" % election_id)
-        self.assertContains(response, "Only the voters listed here")
+        self.assertContains(response, u'Jen voliči v tomto seznamu')
 
     def test_do_complete_election_with_trustees(self):
         """
diff --git a/helios_auth/auth_systems/openid/view_helpers.py b/helios_auth/auth_systems/openid/view_helpers.py
index de79b451a037800f974e33535e52569af754c1c6..d22bf939f8ff5d64d95b06e6194f7bc2f0f3570c 100644
--- a/helios_auth/auth_systems/openid/view_helpers.py
+++ b/helios_auth/auth_systems/openid/view_helpers.py
@@ -34,7 +34,7 @@ def get_consumer(session):
     """
     return consumer.Consumer(session, getOpenIDStore())
 
-def start_openid(session, openid_url, trust_root, return_to):
+def start_openid(session, openid_url, trust_root, return_to, ax_required_fields = AX_REQUIRED_FIELDS):
     """
     Start the OpenID authentication process.
 
@@ -70,11 +70,11 @@ def start_openid(session, openid_url, trust_root, return_to):
     # XXX - uses myOpenID-compatible schema values, which are
     # not those listed at axschema.org.
 
-    for k, v in AX_REQUIRED_FIELDS.items():
+    for k, v in ax_required_fields.iteritems():
         ax_request.add(ax.AttrInfo(v, required=True))
 
     auth_request.addExtension(ax_request)
-                
+
     # Compute the trust root and return URL values to build the
     # redirect information.
     # trust_root = util.getViewURL(request, startOpenID)
@@ -85,7 +85,7 @@ def start_openid(session, openid_url, trust_root, return_to):
     url = auth_request.redirectURL(trust_root, return_to)
     return url
 
-def finish_openid(session, request_args, return_to):
+def finish_openid(session, request_args, return_to, ax_required_fields = AX_REQUIRED_FIELDS):
     """
     Finish the OpenID authentication process.  Invoke the OpenID
     library with the response from the OpenID server and render a page
@@ -113,7 +113,7 @@ def finish_openid(session, request_args, return_to):
 
             ax_response = ax.FetchResponse.fromSuccessResponse(response)
             if ax_response:
-                for k, v in AX_REQUIRED_FIELDS.items():
+                for k, v in ax_required_fields.iteritems():
                     """
                     the values are the URIs, they are the key into the data
                     the key is the shortname
diff --git a/helios_auth/auth_systems/password.py b/helios_auth/auth_systems/password.py
index 36f42ecffcc109f283d157e1ffe2a37fadb8b706..05e133da78c0e52b6065b25c67d5324b183e4557 100644
--- a/helios_auth/auth_systems/password.py
+++ b/helios_auth/auth_systems/password.py
@@ -20,11 +20,14 @@ PASSWORD_FORGOTTEN_URL_NAME = "auth@password@forgotten"
 
 def create_user(username, password, name = None):
   from helios_auth.models import User
-  
-  user = User.get_by_type_and_id('password', username)
-  if user:
+  from django.db import models
+
+  try:
+    user = User.get_by_type_and_id('password', username)
     raise Exception('user exists')
-  
+  except User.DoesNotExist:
+    pass
+
   info = {'password' : password, 'name': name}
   user = User.update_or_create(user_type='password', user_id=username, info = info)
   user.save()
diff --git a/helios_auth/templates/login_box.html b/helios_auth/templates/login_box.html
index 27ca7da17aa80df0367db54adc7bf4d4336365f8..ca9ceb128bcc848cb23b74cacdb0d485b1dc7093 100644
--- a/helios_auth/templates/login_box.html
+++ b/helios_auth/templates/login_box.html
@@ -1,6 +1,6 @@
 {% if default_auth_system %}
 <p>
-<a class="small button" href="{% url "auth@start" system_name=default_auth_system %}?return_url={{return_url}}">Log in</a></p>
+<a class="small button" href="{% url "auth@start" system_name=default_auth_system %}?return_url={{return_url}}">Přihlásit se</a></p>
 {% else %}
 {% for auth_system in enabled_auth_systems %}
 {% ifequal auth_system "password" %}
diff --git a/helios_auth/tests.py b/helios_auth/tests.py
index 934933258f49fb8a64752fc241340a1ad4489789..5ce5d1b592793de9a3e621753c69113c0623465c 100644
--- a/helios_auth/tests.py
+++ b/helios_auth/tests.py
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
 """
 Unit Tests for Auth Systems
 """
@@ -113,7 +114,7 @@ class UserBlackboxTests(TestCase):
     def test_logout(self):
         response = self.client.post(reverse("auth@logout"), follow=True)
         
-        self.assertContains(response, "not logged in")
+        self.assertContains(response, u'Nejste přihlášen')
         self.assertNotContains(response, "Foobar User")
 
     def test_email(self):
diff --git a/heliosbooth/templates/done.html b/heliosbooth/templates/done.html
index 2b9e228d99caaa0203f977a57e1d161da3967def..cfc9d95d893028a5b01ce71d11c670d8d2bdf907 100644
--- a/heliosbooth/templates/done.html
+++ b/heliosbooth/templates/done.html
@@ -1,8 +1,8 @@
 
-<h3>Your Vote is Being Submitted</h3>
+<h3>Odesílání vašeho hlasovacího lístku</h3>
 
 <p>
-Please wait a few seconds while your vote is submitted to the casting server....
+Vyčkejte, prosím, několik sekund, váš hlasovací lístek je odesílán ke zpracování...
 </p>
 
 
diff --git a/heliosbooth/templates/election.html b/heliosbooth/templates/election.html
index 680c4e06ae2f8c14c4456ce2bf1503d246bbc0ad..3bdcf722ffd9668184b6a951b2834466c1d94250 100644
--- a/heliosbooth/templates/election.html
+++ b/heliosbooth/templates/election.html
@@ -1,29 +1,29 @@
 
 <div id="questions_div">
 <p>
-    To cast a vote, you will be led through the following steps.<br />
-    If you have not yet logged in, you will be asked to do so at the very end of the process.
+    Odevzdání hlasu sestává z několika kroků popsaných níže.<br />
+    Pokud ještě nejste přihlášen, budete k tomu vyzván na konci hlasovacího procesu.
 <p>
     
 <ol>
-    <li> <b>Select</b> your preferred options.<br />
-<span style="font-size: 14pt;">You can easily navigate forwards and backwards.</span></li>
+    <li> <b>Vyberte si</b> možnosti, jimž dáváte přednost.<br />
+<span style="font-size: 14pt;">Můžete snadno přecházet kupředu a zpět.</span></li>
 <br />
 
-    <li> <b>Review &amp; Confirm</b> your choices.<br />
+    <li> <b>Zkontrolujte a potvrďte</b> svou volbu.<br />
 <span style="font-size: 14pt;">
-  Your choices are encrypted safely inside your browser, and you get a smart ballot tracker.<br />
+  Vaše volba bude bezpečně zašifrována ve vašem prohlížeči a obdržíte kód pro sledování hlasovacího lístku.<br />
 </span>
 </li>
 <br />
 
-    <li> <b>Submit</b> your encrypted ballot.<br />
+    <li> <b>Odešlete</b> svůj zašifrovaný hlasovací lístek.<br />
 <span style="font-size: 14pt;">
-You will be asked to log in to submit your encrypted ballot for tallying.
+Před odesláním vašeho zašifrovaného hlasovacího lístku ke zpracování budete vyzván, abyste se přihlásil.
 </span>
 </li>
 </ol>
 
-<div align="center"><button onclick="BOOTH.show_question(0);">Start</button></div>
+<div align="center"><button onclick="BOOTH.show_question(0);">Začít</button></div>
 </div>
 
diff --git a/heliosbooth/templates/question.html b/heliosbooth/templates/question.html
index e5ddd62668070bbbcc358bf2b3bf6ab2fc229747..ac43b726891d3baefd44bc422068af9fc7176e77 100644
--- a/heliosbooth/templates/question.html
+++ b/heliosbooth/templates/question.html
@@ -3,23 +3,23 @@
 <input type="hidden" name="question_num" value="{$T.question_num}" />
 
 <p>
-<br /> 
+<br />
 <b>{$T.question.question}</b>
 <br />
-<span style="font-size: 0.6em;">#{$T.question_num + 1} of {$T.last_question_num + 1} &mdash;
- vote for
+<span style="font-size: 0.6em;">#{$T.question_num + 1} z {$T.last_question_num + 1} &mdash;
+ zvolte
 {#if $T.question.min && $T.question.min > 0}
 {#if $T.question.max}
- {$T.question.min} to {$T.question.max}
+od {$T.question.min} do {$T.question.max} možností
 {#else}
- at least {$T.question.min}
+nejméně {$T.question.min} možnosti
 {#/if}
 {#else}
 {#if $T.question.max}
-{#if $T.question.max > 1} up to{#/if} {$T.question.max}
+{#if $T.question.max > 1} nejvýše {#/if}{$T.question.max} možnosti
 {#else}
- as many as you approve of
-{#/if} 
+libovolný počet možností
+{#/if}
 {#/if}
 </span>
 </p>
@@ -34,7 +34,7 @@
     {#if $T.question.answer_urls && $T.question.answer_urls[$T.answer_ordering[$T.answer$index]] && $T.question.answer_urls[$T.answer_ordering[$T.answer$index]] != ""}
       &nbsp;&nbsp;
       <span style="font-size: 12pt;">
-        [<a target="_blank" href="{$T.question.answer_urls[$T.answer_ordering[$T.answer$index]]}" rel="noopener noreferrer">more info</a>]
+        [<a target="_blank" href="{$T.question.answer_urls[$T.answer_ordering[$T.answer$index]]}" rel="noopener noreferrer">více informací</a>]
       </span>
     {#/if}
   </label>
@@ -47,17 +47,17 @@
 
 {#if $T.show_reviewall}
 <div style="float: right;">
-<input type="button" onclick="BOOTH.validate_and_confirm({$T.question_num});" value="Proceed" />
+<input type="button" onclick="BOOTH.validate_and_confirm({$T.question_num});" value="Pokračovat" />
 </div>
 {#/if}
 
 {#if $T.question_num != 0}
-<input type="button" onclick="BOOTH.previous({$T.question_num})" value="Previous" />
+<input type="button" onclick="BOOTH.previous({$T.question_num})" value="Předchozí" />
 &nbsp;
 {#/if}
 
 {#if $T.question_num < $T.last_question_num}
-<input type="button" onclick="BOOTH.next({$T.question_num})" value="Next" />
+<input type="button" onclick="BOOTH.next({$T.question_num})" value="Následující" />
 &nbsp;
 {#/if}
 
diff --git a/heliosbooth/templates/seal.html b/heliosbooth/templates/seal.html
index 3f412c0fc026cda709a3dbcfbb21581499813af3..4182bb2616dc14e533ef99da62f6480d007554d2 100644
--- a/heliosbooth/templates/seal.html
+++ b/heliosbooth/templates/seal.html
@@ -1,36 +1,36 @@
-<h3>Review your Ballot</h3>
+<h3>Kontrola vašeho hlasovacího lístku</h3>
 
 <div style="padding: 10px; margin-bottom: 10px; background-color: #eee; border: 1px #ddd solid; max-width: 340px;">
 {#foreach $T.questions as question}
 
-<b>Question #{$T.question$index + 1}: {$T.question.short_name}</b><br>
+<b>Otázka č. {$T.question$index + 1}: {$T.question.short_name}</b><br>
 {#if $T.choices[$T.question$index].length == 0}
-<div style="margin-left: 15px;">&#x2610; <i>No choice selected</i></div>
+<div style="margin-left: 15px;">&#x2610; <i>Žádná možnost není vybrána</i></div>
 {#/if}
 {#foreach $T.choices[$T.question$index] as choice}
 <div style="margin-left: 15px;">&#x2713; {$T.choice}</div>
 {#/for}
 {#if $T.choices[$T.question$index].length < $T.question.max}
-[you selected {$T.choices[$T.question$index].length} candidates; you may select from {$T.question.min} to {$T.question.max}]
+[vybral jste {$T.choices[$T.question$index].length} možností; můžete vybrat od {$T.question.min} do {$T.question.max} možností]
 {#/if}
-[<a onclick="BOOTH.show_question({$T.question$index}); return false;" href="#">edit responses</a>]
+[<a onclick="BOOTH.show_question({$T.question$index}); return false;" href="#">upravit odpovědi</a>]
 {#if !$T.question$last}<br><br>{#/if}
 {#/for}
 </div>
 
-<p>Your ballot tracker is <b><tt style="font-size: 11pt; word-break: break-all;">{$T.encrypted_vote_hash}</tt></b>, and you can <a onclick="BOOTH.show_receipt(); return false;" href="#">print</a> it.</p>
+<p>Váš kód pro sledování hlasovacího lístku je <b><tt style="font-size: 11pt; word-break: break-all;">{$T.encrypted_vote_hash}</tt></b>, a můžete si ho <a onclick="BOOTH.show_receipt(); return false;" href="#">vytisknout</a>.</p>
 
 {#if $T.election_metadata.use_advanced_audit_features}
 <div style="background: lightyellow; padding: 10px; border: 1px solid #ddd; max-width: 340px;">
-<h4><a onclick="$('#auditbody').slideToggle(250);" href="#">Audit</a> <span style="font-size: 0.8em; color: #444">[optional]</span></h4>
+<h4><a onclick="$('#auditbody').slideToggle(250);" href="#">Audit</a> <span style="font-size: 0.8em; color: #444">[nepovinný]</span></h4>
 <div id="auditbody" style="display:none;">
 <p>
-If you choose, you can audit your ballot and reveal how your choices were encrypted.
+Chcete-li, můžete provést audit svého hlasovacího lístku a dozvědět se, jak byla vaše volba zašifrována.
 </p>
 <p>
-You will then be guided to re-encrypt your choices for final casting.
+Pak budete muset provést nové zašifrování hlasu před jeho odevzdáním.
 </p>
-<input type="button" value="Verify Encryption" onclick="BOOTH.audit_ballot();" class="pretty" />
+<input type="button" value="Zkontrolovat zašifrování" onclick="BOOTH.audit_ballot();" class="pretty" />
 </p>
 </div>
 </div>
@@ -38,9 +38,9 @@ You will then be guided to re-encrypt your choices for final casting.
 
 <br />
 
-<p>Once you click "Submit", the unencrypted version of your ballot will be destroyed, and only the encrypted version will remain. The encrypted version will be submitted to the Helios server.</p>
+<p>Jakmile stisknete "Odevzdat", nezašifrovaná podoba vašeho hlasovacího lístku bude odstraněna a zůstane pouze zašifrovaná podoba.  Ta bude odeslána na server Helios.</p>
 
-<button id="proceed_button" onclick="BOOTH.cast_ballot();">Submit this Vote!</button><br />
+<button id="proceed_button" onclick="BOOTH.cast_ballot();">Odevzdat tento hlas!</button><br />
 <div id="loading_div"><img src="loading.gif" id="proceed_loading_img" /></div>
 
 <form method="POST" action="{$T.cast_url}" id="send_ballot_form" class="prettyform">
diff --git a/heliosbooth/templates/submit.html b/heliosbooth/templates/submit.html
index 34128299484f9eb6efd732bafb3ad246a62aae9b..6465cffff31ca0a7d82c038b80634c90d509bc82 100644
--- a/heliosbooth/templates/submit.html
+++ b/heliosbooth/templates/submit.html
@@ -1,24 +1,24 @@
 
-<h3>Submit Your Encrypted Ballot</h3>
+<h3>Odeslání vašeho zašifrovaného hlasovacího lístku</h3>
 
 <p>
-All information, other than your encrypted ballot,<br />
-has been removed from memory.
+Všechny informace kromě zašifrované podoby vašeho hlasovacího lístku,<br />
+byly odstraněny z paměti.
 </p>
 
 <p>
-As a reminder, your ballot tracking number is:<br />
+Připomínáme, že váš kód pro sledování hlasovacího lístku je:<br />
 <b><tt style="font-size: 16pt;">{$T.encrypted_vote_hash}</tt></b>
 </p>
 
 <p>
-According to the election definition file, this ballot will be submitted to:
+Na základě nastavení tohoto hlasování bude hlasovací lístek odeslán na:
 </p>
 
 <p><b><tt style="font-size:1.3em;">{$T.cast_url}</tt></b></p>
 
 <p>
-    where you will log in to validate your eligibility to vote.
+    kde se můžete přihlásit a ověřit si, zda jste oprávněn hlasovat.
 </p>
 
 <form method="POST" onsubmit="BOOTH.do_done();" action="{$T.cast_url}" id="send_ballot_form" class="prettyform">
@@ -29,7 +29,7 @@ According to the election definition file, this ballot will be submitted to:
 </textarea>
 <div id="submit_button">
   <label for="submit">&nbsp;</label>
-  <input type="submit" value="Submit Ballot" class="pretty" />
+  <input type="submit" value="Odevzdat hlasovací lístek" class="pretty" />
 </div>
 </form>
 
diff --git a/heliosbooth/vote.html b/heliosbooth/vote.html
index f4135133a7839742a3d2278a11beac559ea47e65..6773cd5fbc75b44a2f911b447435744e71bec00a 100644
--- a/heliosbooth/vote.html
+++ b/heliosbooth/vote.html
@@ -3,7 +3,7 @@
 <head>
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   <meta charset="UTF-8">
-  <title>Helios Voting Booth</title>
+  <title>Helios - Hlasovací budka</title>
   <link rel="stylesheet" type="text/css" href="css/booth.css" />
   <link rel="stylesheet" type="text/css" href="css/forms.css" />
 
@@ -24,7 +24,7 @@
   <script language="javascript" src="js/jscrypto/sha1.js"></script>
   <script language="javascript" src="js/jscrypto/sha2.js"></script>
   <script language="javascript" src="js/jscrypto/helios.js"></script>-->
-  
+
   <script language="javascript" src="js/20160507-helios-booth-compressed.js"></script>
 </head>
 
@@ -32,7 +32,7 @@
 <div id="wrapper">
 <div id="banner" class="edge">
     <div class="box"></div>
-    <div class="box"><span>Helios Voting Booth</span></div>
+    <div class="box"><span>Helios - Hlasovací budka</span></div>
     <div class="box"><span><a href="javascript:BOOTH.exit();">exit</a></span></div>
 </div>
 <div id="content">
@@ -71,7 +71,7 @@ window.onbeforeunload = function(evt) {
     evt = window.event;
   }
 
-  var message = "If you leave this page with an in-progress ballot, your ballot will be lost.";
+  var message = "Pokud opustíte tuto stránku během vyplňování hlasovacího lístku, o tento lístek přijdete.";
 
   if (evt) {
     evt.returnValue = message;
@@ -81,7 +81,7 @@ window.onbeforeunload = function(evt) {
 };
 
 BOOTH.exit = function() {
-    if (confirm("Are you sure you want to exit the booth and lose all information about your current ballot?")) {
+    if (confirm("Jste si jist, že chcete opustit budku a přijít o všechny informace z vašeho hlasovacího lístku?")) {
         BOOTH.started_p = false;
         window.location = BOOTH.election.cast_url;
     }
@@ -182,7 +182,7 @@ BOOTH.setup_election = function(raw_json, election_metadata) {
 
   // whether the election wants candidate order randomization or not
   // we set up an ordering array so that the rest of the code is
-  // less error-prone. 
+  // less error-prone.
   BOOTH.election.question_answer_orderings = [];
   $(BOOTH.election.questions).each(function(i, question) {
     var ordering = new Array(question.answers.length);
@@ -229,7 +229,7 @@ BOOTH.launch_async_encryption_answer = function(question_num) {
 BOOTH.validate_question = function(question_num) {
     // check if enough answers are checked
     if (BOOTH.ballot.answers[question_num].length < BOOTH.election.questions[question_num].min) {
-        alert('You need to select at least ' + BOOTH.election.questions[question_num].min + ' answer(s).');
+        alert('Musíte vybrat nejméně ' + BOOTH.election.questions[question_num].min + ' možnost(i/í).');
         return false;
     }
 
@@ -342,7 +342,7 @@ BOOTH.click_checkbox = function(question_num, answer_num, checked_p) {
 
      // do the warning only if the question allows more than one option, otherwise it's confusing
      if (BOOTH.election.questions[question_num].max > 1) {
-        $('#warning_box').html("Maximum number of options selected.<br />To change your selection, please de-select a current selection first.");
+        $('#warning_box').html("Je vybrán maximální povolený počet možností.<br />Abyste mohl změnit svou volbu, musíte nejdřív zrušit výběr některé možnosti.");
      }
   } else {
      // enable the other checkboxes
@@ -558,7 +558,7 @@ BOOTH.audit_ballot = function() {
 
 BOOTH.post_audited_ballot = function() {
   $.post(BOOTH.election_url + "/post-audited-ballot", {'audited_ballot': BOOTH.audit_trail}, function(result) {
-    alert('This audited ballot has been posted.\nRemember, this vote will only be used for auditing and will not be tallied.\nClick "back to voting" and cast a new ballot to make sure your vote counts.');
+    alert('Tento auditovaný hlasovací lístek byl odeslán.\nNezapomeňte, tento lístek bude použit pouze pro audit a nebude zahrnut do výsledku hlasování.\nKlikněte na "zpět k hlasování" a odevzdejte nový hlasovací lístek, abyste měl jistotu, že bude započten.');
   });
 };
 
@@ -588,7 +588,7 @@ BOOTH.cast_ballot = function() {
 };
 
 BOOTH.show_receipt = function() {
-    UTILS.open_window_with_content("Your smart ballot tracker for " + BOOTH.election.name + ": " + BOOTH.encrypted_ballot_hash);
+    UTILS.open_window_with_content("Váš kód pro sledování hlasovacího lístku v " + BOOTH.election.name + ": " + BOOTH.encrypted_ballot_hash);
 };
 
 BOOTH.do_done = function() {
@@ -600,24 +600,24 @@ BOOTH.do_done = function() {
   <div id="progress_div" style="display:none">
       <table>
           <tr>
-              <td id="progress_1">(1) Select</td>
-              <td id="progress_2">(2) Review</td>
-              <td id="progress_3">(3) Submit</td>
+              <td id="progress_1">(1) Výběr</td>
+              <td id="progress_2">(2) Kontrola</td>
+              <td id="progress_3">(3) Odevzdání</td>
           </tr>
       </table>
   </div>
   <div id="election_div" class="panel">
-    <h3>Checking capabilities and loading election booth...</h3>
-    <div align="center"><img src="loading.gif" /><br />This may take up to 10 seconds</div>
+    <h3>Ověřuji možnosti prohlížeče a nahrávám hlasovací budku...</h3>
+    <div align="center"><img src="loading.gif" /><br />Může to trvat až 10 sekund</div>
   </div>
 
   <div id="error_div" class="panel" style="display: none;">
-    <h3>There's a problem</h3>
+    <h3>Nastal problém</h3>
     <p>
-      It appears that your browser does not have Java enabled. Helios needs Java to perform encryption within the browser.
+      Zdá se, že váš prohlížeč nepodporuje Javu. Helios vyžaduje javu kvůli zašifrování hlasovacího lístku v prohlížeči.
     </p>
     <p>
-      You may be able to install Java by visiting <a target="_new" href="http://java.com">java.com</a>.
+      Javu můžete nainstalovat z <a target="_new" href="http://java.com">java.com</a>.
     </p>
   </div>
 
@@ -625,14 +625,14 @@ BOOTH.do_done = function() {
   </div>
 
   <div id="processing_div" class="panel" style="display:none;">
-      <h3 align="center">Processing....</h3>
+      <h3 align="center">Pracuji....</h3>
   </div>
 
   <div id="encrypting_div" class="panel" style="display:none;">
-      <h3 align="center">Helios is now encrypting your ballot<br />
+      <h3 align="center">Helios nyní provádí zašifrování vašeho hlasovacího lístku<br />
           <img src="encrypting.gif" /> <span style="font-size:0.7em; display:none;" id="percent_done_container">(<span id="percent_done">0</span>%)</span></h3>
 
-      <p align="center"><b>This may take up to two minutes.</b>
+      <p align="center"><b>Může to trvat až dvě minuty.</b>
   </div>
 
   <div id="seal_div" class="panel">
diff --git a/server_ui/templates/base.html b/server_ui/templates/base.html
index 8357be2aaa31636509e32c51609ce92f8d0b3801..5c70535dd41542cca1b5d055d71ac26fc284b7cf 100644
--- a/server_ui/templates/base.html
+++ b/server_ui/templates/base.html
@@ -6,11 +6,11 @@
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width">
   <title>{% block title %}{% endblock %}</title>
-  
+
   <link rel="stylesheet" href="/static/foundation/css/foundation.css">
   <link rel="stylesheet" href="/static/foundation-tweaks.css">
 
-{% if settings.DEBUG %}  
+{% if settings.DEBUG %}
   <script src="/static/foundation/js/vendor/custom.modernizr.js"></script>
   <script language="javascript" src="/static/helios/js/jquery-1.4.2.min.js"></script>
   <script language="javascript" src="/static/helios/js/jquery-ui-1.8.1.custom.min.js"></script>
@@ -21,10 +21,10 @@
 {% else %}
 <script language="javascript" src="/static/20140302-helios-combined.js"></script>
 {% endif %}
-  
+
   {% block js %}
   {% endblock %}
-  
+
   {% block extra-head %}{% endblock %}
 </head>
 <body>
@@ -37,7 +37,7 @@
       </li>
       <li class="toggle-topbar menu-icon"><a href="#"><span>menu</span></a></li>
     </ul>
- 
+
     <section class="top-bar-section">
       <!-- Right Nav Section -->
       <ul class="right">
@@ -46,10 +46,10 @@
 	<li class="divider"></li>
 	{% endif %}
 	{% if not settings.MASTER_HELIOS %}
-	<li><a href="http://heliosvoting.org">About Helios</a></li>
+	<li><a href="http://heliosvoting.org">O Heliosu</a></li>
 	{% endif %}
       </ul>
-      
+
       <ul>
         <li><a href="/">{{settings.SITE_TITLE}}</a></li>
 	{% if settings.MASTER_HELIOS %}
@@ -76,7 +76,7 @@
   <div class="row" id="contentbody">
       {% block content %}{% endblock %}
   </div>
-  
+
   <div class="push"></div>
   </div>
 
@@ -87,14 +87,14 @@
       {% endif %}
     </span>-->
     {% if user %}
-    logged in as <b>{{user.display_html_small|safe}}</b>&nbsp;&nbsp;
-    <a class="tiny button" href="{% url "auth@logout" %}?return_url={{CURRENT_URL}}">logout</a><br />
+    Přihlášen jako <b>{{user.display_html_small|safe}}</b>&nbsp;&nbsp;
+    <a class="tiny button" href="{% url "auth@logout" %}?return_url={{CURRENT_URL}}">odhlásit se</a><br />
     {% else %}
     {% if voter %}
-    You are signed in as voter <u>{% if voter.alias %}{{voter.alias}}{% else %}{{voter.name}}{% endif %}</u> in election <u>{{voter.election.name}}</u>. [<a href="{{settings.SECURE_URL_HOST}}{% url "auth@logout" %}?return_url={{CURRENT_URL}}">sign out</a>]
+    Jste přihlášen jako volič <u>{% if voter.alias %}{{voter.alias}}{% else %}{{voter.name}}{% endif %}</u> v hlasování <u>{{voter.election.name}}</u>. [<a href="{{settings.SECURE_URL_HOST}}{% url "auth@logout" %}?return_url={{CURRENT_URL}}">odhlásit se</a>]
     {% else %}
 {% if settings.SHOW_LOGIN_OPTIONS %}
-    not logged in. <a class="tiny button" href="{{settings.SECURE_URL_HOST}}{% url "auth@index" %}?return_url={{CURRENT_URL}}">log in</a>
+    Nejste přihlášen. <a class="tiny button" href="{{settings.SECURE_URL_HOST}}{% url "auth@index" %}?return_url={{CURRENT_URL}}">Přihlásit se</a>
 {% else %}
 powered by <a href="http://heliosvoting.org">Helios Voting</a>.
 {% endif %}
@@ -102,10 +102,10 @@ powered by <a href="http://heliosvoting.org">Helios Voting</a>.
     {% endif %}
       <br clear="right" />
     </div>
-  
+
   </div>
       <script>
 	$(document).foundation();
-      </script>     
+      </script>
 </body>
 </html>
diff --git a/server_ui/templates/confirm.html b/server_ui/templates/confirm.html
index 2f24a807a0ae1854a5f2b8207c037d3b8a6c74d0..5d905a495f2548ebb176c425f4f6c4d3c06df6aa 100644
--- a/server_ui/templates/confirm.html
+++ b/server_ui/templates/confirm.html
@@ -12,20 +12,20 @@ function show_waiting() {
   $('#waiting_div').show();
 }
 </script>
-<h1>Confirm your Vote</h1>
+<h1>Potvrďte vaše hlasování</h1>
 
 {% if error %}
 <p style="color: red;">{{error}}</p>
 {% endif %}
 
-<h3>Your Ballot</h3>
+<h3>Váš hlasovací lístek</h3>
 
 <p style="font-size:1.6em;">
     <tt>{{vote_fingerprint}}</tt>
 </p>
 
 <div id="cast_div">
-<h3>Cast Your Ballot with your Credentials</h3>
+<h3>Vhoďte váš hlasovací lístek s vaším přihlášením.</h3>
 
 <form method="post" onsubmit="show_waiting();" action="">
     <input type="hidden" name="csrf_token" value="{{csrf_token}}" />
@@ -34,16 +34,16 @@ function show_waiting() {
 {{form.as_table}}
 </table><br />
 
-    <input type="submit" value="cast this ballot" /><br /><br />
+    <input type="submit" value="vhoďte tento lístek" /><br /><br />
 </form>
 
 <p>
-    Forgot your password? <a href="{% url "auth@password@forgotten" %}?return_url={% url "election@cast-confirm" %}">Have it emailed to you</a>.<br />(don't worry, we won't forget your vote).
+    Zapomněli jste heslo? <a href="{% url "auth@password@forgotten" %}?return_url={% url "election@cast-confirm" %}">Nechte si ho poslat e-mailem</a>.<br />(nebojte se, nezapomeneme vaše hlasování).
 </p>
 </div>
 
 <div id="waiting_div" align="center">
-  Verifying and Casting your ballot<br />
+  Ověřuji a odevzdávám váš lístek<br />
   <img src="/static/helios/loading.gif" />
 </div>
 
diff --git a/server_ui/templates/done.html b/server_ui/templates/done.html
index d4281060f7f16cef56798f82a06788da99467ddb..fe89327b8240520073fe64badc093f4707181136 100644
--- a/server_ui/templates/done.html
+++ b/server_ui/templates/done.html
@@ -1,17 +1,17 @@
 {% extends 'server_ui/templates/base.html' %}
-{% block title %}Confirm Vote{% endblock %}
+{% block title %}Potvrzení hlasu{% endblock %}
 
 {% block content %}
-<h1>Your Vote was Cast</h1>
+<h1>Odevzdal jste svůj hlas</h1>
 
 <p>
-    A vote was successfully cast for <b>{{voter.voter_id}}</b>, with vote fingerprint:
+    Úspěšně jste odevzdal hlas jako volič <b>{{voter.voter_id}}</b>, otisk hlasu je:
     <br /><br />
     <tt style="font-size: 2em;">{{voter.vote_hash}}</tt>
 </p>
 
 <p>
-    Visit the <a href="{% url "election@view" election.uuid %}">election homepage</a>.
+    Můžete přejít na <a href="{% url "election@view" election.uuid %}">úvodní stránku hlasování</a>.
 </p>
 
 {% endblock %}
diff --git a/server_ui/templates/election_tallied.html b/server_ui/templates/election_tallied.html
index 42d44410f9b298eecc3c429b7eca9bcf98aaaf69..4694f367abdd71c6268f0cb26d16bb6fe81ac23c 100644
--- a/server_ui/templates/election_tallied.html
+++ b/server_ui/templates/election_tallied.html
@@ -2,13 +2,13 @@
 
 {% block content %}
 
-  <h2 class="title">Election {{election.name}} Already Tallied</h2>
+  <h2 class="title">Hlasování {{election.name}} již bylo sečteno</h2>
 
   <p>
-      This election has already been tallied (or at least the tally has begun), so you can no longer cast a vote.
+      Toto hlasování bylo již sečteno (nebo aspoň sčítání již započalo), takže již není možné odevzdat hlas.
   </p>
-  
+
   <p>
-      <a href="{% url "election@view" election.uuid %}">view the election</a>
+      <a href="{% url "election@view" election.uuid %}">zobrazit hlasování</a>
   </p>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
diff --git a/server_ui/templates/index.html b/server_ui/templates/index.html
index 4b1fcec8f7cb672a02569e02a01ff4efefa99d90..54a4ef807322f60fa77aca25c4119cda6d85607a 100644
--- a/server_ui/templates/index.html
+++ b/server_ui/templates/index.html
@@ -28,28 +28,28 @@ More than <b>2,000,000 votes</b> have been cast using Helios.
 </p>
 
 {% if create_p %}
-<a class="button" href="{% url "elections@new" %}">create an election</a>
+<a class="button" href="{% url "elections@new" %}">Vytvořit hlasování</a>
 {% endif %}
 
   {% else %}
   <p style="font-size: 1.4em;">
     {{settings.WELCOME_MESSAGE|safe}}
   </p>
-  
+
   {% if elections|length %}
   <p>
     {% for election in elections %}
     <div class="panel">
-      <a style="font-size: 1.4em;" href="{% url "shortcut@election" election.short_name %}">{{election.name}}</a>{% if settings.SHOW_USER_INFO %}<br /> by {{election.admin.display_html_small|safe}}{% endif %}
+      <a style="font-size: 1.4em;" href="{% url "shortcut@election" election.short_name %}">{{election.name}}</a>{% if settings.SHOW_USER_INFO %}<br /> vytvořil {{election.admin.display_html_small|safe}}{% endif %}
     </div>
     <br />
     {% endfor %}
   </p>
   {% else %}
-  <h4>no featured elections at the moment</h4>
+  <h4>V této chvíli zde nejsou žádná zviditelněná hlasování</h4>
   {% endif %}
 {% endif %}
-  
+
 </div>
 
 <div class="large-3 columns" id="mystuff">
@@ -58,8 +58,8 @@ More than <b>2,000,000 votes</b> have been cast using Helios.
 {% if user %}
 <!--<div class="row right">{{user.display_html_big|safe}}</div>-->
 {% if create_p %}
-<a class="small button" href="{% url "elections@new" %}">create election</a>
-<h5 class="subheader">Administration</h5>
+<a class="small button" href="{% url "elections@new" %}">Vytvořit hlasování</a>
+<h5 class="subheader">Administrace</h5>
 {% if elections_administered %}
 <ul>
 {% for election in elections_administered %}
@@ -67,15 +67,15 @@ More than <b>2,000,000 votes</b> have been cast using Helios.
 {% endfor %}
 </ul>
 {% else %}
-<em>none yet</em>
+<em>dosud žádné</em>
 {% endif %}
 <div class="row right">
-<a class="tiny button" href="{% url "elections@administered" %}">see all</a>
+<a class="tiny button" href="{% url "elections@administered" %}">zobrazit vše</a>
 </div>
 <div class="row"></div>
 {% endif %}
 
-<h5 class="subheader">Recent Votes</h5>
+<h5 class="subheader">Naposledy hlasováno v</h5>
 {% if elections_voted %}
 <ul>
 {% for election in elections_voted %}
@@ -83,17 +83,17 @@ More than <b>2,000,000 votes</b> have been cast using Helios.
 {% endfor %}
 </ul>
 {% else %}
-<em>none yet</em>
+<em>dosud žádné</em>
 {% endif %}
-<div class="row right"><a class="tiny button" href="{% url "elections@voted" %}">see all</a></div>
+<div class="row right"><a class="tiny button" href="{% url "elections@voted" %}">zobrazit vše</a></div>
 <div class="row"></div>
 {% else %}
 {% if settings.SHOW_LOGIN_OPTIONS %}
-<h5>Log In to Start Voting</h5>
+<h5>Přihlaste se, chcete-li hlasovat</h5>
 {{login_box|safe}}
 {% else %}
 <p>
-Select an election to start voting. You will be asked for your voting credentials after you complete a ballot.
+Vyberte si hlasování, v němž chcete hlasovat. Po vyplnění hlasovacího lístku budete požádán o prokázání oprávnění hlasovat.
 </p>
 {% endif %}
 {% endif %}
diff --git a/server_ui/templates/privacy.html b/server_ui/templates/privacy.html
index f96ba65787fdaefcf40a126a4c889986dcc09037..1bacb59d7095326da51f3af129031c244aef164f 100644
--- a/server_ui/templates/privacy.html
+++ b/server_ui/templates/privacy.html
@@ -1,5 +1,5 @@
 {% extends 'server_ui/templates/base.html' %}
-{% block title %}{{ settings.SITE_TITLE }} &mdash; Privacy{% endblock %}
+{% block title %}{{ settings.SITE_TITLE }} &mdash; Soukromí{% endblock %}
 
 {% block header %}
 {% endblock %}
@@ -8,18 +8,18 @@
 
 <div class="large-12-columns">
 
-<div class="row"><h2>Privacy</h2></div>
+<div class="row"><h2>Soukromí</h2></div>
 
 <div class="row">
 
-<h3>In General</h3>
+<h3>Obecně</h3>
 
 <ul>
-<li> Helios is designed with built-in privacy. If you have any questions or concerns about Helios privacy not covered here, <a href="mailto:help@heliosvoting.org">send us an email</a>.</li>
-<li> We collect only the information needed to provide secure, trustworthy elections.</li>
-<li> We make certain information available publicly on our web site as part of the process of auditing elections (details below.) Other than that, we do not give away any information we collect.</li>
-<li> We do not sell any information.</li>
-<li> We do not use external trackers or advertising that could leak information about you, except for Facebook and Twitter share buttons. Even for those, we use origin sandboxing to limit how much Facebook and Twitter can determine about you, and we only use those buttons on the election information page.
+<li> Helios je navržen se zabudovaným Soukromím. Pokud máš jakékoliv otázky nebo pochyby o soukromí Heliosu zde nepokryté, <a href="mailto:help@heliosvoting.org">napiš nám email</a>.</li>
+<li> Shromažďujeme jen informace nezbytné k zajištění bezpečných, důvěryhodných voleb.</li>
+<li> Některé informace činíme veřejnými na našem webu jako součást procedu auditu voleb (detaily níže.) Kromě toho neposkytujeme žádné informace, které sbíráme.</li>
+<li> Neprodáváme žádné informace.</li>
+<li> Nepouživáme externí trackery nebo reklamu, které by mohlo zapříčínit únik informace o tobě, kromě sdílecích tlačítek Facebooku a twitteru. Dokonce i pro tyto používáme origin sandboxing abychom omezili kolik Facebook a Twitter o tobě mohou určit, a používáme je pouze na stránce informací o volbě.
 </ul>
 
 <p>
diff --git a/templates/404.html b/templates/404.html
index 281fe9caf728a7a0e879d2c69dfa1db67279b7bc..49a30ccd9c22e8b6bb0b0fd612c4f9e528a4bbf2 100644
--- a/templates/404.html
+++ b/templates/404.html
@@ -1,6 +1,6 @@
 {% extends 'base.html' %}
-{% block title %}Page not found{% endblock %}
+{% block title %}Stránka nenalezena{% endblock %}
 
 {% block content %}
-The page you requested could not be found.
+Požadovaná stránka nebyla nalezena.
 {% endblock %}
diff --git a/templates/500.html b/templates/500.html
index ea97b712a5f3ad7c4671afdd2ae834270b63844f..cd2338a8bbabadc1f1254fb4933b69b94378a164 100644
--- a/templates/500.html
+++ b/templates/500.html
@@ -1,6 +1,6 @@
 {% extends 'base.html' %}
-{% block title %}Server error{% endblock %}
+{% block title %}Chyba serveru{% endblock %}
 
 {% block content %}
-There was an error while handling your request.
+Došlo k chybě při zpracování.
 {% endblock %}