From 3aad8080f41312200d09d18eab942eefe0204356 Mon Sep 17 00:00:00 2001 From: Hamed Date: Sun, 10 Aug 2025 01:15:53 +0330 Subject: [PATCH] Initial commit: Add main application files and setup scripts --- assets/icon.png | Bin 0 -> 12954 bytes install.bat | 19 ++++++ requirements.txt | 4 ++ run.bat | 11 ++++ src/main.pyw | 147 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 181 insertions(+) create mode 100644 assets/icon.png create mode 100644 install.bat create mode 100644 requirements.txt create mode 100644 run.bat create mode 100644 src/main.pyw diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce4e836a4ea294a685edb2c5d708bcb46a376ba GIT binary patch literal 12954 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 Ha`V3d`dsQk literal 0 HcmV?d00001 diff --git a/install.bat b/install.bat new file mode 100644 index 0000000..44fa3c7 --- /dev/null +++ b/install.bat @@ -0,0 +1,19 @@ +@echo off +REM install.bat +REM This script sets up a Python virtual environment and installs required libraries. +REM Make sure to run this script in the project directory. + +REM Create Python virtual environment +python -m venv venv + +REM Activate the virtual environment +call venv\Scripts\activate.bat + +REM Upgrade pip +pip install --upgrade pip + +REM Install required libraries from requirements.txt +pip install -r requirements.txt --no-cache-dir + +echo Environment setup complete. +pause \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5d88c10 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +keyboard==0.13.5 +pyperclip==1.9.0 +pystray==0.19.5 +Pillow==11.3.0 \ No newline at end of file diff --git a/run.bat b/run.bat new file mode 100644 index 0000000..f159447 --- /dev/null +++ b/run.bat @@ -0,0 +1,11 @@ +@echo off +REM run.bat +REM Activates the virtual environment and runs your main Python script. + +REM Activate the virtual environment +call venv\Scripts\activate.bat + +REM Run your main Python script (replace main.py with your script name if different) +start "OopsWrongLang" /B pythonw src\main.pyw +echo application is running in the background. you can close this window. +pause \ No newline at end of file diff --git a/src/main.pyw b/src/main.pyw new file mode 100644 index 0000000..1f66100 --- /dev/null +++ b/src/main.pyw @@ -0,0 +1,147 @@ +# oopswronglang/main.py +# This script listens for a keyboard shortcut (Ctrl + Space) and converts the text +# from English characters to Persian characters using the `persian` library. +import keyboard +import pyperclip +import time +import threading +import pystray +from PIL import Image +import re + +def convert_en_characters(input_str): + """ + Assumes that characters written with standard persian keyboard + not windows arabic layout + :param input_str: String contains English chars + :return: New string with related characters on Persian standard keyboard + """ + mapping = { + 'q': 'ض', + 'w': 'ص', + 'e': 'ث', + 'r': 'ق', + 't': 'ف', + 'y': 'غ', + 'u': 'ع', + 'i': 'ه', + 'o': 'خ', + 'p': 'ح', + '[': 'ج', + ']': 'چ', + 'a': 'ش', + 's': 'س', + 'd': 'ی', + 'f': 'ب', + 'g': 'ل', + 'h': 'ا', + 'j': 'ت', + 'k': 'ن', + 'l': 'م', + ';': 'ک', + "'": 'گ', + 'z': 'ظ', + 'x': 'ط', + 'c': 'ز', + 'v': 'ر', + 'b': 'ذ', + 'n': 'د', + 'm': 'ئ', + ',': 'و', + '?': '؟', + '\\':'پ', + 'ض': 'q', + 'ص': 'w', + 'ث': 'e', + 'ق': 'r', + 'ف': 't', + 'غ': 'y', + 'ع': 'u', + 'ه': 'i', + 'خ': 'o', + 'ح': 'p', + 'ج': '[', + 'چ': ']', + 'ش': 'a', + 'س': 's', + 'ی': 'd', + 'ب': 'f', + 'ل': 'g', + 'ا': 'h', + 'ت': 'j', + 'ن': 'k', + 'م': 'l', + 'ک': ';', + 'گ': "'", + 'ظ': 'z', + 'ط': 'x', + 'ز': 'c', + 'ر': 'v', + 'ذ': 'b', + 'د': 'n', + 'ئ': 'm', + 'و': ',', + '؟': '?', + 'پ': '\\', + 'H':'آ', + 'آ': 'H', + 'C':'ژ', + 'ژ': 'C', + 'T':'،', + '،': 'T', + '؛':'Y', + 'Y':'؛', + } + return _multiple_replace(mapping, input_str) +def _multiple_replace(mapping, text): + """ + Internal function for replace all mapping keys for a input string + :param mapping: replacing mapping keys + :param text: user input string + :return: New string with converted mapping keys to values + """ + pattern = "|".join(map(re.escape, mapping.keys())) + return re.sub(pattern, lambda m: mapping[m.group()], str(text)) + +# Function to handle the keyboard shortcut +def on_shortcut(): + """This function is called when the shortcut is pressed.""" + orginal_text = pyperclip.paste() # Get the current clipboard content + time.sleep(0.1) + keyboard.press_and_release('ctrl+c') # Simulate pressing Ctrl+C to copy selected text + time.sleep(0.1) + text = pyperclip.paste() + # If no text is selected, do nothing + if not text or text== orginal_text: + print("No text was selected.") + return + converted_text = convert_en_characters(text) + pyperclip.copy(converted_text) + print(f"Converted text: {converted_text}") + keyboard.press_and_release('ctrl+v') # Paste the converted text + +def quit_app(icon, item): + icon.stop() + import os + os._exit(0) + +def setup_tray(): + image = Image.open("assets/icon.png") # Make sure icon.png exists in your project folder + menu = pystray.Menu(pystray.MenuItem('Quit', quit_app)) + icon = pystray.Icon("oopswronglang", image, "OopsWrongLang", menu) + icon.run() + +def main(): + # Start the tray icon in a separate thread + tray_thread = threading.Thread(target=setup_tray, daemon=True) + tray_thread.start() + + # Register the keyboard shortcut (Ctrl + Space) + keyboard.add_hotkey('ctrl+space', on_shortcut) + print("Press Ctrl + Space to convert text to Persian.") + + # Keep the script running + keyboard.wait() + +if __name__ == "__main__": + main()