เป็นวิธีแก้ไข Visual Novel Reader ให้สามารถ Cache คำแปลต่างๆ ที่แปลจาก Google Translator หรือ Bing Translator ได้ โดยตัว Visual Novel Reader นี้เป็น Open Source แต่ไม่มี Source Version Control อย่างพวก SVN หรือ Git (จริงๆ เข้าใจว่ามันใช้ Hg นะ มันคืออะไรไม่รู้เห็นตอน Update และเข้าใจว่าไม่เปิด public) ทำให้ไม่สามารถ pull request ได้ (ถึงทำได้ ก็ไม่ทำ code กาก 55+)
เป้าหมายที่อยากทำคือบางครั้งกลับมาเล่นเกมส์ซ้ำมันแปลไม่ได้ หรืออยากไป route อื่น แต่ข้อความมันซ้ำ ก็ไม่รู้จะต้องไปแปลอีกทำไม บางครั้งเน็ตกากก็รอไปเถอะ โดยปกติตัว Visual Novel Reader จะ Cache ไว้ประมาณ 10-20 คำล่าสุดอยู่แล้ว แต่ถ้าปิดโปรแกรมหาย เลยต้องปรับมันสักหน่อย
ข้อควรระวัง
- ไม่รับประกันผล เพราะถ้ามีความรู้ Programming ระดับนึงจะเห็นว่า ผมไปทำให้มัน Clear cache ไม่ได้ เพราะผมไม่ให้มันทำ
- ถ้า Ram น้อย อาจจะตายได้ ผมไม่รู้เหมือนกันว่ามันกินเท่าไหร่ แต่ผมกำหนดให้เก็บเรื่อยๆ ไม่มี clear ไม่มีตัด
- ผมเขียนให้ตังเองใช้ ดังนั้นขอไม่อธิบายเยอะนะครับ
ขั้นตอนการทำ
แก้ไฟล์ดังต่อไปนี้
- Library\Frameworks\Sakura\py\apps\browser\managers\_trman.py
- Library\Frameworks\Sakura\py\apps\reader\managers\_trman.py
(ถ้าเดาจากชื่อ แก้แค่อันล่างก็พอ ก็ได้)
หา class TranslationCache แล้วแทนที่ด้วย code ดังต่อไปนี้
import sqlite3
import rc
class TranslationCache:
def __init__(self, maxSize=10000, shrinkSize=9000):
"""
@param maxSize max data size
@param shrinkSize data to delete when oversize
"""
self.maxSize = maxSize
self.shrinkSize = shrinkSize
# {unicode text:[unicode sub, long timestamp]}
self.conn = sqlite3.connect(rc.DIR_APP_CACHE+'/cache.db')
self.prepare()
def clear(self):
pass # i don't want to clear
def get(self, key): # unicode -> unicode
c = self.conn.cursor()
c.execute('select translate from translations where original = ? limit 1', (key ,))
r = c.fetchone()
if r != None:
c.execute('update translations SET timestamp = ? where original = ?', (self._now(), key ,))
self.conn.commit()
c.close()
return r[0]
else:
c.close()
def update(self, key, value): # unicode, unicode ->
c = self.conn.cursor()
c.execute('select translate from translations where original = ? limit 1', (key ,))
r = c.fetchone()
if r == None:
c.execute('insert into translations (original, translate, timestamp) values (?,?,?)', (key ,value, self._now(), ))
self.conn.commit()
c.close()
return value
def prepare(self):
c = self.conn.cursor()
try:
c.execute('select * from translations limit 1')
except:
c.execute('CREATE TABLE translations (original TEXT PRIMARY KEY, translate TEXT, timestamp INTEGER)')
self.conn.commit()
c.close()
@staticmethod
def _now(): return long(time()) # -> long msecs
def _shrink(self):
pass
ด้านล่างตรงนี้เป็นของเก่า ไม่ใช้แล้ว
เพิ่ม Code นี้ไปแถวๆส่วนที่เค้า import กัน
import rc
หา class TranslationCache แล้วแทนที่ด้วย code ดังต่อไปนี้
class TranslationCache:
def __init__(self, maxSize=10000, shrinkSize=9000):
"""
@param maxSize max data size
@param shrinkSize data to delete when oversize
"""
self.maxSize = maxSize
self.shrinkSize = shrinkSize
self.data = {} # {unicode text:[unicode sub, long timestamp]}
self.load()
def clear(self):
if self.data:
self.data ={} # i don't want to clear
self.load()
def get(self, key): # unicode -> unicode
t = self.data.get(key)
if t:
t[1] = self._now()
self.save()
return t[0]
def update(self, key, value): # unicode, unicode ->
self.data[key] = [value, self._now()]
#if len(self.data) > self.maxSize:
# self._shrink()
self.save()
#return value
def save(self):
f = open(rc.DIR_APP_CACHE+'/cache.dict','w+')
f.truncate()
f.write(str(self.data))
f.close()
def load(self):
try:
f = open(rc.DIR_APP_CACHE+'/cache.dict','r+')
self.data = eval(f.read())
f.close()
except:
self.data = {}
@staticmethod
def _now(): return long(time()) # -> long msecs
def _shrink(self):
l = sorted(self.data.iteritems(), key=lambda it:it[1][1])
self.data = {k:v for k,v in l[self.shrinkSize:]}
ปิด Visual Novel Reader เปิดใหม่ ก็ได้แล้ว ต่อไปมันก็จะ cache ตลอดแล้ว