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

View File

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

View File

@@ -1090,6 +1090,72 @@ Author: Dmitriy Yefremov
<property name="visible">True</property> <property name="visible">True</property>
<property name="can_focus">False</property> <property name="can_focus">False</property>
<property name="orientation">vertical</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> <child>
<object class="GtkFrame" id="settings_type_frame"> <object class="GtkFrame" id="settings_type_frame">
<property name="visible">True</property> <property name="visible">True</property>
@@ -1175,7 +1241,7 @@ Author: Dmitriy Yefremov
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">0</property> <property name="position">1</property>
</packing> </packing>
</child> </child>
<child> <child>
@@ -1312,7 +1378,7 @@ Author: Dmitriy Yefremov
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">1</property> <property name="position">2</property>
</packing> </packing>
</child> </child>
<child> <child>
@@ -1394,7 +1460,7 @@ Author: Dmitriy Yefremov
<packing> <packing>
<property name="expand">False</property> <property name="expand">False</property>
<property name="fill">True</property> <property name="fill">True</property>
<property name="position">2</property> <property name="position">3</property>
</packing> </packing>
</child> </child>
</object> </object>

View File

@@ -41,7 +41,8 @@ class SettingsDialog:
"on_profile_inserted": self.on_profile_inserted, "on_profile_inserted": self.on_profile_inserted,
"on_profile_edited": self.on_profile_edited, "on_profile_edited": self.on_profile_edited,
"on_profile_selected": self.on_profile_selected, "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 = Gtk.Builder()
builder.add_from_file(UI_RESOURCES_PATH + "settings_dialog.glade") 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_view = builder.get_object("profile_tree_view")
self._profile_add_button = builder.get_object("profile_add_button") self._profile_add_button = builder.get_object("profile_add_button")
self._profile_remove_button = builder.get_object("profile_remove_button") self._profile_remove_button = builder.get_object("profile_remove_button")
# Language
self._lang_combo_box = builder.get_object("lang_combo_box")
# Settings # Settings
self._settings = settings self._settings = settings
self._profiles = self._settings.profiles self._profiles = self._settings.profiles
@@ -122,6 +125,7 @@ class SettingsDialog:
self._extra_support_grid.set_sensitive(is_enigma_profile) self._extra_support_grid.set_sensitive(is_enigma_profile)
http_active = self._support_http_api_switch.get_active() http_active = self._support_http_api_switch.get_active()
self._click_mode_zap_button.set_sensitive(is_enigma_profile and http_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( 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) "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_save = self._before_save_switch.get_active()
self._settings.backup_before_downloading = self._before_downloading_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.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: if self._s_type is SettingsType.ENIGMA_2:
self._settings.use_colors = self._set_color_switch.get_active() self._settings.use_colors = self._set_color_switch.get_active()
@@ -339,6 +344,7 @@ class SettingsDialog:
is_default = row[1] is_default = row[1]
self._profiles.pop(row[0], None) self._profiles.pop(row[0], None)
del model[paths] del model[paths]
if is_default: if is_default:
model.set_value(model.get_iter_first(), 1, DEFAULT_ICON) model.set_value(model.get_iter_first(), 1, DEFAULT_ICON)
@@ -361,21 +367,24 @@ class SettingsDialog:
self.update_local_paths(new_value) self.update_local_paths(new_value)
self.on_profile_selected(self._profile_view) 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 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 picons_path = self._settings.picons_local_path
self._settings.picons_local_path = "{}/{}/".format(Path(picons_path).parent, profile_name) backup_path = self._settings.backup_local_path
try:
if os.path.isdir(picons_path): if os.path.isdir(picons_path):
os.rename(picons_path, self._settings.picons_local_path) os.rename(picons_path, self._settings.picons_local_path)
if os.path.isdir(data_path):
backup_path = self._settings.backup_local_path os.rename(data_path, self._settings.data_local_path)
self._settings.backup_local_path = "{}/{}/".format(Path(self._settings.backup_local_path).parent, profile_name)
if os.path.isdir(backup_path): if os.path.isdir(backup_path):
os.rename(backup_path, self._settings.backup_local_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): def on_profile_selected(self, view):
model, paths = self._profile_view.get_selection().get_selected_rows() model, paths = self._profile_view.get_selection().get_selected_rows()
@@ -395,6 +404,10 @@ class SettingsDialog:
def on_profile_inserted(self, model, path, itr): def on_profile_inserted(self, model, path, itr):
self._profile_remove_button.set_sensitive(len(model) > 1) 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 @run_idle
def set_fav_click_mode(self, mode): def set_fav_click_mode(self, mode):
mode = FavClickMode(mode) mode = FavClickMode(mode)

View File

@@ -1,9 +1,9 @@
import locale import locale
import os import os
from enum import Enum, IntEnum
from app.settings import Settings, SettingsException
import gi import gi
from enum import Enum, IntEnum
gi.require_version('Gtk', '3.0') gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk from gi.repository import Gtk, Gdk
@@ -11,11 +11,15 @@ from gi.repository import Gtk, Gdk
UI_RESOURCES_PATH = "app/ui/" if os.path.exists("app/ui/") else "/usr/share/demoneditor/app/ui/" 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"))) IS_GNOME_SESSION = int(bool(os.environ.get("GNOME_DESKTOP_SESSION_ID")))
# translation # translation
TEXT_DOMAIN = "demon-editor" TEXT_DOMAIN = "demon-editor"
try:
settings = Settings.get_instance()
except SettingsException:
pass
else:
os.environ["LANGUAGE"] = settings.language
if UI_RESOURCES_PATH == "app/ui/": if UI_RESOURCES_PATH == "app/ui/":
LANG_DIR = UI_RESOURCES_PATH + "lang"
locale.bindtextdomain(TEXT_DOMAIN, UI_RESOURCES_PATH + "lang") locale.bindtextdomain(TEXT_DOMAIN, UI_RESOURCES_PATH + "lang")
theme = Gtk.IconTheme.get_default() theme = Gtk.IconTheme.get_default()