-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathauto_translator_gui.py
330 lines (252 loc) · 12.8 KB
/
auto_translator_gui.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
import sys
import json
import os
import requests
from deep_translator import GoogleTranslator
from PyQt5.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QGridLayout, QPushButton, QFileDialog, QLabel, QLineEdit, QScrollArea, QDesktopWidget
)
from PyQt5.QtGui import QPixmap, QDesktopServices
from PyQt5.QtCore import Qt, QUrl
from PyQt5.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton,
QTableWidget, QTableWidgetItem, QFileDialog, QMessageBox,
QCheckBox, QLineEdit, QLabel, QTextEdit
)
from PyQt5.QtWidgets import QMessageBox
# Global variables to store the selected file paths
appname_file_path = None
storepage_file_path = None
example_store_page_json = {"language":"english","appid":2976180,"name":"A difficult game about spelunking"}
# app_id_override = ""
# app_name_override = ""
# example_store_page_json.language="english"
# example_store_page_json.appid = 2976180
# example_store_page_json.name = "A difficult game about spelunking"
# JSON keys to filter out
jsonKeyNamesToFilterOut = ["language", "appid", "itemid"]
my_steam_app_ids = ["2360880","2530060","2496790","2476040","2328280","1445370"]
def sanitize_translated_value(rawValue):
replacement_string = rawValue
replacement_string = replacement_string.replace("{steam_app_image} ", "{STEAM_APP_IMAGE}")
replacement_string = replacement_string.replace("{steam_app_image}", "{STEAM_APP_IMAGE}")
replacement_string = replacement_string.replace("[img] ", "[img]")
replacement_string = replacement_string.replace(" [/img]", "[/img]")
return replacement_string
def process_appname_json(app_id_override, app_name_override, in_text_area):
example_store_page_json["appid"] = app_id_override
example_store_page_json["name"] = app_name_override
baseTranslationFile = example_store_page_json
appidOverride = baseTranslationFile.get('appid', -1)
translationEntriesJsonFileName = "includes/appname_translations_file"
with open(f"{translationEntriesJsonFileName}.json", "r") as translation_file:
data = json.load(translation_file)
for entry in data["entries"]:
google_language_id = entry["language"]
google_language_display_name = google_language_id
if appidOverride != -1:
entry["appid"] = appidOverride
google_language_id = map_language_id(google_language_id)
translated_val = translate_and_save(entry, baseTranslationFile, google_language_id, "appid")
text_entry = in_text_area.toPlainText()
text_entry = f"{text_entry}\n{google_language_display_name}:{translated_val}"
in_text_area.setPlainText(text_entry)
def process_appname_json_old(file_path, in_text_area):
with open(file_path, "r") as file:
baseTranslationFile = json.load(file)
appidOverride = baseTranslationFile.get('appid', -1)
translationEntriesJsonFileName = "includes/appname_translations_file"
with open(f"{translationEntriesJsonFileName}.json", "r") as translation_file:
data = json.load(translation_file)
for entry in data["entries"]:
google_language_id = entry["language"]
google_language_display_name = google_language_id
if appidOverride != -1:
entry["appid"] = appidOverride
google_language_id = map_language_id(google_language_id)
translated_val = translate_and_save(entry, baseTranslationFile, google_language_id, "appid")
text_entry = in_text_area.toPlainText()
text_entry = f"{text_entry}\n{google_language_display_name}:{translated_val}"
in_text_area.setPlainText(text_entry)
def process_storepage_json(file_path):
with open(file_path, "r") as file:
baseTranslationFile = json.load(file)
itemidOverride = baseTranslationFile.get('itemid', -1)
translationEntriesJsonFileName = "includes/storepage_translations_file"
with open(f"{translationEntriesJsonFileName}.json", "r") as translation_file:
data = json.load(translation_file)
for entry in data["entries"]:
google_language_id = entry["language"]
if itemidOverride != -1:
entry["itemid"] = itemidOverride
google_language_id = map_language_id(google_language_id)
translate_and_save(entry, baseTranslationFile, google_language_id, "itemid")
def map_language_id(google_language_id):
language_map = {
"brazilian": "pt",
"latam": "es",
"sc_schinese": "zh-TW",
"tchinese": "zh-TW",
"schinese": "zh-CN",
"koreana": "ko"
}
return language_map.get(google_language_id, google_language_id)
def translate_and_save(entry, baseTranslationFile, google_language_id, id_key):
return_val = ""
for fieldName, fieldValue in baseTranslationFile.items():
if fieldName in jsonKeyNamesToFilterOut:
continue
if len(fieldValue) > 1:
print(f"translating {fieldValue} to {google_language_id}")
#translatedFieldValue = translator.translate(fieldValue, src='en', dest=google_language_id).text
translatedFieldValue = GoogleTranslator(source='en', target=google_language_id).translate(fieldValue)
translatedFieldValue = translatedFieldValue.lower()
entry[fieldName] = translatedFieldValue
if fieldName == "name":
return_val = translatedFieldValue
output_directory = f'./exports/{id_key}/export_{entry[id_key]}'
os.makedirs(output_directory, exist_ok=True)
json_string = json.dumps(entry).lower()
sanitized_json_string = sanitize_translated_value(json_string)
output_file_dir = f'{output_directory}/{id_key}_{entry[id_key]}_{entry["language"]}.json'
with open(output_file_dir, "w") as output_file:
output_file.write(sanitized_json_string)
print(f"Translation complete. Exported {output_file_dir}.")
return return_val
def make_image_clickable(image_label, steam_url):
try:
def open_steam_url(event):
QDesktopServices.openUrl(QUrl(steam_url))
image_label.mousePressEvent = open_steam_url
except Exception as e:
print(f"Error setting up mouse event: {e}")
def load_steam_images(steam_app_ids, grid_layout):
for i, app_id in enumerate(steam_app_ids):
image_url = f"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/{app_id}/header.jpg?t=1723472552"
steam_url = f"https://store.steampowered.com/app/{app_id}"
# Load image using requests
response = requests.get(image_url)
if response.status_code == 200:
image_data = response.content
pixmap = QPixmap()
pixmap.loadFromData(image_data)
# Create label and set the pixmap
image_label = QLabel()
image_label.setPixmap(pixmap.scaled(200, 100, Qt.KeepAspectRatio))
# Make image clickable
make_image_clickable(image_label, steam_url)
# Add image to grid layout
row = i // 3
col = i % 3
grid_layout.addWidget(image_label, row, col)
else:
print(f"Failed to load image for app ID {app_id}")
class TranslationApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
layout = QVBoxLayout()
self.game_name_input_label = QLabel("app name:")
layout.addWidget(self.game_name_input_label)
# # Add array input field for Steam App IDs
self.game_name_input = QLineEdit(self)
self.game_name_input.setPlaceholderText("Enter game name here:")
self.game_name_input.setText("Improbability Control Bureau")
layout.addWidget(self.game_name_input)
self.app_id_input_label = QLabel("app id:")
layout.addWidget(self.app_id_input_label)
self.app_id_input = QLineEdit(self)
self.app_id_input.setPlaceholderText("Enter app id :")
self.app_id_input.setText("2530060")
layout.addWidget(self.app_id_input)
self.dynamic_link_label = QLabel(self)
self.dynamic_link_label.setTextInteractionFlags(Qt.TextBrowserInteraction)
self.dynamic_link_label.setOpenExternalLinks(True)
layout.addWidget(self.dynamic_link_label)
# # Connect the app_id_input to a function that updates the link
# self.app_id_input.textChanged.connect(self.update_dynamic_link)
# self.appname_label = QLabel("Select appname JSON file:")
# layout.addWidget(self.appname_label)
# appname_button = QPushButton("Select appname JSON")
# appname_button.clicked.connect(self.select_appname_file)
# layout.addWidget(appname_button)
self.storepage_label = QLabel("Select storepage JSON file:")
layout.addWidget(self.storepage_label)
storepage_button = QPushButton("Select storepage JSON")
storepage_button.clicked.connect(self.select_storepage_file)
layout.addWidget(storepage_button)
process_button = QPushButton("Process Files")
process_button.clicked.connect(self.process_files)
layout.addWidget(process_button)
self.app_translation_label = QLabel("translated app names. If you published your steam store page already, give this to steam support to update your translated game titles: ")
layout.addWidget(self.app_translation_label)
self.text_area = QTextEdit()
self.text_area.setFontPointSize(14)
self.text_area.setMinimumHeight(100)
layout.addWidget(self.text_area)
self.app_translation_label = QLabel("Help a brother out. Wishlist my games!!! :) ")
layout.addWidget(self.app_translation_label)
# Scroll area to display images in a grid layout
scroll_area = QScrollArea(self)
scroll_area.setWidgetResizable(True)
image_widget = QWidget(scroll_area)
self.grid_layout = QGridLayout(image_widget)
scroll_area.setWidget(image_widget)
layout.addWidget(scroll_area)
self.setLayout(layout)
self.setWindowTitle("Scott HF Dunbar's Translation App")
self.setGeometry(300, 300, 700, 660)
# try:
# Load Steam app images into grid
steam_app_ids = [app_id.strip() for app_id in my_steam_app_ids if app_id.strip().isdigit()]
load_steam_images(steam_app_ids, self.grid_layout)
# except Exception as e:
# print(f"Caught an unexpected exception: {e}")
# Handle other exceptions if needed
def update_dynamic_link(self):
app_id = self.app_id_input.text().strip()
if app_id.isdigit():
url = f"https://partner.steamgames.com/admin/game/edit/{app_id}?activetab=tab_localization"
print(f"clicked url: {url}")
self.dynamic_link_label.setText(f'<a href="{url}">Edit Game Localization in Steamworks</a>')
else:
self.dynamic_link_label.setText("")
def select_appname_file(self):
global appname_file_path
appname_file_path, _ = QFileDialog.getOpenFileName(self, "Select appname JSON", "", "JSON Files (*.json)")
if appname_file_path:
self.appname_label.setText(f"Selected: {os.path.basename(appname_file_path)}")
def select_storepage_file(self):
global storepage_file_path
storepage_file_path, _ = QFileDialog.getOpenFileName(self, "Select storepage JSON", "", "JSON Files (*.json)")
if storepage_file_path:
self.storepage_label.setText(f"Selected: {os.path.basename(storepage_file_path)}")
def process_files(self):
msg = QMessageBox()
msg.setIcon(QMessageBox.Information)
msg.setText("Processing in progress...")
msg.setWindowTitle("Processing")
msg.setStandardButtons(QMessageBox.NoButton) # Disable close button while processing
msg.show()
app_name_override = self.game_name_input.text().strip()
app_id_override = int(self.app_id_input.text().strip())
process_appname_json(app_id_override, app_name_override, self.text_area)
# Process files
#if appname_file_path:
#process_appname_json(appname_file_path, self.text_area)
if storepage_file_path:
process_storepage_json(storepage_file_path)
# Update the status when processing is complete
msg.setText("Processing complete!")
msg.setStandardButtons(QMessageBox.Ok)
msg.exec_() # Wait for the user to close the message box
if __name__ == '__main__':
try:
app = QApplication(sys.argv)
ex = TranslationApp()
ex.show()
except Exception as e:
print(f"Caught an unexpected exception: {e}")
# Handle other exceptions if needed
sys.exit(app.exec_())