Listing the "Blender Foundation" as copyright holder implied the Blender Foundation holds copyright to files which may include work from many developers. While keeping copyright on headers makes sense for isolated libraries, Blender's own code may be refactored or moved between files in a way that makes the per file copyright holders less meaningful. Copyright references to the "Blender Foundation" have been replaced with "Blender Authors", with the exception of `./extern/` since these this contains libraries which are more isolated, any changed to license headers there can be handled on a case-by-case basis. Some directories in `./intern/` have also been excluded: - `./intern/cycles/` it's own `AUTHORS` file is planned. - `./intern/opensubdiv/`. An "AUTHORS" file has been added, using the chromium projects authors file as a template. Design task: #110784 Ref !110783.
82 lines
3.0 KiB
Python
Executable File
82 lines
3.0 KiB
Python
Executable File
# SPDX-FileCopyrightText: 2013-2023 Blender Authors
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
# Update "languages" text file used by Blender at runtime to build translations menu.
|
|
|
|
|
|
import os
|
|
|
|
|
|
OK = 0
|
|
MISSING = 1
|
|
TOOLOW = 2
|
|
SKIPPED = 3
|
|
FLAG_MESSAGES = {
|
|
OK: "",
|
|
MISSING: "No translation yet.",
|
|
TOOLOW: "Not complete enough to be included.",
|
|
SKIPPED: "Skipped (see IMPORT_LANGUAGES_SKIP in settings.py).",
|
|
}
|
|
|
|
|
|
def gen_menu_file(stats, settings):
|
|
# Generate languages file content used by Blender's i18n system.
|
|
# First, match all entries in LANGUAGES to a lang in stats, if possible!
|
|
# Returns a iterable of text lines.
|
|
tmp = []
|
|
for uid_num, label, uid in settings.LANGUAGES:
|
|
if uid in stats:
|
|
if uid in settings.IMPORT_LANGUAGES_SKIP:
|
|
tmp.append((stats[uid], uid_num, label, uid, SKIPPED))
|
|
else:
|
|
tmp.append((stats[uid], uid_num, label, uid, OK))
|
|
else:
|
|
tmp.append((0.0, uid_num, label, uid, MISSING))
|
|
stats = tmp
|
|
limits = sorted(settings.LANGUAGES_CATEGORIES, key=lambda it: it[0], reverse=True)
|
|
idx = 0
|
|
stats = sorted(stats, key=lambda it: it[0], reverse=True)
|
|
langs_cats = [[] for i in range(len(limits))]
|
|
highest_uid = 0
|
|
for lvl, uid_num, label, uid, flag in stats:
|
|
if lvl < limits[idx][0]:
|
|
# Sub-sort languages by iso-codes.
|
|
langs_cats[idx].sort(key=lambda it: it[2])
|
|
idx += 1
|
|
if lvl < settings.IMPORT_MIN_LEVEL and flag == OK:
|
|
flag = TOOLOW
|
|
langs_cats[idx].append((uid_num, label, uid, flag))
|
|
if abs(uid_num) > highest_uid:
|
|
highest_uid = abs(uid_num)
|
|
# Sub-sort last group of languages by iso-codes!
|
|
langs_cats[idx].sort(key=lambda it: it[2])
|
|
data_lines = [
|
|
"# File used by Blender to know which languages (translations) are available, ",
|
|
"# and to generate translation menu.",
|
|
"#",
|
|
"# File format:",
|
|
"# ID:MENULABEL:ISOCODE",
|
|
"# ID must be unique, except for 0 value (marks categories for menu).",
|
|
"# Line starting with a # are comments!",
|
|
"#",
|
|
"# Automatically generated by bl_i18n_utils/update_languages_menu.py script.",
|
|
"# Highest ID currently in use: {}".format(highest_uid),
|
|
]
|
|
for cat, langs_cat in zip(limits, langs_cats):
|
|
data_lines.append("#")
|
|
# Write "category menu label"...
|
|
if langs_cat:
|
|
data_lines.append("0:{}:".format(cat[1]))
|
|
else:
|
|
# Do not write the category if it has no language!
|
|
data_lines.append("# Void category! #0:{}:".format(cat[1]))
|
|
# ...and all matching language entries!
|
|
for uid_num, label, uid, flag in langs_cat:
|
|
if flag == OK:
|
|
data_lines.append("{}:{}:{}".format(uid_num, label, uid))
|
|
else:
|
|
# Non-existing, commented entry!
|
|
data_lines.append("# {} #{}:{}:{}".format(FLAG_MESSAGES[flag], uid_num, label, uid))
|
|
return data_lines
|