Cache ทุกคำแปลของ Visual Novel Reader

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

ข้อควรระวัง

  1. ไม่รับประกันผล เพราะถ้ามีความรู้ Programming ระดับนึงจะเห็นว่า ผมไปทำให้มัน Clear cache ไม่ได้ เพราะผมไม่ให้มันทำ
  2. ถ้า Ram น้อย อาจจะตายได้ ผมไม่รู้เหมือนกันว่ามันกินเท่าไหร่ แต่ผมกำหนดให้เก็บเรื่อยๆ ไม่มี clear ไม่มีตัด
  3. ผมเขียนให้ตังเองใช้ ดังนั้นขอไม่อธิบายเยอะนะครับ

ขั้นตอนการทำ

แก้ไฟล์ดังต่อไปนี้

  • 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 ตลอดแล้ว

แนะนำโปรแกรม Kanji Tomo

Kanji Tomo คืออะไร

Kanji Tomo เป็นโปรแกรม OCR ประเภทหนึ่ง ความสามารถของมันคือจับภาพหน้าจอปัจจุบัน และยายามตรวจจับว่าตำแหน่งของเมาส์ที่เราชี้อยู่นั้นเป็นตัวอักษรญี่ปุ่นหรือไม่ และเป็นคำว่าอะไร (แค่คำนะ ไม่ถึงกับประโยค) ซึ่งช่วยให้เราสามารถพยายามแปลต่อไปได้ว่าคำนั้น หรือปุ่มนั้นคืออะไร

หากใครคุ้นกับ Visual Novel Reader (คืออะไร อ่านได้ที่นี่) มาคงจะทราบกันว่า หลายๆเกมส์มันแปลปุ่มไม่ได้ เพราะปุ่มมันดันเป็นภาพ ไม่ใช่ตัวอักษร โปรแกรมนี้ช่วยได้ในระดับนึง คือเอาตัวภาพมาพยายามแปลงเป็นตัวอักษร ในกรณีที่แปลงไม่ได้ทั้งหมด ก็ยังมีตัวช่วยให้เราพยายามหาคำต่อไปได้

วิธีติดตั้ง Kanji Tomo

  1. ก่อนอื่นต้องดาวโหลดก่อน โดยเข้าไปที่นี่ แล้วกด Download แล้วกดตัวหนังสือสีฟ้าๆที่เขียนว่า “can be downloaded here”
  2. เนื่องจากตัวโปรแกรมนั้นต้องการใช้ Java จึงจำเป็นต้องโหลดมาลงก่อน (มีแล้วข้ามไปเลย) สามารถดาวโหลดได้จากที่นี่  เข้าไปกด Download ตรง JDK กด Accept License Agreement แล้วก็กดโหลดตามเวอร์ชันที่ต้องการเลยครับ วิธีลงก็เปิดแล้วกด next รัวๆได้เลยครับ
  3. แตกไฟล์ตัว KanjiTomo.zip ออกมา
  4. เปิดตัว launch.bat ในการเปิดครั้งแรกต้องรอมันประมวลอะไรต่างๆสักพักนึง

วิธีใช้ Kanji Tomo

วิธีใช้ง่ายมากๆครับ แค่เปิดตัว Kanji Tomo ขึ้นมา จากนั้นเปิดเกมส์ที่ต้องการขึ้นมา แล้วเอาเมาส์ไปชี้ตรงคำที่ต้องการครับ จะได้ประมาณนี้ครับ
เปิด Kanji Tomo แล้วเอาเมาส์ชี้ใส่ในส่วนที่ต้องการแปลจะเห็นว่ามันสามารถแปลงภาพมาเป็นตัวอักษรได้ แล้วมี Dictionary ในตัวคอยแปลว่ามันหมายถึงอะไร ส่วนเรื่องที่มันแปลงภาพมาเป้นตัวอักษรได้มากน้อยแค่ไหนขึ้นอยู่กับหลายปัจจัย เช่นสีภาพกับสีพื้นหลังไม่กลืนกัน สีพื้นหลังเรียบหรือไม่เป็นต้น

ในกรณีที่มันดึงมาได้ไม่ครบเช่นมี 3 ตัวดึงมาได้ 2 ตัว ให้ลองกลับมาดูที่ตัวแปรแกรมครับ ที่มันมีอยู่ 4 ช่องคือตัวหนังสือแต่ละตัว ถ้ามันดึงมาได้ 3 ตัว ช่องที่ 3 จะมีเฉพาะตัวที่สามารถนำมาต่อแล้วประกอปเป็นคำได้ ที่เหลือก็ต้องใช้ตาเราดูแล้วว่ามันคือตัวไหนครับ

ความจริง Kanji Tomo มีอีกหลายอย่างให้เล่นลองเล่นดูได้ครับ เช่น Zoom เฉพาะส่วนที่ต้องการหรืออะไรประมาณนี้ครับ

แนะนำโปรแกรม Visual Novel Reader

Visual Novel Reader คืออะไร

Visual Novel Reader เป็นโปรแกรมที่ใช้สำหรับเพื่อเล่นเกมส์ประเภท Visual Novel (เกมส์ที่มีแต่ข้อความให้อ่าน + ภาพ CG เป็นหลัก บางเกมส์อาจจะแทรกมินิเกมส์อื่นๆพ่วงมาด้วย และส่วนมากเป็น H-Game) โดยตัวโปรแกรมนี้มีความสามารถคือดึง text จากเกมส์ออกมาแล้วส่งไปให้ Translator Service ต่างๆแปล และนำมาแสดงผลให้เราสามารถอ่านเนื้อเรื่องเกมส์พอเข้าใจได้

วิธีลง Visual Novel Reader

  1. ก่อนอื่นต้องมีโปรแกรม 7-Zip ก่อน (หรือโปรแกรมที่เปิด .7z ได้) ก็ไปดาวโหลดมาลงซะ เวลาดาวโหลดให้เลือกตัวที่เป็น .msi  ลงไม่ยากเปิดตัวลง กด Next รัวๆ
  2. ดาวโหลดตัว Visual Novel Reader จากลิงค์นี้ (UPDATE 2017-11-26 เจ้าของเลิกพัฒนาแล้ว แต่คิดว่ายังใช้ได้อยู่)
  3. หลังจากโหลดมาแล้วเราจะได้มาไฟล์นึง ให้แตกไฟล์นั้นออกครับ
    แตกไฟล์ Visual Novel Reader
  4. ให้เราเปิดตัว Visual Novel Reader.exe (ไม่บังคับ แต่ควรเปิดด้วยสิทธิ์ AdministratorsX
    เปิดตัว Visual Novel Reader.exe
  5. เมื่อเปิดแล้วจะได้หน้าตาแบบนี้ครับ
    หน้าตาของ Visual Novel Reader
  6. หลังจากขั้นนี้ไป จะทำหรือไม่ทำก็ได้ ไม่มีผลมากนัก ให้คลิกขวาตรงที่ว่างๆเลือก Preferences
    เข้า Preferences ของ Visual Novel Reader
  7. ปิดการเปลี่ยน Cursor ของ Mouse อัตโนมัติ ถ้าสังเกตจะเห็นว่าเมื่อเปิดโปรแกรมแล้ว Cursor จะเปลี่ยนไป ให้เลือกส่วนของ UI จากด้านขวา ให้เอาเครื่องหมายถูกออกตรง Customize mouse cursor และหากบางคนไม่อยากให้เปลี่ยน BG เวลาเลือกเกมส์ (ใช้ไปสักพักจะรู้ว่าคืออะไร) ให้เอาเครื่องหมายถูกออกตรง Automatically change wallpaper for different games
    ปิดการเปลี่ยน Cursor/Pointer อัตโนมัติ ใน Visual Novel Reader
  8. เลือกใช้ Google Translation Service แทน Bing Translation Service โดยเอาเครื่องหมายถูกที่ Microsoft Bing.com multilingual translation service ออก แล้วทำเครื่องหมายถูกที่ Google.com multilingual translation service แทน อันนี้แล้วแต่คนชอบว่าชอบใช้ Service ตัวไหนครับ ส่วนตัวผมชอบ Google Translate มากกว่า
    เลือก Translation Service ที่ต้องการให้ Visual Novel Reader ใช้
  9. ลง AppLocale (ไม่สำคัญมากนัก)

วิธีการใช้ Visual Novel Reader

  1. ก่อนอื่นเปิดเกมส์ที่เราต้องขึ้นมาก่อน จะเห็นว่าครั้งแรกนั้นพวก Font ต่างๆ จะไม่เป็นภาษาญี่ปุ่น (หรือภาษาตามต้นฉบับ) ให้เรารอสักพักแล้วปิดเกมส์ไปครับ
    เปิดเกมครั้งแรก font เสีย
  2. จากนั้นกลับไปดูที่โปรแกรม Visual Novel Reader จะเห็นว่ามีเกมส์ขึ้นมาบนกระดานแล้ว (ถ้ามันไม่แสดง ให้ลองกดเล่นเองนะครับ ด้านล่าง 2 ปุ่มแรก ที่รูปคล้ายๆจรวดกับแว่นขยาย จำไม่ได้ว่าปุ่มไหน คิดว่าไม่ยาก)
    Visual Novel Reader แสดงเกมส์ที่มันหาเจอ
  3. ให้ดับเบิ้ลคลิกที่เกมส์ เพื่อลองเปิดขึ้นมา ถ้า Font ไม่เสียก็ข้ามขั้นตอนี้ไปครับ แต่ถ้าเสียให้ปิดเกมส์ แล้วกดที่ตัวเกมส์ 1 ครั้งก่อนกด Edit ด้านล่างครับ
    กดที่ตัวเกมมศืแล้วกด Edit เพื่อเข้าหน้าแก้ไข
  4. ตรง Prefered Game Loader ให้เลือกภาษาของเกมส์ และตัวเลือกด้านล่าง ให้สลับไปเรื่อยๆ แล้วลองเปิดเกมส์ใหม่ (ต้องเปิดผ่าน Visual Novel Reader นะครับ ไม่งั้นมันไม่แก้ให้) เมื่อเลือกแล้วสามารถปิดหน้าต่างนี้ได้ทันที มันจะบันทึกให้อัตโนมัติ โดยส่วนตัวผมแนะนำให้เลือกตามลำดับต่อไปนี้คือ Default > NTLEA > AppLocale (ต้องลงก่อนดูวิธีลงได้ที่นี่) > LocaleSwitch > อื่นๆ
    ปรับ Option เพื่อเปิดเกมส์ด้วย Visual Novel Reader
  5. จะเห็นว่าคราวนี้ภาษาญี่ปุ่นถูกต้องแล้ว
    ภาษาแสดงได้อย่างถูกต้องแล้ว
  6. เมื่อเปิดเกมส์ รอสักพักเราจะเห็นเมนูสีฟ้าๆขึ้นมาที่ด้านซ้ายของเกมส์ ให้รอสักพักแล้วค่อบเริ่มเล่นเกมส์ตามปกติ (จะมีอะไรขึ้นมุมขวาเต็มไปหมด ปล่อยไปไม่ค่อยสำคัญ)
    เมื่อเปิดเกมส์ Visual Novel Reader จะเพิ่มเมนูสีฟ้าๆ ขึ้นด้านซ้ายของเกมส์
  7. เมื่อเรารอสักพักมันจะขึ้นตัวหนังสือที่มันถอดได้และคำแปลจาก Translation Service ที่เราเลือกไว้ขึ้นมา (สังเกตุด้านบน จะมีตัวหนังสือลอยขึ้นมา เหมือนข้อความในเกมส์ พร้อมคำแปล) เราสามารถเอาเมาส์ไปวางตรงตัวหนังสือที่ลอยขึ้นมาแล้วจะเห็นแถบเล็กๆลอยขึ้นมา สามารถกอที่แถบนั้นเพื่อเลื่อนคำแปลไปไว้ที่อื่นได้ครับ)
    Visual Novel Reader ถอดข้อความมาแปลให้เรียบร้อย

กรณีพิเศษ ข้อความไม่ขึ้น

ในบางเกมส์นั้น ตัว Visual Novel Reader เลือกข้อความไปแปลไม่ถูกต้อง เราสามารถตั้งค่าได้ดังนี้

  1. ตอนเปิดเกมส์จะมีแถบสีฟ้าๆขึ้น (ถ้าหายไปแล้วให้พับจอลง Task bar แล้วกดขึ้นมาใหม่ครับ) ให้คลิกขวาที่ Text เลือก Text Settings
    คลิกขวาที่ Text เลือก Text Settings
  2. จะมีหน้าต่างขึ้นมา อันนี้ให้อาศักความสามารถส่วนตัว ลองกดให้ข้อความเปลี่ยนแล้วดูว่าอันไหนที่มีข้อความเหมือนข้อความใหม่ที่แสดง ให้กดคำว่า dialog ตรงกล่องนั้นให้เป็นสีฟ้า อย่างของผมเลือกซ้ายบนสุด ก็กด dialog ของข้อความซ้ายบนสุด จากนั้นให้เรากด Save ก็จะได้แล้วครับ
    เลือก dialog ตรงส่วนของข้อความที่แสดงตรงกับตัวเกมส์

กรณีที่ไม่มีให้เลือก แสดงว่ามันไม่สามารถแกะข้อความมาได้ครับ ต้องไปหา Hook Code ของเกมส์นั้นมาใส่เอง ซึ่งแต่ละเกมส์ไม่เหมือนกันครับ + ผมไม่เก่งพอจะหา Hook Code ด้วย เลยไม่สามารถสอนได้ครับ

การติดตั้ง AppLocale และใช้งาน AppLocale เบื้องต้น

AppLocale คืออะไร

AppLocale เป็นโปรแกรมที่ไว้จำลองสภาพแวดล้อมของ Windows ให้เป็นเหมือน Windows ของประเทสอื่น ส่วนมากมักใช้กับโปรแกรมหรือเกมส์ของญี่ปุ่น ที่บางทีมันจะล็อคประเทศไม่ให้เปิด หรือไม่ก็ไม่สามารถอ่านภาษาญี่ปุ่นได้อย่างถูกต้อง เลยต้องใช้โปรแกรมนี้ช่วย

สำหรับท่านที่หลงเข้ามา เราขอแนะนำโปรแกรมที่ใช้แทน AppLocae ได้ และยังช่วยดึงข้อความจากเกมส์ไปใส่ Translation Service ต่างๆ เช่น Google Translate แล้วนำมาแสดงให้ท่านอ่านอัตโนมัติ เพื่ออรรถรสในการเล่มเกมส์ โปรแกรมนั้น คือ Visual Novel Reader ครับ สามารถกดที่ลิงค์เพื่อเข้าดูได้เลยครับ

วิธีติดตั้ง

ในกรณีที่เป็น Windows XP ให้ทำข้อ 1 แล้วข้ามไปข้อ 4

  1. ดาวโหลดตัวติดตั้งจากที่นี่ (ดาวโหลด AppLocale ตรงนี้ได้เลย แก้ลิงค์แล้ว)  ให้วางไว้ที่ C:\ (ไดร์ C อ่ะแหละ แต่ไม่ต้องไว้ในโฟลเดรอ์ใดๆนะครับ)
  2. กด Start พิมพ์ CMD แล้วคลิกขวาที่ cmd.exe แล้วเลือก Run As Administrator
    How to run as administrator
  3. พิมพ์ cd \ แล้ว Enter แล้วพิมพ์ apploc.msi แล้ว Enter
    How to Install Apploc.msi As Administrator
  4. ทำการติดตั้งตามปกติ Next ไปเรื่อยๆ ยาวๆจนจบก็ใช้ได้ครับ

วิธีใช้เบื้องต้น

  1.  เปิดตัวโปรแกรม
    How to run as administrator
  2. จะได้หน้าต่างนี้มา ให้กด Next
    Applocale Windows
  3. จากนั้นกด Browse แล้วเลือกโปรแกรมที่จะจำลองสภาพแวดล้อม จากนั้นกด Next
    Browse Program for AppLocale
  4. จากนั้นเลือกภาษาที่ต้องการ จากตัวอย่างนี้คือภาษาญี่ปุน แล้วกด Next
    Select Languages for Programs
  5. จากนั้นมันจะถามว่าจะให้ตั้ง Shortcut สำหรับโปรแกรมนี้ไหม แนะนำให้ตั้ง(ให้ทำเครื่องหมายถูก) แล้วกด Finish ตัวแปรแกรมที่เราต้องการก็จะถูกเปิดขึ้นมาอัตโนมัติ
    Are you want to create shortcut?
  6. คราวหลัง หากต้องการจะใช้ก็ให้ไป Folder ของ AppLocale ถ้าตั้ง Shortcut ไว้มันก็จะมีมาให้ครับ
    Example. Shortcut for programs

ผลจากการใช้

จากรูป เกมส์ PricessMaker 4 นะครับ ก่อนใช้ตัวหนังสือเป็นตัวยึกยือ ไม่สามารถอ่านได้เลยนะครับ
Pricess Maker 4 Before use AppLocaleแต่หลังใช้เราจะเห็นว่าเป็นภาษาญี่ปุ่นที่สามารถอ่านได้ปกติ(ถ้าอ่านออกนะครับ)
Pricess Maker 4 After use AppLocale