Skip to content

Commit

Permalink
improve translations and gui for runtime change of language. V2.1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
RomainL972 committed May 4, 2020
1 parent bc3844c commit c264e58
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 51 deletions.
7 changes: 4 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,13 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
## [2.1.0] - 2020-05-03
### Added
- Trust functionnality
- Translation of all messages in French
- Translation of all messages in English
- Settings
- Persistent settings for username and language
- Translation language can be changed during execution

### Fixed
- Messages received when connexion not trusted are buffered instead of diplayed
Expand Down Expand Up @@ -230,7 +231,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Basic server and client
- Use regex to parse commands

[Unreleased]: https://github.com/RomainL972/isn/compare/v2.0.0...HEAD
[2.1.0]: https://github.com/RomainL972/isn/compare/v2.0.0...v2.1.0
[2.0.0]: https://github.com/RomainL972/isn/compare/v1.1.1...v2.0.0
[1.1.1]: https://github.com/RomainL972/isn/compare/v1.1.0...v1.1.1
[1.1.0]: https://github.com/RomainL972/isn/compare/v1.0.0...v1.1.0
Expand Down
27 changes: 17 additions & 10 deletions src/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@
from server import SocketServer
from backend import TuringChat
from trust import TrustManager
from translate import tr
from translate import Translate, setObject
from settings import Settings
import re


class Interface():
def __init__(self, uiPrintMessage, sendQuit=None):
self.settings = Settings(self.printMessage)
self.turing = TuringChat()
self.client = None
self.server = None
Expand All @@ -17,11 +18,12 @@ def __init__(self, uiPrintMessage, sendQuit=None):
self.connexion = None
self.server = SocketServer(self.turing, self.printMessage, self.writeMessages)
self.client = SocketClient(self.turing, self.printMessage, self.writeMessages)
self.username = None
self.username = self.settings.getSetting("username")
self.otherUsername = None
self.trustManager = TrustManager(self.printMessage)
self.msgBuffer = []
self.settings = Settings(self.printMessage)
self.translate = Translate(self.printMessage, self.settings.getSetting("language"))
setObject(self.translate)

def printMessage(self, text, message=False, username=None):
if message and not self.trustManager.connexionTrusted():
Expand All @@ -45,7 +47,7 @@ def startServer(self):
self.server.start()

def stopServer(self):
if self.server.listening():
if self.server.listening() or self.server.isStopped():
self.server.stop()
self.server.join()
self.server = SocketServer(self.turing, self.printMessage, self.writeMessages)
Expand All @@ -59,9 +61,10 @@ def stopClient(self):

def setUsername(self, username):
self.username = username
self.settings.setSetting("username", username)
if self.connexion:
self.connexion.send(self.turing.createMessage("username", username))
self.printMessage(tr("username.changed") + username)
self.printMessage(self.translate.tr("username.changed") + username)

def parseCommand(self, command):
regex = re.search("^/([a-z]*)( ([a-zA-Z0-9\\.]*))?$", command)
Expand Down Expand Up @@ -90,17 +93,21 @@ def parseCommand(self, command):
self.trustManager.setTrust(arg)
elif(command == "fingerprint"):
self.printMessage(self.turing.getMyFingerprint())
elif(command == "language" and (arg == "en" or arg == "fr")):
self.translate.setLanguage(arg)
self.settings.setSetting("language", arg)
self.printMessage(self.translate.tr("language.set"))
elif(command == "help"):
helpText = tr("command.help.text")
helpText = self.translate.tr("command.help.text")
self.printMessage(helpText)
else:
self.printMessage(tr("error.incorrect.command"))
self.printMessage(self.translate.tr("error.incorrect.command"))
else:
if not self.connexion:
self.printMessage(tr("error.not.connected"))
self.printMessage(self.translate.tr("error.not.connected"))
return
if not self.trustManager.connexionTrusted():
self.printMessage(tr("error.connexion.not.trusted"))
self.printMessage(self.translate.tr("error.connexion.not.trusted"))
return
self.printMessage(tr("user.you") + command)
self.printMessage(self.translate.tr("user.you") + command)
self.connexion.send(self.turing.createMessage("message", command))
41 changes: 22 additions & 19 deletions src/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

interface = None
stop = False
msg_list = None


def quit():
Expand All @@ -16,7 +17,7 @@ def quit():


def disc():
global interface
global interface, writeMsgFunc, msg_list
for c in wd.winfo_children():
c.destroy()
msg = StringVar() # pour le message qui sera envoyé
Expand All @@ -27,31 +28,33 @@ def disc():
chp = Entry(wd, width=70, font=(22), bg="#56646A", fg="white", bd=2, relief=SUNKEN, textvariable=msg)
chp.pack(side=BOTTOM, pady=10)

def writeMsg(msg, message=False, username=None):
if username:
interface.otherUsername = username
return writeMsg(tr("username.other.changed") + username)
global stop
if stop:
return
msg_list.config(state=NORMAL)
if message:
username = interface.otherUsername
if(not username):
username = tr("user.other")
msg_list.insert(END, username + " : ")
msg_list.insert(END, msg + "\n")
msg_list.see(END)
msg_list.config(state=DISABLED)

interface = api.Interface(writeMsg, quit)
#interface = api.Interface(writeMsg, quit)
writeMsgFunc = writeMsg

def send(e):
Thread(target=interface.parseCommand, args=[msg.get()]).start()
msg.set("")

chp.bind("<Return>", send) # definir "send" comme envoyer le message

def writeMsg(msg, message=False, username=None):
if username:
interface.otherUsername = username
return writeMsg(tr("username.other.changed") + username)
global stop
if stop:
return
msg_list.config(state=NORMAL)
if message:
username = interface.otherUsername
if(not username):
username = tr("user.other")
msg_list.insert(END, username + " : ")
msg_list.insert(END, msg + "\n")
msg_list.see(END)
msg_list.config(state=DISABLED)

interface = api.Interface(writeMsg, quit)

# creer une fenetre
wd.title(tr("app.title"))
Expand Down
6 changes: 6 additions & 0 deletions src/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ def __init__(self, turing, printMessage, rdyWrite, host='0.0.0.0', port=1234):
self.sock_threads = []
self.sock = None
self.__stop = False
self.stopped = False

def listening(self):
return not not self.sock
Expand Down Expand Up @@ -75,6 +76,8 @@ def close(self):
self.upnp.deleteportmapping(self.port, 'TCP')
except Exception:
self.printMessage(tr("upnp.error.remove"))

self.stopped = True

def run(self):
""" Accept an incoming connection.
Expand All @@ -101,3 +104,6 @@ def run(self):

def stop(self):
self.__stop = True

def isStopped(self):
return self.stopped
54 changes: 35 additions & 19 deletions src/translate.py
Original file line number Diff line number Diff line change
@@ -1,28 +1,44 @@
import yaml
import os

data = {}
class Translate():
def __init__(self, printMessage, language):
self.printMessage = printMessage
self.language = language
self.messages = {}
self.loadTranslations()

def loadMessages(language="fr"):
global data
def loadTranslations(self):
script_dir = os.path.dirname(__file__)
rel_path = "translations/" + self.language + ".yaml"

script_dir = os.path.dirname(__file__)
rel_path = "translations/" + language + ".yaml"
with open(os.path.join(script_dir, rel_path), 'r') as stream:
try:
self.messages = yaml.safe_load(stream)
except yaml.YAMLError as exc:
self.printMessage("error.yaml")

with open(os.path.join(script_dir, rel_path), 'r') as stream:
try:
data = yaml.safe_load(stream)
except yaml.YAMLError as exc:
print(exc)
def getMessage(self, data, keys):
if isinstance(data, str):
return data
key = keys.pop(0)
return self.getMessage(data[key], keys)

def getMessage(data, keys):
if isinstance(data, str):
return data
key = keys.pop(0)
return getMessage(data[key], keys)
def tr(self, message):
keys = message.split(".")
return self.getMessage(self.messages, keys)

def tr(message):
keys = message.split(".")
return getMessage(data, keys)
def setLanguage(self, language):
self.language = language
self.loadTranslations()

translate = None

loadMessages()
def setObject(object):
global translate
translate = object

def tr(message):
if translate:
return translate.tr(message)
return ""
3 changes: 3 additions & 0 deletions src/translations/en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ command:
- /nick <username>: Change username
- /trust <level>: Choose trust level (0: never, 1: once, 2: always)
- /fingerprint: Show the fingerprint of my public key
- /language <en/fr>: Set the language
- message : Send a message
error:
incorrect:
Expand Down Expand Up @@ -77,3 +78,5 @@ trust:
saved:
blacklist: "Blacklist saved"
whitelist: "Trust saved"
language:
set: Language set to English
3 changes: 3 additions & 0 deletions src/translations/fr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ command:
- /nick <username>: Changer le username
- /trust <niveau>: Choisis le niveau de confiance (0: jamais, 1: une fois, 2: toujours)
- /fingerprint: Affiche la fingerprint de ma clé
- /language <fr/en>: Choisir la langue
- message : Envoie un message
error:
incorrect:
Expand Down Expand Up @@ -77,3 +78,5 @@ trust:
saved:
blacklist: "Blacklist enregistré"
whitelist: "Confiance enregistrée"
language:
set: Langue mise à Français

0 comments on commit c264e58

Please sign in to comment.