Skip to content

Commit

Permalink
Release 1.7
Browse files Browse the repository at this point in the history
增加翻译历史缓存已改善性能。
  • Loading branch information
huaiyinfeilong committed Jun 2, 2023
1 parent 43ab76f commit b93ac96
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 10 deletions.
4 changes: 4 additions & 0 deletions addon/doc/zh_CN/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@

## 升级日志

### Version 1.7

* 增加翻译历史缓存以提高性能

### Version 1.6

* 新增翻译结果拷贝功能。对于正向翻译、反向翻译、剪贴板正向翻译、剪贴板反向翻译,可通过双击手势拷贝翻译结果到剪贴板。
Expand Down
35 changes: 27 additions & 8 deletions addon/globalPlugins/baiduTranslation/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import wx
from .translators import BaiduTranslator
from .languages import get_language_list
from .cacheData import CacheDataFile

addonHandler.initTranslation()

Expand Down Expand Up @@ -122,6 +123,11 @@ def onSave(self):
class GlobalPlugin(globalPluginHandler.GlobalPlugin):
def __init__(self):
super(globalPluginHandler.GlobalPlugin, self).__init__()
# 翻译历史缓存数据夹在,用以加速相同内容的翻译
self._cacheFile = CacheDataFile()
cacheFilename = os.path.abspath(os.path.join(
os.path.dirname(__file__), "../../../..", "baiduTranslation.cache-data"))
self._cacheFile.loadDataFile(cacheFilename)
# 翻译结果缓存,用以翻译结果拷贝,当拷贝成功后此缓存将被清空
self._translationResult = ""
# 是否拷贝翻译结果标志
Expand Down Expand Up @@ -152,6 +158,8 @@ def __del__(self):
self._speak = None

def terminate(self):
# 保存翻译历史缓存数据
self._cacheFile.saveCacheDataFile()
gui.settingsDialogs.NVDASettingsDialog.categoryClasses.remove(TranslationSettingsPanel)

@scriptHandler.script(
Expand All @@ -170,7 +178,7 @@ def script_translate(self, gesture):
else:
from_language = config.conf["baiduTranslation"]["from"]
to_language = config.conf["baiduTranslation"]["to"]
_translator.translate(from_language, to_language, self._data, self._onResult)
self._translate(from_language, to_language, self._data)

# Translators: Reverse translate what you just heard
@scriptHandler.script(
Expand All @@ -185,7 +193,7 @@ def script_reverseTranslate(self, gesture):
self._playSound(True)
from_language = config.conf["baiduTranslation"]["from"]
to_language = config.conf["baiduTranslation"]["to"]
_translator.translate(to_language, from_language, self._data, self._onResult)
self._translate(to_language, from_language, self._data)

@scriptHandler.script(
category=CATEGORY_NAME,
Expand Down Expand Up @@ -242,13 +250,14 @@ def clipboard_translation(self, reverse=False):
temp = from_language
from_language = to_language
to_language = temp
_translator.translate(from_language, to_language, text, self._onResult)
self._translate(to_language, from_language, self._data)

def _onResult(self, data):
if data is not None:
self._speak([data])
def _onResult(self, fromLanguage, toLanguage, source, target):
if target is not None:
self._speak([target])
self._cacheFile.addCacheItem(fromLanguage, toLanguage, source, target)
if self._copyFlag is True:
api.copyToClip(data)
api.copyToClip(target)
# 拷贝完成清空缓存并重置拷贝标志
self._translationResult = ""
self._copyFlag = False
Expand All @@ -267,7 +276,7 @@ def speak(self, sequence, *args, **kwargs):
else:
from_language = config.conf["baiduTranslation"]["to"]
to_language = config.conf["baiduTranslation"]["from"]
_translator.translate(from_language, to_language, self._data, self._onResult)
self._translate(from_language, to_language, self._data)
else:
self._speak(sequence, *args, **kwargs)

Expand All @@ -286,3 +295,13 @@ def _copyTranslationResultToClipboard(self):
self._translationResult = ""
else:
self._copyFlag = True

def _translate(self, fromLanguage, toLanguage, text):
if not text:
return
result = self._cacheFile.getCacheItem(fromLanguage, toLanguage, text)
if not result:
_translator.translate(fromLanguage, toLanguage, text, self._onResult)
else:
self._onResult(fromLanguage, toLanguage, text, result)
self._translationResult = result
45 changes: 45 additions & 0 deletions addon/globalPlugins/baiduTranslation/cacheData.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# coding=utf-8

import json


class CacheDataFile(object):
"""翻译缓存数据文件类
针对翻译结果数据进行缓存,避免相同重复内容的频繁请求,加速翻译速度和优化翻译API请求数量
"""

# 翻译数据缓存,默认数量10000"""
_maxCacheCount = 10000
# 翻译缓存数据,字典类型,key为原文,value为译文
_cacheData = {}
# 缓存数据文件路径
_filename = ""

# 夹在缓存数据文件
def loadDataFile(self, filename):
try:
if filename:
self._filename = filename
with open(filename, "r") as f:
data = f.read()
self._cacheData = json.loads(data)
except Exception:
self._cacheData = {}

# 保存缓存数据文件
def saveCacheDataFile(self):
if not self._filename:
return
data = json.dumps(self._cacheData)
with open(self._filename, "w") as f:
f.write(data)

# 添加缓存数据
def addCacheItem(self, fromLanguage, toLanguage, source, target):
key = f"[{fromLanguage}>{toLanguage}]{source}"
self._cacheData[key] = target

# 获取缓存项目
def getCacheItem(self, fromLanguage, toLanguage, source):
key = f"[{fromLanguage}>{toLanguage}]{source}"
return self._cacheData.get(key)
2 changes: 1 addition & 1 deletion addon/globalPlugins/baiduTranslation/translators.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,4 @@ def run(self):
result = f"{_(failedMessage)}{_(message)}"
else:
result = "\n".join([r.get("dst") for r in data.get("trans_result")])
self._on_result(result)
self._on_result(from_language, to_language, text, result)
2 changes: 1 addition & 1 deletion buildVars.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def _(arg):
# Translators: Long description to be shown for this add-on on add-on information from add-ons manager
"addon_description": _("An NVDA add-on that provides baidu translation"),
# version
"addon_version": "1.6",
"addon_version": "1.7",
# Translators: Author(s)
"addon_author": "huaiyinfeilong <huaiyinfeilong@163.com>",
# URL for the add-on documentation support
Expand Down

0 comments on commit b93ac96

Please sign in to comment.