home *** CD-ROM | disk | FTP | other *** search
/ Chip 2011 November / CHIP_2011_11.iso / Programy / Inne / Gry / UltraStar_Deluxe / ultrastardx-1.1-installer-full.exe / languages / update.py < prev   
Text File  |  2010-06-18  |  4KB  |  155 lines

  1. #!/usr/bin/python
  2.  
  3. # UltraStar Deluxe - Karaoke Game
  4. #
  5. # UltraStar Deluxe is the legal property of its developers, whose names
  6. # are too numerous to list here. Please refer to the COPYRIGHT
  7. # file distributed with this source distribution.
  8. #
  9. # This program is free software; you can redistribute it and/or
  10. # modify it under the terms of the GNU General Public License
  11. # as published by the Free Software Foundation; either version 2
  12. # of the License, or (at your option) any later version.
  13. #
  14. # This program is distributed in the hope that it will be useful,
  15. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. # GNU General Public License for more details.
  18. #
  19. # You should have received a copy of the GNU General Public License
  20. # along with this program; see the file COPYING. If not, write to
  21. # the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  22. # Boston, MA 02110-1301, USA.
  23.  
  24. import re
  25. import sys
  26. import os
  27. import codecs
  28.  
  29. # buffer english file (always open binary, handle newline uniformly as "\n")
  30. f = open("English.ini", "rbU")
  31. english = []
  32. for line in f:
  33.     english.append(line.rstrip("\n"))
  34. f.close
  35.  
  36. transPattern = re.compile("\s*(\w+)\s*=(.+)$")
  37.  
  38. def update(lang):
  39.     print "\nUpdate " + lang
  40.  
  41.     # buffer translation file (always open binary, handle newline uniformly)
  42.     f = open(lang, "rbU")
  43.     translation = []
  44.     for line in f:
  45.         translation.append(line.rstrip("\n"))
  46.     f.close
  47.     # WORKAROUND: On windows the file does not seem to be closed by f.close
  48.     # as long as it is still referenced. Hence os.rename(lang, oldLang) will
  49.     # fail later as the file is still opened for reading.
  50.     f = None;
  51.  
  52.     outList = []
  53.     # find new fields
  54.     for line in english:
  55.         # header
  56.         if re.search("\[Text\]", line, re.I):
  57.             outList.append(codecs.BOM_UTF8 + "[Text]")
  58.             continue
  59.         # ignore comments
  60.         elif re.match("\s*[;#]", line):
  61.             continue
  62.         # copy empty lines
  63.         elif re.match("\s*$", line):
  64.             outList.append("")
  65.             continue
  66.         m = transPattern.match(line)
  67.         if (not m):
  68.             print "Invalid line: " + line
  69.             sys.exit(1)
  70.         untranslated = True
  71.         for transline in translation:
  72.             m2 = re.match("\s*" + m.group(1) + "\s*=(.+)$", transline)
  73.             if (m2):
  74.                 outList.append(m.group(1) + "=" + m2.group(1))
  75.                 untranslated = False
  76.                 break
  77.         if (untranslated):
  78.             print ("  +" + m.group(1))
  79.             outList.append(";TODO: " + line)
  80.  
  81.     # find unsupported (not in English.ini) translations
  82.     for line in translation:
  83.         # ignore header
  84.         if re.search("\[Text\]", line, re.I):
  85.             continue
  86.         # ignore TODOs
  87.         if re.match(";TODO:", line):
  88.             continue
  89.         # copy comments
  90.         elif re.match("\s*[;#]", line):
  91.             outList.append(line)
  92.             continue
  93.         # ignore empty line
  94.         elif re.match("\s*$", line):
  95.             continue
  96.         m = transPattern.match(line)
  97.         if (not m):
  98.             print ("  -" + line)
  99.             outList.append(";INVALID: " + line)
  100.             continue
  101.         # check if field is in English.ini
  102.         unsupported = True
  103.         for orig in english:
  104.             m2 = re.match("\s*" + m.group(1) + "\s*=(.+)$", orig)
  105.             # ignore translated lines (already written in first pass)
  106.             if (m2):
  107.                 unsupported = False
  108.                 break
  109.         # unsupported translation
  110.         if (unsupported):
  111.             print ("  -" + m.group(1))
  112.             outList.append(";UNUSED: " + m.group(1) + "=" + m.group(2))
  113.  
  114.     # check if file changed
  115.     changed = False
  116.     if (len(outList) != len(translation)):
  117.         changed = True
  118.     else:
  119.         # search for a changed line
  120.         for i in range(len(outList)):
  121.             if (outList[i] != translation[i]):
  122.                 changed = True
  123.                 break
  124.  
  125.     # write changes
  126.     if changed:
  127.         # create a backup first
  128.         oldLang = lang + ".bak"
  129.         if (os.path.exists(oldLang)):
  130.             os.remove(oldLang)
  131.         os.rename(lang, oldLang)
  132.  
  133.         f = open(lang, 'wb')
  134.         for line in outList:
  135.             # binary mode does not convert "\n" to the os specific line-ending.
  136.             # Use os.linesep instead.
  137.             f.write(line + os.linesep)
  138.         f.close()
  139.  
  140. if len(sys.argv) >= 2:
  141.     # update specific language file passed as command-line argument
  142.     update(sys.argv[1])
  143. else:
  144.     # update all language (ini) files
  145.     iniList=os.listdir(".")
  146.     for ini in iniList: 
  147.         if not re.search(".ini$", ini):
  148.             continue
  149.         if ini == "English.ini":
  150.             continue
  151.         update(ini);
  152.  
  153.     # update template (do not use an .ini prefix as USDX would load it)
  154.     update("Language.new");
  155.