From 94d6c32a824045bc2a504840da147015d600fe9c Mon Sep 17 00:00:00 2001 From: Thomas Egli <38955561+thegli@users.noreply.github.com> Date: Mon, 26 Aug 2024 00:26:07 +0200 Subject: [PATCH] yfquotes@thegli: Bug fixing and optimizations (#1264) - Setting changes no longer create multiple triggers and parallel data refresh tasks - Fix error "TypeError: symbolCustomization is undefined" - Honor custom names in sorting - Move refresh button to the bottom of the settings screen - Minor refactoring and cleanup --- yfquotes@thegli/README.md | 24 +- .../files/yfquotes@thegli/desklet.js | 514 +++++++++--------- .../files/yfquotes@thegli/metadata.json | 2 +- .../files/yfquotes@thegli/po/ca.po | 30 +- .../files/yfquotes@thegli/po/da.po | 30 +- .../files/yfquotes@thegli/po/de.po | 30 +- .../files/yfquotes@thegli/po/es.po | 30 +- .../files/yfquotes@thegli/po/fi.po | 30 +- .../files/yfquotes@thegli/po/hu.po | 30 +- .../files/yfquotes@thegli/po/it.po | 30 +- .../files/yfquotes@thegli/po/ko.po | 30 +- .../files/yfquotes@thegli/po/nl.po | 30 +- .../files/yfquotes@thegli/po/pt_BR.po | 30 +- .../files/yfquotes@thegli/po/ro.po | 30 +- .../files/yfquotes@thegli/po/ru.po | 30 +- .../yfquotes@thegli/po/yfquotes@thegli.pot | 32 +- .../yfquotes@thegli/settings-schema.json | 4 +- 17 files changed, 461 insertions(+), 475 deletions(-) diff --git a/yfquotes@thegli/README.md b/yfquotes@thegli/README.md index b84935fe..642379ed 100644 --- a/yfquotes@thegli/README.md +++ b/yfquotes@thegli/README.md @@ -23,6 +23,9 @@ Either follow the installation instructions on [Cinnamon spices](https://cinnamo Check out the desklet configuration settings, and choose the data refresh period, the list of quotes to show, and quote details to display. The default list contains the Dow 30 companies. +> Note that **any changes in the quotes list are not applied immediately** (anymore). This is true for manual changes as well as for import settings from a file. +Press the "Refresh quotes data" button to execute an immediate data update, or wait until the next automatic refresh is triggered (depending on the configured interval). + ### Individual Quote Design By default, all quotes in the list are rendered in the same style and color, following whatever settings are active and selected. @@ -42,7 +45,7 @@ The following table explains all supported properties: Some examples: -``` +```text CAT;color=#f6d001;weight=500 CSCO;name=Cisco;weight=bold;color=#00bceb HD;color=#f96300 @@ -51,8 +54,6 @@ IBM;name=Big Blue;color=blue;weight=bolder KO;name=Bubbly Brown Water;style=oblique;weight=lighter;color=#e61a27 ``` -> Note that any changes in the quotes list are not applied immediately (anymore). Press the "Refresh quotes data" button to trigger a manual data update for the current quotes list. - ## Troubleshooting Problem: The desklet fails to load data, and shows error message "Status: 429 Too Many Requests". @@ -72,12 +73,27 @@ To disable the debug log mode, delete the "DEBUG" file, and restart the Cinnamon ## Release Notes +### 0.14.1 - August 25, 2024 + +Features: + +- setting changes no longer trigger data refresh cycles, resulting in faster layout rendering and reduced network traffic +- update Catalan translation (courtesy of [Odyssey](https://github.com/odyssey)) +- update Spanish translation (courtesy of [haggen88](https://github.com/haggen88)) + +Bugfixes: + +- prevent spawning multiple data fetching tasks at the same time +- prevent creation of more than one data refresh timer +- fix error "TypeError: symbolCustomization is undefined" +- honor custom names in sorting + ### 0.14.0 - August 21, 2024 Features: - style each quote individually - see section [Individual Quote Design](#individual-quote-design) for details -- add Catalan translation (courtesy of [Odyssey]((https://github.com/odyssey)) +- add Catalan translation (courtesy of [Odyssey](https://github.com/odyssey)) - update Dutch translation (courtesy of [qadzek](https://github.com/qadzek)) - update Hungarian translation (courtesy of [bossbob88](https://github.com/bossbob88)) - update Spanish translation (courtesy of [haggen88](https://github.com/haggen88)) diff --git a/yfquotes@thegli/files/yfquotes@thegli/desklet.js b/yfquotes@thegli/files/yfquotes@thegli/desklet.js index f4995304..a7c22f15 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/desklet.js +++ b/yfquotes@thegli/files/yfquotes@thegli/desklet.js @@ -57,6 +57,10 @@ const BASE_FONT_SIZE = 10; Gettext.bindtextdomain(UUID, GLib.get_home_dir() + "/.local/share/locale"); +function _(str) { + return Gettext.dgettext(UUID, str); +} + let _httpSession; if (IS_SOUP_2) { _httpSession = new Soup.SessionAsync(); @@ -73,13 +77,16 @@ Soup.Session.prototype.add_feature.call(_httpSession, _cookieJar); let _crumb = null; -function _(str) { - return Gettext.dgettext(UUID, str); -} +let _lastResponse = { + responseResult: [], + // we should never see this error message + responseError: _("No quotes data to display"), + lastUpdated: new Date() +}; function logDebug(msg) { if (LOG_DEBUG) { - global.log(LOG_PREFIX + 'DEBUG: ' + msg); + global.log(LOG_PREFIX + "DEBUG: " + msg); } } @@ -105,24 +112,51 @@ YahooFinanceQuoteUtils.prototype = { && object[property] !== null; }, - determineQuoteName: function(quote, symbolCustomization, useLongName) { - if (symbolCustomization.name !== null) { - return symbolCustomization.name; - } + // convert the quotes list to a comma-separated one-liner, to be used as argument for the YFQ "symbols" parameter + buildSymbolsArgument: function(quoteSymbolsText) { + return quoteSymbolsText + .split("\n") + .map((line) => line.trim()) + .filter((line) => line !== "") + .map((line) => line.split(";")[0]) + .join(); + }, - if (useLongName && this.existsProperty(quote, "longName")) { - return quote.longName; + // extract any customization parameters from each entry in the quotes list, and return them in a map + buildSymbolCustomizationMap: function(quoteSymbolsText) { + const symbolCustomizations = new Map(); + for (const line of quoteSymbolsText.trim().split("\n")) { + const customization = this.parseSymbolLine(line); + symbolCustomizations.set(customization.symbol, customization); } + logDebug("symbol customization map size: " + symbolCustomizations.size); + + return symbolCustomizations; + }, - if (this.existsProperty(quote, "shortName")) { - return quote.shortName; + parseSymbolLine: function(symbolLine) { + const lineParts = symbolLine.trim().split(";"); + + const customAttributes = new Map(); + for (const attr of lineParts.slice(1)) { + const [key, value] = attr.split("="); + if (key && value) { + customAttributes.set(key, value); + } } - return ABSENT; + return this.buildSymbolCustomization(lineParts[0], customAttributes); }, - buildSymbolList: function(symbolCustomizationMap) { - return Array.from(symbolCustomizationMap.keys()).join(); + // data structure for quote customization parameters + buildSymbolCustomization: function(symbol, customAttributes) { + return { + symbol, + name: customAttributes.has("name") ? customAttributes.get("name") : null, + style: customAttributes.has("style") ? customAttributes.get("style") : "normal", + weight: customAttributes.has("weight") ? customAttributes.get("weight") : "normal", + color: customAttributes.has("color") ? customAttributes.get("color") : null, + }; }, isOkStatus: function(soupMessage) { @@ -160,6 +194,50 @@ YahooFinanceQuoteUtils.prototype = { } } return "no status available"; + }, + + // determine and store the quote name to display within the quote as new property "displayName" + populateQuoteDisplayName: function(quote, symbolCustomization, useLongName) { + let displayName = ABSENT; + + if (symbolCustomization.name !== null) { + displayName = symbolCustomization.name; + } else if (useLongName && this.existsProperty(quote, "longName")) { + displayName = quote.longName; + } else if (this.existsProperty(quote, "shortName")) { + displayName = quote.shortName; + } + + quote.displayName = displayName; + }, + + sortQuotesByProperty: function(quotes, prop, direction) { + // don't sort if no criteria was given, or the criteria says "natural order", or there is only one quote + if (prop === undefined || prop === "none" || quotes.length < 2) { + return quotes; + } + + // when sort-by-name is configured, then we want to sort by the determined display name + if (prop === "shortName") { + prop = "displayName"; + } + + const _that = this; + const clone = quotes.slice(0); + const numberPattern = /^-?\d+(\.\d+)?$/; + clone.sort(function(q1, q2) { + let p1 = ""; + if (_that.existsProperty(q1, prop)) { + p1 = q1[prop].toString().match(numberPattern) ? + q1[prop] : q1[prop].toLowerCase(); + } + let p2 = ""; + if (_that.existsProperty(q2, prop)) { + p2 = q2[prop].toString().match(numberPattern) ? + q2[prop] : q2[prop].toLowerCase(); + } + + return ((p1 < p2) ? -1 : ((p1 > p2) ? 1 : 0)) * direction; + }); + return clone; } }; @@ -314,15 +392,15 @@ YahooFinanceQuoteReader.prototype = { } }, - getFinanceData: function(symbolList, customUserAgent, callback) { + getFinanceData: function(quoteSymbolsArg, customUserAgent, callback) { const _that = this; - if (symbolList.size === 0) { + if (quoteSymbolsArg.length === 0) { callback.call(_that, _that.buildErrorResponse(_("Empty quotes list. Open settings and add some symbols."))); return; } - const requestUrl = this.createYahooQueryUrl(symbolList); + const requestUrl = this.createYahooQueryUrl(quoteSymbolsArg); const message = Soup.Message.new("GET", requestUrl); if (IS_SOUP_2) { @@ -365,8 +443,8 @@ YahooFinanceQuoteReader.prototype = { } }, - createYahooQueryUrl: function(symbolList) { - const queryUrl = "https://query1.finance.yahoo.com/v7/finance/quote?symbols=" + symbolList + "&crumb=" + _crumb; + createYahooQueryUrl: function(quoteSymbolsArg) { + const queryUrl = "https://query1.finance.yahoo.com/v7/finance/quote?symbols=" + quoteSymbolsArg + "&crumb=" + _crumb; logDebug("YF query URL: " + queryUrl); return queryUrl; }, @@ -400,7 +478,7 @@ QuotesTable.prototype = { EQUALS: "\u25B6" }, - render: function(quotes, symbolCustomizationMap, settings) { + renderTable: function(quotes, symbolCustomizationMap, settings) { for (let rowIndex = 0, l = quotes.length; rowIndex < l; rowIndex++) { this.renderTableRow(quotes[rowIndex], symbolCustomizationMap, settings, rowIndex); } @@ -415,8 +493,7 @@ QuotesTable.prototype = { cellContents.push(this.createPercentChangeIcon(quote, settings)); } if (settings.quoteName) { - cellContents.push(this.createQuoteLabel(this.quoteUtils.determineQuoteName(quote, symbolCustomization, settings.useLongName), - symbolCustomization, settings.quoteLabelWidth, settings)); + cellContents.push(this.createQuoteLabel(quote.displayName, symbolCustomization, settings.quoteLabelWidth, settings)); } if (settings.quoteSymbol) { cellContents.push(this.createQuoteLabel(symbol, symbolCustomization, settings.quoteSymbolWidth, settings)); @@ -631,95 +708,60 @@ function StockQuoteDesklet(metadata, id) { StockQuoteDesklet.prototype = { __proto__: Desklet.Desklet.prototype, - quoteUtils: new YahooFinanceQuoteUtils(), init: function(metadata, id) { this.metadata = metadata; this.id = id; + this.updateId = 0; + this.updateInProgress = false; this.quoteReader = new YahooFinanceQuoteReader(); this.quoteUtils = new YahooFinanceQuoteUtils(); this.loadSettings(); - this.onUpdate(); + this.onQuotesListChanged(); }, loadSettings: function() { this.settings = new Settings.DeskletSettings(this, this.metadata.uuid, this.id); - this.settings.bindProperty(Settings.BindingDirection.IN, "height", "height", - this.onDisplayChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "width", "width", - this.onDisplayChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "transparency", "transparency", - this.onDisplayChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "showVerticalScrollbar", "showVerticalScrollbar", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "backgroundColor", "backgroundColor", - this.onDisplayChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "delayMinutes", "delayMinutes", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "showLastUpdateTimestamp", "showLastUpdateTimestamp", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "manualDataUpdate", "manualDataUpdate", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "sendCustomUserAgent", "sendCustomUserAgent", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "customUserAgent", "customUserAgent", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "roundNumbers", "roundNumbers", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "decimalPlaces", "decimalPlaces", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "strictRounding", "strictRounding", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "use24HourTime", "use24HourTime", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "customTimeFormat", "customTimeFormat", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "customDateFormat", "customDateFormat", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "quoteSymbols", "quoteSymbolsText"); // no instant-refresh on change - this.settings.bindProperty(Settings.BindingDirection.IN, "sortCriteria", "sortCriteria", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "sortDirection", "sortAscending", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "showChangeIcon", "showChangeIcon", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "showQuoteName", "showQuoteName", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "useLongQuoteName", "useLongQuoteName", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "linkQuoteName", "linkQuoteName", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "showQuoteSymbol", "showQuoteSymbol", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "linkQuoteSymbol", "linkQuoteSymbol", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "showMarketPrice", "showMarketPrice", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "showCurrencyCode", "showCurrencyCode", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "showAbsoluteChange", "showAbsoluteChange", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "showPercentChange", "showPercentChange", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "colorPercentChange", "colorPercentChange", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "showTradeTime", "showTradeTime", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "fontColor", "fontColor", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "scaleFontSize", "scaleFontSize", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "fontScale", "fontScale", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "uptrendChangeColor", "uptrendChangeColor", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "downtrendChangeColor", "downtrendChangeColor", - this.onSettingsChanged, null); - this.settings.bindProperty(Settings.BindingDirection.IN, "unchangedTrendColor", "unchangedTrendColor", - this.onSettingsChanged, null); + this.settings.bindProperty(Settings.BindingDirection.IN, "height", "height", this.onDisplaySettingChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "width", "width", this.onDisplaySettingChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "transparency", "transparency", this.onDisplaySettingChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "showVerticalScrollbar", "showVerticalScrollbar", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "backgroundColor", "backgroundColor", this.onDisplaySettingChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "delayMinutes", "delayMinutes", this.onDataFetchSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "showLastUpdateTimestamp", "showLastUpdateTimestamp", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "manualDataUpdate", "manualDataUpdate", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "sendCustomUserAgent", "sendCustomUserAgent"); // no callback, manual refresh required + this.settings.bindProperty(Settings.BindingDirection.IN, "customUserAgent", "customUserAgent"); // no callback, manual refresh required + this.settings.bindProperty(Settings.BindingDirection.IN, "roundNumbers", "roundNumbers", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "decimalPlaces", "decimalPlaces", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "strictRounding", "strictRounding", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "use24HourTime", "use24HourTime", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "customTimeFormat", "customTimeFormat", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "customDateFormat", "customDateFormat", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "quoteSymbols", "quoteSymbolsText"); // no callback, manual refresh required + this.settings.bindProperty(Settings.BindingDirection.IN, "sortCriteria", "sortCriteria", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "sortDirection", "sortAscending", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "showChangeIcon", "showChangeIcon", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "showQuoteName", "showQuoteName", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "useLongQuoteName", "useLongQuoteName", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "linkQuoteName", "linkQuoteName", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "showQuoteSymbol", "showQuoteSymbol", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "linkQuoteSymbol", "linkQuoteSymbol", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "showMarketPrice", "showMarketPrice", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "showCurrencyCode", "showCurrencyCode", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "showAbsoluteChange", "showAbsoluteChange", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "showPercentChange", "showPercentChange", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "colorPercentChange", "colorPercentChange", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "showTradeTime", "showTradeTime", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "fontColor", "fontColor", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "scaleFontSize", "scaleFontSize", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "fontScale", "fontScale", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "uptrendChangeColor", "uptrendChangeColor", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "downtrendChangeColor", "downtrendChangeColor", this.onRenderSettingsChanged); + this.settings.bindProperty(Settings.BindingDirection.IN, "unchangedTrendColor", "unchangedTrendColor", this.onRenderSettingsChanged); }, - getQuoteDisplaySettings: function(quotes, symbolCustomizationMap) { + getQuoteDisplaySettings: function(quotes) { return { "changeIcon": this.showChangeIcon, "quoteName": this.showQuoteName, @@ -744,27 +786,13 @@ StockQuoteDesklet.prototype = { "downtrendChangeColor": this.downtrendChangeColor, "unchangedTrendColor": this.unchangedTrendColor, "quoteSymbolWidth": Math.max.apply(Math, quotes.map((quote) => quote.symbol.length)), - "quoteLabelWidth": Math.max.apply(Math, quotes.map((quote) => this.quoteUtils.determineQuoteName(quote, symbolCustomizationMap.get(quote.symbol), this.useLongQuoteName).length)) / 2 + 2 + "quoteLabelWidth": Math.max.apply(Math, quotes.map((quote) => quote.displayName.length)) / 2 + 2 }; }, - formatCurrentTimestamp: function(settings) { - const now = new Date(); - if (settings.customTimeFormat) { - return now.toLocaleFormat(settings.customTimeFormat); - } else { - return now.toLocaleTimeString(undefined, { - hour: "numeric", - hour12: !settings.use24HourTime, - minute: "numeric", - second: "numeric" - }); - } - }, - - createLastUpdateLabel: function(settings) { + createLastUpdateLabel: function(lastUpdated, settings) { const label = new St.Label({ - text: _("Updated at ") + this.formatCurrentTimestamp(settings), + text: _("Updated at ") + this.formatCurrentTimestamp(lastUpdated, settings), style_class: "quotes-last-update", reactive: this.manualDataUpdate, style: "color: " + settings.fontColor + "; " + (settings.fontSize > 0 ? "font-size: " + settings.fontSize + "px;" : "") @@ -774,8 +802,7 @@ StockQuoteDesklet.prototype = { const updateButton = new St.Button(); updateButton.add_actor(label); updateButton.connect("clicked", Lang.bind(this, function() { - this.removeUpdateTimer(); - this.onUpdate(); + this.onQuotesListChanged(); })); return updateButton; } else { @@ -783,6 +810,19 @@ StockQuoteDesklet.prototype = { } }, + formatCurrentTimestamp: function(lastUpdated, settings) { + if (settings.customTimeFormat) { + return lastUpdated.toLocaleFormat(settings.customTimeFormat); + } else { + return lastUpdated.toLocaleTimeString(undefined, { + hour: "numeric", + hour12: !settings.use24HourTime, + minute: "numeric", + second: "numeric" + }); + } + }, + createErrorLabel: function(errorMsg) { return new St.Label({ text: _("Error: ") + errorMsg, @@ -790,7 +830,8 @@ StockQuoteDesklet.prototype = { }); }, - onDisplayChanged: function() { + // called on events that change the desklet window + onDisplaySettingChanged: function() { this.mainBox.set_size(this.width, this.height); this.setBackground(); }, @@ -805,66 +846,58 @@ StockQuoteDesklet.prototype = { return "rgba(" + parseInt(rgb[0]) + "," + parseInt(rgb[1]) + "," + parseInt(rgb[2]) + "," + transparencyFactor + ")"; }, - onSettingsChanged: function() { - this.unrender(); - this.removeUpdateTimer(); - this.onUpdate(); + // called on events that change the quotes data layout (sorting, show/hide fields, text color, etc) + onRenderSettingsChanged: function() { + this.render(); }, - onQuotesListChanged: function() { + // called on events that change the way YFQ data are fetched (data refresh interval) + onDataFetchSettingsChanged: function() { this.removeUpdateTimer(); - this.onUpdate(); + this.setUpdateTimer(); }, - on_desklet_removed: function() { - this.unrender(); + // called on events that change the quotes data (quotes list) + // BEWARE: DO NOT use this function as callback in settings.bindProperty() - otherwise multiple YFQ requests are fired, and multiple timers are created! + onQuotesListChanged: function() { + logDebug("onQuotesListChanged"); + + if (this.updateInProgress) { + logInfo("Data refresh already in progress"); + return; + } this.removeUpdateTimer(); - }, - onUpdate: function() { - const symbolCustomizationMap = this.buildSymbolCustomizationMap(this.quoteSymbolsText); + const quoteSymbolsArg = this.quoteUtils.buildSymbolsArgument(this.quoteSymbolsText); const customUserAgent = this.sendCustomUserAgent ? this.customUserAgent : null; try { if (_crumb) { - this.renderFinanceData(symbolCustomizationMap, customUserAgent); + this.fetchFinanceDataAndRender(quoteSymbolsArg, customUserAgent); } else { - this.fetchCookieAndRender(symbolCustomizationMap, customUserAgent); + this.fetchCookieAndRender(quoteSymbolsArg, customUserAgent); } } catch (err) { - this.onError(this.quoteUtils.buildSymbolList(symbolCustomizationMap), err); + logError("Cannot fetch quotes information for symbol %s due to error: %s".format(quoteSymbolsArg, err)); + this.processFailedFetch(err); } }, - buildSymbolCustomizationMap: function(quoteSymbolsText) { - const symbolCustomizations = new Map(); - for (const line of quoteSymbolsText.trim().split("\n")) { - const customization = this.createSymbolCustomization(line) - symbolCustomizations.set(customization.symbol, customization); - } - logDebug("symbol customization map size: " + symbolCustomizations.size) - - return symbolCustomizations; - }, - - createSymbolCustomization: function(symbolLine) { - const lineParts = symbolLine.trim().split(";"); - - const customAttributes = new Map(); - for (const attr of lineParts.slice(1)) { - const [key, value] = attr.split('='); - if (key && value) { - customAttributes.set(key, value); - } - } + fetchFinanceDataAndRender: function(quoteSymbolsArg, customUserAgent) { + const _that = this; - return { - symbol: lineParts[0], - name: customAttributes.has("name") ? customAttributes.get("name") : null, - style: customAttributes.has("style") ? customAttributes.get("style") : "normal", - weight: customAttributes.has("weight") ? customAttributes.get("weight") : "normal", - color: customAttributes.has("color") ? customAttributes.get("color") : null, - }; + this.quoteReader.getFinanceData(quoteSymbolsArg, customUserAgent, function(response) { + logDebug("YF query response: " + response); + let parsedResponse = JSON.parse(response); + _lastResponse = + { + responseResult: parsedResponse.quoteResponse.result, + responseError: parsedResponse.quoteResponse.error, + lastUpdated: new Date() + }; + _that.setUpdateTimer(); + _that.render(); + }); }, existsCookie: function(name) { @@ -878,23 +911,23 @@ StockQuoteDesklet.prototype = { return false; }, - fetchCookieAndRender: function(symbolCustomizationMap, customUserAgent) { + fetchCookieAndRender: function(quoteSymbolsArg, customUserAgent) { const _that = this; this.quoteReader.getCookie(customUserAgent, function(authResponseMessage, responseBody) { logDebug("Cookie response body: " + responseBody); if (_that.existsCookie(AUTH_COOKIE)) { - _that.fetchCrumbAndRender(symbolCustomizationMap, customUserAgent); + _that.fetchCrumbAndRender(quoteSymbolsArg, customUserAgent); } else if (_that.existsCookie(CONSENT_COOKIE)) { - _that.processConsentAndRender(authResponseMessage, responseBody, symbolCustomizationMap, customUserAgent); + _that.processConsentAndRender(authResponseMessage, responseBody, quoteSymbolsArg, customUserAgent); } else { logWarning("Failed to retrieve auth cookie!"); - _that.renderErrorMessage(_("Failed to retrieve authorization parameter! Unable to fetch quotes data.\\nStatus: ") + _that.quoteUtils.getMessageStatusInfo(authResponseMessage), symbolCustomizationMap); + _that.processFailedFetch(_("Failed to retrieve authorization parameter! Unable to fetch quotes data.\\nStatus: ") + _that.quoteUtils.getMessageStatusInfo(authResponseMessage)); } }); }, - processConsentAndRender: function(authResponseMessage, consentPage, symbolCustomizationMap, customUserAgent) { + processConsentAndRender: function(authResponseMessage, consentPage, quoteSymbolsArg, customUserAgent) { const _that = this; const formElementRegex = /(
)/; const formInputRegex = /()/g; @@ -911,19 +944,19 @@ StockQuoteDesklet.prototype = { this.quoteReader.postConsent(customUserAgent, consentFormFields, function(consentResponseMessage) { if (_that.existsCookie(AUTH_COOKIE)) { - _that.fetchCrumbAndRender(symbolCustomizationMap, customUserAgent); + _that.fetchCrumbAndRender(quoteSymbolsArg, customUserAgent); } else { - logWarning("Failed to retrieve auth cookie from consent form."); - _that.renderErrorMessage(_("Consent processing failed! Unable to fetch quotes data.\\nStatus: ") + _that.quoteUtils.getMessageStatusInfo(consentResponseMessage), symbolCustomizationMap); + logWarning("Failed to retrieve auth cookie from consent form"); + _that.processFailedFetch(_("Consent processing failed! Unable to fetch quotes data.\\nStatus: ") + _that.quoteUtils.getMessageStatusInfo(consentResponseMessage)); } }); } else { - logWarning("Consent form not detected."); - this.renderErrorMessage(_("Consent processing not completed! Unable to fetch quotes data.\\nStatus: ") + _that.quoteUtils.getMessageStatusInfo(authResponseMessage), symbolCustomizationMap); + logWarning("Consent form not detected"); + this.processFailedFetch(_("Consent processing not completed! Unable to fetch quotes data.\\nStatus: ") + this.quoteUtils.getMessageStatusInfo(authResponseMessage)); } }, - fetchCrumbAndRender: function(symbolCustomizationMap, customUserAgent) { + fetchCrumbAndRender: function(quoteSymbolsArg, customUserAgent) { const _that = this; this.quoteReader.getCrumb(customUserAgent, function(crumbResponseMessage, responseBody) { @@ -937,102 +970,81 @@ StockQuoteDesklet.prototype = { } if (_crumb) { - logInfo("Successfully retrieved all authorization parameters."); - _that.renderFinanceData(symbolCustomizationMap, customUserAgent); + logInfo("Successfully retrieved all authorization parameters"); + _that.fetchFinanceDataAndRender(quoteSymbolsArg, customUserAgent); } else { logWarning("Failed to retrieve crumb!"); - _that.renderErrorMessage(_("Failed to retrieve authorization crumb! Unable to fetch quotes data.\\nStatus: ") + _that.quoteUtils.getMessageStatusInfo(crumbResponseMessage), symbolCustomizationMap); + _that.processFailedFetch(_("Failed to retrieve authorization crumb! Unable to fetch quotes data.\\nStatus: ") + _that.quoteUtils.getMessageStatusInfo(crumbResponseMessage)); } }); }, - renderFinanceData: function(symbolCustomizationMap, customUserAgent) { - const _that = this; - - this.quoteReader.getFinanceData(this.quoteUtils.buildSymbolList(symbolCustomizationMap), customUserAgent, function(response) { - logDebug("YF query response: " + response); - let parsedResponse = JSON.parse(response); - _that.render( - { - responseResult: parsedResponse.quoteResponse.result, - responseError: parsedResponse.quoteResponse.error, - symbolCustomization: symbolCustomizationMap - } - ); - _that.setUpdateTimer(); - }); - }, - - renderErrorMessage: function(errorMessage, symbolCustomizationMap) { + processFailedFetch: function(errorMessage) { const errorResponse = JSON.parse(this.quoteReader.buildErrorResponse(errorMessage)); - this.render( - { - responseResult: errorResponse.quoteResponse.result, - responseError: errorResponse.quoteResponse.error, - symbolCustomization: symbolCustomizationMap - } - ); + _lastResponse = + { + responseResult: errorResponse.quoteResponse.result, + responseError: errorResponse.quoteResponse.error, + lastUpdated: new Date() + }; this.setUpdateTimer(); + this.render(); }, setUpdateTimer: function() { - this.updateLoop = Mainloop.timeout_add(this.delayMinutes * 60 * 1000, Lang.bind(this, this.onUpdate)); - }, - - onError: function(quotesList, err) { - logError(_("Cannot display quotes information for symbols: ") + quotesList); - logError(_("The following error occurred: ") + err); - }, - - sortByProperty: function(quotes, prop, direction) { - if (quotes.length < 2) { - return quotes; + logDebug("setUpdateTimer"); + if (this.updateInProgress) { + this.updateId = Mainloop.timeout_add(this.delayMinutes * 60000, Lang.bind(this, this.onQuotesListChanged)); + this.updateInProgress = false; } - - const _that = this; - const clone = quotes.slice(0); - const numberPattern = /^-?\d+(\.\d+)?$/; - clone.sort(function(q1, q2) { - let p1 = ""; - if (_that.quoteUtils.existsProperty(q1, prop)) { - p1 = q1[prop].toString().match(numberPattern) ? + q1[prop] : q1[prop].toLowerCase(); - } - let p2 = ""; - if (_that.quoteUtils.existsProperty(q2, prop)) { - p2 = q2[prop].toString().match(numberPattern) ? + q2[prop] : q2[prop].toLowerCase(); - } - - return ((p1 < p2) ? -1 : ((p1 > p2) ? 1 : 0)) * direction; - }); - return clone; }, + // main method to render the desklet, expects populated _lastResponse + render: function() { + logDebug("render"); + let responseResult = _lastResponse.responseResult; + const responseError = _lastResponse.responseError; + const lastUpdated = _lastResponse.lastUpdated; + const symbolCustomizationMap = this.quoteUtils.buildSymbolCustomizationMap(this.quoteSymbolsText); + + // destroy the current view + this.unrender(); - render: function(responses) { const tableContainer = new St.BoxLayout({ vertical: true }); - let responseResult = responses.responseResult; - const responseError = responses.responseError; - const symbolCustomizationMap = responses.symbolCustomization; - - // optional sort - if (this.sortCriteria && this.sortCriteria !== "none") { - responseResult = this.sortByProperty(responseResult, this.sortCriteria, this.sortAscending ? 1 : -1); - } - // in case of errors, show details if (responseError !== null) { tableContainer.add_actor(this.createErrorLabel(responseError)); } + // some preparations before the rendering starts + for (const quote of responseResult) { + // sometimes YF returns a symbol we didn't query for + // add such "new" symbols to the customization map for easier processing in the various render.. functions + const returnedSymbol = quote.symbol; + if (!symbolCustomizationMap.has(returnedSymbol)) { + logDebug("Adding unknown symbol to customization map: " + returnedSymbol); + symbolCustomizationMap.set(returnedSymbol, this.quoteUtils.buildSymbolCustomization(returnedSymbol, new Map())); + } + + // based on the custom settings, and the returned information, determine the name and store it directly in the quote + this.quoteUtils.populateQuoteDisplayName(quote, symbolCustomizationMap.get(returnedSymbol), this.useLongQuoteName); + } + + // (optional) sorting (do after we populated the display name within the quotes) + responseResult = this.quoteUtils.sortQuotesByProperty(responseResult, this.sortCriteria, this.sortAscending ? 1 : -1); + + // gather all settings that influence the rendering + const displaySettings = this.getQuoteDisplaySettings(responseResult); + const table = new QuotesTable(); - const settings = this.getQuoteDisplaySettings(responseResult, symbolCustomizationMap); - table.render(responseResult, symbolCustomizationMap, settings); + // renders the quotes in a table structure + table.renderTable(responseResult, symbolCustomizationMap, displaySettings); tableContainer.add_actor(table.el); if (this.showLastUpdateTimestamp) { - tableContainer.add_actor(this.createLastUpdateLabel(settings)); + tableContainer.add_actor(this.createLastUpdateLabel(lastUpdated, displaySettings)); } const scrollView = new St.ScrollView(); @@ -1053,16 +1065,26 @@ StockQuoteDesklet.prototype = { this.setContent(this.mainBox); }, + on_desklet_removed: function() { + this.removeUpdateTimer(); + this.unrender(); + }, + unrender: function() { - this.mainBox.destroy_all_children(); - this.mainBox.destroy(); + logDebug("unrender"); + if (this.mainBox) { + this.mainBox.destroy_all_children(); + this.mainBox.destroy(); + } }, removeUpdateTimer: function() { - if (this.updateLoop > 0) { - Mainloop.source_remove(this.updateLoop); + logDebug("removeUpdateTimer"); + if (this.updateId > 0) { + Mainloop.source_remove(this.updateId); } - this.updateLoop = null; + this.updateId = 0; + this.updateInProgress = true; } }; diff --git a/yfquotes@thegli/files/yfquotes@thegli/metadata.json b/yfquotes@thegli/files/yfquotes@thegli/metadata.json index 0ad7cf74..2fefd00e 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/metadata.json +++ b/yfquotes@thegli/files/yfquotes@thegli/metadata.json @@ -3,6 +3,6 @@ "name": "Yahoo Finance Quotes", "prevent-decorations": true, "max-instances": "10", - "version": "0.14.0", + "version": "0.14.1", "uuid": "yfquotes@thegli" } diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/ca.po b/yfquotes@thegli/files/yfquotes@thegli/po/ca.po index a601d234..7d5b947e 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/ca.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/ca.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: yfquotes@thegli 0.13.0\n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: 2024-08-22 20:58+0200\n" "Last-Translator: Odyssey \n" "Language-Team: \n" @@ -18,25 +18,29 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.2\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" "Llista de cotitzacions buida. Obriu la configuració i afegiu-hi alguns " "símbols." -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "El servei de Yahoo finances no està disponible!\\nEstat: " -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Actualitzat a les " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Error: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " @@ -44,20 +48,20 @@ msgstr "" "Error en recuperar el paràmetre d'autorització. No s'han pogut obtenir les " "dades de les cotitzacions.\\nEstat: " -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" "No s'ha pogut processar el consentiment! No s'han pogut obtenir les dades de " "les cotitzacions.\\nEstat: " -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" "No s'ha completat el processament del consentiment. No s'han pogut obtenir " "les dades de les cotitzacions.\\nEstat: " -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " @@ -65,14 +69,6 @@ msgstr "" "No s'ha pogut recuperar la ruta d'autorització! No s'han pogut obtenir les " "dades de les cotitzacions.\\nEstat: " -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "No es pot mostrar la informació de les cotitzacions pels símbols: " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "Hi ha hagut el següent error: " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/da.po b/yfquotes@thegli/files/yfquotes@thegli/po/da.po index d18e6241..8829a37b 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/da.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/da.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: 2023-12-08 08:06+0100\n" "Last-Translator: Alan Mortensen \n" "Language-Team: \n" @@ -18,23 +18,27 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "Yahoo Finance er ikke tilgængelig!\\nStatus: " -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Opdateret " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Fejl: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " @@ -42,31 +46,23 @@ msgstr "" "Kunne ikke hente godkendelsesparameter! Kunne ikke hente kursdata.\n" "Status: " -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "Samtykkebehandling mislykkedes! Kunne ikke hente kursdata.\\nStatus: " -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" "Samtykkebehandling ikke gennemført! Kunne ikke hente kursdata.\\nStatus: " -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " msgstr "" "Kunne ikke hente godkendelseskrumme! Kunne ikke hente kursdata.\\nStatus: " -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "Kan ikke vise kurser for symbolerne: " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "Følgende fejl opstod: " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/de.po b/yfquotes@thegli/files/yfquotes@thegli/po/de.po index a79f79c2..e37f0f51 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/de.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/de.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: 2023-08-28 16:36+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -17,24 +17,28 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "Keine Finanzdaten vorhanden" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" "Liste der Symbole ist leer. Öffne die Einstellungen und füge Symbole hinzu." -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "Yahoo Finance Service nicht verfügbar!\\nStatus: " -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Aktualisiert um " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Fehler: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " @@ -42,20 +46,20 @@ msgstr "" "Empfang von Autorisierungsparameter ist fehlgeschlagen! Finanzdaten-Abfrage " "nicht möglich.\\nStatus: " -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" "Consent-Erteilung ist fehlgeschlagen! Finanzdaten-Abfrage nicht möglich." "\\nStatus: " -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" "Consent-Erteilung nicht abgeschlossen! Finanzdaten-Abfrage nicht möglich." "\\nStatus: " -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " @@ -63,14 +67,6 @@ msgstr "" "Emfang von Autorisierungs-Crumb ist fehlgeschlagen! Finanzdaten-Abfrage " "nicht möglich.\\nStatus: " -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "Finanzdaten können nicht angezeigt werden für die Symbole: " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "Folgender Fehler ist aufgetreten: " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/es.po b/yfquotes@thegli/files/yfquotes@thegli/po/es.po index 3d5738d9..e251d9c1 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/es.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/es.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: 2024-08-22 15:09-0400\n" "Last-Translator: \n" "Language-Team: \n" @@ -17,24 +17,28 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.4.4\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" "Lista de cotizaciones vacía. Abra la configuración y añada algunos símbolos." -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "El servicio de Yahoo Finanzas no está disponible: " -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Actualizado en " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Error: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " @@ -42,20 +46,20 @@ msgstr "" "Error al recuperar el parámetro de autorización. No se han podido recuperar " "los datos de las cotizaciones: " -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" "No se ha podido procesar el consentimiento. No se han podido recuperar los " "datos de las cotizaciones: " -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" "No se ha completado el procesamiento del consentimiento. No se han podido " "recuperar los datos de las cotizaciones: " -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " @@ -63,14 +67,6 @@ msgstr "" "¡No se pudo recuperar la ruta de autorización! No se pueden recuperar los " "datos de las cotizaciones: " -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "No se puede mostrar información de cotizaciones para los símbolos: " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "El siguiente error ha ocurrido: " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/fi.po b/yfquotes@thegli/files/yfquotes@thegli/po/fi.po index 057d54ba..c01531b2 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/fi.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/fi.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: 2023-12-22 11:33+0200\n" "Last-Translator: Kimmo Kujansuu \n" "Language-Team: \n" @@ -18,51 +18,47 @@ msgstr "" "X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "Yahoo Finance palvelu ei ole saatavilla!\\nTila: " -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Päivitetty klo " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Virhe: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " msgstr "Valtuutuksen haku epäonnistui! Tietoja ei voi noutaa.\\nTila: " -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "Suostumuksen käsittely epäonnistui! Tietoja ei voi noutaa.\\nTila: " -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "Suostumusta ei ole suoritettu loppuun! Tietoja ei voi noutaa.\\nTila: " -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " msgstr "Valtuutuksen nouto epäonnistui! Tietoja ei voi noutaa.\\nTila: " -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "Symbolien tietoja ei voi näyttää: " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "Tapahtui seuraava virhe: " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/hu.po b/yfquotes@thegli/files/yfquotes@thegli/po/hu.po index 25bdad21..d6d31084 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/hu.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/hu.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: yfquotes@thegli 0.13.0\n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: 2024-07-26 07:12-0400\n" "Last-Translator: \n" "Language-Team: \n" @@ -18,25 +18,29 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" "Üres idézetek listája. Nyissa meg a beállításokat, és adjon hozzá néhány " "szimbólumot." -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "A Yahoo Finance szolgáltatás pillanatnyilag nem érhető el.\\nÁllapot: " -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Frissítve: " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Hiba: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " @@ -44,20 +48,20 @@ msgstr "" "Nem sikerült lekérni az engedélyezési paramétert. Nem sikerült letölteni a " "pénzügyi adatokat.\\nÁllapot: " -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" "Az engedélykezelés nem sikerült. Nem sikerült letölteni a pénzügyi adatokat." "\\nÁllapot: " -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" "Az engedélykezelés nem fejeződött be. Nem sikerült letölteni a pénzügyi " "adatokat.\\nÁllapot: " -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " @@ -65,14 +69,6 @@ msgstr "" "Nem sikerült lekérni az engedély-sütit. Nem sikerült letölteni a pénzügyi " "adatokat.\\nÁllapot: " -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "Nem jeleníthetőek meg megállapítások a következő szimbólumokhoz: " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "A következő hiba történt: " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/it.po b/yfquotes@thegli/files/yfquotes@thegli/po/it.po index b46d286c..ead23161 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/it.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/it.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: 2023-12-12 19:02+0100\n" "Last-Translator: Dragone2 \n" "Language-Team: \n" @@ -18,23 +18,27 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "Il servizio Yahoo Finance non è disponibile!\\nStato: " -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Aggiornato al " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Errore: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " @@ -42,20 +46,20 @@ msgstr "" "Impossibile recuperare il parametro di autorizzazione! Impossibile " "recuperare i dati delle quotazioni.\\nStato: " -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" "Elaborazione del consenso non riuscita! Impossibile recuperare i dati delle " "quotazioni.\\nStato: " -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" "Elaborazione del consenso non completata! Impossibile recuperare i dati " "delle quotazioni.\\nStato: " -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " @@ -63,14 +67,6 @@ msgstr "" "Impossibile recuperare la parte di autorizzazione! Impossibile recuperare i " "dati delle quotazioni.\\nStato: " -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "Impossibile mostrare info sulle quotazioni per i simboli: " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "È stato riscontrato il seguente errore: " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/ko.po b/yfquotes@thegli/files/yfquotes@thegli/po/ko.po index 1a192931..0af69d9c 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/ko.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/ko.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: Yahoo Finance Quotes Desklet\n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -17,51 +17,47 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "Yahoo Finance 서비스를 사용할 수 없습니다!" -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "업데이트 날짜 " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "오류: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " msgstr "" -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " msgstr "" -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "기호에 대한 따옴표 정보를 표시 할 수 없습니다. " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "다음 오류가 발생했습니다. " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/nl.po b/yfquotes@thegli/files/yfquotes@thegli/po/nl.po index 1a1410d0..979be30f 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/nl.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/nl.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: yfquotes@thegli 0.11.0\n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: 2024-07-23 23:13+0200\n" "Last-Translator: qadzek\n" "Language-Team: \n" @@ -16,23 +16,27 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "Lege lijst van koersen. Open instellingen en voeg wat symbolen toe." -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "Yahoo Finance service niet beschikbaar!\\nStatus: " -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Bijgewerkt om " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Fout: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " @@ -40,20 +44,20 @@ msgstr "" "Kan autorisatieparameter niet ophalen! Kan geen gegevens voor koersen " "ophalen.\\nStatus: " -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" "Toestemming verwerking mislukt! Kan geen gegevens voor koersen ophalen." "\\nStatus: " -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" "Toestemming verwerking niet voltooid! Kan geen gegevens voor koersen ophalen." "\\nStatus: " -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " @@ -61,14 +65,6 @@ msgstr "" "Kan autorisatiekruimel niet ophalen! Kan geen gegevens voor koersen ophalen." "\\nStatus: " -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "Kan geen koersinformatie weergeven voor symbolen: " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "De volgende fout is opgetreden: " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/pt_BR.po b/yfquotes@thegli/files/yfquotes@thegli/po/pt_BR.po index 55b9b2f3..87460e47 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/pt_BR.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/pt_BR.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: 2021-09-30 13:34-0300\n" "Last-Translator: Marcelo Aof\n" "Language-Team: \n" @@ -18,51 +18,47 @@ msgstr "" "X-Generator: Poedit 3.0\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "O serviço de finanças do Yahoo não está disponível!" -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Atualizado em " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Erro: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " msgstr "" -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " msgstr "" -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "Não é possível exibir dados financeiros para as cotações de: " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "O seguinte erro ocorreu: " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/ro.po b/yfquotes@thegli/files/yfquotes@thegli/po/ro.po index 5cfbcdca..6f4d066d 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/ro.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/ro.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: 2023-07-19 22:16+0200\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" @@ -18,51 +18,47 @@ msgstr "" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "Serviciul Yahoo Finance nu este disponibil!" -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Actualizat la" -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Eroare:" -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " msgstr "" -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " msgstr "" -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "Nu se pot afișa informații privind cotațiile pentru simboluri:" - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "A apărut următoarea eroare:" - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/ru.po b/yfquotes@thegli/files/yfquotes@thegli/po/ru.po index b5bd25b3..43a7cff3 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/ru.po +++ b/yfquotes@thegli/files/yfquotes@thegli/po/ru.po @@ -7,7 +7,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -17,51 +17,47 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "Сервис Yahoo Finance не доступен!" -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "Обновлено в " -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "Ошибка: " -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " msgstr "" -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " msgstr "" -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "Невозможно отобразить информацию о котировках для биржевых символов: " - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "Произошла ошибка: " - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/po/yfquotes@thegli.pot b/yfquotes@thegli/files/yfquotes@thegli/po/yfquotes@thegli.pot index 55ea5cda..fd6b6562 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/po/yfquotes@thegli.pot +++ b/yfquotes@thegli/files/yfquotes@thegli/po/yfquotes@thegli.pot @@ -5,10 +5,10 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: yfquotes@thegli 0.14.0\n" +"Project-Id-Version: yfquotes@thegli 0.14.1\n" "Report-Msgid-Bugs-To: https://github.com/linuxmint/cinnamon-spices-desklets/" "issues\n" -"POT-Creation-Date: 2024-08-21 22:58+0200\n" +"POT-Creation-Date: 2024-08-25 22:42+0200\n" "PO-Revision-Date: \n" "Last-Translator: \n" "Language-Team: \n" @@ -17,51 +17,47 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -#. desklet.js:321 +#. desklet.js:79 +msgid "No quotes data to display" +msgstr "" + +#. desklet.js:399 msgid "Empty quotes list. Open settings and add some symbols." msgstr "" -#. desklet.js:343 desklet.js:362 +#. desklet.js:421 desklet.js:440 msgid "Yahoo Finance service not available!\\nStatus: " msgstr "" -#. desklet.js:767 +#. desklet.js:795 msgid "Updated at " msgstr "" -#. desklet.js:788 +#. desklet.js:828 msgid "Error: " msgstr "" -#. desklet.js:892 +#. desklet.js:925 msgid "" "Failed to retrieve authorization parameter! Unable to fetch quotes data." "\\nStatus: " msgstr "" -#. desklet.js:917 +#. desklet.js:950 msgid "Consent processing failed! Unable to fetch quotes data.\\nStatus: " msgstr "" -#. desklet.js:922 +#. desklet.js:955 msgid "" "Consent processing not completed! Unable to fetch quotes data.\\nStatus: " msgstr "" -#. desklet.js:944 +#. desklet.js:977 msgid "" "Failed to retrieve authorization crumb! Unable to fetch quotes data." "\\nStatus: " msgstr "" -#. desklet.js:983 -msgid "Cannot display quotes information for symbols: " -msgstr "" - -#. desklet.js:984 -msgid "The following error occurred: " -msgstr "" - #. metadata.json->description msgid "" "Displays financial market information such as stock quotes and commodity " diff --git a/yfquotes@thegli/files/yfquotes@thegli/settings-schema.json b/yfquotes@thegli/files/yfquotes@thegli/settings-schema.json index 1b876202..9ce88a93 100644 --- a/yfquotes@thegli/files/yfquotes@thegli/settings-schema.json +++ b/yfquotes@thegli/files/yfquotes@thegli/settings-schema.json @@ -25,12 +25,12 @@ "dataSymbolsSection": { "type": "section", "title": "Quotes", - "keys": ["quoteSymbols","updateDataButton"] + "keys": ["quoteSymbols"] }, "dataUpdateSection": { "type": "section", "title": "Data Updates", - "keys": ["delayMinutes", "showLastUpdateTimestamp", "manualDataUpdate", "sendCustomUserAgent", "customUserAgent"] + "keys": ["delayMinutes", "showLastUpdateTimestamp", "manualDataUpdate", "sendCustomUserAgent", "customUserAgent", "updateDataButton"] }, "detailsNameSection": { "type": "section",