mirror of
https://github.com/clementine-player/Clementine
synced 2024-12-26 01:22:40 +01:00
129 lines
3.3 KiB
Python
129 lines
3.3 KiB
Python
|
import codecs
|
||
|
import glob
|
||
|
import logging
|
||
|
import os
|
||
|
import polib
|
||
|
import re
|
||
|
|
||
|
PO_GLOB = 'src/translations/*.po'
|
||
|
DESKTOP_PATH = 'dist/clementine.desktop'
|
||
|
|
||
|
class ConfigParser(object):
|
||
|
"""
|
||
|
Better version of the ConfigParser from the stdlib that handles unicode.
|
||
|
"""
|
||
|
|
||
|
SECTION_RE = re.compile('^\[(.*)\]\s*$')
|
||
|
VALUE_RE = re.compile('^([^\s=]+)\s*=\s*(.*)')
|
||
|
|
||
|
def __init__(self, encoding='utf-8'):
|
||
|
self._sections = []
|
||
|
self.encoding = encoding
|
||
|
|
||
|
def read(self, filename):
|
||
|
with codecs.open(filename, 'r', self.encoding) as handle:
|
||
|
current_section = None
|
||
|
|
||
|
for line in handle:
|
||
|
match = self.SECTION_RE.match(line)
|
||
|
if match:
|
||
|
current_section = self._add_section(match.group(1))
|
||
|
continue
|
||
|
|
||
|
match = self.VALUE_RE.match(line)
|
||
|
if match:
|
||
|
current_section['items'].append(
|
||
|
(match.group(1), match.group(2).strip()))
|
||
|
continue
|
||
|
|
||
|
def _add_section(self, section_name):
|
||
|
section = {
|
||
|
'name': section_name,
|
||
|
'items': [],
|
||
|
}
|
||
|
self._sections.append(section)
|
||
|
return section
|
||
|
|
||
|
def _find_section(self, section_name):
|
||
|
return [
|
||
|
section
|
||
|
for section in self._sections
|
||
|
if section['name'] == section_name
|
||
|
][0]
|
||
|
|
||
|
def _find_item_value(self, section, key):
|
||
|
return [
|
||
|
item[1]
|
||
|
for item in section['items']
|
||
|
if item[0] == key
|
||
|
][0]
|
||
|
|
||
|
def sections(self):
|
||
|
return [x['name'] for x in self._sections]
|
||
|
|
||
|
def get(self, section_name, key):
|
||
|
try:
|
||
|
return self._find_item_value(self._find_section(section_name), key)
|
||
|
except IndexError:
|
||
|
return None
|
||
|
|
||
|
def set(self, section_name, key, value):
|
||
|
try:
|
||
|
section = self._find_section(section_name)
|
||
|
except IndexError:
|
||
|
section = self._add_section(section_name)
|
||
|
|
||
|
for index, (existing_key, _existing_value) in enumerate(section['items']):
|
||
|
if existing_key == key:
|
||
|
section['items'][index] = (key, value)
|
||
|
return
|
||
|
|
||
|
section['items'].append((key, value))
|
||
|
|
||
|
def write(self, filename):
|
||
|
with codecs.open(filename, 'w', self.encoding) as handle:
|
||
|
for section in self._sections:
|
||
|
handle.write('[%s]\n' % section['name'])
|
||
|
for key, value in section['items']:
|
||
|
handle.write('%s=%s\n' % (key, value))
|
||
|
|
||
|
handle.write('\n')
|
||
|
|
||
|
|
||
|
def main():
|
||
|
logging.basicConfig(level=logging.DEBUG,
|
||
|
format="%(asctime)s %(levelname)-7s %(message)s")
|
||
|
|
||
|
config_parser = ConfigParser()
|
||
|
config_parser.read(DESKTOP_PATH)
|
||
|
|
||
|
shortcuts = [
|
||
|
{
|
||
|
'section_name': section_name,
|
||
|
'original': config_parser.get(section_name, 'Name'),
|
||
|
}
|
||
|
for section_name in config_parser.sections()
|
||
|
if section_name.endswith('Shortcut Group')
|
||
|
]
|
||
|
|
||
|
for po_filename in glob.glob(PO_GLOB):
|
||
|
language = os.path.splitext(os.path.basename(po_filename))[0]
|
||
|
config_key = 'Name[%s]' % language
|
||
|
po_file = polib.pofile(po_filename)
|
||
|
|
||
|
logging.info('Reading language %s', po_filename)
|
||
|
|
||
|
for shortcut in shortcuts:
|
||
|
original = shortcut['original']
|
||
|
entry = po_file.find(original)
|
||
|
if entry is not None and entry.msgstr and entry.msgstr != original:
|
||
|
logging.info('Setting %s for %s to %s',
|
||
|
config_key, shortcut['section_name'], entry.msgstr)
|
||
|
config_parser.set(shortcut['section_name'], config_key, entry.msgstr)
|
||
|
|
||
|
config_parser.write(DESKTOP_PATH)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|