diff --git a/gui/config_tab.py b/gui/config_tab.py index 67138ad..6f06bb4 100644 --- a/gui/config_tab.py +++ b/gui/config_tab.py @@ -453,11 +453,11 @@ class ConfigTab(QWidget): if self.env_file_path.exists(): load_dotenv(self.env_file_path) - # Load API settings - self.api_url_edit.setText(os.getenv("api", "")) - self.api_key_edit.setText(os.getenv("key", "")) - self.organization_edit.setText(os.getenv("organization", "")) - self.model_combo.setCurrentText(os.getenv("model", "gpt-4.1")) + # Load API settings (trim whitespace to avoid accidental trailing spaces) + self.api_url_edit.setText(os.getenv("api", "").strip()) + self.api_key_edit.setText(os.getenv("key", "").strip()) + self.organization_edit.setText(os.getenv("organization", "").strip()) + self.model_combo.setCurrentText(os.getenv("model", "gpt-4.1")) # Load translation settings self.language_combo.setCurrentText(os.getenv("language", "English")) @@ -485,10 +485,10 @@ class ConfigTab(QWidget): if not self.env_file_path.exists(): self.env_file_path.touch() - # Save API settings - set_key(self.env_file_path, "api", self.api_url_edit.text()) - set_key(self.env_file_path, "key", self.api_key_edit.text()) - set_key(self.env_file_path, "organization", self.organization_edit.text()) + # Save API settings (trim whitespace to prevent accidental spaces in .env) + set_key(self.env_file_path, "api", self.api_url_edit.text().strip()) + set_key(self.env_file_path, "key", self.api_key_edit.text().strip()) + set_key(self.env_file_path, "organization", self.organization_edit.text().strip()) set_key(self.env_file_path, "model", self.model_combo.currentText()) # Save translation settings diff --git a/modules/csv.py b/modules/csv.py index 8a8a5c7..a87820d 100644 --- a/modules/csv.py +++ b/modules/csv.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai import csv from pathlib import Path from colorama import Fore @@ -17,13 +16,6 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/images.py b/modules/images.py index 1142120..cc502fa 100644 --- a/modules/images.py +++ b/modules/images.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -34,13 +33,6 @@ NAMESLIST = [] MISMATCH = [] # Lists files that throw a mismatch error (Length of GPT list response is wrong) FILENAME = None -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Regex - Need to change this if you want to translate from/to other languages. Default is Japanese Regex LANGREGEX = r"[一-龠ぁ-ゔァ-ヴーa-zA-Z0-9\uFF61-\uFF9F]+" diff --git a/modules/json.py b/modules/json.py index 03fddab..f9ea503 100644 --- a/modules/json.py +++ b/modules/json.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -16,13 +15,6 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/kirikiri.py b/modules/kirikiri.py index 55d86b6..bc3682e 100644 --- a/modules/kirikiri.py +++ b/modules/kirikiri.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -16,13 +15,6 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/lune.py b/modules/lune.py index 59ff87c..b23d8b3 100644 --- a/modules/lune.py +++ b/modules/lune.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -16,13 +15,6 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/nscript.py b/modules/nscript.py index 81568b5..6fde949 100644 --- a/modules/nscript.py +++ b/modules/nscript.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -16,13 +15,6 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/regex.py b/modules/regex.py index ffa5717..8dfd475 100644 --- a/modules/regex.py +++ b/modules/regex.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -16,18 +15,6 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("API_PROVIDER") == "gemini": - openai.base_url = "https://generativelanguage.googleapis.com/v1beta/openai/" - openai.organization = None -else: - api_url = os.getenv("api") - if api_url and api_url.replace(" ", "") != "": - openai.base_url = api_url - openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/renpy.py b/modules/renpy.py index fdc47aa..1041ed3 100644 --- a/modules/renpy.py +++ b/modules/renpy.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -16,13 +15,6 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/rpgmakerace.py b/modules/rpgmakerace.py index 1599cfc..66b472e 100644 --- a/modules/rpgmakerace.py +++ b/modules/rpgmakerace.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai import copy # Removed concurrent.futures usage for simplicity; running synchronously from pathlib import Path @@ -19,13 +18,6 @@ from util.translation import TranslationConfig, translateAI as sharedtranslateAI from ruamel.yaml import YAML -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/rpgmakermvmz.py b/modules/rpgmakermvmz.py index b9198b8..1abab00 100644 --- a/modules/rpgmakermvmz.py +++ b/modules/rpgmakermvmz.py @@ -6,7 +6,6 @@ import util.dazedwrap as dazedwrap import threading import time import traceback -import openai import copy from pathlib import Path import shutil @@ -16,13 +15,6 @@ from retry import retry from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost, getPricingConfig, calculateCost -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/rpgmakerplugin.py b/modules/rpgmakerplugin.py index f0d6e49..985c60c 100644 --- a/modules/rpgmakerplugin.py +++ b/modules/rpgmakerplugin.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -16,13 +15,6 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/srpg.py b/modules/srpg.py index 7499135..075c8c1 100644 --- a/modules/srpg.py +++ b/modules/srpg.py @@ -7,7 +7,7 @@ import util.dazedwrap as dazedwrap import threading import time import traceback -import openai +from dotenv import load_dotenv from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -15,13 +15,6 @@ from retry import retry from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/text.py b/modules/text.py index ae132ac..60c1a8a 100644 --- a/modules/text.py +++ b/modules/text.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -16,18 +15,6 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("API_PROVIDER") == "gemini": - openai.base_url = "https://generativelanguage.googleapis.com/v1beta/openai/" - openai.organization = None -else: - api_url = os.getenv("api") - if api_url and api_url.replace(" ", "") != "": - openai.base_url = api_url - openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") - # Globals MODEL = os.getenv("model") TIMEOUT = int(os.getenv("timeout")) diff --git a/modules/tyrano.py b/modules/tyrano.py index 6975c84..cbd7b76 100644 --- a/modules/tyrano.py +++ b/modules/tyrano.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -16,12 +15,7 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") +# OpenAI initialization centralized in util/translation.py # Globals MODEL = os.getenv("model") diff --git a/modules/unity.py b/modules/unity.py index a979b28..62a2893 100644 --- a/modules/unity.py +++ b/modules/unity.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -16,12 +15,7 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") +# OpenAI initialization centralized in util/translation.py # Globals MODEL = os.getenv("model") diff --git a/modules/wolf.py b/modules/wolf.py index d9fced4..d10a9a5 100644 --- a/modules/wolf.py +++ b/modules/wolf.py @@ -7,7 +7,6 @@ import threading import time import traceback import tiktoken -import openai # Removed concurrent.futures usage for simplicity; running synchronously from pathlib import Path from colorama import Fore @@ -16,12 +15,7 @@ from retry import retry from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost, getPricingConfig, calculateCost -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") +# OpenAI initialization centralized in util/translation.py # Globals MODEL = os.getenv("model") diff --git a/modules/wolf2.py b/modules/wolf2.py index 46eee7d..1c2c99f 100644 --- a/modules/wolf2.py +++ b/modules/wolf2.py @@ -8,7 +8,6 @@ import threading import time import traceback import tiktoken -import openai from pathlib import Path from colorama import Fore from dotenv import load_dotenv @@ -17,12 +16,7 @@ from tqdm import tqdm from util.translation import TranslationConfig, translateAI as sharedtranslateAI, getPricingConfig, calculateCost import tempfile -# Open AI -load_dotenv() -if os.getenv("api").replace(" ", "") != "": - openai.base_url = os.getenv("api") -openai.organization = os.getenv("org") -openai.api_key = os.getenv("key") +# OpenAI initialization centralized in util/translation.py # Globals MODEL = os.getenv("model") diff --git a/util/translation.py b/util/translation.py index 154dcbd..ed49f93 100644 --- a/util/translation.py +++ b/util/translation.py @@ -9,9 +9,30 @@ import re import json import tiktoken import openai +from dotenv import load_dotenv from pathlib import Path from retry import retry +# (from .env if present), strip accidental whitespace, and set the base URL, +# organization, and API key. It also handles the Gemini compatibility layer. +load_dotenv() +api_provider = os.getenv("API_PROVIDER", "openai").lower() +env_api = os.getenv("api", "").strip() +if api_provider == "gemini": + # Use Google Generative Language compatibility endpoint when running Gemini + openai.base_url = "https://generativelanguage.googleapis.com/v1beta/openai/" + openai.organization = None +else: + if env_api: + openai.base_url = env_api + # Support both 'organization' (gui/.env.example) and legacy 'org' names + org = os.getenv("organization") or os.getenv("org") + if org: + openai.organization = org.strip() + +# Always set API key from 'key' env var (trim whitespace) +openai.api_key = os.getenv("key", "").strip() + class TranslationConfig: """Configuration class to hold all translation settings"""