From cc59a8bebd573acf3aab073468f011ac30a7b775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Muhammed=20=C5=A0ehi=C4=87?= <73797105+MuxBH28@users.noreply.github.com> Date: Mon, 2 Sep 2024 22:22:19 +0200 Subject: [PATCH] vaktija-desklet@MuxBH28: Version 1.3 (#1273) * Added language chooser in settings --- vaktija-desklet@MuxBH28/README.md | 5 + .../files/vaktija-desklet@MuxBH28/desklet.js | 374 ++++++---- .../vaktija-desklet@MuxBH28/metadata.json | 2 +- .../po/vaktija-desklet@MuxBH28.pot | 647 ++++++++++++++++++ .../settings-schema.json | 11 + 5 files changed, 890 insertions(+), 149 deletions(-) create mode 100644 vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/po/vaktija-desklet@MuxBH28.pot diff --git a/vaktija-desklet@MuxBH28/README.md b/vaktija-desklet@MuxBH28/README.md index f2a049a7..19722dde 100644 --- a/vaktija-desklet@MuxBH28/README.md +++ b/vaktija-desklet@MuxBH28/README.md @@ -23,6 +23,8 @@ Vaktija Desklet is a simple desklet that displays prayer times using data from t - Displays prayer times for the selected location. - Real-time data updates. +- 3 languages to choose from (Bosnian, English, Arabic). +- Visual look tweaks ### Screenshot @@ -37,6 +39,9 @@ Vaktija Desklet is a simple desklet that displays prayer times using data from t ## Configuration Currently, the desklet supports 177 locations across Bosnia and Herzegovina and southern Serbia. Future versions will include additional configuration options and more locations. +The plan is also to add a notification pop-up system in future versions, as well as more locations. + +Any ideas you have, please feel free to ask me to add them! ## Links diff --git a/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/desklet.js b/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/desklet.js index 0c06bea7..20c007c4 100644 --- a/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/desklet.js +++ b/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/desklet.js @@ -20,213 +20,291 @@ VaktijaDesklet.prototype = { __proto__: Desklet.Desklet.prototype, _init: function (metadata, desklet_id) { - Desklet.Desklet.prototype._init.call(this, metadata, desklet_id); + try { + Desklet.Desklet.prototype._init.call(this, metadata, desklet_id); - this.settings = new Settings.DeskletSettings(this, uuid, desklet_id); + this.settings = new Settings.DeskletSettings(this, uuid, desklet_id); - this.settings.bindProperty(Settings.BindingDirection.IN, - 'api-url', 'apiUrl', - this.fetchData, this); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'api-url', 'apiUrl', + this.fetchData, this); - this.settings.bindProperty(Settings.BindingDirection.IN, - 'api-location', 'apiLocation', - this.fetchData, this); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'api-location', 'apiLocation', + this.fetchData, this); - this.settings.bindProperty(Settings.BindingDirection.IN, - 'update-interval', 'updateInterval', - this.setupUpdateInterval, this); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'update-interval', 'updateInterval', + this.setupUpdateInterval, this); - this.settings.bindProperty(Settings.BindingDirection.IN, - 'show-date', 'showDate', - this.updateDisplay, this); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'show-date', 'showDate', + this.updateDisplay, this); - this.settings.bindProperty(Settings.BindingDirection.IN, - 'show-islamic-date', 'showIslamicDate', - this.updateDisplay, this); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'show-islamic-date', 'showIslamicDate', + this.updateDisplay, this); - this.settings.bindProperty(Settings.BindingDirection.IN, - 'show-seconds', 'showSeconds', - this.updateDisplay, this); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'show-seconds', 'showSeconds', + this.updateDisplay, this); - this.settings.bindProperty(Settings.BindingDirection.IN, - 'height', 'height', - this.updateDisplay, this); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'height', 'height', + this.updateDisplay, this); - this.settings.bindProperty(Settings.BindingDirection.IN, - 'width', 'width', - this.updateDisplay, this); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'width', 'width', + this.updateDisplay, this); - this.settings.bindProperty(Settings.BindingDirection.IN, - 'transparency', 'transparency', - this.updateAppearance, this); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'transparency', 'transparency', + this.updateAppearance, this); - this.settings.bindProperty(Settings.BindingDirection.IN, - 'backgroundColor', 'backgroundColor', - this.updateAppearance, this); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'backgroundColor', 'backgroundColor', + this.updateAppearance, this); - this.setupUI(); - this.fetchData(); - this.setupMidnightTimer(); - this.setupUpdateInterval(); - this.setupCountdownUpdateInterval(); + this.settings.bindProperty(Settings.BindingDirection.IN, + 'language', 'language', + this.updateDisplay, this); + + this.setupUI(); + this.fetchData(); + this.setupMidnightTimer(); + this.setupUpdateInterval(); + this.setupCountdownUpdateInterval(); + } catch (e) { + global.logError("Error initializing Vaktija Desklet: " + e.message); + } }, setupUI: function () { - this.window = new St.BoxLayout({ vertical: true }); - this.text = new St.Label({ style_class: 'label' }); + try { + this.window = new St.BoxLayout({ vertical: true }); + this.text = new St.Label({ style_class: 'label', text: 'Loading...' }); - this.window.add_actor(this.text); - this.setContent(this.window); + this.window.add_actor(this.text); + this.setContent(this.window); - this.updateAppearance(); + this.updateAppearance(); + } catch (e) { + global.logError("Error in setupUI: " + e.message); + } }, updateAppearance: function () { - this.window.set_width(this.width); - this.window.set_height(this.height); + try { + this.window.set_width(this.width); + this.window.set_height(this.height); - this.window.set_opacity(Math.round(this.transparency * 255)); + this.window.set_opacity(Math.round(this.transparency * 255)); - let backgroundColor = Clutter.Color.from_string(this.backgroundColor)[1]; - this.window.set_style(`background-color: rgba(${backgroundColor.red}, ${backgroundColor.green}, ${backgroundColor.blue}, ${this.transparency});`); + let backgroundColor = Clutter.Color.from_string(this.backgroundColor)[1]; + this.window.set_style(`background-color: rgba(${backgroundColor.red}, ${backgroundColor.green}, ${backgroundColor.blue}, ${this.transparency});`); + } catch (e) { + global.logError("Error in updateAppearance: " + e.message); + } }, fetchData: function () { - let url = this.apiUrl || "https://api.vaktija.ba/"; + try { + let url = this.apiUrl || "https://api.vaktija.ba/"; + let location = this.apiLocation || 77; - let location = this.apiLocation || 77; - - if (url === "https://api.vaktija.ba/") { - url = url + 'vaktija/v1/' + location; - } + if (url === "https://api.vaktija.ba/") { + url = url + 'vaktija/v1/' + location; + } - let file = Gio.File.new_for_uri(url); - file.load_contents_async(null, (obj, result) => { - try { - let [success, contents] = obj.load_contents_finish(result); - if (!success) { - this.text.set_text("Error fetching data"); - return; + global.log("Fetching data from URL: " + url); + + let file = Gio.File.new_for_uri(url); + file.load_contents_async(null, (obj, result) => { + try { + let [success, contents] = obj.load_contents_finish(result); + if (!success) { + this.text.set_text(this.getTranslation("Error fetching data")); + return; + } + + let data = ByteArray.toString(contents); + this.lastFetchedData = JSON.parse(data); + this.updateDisplay(); + } catch (e) { + global.logError("Error processing fetched data: " + e.message); + this.text.set_text(this.getTranslation("Error fetching data")); } - - let data = ByteArray.toString(contents); - this.lastFetchedData = JSON.parse(data); - this.updateDisplay(); - } catch (e) { - this.text.set_text("Error fetching data"); - } - }); + }); + } catch (e) { + global.logError("Error in fetchData: " + e.message); + } }, updateDisplay: function () { - if (!this.lastFetchedData) return; - - let now = new Date(); - let timeFormat = this.showSeconds ? 'HH:mm:ss' : 'HH:mm'; - let formattedTime = this.formatTime(now, timeFormat); - - let showIslamicDate = this.showIslamicDate ? `${this.lastFetchedData.datum[0]}\n` : ''; - let showDate = this.showDate ? `Datum: ${this.lastFetchedData.datum[1]}\n` : ''; - - let vakatTimes = [ - "Zora", "Izlazak sunca", "Podne", "Ikindija", "Akšam", "Jacija" - ]; - - let nextVakat = null; - let countdown = ""; + try { + if (!this.lastFetchedData) { + global.log("No data available to display."); + return; + } - for (let i = 0; i < this.lastFetchedData.vakat.length; i++) { - let vakatTime = this.lastFetchedData.vakat[i].split(":"); - let vakatDate = new Date(now); - vakatDate.setHours(parseInt(vakatTime[0], 10)); - vakatDate.setMinutes(parseInt(vakatTime[1], 10)); + let now = new Date(); + let timeFormat = this.showSeconds ? 'HH:mm:ss' : 'HH:mm'; + let formattedTime = this.formatTime(now, timeFormat); + + let showIslamicDate = this.showIslamicDate ? `${this.lastFetchedData.datum[0]}\n` : ''; + let showDate = this.showDate ? `${this.getTranslation("Datum")}: ${this.lastFetchedData.datum[1]}\n` : ''; + + let vakatTimes = [ + this.getTranslation("Zora"), + this.getTranslation("Izlazak sunca"), + this.getTranslation("Podne"), + this.getTranslation("Ikindija"), + this.getTranslation("Akšam"), + this.getTranslation("Jacija") + ]; + + let nextVakat = null; + let countdown = ""; + + for (let i = 0; i < this.lastFetchedData.vakat.length; i++) { + let vakatTime = this.lastFetchedData.vakat[i].split(":"); + let vakatDate = new Date(now); + vakatDate.setHours(parseInt(vakatTime[0], 10)); + vakatDate.setMinutes(parseInt(vakatTime[1], 10)); + + if (vakatDate > now) { + nextVakat = vakatTimes[i]; + let diff = vakatDate - now; + let hours = Math.floor(diff / (1000 * 60 * 60)); + let minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); + let seconds = Math.floor((diff % (1000 * 60)) / 1000); + + countdown = `${this.pad(hours)}h ${this.pad(minutes)}m ${this.pad(seconds)}s`; + break; + } + } - if (vakatDate > now) { - nextVakat = vakatTimes[i]; - let diff = vakatDate - now; - let hours = Math.floor(diff / (1000 * 60 * 60)); - let minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60)); - let seconds = Math.floor((diff % (1000 * 60)) / 1000); + if (!nextVakat) { + let firstVakatTomorrow = this.parseTime(this.lastFetchedData.vakat[0]) + 24 * 60 * 60 * 1000; + let timeUntilNextVakat = firstVakatTomorrow - now.getTime(); + let hours = Math.floor(timeUntilNextVakat / (1000 * 60 * 60)) % 24; + let minutes = Math.floor((timeUntilNextVakat % (1000 * 60 * 60)) / (1000 * 60)); + let seconds = Math.floor((timeUntilNextVakat % (1000 * 60)) / 1000); countdown = `${this.pad(hours)}h ${this.pad(minutes)}m ${this.pad(seconds)}s`; - break; } - } - if (!nextVakat) { - let firstVakatTomorrow = this.parseTime(this.lastFetchedData.vakat[0]) + 24 * 60 * 60 * 1000; - let timeUntilNextVakat = firstVakatTomorrow - now.getTime(); - let hours = Math.floor(timeUntilNextVakat / (1000 * 60 * 60)) % 24; - let minutes = Math.floor((timeUntilNextVakat % (1000 * 60 * 60)) / (1000 * 60)); - let seconds = Math.floor((timeUntilNextVakat % (1000 * 60)) / 1000); - - countdown = `${this.pad(hours)}h ${this.pad(minutes)}m ${this.pad(seconds)}s`; + let displayText = ` + ${this.getTranslation("Trenutno vrijeme")}: ${formattedTime}\n + ${this.getTranslation("Lokacija")}: ${this.lastFetchedData.lokacija}\n + ${showDate} + ${showIslamicDate} + ${this.getTranslation("Sljedeći vakat")}: ${countdown}\n + ${this.getTranslation("Zora")}: ${this.lastFetchedData.vakat[0]}\n + ${this.getTranslation("Izlazak sunca")}: ${this.lastFetchedData.vakat[1]}\n + ${this.getTranslation("Podne")}: ${this.lastFetchedData.vakat[2]}\n + ${this.getTranslation("Ikindija")}: ${this.lastFetchedData.vakat[3]}\n + ${this.getTranslation("Akšam")}: ${this.lastFetchedData.vakat[4]}\n + ${this.getTranslation("Jacija")}: ${this.lastFetchedData.vakat[5]} + `; + + global.log("Display text: " + displayText); + this.text.set_text(displayText); + } catch (e) { + global.logError("Error in updateDisplay: " + e.message); + this.text.set_text(this.getTranslation("Error fetching data")); } - - let displayText = ` - Trenutno vrijeme: ${formattedTime}\n - Lokacija: ${this.lastFetchedData.lokacija}\n - ${showDate} - ${showIslamicDate} - Do sljedećeg vakta: ${countdown}\n - Zora: ${this.lastFetchedData.vakat[0]}\n - Izlazak sunca: ${this.lastFetchedData.vakat[1]}\n - Podne: ${this.lastFetchedData.vakat[2]}\n - Ikindija: ${this.lastFetchedData.vakat[3]}\n - Akšam: ${this.lastFetchedData.vakat[4]}\n - Jacija: ${this.lastFetchedData.vakat[5]} - `; - - this.text.set_text(displayText); }, - formatTime: function (date, format) { - let hours = date.getHours().toString().padStart(2, '0'); - let minutes = date.getMinutes().toString().padStart(2, '0'); - let seconds = date.getSeconds().toString().padStart(2, '0'); - - if (format === 'HH:mm:ss') { - return `${hours}:${minutes}:${seconds}`; - } else { - return `${hours}:${minutes}`; + setupUpdateInterval: function () { + if (this.updateIntervalId) { + GLib.source_remove(this.updateIntervalId); } + + this.updateIntervalId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, this.updateInterval * 60, () => { + this.fetchData(); + return GLib.SOURCE_CONTINUE; + }); }, setupMidnightTimer: function () { let now = new Date(); - let tomorrowMidnight = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, 0, 0, 0, 0); - let timeUntilMidnight = tomorrowMidnight - now; + let midnight = new Date(); + midnight.setHours(24, 0, 0, 0); + let timeUntilMidnight = midnight.getTime() - now.getTime(); - setTimeout(() => { + GLib.timeout_add(GLib.PRIORITY_DEFAULT, timeUntilMidnight, () => { this.fetchData(); this.setupMidnightTimer(); - }, timeUntilMidnight); + return GLib.SOURCE_REMOVE; + }); }, - setupUpdateInterval: function () { - if (this.updateInterval && this.updateInterval > 0) { - GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, this.updateInterval, () => { - this.fetchData(); - return GLib.SOURCE_CONTINUE; - }); + setupCountdownUpdateInterval: function () { + if (this.countdownUpdateIntervalId) { + GLib.source_remove(this.countdownUpdateIntervalId); } - }, - setupCountdownUpdateInterval: function () { - GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1, () => { + this.countdownUpdateIntervalId = GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1, () => { this.updateDisplay(); return GLib.SOURCE_CONTINUE; }); }, - pad: function (num) { - return (num < 10 ? '0' : '') + num; + pad: function (number) { + return number.toString().padStart(2, '0'); }, parseTime: function (timeString) { - let [hours, minutes] = timeString.split(':').map(Number); - let now = new Date(); - let vakatDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), hours, minutes, 0, 0); - return vakatDate.getTime(); + let parts = timeString.split(":"); + let date = new Date(); + date.setHours(parseInt(parts[0], 10)); + date.setMinutes(parseInt(parts[1], 10)); + date.setSeconds(0); + date.setMilliseconds(0); + return date.getTime(); + }, + + formatTime: function (date, format) { + let hours = this.pad(date.getHours()); + let minutes = this.pad(date.getMinutes()); + let seconds = this.pad(date.getSeconds()); + + return format === 'HH:mm:ss' ? `${hours}:${minutes}:${seconds}` : `${hours}:${minutes}`; + }, + + getTranslation: function (text) { + if (this.language === "en") { + const translations = { + "Datum": "Date", + "Trenutno vrijeme": "Current Time", + "Lokacija": "Location", + "Sljedeći vakat": "Next prayer", + "Zora": "Fajr", + "Izlazak sunca": "Sunrise", + "Podne": "Dhuhr", + "Ikindija": "Asr", + "Akšam": "Maghrib", + "Jacija": "Isha", + "Error fetching data": "Error fetching data" + }; + return translations[text] || text; + } else if (this.language === "ar") { + const translations = { + "Datum": "تاريخ", + "Trenutno vrijeme": "الوقت الحالي", + "Lokacija": "الموقع", + "Sljedeći vakat": "الصلاة القادمة", + "Zora": "الفجر", + "Izlazak sunca": "الشروق", + "Podne": "الظهر", + "Ikindija": "العصر", + "Akšam": "المغرب", + "Jacija": "العشاء", + "Error fetching data": "خطأ في جلب البيانات" + }; + return translations[text] || text; + } + return text; } }; diff --git a/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/metadata.json b/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/metadata.json index a5c614ae..c80d3b2e 100644 --- a/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/metadata.json +++ b/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/metadata.json @@ -3,7 +3,7 @@ "name": "Vaktija Desklet", "description": "This desklet fetches and displays prayer times using data from vaktija.ba API.", "max-instances": "1", - "version": "1.2", + "version": "1.3", "author": "MuxBH28", "website": "https://sehic.rf.gd/?project=vaktija", "credits": "API created by vaktija.ba - https://github.com/vaktija" diff --git a/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/po/vaktija-desklet@MuxBH28.pot b/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/po/vaktija-desklet@MuxBH28.pot new file mode 100644 index 00000000..b0c77611 --- /dev/null +++ b/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/po/vaktija-desklet@MuxBH28.pot @@ -0,0 +1,647 @@ +# VAKTIJA DESKLET +# This file is put in the public domain. +# MuxBH28, 2024 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: vaktija-desklet@MuxBH28 1.3\n" +"Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" +"issues\n" +"POT-Creation-Date: 2024-09-02 16:20-0400\n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#. metadata.json->name +msgid "Vaktija Desklet" +msgstr "" + +#. metadata.json->description +msgid "" +"This desklet fetches and displays prayer times using data from vaktija.ba " +"API." +msgstr "" + +#. settings-schema.json->head0->description +msgid "Desklet Settings for Vaktija Desklet" +msgstr "" + +#. settings-schema.json->head1->description +msgid "API Settings" +msgstr "" + +#. settings-schema.json->api-url->description +msgid "API" +msgstr "" + +#. settings-schema.json->api-url->tooltip +msgid "Select the API that provides prayer times data." +msgstr "" + +#. settings-schema.json->api-url->options +msgid "Vaktija API (Bosnia)" +msgstr "" + +#. settings-schema.json->api-location->description +msgid "Location (for Vaktija.ba API)" +msgstr "" + +#. settings-schema.json->api-location->tooltip +msgid "Select the location that provides vaktija.ba API." +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Banovići" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Banja Luka" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bihać" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bijeljina" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bileća" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bosanski Brod" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bosanska Dubica" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bosanska Gradiška" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bosansko Grahovo" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bosanska Krupa" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bosanski Novi" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bosanski Petrovac" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bosanski Šamac" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bratunac" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Brčko" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Breza" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bugojno" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Busovača" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bužim" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Cazin" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Čajniče" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Čapljina" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Čelić" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Čelinac" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Čitluk" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Derventa" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Doboj" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Donji Vakuf" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Drvar" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Foča" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Fojnica" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Gacko" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Glamoč" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Goražde" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Gornji Vakuf" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Gračanica" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Gradačac" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Grude" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Hadžići" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Han-Pijesak" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Hlivno" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Ilijaš" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Jablanica" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Jajce" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Kakanj" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Kalesija" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Kalinovik" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Kiseljak" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Kladanj" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Ključ" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Konjic" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Kotor-Varoš" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Kreševo" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Kupres" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Laktaši" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Lopare" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Lukavac" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Ljubinje" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Ljubuški" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Maglaj" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Modriča" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Mostar" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Mrkonjić-Grad" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Neum" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Nevesinje" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Novi Travnik" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Odžak" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Olovo" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Orašje" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Pale" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Posušje" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Prijedor" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Prnjavor" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Prozor" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Rogatica" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Rudo" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Sanski Most" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Sarajevo" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Skender-Vakuf" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Sokolac" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Srbac" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Srebrenica" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Srebrenik" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Stolac" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Šekovići" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Šipovo" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Široki Brijeg" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Teslić" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Tešanj" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Tomislav-Grad" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Travnik" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Trebinje" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Trnovo" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Tuzla" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Ugljevik" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Vareš" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Velika Kladuša" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Visoko" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Višegrad" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Vitez" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Vlasenica" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Zavidovići" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Zenica" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Zvornik" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Žepa" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Žepče" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Živinice" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Bijelo Polje" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Gusinje" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Nova Varoš" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Novi Pazar" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Plav" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Pljevlja" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Priboj" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Prijepolje" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Rožaje" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Sjenica" +msgstr "" + +#. settings-schema.json->api-location->options +msgid "Tutin" +msgstr "" + +#. settings-schema.json->head2->description +msgid "Date and time" +msgstr "" + +#. settings-schema.json->update-interval->description +msgid "Update Interval (seconds)" +msgstr "" + +#. settings-schema.json->update-interval->tooltip +msgid "Number of seconds between data updates." +msgstr "" + +#. settings-schema.json->show-date->description +msgid "Show Gregorian calendar date" +msgstr "" + +#. settings-schema.json->show-date->tooltip +msgid "Whether to show today's Gregorian calendar date." +msgstr "" + +#. settings-schema.json->show-islamic-date->description +msgid "Show Hijri Calendar Date" +msgstr "" + +#. settings-schema.json->show-islamic-date->tooltip +msgid "Whether to show today's Hijri Calendar date." +msgstr "" + +#. settings-schema.json->show-seconds->description +msgid "Show Seconds" +msgstr "" + +#. settings-schema.json->show-seconds->tooltip +msgid "Whether to show seconds in the time display." +msgstr "" + +#. settings-schema.json->head3->description +msgid "Visual settings" +msgstr "" + +#. settings-schema.json->language->description +msgid "Language" +msgstr "" + +#. settings-schema.json->language->tooltip +msgid "Select the language for the desklet." +msgstr "" + +#. settings-schema.json->language->options +msgid "Bosnian" +msgstr "" + +#. settings-schema.json->language->options +msgid "English" +msgstr "" + +#. settings-schema.json->language->options +msgid "Arabic" +msgstr "" + +#. settings-schema.json->height->description +msgid "Height :" +msgstr "" + +#. settings-schema.json->height->units +#. settings-schema.json->width->units +msgid "pixels" +msgstr "" + +#. settings-schema.json->width->description +msgid "Width :" +msgstr "" + +#. settings-schema.json->transparency->description +msgid "Background transparency" +msgstr "" + +#. settings-schema.json->transparency->tooltip +msgid "The higher the value, the more solid the desklet background" +msgstr "" + +#. settings-schema.json->backgroundColor->description +msgid "Background color" +msgstr "" + +#. settings-schema.json->backgroundColor->tooltip +msgid "Desklet background color" +msgstr "" + +#. settings-schema.json->head4->description +msgid "Troubleshoot" +msgstr "" + +#. settings-schema.json->reload-button->description +msgid "Reload Desklet" +msgstr "" + +#. settings-schema.json->head5->description +msgid "Links" +msgstr "" + +#. settings-schema.json->help-entry1->description +msgid "Issues" +msgstr "" + +#. settings-schema.json->help-entry1->tooltip +#. settings-schema.json->help-entry2->tooltip +#. settings-schema.json->help-entry3->tooltip +msgid "Copy link and paste it into Your browser" +msgstr "" + +#. settings-schema.json->help-entry2->description +msgid "Cinnamon Spices" +msgstr "" + +#. settings-schema.json->help-entry3->description +msgid "Author" +msgstr "" diff --git a/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/settings-schema.json b/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/settings-schema.json index 8f166274..00174a0e 100644 --- a/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/settings-schema.json +++ b/vaktija-desklet@MuxBH28/files/vaktija-desklet@MuxBH28/settings-schema.json @@ -177,6 +177,17 @@ "type": "header", "description": "Visual settings" }, + "language": { + "type": "combobox", + "default": "bs", + "description": "Language", + "tooltip": "Select the language for the desklet.", + "options": { + "Bosnian": "bs", + "English": "en", + "Arabic": "ar" + } + }, "height": { "default": 380, "type": "spinbutton",