added language selection

This commit is contained in:
DYefremov
2020-01-02 15:47:48 +03:00
parent 614c87cbf3
commit d0638f7158
5 changed files with 119 additions and 23 deletions

View File

@@ -1,5 +1,6 @@
import copy
import json
import locale
import os
from enum import Enum, IntEnum
from pathlib import Path
@@ -92,7 +93,6 @@ class Settings:
settings = ext_settings or get_settings()
if self.__VERSION > settings.get("version", 0):
write_settings(get_default_settings())
raise SettingsException("Outdated version of the settings format!")
self._settings = settings
@@ -127,6 +127,10 @@ class Settings:
if force_write:
self.save()
@staticmethod
def reset_to_default():
write_settings(get_default_settings())
def get_default(self, p_name):
""" Returns default value for current settings type """
return self.setting_type.get_default_settings().get(p_name)
@@ -185,6 +189,14 @@ class Settings:
for k, v in s_type.get_default_settings().items():
self._cp_settings[k] = v
@property
def language(self):
return self._settings.get("language", locale.getlocale()[0] or "en_US")
@language.setter
def language(self, value):
self._settings["language"] = value
@property
def host(self):
return self._cp_settings.get("host", self.get_default("host"))

View File

@@ -2123,6 +2123,7 @@ def start_app():
except SettingsException as e:
msg = "{} \n{}".format(e, "All setting were reset. Restart the program!")
show_dialog(DialogType.INFO, transient=Gtk.Dialog(), text=msg)
Settings.reset_to_default()
else:
app = Application()
app.run(sys.argv)

View File

@@ -1090,6 +1090,72 @@ Author: Dmitriy Yefremov
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkFrame" id="lang_frame">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<property name="label_xalign">0</property>
<property name="shadow_type">in</property>
<child>
<object class="GtkBox" id="lang_box">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">5</property>
<property name="margin_right">5</property>
<property name="margin_top">5</property>
<property name="margin_bottom">5</property>
<child>
<object class="GtkLabel" id="lang_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Language:</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkComboBoxText" id="lang_combo_box">
<property name="width_request">150</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="focus_on_click">False</property>
<property name="active">0</property>
<items>
<item id="en_US" translatable="yes">English</item>
<item id="de_DE" translatable="yes">Deutsch</item>
<item id="es_ES" translatable="yes">Español</item>
<item id="nl_NL" translatable="yes">Nederlands</item>
<item id="pt_PT" translatable="yes">Português</item>
<item id="ru_RU" translatable="yes">Русский</item>
</items>
<signal name="changed" handler="on_lang_changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack_type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="settings_type_frame">
<property name="visible">True</property>
@@ -1175,7 +1241,7 @@ Author: Dmitriy Yefremov
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
<property name="position">1</property>
</packing>
</child>
<child>
@@ -1312,7 +1378,7 @@ Author: Dmitriy Yefremov
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
<property name="position">2</property>
</packing>
</child>
<child>
@@ -1394,7 +1460,7 @@ Author: Dmitriy Yefremov
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="position">3</property>
</packing>
</child>
</object>

View File

@@ -41,7 +41,8 @@ class SettingsDialog:
"on_profile_inserted": self.on_profile_inserted,
"on_profile_edited": self.on_profile_edited,
"on_profile_selected": self.on_profile_selected,
"on_profile_set_default": self.on_profile_set_default}
"on_profile_set_default": self.on_profile_set_default,
"on_lang_changed": self.on_lang_changed}
builder = Gtk.Builder()
builder.add_from_file(UI_RESOURCES_PATH + "settings_dialog.glade")
@@ -104,6 +105,8 @@ class SettingsDialog:
self._profile_view = builder.get_object("profile_tree_view")
self._profile_add_button = builder.get_object("profile_add_button")
self._profile_remove_button = builder.get_object("profile_remove_button")
# Language
self._lang_combo_box = builder.get_object("lang_combo_box")
# Settings
self._settings = settings
self._profiles = self._settings.profiles
@@ -122,6 +125,7 @@ class SettingsDialog:
self._extra_support_grid.set_sensitive(is_enigma_profile)
http_active = self._support_http_api_switch.get_active()
self._click_mode_zap_button.set_sensitive(is_enigma_profile and http_active)
self._lang_combo_box.set_active_id(self._settings.language)
self.on_info_bar_close() if is_enigma_profile else self.show_info_message(
"The Neutrino has only experimental support. Not all features are supported!", Gtk.MessageType.WARNING)
@@ -226,6 +230,7 @@ class SettingsDialog:
self._settings.backup_before_save = self._before_save_switch.get_active()
self._settings.backup_before_downloading = self._before_downloading_switch.get_active()
self._settings.fav_click_mode = self.get_fav_click_mode()
self._settings.language = self._lang_combo_box.get_active_id()
if self._s_type is SettingsType.ENIGMA_2:
self._settings.use_colors = self._set_color_switch.get_active()
@@ -339,6 +344,7 @@ class SettingsDialog:
is_default = row[1]
self._profiles.pop(row[0], None)
del model[paths]
if is_default:
model.set_value(model.get_iter_first(), 1, DEFAULT_ICON)
@@ -361,21 +367,24 @@ class SettingsDialog:
self.update_local_paths(new_value)
self.on_profile_selected(self._profile_view)
def update_local_paths(self, profile_name):
def update_local_paths(self, p_name):
data_path = self._settings.data_local_path
self._settings.data_local_path = "{}/{}/".format(Path(data_path).parent, profile_name)
if os.path.isdir(data_path):
os.rename(data_path, self._settings.data_local_path)
picons_path = self._settings.picons_local_path
self._settings.picons_local_path = "{}/{}/".format(Path(picons_path).parent, profile_name)
if os.path.isdir(picons_path):
os.rename(picons_path, self._settings.picons_local_path)
backup_path = self._settings.backup_local_path
self._settings.backup_local_path = "{}/{}/".format(Path(self._settings.backup_local_path).parent, profile_name)
if os.path.isdir(backup_path):
os.rename(backup_path, self._settings.backup_local_path)
try:
if os.path.isdir(picons_path):
os.rename(picons_path, self._settings.picons_local_path)
if os.path.isdir(data_path):
os.rename(data_path, self._settings.data_local_path)
if os.path.isdir(backup_path):
os.rename(backup_path, self._settings.backup_local_path)
except OSError as e:
self.show_info_message(str(e), Gtk.MessageType.ERROR)
else:
self._settings.data_local_path = "{}/{}/".format(Path(data_path).parent, p_name)
self._settings.picons_local_path = "{}/{}/".format(Path(picons_path).parent, p_name)
self._settings.backup_local_path = "{}/{}/".format(Path(self._settings.backup_local_path).parent, p_name)
def on_profile_selected(self, view):
model, paths = self._profile_view.get_selection().get_selected_rows()
@@ -395,6 +404,10 @@ class SettingsDialog:
def on_profile_inserted(self, model, path, itr):
self._profile_remove_button.set_sensitive(len(model) > 1)
def on_lang_changed(self, box):
if box.get_active_id() != self._settings.language:
self.show_info_message("Save and restart the program to apply the settings.", Gtk.MessageType.WARNING)
@run_idle
def set_fav_click_mode(self, mode):
mode = FavClickMode(mode)

View File

@@ -1,9 +1,9 @@
import locale
import os
from enum import Enum, IntEnum
from app.settings import Settings, SettingsException
import gi
from enum import Enum, IntEnum
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
@@ -11,12 +11,16 @@ from gi.repository import Gtk, Gdk
UI_RESOURCES_PATH = "app/ui/" if os.path.exists("app/ui/") else "/usr/share/demoneditor/app/ui/"
IS_GNOME_SESSION = int(bool(os.environ.get("GNOME_DESKTOP_SESSION_ID")))
# translation
TEXT_DOMAIN = "demon-editor"
if UI_RESOURCES_PATH == "app/ui/":
LANG_DIR = UI_RESOURCES_PATH + "lang"
locale.bindtextdomain(TEXT_DOMAIN, UI_RESOURCES_PATH + "lang")
try:
settings = Settings.get_instance()
except SettingsException:
pass
else:
os.environ["LANGUAGE"] = settings.language
if UI_RESOURCES_PATH == "app/ui/":
locale.bindtextdomain(TEXT_DOMAIN, UI_RESOURCES_PATH + "lang")
theme = Gtk.IconTheme.get_default()
_IMAGE_MISSING = theme.load_icon("image-missing", 16, 0) if theme.lookup_icon("image-missing", 16, 0) else None