From c25b373ee27cc2b21e5d92a7ac9f546a99fabceb Mon Sep 17 00:00:00 2001
From: Bob Mottram <bob@freedombone.net>
Date: Sat, 7 Sep 2019 10:21:10 +0100
Subject: [PATCH] Translate login screen

---
 daemon.py            | 17 ++++++++-----
 translations/en.json | 18 +++++++++++++-
 translations/fr.json | 18 +++++++++++++-
 webinterface.py      | 57 ++++++++++++++++++++++++--------------------
 4 files changed, 76 insertions(+), 34 deletions(-)

diff --git a/daemon.py b/daemon.py
index 537cc644..26854ce7 100644
--- a/daemon.py
+++ b/daemon.py
@@ -898,7 +898,7 @@ class PubServer(BaseHTTPRequestHandler):
 
         if self.path.startswith('/login') or self.path=='/':
             # request basic auth
-            msg=htmlLogin(self.server.baseDir).encode('utf-8')
+            msg=htmlLogin(self.server.translate,self.server.baseDir).encode('utf-8')
             self._login_headers('text/html',len(msg))
             self.wfile.write(msg)
             self.server.GETbusy=False
@@ -1601,7 +1601,8 @@ class PubServer(BaseHTTPRequestHandler):
                                                         self.server.httpPrefix, \
                                                         maxPostsInFeed, 'inbox', \
                                                         True,self.server.ocapAlways)
-                            msg=htmlInbox(pageNumber,maxPostsInFeed, \
+                            msg=htmlInbox(self.server.translate, \
+                                          pageNumber,maxPostsInFeed, \
                                           self.server.session, \
                                           self.server.baseDir, \
                                           self.server.cachedWebfingers, \
@@ -1666,7 +1667,8 @@ class PubServer(BaseHTTPRequestHandler):
                                                         self.server.httpPrefix, \
                                                         maxPostsInFeed, 'dm', \
                                                         True,self.server.ocapAlways)
-                            msg=htmlInboxDMs(pageNumber,maxPostsInFeed, \
+                            msg=htmlInboxDMs(self.server.translate, \
+                                             pageNumber,maxPostsInFeed, \
                                              self.server.session, \
                                              self.server.baseDir, \
                                              self.server.cachedWebfingers, \
@@ -1726,7 +1728,8 @@ class PubServer(BaseHTTPRequestHandler):
                                              maxPostsInFeed, 'outbox', \
                                              authorized, \
                                              self.server.ocapAlways)
-                msg=htmlOutbox(pageNumber,maxPostsInFeed, \
+                msg=htmlOutbox(self.server.translate, \
+                               pageNumber,maxPostsInFeed, \
                                self.server.session, \
                                self.server.baseDir, \
                                self.server.cachedWebfingers, \
@@ -1780,7 +1783,8 @@ class PubServer(BaseHTTPRequestHandler):
                                                   self.server.httpPrefix, \
                                                   maxPostsInFeed, 'moderation', \
                                                   True,self.server.ocapAlways)
-                            msg=htmlModeration(pageNumber,maxPostsInFeed, \
+                            msg=htmlModeration(self.server.translate, \
+                                               pageNumber,maxPostsInFeed, \
                                                self.server.session, \
                                                self.server.baseDir, \
                                                self.server.cachedWebfingers, \
@@ -2656,7 +2660,8 @@ class PubServer(BaseHTTPRequestHandler):
                             moderationText=moderationStr.split('=')[1].strip()
                             moderationText=moderationText.replace('+',' ').replace('%40','@').replace('%3A',':').replace('%23','#').strip()
                     elif moderationStr.startswith('submitInfo'):
-                        msg=htmlModerationInfo(self.server.baseDir).encode('utf-8')
+                        msg=htmlModerationInfo(self.server.translate, \
+                                               self.server.baseDir).encode('utf-8')
                         self._login_headers('text/html',len(msg))
                         self.wfile.write(msg)
                         self.server.POSTbusy=False
diff --git a/translations/en.json b/translations/en.json
index c9e1a759..1a1671bb 100644
--- a/translations/en.json
+++ b/translations/en.json
@@ -90,5 +90,21 @@
     "Stop blocking": "Stop blocking",
     "Enter an emoji name to search for": "Enter an emoji name to search for",
     "Enter an address, shared item, #hashtag, *skill or :emoji: to search for": "Enter an address, shared item, #hashtag, *skill or :emoji: to search for",
-    "Go Back": "Go Back"
+    "Go Back": "Go Back",
+    "Moderation Information": "Moderation Information",
+    "Suspended accounts": "Suspended accounts",
+    "These are currently suspended": "These are currently suspended",
+    "Blocked accounts and hashtags": "Blocked accounts and hashtags",
+    "These are globally blocked for all accounts on this instance": "These are globally blocked for all accounts on this instance",
+    "Any blocks or suspensions made by moderators will be shown here.": "Any blocks or suspensions made by moderators will be shown here.",
+    "Welcome. Please enter your login details below.": "Welcome. Please enter your login details below.",
+    "Welcome. Please login or register a new account.": "Welcome. Please login or register a new account.",
+    "Please enter some credentials": "Please enter some credentials",
+    "You will become the admin of this site.": "You will become the admin of this site.",
+    "Terms of Service": "Terms of Service",
+    "About this Instance": "About this Instance",
+    "Nickname": "Nickname",
+    "Enter Nickname": "Enter Nickname",
+    "Password": "Password",
+    "Enter Password": "Enter Password"
 }
diff --git a/translations/fr.json b/translations/fr.json
index afc28d2b..5c80d8bb 100644
--- a/translations/fr.json
+++ b/translations/fr.json
@@ -90,5 +90,21 @@
     "Stop blocking": "Arrêtez le blocage",
     "Enter an emoji name to search for": "Entrez un nom emoji à rechercher",
     "Enter an address, shared item, #hashtag, *skill or :emoji: to search for": "Entrez une adresse, un objet partagé, #hashtag, * skill ou: emoji: à rechercher",
-    "Go Back": "Retourner"
+    "Go Back": "Retourner",
+    "Moderation Information": "Informations de modération",
+    "Suspended accounts": "Comptes suspendus",
+    "These are currently suspended": "Ceux-ci sont actuellement suspendus",
+    "Blocked accounts and hashtags": "Comptes bloqués et hashtags",
+    "These are globally blocked for all accounts on this instance": "Ceux-ci sont globalement bloqués pour tous les comptes sur cette instance.",
+    "Any blocks or suspensions made by moderators will be shown here.": "Tous les blocages ou suspensions réalisés par les modérateurs seront affichés ici.",
+    "Welcome. Please enter your login details below.": "Bienvenue. S'il vous plaît entrer vos informations de connexion ci-dessous.",
+    "Welcome. Please login or register a new account.": "Bienvenue. Veuillez vous connecter ou créer un nouveau compte.",
+    "Please enter some credentials": "S'il vous plaît entrer des informations d'identification",
+    "You will become the admin of this site.": "Vous allez devenir l'administrateur de ce site.",
+    "Terms of Service": "Conditions d'utilisation",
+    "About this Instance": "A propos de cette instance",
+    "Nickname": "Pseudo",
+    "Enter Nickname": "Entrez le pseudo",
+    "Password": "Mot de passe",
+    "Enter Password": "Entrer le mot de passe"
 }
diff --git a/webinterface.py b/webinterface.py
index 5d98174b..edb4e39c 100644
--- a/webinterface.py
+++ b/webinterface.py
@@ -184,13 +184,13 @@ def htmlSearchSharedItems(baseDir: str,searchStr: str, \
         sharedItemsForm+=htmlFooter()
     return sharedItemsForm    
 
-def htmlModerationInfo(baseDir: str) -> str:
+def htmlModerationInfo(translate: {},baseDir: str) -> str:
     infoForm=''
     with open(baseDir+'/epicyon-profile.css', 'r') as cssFile:
         infoCSS=cssFile.read()
         infoForm=htmlHeader(infoCSS)
 
-        infoForm+='<center><h1>Moderation Information</h1></center>'
+        infoForm+='<center><h1>'+translate['Moderation Information']+'</h1></center>'
 
         infoShown=False        
         suspendedFilename=baseDir+'/accounts/suspended.txt'
@@ -199,8 +199,8 @@ def htmlModerationInfo(baseDir: str) -> str:
                 suspendedStr = f.read()
                 infoForm+= \
                     '<div class="container">' \
-                    '  <br><b>Suspended accounts</b>' \
-                    '  <br>These are currently suspended' \
+                    '  <br><b>'+translate['Suspended accounts']+'</b>' \
+                    '  <br>'+translate['These are currently suspended']+ \
                     '  <textarea id="message" name="suspended" style="height:200px">'+suspendedStr+'</textarea>' \
                     '</div>'
                 infoShown=True
@@ -211,13 +211,13 @@ def htmlModerationInfo(baseDir: str) -> str:
                 blockedStr = f.read()
                 infoForm+= \
                     '<div class="container">' \
-                    '  <br><b>Blocked accounts and hashtags</b>' \
-                    '  <br>These are globally blocked for all accounts on this instance' \
+                    '  <br><b>'+translate['Blocked accounts and hashtags']+'</b>' \
+                    '  <br>'+translate['These are globally blocked for all accounts on this instance']+ \
                     '  <textarea id="message" name="blocked" style="height:200px">'+blockedStr+'</textarea>' \
                     '</div>'        
                 infoShown=True
         if not infoShown:
-            infoForm+='<center><p>Any blocks or suspensions made by moderators will be shown here.</p></center>'
+            infoForm+='<center><p>'+translate['Any blocks or suspensions made by moderators will be shown here.']+'</p></center>'
         infoForm+=htmlFooter()
     return infoForm    
 
@@ -542,7 +542,7 @@ def htmlGetLoginCredentials(loginParams: str,lastLoginTime: int) -> (str,str,boo
                 register=True
     return nickname,password,register
 
-def htmlLogin(baseDir: str) -> str:
+def htmlLogin(translate: {},baseDir: str) -> str:
     """Shows the login screen
     """
     accounts=noOfAccounts(baseDir)
@@ -554,9 +554,10 @@ def htmlLogin(baseDir: str) -> str:
             copyfile(baseDir+'/img/login-background.png',baseDir+'/accounts/login-background.png')
 
     if accounts>0:
-        loginText='<p class="login-text">Welcome. Please enter your login details below.</p>'
+        loginText='<p class="login-text">'+translate['Welcome. Please enter your login details below.']+'</p>'
     else:
-        loginText='<p class="login-text">Please enter some credentials</p><p>You will become the admin of this site.</p>'
+        loginText='<p class="login-text">'+translate['Please enter some credentials']+'</p>'
+        loginText+='<p class="login-text">'+translate['You will become the admin of this site.']+'</p>'
     if os.path.isfile(baseDir+'/accounts/login.txt'):
         # custom login message
         with open(baseDir+'/accounts/login.txt', 'r') as file:
@@ -570,15 +571,15 @@ def htmlLogin(baseDir: str) -> str:
     if getConfigParam(baseDir,'registration')=='open':
         if int(getConfigParam(baseDir,'registrationsRemaining'))>0:
             if accounts>0:
-                loginText='<p class="login-text">Welcome. Please login or register a new account.</p>'
+                loginText='<p class="login-text">'+translate['Welcome. Please login or register a new account.']+'</p>'
             registerButtonStr='<button type="submit" name="register">Register</button>'
 
-    TOSstr='<p class="login-text"><a href="/terms">Terms of Service</a></p>'
-    TOSstr+='<p class="login-text"><a href="/about">About this Instance</a></p>'
+    TOSstr='<p class="login-text"><a href="/terms">'+translate['Terms of Service']+'</a></p>'
+    TOSstr+='<p class="login-text"><a href="/about">'+translate['About this Instance']+'</a></p>'
 
     loginButtonStr=''
     if accounts>0:
-        loginButtonStr='<button type="submit" name="submit">Login</button>'
+        loginButtonStr='<button type="submit" name="submit">'+translate['Login']+'</button>'
             
     loginForm=htmlHeader(loginCSS)
     loginForm+= \
@@ -589,11 +590,11 @@ def htmlLogin(baseDir: str) -> str:
         '  </div>' \
         '' \
         '  <div class="container">' \
-        '    <label for="nickname"><b>Nickname</b></label>' \
-        '    <input type="text" placeholder="Enter Nickname" name="username" required autofocus>' \
+        '    <label for="nickname"><b>'+translate['Nickname']+'</b></label>' \
+        '    <input type="text" placeholder="'+translate['Enter Nickname']+'" name="username" required autofocus>' \
         '' \
-        '    <label for="password"><b>Password</b></label>' \
-        '    <input type="password" placeholder="Enter Password" name="password" required>'+ \
+        '    <label for="password"><b>'+translate['Password']+'</b></label>' \
+        '    <input type="password" placeholder="'+translate['Enter Password']+'" name="password" required>'+ \
         registerButtonStr+loginButtonStr+ \
         '  </div>' \
         '</form>'
@@ -1895,7 +1896,7 @@ def htmlTimeline(translate: {},pageNumber: int, \
     tlStr+=htmlFooter()
     return tlStr
 
-def htmlInbox(pageNumber: int,itemsPerPage: int, \
+def htmlInbox(translate: {},pageNumber: int,itemsPerPage: int, \
               session,baseDir: str,wfRequest: {},personCache: {}, \
               nickname: str,domain: str,port: int,inboxJson: {}, \
               allowDeletion: bool, \
@@ -1905,33 +1906,36 @@ def htmlInbox(pageNumber: int,itemsPerPage: int, \
     manuallyApproveFollowers= \
         followerApprovalActive(baseDir,nickname,domain)
 
-    return htmlTimeline(pageNumber,itemsPerPage,session,baseDir,wfRequest,personCache, \
+    return htmlTimeline(translate,pageNumber, \
+                        itemsPerPage,session,baseDir,wfRequest,personCache, \
                         nickname,domain,port,inboxJson,'inbox',allowDeletion, \
                         httpPrefix,projectVersion,manuallyApproveFollowers)
 
-def htmlInboxDMs(pageNumber: int,itemsPerPage: int, \
+def htmlInboxDMs(translate: {},pageNumber: int,itemsPerPage: int, \
                  session,baseDir: str,wfRequest: {},personCache: {}, \
                  nickname: str,domain: str,port: int,inboxJson: {}, \
                  allowDeletion: bool, \
                  httpPrefix: str,projectVersion: str) -> str:
     """Show the DM timeline as html
     """
-    return htmlTimeline(pageNumber,itemsPerPage,session,baseDir,wfRequest,personCache, \
+    return htmlTimeline(translate,pageNumber, \
+                        itemsPerPage,session,baseDir,wfRequest,personCache, \
                         nickname,domain,port,inboxJson,'dm',allowDeletion, \
                         httpPrefix,projectVersion,False)
 
-def htmlModeration(pageNumber: int,itemsPerPage: int, \
+def htmlModeration(translate: {},pageNumber: int,itemsPerPage: int, \
                    session,baseDir: str,wfRequest: {},personCache: {}, \
                    nickname: str,domain: str,port: int,inboxJson: {}, \
                    allowDeletion: bool, \
                    httpPrefix: str,projectVersion: str) -> str:
     """Show the moderation feed as html
     """
-    return htmlTimeline(pageNumber,itemsPerPage,session,baseDir,wfRequest,personCache, \
+    return htmlTimeline(translate,pageNumber, \
+                        itemsPerPage,session,baseDir,wfRequest,personCache, \
                         nickname,domain,port,inboxJson,'moderation',allowDeletion, \
                         httpPrefix,projectVersion,True)
 
-def htmlOutbox(pageNumber: int,itemsPerPage: int, \
+def htmlOutbox(translate: {},pageNumber: int,itemsPerPage: int, \
                session,baseDir: str,wfRequest: {},personCache: {}, \
                nickname: str,domain: str,port: int,outboxJson: {}, \
                allowDeletion: bool,
@@ -1940,7 +1944,8 @@ def htmlOutbox(pageNumber: int,itemsPerPage: int, \
     """
     manuallyApproveFollowers= \
         followerApprovalActive(baseDir,nickname,domain)
-    return htmlTimeline(pageNumber,itemsPerPage,session,baseDir,wfRequest,personCache, \
+    return htmlTimeline(translate,pageNumber, \
+                        itemsPerPage,session,baseDir,wfRequest,personCache, \
                         nickname,domain,port,outboxJson,'outbox',allowDeletion, \
                         httpPrefix,projectVersion,manuallyApproveFollowers)