home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/python
-
- # UltraStar Deluxe - Karaoke Game
- #
- # UltraStar Deluxe is the legal property of its developers, whose names
- # are too numerous to list here. Please refer to the COPYRIGHT
- # file distributed with this source distribution.
- #
- # This program is free software; you can redistribute it and/or
- # modify it under the terms of the GNU General Public License
- # as published by the Free Software Foundation; either version 2
- # of the License, or (at your option) any later version.
- #
- # This program is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- # GNU General Public License for more details.
- #
- # You should have received a copy of the GNU General Public License
- # along with this program; see the file COPYING. If not, write to
- # the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- # Boston, MA 02110-1301, USA.
-
- import re
- import sys
- import os
- import codecs
-
- # buffer english file (always open binary, handle newline uniformly as "\n")
- f = open("English.ini", "rbU")
- english = []
- for line in f:
- english.append(line.rstrip("\n"))
- f.close
-
- transPattern = re.compile("\s*(\w+)\s*=(.+)$")
-
- def update(lang):
- print "\nUpdate " + lang
-
- # buffer translation file (always open binary, handle newline uniformly)
- f = open(lang, "rbU")
- translation = []
- for line in f:
- translation.append(line.rstrip("\n"))
- f.close
- # WORKAROUND: On windows the file does not seem to be closed by f.close
- # as long as it is still referenced. Hence os.rename(lang, oldLang) will
- # fail later as the file is still opened for reading.
- f = None;
-
- outList = []
- # find new fields
- for line in english:
- # header
- if re.search("\[Text\]", line, re.I):
- outList.append(codecs.BOM_UTF8 + "[Text]")
- continue
- # ignore comments
- elif re.match("\s*[;#]", line):
- continue
- # copy empty lines
- elif re.match("\s*$", line):
- outList.append("")
- continue
- m = transPattern.match(line)
- if (not m):
- print "Invalid line: " + line
- sys.exit(1)
- untranslated = True
- for transline in translation:
- m2 = re.match("\s*" + m.group(1) + "\s*=(.+)$", transline)
- if (m2):
- outList.append(m.group(1) + "=" + m2.group(1))
- untranslated = False
- break
- if (untranslated):
- print (" +" + m.group(1))
- outList.append(";TODO: " + line)
-
- # find unsupported (not in English.ini) translations
- for line in translation:
- # ignore header
- if re.search("\[Text\]", line, re.I):
- continue
- # ignore TODOs
- if re.match(";TODO:", line):
- continue
- # copy comments
- elif re.match("\s*[;#]", line):
- outList.append(line)
- continue
- # ignore empty line
- elif re.match("\s*$", line):
- continue
- m = transPattern.match(line)
- if (not m):
- print (" -" + line)
- outList.append(";INVALID: " + line)
- continue
- # check if field is in English.ini
- unsupported = True
- for orig in english:
- m2 = re.match("\s*" + m.group(1) + "\s*=(.+)$", orig)
- # ignore translated lines (already written in first pass)
- if (m2):
- unsupported = False
- break
- # unsupported translation
- if (unsupported):
- print (" -" + m.group(1))
- outList.append(";UNUSED: " + m.group(1) + "=" + m.group(2))
-
- # check if file changed
- changed = False
- if (len(outList) != len(translation)):
- changed = True
- else:
- # search for a changed line
- for i in range(len(outList)):
- if (outList[i] != translation[i]):
- changed = True
- break
-
- # write changes
- if changed:
- # create a backup first
- oldLang = lang + ".bak"
- if (os.path.exists(oldLang)):
- os.remove(oldLang)
- os.rename(lang, oldLang)
-
- f = open(lang, 'wb')
- for line in outList:
- # binary mode does not convert "\n" to the os specific line-ending.
- # Use os.linesep instead.
- f.write(line + os.linesep)
- f.close()
-
- if len(sys.argv) >= 2:
- # update specific language file passed as command-line argument
- update(sys.argv[1])
- else:
- # update all language (ini) files
- iniList=os.listdir(".")
- for ini in iniList:
- if not re.search(".ini$", ini):
- continue
- if ini == "English.ini":
- continue
- update(ini);
-
- # update template (do not use an .ini prefix as USDX would load it)
- update("Language.new");
-