#!/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))
oldLang = lang + ".old"
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");