Skip to content

Commit

Permalink
Введение системы предварительного перевода
Browse files Browse the repository at this point in the history
  • Loading branch information
Vladya committed Oct 13, 2020
1 parent 60e101e commit 73d7a05
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 17 deletions.
34 changes: 29 additions & 5 deletions game/Translator3000Scripts/general.rpy
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

init -9 python in _translator3000:
init -8 python in _translator3000:

class Translator3000(NoRollback):

Expand All @@ -22,22 +22,46 @@ init -9 python in _translator3000:
if path.isfile(self._user_setting_file):
with open(self._user_setting_file, "rb") as _file:
self._setting = json.load(_file)
if "prescan" not in self._setting:
# Файл был создан до введения предварительного скана.
self._setting["prescan"] = False
self._dump_setting()
else:
self._setting = {
"gameLanguage": None,
"directionOfTranslation": None
"directionOfTranslation": None,
"prescan": False
}
self._dump_setting()

def __call__(self, text):
self._translate_preparer = Preparer(translator_object=self)

@classmethod
def turn_on(cls):

_tr_object = cls()

config.say_menu_text_filter = _tr_object

if _tr_object._setting["prescan"]:

renpy.game.post_init.append(
_tr_object._translate_preparer.start
)
config.overlay_functions.append(
_tr_object._translate_preparer._show_scan_status
)

def __call__(self, text, _update_on_hdd=True):
"""
Непосредственно - метод перевода.
"""
try:
result = self._translator_object.translate(
text=self.unquote(text),
dest=self.direction_of_translation_code,
src=self.game_language_code
src=self.game_language_code,
_update_on_hdd=_update_on_hdd
)
except Exception as ex:
if DEBUG:
Expand Down Expand Up @@ -195,4 +219,4 @@ init -9 python in _translator3000:
return code
return None
config.say_menu_text_filter = Translator3000()
Translator3000.turn_on()
1 change: 1 addition & 0 deletions game/Translator3000Scripts/imports.rpy
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ init -10 python in _translator3000:
import json
import types
import logging
import threading
from os import path
from googleTranslateHandler import (
LOGGER,
Expand Down
65 changes: 65 additions & 0 deletions game/Translator3000Scripts/scan_daemon.rpy
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@

init -9 python in _translator3000:

class Preparer(threading.Thread, NoRollback):

"""
Демон для параллельного перевода всего текста в игре.
"""

__author__ = "Vladya"

def __init__(self, translator_object):

super(Preparer, self).__init__()
self.daemon = True

self._translator = translator_object

self._status = None
self._completed = False

def _show_scan_status(self, *screen_args, **screen_kwargs):

"""
Демонстрация статуса сканирования.
"""

if (not self._completed) and self._status:
_done, _scope_of_work = self._status
ui.text(
"Переведено {0} строк из {1} ({2:.1%}).".format(
_done,
_scope_of_work,
(float(_done) / float(_scope_of_work))
),
color="#fff",
outlines=[(2, "#000", 0, 0)],
anchor=(.0, .0),
pos=(.01, .01)
)

def run(self):

_renpy_translator = renpy.game.script.translator

say_objects = tuple(
sorted(
map(
lambda tl: tl.predict()[0],
_renpy_translator.default_translates.itervalues()
),
key=lambda _node: (_node.filename, _node.linenumber)
)
)
text_len = len(say_objects)

try:
for counter, say_node in enumerate(say_objects):
self._status = (counter, text_len)
renpy.restart_interaction() # Для перерисовки статуса.
self._translator(say_node.what, _update_on_hdd=False)
finally:
self._translator._translator_object._backup_database()
self._status = None
self._completed = True
26 changes: 18 additions & 8 deletions game/googleTranslateHandler/translator.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,14 @@ class Translator(object):
def __init__(self):

self._token_generator = token.TokenGenerator()
self.__hdd_lock = threading.Lock()
self.__database_lock = threading.Lock()
self.__database = {}
if path.isfile(self.translations_json_path):
with open(self.translations_json_path, "rb") as _file:
self.__database = json.load(_file)

def translate(self, text, dest, src):
def translate(self, text, dest, src, _update_on_hdd=True):

dest, src = map(self._get_lang_code, (dest, src))

Expand Down Expand Up @@ -72,12 +73,23 @@ def translate(self, text, dest, src):

text_db[dest] = result

# Update database on HDD.
if _update_on_hdd:
self._backup_database()

return result

def _backup_database(self):

with self.__hdd_lock:

self.LOGGER.debug("Start creating backup on HDD.")
json_dump_bytes = json.dumps(
self.__database,
ensure_ascii=False
)

with self.__database_lock:
json_dump_bytes = json.dumps(
self.__database,
ensure_ascii=False
)

if isinstance(json_dump_bytes, unicode):
json_dump_bytes = json_dump_bytes.encode("utf_8")
json_dump_bytes = io.BytesIO(json_dump_bytes)
Expand All @@ -97,8 +109,6 @@ def translate(self, text, dest, src):
os.rename(temp_fn, self.translations_json_path)
self.LOGGER.debug("Backup is created.")

return result

def _translate_with_web(self, text, dest, src):

url = self.create_translate_url(text, dest, src)
Expand Down
8 changes: 5 additions & 3 deletions game/googleTranslateHandler/web_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"""

import time
import random
import urllib2
from threading import Lock

Expand All @@ -29,7 +30,7 @@ class WebHandler(object):

__author__ = "Vladya"

RPM = 100. # Requests per minute.
RPM = 120. # Requests per minute.
headers = {
"User-Agent": ( # Pretending a browser.
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) "
Expand Down Expand Up @@ -81,11 +82,12 @@ def open(self, url, data=None):
with host_info._lock:

if host_info._last_request is not None:
_rpm = self.RPM * random.uniform(.75, 1.)
while True:
time_after_request = time.time() - host_info._last_request
if time_after_request >= (60. / self.RPM):
if time_after_request >= (60. / _rpm):
break
time.sleep(.01)
time.sleep(.1)
try:
if self.logger:
self.logger.debug("Try to open \"%s\".", url.geturl())
Expand Down
2 changes: 1 addition & 1 deletion game/options.rpy
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ define gui.show_name = True

## Версия игры.

define config.version = "2.1.0"
define config.version = "2.2.0"


## Текст, помещённый в экран "Об игре". Поместите текст между тройными скобками.
Expand Down

0 comments on commit 73d7a05

Please sign in to comment.