57 import xml.dom.minidom
as xml
62 path = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
63 if path
not in sys.path:
66 import classes.info
as info
67 from classes.logger
import log
70 langage_folder_path = os.path.dirname(os.path.abspath(__file__))
71 openshot_path = os.path.dirname(langage_folder_path)
72 effects_path = os.path.join(openshot_path,
'effects')
73 blender_path = os.path.join(openshot_path,
'blender')
74 transitions_path = os.path.join(openshot_path,
'transitions')
75 export_path = os.path.join(openshot_path,
'presets')
76 windows_ui_path = os.path.join(openshot_path,
'windows',
'ui')
77 locale_path = os.path.join(openshot_path,
'locale',
'OpenShot')
79 log.info(
"-----------------------------------------------------")
80 log.info(
" Creating temp POT files")
81 log.info(
"-----------------------------------------------------")
84 temp_files = [
'OpenShot_source.pot',
'OpenShot_glade.pot',
'OpenShot_effects.pot',
'OpenShot_export.pot',
85 'OpenShot_transitions.pot',
'OpenShot_QtUi.pot']
86 for temp_file_name
in temp_files:
87 temp_file_path = os.path.join(langage_folder_path, temp_file_name)
88 if os.path.exists(temp_file_path):
89 os.remove(temp_file_path)
90 f = open(temp_file_path,
"w")
93 log.info(
"-----------------------------------------------------")
94 log.info(
" Using xgettext to generate .py POT files")
95 log.info(
"-----------------------------------------------------")
98 subprocess.call(
'find %s -iname "*.py" -exec xgettext -j -o %s --keyword=_ {} \;' % (
99 openshot_path, os.path.join(langage_folder_path,
'OpenShot_source.pot')), shell=
True)
101 log.info(
"-----------------------------------------------------")
102 log.info(
" Using Qt's lupdate to generate .ui POT files")
103 log.info(
"-----------------------------------------------------")
106 os.chdir(windows_ui_path)
107 subprocess.call(
'lupdate *.ui -ts %s' % (os.path.join(langage_folder_path,
'OpenShot_QtUi.ts')), shell=
True)
108 subprocess.call(
'lupdate *.ui -ts %s' % (os.path.join(langage_folder_path,
'OpenShot_QtUi.pot')), shell=
True)
109 os.chdir(langage_folder_path)
112 output = open(os.path.join(langage_folder_path,
"clean.po"),
'w')
113 for line
in open(os.path.join(langage_folder_path,
'OpenShot_QtUi.pot'),
'r'): 114 if not line.startswith(
'msgctxt'):
118 shutil.copy(os.path.join(langage_folder_path,
"clean.po"), os.path.join(langage_folder_path,
'OpenShot_QtUi.pot'))
119 os.remove(os.path.join(langage_folder_path,
"clean.po"))
122 subprocess.call(
'msguniq %s --use-first -o %s' % (os.path.join(langage_folder_path,
'OpenShot_QtUi.pot'),
123 os.path.join(langage_folder_path,
'clean.po')), shell=
True)
124 shutil.copy(os.path.join(langage_folder_path,
"clean.po"), os.path.join(langage_folder_path,
'OpenShot_QtUi.pot'))
125 os.remove(os.path.join(langage_folder_path,
"clean.po"))
128 log.info(
"-----------------------------------------------------")
129 log.info(
" Updating auto created POT files to set CharSet")
130 log.info(
"-----------------------------------------------------")
132 temp_files = [
'OpenShot_source.pot',
'OpenShot_glade.pot']
133 for temp_file
in temp_files:
135 f = open(os.path.join(langage_folder_path, temp_file),
"r") 137 entire_source = f.read()
141 entire_source = entire_source.replace(
"charset=CHARSET",
"charset=UTF-8")
144 if os.path.exists(os.path.join(langage_folder_path, temp_file)):
145 os.remove(os.path.join(langage_folder_path, temp_file))
146 f = open(os.path.join(langage_folder_path, temp_file),
"w")
147 f.write(entire_source)
150 log.info(
"-----------------------------------------------------")
151 log.info(
" Scanning custom XML files and finding text")
152 log.info(
"-----------------------------------------------------")
156 for file
in os.listdir(effects_path):
157 if os.path.isfile(os.path.join(effects_path, file)):
159 full_file_path = os.path.join(effects_path, file)
160 xmldoc = xml.parse(os.path.join(effects_path, file))
163 effects_text[xmldoc.getElementsByTagName(
"title")[0].childNodes[0].data] = full_file_path
164 effects_text[xmldoc.getElementsByTagName(
"description")[0].childNodes[0].data] = full_file_path
167 params = xmldoc.getElementsByTagName(
"param")
171 if param.attributes[
"title"]:
172 effects_text[param.attributes[
"title"].value] = full_file_path
175 objects = [openshot.Clip(), openshot.Blur(), openshot.Brightness(),
176 openshot.ChromaKey(), openshot.Deinterlace(), openshot.Mask(),
177 openshot.Negate(), openshot.Saturation()]
180 for object
in objects:
181 props = json.loads(object.PropertiesJSON(1))
184 for key
in props.keys():
186 if "name" in object.keys():
187 effects_text[object[
"name"]] =
"libopenshot (Clip Properties)" 188 if "choices" in object.keys():
189 for choice
in object[
"choices"]:
190 effects_text[choice[
"name"]] =
"libopenshot (Clip Properties)" 193 e = openshot.EffectInfo()
194 props = json.loads(e.Json())
199 effects_text[effect[
"name"]] =
"libopenshot (Effect Metadata)" 200 if "description" in effect:
201 effects_text[effect[
"description"]] =
"libopenshot (Effect Metadata)" 204 for file
in os.listdir(blender_path):
205 if os.path.isfile(os.path.join(blender_path, file)):
207 full_file_path = os.path.join(blender_path, file)
208 xmldoc = xml.parse(os.path.join(blender_path, file))
211 effects_text[xmldoc.getElementsByTagName(
"title")[0].childNodes[0].data] = full_file_path
214 params = xmldoc.getElementsByTagName(
"param")
218 if param.attributes[
"title"]:
219 effects_text[param.attributes[
"title"].value] = full_file_path
223 for file
in os.listdir(export_path):
224 if os.path.isfile(os.path.join(export_path, file)):
226 full_file_path = os.path.join(export_path, file)
227 xmldoc = xml.parse(os.path.join(export_path, file))
230 export_text[xmldoc.getElementsByTagName(
"type")[0].childNodes[0].data] = full_file_path
231 export_text[xmldoc.getElementsByTagName(
"title")[0].childNodes[0].data] = full_file_path
234 settings_file = open(os.path.join(info.PATH,
'settings',
'_default.settings'),
'r').read() 235 settings = json.loads(settings_file) 237 for setting
in settings:
238 if "type" in setting
and setting[
"type"] !=
"hidden":
240 export_text[setting[
"title"]] =
"Settings for %s" % setting[
"setting"]
241 if "type" in setting
and setting[
"type"] !=
"hidden":
243 if setting[
"category"]
not in category_names:
244 export_text[setting[
"category"]] =
"Settings Category for %s" % setting[
"category"]
245 category_names.append(setting[
"category"])
248 transitions_text = {}
249 for file
in os.listdir(transitions_path):
251 full_file_path = os.path.join(transitions_path, file)
252 (fileBaseName, fileExtension) = os.path.splitext(file)
255 name = fileBaseName.replace(
"_",
" ").capitalize()
258 transitions_text[name] = full_file_path
261 for sub_file
in os.listdir(full_file_path):
263 full_subfile_path = os.path.join(full_file_path, sub_file)
264 (fileBaseName, fileExtension) = os.path.splitext(sub_file)
268 name_parts = fileBaseName.split(
"_")
269 if name_parts[-1].isdigit():
270 suffix_number = name_parts[-1]
273 name = fileBaseName.replace(
"_",
" ").capitalize()
277 name = name.replace(suffix_number,
"%s")
280 transitions_text[name] = full_subfile_path
283 log.info(
"-----------------------------------------------------")
284 log.info(
" Creating the custom XML POT files")
285 log.info(
"-----------------------------------------------------")
289 header_text = header_text +
'# OpenShot Video Editor POT Template File.\n' 290 header_text = header_text +
'# Copyright (C) 2008-2016 OpenShot Studios, LLC\n' 291 header_text = header_text +
'# This file is distributed under the same license as OpenShot.\n' 292 header_text = header_text +
'# Jonathan Thomas <Jonathan.Oomph@gmail.com>, 2016.\n' 293 header_text = header_text +
'#\n' 294 header_text = header_text +
'#, fuzzy\n' 295 header_text = header_text +
'msgid ""\n' 296 header_text = header_text +
'msgstr ""\n' 297 header_text = header_text +
'"Project-Id-Version: OpenShot Video Editor (version: %s)\\n"\n' % info.VERSION
298 header_text = header_text +
'"Report-Msgid-Bugs-To: Jonathan Thomas <Jonathan.Oomph@gmail.com>\\n"\n' 299 header_text = header_text +
'"POT-Creation-Date: %s\\n"\n' % datetime.datetime.now()
300 header_text = header_text +
'"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\\n"\n' 301 header_text = header_text +
'"Last-Translator: Jonathan Thomas <Jonathan.Oomph@gmail.com>\\n"\n' 302 header_text = header_text +
'"Language-Team: https://translations.launchpad.net/+groups/launchpad-translators\\n"\n' 303 header_text = header_text +
'"MIME-Version: 1.0\\n"\n' 304 header_text = header_text +
'"Content-Type: text/plain; charset=UTF-8\\n"\n' 305 header_text = header_text +
'"Content-Transfer-Encoding: 8bit\\n"\n' 308 temp_files = [[
'OpenShot_effects.pot', effects_text], [
'OpenShot_export.pot', export_text],
309 [
'OpenShot_transitions.pot', transitions_text]]
310 for temp_file, text_dict
in temp_files:
311 f = open(temp_file,
"w")
317 for k, v
in text_dict.items():
320 f.write(
'#: %s\n' % v)
321 f.write(
'msgid "%s"\n' % k)
322 f.write(
'msgstr ""\n')
327 log.info(
"-----------------------------------------------------")
328 log.info(
" Combine all temp POT files using msgcat command (this removes dupes) ")
329 log.info(
"-----------------------------------------------------")
331 temp_files = [
'OpenShot_source.pot',
'OpenShot_glade.pot',
'OpenShot_effects.pot',
'OpenShot_export.pot',
332 'OpenShot_transitions.pot',
'OpenShot_QtUi.pot']
334 for temp_file
in temp_files:
336 command = command +
" " + os.path.join(langage_folder_path, temp_file)
337 command = command +
" -o " + os.path.join(locale_path,
"OpenShot.pot")
342 subprocess.call(command, shell=
True)
344 log.info(
"-----------------------------------------------------")
345 log.info(
" Create FINAL POT File from all temp POT files ")
346 log.info(
"-----------------------------------------------------")
349 f = open(os.path.join(locale_path,
"OpenShot.pot"),
"r") 351 entire_source = f.read()
355 if os.path.exists(os.path.join(locale_path,
"OpenShot.pot")):
356 os.remove(os.path.join(locale_path,
"OpenShot.pot"))
357 final = open(os.path.join(locale_path,
"OpenShot.pot"),
"w")
358 final.write(header_text)
362 start_pos = entire_source.find(
"#: ")
363 trimmed_source = entire_source[start_pos:]
366 final.write(trimmed_source)
372 log.info(
"-----------------------------------------------------")
373 log.info(
" Remove all temp POT files ")
374 log.info(
"-----------------------------------------------------")
377 temp_files = [
'OpenShot_source.pot',
'OpenShot_glade.pot',
'OpenShot_effects.pot',
'OpenShot_export.pot',
378 'OpenShot_transitions.pot',
'OpenShot_QtUi.pot',
'OpenShot_QtUi.ts']
379 for temp_file_name
in temp_files:
380 temp_file_path = os.path.join(langage_folder_path, temp_file_name)
381 if os.path.exists(temp_file_path):
382 os.remove(temp_file_path)
385 log.info(
"-----------------------------------------------------")
386 log.info(
" The /openshot/locale/OpenShot/OpenShot.pot file has")
387 log.info(
" been successfully created with all text in OpenShot.")
388 log.info(
"-----------------------------------------------------")