qBittorrent
tstool Namespace Reference

Functions

def parseSource (filename, sources)
 
def processTranslation (filename, sources)
 

Variables

list accepted_exts = [".js", ".html", ".css"]
 
bool no_obsolete = False
 
string www_folder = "."
 
 ts_folder = os.path.join(www_folder, "translations")
 
 argp
 
 dest
 
 action
 
 default
 
 help
 
 args = argp.parse_args()
 
int nfiles = 0
 
dictionary source_ts = {}
 
 nstrings = sum(len(sublist) for sublist in source_ts)
 

Function Documentation

◆ parseSource()

def tstool.parseSource (   filename,
  sources 
)

Definition at line 44 of file tstool.py.

44 def parseSource(filename, sources):
45  print("Parsing %s..." % (os.path.normpath(filename)))
46  with open(filename, encoding = 'utf-8', mode = 'r') as file:
47  regex = re.compile(
48  r"QBT_TR\‍((([^\‍)]|\‍)(?!QBT_TR))+)\‍)QBT_TR\[CONTEXT=([a-zA-Z_][a-zA-Z0-9_]*)\]")
49  for match in regex.finditer(file.read()):
50  string = match.group(1)
51  context = match.group(3)
52 
53  if context not in sources:
54  sources[context] = set()
55  sources[context].add(string)
56 
def parseSource(filename, sources)
Definition: tstool.py:44

◆ processTranslation()

def tstool.processTranslation (   filename,
  sources 
)

Definition at line 57 of file tstool.py.

57 def processTranslation(filename, sources):
58  print('Processing %s...' % (os.path.normpath(filename)))
59 
60  try:
61  tree = ET.ElementTree(file = filename)
62  except Exception:
63  print('\tFailed to parse %s!' % (os.path.normpath(filename)))
64  return
65 
66  root = tree.getroot()
67  for context in root.findall('context'):
68  context_name = context.find('name').text
69  has_context = context_name in sources
70  if not has_context and no_obsolete:
71  root.remove(context)
72  continue
73 
74  for message in context.findall('message'):
75  for location in message.findall('location'):
76  message.remove(location)
77 
78  source = message.find('source').text
79  translation = message.find('translation')
80  if has_context and source in sources[context_name]:
81  sources[context_name].remove(source)
82 
83  trtype = translation.attrib.get('type')
84  if (trtype == 'obsolete') or (trtype == 'vanished'):
85  del translation.attrib['type'] # i.e. finished
86  else:
87  if no_obsolete or (translation.attrib.get('type', '') == 'unfinished'):
88  context.remove(message)
89  else:
90  translation.attrib['type'] = 'vanished'
91 
92  if not has_context:
93  continue
94 
95  # add new messages for current context
96  for source in sources[context_name]:
97  message = ET.SubElement(context, 'message')
98  ET.SubElement(message, 'source').text = source
99  ET.SubElement(message, 'translation', {'type': 'unfinished'})
100  del sources[context_name]
101 
102  # add messages for new contexts
103  for context_name in sources:
104  context = ET.SubElement(root, 'context')
105  ET.SubElement(context, 'name').text = context_name
106 
107  for source in sources[context_name]:
108  message = ET.SubElement(context, 'message')
109  ET.SubElement(message, 'source').text = source
110  ET.SubElement(message, 'translation', {'type': 'unfinished'})
111 
112  # prettify output xml
113  indent = ' ' * 4
114  root.text = '\n'
115  for context in root.findall('./context'):
116  context.text = '\n' + indent
117  context.tail = '\n'
118  context.find('./name').tail = '\n' + indent
119  messages = context.findall('./message')
120  if len(messages) == 0: continue
121 
122  for message in messages:
123  message.text = '\n' + (indent * 2)
124  message.tail = '\n' + indent
125  elems = message.findall('./')
126  if len(elems) == 0: continue
127 
128  for elem in elems:
129  elem.tail = '\n' + (indent * 2)
130  elems[-1:][0].tail = '\n' + indent
131  messages[-1:][0].tail = '\n'
132 
133  try:
134  with open(filename, mode = 'wb') as file:
135  file.write(b'<?xml version="1.0" encoding="utf-8"?>\n'
136  b'<!DOCTYPE TS>\n')
137  tree.write(file, encoding = 'utf-8')
138  except Exception:
139  print('\tFailed to write %s!' % (os.path.normpath(filename)))
140 
def processTranslation(filename, sources)
Definition: tstool.py:57

Variable Documentation

◆ accepted_exts

list tstool.accepted_exts = [".js", ".html", ".css"]

Definition at line 38 of file tstool.py.

◆ action

◆ argp

tstool.argp
Initial value:
1 = argparse.ArgumentParser(
2  prog = 'tstool.py', description = 'Update qBittorrent WebUI translation files.')

Definition at line 141 of file tstool.py.

◆ args

◆ default

tstool.default

Definition at line 144 of file tstool.py.

◆ dest

tstool.dest

Definition at line 143 of file tstool.py.

◆ help

tstool.help

Definition at line 145 of file tstool.py.

Referenced by displayBadArgMessage().

◆ nfiles

int tstool.nfiles = 0

Definition at line 159 of file tstool.py.

◆ no_obsolete

bool tstool.no_obsolete = False

Definition at line 40 of file tstool.py.

◆ nstrings

tstool.nstrings = sum(len(sublist) for sublist in source_ts)

Definition at line 171 of file tstool.py.

◆ source_ts

dictionary tstool.source_ts = {}

Definition at line 160 of file tstool.py.

◆ ts_folder

tstool.ts_folder = os.path.join(www_folder, "translations")

Definition at line 42 of file tstool.py.

◆ www_folder

string tstool.www_folder = "."

Definition at line 41 of file tstool.py.