58 import xml.dom.minidom
as xml
63 path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
64 if path
not in sys.path:
67 import classes.info
as info
68 from classes.logger
import log
71 language_folder_path = os.path.dirname(os.path.abspath(__file__))
72 openshot_path = os.path.dirname(language_folder_path)
73 effects_path = os.path.join(openshot_path,
'effects')
74 blender_path = os.path.join(openshot_path,
'blender')
75 transitions_path = os.path.join(openshot_path,
'transitions')
76 titles_path = os.path.join(openshot_path,
'titles')
77 export_path = os.path.join(openshot_path,
'presets')
78 windows_ui_path = os.path.join(openshot_path,
'windows',
'ui')
80 log.info(
"-----------------------------------------------------")
81 log.info(
" Creating temp POT files")
82 log.info(
"-----------------------------------------------------")
85 temp_files = [
'OpenShot_source.pot',
'OpenShot_glade.pot',
'OpenShot_effects.pot',
'OpenShot_export.pot',
86 'OpenShot_transitions.pot',
'OpenShot_QtUi.pot']
87 for temp_file_name
in temp_files:
88 temp_file_path = os.path.join(language_folder_path, temp_file_name)
89 if os.path.exists(temp_file_path):
90 os.remove(temp_file_path)
91 f = open(temp_file_path,
"w")
94 log.info(
"-----------------------------------------------------")
95 log.info(
" Using xgettext to generate .py POT files")
96 log.info(
"-----------------------------------------------------")
99 subprocess.call(
'find %s -iname "*.py" -exec xgettext -j -o %s --keyword=_ {} \;' % (
100 openshot_path, os.path.join(language_folder_path,
'OpenShot_source.pot')), shell=
True)
102 log.info(
"-----------------------------------------------------")
103 log.info(
" Using Qt's lupdate to generate .ui POT files")
104 log.info(
"-----------------------------------------------------")
107 os.chdir(windows_ui_path)
108 subprocess.call(
'lupdate *.ui -ts %s' % (os.path.join(language_folder_path,
'OpenShot_QtUi.ts')), shell=
True)
109 subprocess.call(
'lupdate *.ui -ts %s' % (os.path.join(language_folder_path,
'OpenShot_QtUi.pot')), shell=
True)
110 os.chdir(language_folder_path)
113 output = open(os.path.join(language_folder_path,
"clean.po"),
'w')
114 for line
in open(os.path.join(language_folder_path,
'OpenShot_QtUi.pot'),
'r'):
115 if not line.startswith(
'msgctxt'):
119 shutil.copy(os.path.join(language_folder_path,
"clean.po"), os.path.join(language_folder_path,
'OpenShot_QtUi.pot'))
120 os.remove(os.path.join(language_folder_path,
"clean.po"))
123 subprocess.call(
'msguniq %s --use-first -o %s' % (os.path.join(language_folder_path,
'OpenShot_QtUi.pot'),
124 os.path.join(language_folder_path,
'clean.po')), shell=
True)
125 shutil.copy(os.path.join(language_folder_path,
"clean.po"), os.path.join(language_folder_path,
'OpenShot_QtUi.pot'))
126 os.remove(os.path.join(language_folder_path,
"clean.po"))
129 log.info(
"-----------------------------------------------------")
130 log.info(
" Updating auto created POT files to set CharSet")
131 log.info(
"-----------------------------------------------------")
133 temp_files = [
'OpenShot_source.pot',
'OpenShot_glade.pot']
134 for temp_file
in temp_files:
136 f = open(os.path.join(language_folder_path, temp_file),
"r")
138 entire_source = f.read()
142 entire_source = entire_source.replace(
"charset=CHARSET",
"charset=UTF-8")
145 if os.path.exists(os.path.join(language_folder_path, temp_file)):
146 os.remove(os.path.join(language_folder_path, temp_file))
147 f = open(os.path.join(language_folder_path, temp_file),
"w")
148 f.write(entire_source)
151 log.info(
"-----------------------------------------------------")
152 log.info(
" Scanning custom XML files and finding text")
153 log.info(
"-----------------------------------------------------")
157 for file
in os.listdir(effects_path):
158 if os.path.isfile(os.path.join(effects_path, file)):
160 full_file_path = os.path.join(effects_path, file)
161 xmldoc = xml.parse(os.path.join(effects_path, file))
164 effects_text[xmldoc.getElementsByTagName(
"title")[0].childNodes[0].data] = full_file_path
165 effects_text[xmldoc.getElementsByTagName(
"description")[0].childNodes[0].data] = full_file_path
168 params = xmldoc.getElementsByTagName(
"param")
172 if param.attributes[
"title"]:
173 effects_text[param.attributes[
"title"].value] = full_file_path
176 objects = [openshot.Clip(), openshot.Bars(), openshot.Blur(), openshot.Brightness(),
177 openshot.ChromaKey(), openshot.ColorShift(), openshot.Crop(), openshot.Deinterlace(), openshot.Hue(), openshot.Mask(),
178 openshot.Negate(), openshot.Pixelate(), openshot.Saturation(), openshot.Shift(), openshot.Wave()]
181 for object
in objects:
182 props = json.loads(object.PropertiesJSON(1))
185 for key
in props.keys():
187 if "name" in object.keys():
188 effects_text[object[
"name"]] =
"libopenshot (Clip Properties)"
189 if "choices" in object.keys():
190 for choice
in object[
"choices"]:
191 effects_text[choice[
"name"]] =
"libopenshot (Clip Properties)"
194 e = openshot.EffectInfo()
195 props = json.loads(e.Json())
200 effects_text[effect[
"name"]] =
"libopenshot (Effect Metadata)"
201 if "description" in effect:
202 effects_text[effect[
"description"]] =
"libopenshot (Effect Metadata)"
205 for file
in os.listdir(blender_path):
206 if os.path.isfile(os.path.join(blender_path, file)):
208 full_file_path = os.path.join(blender_path, file)
209 xmldoc = xml.parse(os.path.join(blender_path, file))
212 effects_text[xmldoc.getElementsByTagName(
"title")[0].childNodes[0].data] = full_file_path
215 params = xmldoc.getElementsByTagName(
"param")
219 if param.attributes[
"title"]:
220 effects_text[param.attributes[
"title"].value] = full_file_path
224 for file
in os.listdir(export_path):
225 if os.path.isfile(os.path.join(export_path, file)):
227 full_file_path = os.path.join(export_path, file)
228 xmldoc = xml.parse(os.path.join(export_path, file))
231 export_text[xmldoc.getElementsByTagName(
"type")[0].childNodes[0].data] = full_file_path
232 export_text[xmldoc.getElementsByTagName(
"title")[0].childNodes[0].data] = full_file_path
235 settings_file = open(os.path.join(info.PATH,
'settings',
'_default.settings'),
'r').read()
236 settings = json.loads(settings_file)
238 for setting
in settings:
239 if "type" in setting
and setting[
"type"] !=
"hidden":
241 export_text[setting[
"title"]] =
"Settings for %s" % setting[
"setting"]
242 if "type" in setting
and setting[
"type"] !=
"hidden":
244 if setting[
"category"]
not in category_names:
245 export_text[setting[
"category"]] =
"Settings Category for %s" % setting[
"category"]
246 category_names.append(setting[
"category"])
249 transitions_text = {}
250 for file
in os.listdir(transitions_path):
252 full_file_path = os.path.join(transitions_path, file)
253 (fileBaseName, fileExtension) = os.path.splitext(file)
256 name = fileBaseName.replace(
"_",
" ").capitalize()
259 transitions_text[name] = full_file_path
262 for sub_file
in os.listdir(full_file_path):
264 full_subfile_path = os.path.join(full_file_path, sub_file)
265 (fileBaseName, fileExtension) = os.path.splitext(sub_file)
269 name_parts = fileBaseName.split(
"_")
270 if name_parts[-1].isdigit():
271 suffix_number = name_parts[-1]
274 name = fileBaseName.replace(
"_",
" ").capitalize()
278 name = name.replace(suffix_number,
"%s")
281 transitions_text[name] = full_subfile_path
284 for sub_file
in os.listdir(titles_path):
286 full_subfile_path = os.path.join(titles_path, sub_file)
287 (fileBaseName, fileExtension) = os.path.splitext(sub_file)
291 name_parts = fileBaseName.split(
"_")
292 if name_parts[-1].isdigit():
293 suffix_number = name_parts[-1]
296 name = fileBaseName.replace(
"_",
" ").capitalize()
300 name = name.replace(suffix_number,
"%s")
303 transitions_text[name] = full_subfile_path
306 log.info(
"-----------------------------------------------------")
307 log.info(
" Creating the custom XML POT files")
308 log.info(
"-----------------------------------------------------")
312 header_text = header_text +
'# OpenShot Video Editor POT Template File.\n'
313 header_text = header_text +
'# Copyright (C) 2008-2018 OpenShot Studios, LLC\n'
314 header_text = header_text +
'# This file is distributed under the same license as OpenShot.\n'
315 header_text = header_text +
'# Jonathan Thomas <Jonathan.Oomph@gmail.com>, 2018.\n'
316 header_text = header_text +
'#\n'
317 header_text = header_text +
'#, fuzzy\n'
318 header_text = header_text +
'msgid ""\n'
319 header_text = header_text +
'msgstr ""\n'
320 header_text = header_text +
'"Project-Id-Version: OpenShot Video Editor (version: %s)\\n"\n' % info.VERSION
321 header_text = header_text +
'"Report-Msgid-Bugs-To: Jonathan Thomas <Jonathan.Oomph@gmail.com>\\n"\n'
322 header_text = header_text +
'"POT-Creation-Date: %s\\n"\n' % datetime.datetime.now()
323 header_text = header_text +
'"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"\n'
324 header_text = header_text +
'"Last-Translator: Jonathan Thomas <Jonathan.Oomph@gmail.com>\\n"\n'
325 header_text = header_text +
'"Language-Team: https://translations.launchpad.net/+groups/launchpad-translators\\n"\n'
326 header_text = header_text +
'"MIME-Version: 1.0\\n"\n'
327 header_text = header_text +
'"Content-Type: text/plain; charset=UTF-8\\n"\n'
328 header_text = header_text +
'"Content-Transfer-Encoding: 8bit\\n"\n'
331 temp_files = [[
'OpenShot_effects.pot', effects_text], [
'OpenShot_export.pot', export_text],
332 [
'OpenShot_transitions.pot', transitions_text]]
333 for temp_file, text_dict
in temp_files:
334 f = open(temp_file,
"w")
340 for k, v
in text_dict.items():
343 f.write(
'#: %s\n' % v)
344 f.write(
'msgid "%s"\n' % k)
345 f.write(
'msgstr ""\n')
350 log.info(
"-----------------------------------------------------")
351 log.info(
" Combine all temp POT files using msgcat command ")
352 log.info(
" (this removes dupes) ")
353 log.info(
"-----------------------------------------------------")
355 temp_files = [
'OpenShot_source.pot',
'OpenShot_glade.pot',
'OpenShot_effects.pot',
'OpenShot_export.pot',
356 'OpenShot_transitions.pot',
'OpenShot_QtUi.pot']
358 for temp_file
in temp_files:
360 command = command +
" " + os.path.join(language_folder_path, temp_file)
361 command = command +
" -o " + os.path.join(language_folder_path,
"OpenShot.pot")
366 subprocess.call(command, shell=
True)
368 log.info(
"-----------------------------------------------------")
369 log.info(
" Create FINAL POT File from all temp POT files ")
370 log.info(
"-----------------------------------------------------")
373 f = open(os.path.join(language_folder_path,
"OpenShot.pot"),
"r")
375 entire_source = f.read()
379 if os.path.exists(os.path.join(language_folder_path,
"OpenShot.pot")):
380 os.remove(os.path.join(language_folder_path,
"OpenShot.pot"))
381 final = open(os.path.join(language_folder_path,
"OpenShot.pot"),
"w")
382 final.write(header_text)
386 start_pos = entire_source.find(
"#: ")
387 trimmed_source = entire_source[start_pos:]
390 final.write(trimmed_source)
396 log.info(
"-----------------------------------------------------")
397 log.info(
" Remove all temp POT files ")
398 log.info(
"-----------------------------------------------------")
401 temp_files = [
'OpenShot_source.pot',
'OpenShot_glade.pot',
'OpenShot_effects.pot',
'OpenShot_export.pot',
402 'OpenShot_transitions.pot',
'OpenShot_QtUi.pot',
'OpenShot_QtUi.ts']
403 for temp_file_name
in temp_files:
404 temp_file_path = os.path.join(language_folder_path, temp_file_name)
405 if os.path.exists(temp_file_path):
406 os.remove(temp_file_path)
409 log.info(
"-----------------------------------------------------")
410 log.info(
" The OpenShot.pot file has been successfully created ")
411 log.info(
" with all text in OpenShot.")
412 log.info(
"-----------------------------------------------------")