เป็นวิธีแก้ไข 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 คำล่าสุดอยู่แล้ว แต่ถ้าปิดโปรแกรมหาย เลยต้องปรับมันสักหน่อย
ข้อควรระวัง
แก้ไฟล์ดังต่อไปนี้
(ถ้าเดาจากชื่อ แก้แค่อันล่างก็พอ ก็ได้)
หา 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 ตลอดแล้ว