Add language selection to settings dialog

This commit is contained in:
Gobinath 2017-01-10 17:22:55 +05:30
parent 177605d9bf
commit 60d102eb8d
11 changed files with 145 additions and 41 deletions

View File

@ -18,34 +18,39 @@
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk, GdkX11
from gi.repository import Gtk, Gdk, GdkX11, GObject
class SettingsDialog:
"""docstring for SettingsDialog"""
def __init__(self, config, language, on_save_settings, glade_file):
"""
Create and initialize SettingsDialog instance.
"""
def __init__(self, config, language, languages, on_save_settings, glade_file):
self.config = config
self.on_save_settings = on_save_settings
self.languages = []
builder = Gtk.Builder()
builder.add_from_file(glade_file)
builder.connect_signals(self)
self.window = builder.get_object("window_settings")
self.spin_short_break_duration = builder.get_object("spin_short_break_duration")
self.spin_long_break_duration = builder.get_object("spin_long_break_duration")
self.spin_interval_between_two_breaks = builder.get_object("spin_interval_between_two_breaks")
self.spin_short_between_long = builder.get_object("spin_short_between_long")
self.spin_time_to_prepare = builder.get_object("spin_time_to_prepare")
self.switch_strict_break = builder.get_object("switch_strict_break")
self.window = builder.get_object('window_settings')
self.spin_short_break_duration = builder.get_object('spin_short_break_duration')
self.spin_long_break_duration = builder.get_object('spin_long_break_duration')
self.spin_interval_between_two_breaks = builder.get_object('spin_interval_between_two_breaks')
self.spin_short_between_long = builder.get_object('spin_short_between_long')
self.spin_time_to_prepare = builder.get_object('spin_time_to_prepare')
self.switch_strict_break = builder.get_object('switch_strict_break')
self.cmb_language = builder.get_object('cmb_language')
builder.get_object("lbl_short_break").set_label(language['ui_controls']['short_break_duration'])
builder.get_object("lbl_long_break").set_label(language['ui_controls']['long_break_duration'])
builder.get_object("lbl_interval_bettween_breaks").set_label(language['ui_controls']['interval_between_two_breaks'])
builder.get_object("lbl_short_per_long").set_label(language['ui_controls']['no_of_short_breaks_between_two_long_breaks'])
builder.get_object("lbl_time_to_prepare").set_label(language['ui_controls']['time_to_prepare_for_break'])
builder.get_object("lbl_strict_break").set_label(language['ui_controls']['strict_break'])
builder.get_object("btn_cancel").set_label(language['ui_controls']['cancel'])
builder.get_object("btn_save").set_label(language['ui_controls']['save'])
builder.get_object('lbl_short_break').set_label(language['ui_controls']['short_break_duration'])
builder.get_object('lbl_long_break').set_label(language['ui_controls']['long_break_duration'])
builder.get_object('lbl_interval_bettween_breaks').set_label(language['ui_controls']['interval_between_two_breaks'])
builder.get_object('lbl_short_per_long').set_label(language['ui_controls']['no_of_short_breaks_between_two_long_breaks'])
builder.get_object('lbl_time_to_prepare').set_label(language['ui_controls']['time_to_prepare_for_break'])
builder.get_object('lbl_strict_break').set_label(language['ui_controls']['strict_break'])
builder.get_object('lbl_language').set_label(language['ui_controls']['language'])
builder.get_object('btn_cancel').set_label(language['ui_controls']['cancel'])
builder.get_object('btn_save').set_label(language['ui_controls']['save'])
self.spin_short_break_duration.set_value(config['short_break_duration'])
self.spin_long_break_duration.set_value(config['long_break_duration'])
@ -54,7 +59,24 @@ class SettingsDialog:
self.spin_time_to_prepare.set_value(config['pre_break_warning_time'])
self.switch_strict_break.set_active(config['strict_break'])
# Initialize the language combobox
language_list_store = Gtk.ListStore(GObject.TYPE_STRING)
language_index = 0
for key in sorted(languages.keys()):
language_list_store.append([languages[key]])
self.languages.append(key)
if key == config['language']:
self.cmb_language.set_active(language_index)
language_index += 1
self.cmb_language.set_model(language_list_store)
cell = Gtk.CellRendererText()
self.cmb_language.pack_start(cell, True)
self.cmb_language.add_attribute(cell, 'text', 0)
"""
Show the SettingsDialog.
"""
def show(self):
self.window.show_all()
@ -68,6 +90,7 @@ class SettingsDialog:
self.config['no_of_short_breaks_per_long_break'] = self.spin_short_between_long.get_value_as_int()
self.config['pre_break_warning_time'] = self.spin_time_to_prepare.get_value_as_int()
self.config['strict_break'] = self.switch_strict_break.get_active()
self.config['language'] = self.languages[self.cmb_language.get_active()]
self.on_save_settings(self.config) # Call the provided save method
self.window.destroy() # Close the settings window

View File

@ -36,6 +36,7 @@ class TrayIcon:
self.on_enable = on_enable
self.on_disable = on_disable
self.language = language
self.dateTime = None
# Construct the tray icon
self.indicator = appindicator.Indicator.new(APPINDICATOR_ID, "safeeyes_enabled", appindicator.IndicatorCategory.APPLICATION_STATUS)
@ -44,37 +45,57 @@ class TrayIcon:
# Construct the context menu
self.menu = Gtk.Menu()
self.item_info = Gtk.ImageMenuItem('Next break at 10.30 AM')
# Next break info menu item
self.item_info = Gtk.ImageMenuItem()
img_timer = Gtk.Image()
img_timer.set_from_icon_name("safeeyes_timer", 16)
self.item_info.set_image(img_timer)
self.item_separator = Gtk.SeparatorMenuItem()
self.item_enable = Gtk.CheckMenuItem(self.language['ui_controls']['enable'])
# Enable menu item with check box
self.item_enable = Gtk.CheckMenuItem()
self.item_enable.set_active(True)
self.item_enable.connect('activate', self.on_toogle_enable)
item_settings = Gtk.MenuItem(self.language['ui_controls']['settings'])
item_settings.connect('activate', self.show_settings)
# Settings menu item
self.item_settings = Gtk.MenuItem()
self.item_settings.connect('activate', self.show_settings)
item_about = Gtk.MenuItem(self.language['ui_controls']['about'])
item_about.connect('activate', self.show_about)
# About menu item
self.item_about = Gtk.MenuItem()
self.item_about.connect('activate', self.show_about)
item_quit = Gtk.MenuItem(self.language['ui_controls']['quit'])
item_quit.connect('activate', self.quit_safe_eyes)
# Quit menu item
self.item_quit = Gtk.MenuItem()
self.item_quit.connect('activate', self.quit_safe_eyes)
self.set_labels(language)
# Append all menu items and show the menu
self.menu.append(self.item_info)
self.menu.append(self.item_separator)
self.menu.append(self.item_enable)
self.menu.append(item_settings)
self.menu.append(item_about)
self.menu.append(item_quit)
self.menu.append(self.item_settings)
self.menu.append(self.item_about)
self.menu.append(self.item_quit)
self.menu.show_all()
self.indicator.set_menu(self.menu)
def set_labels(self, language):
self.language = language
active = self.item_enable.get_active()
if active:
if self.dateTime:
self.set_next_break_info(self.dateTime)
else:
self.item_info.set_label(self.language['messages']['safe_eyes_is_disabled'])
self.item_enable.set_label(self.language['ui_controls']['enable'])
self.item_settings.set_label(self.language['ui_controls']['settings'])
self.item_about.set_label(self.language['ui_controls']['about'])
self.item_quit.set_label(self.language['ui_controls']['quit'])
def show_icon(self):
GLib.idle_add(lambda: self.indicator.set_status(appindicator.IndicatorStatus.ACTIVE))
@ -92,13 +113,17 @@ class TrayIcon:
def next_break_time(self, dateTime):
logging.info("Update next break information")
timeStr = dateTime.strftime("%l:%M")
self.dateTime = dateTime
self.set_next_break_info(self.dateTime)
def set_next_break_info(self, dateTime):
formatted_time = dateTime.strftime("%l:%M")
if dateTime.hour == 12:
message = self.language['messages']['next_break_at_noon'].format(timeStr)
message = self.language['messages']['next_break_at_noon'].format(formatted_time)
elif dateTime.hour < 12:
message = self.language['messages']['next_break_at_am'].format(timeStr)
message = self.language['messages']['next_break_at_am'].format(formatted_time)
else:
message = self.language['messages']['next_break_at_pm'].format(timeStr)
message = self.language['messages']['next_break_at_pm'].format(formatted_time)
GLib.idle_add(lambda: self.item_info.set_label(message))

View File

@ -32,9 +32,10 @@
"no_of_short_breaks_between_two_long_breaks": "Počet krátkých přestávek mezi dvěma dlouhými přestávkami",
"time_to_prepare_for_break": "Čas k přípravě na přestávku (v sekundách)",
"strict_break": "Povinná přestávka (Skryj tlačítko přeskočení)",
"language": "Jazyk",
"enable": "Povol Safe Eyes",
"settings": "Nastavení",
"about": "O",
"about": "Asi",
"quit": "Ukončit",
"save": "Uložit",
"cancel": "Zrušit"

View File

@ -32,6 +32,7 @@
"no_of_short_breaks_between_two_long_breaks": "Number of short breaks between two long breaks",
"time_to_prepare_for_break": "Time to prepare for break (in seconds)",
"strict_break": "Strict break (Hide skip button)",
"language": "Language",
"enable": "Enable Safe Eyes",
"settings": "Settings",
"about": "About",

View File

@ -20,7 +20,7 @@
"ready_for_a_break": "Tervezett szünet {} másodperc múlva!",
"safe_eyes_is_disabled": "Safe Eyes kikapcsolva",
"next_break_at_noon": "A következő szünet {}",
"next_break_at_am": A következő szünet de. {}",
"next_break_at_am": "A következő szünet de. {}",
"next_break_at_pm": "A következő szünet du. {}"
},
"ui_controls": {
@ -31,6 +31,7 @@
"no_of_short_breaks_between_two_long_breaks": "Hány rövid szünet legyen a hosszabbak között?",
"time_to_prepare_for_break": "Szünet előtti figyelmeztetés (másodperc)",
"strict_break": "Kötelezők a szünetek? (nincs átugrás gomb)",
"language": "Nyelv",
"enable": "Safe Eyes Bekapcsolása",
"settings": "Beállítások",
"about": "Ról ről",

View File

@ -32,6 +32,7 @@
"no_of_short_breaks_between_two_long_breaks": "Número de pausas curtas entre duas pausas longas",
"time_to_prepare_for_break": "Tempo para se preparar para a pausa (em segundos)",
"strict_break": "Pausa rigorosa (Esconder botão pular)",
"language": "Língua",
"enable": "Habilitar Safe Eyes",
"settings": "Configuração",
"about": "Sobre",

View File

@ -32,6 +32,7 @@
"no_of_short_breaks_between_two_long_breaks": "Počet krátkych prestávok medzi dvomi dlhými prestávkami",
"time_to_prepare_for_break": "Čas na prípravu na prestávku (v sekundách)",
"strict_break": "Povinná prestávka (Skryje tlačitko Preskočiť)",
"language": "Jazyk",
"enable": "Povoliť Safe Eyes",
"settings": "Nastavenia",
"about": "Ohľadom",

View File

@ -37,6 +37,7 @@
"short_break_duration": "குறுகிய கால இடைவேளை (விநாடிகளில்)",
"skip": "தவிர்",
"strict_break": "கட்டாய இடைவேளை (தவிர்க்கும் பொத்தான் காண்பிக்கப்பட மாட்டாது)",
"language": "மொழி",
"time_to_prepare_for_break": "இடைவேளைக்கு தயாராக தேவைப்படும் நேரம் (விநாடிகளில்)"
}
}

View File

@ -22,9 +22,7 @@
<interface>
<requires lib="gtk+" version="3.10"/>
<object class="GtkTextBuffer" id="text_buffer_license">
<property name="text" translatable="yes">Copyright (C) 2016 Gobinath
This program is free software: you can redistribute it and/or modify
<property name="text" translatable="yes">This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

View File

@ -264,6 +264,29 @@
<property name="top_attach">5</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="lbl_language">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="label" translatable="yes">Language</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">6</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="cmb_language">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">6</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>

View File

@ -25,6 +25,7 @@ import shutil
import errno
import dbus
import logging
import operator
from threading import Timer
from dbus.mainloop.glib import DBusGMainLoop
@ -59,7 +60,7 @@ SAFE_EYES_VERSION = "1.1.1"
"""
def show_settings():
logging.info("Show Settings dialog")
settings_dialog = SettingsDialog(config, language, save_settings, settings_dialog_glade)
settings_dialog = SettingsDialog(config, language, read_lang_files(), save_settings, settings_dialog_glade)
settings_dialog.show()
"""
@ -141,15 +142,28 @@ def on_skipped():
Listen to Settings dialog Save action and write to the config file.
"""
def save_settings(config):
global language
logging.info("Saving settings to safeeyes.json")
# Stop the Safe Eyes core
if is_active:
core.stop()
# Write the configuration to file
with open(config_file_path, 'w') as config_file:
json.dump(config, config_file, indent=4, sort_keys=True)
# Reload the language translation
language_file_path = os.path.join(system_language_directory, str(config['language']) + '.json')
with open(language_file_path) as language_file:
language = json.load(language_file)
tray_icon.set_labels(language)
# Restart the core and intialize the components
logging.info("Initialize SafeEyesCore with modified settings")
# Restart the core and intialize the components
core.initialize(config, language)
break_screen.initialize(config, language)
if is_active:
@ -242,6 +256,21 @@ def validate_config():
# Create config files again
initialize_config()
"""
Read all the language translations and build a key-value mapping of language names
in English and ISO 639-1 (Filename without extension).
"""
def read_lang_files():
languages = {}
for lang_file_name in os.listdir(system_language_directory):
lang_file_path = os.path.join(system_language_directory, lang_file_name)
if os.path.isfile(lang_file_path):
with open(lang_file_path) as lang_file:
lang = json.load(lang_file)
languages[lang_file_name.lower().replace(".json", "")] = lang['meta_info']['language_name']
return languages
def main():
initialize_config()