blender-addons/ui_translate/settings.py
2023-07-05 09:41:03 +02:00

203 lines
6.6 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SPDX-License-Identifier: GPL-2.0-or-later
import os
if "bpy" in locals():
import importlib
importlib.reload(settings_i18n)
else:
import bpy
from bpy.types import (
Operator,
AddonPreferences,
)
from bpy.props import (
BoolProperty,
StringProperty,
)
from bl_i18n_utils import settings as settings_i18n
settings = settings_i18n.I18nSettings()
# Operators ###################################################################
class UI_OT_i18n_settings_load(Operator):
"""Load translations' settings from a persistent JSon file"""
bl_idname = "ui.i18n_settings_load"
bl_label = "I18n Load Settings"
bl_option = {'REGISTER'}
# Operator Arguments
filepath: StringProperty(
subtype='FILE_PATH',
description="Path to the saved settings file",
)
filter_glob: StringProperty(
default="*.json",
options={'HIDDEN'}
)
# /End Operator Arguments
def invoke(self, context, event):
if not self.properties.is_property_set("filepath"):
context.window_manager.fileselect_add(self)
return {'RUNNING_MODAL'}
else:
return self.execute(context)
def execute(self, context):
if not (self.filepath and settings):
return {'CANCELLED'}
settings.load(self.filepath, reset=True)
return {'FINISHED'}
class UI_OT_i18n_settings_save(Operator):
"""Save translations' settings in a persistent JSon file"""
bl_idname = "ui.i18n_settings_save"
bl_label = "I18n Save Settings"
bl_option = {'REGISTER'}
# Operator Arguments
filepath: StringProperty(
description="Path to the saved settings file",
subtype='FILE_PATH',
)
filter_glob: StringProperty(
default="*.json",
options={'HIDDEN'},
)
# /End Operator Arguments
def invoke(self, context, event):
if not self.properties.is_property_set("filepath"):
context.window_manager.fileselect_add(self)
return {'RUNNING_MODAL'}
else:
return self.execute(context)
def execute(self, context):
if not (self.filepath and settings):
return {'CANCELLED'}
settings.save(self.filepath)
return {'FINISHED'}
# Addon Preferences ###########################################################
def _setattr(self, name, val):
print(self, name, val)
setattr(self, name, val)
class UI_AP_i18n_settings(AddonPreferences):
bl_idname = __name__.split(".")[0] # We want "top" module name!
bl_option = {'REGISTER'}
_settings = settings
WARN_MSGID_NOT_CAPITALIZED: BoolProperty(
name="Warn Msgid Not Capitalized",
description="Warn about messages not starting by a capitalized letter (with a few allowed exceptions!)",
default=True,
get=lambda self: self._settings.WARN_MSGID_NOT_CAPITALIZED,
set=lambda self, val: _setattr(self._settings, "WARN_MSGID_NOT_CAPITALIZED", val),
)
GETTEXT_MSGFMT_EXECUTABLE: StringProperty(
name="Gettext 'msgfmt' executable",
description="The gettext msgfmt 'compiler'. Youll likely have to edit it if youre under Windows",
subtype='FILE_PATH',
default="msgfmt",
get=lambda self: self._settings.GETTEXT_MSGFMT_EXECUTABLE,
set=lambda self, val: setattr(self._settings, "GETTEXT_MSGFMT_EXECUTABLE", val),
)
FRIBIDI_LIB: StringProperty(
name="Fribidi Library",
description="The FriBidi C compiled library (.so under Linux, .dll under windows...), youll likely have "
"to edit it if youre under Windows, e.g. using the one included in svn's libraries repository",
subtype='FILE_PATH',
default="libfribidi.so.0",
get=lambda self: self._settings.FRIBIDI_LIB,
set=lambda self, val: setattr(self._settings, "FRIBIDI_LIB", val),
)
SOURCE_DIR: StringProperty(
name="Source Root",
description="The Blender source root path",
subtype='FILE_PATH',
default="blender",
get=lambda self: self._settings.SOURCE_DIR,
set=lambda self, val: setattr(self._settings, "SOURCE_DIR", val),
)
I18N_DIR: StringProperty(
name="Translation Root",
description="The bf-translation repository",
subtype='FILE_PATH',
default="i18n",
get=lambda self: self._settings.I18N_DIR,
set=lambda self, val: setattr(self._settings, "I18N_DIR", val),
)
SPELL_CACHE: StringProperty(
name="Spell Cache",
description="A cache storing validated msgids, to avoid re-spellchecking them",
subtype='FILE_PATH',
default=os.path.join("/tmp", ".spell_cache"),
get=lambda self: self._settings.SPELL_CACHE,
set=lambda self, val: setattr(self._settings, "SPELL_CACHE", val),
)
PY_SYS_PATHS: StringProperty(
name="Import Paths",
description="Additional paths to add to sys.path (';' separated)",
default="",
get=lambda self: self._settings.PY_SYS_PATHS,
set=lambda self, val: setattr(self._settings, "PY_SYS_PATHS", val),
)
persistent_data_path: StringProperty(
name="Persistent Data Path",
description="The name of a json file storing those settings (unfortunately, Blender's system "
"does not work here)",
subtype='FILE_PATH',
default=os.path.join("ui_translate_settings.json"),
)
_is_init = False
def draw(self, context):
layout = self.layout
layout.label(text="WARNING: preferences are lost when add-on is disabled, be sure to use \"Save Persistent\" "
"if you want to keep your settings!")
layout.prop(self, "WARN_MSGID_NOT_CAPITALIZED")
layout.prop(self, "GETTEXT_MSGFMT_EXECUTABLE")
layout.prop(self, "FRIBIDI_LIB")
layout.prop(self, "SOURCE_DIR")
layout.prop(self, "I18N_DIR")
layout.prop(self, "SPELL_CACHE")
layout.prop(self, "PY_SYS_PATHS")
layout.separator()
split = layout.split(factor=0.75)
col = split.column()
col.prop(self, "persistent_data_path")
row = col.row()
row.operator("ui.i18n_settings_save", text="Save").filepath = self.persistent_data_path
row.operator("ui.i18n_settings_load", text="Load").filepath = self.persistent_data_path
col = split.column()
col.operator("ui.i18n_settings_save", text="Save Persistent To...")
col.operator("ui.i18n_settings_load", text="Load Persistent From...")
classes = (
UI_OT_i18n_settings_load,
UI_OT_i18n_settings_save,
UI_AP_i18n_settings,
)