From 7ca2cd4e6e4c166a7d67bd753744c42536bc3ca0 Mon Sep 17 00:00:00 2001 From: Abdallah Ahmed Date: Fri, 18 Dec 2020 12:40:00 +0200 Subject: [PATCH 1/4] Switch to English --- __main__.py | 11 +++++++++++ minesweeper/auth/Auth.py | 29 +++++++++++++++++++-------- minesweeper/game/GameSession.py | 13 ++++++++---- minesweeper/game/LoginScreen.py | 30 ++++++++++++++++++++-------- minesweeper/game/Screens.py | 35 +++++++++++++++++++++++---------- settings.py | 1 + 6 files changed, 89 insertions(+), 30 deletions(-) create mode 100644 __main__.py create mode 100644 settings.py diff --git a/__main__.py b/__main__.py new file mode 100644 index 0000000..5e66c3a --- /dev/null +++ b/__main__.py @@ -0,0 +1,11 @@ +import tkinter as tk +from minesweeper.game.Game import Game + +if __name__ == '__main__': + window = tk.Tk() + window.title("Сапер") + window.geometry('600x400+400+200') + + Game(window) + + window.mainloop() diff --git a/minesweeper/auth/Auth.py b/minesweeper/auth/Auth.py index 4d77a79..89eee31 100644 --- a/minesweeper/auth/Auth.py +++ b/minesweeper/auth/Auth.py @@ -2,7 +2,7 @@ from tkinter import messagebox import pickle import os - +import settings class Auth: def __init__(self): @@ -33,7 +33,10 @@ def sign_in(self, login, password): if password == 'admin': return 'admin' else: - return 'Невірний пароль admin-а' + if settings.language.lower() == 'english': + return 'Invalid admin password' + elif settings.language.lower() == 'russian': + return 'Невірний пароль admin-а' user = next((user for user in self.users if user.login == login), None) @@ -43,13 +46,23 @@ def sign_in(self, login, password): self.current_user = user return self.current_user else: - return 'Невірний пароль' + if settings.language.lower() == 'english': + return 'Invalid password' + elif settings.language.lower() == 'russian': + return 'Невірний пароль' else: - if messagebox.askyesno('Авторизація', 'Створити нового гравця: {}, з паролем: {}?'.format(login, password)): - self.current_user = self.__new_user(login, password) - return self.current_user - else: - return None + if settings.language.lower() == 'english': + if messagebox.askyesno('Authorization', 'Create a new player: {}, with password: {}?'.format(login, password)): + self.current_user = self.__new_user(login, password) + return self.current_user + else: + return None + elif settings.language.lower() == 'russian': + if messagebox.askyesno('Авторизація', 'Створити нового гравця: {}, з паролем: {}?'.format(login, password)): + self.current_user = self.__new_user(login, password) + return self.current_user + else: + return None def sign_out(self): self.current_user = None diff --git a/minesweeper/game/GameSession.py b/minesweeper/game/GameSession.py index d55a12c..7c4e2c9 100644 --- a/minesweeper/game/GameSession.py +++ b/minesweeper/game/GameSession.py @@ -5,12 +5,17 @@ from enum import Enum import time from tkinter import messagebox - +import settings class DifficultyLevel(Enum): - EASY = 'Новачок' - MEDIUM = 'Любитель' - HARD = 'Професіонал' + if settings.language.lower() == 'english': + EASY = 'Easy' + MEDIUM = 'Medium' + HARD = 'Hard' + elif settings.language.lower() == 'russian': + EASY = 'Новачок' + MEDIUM = 'Любитель' + HARD = 'Професіонал' class GameSession: diff --git a/minesweeper/game/LoginScreen.py b/minesweeper/game/LoginScreen.py index 4a4c3ba..ff44301 100644 --- a/minesweeper/game/LoginScreen.py +++ b/minesweeper/game/LoginScreen.py @@ -2,7 +2,7 @@ from tkinter import messagebox from minesweeper.auth.User import User from minesweeper.game.AdminScreen import AdminScreen - +import settings class LoginScreen: def __init__(self, root, auth, on_logged): @@ -22,22 +22,30 @@ def __setup(self): self.master = tk.Frame(self.root) self.master.pack(expand=True) - lbl = tk.Label(self.master, text='Хто ти?') + if settings.language.lower() == 'english': + lbl = tk.Label(self.master, text='Who are you?') + lbl_login = tk.Label(self.master, text='Login: ') + lbl_password = tk.Label(self.master, text='Password:') + btn_login = tk.Button(self.master, text='Login / Register', command=self.__on_login_tap) + elif settings.language.lower() == 'russian': + lbl = tk.Label(self.master, text='Хто ти?') + lbl_login = tk.Label(self.master, text='Логін: ') + lbl_password = tk.Label(self.master, text='Пароль:') + btn_login = tk.Button(self.master, text='Увійти / Зареєструватися', command=self.__on_login_tap) + + lbl.grid(row=0, columnspan=2) - lbl_login = tk.Label(self.master, text='Логін: ') self.ent_login = tk.Entry(self.master, width=20) lbl_login.grid(row=1, column=0, sticky='e') self.ent_login.grid(row=1, column=1) - lbl_password = tk.Label(self.master, text='Пароль:') self.ent_password = tk.Entry(self.master, width=20, show='*') lbl_password.grid(row=2, column=0, sticky='e') self.ent_password.grid(row=2, column=1) - btn_login = tk.Button(self.master, text='Увійти / Зареєструватися', command=self.__on_login_tap) btn_login.grid(row=3, column=0, columnspan=2, sticky='ew') - + self.frm_hint = tk.Frame(self.root) self.frm_hint.pack(fill=tk.BOTH) lbl_admin = tk.Label(self.frm_hint, text='admin - admin', fg='gray') @@ -48,7 +56,10 @@ def __on_login_tap(self): password = self.ent_password.get() if login == '' or password == '': - messagebox.showerror('Авторизація', 'Поля не можуть бути порожніми') + if settings.language.lower() == 'english': + messagebox.showerror('Authorization', 'Fields cannot be empty') + elif settings.language.lower() == 'russian': + messagebox.showerror('Авторизація', 'Поля не можуть бути порожніми') return res = self.auth.sign_in(login, password) @@ -57,7 +68,10 @@ def __on_login_tap(self): elif res == 'admin': self.__on_admin() elif isinstance(res, str): - messagebox.showerror('Авторизація', res) + if settings.language.lower() == 'english': + messagebox.showerror('Authorization', res) + elif settings.language.lower() == 'russian': + messagebox.showerror('Авторизація', res) def __on_admin(self): self.master.destroy() diff --git a/minesweeper/game/Screens.py b/minesweeper/game/Screens.py index d90a819..ff30651 100644 --- a/minesweeper/game/Screens.py +++ b/minesweeper/game/Screens.py @@ -2,7 +2,7 @@ import tkinter as tk from minesweeper.game.GameSession import DifficultyLevel - +import settings class Screens: @staticmethod @@ -10,18 +10,33 @@ def home_scr(master, on_new_game, on_continue, on_leaderboard, on_exit): def button(text, command): return tk.Button(master, text=text, command=command, width=20) - btn_new = button(text='Нова гра', command=on_new_game) - btn_new.pack() + if settings.language.lower() == 'english': + btn_new = button(text='New game', command=on_new_game) + btn_new.pack() + + if on_continue is not None: + btn_con = button(text='Continue', command=on_continue) + btn_con.pack() + + btn_lea = button(text='Table of results', command=on_leaderboard) + btn_lea.pack() + + btn_exi = button(text='Entrance', command=on_exit) + btn_exi.pack() + + elif settings.language.lower() == 'russian': + btn_new = button(text='Нова гра', command=on_new_game) + btn_new.pack() - if on_continue is not None: - btn_con = button(text='Продовижити', command=on_continue) - btn_con.pack() + if on_continue is not None: + btn_con = button(text='Продовижити', command=on_continue) + btn_con.pack() - btn_lea = button(text='Таблиця результатів', command=on_leaderboard) - btn_lea.pack() + btn_lea = button(text='Таблиця результатів', command=on_leaderboard) + btn_lea.pack() - btn_exi = button(text='Вихід', command=on_exit) - btn_exi.pack() + btn_exi = button(text='Вихід', command=on_exit) + btn_exi.pack() master.pack(fill=tk.NONE, expand=True) diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..9db42ce --- /dev/null +++ b/settings.py @@ -0,0 +1 @@ +language="English" # Or "Russian" \ No newline at end of file From 87dcd8f6ce115fb249946b3f3e8a69ff3d8fc70b Mon Sep 17 00:00:00 2001 From: Abdallah Ahmed Date: Fri, 18 Dec 2020 15:47:04 +0200 Subject: [PATCH 2/4] Adds support for English Language Adding English will boost the repo contributions since all users who cannot speak Ukranian will be able to find more bugs as well as ebnhance the game --- minesweeper/game/GameSession.py | 41 ++++++++++++++++++++++++++------- minesweeper/game/Leaderboard.py | 12 +++++++--- 2 files changed, 42 insertions(+), 11 deletions(-) diff --git a/minesweeper/game/GameSession.py b/minesweeper/game/GameSession.py index 7c4e2c9..50a400a 100644 --- a/minesweeper/game/GameSession.py +++ b/minesweeper/game/GameSession.py @@ -75,7 +75,10 @@ def start(self, master, on_end, on_stop): def __menu_widget(self): def update_time(): - string = time.strftime('Час: %M:%S', time.gmtime(self.seconds_elapsed)) + if settings.language.lower() == 'english': + string = time.strftime('Time: %M:%S', time.gmtime(self.seconds_elapsed)) + elif settings.language.lower() == 'russian': + string = time.strftime('Час: %M:%S', time.gmtime(self.seconds_elapsed)) lbl_time.configure(text=string) if self.is_playing: self.seconds_elapsed += 1 @@ -84,7 +87,11 @@ def update_time(): frm = tk.Frame(self.master) frm.pack(side=tk.LEFT, fill=tk.Y, pady=2, padx=2) - btn_exit = tk.Button(frm, text='Вихід', command=self.__on_exit, width=15) + if settings.language.lower() == 'english': + btn_exit = tk.Button(frm, text='Entrance', command=self.__on_exit, width=15) + elif settings.language.lower() == 'russian': + btn_exit = tk.Button(frm, text='Вихід', command=self.__on_exit, width=15) + btn_exit.pack() tk.Frame(frm, height=15).pack() @@ -93,7 +100,10 @@ def update_time(): lbl_time.pack(fill=tk.X) update_time() - lbl_num_mines = tk.Label(frm, text='Мін: {}'.format(self.num_mines), anchor=tk.W) + if settings.language.lower() == 'english': + lbl_num_mines = tk.Label(frm, text='Min: {}'.format(self.num_mines), anchor=tk.W) + elif settings.language.lower() == 'russian': + lbl_num_mines = tk.Label(frm, text='Мін: {}'.format(self.num_mines), anchor=tk.W) lbl_num_mines.pack(fill=tk.X) self.lbl_flags = tk.Label(frm, anchor=tk.W) @@ -101,7 +111,10 @@ def update_time(): self.__update_flags() def __update_flags(self): - self.lbl_flags.configure(text='Залишилося флагів: {}'.format(self.flags_left)) + if settings.language.lower() == 'english': + self.lbl_flags.configure(text='Remaining flags: {}'.format(self.flags_left)) + elif settings.language.lower() == 'russian': + self.lbl_flags.configure(text='Залишилося флагів: {}'.format(self.flags_left)) def __board_widget(self): frm_board = tk.Frame(self.master) @@ -243,7 +256,10 @@ def __end_on_mine(self): tile.wrong_flag() def f(): - self.__display_message('ПРОГРАШ') + if settings.language.lower() == 'english': + self.__display_message('LOSS') + elif settings.language.lower() == 'russian': + self.__display_message('ПРОГРАШ') self.on_end(self.difficulty, False, time.gmtime(self.seconds_elapsed)) self.master.after(200, f) @@ -256,15 +272,24 @@ def __end_on_success(self): tile.open(is_safe=True) def f(): - self.__display_message('ПЕРЕМОГА') + if settings.language.lower() == 'english': + self.__display_message('VICTORY') + elif settings.language.lower() == 'russian': + self.__display_message('ПЕРЕМОГА') self.on_end(self.difficulty, True, time.gmtime(self.seconds_elapsed)) self.master.after(200, f) def __display_message(self, text): gmt = time.gmtime(self.seconds_elapsed) time_string = time.strftime('%M:%S', gmt) - messagebox.showinfo('Сапер', '{}\nЧас: {}'.format(text, time_string)) + if settings.language.lower() == 'english': + messagebox.showinfo('Сапер', '{}\nTime: {}'.format(text, time_string)) + elif settings.language.lower() == 'russian': + messagebox.showinfo('Сапер', '{}\nЧас: {}'.format(text, time_string)) def __on_exit(self): - is_save = messagebox.askyesno("Сапер", "Зберегти гру?") + if settings.language.lower() == 'english': + is_save = messagebox.askyesno("Сапер", "Save game?") + elif settings.language.lower() == 'russian': + is_save = messagebox.askyesno("Сапер", "Зберегти гру?") self.on_stop(is_save) diff --git a/minesweeper/game/Leaderboard.py b/minesweeper/game/Leaderboard.py index d5786db..5d0ce71 100644 --- a/minesweeper/game/Leaderboard.py +++ b/minesweeper/game/Leaderboard.py @@ -1,7 +1,7 @@ import tkinter as tk from tkinter import ttk import time - +import settings class Leaderboard: def __init__(self, master, auth, on_back): @@ -25,7 +25,10 @@ def __setup(self, on_back): frm_left = tk.Frame(self.master) frm_left.pack(side=tk.LEFT, fill=tk.Y) - btn_back = tk.Button(frm_left, text='Назад', command=on_back, width=15) + if settings.language.lower() == 'english': + btn_back = tk.Button(frm_left, text='Back', command=on_back, width=15) + if settings.language.lower() == 'russian': + btn_back = tk.Button(frm_left, text='Назад', command=on_back, width=15) btn_back.grid(column=0, row=0, padx=2, pady=2) options = [self.ALL] + list(self.user_logins) @@ -50,7 +53,10 @@ def __on_update_list(self, event=None): for result in results: u = result[0] r = result[1] - win = 'ВИГРАВ' if r.is_win else 'ПРОГРАВ' + if settings.language.lower() == 'english': + win = 'WIN' if r.is_win else 'LOSS' + if settings.language.lower() == 'russian': + win = 'ВИГРАВ' if r.is_win else 'ПРОГРАВ' t_string = time.strftime('%M:%S', r.time_elapsed) string = ' {}, {}, {}, {} '.format(u.login, win, r.difficulty.value, t_string) self.lstb_results.insert(tk.END, string) From bbc08a1d94dd62423872876e759b663d0e187484 Mon Sep 17 00:00:00 2001 From: Abdallah Ahmed Date: Fri, 18 Dec 2020 15:51:08 +0200 Subject: [PATCH 3/4] __main__.py was created here as per PR#3, it's removed from this branch --- __main__.py | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 __main__.py diff --git a/__main__.py b/__main__.py deleted file mode 100644 index 5e66c3a..0000000 --- a/__main__.py +++ /dev/null @@ -1,11 +0,0 @@ -import tkinter as tk -from minesweeper.game.Game import Game - -if __name__ == '__main__': - window = tk.Tk() - window.title("Сапер") - window.geometry('600x400+400+200') - - Game(window) - - window.mainloop() From 6f4717b50b6e31f01f43a4b1674cccbf2771bbee Mon Sep 17 00:00:00 2001 From: Abdallah Ahmed Date: Sat, 19 Dec 2020 12:56:48 +0200 Subject: [PATCH 4/4] Made using simplified way --- minesweeper/auth/Auth.py | 29 ++++++------------- minesweeper/game/GameSession.py | 48 +++++++++---------------------- minesweeper/game/Leaderboard.py | 14 ++++----- minesweeper/game/LoginScreen.py | 29 +++++++------------ minesweeper/game/Screens.py | 35 +++++++--------------- minesweeper/languages/__init__.py | 0 minesweeper/languages/en.py | 48 +++++++++++++++++++++++++++++++ minesweeper/languages/language.py | 17 +++++++++++ minesweeper/languages/ur.py | 48 +++++++++++++++++++++++++++++++ settings.py | 2 +- 10 files changed, 164 insertions(+), 106 deletions(-) create mode 100644 minesweeper/languages/__init__.py create mode 100644 minesweeper/languages/en.py create mode 100644 minesweeper/languages/language.py create mode 100644 minesweeper/languages/ur.py diff --git a/minesweeper/auth/Auth.py b/minesweeper/auth/Auth.py index 89eee31..0027c01 100644 --- a/minesweeper/auth/Auth.py +++ b/minesweeper/auth/Auth.py @@ -3,6 +3,7 @@ import pickle import os import settings +from minesweeper.languages.language import text_messages class Auth: def __init__(self): @@ -11,6 +12,7 @@ def __init__(self): self.current_user = None self.users = [] + self.text_messages = text_messages try: with open(self.__path, 'rb') as f: self.users = pickle.load(f) @@ -33,10 +35,7 @@ def sign_in(self, login, password): if password == 'admin': return 'admin' else: - if settings.language.lower() == 'english': - return 'Invalid admin password' - elif settings.language.lower() == 'russian': - return 'Невірний пароль admin-а' + return self.text_messages[settings.language.lower()].auth.sign_in.invalid_admin_password user = next((user for user in self.users if user.login == login), None) @@ -46,23 +45,13 @@ def sign_in(self, login, password): self.current_user = user return self.current_user else: - if settings.language.lower() == 'english': - return 'Invalid password' - elif settings.language.lower() == 'russian': - return 'Невірний пароль' + return self.text_messages[settings.language.lower()].auth.sign_in.invalid_password else: - if settings.language.lower() == 'english': - if messagebox.askyesno('Authorization', 'Create a new player: {}, with password: {}?'.format(login, password)): - self.current_user = self.__new_user(login, password) - return self.current_user - else: - return None - elif settings.language.lower() == 'russian': - if messagebox.askyesno('Авторизація', 'Створити нового гравця: {}, з паролем: {}?'.format(login, password)): - self.current_user = self.__new_user(login, password) - return self.current_user - else: - return None + if messagebox.askyesno(self.text_messages[settings.language.lower()].auth.sign_in.authorization, '{}{}{}{}?'.format(self.text_messages[settings.language.lower()].auth.sign_in.create_new_player, login, self.text_messages[settings.language.lower()].auth.sign_in.with_password, password)): + self.current_user = self.__new_user(login, password) + return self.current_user + else: + return None def sign_out(self): self.current_user = None diff --git a/minesweeper/game/GameSession.py b/minesweeper/game/GameSession.py index 50a400a..1e6d02e 100644 --- a/minesweeper/game/GameSession.py +++ b/minesweeper/game/GameSession.py @@ -6,13 +6,15 @@ import time from tkinter import messagebox import settings +from minesweeper.languages.language import text_messages + class DifficultyLevel(Enum): - if settings.language.lower() == 'english': + if settings.language.lower() == 'en': EASY = 'Easy' MEDIUM = 'Medium' HARD = 'Hard' - elif settings.language.lower() == 'russian': + elif settings.language.lower() == 'ur': EASY = 'Новачок' MEDIUM = 'Любитель' HARD = 'Професіонал' @@ -22,6 +24,8 @@ class GameSession: def __init__(self, difficulty): self.difficulty = difficulty + self.text_messages = text_messages + if difficulty is DifficultyLevel.EASY: self.num_rows = 9 self.num_cols = 9 @@ -75,10 +79,7 @@ def start(self, master, on_end, on_stop): def __menu_widget(self): def update_time(): - if settings.language.lower() == 'english': - string = time.strftime('Time: %M:%S', time.gmtime(self.seconds_elapsed)) - elif settings.language.lower() == 'russian': - string = time.strftime('Час: %M:%S', time.gmtime(self.seconds_elapsed)) + string = time.strftime(self.text_messages[settings.language.lower()].update_time.time + ': %M:%S', time.gmtime(self.seconds_elapsed)) lbl_time.configure(text=string) if self.is_playing: self.seconds_elapsed += 1 @@ -87,10 +88,7 @@ def update_time(): frm = tk.Frame(self.master) frm.pack(side=tk.LEFT, fill=tk.Y, pady=2, padx=2) - if settings.language.lower() == 'english': - btn_exit = tk.Button(frm, text='Entrance', command=self.__on_exit, width=15) - elif settings.language.lower() == 'russian': - btn_exit = tk.Button(frm, text='Вихід', command=self.__on_exit, width=15) + btn_exit = tk.Button(frm, text=self.text_messages[settings.language.lower()].menu_widget.entrance, command=self.__on_exit, width=15) btn_exit.pack() @@ -100,10 +98,7 @@ def update_time(): lbl_time.pack(fill=tk.X) update_time() - if settings.language.lower() == 'english': - lbl_num_mines = tk.Label(frm, text='Min: {}'.format(self.num_mines), anchor=tk.W) - elif settings.language.lower() == 'russian': - lbl_num_mines = tk.Label(frm, text='Мін: {}'.format(self.num_mines), anchor=tk.W) + lbl_num_mines = tk.Label(frm, text= '{} :{}'.format(self.text_messages[settings.language.lower()].menu_widget.mine,self.num_mines), anchor=tk.W) lbl_num_mines.pack(fill=tk.X) self.lbl_flags = tk.Label(frm, anchor=tk.W) @@ -111,10 +106,7 @@ def update_time(): self.__update_flags() def __update_flags(self): - if settings.language.lower() == 'english': - self.lbl_flags.configure(text='Remaining flags: {}'.format(self.flags_left)) - elif settings.language.lower() == 'russian': - self.lbl_flags.configure(text='Залишилося флагів: {}'.format(self.flags_left)) + self.lbl_flags.configure(text='{}: {}'.format(self.text_messages[settings.language.lower()].update_flags, self.flags_left)) def __board_widget(self): frm_board = tk.Frame(self.master) @@ -256,10 +248,7 @@ def __end_on_mine(self): tile.wrong_flag() def f(): - if settings.language.lower() == 'english': - self.__display_message('LOSS') - elif settings.language.lower() == 'russian': - self.__display_message('ПРОГРАШ') + self.__display_message(self.text_messages[settings.language.lower()].end_on_mine) self.on_end(self.difficulty, False, time.gmtime(self.seconds_elapsed)) self.master.after(200, f) @@ -272,24 +261,15 @@ def __end_on_success(self): tile.open(is_safe=True) def f(): - if settings.language.lower() == 'english': - self.__display_message('VICTORY') - elif settings.language.lower() == 'russian': - self.__display_message('ПЕРЕМОГА') + self.__display_message(self.text_messages[settings.language.lower()].end_on_success) self.on_end(self.difficulty, True, time.gmtime(self.seconds_elapsed)) self.master.after(200, f) def __display_message(self, text): gmt = time.gmtime(self.seconds_elapsed) time_string = time.strftime('%M:%S', gmt) - if settings.language.lower() == 'english': - messagebox.showinfo('Сапер', '{}\nTime: {}'.format(text, time_string)) - elif settings.language.lower() == 'russian': - messagebox.showinfo('Сапер', '{}\nЧас: {}'.format(text, time_string)) + messagebox.showinfo('Сапер', '{}\n{}: {}'.format(text, self.text_messages[settings.language.lower()].update_time.time, time_string)) def __on_exit(self): - if settings.language.lower() == 'english': - is_save = messagebox.askyesno("Сапер", "Save game?") - elif settings.language.lower() == 'russian': - is_save = messagebox.askyesno("Сапер", "Зберегти гру?") + is_save = messagebox.askyesno("Сапер", self.text_messages[settings.language.lower()].on_exit) self.on_stop(is_save) diff --git a/minesweeper/game/Leaderboard.py b/minesweeper/game/Leaderboard.py index 5d0ce71..96776d5 100644 --- a/minesweeper/game/Leaderboard.py +++ b/minesweeper/game/Leaderboard.py @@ -2,6 +2,7 @@ from tkinter import ttk import time import settings +from minesweeper.languages.language import text_messages class Leaderboard: def __init__(self, master, auth, on_back): @@ -17,6 +18,8 @@ def __init__(self, master, auth, on_back): self.cmbb_user = None self.lstb_results = None + self.text_messages = text_messages + self.__setup(on_back) def __setup(self, on_back): @@ -25,10 +28,8 @@ def __setup(self, on_back): frm_left = tk.Frame(self.master) frm_left.pack(side=tk.LEFT, fill=tk.Y) - if settings.language.lower() == 'english': - btn_back = tk.Button(frm_left, text='Back', command=on_back, width=15) - if settings.language.lower() == 'russian': - btn_back = tk.Button(frm_left, text='Назад', command=on_back, width=15) + + btn_back = tk.Button(frm_left, text=self.text_messages[settings.language.lower()].leader_board.back, command=on_back, width=15) btn_back.grid(column=0, row=0, padx=2, pady=2) options = [self.ALL] + list(self.user_logins) @@ -53,10 +54,7 @@ def __on_update_list(self, event=None): for result in results: u = result[0] r = result[1] - if settings.language.lower() == 'english': - win = 'WIN' if r.is_win else 'LOSS' - if settings.language.lower() == 'russian': - win = 'ВИГРАВ' if r.is_win else 'ПРОГРАВ' + win = self.text_messages[settings.language.lower()].leader_board.win if r.is_win else self.text_messages[settings.language.lower()].leader_board.loss t_string = time.strftime('%M:%S', r.time_elapsed) string = ' {}, {}, {}, {} '.format(u.login, win, r.difficulty.value, t_string) self.lstb_results.insert(tk.END, string) diff --git a/minesweeper/game/LoginScreen.py b/minesweeper/game/LoginScreen.py index ff44301..08314d8 100644 --- a/minesweeper/game/LoginScreen.py +++ b/minesweeper/game/LoginScreen.py @@ -3,6 +3,7 @@ from minesweeper.auth.User import User from minesweeper.game.AdminScreen import AdminScreen import settings +from minesweeper.languages.language import text_messages class LoginScreen: def __init__(self, root, auth, on_logged): @@ -16,22 +17,18 @@ def __init__(self, root, auth, on_logged): self.ent_login = None self.ent_password = None + self.text_messages = text_messages + self.__setup() def __setup(self): self.master = tk.Frame(self.root) self.master.pack(expand=True) - if settings.language.lower() == 'english': - lbl = tk.Label(self.master, text='Who are you?') - lbl_login = tk.Label(self.master, text='Login: ') - lbl_password = tk.Label(self.master, text='Password:') - btn_login = tk.Button(self.master, text='Login / Register', command=self.__on_login_tap) - elif settings.language.lower() == 'russian': - lbl = tk.Label(self.master, text='Хто ти?') - lbl_login = tk.Label(self.master, text='Логін: ') - lbl_password = tk.Label(self.master, text='Пароль:') - btn_login = tk.Button(self.master, text='Увійти / Зареєструватися', command=self.__on_login_tap) + lbl = tk.Label(self.master, text=self.text_messages[settings.language.lower()].login_screen.setup.who_are_you) + lbl_login = tk.Label(self.master, text=self.text_messages[settings.language.lower()].login_screen.setup.login) + lbl_password = tk.Label(self.master, text=self.text_messages[settings.language.lower()].login_screen.setup.password) + btn_login = tk.Button(self.master, text=self.text_messages[settings.language.lower()].login_screen.setup.login_register, command=self.__on_login_tap) lbl.grid(row=0, columnspan=2) @@ -55,11 +52,8 @@ def __on_login_tap(self): login = self.ent_login.get() password = self.ent_password.get() - if login == '' or password == '': - if settings.language.lower() == 'english': - messagebox.showerror('Authorization', 'Fields cannot be empty') - elif settings.language.lower() == 'russian': - messagebox.showerror('Авторизація', 'Поля не можуть бути порожніми') + if login == '' or password == '': + messagebox.showerror(self.text_messages[settings.language.lower()].login_screen.on_login_tap.authorization, self.text_messages[settings.language.lower()].on_login_tap.empty_fields) return res = self.auth.sign_in(login, password) @@ -68,10 +62,7 @@ def __on_login_tap(self): elif res == 'admin': self.__on_admin() elif isinstance(res, str): - if settings.language.lower() == 'english': - messagebox.showerror('Authorization', res) - elif settings.language.lower() == 'russian': - messagebox.showerror('Авторизація', res) + messagebox.showerror(self.text_messages[settings.language.lower()].login_screen.on_login_tap.authorization, res) def __on_admin(self): self.master.destroy() diff --git a/minesweeper/game/Screens.py b/minesweeper/game/Screens.py index ff30651..427a3a8 100644 --- a/minesweeper/game/Screens.py +++ b/minesweeper/game/Screens.py @@ -3,6 +3,8 @@ from minesweeper.game.GameSession import DifficultyLevel import settings +from minesweeper.languages.language import text_messages + class Screens: @staticmethod @@ -10,33 +12,18 @@ def home_scr(master, on_new_game, on_continue, on_leaderboard, on_exit): def button(text, command): return tk.Button(master, text=text, command=command, width=20) - if settings.language.lower() == 'english': - btn_new = button(text='New game', command=on_new_game) - btn_new.pack() - - if on_continue is not None: - btn_con = button(text='Continue', command=on_continue) - btn_con.pack() - - btn_lea = button(text='Table of results', command=on_leaderboard) - btn_lea.pack() - - btn_exi = button(text='Entrance', command=on_exit) - btn_exi.pack() - - elif settings.language.lower() == 'russian': - btn_new = button(text='Нова гра', command=on_new_game) - btn_new.pack() + btn_new = button(text=text_messages[settings.language.lower()].home_scr.new_game, command=on_new_game) + btn_new.pack() - if on_continue is not None: - btn_con = button(text='Продовижити', command=on_continue) - btn_con.pack() + if on_continue is not None: + btn_con = button(text=text_messages[settings.language.lower()].home_scr.continue_btn, command=on_continue) + btn_con.pack() - btn_lea = button(text='Таблиця результатів', command=on_leaderboard) - btn_lea.pack() + btn_lea = button(text=text_messages[settings.language.lower()].home_scr.table_of_result, command=on_leaderboard) + btn_lea.pack() - btn_exi = button(text='Вихід', command=on_exit) - btn_exi.pack() + btn_exi = button(text=text_messages[settings.language.lower()].home_scr.entrance, command=on_exit) + btn_exi.pack() master.pack(fill=tk.NONE, expand=True) diff --git a/minesweeper/languages/__init__.py b/minesweeper/languages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/minesweeper/languages/en.py b/minesweeper/languages/en.py new file mode 100644 index 0000000..54f1785 --- /dev/null +++ b/minesweeper/languages/en.py @@ -0,0 +1,48 @@ +en = { + 'update_time': { + 'time': 'Time' + }, + 'menu_widget': { + 'entrance': 'Entrance', + 'mine': 'Min' + }, + 'update_flags': 'Remaining flags', + 'end_on_mine': 'LOSS', + 'end_on_success': 'VICTORY', + 'on_exit': 'Save game?', + + 'leader_board': { + 'back': 'Back', + 'win': 'WIN', + 'loss': 'LOSS' + }, + 'login_screen': { + 'setup': { + 'who_are_you': 'Who are you?', + 'login': 'Login: ', + 'password': 'Password: ', + 'login_register': 'Login / Register' + }, + 'on_login_tap': { + 'authorization': 'Authorization', + 'empty_fields': 'Fields cannot be empty' + } + }, + + 'home_scr': { + 'new_game': 'New game', + 'continue_btn': 'Continue', + 'table_of_result': 'Table of results', + 'entrance': 'Entrance' + }, + + 'auth': { + 'sign_in': { + 'invalid_admin_password': 'Invalid admin password', + 'invalid_password': 'Invalid password', + 'authorization': 'Authorization', + 'create_new_player': 'Create a new player: ', + 'with_password': ', with password: ' + } + } +} \ No newline at end of file diff --git a/minesweeper/languages/language.py b/minesweeper/languages/language.py new file mode 100644 index 0000000..63d9b97 --- /dev/null +++ b/minesweeper/languages/language.py @@ -0,0 +1,17 @@ +from types import SimpleNamespace +from minesweeper.languages.ur import ur +from minesweeper.languages.en import en + +class NestedNamespace(SimpleNamespace): + def __init__(self, dictionary, **kwargs): + super().__init__(**kwargs) + for key, value in dictionary.items(): + if isinstance(value, dict): + self.__setattr__(key, NestedNamespace(value)) + else: + self.__setattr__(key, value) + +global text_messages +text_messages = {} +text_messages.update({"ur": NestedNamespace(ur)}) +text_messages.update({"en": NestedNamespace(en)}) \ No newline at end of file diff --git a/minesweeper/languages/ur.py b/minesweeper/languages/ur.py new file mode 100644 index 0000000..6075841 --- /dev/null +++ b/minesweeper/languages/ur.py @@ -0,0 +1,48 @@ +ur = { + 'update_time': { + 'time': 'Час' + }, + 'menu_widget': { + 'entrance': 'Вихід', + 'mine': 'Мін' + }, + 'update_flags': 'Залишилося флагів', + 'end_on_mine': 'ПРОГРАШ', + 'end_on_success': 'ПЕРЕМОГА', + 'on_exit': 'Зберегти гру?', + + 'leader_board': { + 'back': 'Назад', + 'win': 'ВИГРАВ', + 'loss': 'ПРОГРАВ' + }, + 'login_screen': { + 'setup': { + 'who_are_you': 'Хто ти?', + 'login': 'Логін: ', + 'password': 'Пароль: ', + 'login_register': 'Увійти / Зареєструватися' + }, + 'on_login_tap': { + 'authorization': 'Авторизація', + 'empty_fields': 'Поля не можуть бути порожніми' + } + }, + + 'home_scr': { + 'new_game': 'Нова гра', + 'continue_btn': 'Продовижити', + 'table_of_result': 'Таблиця результатів', + 'entrance': 'Вихід' + }, + + 'auth': { + 'sign_in': { + 'invalid_admin_password': 'Невірний пароль admin-а', + 'invalid_password': 'Невірний пароль', + 'authorization': 'Авторизація', + 'create_new_player': 'Створити нового гравця: ', + 'with_password': ', з паролем: ' + } + } +} \ No newline at end of file diff --git a/settings.py b/settings.py index 9db42ce..0525cf7 100644 --- a/settings.py +++ b/settings.py @@ -1 +1 @@ -language="English" # Or "Russian" \ No newline at end of file +language="en" \ No newline at end of file