diff --git a/CMakeLists.txt b/CMakeLists.txt index 8caad92..e4eae99 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,20 +1,24 @@ cmake_minimum_required(VERSION 3.14.0 FATAL_ERROR) -project(org.kde.weatherWidget-2) +project(plasma-weather-widget) -set(QT_MIN_VERSION "5.4.0") -set(KF5_MIN_VERSION "5.0.0") +set(QT_MAJOR_VERSION 6) +set(QT_MIN_VERSION "6.0.0") +set(KF6_MIN_VERSION "6.0.0") +set(PLASMA_MIN_VERSION "6.0.0") -find_package(ECM 0.0.11 REQUIRED NO_MODULE) -set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) +find_package(ECM REQUIRED NO_MODULE) +set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings) -find_package(Qt5 ${REQUIRED_QT_VERSION} CONFIG REQUIRED Quick) -find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS Plasma) +find_package(Qt6 ${REQUIRED_QT_VERSION} CONFIG REQUIRED Quick) +find_package(KF6 ${KF6_MIN_VERSION} REQUIRED) +find_package(Plasma ${PLASMA_MIN_VERSION} REQUIRED) +find_package(Plasma5Support ${PLASMA_MIN_VERSION} REQUIRED) add_subdirectory(plugin) add_subdirectory(translations) -plasma_install_package(package org.kde.weatherWidget-2) +plasma_install_package(package org.kde.weatherWidget-3) diff --git a/README.md b/README.md index d76c70e..8a4d077 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -## Quick update. -Apologies for not being very active on here recently - I've just got a new job and the training is very intense, so I haven't had time to spend on this recently. When my training finishes, I will have a lot more time free to spend on this widget! - +## Apologies (again) +Laptop issues, Covid, and overtime meant I've not been able to do much development on this widget recently. +At some point the laptop will need to go away for repair, so it might go very quiet around here for a while... ## About this widget This is an updated version of the "plasma-applet-weather-widget" by Kotelnik, but using the Met.No API instead of the Yr.No API which is no longer operational. diff --git a/create-plasmoid-package.sh b/create-plasmoid-package.sh index 2c6b0b1..fb62c10 100755 --- a/create-plasmoid-package.sh +++ b/create-plasmoid-package.sh @@ -14,7 +14,10 @@ popd cd package -VERSION="$( grep -i PluginInfo-Version ./metadata.desktop | cut -d'=' -f 2 )" +VERSION=$(cat ./metadata.json | jq -r '.KPlugin.Version') +# ) +# +# ( grep \"Version\" ./metadata.json | cut -d':' -f 2 )" echo $VERSION zip -r "../buildWidget/weather-widget-$VERSION.plasmoid" * --exclude \.git\* --exclude *.bak diff --git a/dev-build.sh b/dev-build.sh index 906f1a3..4682707 100755 --- a/dev-build.sh +++ b/dev-build.sh @@ -18,6 +18,9 @@ pushd ./build cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DKDE_INSTALL_LIBDIR=lib -DKDE_INSTALL_USE_QT_SYS_PATHS=ON make -sudo make install - +if [ $? -eq 0 ]; then + sudo make install +else + echo "ERROR: One of the CMake commands failed. Installation will not proceed." +fi popd diff --git a/package/contents/code/data-loader.js b/package/contents/code/data-loader.js index 345e721..d9f4837 100644 --- a/package/contents/code/data-loader.js +++ b/package/contents/code/data-loader.js @@ -32,7 +32,11 @@ function getReloadedAgoMs(lastReloaded) { } function getPlasmoidStatus(lastReloaded, inTrayActiveTimeoutSec) { + dbgprint2("getPlasmoidStatus") + dbgprint("lastReloaded=" + lastReloaded) + dbgprint("inTrayActiveTimeoutSec=" + inTrayActiveTimeoutSec) var reloadedAgoMs = getReloadedAgoMs(lastReloaded) + dbgprint("reloadedAgoMs=" + reloadedAgoMs) if (reloadedAgoMs < inTrayActiveTimeoutSec * 1000) { return PlasmaCore.Types.ActiveStatus } else { @@ -87,26 +91,39 @@ function fetchXmlFromInternet(getUrl, successCallback, failureCallback) { } function fetchJsonFromInternet(getUrl, successCallback, failureCallback) { + dbgprint2("fetchJsonFromInternet") var xhr = new XMLHttpRequest() - xhr.onreadystatechange = function () { - if (xhr.readyState !== XMLHttpRequest.DONE) { - return - } + xhr.timeout = loadingData.loadingDataTimeoutMs; + dbgprint('GET url opening: ' + getUrl) + xhr.open('GET', getUrl) + xhr.setRequestHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) Gecko/20100101 ") + dbgprint('GET url sending: ' + getUrl) + xhr.send() - if (xhr.status !== 200) { - dbgprint('ERROR - status: ' + xhr.status) - dbgprint('ERROR - responseText: ' + xhr.responseText) - failureCallback() - return - } + xhr.ontimeout = () => { + dbgprint('ERROR - timeout: ' + xhr.status) + failureCallback() + } - // success + xhr.onerror = (event) => { + dbgprint('ERROR - status: ' + xhr.status) + dbgprint('ERROR - responseText: ' + xhr.responseText) + failureCallback() + } + + xhr.onload = (event) => { + dbgprint('status: ' + xhr.status) + // dbgprint('responseText: ' + xhr.responseText) + }; + + // success + xhr.onload = () => { dbgprint('successfully loaded from the internet') dbgprint('successfully of url-call: ' + getUrl) -// dbgprint('responseText: ' + xhr.responseText) + // dbgprint('responseText: ' + xhr.responseText) var jsonString = xhr.responseText - if (!DataLoader.IsJsonString(jsonString)) { + if (!DataLoader.isJsonString(jsonString)) { dbgprint('incoming jsonString is not valid: ' + jsonString) return } @@ -114,16 +131,11 @@ function fetchJsonFromInternet(getUrl, successCallback, failureCallback) { successCallback(jsonString) } - dbgprint('GET url opening: ' + getUrl) - xhr.open('GET', getUrl) - dbgprint('GET url sending: ' + getUrl) - xhr.send() - dbgprint('GET called for url: ' + getUrl) return xhr } -function IsJsonString(str) { +function isJsonString(str) { try { JSON.parse(str) } catch (e) { diff --git a/package/contents/code/db/timezoneData.js b/package/contents/code/db/timezoneData.js deleted file mode 100644 index 85ce11f..0000000 --- a/package/contents/code/db/timezoneData.js +++ /dev/null @@ -1 +0,0 @@ -const TZData =[{"displayName":"Europe\/Andorra","id":0,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Asia\/Dubai","id":1,"TZName":"GST","Offset":"14400"},{"displayName":"Asia\/Kabul","id":2,"TZName":"AFT","Offset":"16200"},{"displayName":"America\/Antigua","id":3,"TZName":"AST","Offset":"-14400"},{"displayName":"America\/Anguilla","id":4,"TZName":"AST","Offset":"-14400"},{"displayName":"Europe\/Tirane","id":5,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Asia\/Yerevan","id":6,"TZName":"AMT","Offset":"14400"},{"displayName":"Africa\/Luanda","id":7,"TZName":"WAT","Offset":"3600"},{"displayName":"Antarctica\/McMurdo","id":8,"Offset":"43200","TZName":"NZST","DSTOffset":"46800","DSTName":"NZDT","DSTData":[{"DSTStart":1632578400,"DSTEnd":1648908000},{"DSTStart":1664028000,"DSTEnd":1680357600},{"DSTStart":1695477600,"DSTEnd":1712412000},{"DSTStart":1727532000,"DSTEnd":1743861600},{"DSTStart":1758981600,"DSTEnd":1775311200},{"DSTStart":1790431200,"DSTEnd":1806760800},{"DSTStart":1821880800,"DSTEnd":1838210400},{"DSTStart":1853330400,"DSTEnd":1869660000},{"DSTStart":1885384800,"DSTEnd":1901714400},{"DSTStart":1916834400,"DSTEnd":1933164000},{"DSTStart":1948284000,"DSTEnd":1964613600},{"DSTStart":1979733600,"DSTEnd":1996063200},{"DSTStart":2011183200,"DSTEnd":2027512800}]},{"displayName":"Antarctica\/Casey","id":9,"TZName":"CAST","Offset":"39600"},{"displayName":"Antarctica\/Davis","id":10,"TZName":"DAVT","Offset":"25200"},{"displayName":"Antarctica\/DumontDUrville","id":11,"TZName":"DDUT","Offset":"36000"},{"displayName":"Antarctica\/Mawson","id":12,"TZName":"MAWT","Offset":"18000"},{"displayName":"Antarctica\/Palmer","id":13,"TZName":"CLST","Offset":"-10800"},{"displayName":"Antarctica\/Rothera","id":14,"TZName":"ART","Offset":"-10800"},{"displayName":"Antarctica\/Syowa","id":15,"TZName":"SYOT","Offset":"10800"},{"displayName":"Antarctica\/Troll","id":16,"DSTOffset":"7200","DSTName":"CEST","Offset":"0","TZName":"GMT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Antarctica\/Vostok","id":17,"TZName":"VOST","Offset":"21600"},{"displayName":"America\/Argentina\/Buenos_Aires","id":18,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/Cordoba","id":19,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/Salta","id":20,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/Jujuy","id":21,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/Tucuman","id":22,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/Catamarca","id":23,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/La_Rioja","id":24,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/San_Juan","id":25,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/Mendoza","id":26,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/San_Luis","id":27,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/Rio_Gallegos","id":28,"TZName":"ART","Offset":"-10800"},{"displayName":"America\/Argentina\/Ushuaia","id":29,"TZName":"ART","Offset":"-10800"},{"displayName":"Pacific\/Pago_Pago","id":30,"TZName":"SST","Offset":"-39600"},{"displayName":"Europe\/Vienna","id":31,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Australia\/Lord_Howe","id":32,"Offset":"37800","TZName":"LHST","DSTOffset":"39600","DSTName":"LHDT","DSTData":[{"DSTStart":1633188600,"DSTEnd":1648911600},{"DSTStart":1664638200,"DSTEnd":1680361200},{"DSTStart":1696087800,"DSTEnd":1712415600},{"DSTStart":1728142200,"DSTEnd":1743865200},{"DSTStart":1759591800,"DSTEnd":1775314800},{"DSTStart":1791041400,"DSTEnd":1806764400},{"DSTStart":1822491000,"DSTEnd":1838214000},{"DSTStart":1853940600,"DSTEnd":1869663600},{"DSTStart":1885995000,"DSTEnd":1901718000},{"DSTStart":1917444600,"DSTEnd":1933167600},{"DSTStart":1948894200,"DSTEnd":1964617200},{"DSTStart":1980343800,"DSTEnd":1996066800},{"DSTStart":2011793400,"DSTEnd":2027516400}]},{"displayName":"Antarctica\/Macquarie","id":33,"Offset":"36000","TZName":"AEST","DSTOffset":"39600","DSTName":"AEDT","DSTData":[{"DSTStart":1633190400,"DSTEnd":1648915200},{"DSTStart":1664640000,"DSTEnd":1680364800},{"DSTStart":1696089600,"DSTEnd":1712419200},{"DSTStart":1728144000,"DSTEnd":1743868800},{"DSTStart":1759593600,"DSTEnd":1775318400},{"DSTStart":1791043200,"DSTEnd":1806768000},{"DSTStart":1822492800,"DSTEnd":1838217600},{"DSTStart":1853942400,"DSTEnd":1869667200},{"DSTStart":1885996800,"DSTEnd":1901721600},{"DSTStart":1917446400,"DSTEnd":1933171200},{"DSTStart":1948896000,"DSTEnd":1964620800},{"DSTStart":1980345600,"DSTEnd":1996070400},{"DSTStart":2011795200,"DSTEnd":2027520000}]},{"displayName":"Australia\/Hobart","id":34,"Offset":"36000","TZName":"AEST","DSTOffset":"39600","DSTName":"AEDT","DSTData":[{"DSTStart":1633190400,"DSTEnd":1648915200},{"DSTStart":1664640000,"DSTEnd":1680364800},{"DSTStart":1696089600,"DSTEnd":1712419200},{"DSTStart":1728144000,"DSTEnd":1743868800},{"DSTStart":1759593600,"DSTEnd":1775318400},{"DSTStart":1791043200,"DSTEnd":1806768000},{"DSTStart":1822492800,"DSTEnd":1838217600},{"DSTStart":1853942400,"DSTEnd":1869667200},{"DSTStart":1885996800,"DSTEnd":1901721600},{"DSTStart":1917446400,"DSTEnd":1933171200},{"DSTStart":1948896000,"DSTEnd":1964620800},{"DSTStart":1980345600,"DSTEnd":1996070400},{"DSTStart":2011795200,"DSTEnd":2027520000}]},{"displayName":"Australia\/Melbourne","id":35,"Offset":"36000","TZName":"AEST","DSTOffset":"39600","DSTName":"AEDT","DSTData":[{"DSTStart":1633190400,"DSTEnd":1648915200},{"DSTStart":1664640000,"DSTEnd":1680364800},{"DSTStart":1696089600,"DSTEnd":1712419200},{"DSTStart":1728144000,"DSTEnd":1743868800},{"DSTStart":1759593600,"DSTEnd":1775318400},{"DSTStart":1791043200,"DSTEnd":1806768000},{"DSTStart":1822492800,"DSTEnd":1838217600},{"DSTStart":1853942400,"DSTEnd":1869667200},{"DSTStart":1885996800,"DSTEnd":1901721600},{"DSTStart":1917446400,"DSTEnd":1933171200},{"DSTStart":1948896000,"DSTEnd":1964620800},{"DSTStart":1980345600,"DSTEnd":1996070400},{"DSTStart":2011795200,"DSTEnd":2027520000}]},{"displayName":"Australia\/Sydney","id":36,"Offset":"36000","TZName":"AEST","DSTOffset":"39600","DSTName":"AEDT","DSTData":[{"DSTStart":1633190400,"DSTEnd":1648915200},{"DSTStart":1664640000,"DSTEnd":1680364800},{"DSTStart":1696089600,"DSTEnd":1712419200},{"DSTStart":1728144000,"DSTEnd":1743868800},{"DSTStart":1759593600,"DSTEnd":1775318400},{"DSTStart":1791043200,"DSTEnd":1806768000},{"DSTStart":1822492800,"DSTEnd":1838217600},{"DSTStart":1853942400,"DSTEnd":1869667200},{"DSTStart":1885996800,"DSTEnd":1901721600},{"DSTStart":1917446400,"DSTEnd":1933171200},{"DSTStart":1948896000,"DSTEnd":1964620800},{"DSTStart":1980345600,"DSTEnd":1996070400},{"DSTStart":2011795200,"DSTEnd":2027520000}]},{"displayName":"Australia\/Broken_Hill","id":37,"Offset":"34200","TZName":"ACST","DSTOffset":"37800","DSTName":"ACDT","DSTData":[{"DSTStart":1633192200,"DSTEnd":1648917000},{"DSTStart":1664641800,"DSTEnd":1680366600},{"DSTStart":1696091400,"DSTEnd":1712421000},{"DSTStart":1728145800,"DSTEnd":1743870600},{"DSTStart":1759595400,"DSTEnd":1775320200},{"DSTStart":1791045000,"DSTEnd":1806769800},{"DSTStart":1822494600,"DSTEnd":1838219400},{"DSTStart":1853944200,"DSTEnd":1869669000},{"DSTStart":1885998600,"DSTEnd":1901723400},{"DSTStart":1917448200,"DSTEnd":1933173000},{"DSTStart":1948897800,"DSTEnd":1964622600},{"DSTStart":1980347400,"DSTEnd":1996072200},{"DSTStart":2011797000,"DSTEnd":2027521800}]},{"displayName":"Australia\/Brisbane","id":38,"TZName":"AEST","Offset":"36000"},{"displayName":"Australia\/Lindeman","id":39,"TZName":"AEST","Offset":"36000"},{"displayName":"Australia\/Adelaide","id":40,"Offset":"34200","TZName":"ACST","DSTOffset":"37800","DSTName":"ACDT","DSTData":[{"DSTStart":1633192200,"DSTEnd":1648917000},{"DSTStart":1664641800,"DSTEnd":1680366600},{"DSTStart":1696091400,"DSTEnd":1712421000},{"DSTStart":1728145800,"DSTEnd":1743870600},{"DSTStart":1759595400,"DSTEnd":1775320200},{"DSTStart":1791045000,"DSTEnd":1806769800},{"DSTStart":1822494600,"DSTEnd":1838219400},{"DSTStart":1853944200,"DSTEnd":1869669000},{"DSTStart":1885998600,"DSTEnd":1901723400},{"DSTStart":1917448200,"DSTEnd":1933173000},{"DSTStart":1948897800,"DSTEnd":1964622600},{"DSTStart":1980347400,"DSTEnd":1996072200},{"DSTStart":2011797000,"DSTEnd":2027521800}]},{"displayName":"Australia\/Darwin","id":41,"TZName":"ACST","Offset":"34200"},{"displayName":"Australia\/Perth","id":42,"TZName":"AWST","Offset":"28800"},{"displayName":"Australia\/Eucla","id":43,"TZName":"ACWST","Offset":"31500"},{"displayName":"America\/Aruba","id":44,"TZName":"AST","Offset":"-14400"},{"displayName":"Europe\/Mariehamn","id":45,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Asia\/Baku","id":46,"TZName":"AZT","Offset":"14400"},{"displayName":"Europe\/Sarajevo","id":47,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/Barbados","id":48,"TZName":"AST","Offset":"-14400"},{"displayName":"Asia\/Dhaka","id":49,"TZName":"BST","Offset":"21600"},{"displayName":"Europe\/Brussels","id":50,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Ouagadougou","id":51,"TZName":"GMT","Offset":"0"},{"displayName":"Europe\/Sofia","id":52,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Asia\/Bahrain","id":53,"TZName":"AST","Offset":"10800"},{"displayName":"Africa\/Bujumbura","id":54,"TZName":"CAT","Offset":"7200"},{"displayName":"Africa\/Porto-Novo","id":55,"TZName":"WAT","Offset":"3600"},{"displayName":"America\/St_Barthelemy","id":56,"TZName":"AST","Offset":"-14400"},{"displayName":"Atlantic\/Bermuda","id":57,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]},{"displayName":"Asia\/Brunei","id":58,"TZName":"BNT","Offset":"28800"},{"displayName":"America\/La_Paz","id":59,"TZName":"BOT","Offset":"-14400"},{"displayName":"America\/Kralendijk","id":60,"TZName":"AST","Offset":"-14400"},{"displayName":"America\/Noronha","id":61,"TZName":"FNT","Offset":"-7200"},{"displayName":"America\/Belem","id":62,"TZName":"BRT","Offset":"-10800"},{"displayName":"America\/Fortaleza","id":63,"TZName":"BRT","Offset":"-10800"},{"displayName":"America\/Recife","id":64,"TZName":"BRT","Offset":"-10800"},{"displayName":"America\/Araguaina","id":65,"TZName":"BRT","Offset":"-10800"},{"displayName":"America\/Maceio","id":66,"TZName":"BRT","Offset":"-10800"},{"displayName":"America\/Bahia","id":67,"TZName":"BRT","Offset":"-10800"},{"displayName":"America\/Sao_Paulo","id":68,"TZName":"BRT","Offset":"-10800"},{"displayName":"America\/Campo_Grande","id":69,"TZName":"AMT","Offset":"-14400"},{"displayName":"America\/Cuiaba","id":70,"TZName":"BRT","Offset":"-14400"},{"displayName":"America\/Santarem","id":71,"TZName":"BRT","Offset":"-10800"},{"displayName":"America\/Porto_Velho","id":72,"TZName":"AMT","Offset":"-14400"},{"displayName":"America\/Boa_Vista","id":73,"TZName":"AMT","Offset":"-14400"},{"displayName":"America\/Manaus","id":74,"TZName":"AMT","Offset":"-14400"},{"displayName":"America\/Eirunepe","id":75,"TZName":"ACT","Offset":"-18000"},{"displayName":"America\/Rio_Branco","id":76,"TZName":"ACT","Offset":"-18000"},{"displayName":"America\/Nassau","id":77,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"Asia\/Thimphu","id":78,"TZName":"BTT","Offset":"21600"},{"displayName":"Africa\/Gaborone","id":79,"TZName":"CAT","Offset":"7200"},{"displayName":"Europe\/Minsk","id":80,"TZName":"MSK","Offset":"10800"},{"displayName":"America\/Belize","id":81,"TZName":"CST","Offset":"-21600"},{"displayName":"America\/St_Johns","id":82,"DSTOffset":"-9000","DSTName":"NDT","Offset":"-12600","TZName":"NST","DSTData":[{"DSTStart":1615699800,"DSTEnd":1636259400},{"DSTStart":1647149400,"DSTEnd":1667709000},{"DSTStart":1678599000,"DSTEnd":1699158600},{"DSTStart":1710048600,"DSTEnd":1730608200},{"DSTStart":1741498200,"DSTEnd":1762057800},{"DSTStart":1772947800,"DSTEnd":1793507400},{"DSTStart":1805002200,"DSTEnd":1825561800},{"DSTStart":1836451800,"DSTEnd":1857011400},{"DSTStart":1867901400,"DSTEnd":1888461000},{"DSTStart":1899351000,"DSTEnd":1919910600},{"DSTStart":1930800600,"DSTEnd":1951360200},{"DSTStart":1962855000,"DSTEnd":1983414600},{"DSTStart":1994304600,"DSTEnd":2014864200}]},{"displayName":"America\/Halifax","id":83,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]},{"displayName":"America\/Glace_Bay","id":84,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]},{"displayName":"America\/Moncton","id":85,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]},{"displayName":"America\/Goose_Bay","id":86,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]},{"displayName":"America\/Blanc-Sablon","id":87,"TZName":"AST","Offset":"-14400"},{"displayName":"America\/Toronto","id":88,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Nipigon","id":89,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Thunder_Bay","id":90,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Iqaluit","id":91,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Pangnirtung","id":92,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Atikokan","id":93,"TZName":"EST","Offset":"-18000"},{"displayName":"America\/Winnipeg","id":94,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/Rainy_River","id":95,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/Resolute","id":96,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/Rankin_Inlet","id":97,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/Regina","id":98,"TZName":"CST","Offset":"-21600"},{"displayName":"America\/Swift_Current","id":99,"TZName":"CST","Offset":"-21600"},{"displayName":"America\/Edmonton","id":100,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]},{"displayName":"America\/Cambridge_Bay","id":101,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]},{"displayName":"America\/Yellowknife","id":102,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]},{"displayName":"America\/Inuvik","id":103,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]},{"displayName":"America\/Creston","id":104,"TZName":"MST","Offset":"-25200"},{"displayName":"America\/Dawson_Creek","id":105,"TZName":"MST","Offset":"-25200"},{"displayName":"America\/Fort_Nelson","id":106,"TZName":"MST","Offset":"-25200"},{"displayName":"America\/Whitehorse","id":107,"TZName":"MST","Offset":"-25200"},{"displayName":"America\/Dawson","id":108,"TZName":"MST","Offset":"-25200"},{"displayName":"America\/Vancouver","id":109,"DSTOffset":"-25200","DSTName":"PDT","Offset":"-28800","TZName":"PST","DSTData":[{"DSTStart":1615716000,"DSTEnd":1636275600},{"DSTStart":1647165600,"DSTEnd":1667725200},{"DSTStart":1678615200,"DSTEnd":1699174800},{"DSTStart":1710064800,"DSTEnd":1730624400},{"DSTStart":1741514400,"DSTEnd":1762074000},{"DSTStart":1772964000,"DSTEnd":1793523600},{"DSTStart":1805018400,"DSTEnd":1825578000},{"DSTStart":1836468000,"DSTEnd":1857027600},{"DSTStart":1867917600,"DSTEnd":1888477200},{"DSTStart":1899367200,"DSTEnd":1919926800},{"DSTStart":1930816800,"DSTEnd":1951376400},{"DSTStart":1962871200,"DSTEnd":1983430800},{"DSTStart":1994320800,"DSTEnd":2014880400}]},{"displayName":"Indian\/Cocos","id":110,"TZName":"CCT","Offset":"23400"},{"displayName":"Africa\/Kinshasa","id":111,"TZName":"WAT","Offset":"3600"},{"displayName":"Africa\/Lubumbashi","id":112,"TZName":"CAT","Offset":"7200"},{"displayName":"Africa\/Bangui","id":113,"TZName":"WAT","Offset":"3600"},{"displayName":"Africa\/Brazzaville","id":114,"TZName":"WAT","Offset":"3600"},{"displayName":"Europe\/Zurich","id":115,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Abidjan","id":116,"TZName":"GMT","Offset":"0"},{"displayName":"Pacific\/Rarotonga","id":117,"TZName":"CKT","Offset":"-36000"},{"displayName":"America\/Santiago","id":118,"Offset":"-14400","TZName":"CLT","DSTOffset":"-10800","DSTName":"CLST","DSTData":[{"DSTStart":1630814400,"DSTEnd":1648954800},{"DSTStart":1662264000,"DSTEnd":1680404400},{"DSTStart":1693713600,"DSTEnd":1712458800},{"DSTStart":1725768000,"DSTEnd":1743908400},{"DSTStart":1757217600,"DSTEnd":1775358000},{"DSTStart":1788667200,"DSTEnd":1806807600},{"DSTStart":1820116800,"DSTEnd":1838257200},{"DSTStart":1851566400,"DSTEnd":1870311600},{"DSTStart":1883016000,"DSTEnd":1901761200},{"DSTStart":1915070400,"DSTEnd":1933210800},{"DSTStart":1946520000,"DSTEnd":1964660400},{"DSTStart":1977969600,"DSTEnd":1996110000},{"DSTStart":2009419200,"DSTEnd":2027559600}]},{"displayName":"America\/Punta_Arenas","id":119,"TZName":"CLST","Offset":"-10800"},{"displayName":"Pacific\/Easter","id":120,"Offset":"-21600","TZName":"EAST","DSTOffset":"-18000","DSTName":"EASST","DSTData":[{"DSTStart":1630814400,"DSTEnd":1648954800},{"DSTStart":1662264000,"DSTEnd":1680404400},{"DSTStart":1693713600,"DSTEnd":1712458800},{"DSTStart":1725768000,"DSTEnd":1743908400},{"DSTStart":1757217600,"DSTEnd":1775358000},{"DSTStart":1788667200,"DSTEnd":1806807600},{"DSTStart":1820116800,"DSTEnd":1838257200},{"DSTStart":1851566400,"DSTEnd":1870311600},{"DSTStart":1883016000,"DSTEnd":1901761200},{"DSTStart":1915070400,"DSTEnd":1933210800},{"DSTStart":1946520000,"DSTEnd":1964660400},{"DSTStart":1977969600,"DSTEnd":1996110000},{"DSTStart":2009419200,"DSTEnd":2027559600}]},{"displayName":"Africa\/Douala","id":121,"TZName":"WAT","Offset":"3600"},{"displayName":"Asia\/Shanghai","id":122,"TZName":"CST","Offset":"28800"},{"displayName":"Asia\/Urumqi","id":123,"TZName":"URUT","Offset":"21600"},{"displayName":"America\/Bogota","id":124,"TZName":"COT","Offset":"-18000"},{"displayName":"America\/Costa_Rica","id":125,"TZName":"CST","Offset":"-21600"},{"displayName":"America\/Havana","id":126,"DSTOffset":"-14400","DSTName":"CDT","Offset":"-18000","TZName":"CST","DSTData":[{"DSTStart":1615698000,"DSTEnd":1636261200},{"DSTStart":1647147600,"DSTEnd":1667710800},{"DSTStart":1678597200,"DSTEnd":1699160400},{"DSTStart":1710046800,"DSTEnd":1730610000},{"DSTStart":1741496400,"DSTEnd":1762059600},{"DSTStart":1772946000,"DSTEnd":1793509200},{"DSTStart":1805000400,"DSTEnd":1825563600},{"DSTStart":1836450000,"DSTEnd":1857013200},{"DSTStart":1867899600,"DSTEnd":1888462800},{"DSTStart":1899349200,"DSTEnd":1919912400},{"DSTStart":1930798800,"DSTEnd":1951362000},{"DSTStart":1962853200,"DSTEnd":1983416400},{"DSTStart":1994302800,"DSTEnd":2014866000}]},{"displayName":"Atlantic\/Cape_Verde","id":127,"TZName":"CVT","Offset":"-3600"},{"displayName":"America\/Curacao","id":128,"TZName":"AST","Offset":"-14400"},{"displayName":"Indian\/Christmas","id":129,"TZName":"CXT","Offset":"25200"},{"displayName":"Asia\/Nicosia","id":130,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Asia\/Famagusta","id":131,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Prague","id":132,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Berlin","id":133,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Busingen","id":134,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Djibouti","id":135,"TZName":"EAT","Offset":"10800"},{"displayName":"Europe\/Copenhagen","id":136,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/Dominica","id":137,"TZName":"AST","Offset":"-14400"},{"displayName":"America\/Santo_Domingo","id":138,"TZName":"AST","Offset":"-14400"},{"displayName":"Africa\/Algiers","id":139,"TZName":"CET","Offset":"3600"},{"displayName":"America\/Guayaquil","id":140,"TZName":"ECT","Offset":"-18000"},{"displayName":"Pacific\/Galapagos","id":141,"TZName":"GALT","Offset":"-21600"},{"displayName":"Europe\/Tallinn","id":142,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Cairo","id":143,"TZName":"EET","Offset":"7200"},{"displayName":"Africa\/El_Aaiun","id":144,"DSTOffset":"0","DSTName":"WET","Offset":"3600","TZName":"WEST","DSTData":[{"DSTStart":1618106400,"DSTEnd":1621130400},{"DSTStart":1648346400,"DSTEnd":1651975200},{"DSTStart":1679191200,"DSTEnd":1682820000},{"DSTStart":1710036000,"DSTEnd":1713060000},{"DSTStart":1740276000,"DSTEnd":1743904800},{"DSTStart":1771120800,"DSTEnd":1774144800},{"DSTStart":1801965600,"DSTEnd":1804989600},{"DSTStart":1832205600,"DSTEnd":1835834400},{"DSTStart":1863050400,"DSTEnd":1866074400},{"DSTStart":1893290400,"DSTEnd":1896919200},{"DSTStart":1924135200,"DSTEnd":1927764000},{"DSTStart":1954980000,"DSTEnd":1958004000},{"DSTStart":1985220000,"DSTEnd":1988848800},{"DSTStart":2016064800,"DSTEnd":2019088800}]},{"displayName":"Africa\/Asmara","id":145,"TZName":"EAT","Offset":"10800"},{"displayName":"Europe\/Madrid","id":146,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Ceuta","id":147,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Atlantic\/Canary","id":148,"DSTOffset":"3600","DSTName":"WEST","Offset":"0","TZName":"WET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Addis_Ababa","id":149,"TZName":"EAT","Offset":"10800"},{"displayName":"Europe\/Helsinki","id":150,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Pacific\/Fiji","id":151,"Offset":"43200","TZName":"FJT","DSTOffset":"46800","DSTName":"FJT","DSTData":[{"DSTStart":1668261600,"DSTEnd":1673704800},{"DSTStart":1699711200,"DSTEnd":1705154400},{"DSTStart":1731160800,"DSTEnd":1736604000},{"DSTStart":1762610400,"DSTEnd":1768658400},{"DSTStart":1794060000,"DSTEnd":1800108000},{"DSTStart":1826114400,"DSTEnd":1831557600},{"DSTStart":1857564000,"DSTEnd":1863007200},{"DSTStart":1889013600,"DSTEnd":1894456800},{"DSTStart":1920463200,"DSTEnd":1925906400},{"DSTStart":1951912800,"DSTEnd":1957960800},{"DSTStart":1983967200,"DSTEnd":1989410400},{"DSTStart":2015416800,"DSTEnd":2020860000}]},{"displayName":"Atlantic\/Stanley","id":152,"TZName":"FKT","Offset":"-10800"},{"displayName":"Pacific\/Chuuk","id":153,"TZName":"CHUT","Offset":"36000"},{"displayName":"Pacific\/Pohnpei","id":154,"TZName":"PONT","Offset":"39600"},{"displayName":"Pacific\/Kosrae","id":155,"TZName":"KOST","Offset":"39600"},{"displayName":"Atlantic\/Faroe","id":156,"DSTOffset":"3600","DSTName":"WEST","Offset":"0","TZName":"WET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Paris","id":157,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Libreville","id":158,"TZName":"WAT","Offset":"3600"},{"displayName":"Europe\/London","id":159,"DSTOffset":"3600","DSTName":"BST","Offset":"0","TZName":"GMT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/Grenada","id":160,"TZName":"AST","Offset":"-14400"},{"displayName":"Asia\/Tbilisi","id":161,"TZName":"GET","Offset":"14400"},{"displayName":"America\/Cayenne","id":162,"TZName":"GFT","Offset":"-10800"},{"displayName":"Europe\/Guernsey","id":163,"DSTOffset":"3600","DSTName":"BST","Offset":"0","TZName":"GMT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Accra","id":164,"TZName":"GMT","Offset":"0"},{"displayName":"Europe\/Gibraltar","id":165,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/Nuuk","id":166,"DSTOffset":"-7200","DSTName":"WGST","Offset":"-10800","TZName":"WGT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/Danmarkshavn","id":167,"TZName":"GMT","Offset":"0"},{"displayName":"America\/Scoresbysund","id":168,"DSTOffset":"0","DSTName":"EGST","Offset":"-3600","TZName":"EGT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/Thule","id":169,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]},{"displayName":"Africa\/Banjul","id":170,"TZName":"GMT","Offset":"0"},{"displayName":"Africa\/Conakry","id":171,"TZName":"GMT","Offset":"0"},{"displayName":"America\/Guadeloupe","id":172,"TZName":"AST","Offset":"-14400"},{"displayName":"Africa\/Malabo","id":173,"TZName":"WAT","Offset":"3600"},{"displayName":"Europe\/Athens","id":174,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Atlantic\/South_Georgia","id":175,"TZName":"GST","Offset":"-7200"},{"displayName":"America\/Guatemala","id":176,"TZName":"CST","Offset":"-21600"},{"displayName":"Pacific\/Guam","id":177,"TZName":"ChST","Offset":"36000"},{"displayName":"Africa\/Bissau","id":178,"TZName":"GMT","Offset":"0"},{"displayName":"America\/Guyana","id":179,"TZName":"GYT","Offset":"-14400"},{"displayName":"Asia\/Hong_Kong","id":180,"TZName":"HKT","Offset":"28800"},{"displayName":"America\/Tegucigalpa","id":181,"TZName":"CST","Offset":"-21600"},{"displayName":"Europe\/Zagreb","id":182,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/Port-au-Prince","id":183,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"Europe\/Budapest","id":184,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Asia\/Jakarta","id":185,"TZName":"WIB","Offset":"25200"},{"displayName":"Asia\/Pontianak","id":186,"TZName":"WIB","Offset":"25200"},{"displayName":"Asia\/Makassar","id":187,"TZName":"WITA","Offset":"28800"},{"displayName":"Asia\/Jayapura","id":188,"TZName":"WIT","Offset":"32400"},{"displayName":"Europe\/Dublin","id":189,"Offset":"3600","TZName":"IST","DSTOffset":"0","DSTName":"GMT","DSTData":[{"DSTStart":1635642000,"DSTEnd":1648342800},{"DSTStart":1667091600,"DSTEnd":1679792400},{"DSTStart":1698541200,"DSTEnd":1711846800},{"DSTStart":1729990800,"DSTEnd":1743296400},{"DSTStart":1761440400,"DSTEnd":1774746000},{"DSTStart":1792890000,"DSTEnd":1806195600},{"DSTStart":1824944400,"DSTEnd":1837645200},{"DSTStart":1856394000,"DSTEnd":1869094800},{"DSTStart":1887843600,"DSTEnd":1901149200},{"DSTStart":1919293200,"DSTEnd":1932598800},{"DSTStart":1950742800,"DSTEnd":1964048400},{"DSTStart":1982797200,"DSTEnd":1995498000},{"DSTStart":2014246800,"DSTEnd":2026947600}]},{"displayName":"Asia\/Jerusalem","id":190,"DSTOffset":"10800","DSTName":"IDT","Offset":"7200","TZName":"IST","DSTData":[{"DSTStart":1616716800,"DSTEnd":1635634800},{"DSTStart":1648166400,"DSTEnd":1667084400},{"DSTStart":1679616000,"DSTEnd":1698534000},{"DSTStart":1711670400,"DSTEnd":1729983600},{"DSTStart":1743120000,"DSTEnd":1761433200},{"DSTStart":1774569600,"DSTEnd":1792882800},{"DSTStart":1806019200,"DSTEnd":1824937200},{"DSTStart":1837468800,"DSTEnd":1856386800},{"DSTStart":1868918400,"DSTEnd":1887836400},{"DSTStart":1900972800,"DSTEnd":1919286000},{"DSTStart":1932422400,"DSTEnd":1950735600},{"DSTStart":1963872000,"DSTEnd":1982790000},{"DSTStart":1995321600,"DSTEnd":2014239600}]},{"displayName":"Europe\/Isle_of_Man","id":191,"DSTOffset":"3600","DSTName":"BST","Offset":"0","TZName":"GMT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Asia\/Kolkata","id":192,"TZName":"IST","Offset":"19800"},{"displayName":"Indian\/Chagos","id":193,"TZName":"IOT","Offset":"21600"},{"displayName":"Asia\/Baghdad","id":194,"TZName":"AST","Offset":"10800"},{"displayName":"Asia\/Tehran","id":195,"DSTOffset":"16200","DSTName":"IRST","Offset":"12600","TZName":"IRDT","DSTData":[{"DSTStart":1616358600,"DSTEnd":1632252600},{"DSTStart":1647894600,"DSTEnd":1663788600},{"DSTStart":1679430600,"DSTEnd":1695324600},{"DSTStart":1710966600,"DSTEnd":1726860600},{"DSTStart":1742589000,"DSTEnd":1758483000},{"DSTStart":1774125000,"DSTEnd":1790019000},{"DSTStart":1805661000,"DSTEnd":1821555000},{"DSTStart":1837197000,"DSTEnd":1853091000},{"DSTStart":1868733000,"DSTEnd":1884627000},{"DSTStart":1900355400,"DSTEnd":1916249400},{"DSTStart":1931891400,"DSTEnd":1947785400},{"DSTStart":1963427400,"DSTEnd":1979321400},{"DSTStart":1994963400,"DSTEnd":2010857400}]},{"displayName":"Atlantic\/Reykjavik","id":196,"TZName":"GMT","Offset":"0"},{"displayName":"Europe\/Rome","id":197,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Jersey","id":198,"DSTOffset":"3600","DSTName":"BST","Offset":"0","TZName":"GMT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/Jamaica","id":199,"TZName":"EST","Offset":"-18000"},{"displayName":"Asia\/Amman","id":200,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616709600,"DSTEnd":1635458400},{"DSTStart":1645740000,"DSTEnd":1666908000},{"DSTStart":1677189600,"DSTEnd":1698357600},{"DSTStart":1709244000,"DSTEnd":1729807200},{"DSTStart":1740693600,"DSTEnd":1761861600},{"DSTStart":1772143200,"DSTEnd":1793311200},{"DSTStart":1803592800,"DSTEnd":1824760800},{"DSTStart":1835042400,"DSTEnd":1856210400},{"DSTStart":1866492000,"DSTEnd":1887660000},{"DSTStart":1898546400,"DSTEnd":1919109600},{"DSTStart":1929996000,"DSTEnd":1951164000},{"DSTStart":1961445600,"DSTEnd":1982613600},{"DSTStart":1992895200,"DSTEnd":2014063200}]},{"displayName":"Asia\/Tokyo","id":201,"TZName":"JST","Offset":"32400"},{"displayName":"Africa\/Nairobi","id":202,"TZName":"EAT","Offset":"10800"},{"displayName":"Asia\/Bishkek","id":203,"TZName":"KGST","Offset":"21600"},{"displayName":"Asia\/Phnom_Penh","id":204,"TZName":"ICT","Offset":"25200"},{"displayName":"Pacific\/Tarawa","id":205,"TZName":"GILT","Offset":"43200"},{"displayName":"Pacific\/Kanton","id":206,"TZName":"EST","Offset":"46800"},{"displayName":"Pacific\/Kiritimati","id":207,"TZName":"LINT","Offset":"50400"},{"displayName":"Indian\/Comoro","id":208,"TZName":"EAT","Offset":"10800"},{"displayName":"America\/St_Kitts","id":209,"TZName":"AST","Offset":"-14400"},{"displayName":"Asia\/Pyongyang","id":210,"TZName":"KST","Offset":"32400"},{"displayName":"Asia\/Seoul","id":211,"TZName":"KST","Offset":"32400"},{"displayName":"Asia\/Kuwait","id":212,"TZName":"AST","Offset":"10800"},{"displayName":"America\/Cayman","id":213,"TZName":"EST","Offset":"-18000"},{"displayName":"Asia\/Almaty","id":214,"TZName":"ALMT","Offset":"21600"},{"displayName":"Asia\/Qyzylorda","id":215,"TZName":"MSK+2","Offset":"18000"},{"displayName":"Asia\/Qostanay","id":216,"TZName":"QYZST","Offset":"21600"},{"displayName":"Asia\/Aqtobe","id":217,"TZName":"AQTT","Offset":"18000"},{"displayName":"Asia\/Aqtau","id":218,"TZName":"MSD+1","Offset":"18000"},{"displayName":"Asia\/Atyrau","id":219,"TZName":"MSD+1","Offset":"18000"},{"displayName":"Asia\/Oral","id":220,"TZName":"ORAST","Offset":"18000"},{"displayName":"Asia\/Vientiane","id":221,"TZName":"ICT","Offset":"25200"},{"displayName":"Asia\/Beirut","id":222,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616882400,"DSTEnd":1635627600},{"DSTStart":1648332000,"DSTEnd":1667077200},{"DSTStart":1679781600,"DSTEnd":1698526800},{"DSTStart":1711836000,"DSTEnd":1729976400},{"DSTStart":1743285600,"DSTEnd":1761426000},{"DSTStart":1774735200,"DSTEnd":1792875600},{"DSTStart":1806184800,"DSTEnd":1824930000},{"DSTStart":1837634400,"DSTEnd":1856379600},{"DSTStart":1869084000,"DSTEnd":1887829200},{"DSTStart":1901138400,"DSTEnd":1919278800},{"DSTStart":1932588000,"DSTEnd":1950728400},{"DSTStart":1964037600,"DSTEnd":1982782800},{"DSTStart":1995487200,"DSTEnd":2014232400}]},{"displayName":"America\/St_Lucia","id":223,"TZName":"AST","Offset":"-14400"},{"displayName":"Europe\/Vaduz","id":224,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Asia\/Colombo","id":225,"TZName":"IST","Offset":"19800"},{"displayName":"Africa\/Monrovia","id":226,"TZName":"GMT","Offset":"0"},{"displayName":"Africa\/Maseru","id":227,"TZName":"SAST","Offset":"7200"},{"displayName":"Europe\/Vilnius","id":228,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Luxembourg","id":229,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Riga","id":230,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Tripoli","id":231,"TZName":"EET","Offset":"7200"},{"displayName":"Africa\/Casablanca","id":232,"DSTOffset":"0","DSTName":"WET","Offset":"3600","TZName":"WEST","DSTData":[{"DSTStart":1618106400,"DSTEnd":1621130400},{"DSTStart":1648346400,"DSTEnd":1651975200},{"DSTStart":1679191200,"DSTEnd":1682820000},{"DSTStart":1710036000,"DSTEnd":1713060000},{"DSTStart":1740276000,"DSTEnd":1743904800},{"DSTStart":1771120800,"DSTEnd":1774144800},{"DSTStart":1801965600,"DSTEnd":1804989600},{"DSTStart":1832205600,"DSTEnd":1835834400},{"DSTStart":1863050400,"DSTEnd":1866074400},{"DSTStart":1893290400,"DSTEnd":1896919200},{"DSTStart":1924135200,"DSTEnd":1927764000},{"DSTStart":1954980000,"DSTEnd":1958004000},{"DSTStart":1985220000,"DSTEnd":1988848800},{"DSTStart":2016064800,"DSTEnd":2019088800}]},{"displayName":"Europe\/Monaco","id":233,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Chisinau","id":234,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616889600,"DSTEnd":1635638400},{"DSTStart":1648339200,"DSTEnd":1667088000},{"DSTStart":1679788800,"DSTEnd":1698537600},{"DSTStart":1711843200,"DSTEnd":1729987200},{"DSTStart":1743292800,"DSTEnd":1761436800},{"DSTStart":1774742400,"DSTEnd":1792886400},{"DSTStart":1806192000,"DSTEnd":1824940800},{"DSTStart":1837641600,"DSTEnd":1856390400},{"DSTStart":1869091200,"DSTEnd":1887840000},{"DSTStart":1901145600,"DSTEnd":1919289600},{"DSTStart":1932595200,"DSTEnd":1950739200},{"DSTStart":1964044800,"DSTEnd":1982793600},{"DSTStart":1995494400,"DSTEnd":2014243200}]},{"displayName":"Europe\/Podgorica","id":235,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/Marigot","id":236,"TZName":"AST","Offset":"-14400"},{"displayName":"Indian\/Antananarivo","id":237,"TZName":"EAT","Offset":"10800"},{"displayName":"Pacific\/Majuro","id":238,"TZName":"+12","Offset":"43200"},{"displayName":"Pacific\/Kwajalein","id":239,"TZName":"+12","Offset":"43200"},{"displayName":"Europe\/Skopje","id":240,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Bamako","id":241,"TZName":"GMT","Offset":"0"},{"displayName":"Asia\/Yangon","id":242,"TZName":"MMT","Offset":"23400"},{"displayName":"Asia\/Ulaanbaatar","id":243,"TZName":"ULAT","Offset":"28800"},{"displayName":"Asia\/Hovd","id":244,"TZName":"HOVT","Offset":"25200"},{"displayName":"Asia\/Choibalsan","id":245,"TZName":"CHOT","Offset":"28800"},{"displayName":"Asia\/Macau","id":246,"TZName":"CST","Offset":"28800"},{"displayName":"Pacific\/Saipan","id":247,"TZName":"ChST","Offset":"36000"},{"displayName":"America\/Martinique","id":248,"TZName":"AST","Offset":"-14400"},{"displayName":"Africa\/Nouakchott","id":249,"TZName":"GMT","Offset":"0"},{"displayName":"America\/Montserrat","id":250,"TZName":"AST","Offset":"-14400"},{"displayName":"Europe\/Malta","id":251,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Indian\/Mauritius","id":252,"TZName":"MUT","Offset":"14400"},{"displayName":"Indian\/Maldives","id":253,"TZName":"MVT","Offset":"18000"},{"displayName":"Africa\/Blantyre","id":254,"TZName":"CAT","Offset":"7200"},{"displayName":"America\/Mexico_City","id":255,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1617523200,"DSTEnd":1635663600},{"DSTStart":1648972800,"DSTEnd":1667113200},{"DSTStart":1680422400,"DSTEnd":1698562800},{"DSTStart":1712476800,"DSTEnd":1730012400},{"DSTStart":1743926400,"DSTEnd":1761462000},{"DSTStart":1775376000,"DSTEnd":1792911600},{"DSTStart":1806825600,"DSTEnd":1824966000},{"DSTStart":1838275200,"DSTEnd":1856415600},{"DSTStart":1869724800,"DSTEnd":1887865200},{"DSTStart":1901779200,"DSTEnd":1919314800},{"DSTStart":1933228800,"DSTEnd":1950764400},{"DSTStart":1964678400,"DSTEnd":1982818800},{"DSTStart":1996128000,"DSTEnd":2014268400}]},{"displayName":"America\/Cancun","id":256,"TZName":"EST","Offset":"-18000"},{"displayName":"America\/Merida","id":257,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1617523200,"DSTEnd":1635663600},{"DSTStart":1648972800,"DSTEnd":1667113200},{"DSTStart":1680422400,"DSTEnd":1698562800},{"DSTStart":1712476800,"DSTEnd":1730012400},{"DSTStart":1743926400,"DSTEnd":1761462000},{"DSTStart":1775376000,"DSTEnd":1792911600},{"DSTStart":1806825600,"DSTEnd":1824966000},{"DSTStart":1838275200,"DSTEnd":1856415600},{"DSTStart":1869724800,"DSTEnd":1887865200},{"DSTStart":1901779200,"DSTEnd":1919314800},{"DSTStart":1933228800,"DSTEnd":1950764400},{"DSTStart":1964678400,"DSTEnd":1982818800},{"DSTStart":1996128000,"DSTEnd":2014268400}]},{"displayName":"America\/Monterrey","id":258,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1617523200,"DSTEnd":1635663600},{"DSTStart":1648972800,"DSTEnd":1667113200},{"DSTStart":1680422400,"DSTEnd":1698562800},{"DSTStart":1712476800,"DSTEnd":1730012400},{"DSTStart":1743926400,"DSTEnd":1761462000},{"DSTStart":1775376000,"DSTEnd":1792911600},{"DSTStart":1806825600,"DSTEnd":1824966000},{"DSTStart":1838275200,"DSTEnd":1856415600},{"DSTStart":1869724800,"DSTEnd":1887865200},{"DSTStart":1901779200,"DSTEnd":1919314800},{"DSTStart":1933228800,"DSTEnd":1950764400},{"DSTStart":1964678400,"DSTEnd":1982818800},{"DSTStart":1996128000,"DSTEnd":2014268400}]},{"displayName":"America\/Matamoros","id":259,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/Mazatlan","id":260,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1617526800,"DSTEnd":1635667200},{"DSTStart":1648976400,"DSTEnd":1667116800},{"DSTStart":1680426000,"DSTEnd":1698566400},{"DSTStart":1712480400,"DSTEnd":1730016000},{"DSTStart":1743930000,"DSTEnd":1761465600},{"DSTStart":1775379600,"DSTEnd":1792915200},{"DSTStart":1806829200,"DSTEnd":1824969600},{"DSTStart":1838278800,"DSTEnd":1856419200},{"DSTStart":1869728400,"DSTEnd":1887868800},{"DSTStart":1901782800,"DSTEnd":1919318400},{"DSTStart":1933232400,"DSTEnd":1950768000},{"DSTStart":1964682000,"DSTEnd":1982822400},{"DSTStart":1996131600,"DSTEnd":2014272000}]},{"displayName":"America\/Chihuahua","id":261,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1617526800,"DSTEnd":1635667200},{"DSTStart":1648976400,"DSTEnd":1667116800},{"DSTStart":1680426000,"DSTEnd":1698566400},{"DSTStart":1712480400,"DSTEnd":1730016000},{"DSTStart":1743930000,"DSTEnd":1761465600},{"DSTStart":1775379600,"DSTEnd":1792915200},{"DSTStart":1806829200,"DSTEnd":1824969600},{"DSTStart":1838278800,"DSTEnd":1856419200},{"DSTStart":1869728400,"DSTEnd":1887868800},{"DSTStart":1901782800,"DSTEnd":1919318400},{"DSTStart":1933232400,"DSTEnd":1950768000},{"DSTStart":1964682000,"DSTEnd":1982822400},{"DSTStart":1996131600,"DSTEnd":2014272000}]},{"displayName":"America\/Ojinaga","id":262,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]},{"displayName":"America\/Hermosillo","id":263,"TZName":"MST","Offset":"-25200"},{"displayName":"America\/Tijuana","id":264,"DSTOffset":"-25200","DSTName":"PDT","Offset":"-28800","TZName":"PST","DSTData":[{"DSTStart":1615716000,"DSTEnd":1636275600},{"DSTStart":1647165600,"DSTEnd":1667725200},{"DSTStart":1678615200,"DSTEnd":1699174800},{"DSTStart":1710064800,"DSTEnd":1730624400},{"DSTStart":1741514400,"DSTEnd":1762074000},{"DSTStart":1772964000,"DSTEnd":1793523600},{"DSTStart":1805018400,"DSTEnd":1825578000},{"DSTStart":1836468000,"DSTEnd":1857027600},{"DSTStart":1867917600,"DSTEnd":1888477200},{"DSTStart":1899367200,"DSTEnd":1919926800},{"DSTStart":1930816800,"DSTEnd":1951376400},{"DSTStart":1962871200,"DSTEnd":1983430800},{"DSTStart":1994320800,"DSTEnd":2014880400}]},{"displayName":"America\/Bahia_Banderas","id":265,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1617523200,"DSTEnd":1635663600},{"DSTStart":1648972800,"DSTEnd":1667113200},{"DSTStart":1680422400,"DSTEnd":1698562800},{"DSTStart":1712476800,"DSTEnd":1730012400},{"DSTStart":1743926400,"DSTEnd":1761462000},{"DSTStart":1775376000,"DSTEnd":1792911600},{"DSTStart":1806825600,"DSTEnd":1824966000},{"DSTStart":1838275200,"DSTEnd":1856415600},{"DSTStart":1869724800,"DSTEnd":1887865200},{"DSTStart":1901779200,"DSTEnd":1919314800},{"DSTStart":1933228800,"DSTEnd":1950764400},{"DSTStart":1964678400,"DSTEnd":1982818800},{"DSTStart":1996128000,"DSTEnd":2014268400}]},{"displayName":"Asia\/Kuala_Lumpur","id":266,"TZName":"MYT","Offset":"28800"},{"displayName":"Asia\/Kuching","id":267,"TZName":"MYT","Offset":"28800"},{"displayName":"Africa\/Maputo","id":268,"TZName":"CAT","Offset":"7200"},{"displayName":"Africa\/Windhoek","id":269,"TZName":"CAT","Offset":"7200"},{"displayName":"Pacific\/Noumea","id":270,"TZName":"NCT","Offset":"39600"},{"displayName":"Africa\/Niamey","id":271,"TZName":"WAT","Offset":"3600"},{"displayName":"Pacific\/Norfolk","id":272,"Offset":"39600","TZName":"NFT","DSTOffset":"43200","DSTName":"NFDT","DSTData":[{"DSTStart":1633186800,"DSTEnd":1648911600},{"DSTStart":1664636400,"DSTEnd":1680361200},{"DSTStart":1696086000,"DSTEnd":1712415600},{"DSTStart":1728140400,"DSTEnd":1743865200},{"DSTStart":1759590000,"DSTEnd":1775314800},{"DSTStart":1791039600,"DSTEnd":1806764400},{"DSTStart":1822489200,"DSTEnd":1838214000},{"DSTStart":1853938800,"DSTEnd":1869663600},{"DSTStart":1885993200,"DSTEnd":1901718000},{"DSTStart":1917442800,"DSTEnd":1933167600},{"DSTStart":1948892400,"DSTEnd":1964617200},{"DSTStart":1980342000,"DSTEnd":1996066800},{"DSTStart":2011791600,"DSTEnd":2027516400}]},{"displayName":"Africa\/Lagos","id":273,"TZName":"WAT","Offset":"3600"},{"displayName":"America\/Managua","id":274,"TZName":"CST","Offset":"-21600"},{"displayName":"Europe\/Amsterdam","id":275,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Oslo","id":276,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Asia\/Kathmandu","id":277,"TZName":"NPT","Offset":"20700"},{"displayName":"Pacific\/Nauru","id":278,"TZName":"NRT","Offset":"43200"},{"displayName":"Pacific\/Niue","id":279,"TZName":"NUT","Offset":"-39600"},{"displayName":"Pacific\/Auckland","id":280,"Offset":"43200","TZName":"NZST","DSTOffset":"46800","DSTName":"NZDT","DSTData":[{"DSTStart":1632578400,"DSTEnd":1648908000},{"DSTStart":1664028000,"DSTEnd":1680357600},{"DSTStart":1695477600,"DSTEnd":1712412000},{"DSTStart":1727532000,"DSTEnd":1743861600},{"DSTStart":1758981600,"DSTEnd":1775311200},{"DSTStart":1790431200,"DSTEnd":1806760800},{"DSTStart":1821880800,"DSTEnd":1838210400},{"DSTStart":1853330400,"DSTEnd":1869660000},{"DSTStart":1885384800,"DSTEnd":1901714400},{"DSTStart":1916834400,"DSTEnd":1933164000},{"DSTStart":1948284000,"DSTEnd":1964613600},{"DSTStart":1979733600,"DSTEnd":1996063200},{"DSTStart":2011183200,"DSTEnd":2027512800}]},{"displayName":"Pacific\/Chatham","id":281,"Offset":"45900","TZName":"CHAST","DSTOffset":"49500","DSTName":"CHADT","DSTData":[{"DSTStart":1632578400,"DSTEnd":1648908000},{"DSTStart":1664028000,"DSTEnd":1680357600},{"DSTStart":1695477600,"DSTEnd":1712412000},{"DSTStart":1727532000,"DSTEnd":1743861600},{"DSTStart":1758981600,"DSTEnd":1775311200},{"DSTStart":1790431200,"DSTEnd":1806760800},{"DSTStart":1821880800,"DSTEnd":1838210400},{"DSTStart":1853330400,"DSTEnd":1869660000},{"DSTStart":1885384800,"DSTEnd":1901714400},{"DSTStart":1916834400,"DSTEnd":1933164000},{"DSTStart":1948284000,"DSTEnd":1964613600},{"DSTStart":1979733600,"DSTEnd":1996063200},{"DSTStart":2011183200,"DSTEnd":2027512800}]},{"displayName":"Asia\/Muscat","id":282,"TZName":"GST","Offset":"14400"},{"displayName":"America\/Panama","id":283,"TZName":"EST","Offset":"-18000"},{"displayName":"America\/Lima","id":284,"TZName":"PET","Offset":"-18000"},{"displayName":"Pacific\/Tahiti","id":285,"TZName":"TAHT","Offset":"-36000"},{"displayName":"Pacific\/Marquesas","id":286,"TZName":"MART","Offset":"-34200"},{"displayName":"Pacific\/Gambier","id":287,"TZName":"GAMT","Offset":"-32400"},{"displayName":"Pacific\/Port_Moresby","id":288,"TZName":"PGT","Offset":"36000"},{"displayName":"Pacific\/Bougainville","id":289,"TZName":"BST","Offset":"39600"},{"displayName":"Asia\/Manila","id":290,"TZName":"PST","Offset":"28800"},{"displayName":"Asia\/Karachi","id":291,"TZName":"PKT","Offset":"18000"},{"displayName":"Europe\/Warsaw","id":292,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/Miquelon","id":293,"DSTOffset":"-7200","DSTName":"PMST","Offset":"-10800","TZName":"PMDT","DSTData":[{"DSTStart":1615698000,"DSTEnd":1636257600},{"DSTStart":1647147600,"DSTEnd":1667707200},{"DSTStart":1678597200,"DSTEnd":1699156800},{"DSTStart":1710046800,"DSTEnd":1730606400},{"DSTStart":1741496400,"DSTEnd":1762056000},{"DSTStart":1772946000,"DSTEnd":1793505600},{"DSTStart":1805000400,"DSTEnd":1825560000},{"DSTStart":1836450000,"DSTEnd":1857009600},{"DSTStart":1867899600,"DSTEnd":1888459200},{"DSTStart":1899349200,"DSTEnd":1919908800},{"DSTStart":1930798800,"DSTEnd":1951358400},{"DSTStart":1962853200,"DSTEnd":1983412800},{"DSTStart":1994302800,"DSTEnd":2014862400}]},{"displayName":"Pacific\/Pitcairn","id":294,"TZName":"PST","Offset":"-28800"},{"displayName":"America\/Puerto_Rico","id":295,"TZName":"AST","Offset":"-14400"},{"displayName":"Asia\/Gaza","id":296,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616796000,"DSTEnd":1635544800},{"DSTStart":1648245600,"DSTEnd":1666994400},{"DSTStart":1679695200,"DSTEnd":1698444000},{"DSTStart":1711749600,"DSTEnd":1729893600},{"DSTStart":1743199200,"DSTEnd":1761343200},{"DSTStart":1774648800,"DSTEnd":1792792800},{"DSTStart":1806098400,"DSTEnd":1824847200},{"DSTStart":1837548000,"DSTEnd":1856296800},{"DSTStart":1868997600,"DSTEnd":1887746400},{"DSTStart":1901052000,"DSTEnd":1919196000},{"DSTStart":1932501600,"DSTEnd":1950645600},{"DSTStart":1963951200,"DSTEnd":1982700000},{"DSTStart":1995400800,"DSTEnd":2014149600}]},{"displayName":"Asia\/Hebron","id":297,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616796000,"DSTEnd":1635544800},{"DSTStart":1648245600,"DSTEnd":1666994400},{"DSTStart":1679695200,"DSTEnd":1698444000},{"DSTStart":1711749600,"DSTEnd":1729893600},{"DSTStart":1743199200,"DSTEnd":1761343200},{"DSTStart":1774648800,"DSTEnd":1792792800},{"DSTStart":1806098400,"DSTEnd":1824847200},{"DSTStart":1837548000,"DSTEnd":1856296800},{"DSTStart":1868997600,"DSTEnd":1887746400},{"DSTStart":1901052000,"DSTEnd":1919196000},{"DSTStart":1932501600,"DSTEnd":1950645600},{"DSTStart":1963951200,"DSTEnd":1982700000},{"DSTStart":1995400800,"DSTEnd":2014149600}]},{"displayName":"Europe\/Lisbon","id":298,"DSTOffset":"3600","DSTName":"WEST","Offset":"0","TZName":"WET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Atlantic\/Madeira","id":299,"DSTOffset":"3600","DSTName":"WEST","Offset":"0","TZName":"WET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Atlantic\/Azores","id":300,"DSTOffset":"0","DSTName":"AZOST","Offset":"-3600","TZName":"AZOT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Pacific\/Palau","id":301,"TZName":"+09","Offset":"32400"},{"displayName":"America\/Asuncion","id":302,"Offset":"-14400","TZName":"PYT","DSTOffset":"-10800","DSTName":"PYST","DSTData":[{"DSTStart":1633233600,"DSTEnd":1648350000},{"DSTStart":1664683200,"DSTEnd":1679799600},{"DSTStart":1696132800,"DSTEnd":1711249200},{"DSTStart":1728187200,"DSTEnd":1742698800},{"DSTStart":1759636800,"DSTEnd":1774148400},{"DSTStart":1791086400,"DSTEnd":1806202800},{"DSTStart":1822536000,"DSTEnd":1837652400},{"DSTStart":1853985600,"DSTEnd":1869102000},{"DSTStart":1886040000,"DSTEnd":1900551600},{"DSTStart":1917489600,"DSTEnd":1932001200},{"DSTStart":1948939200,"DSTEnd":1964055600},{"DSTStart":1980388800,"DSTEnd":1995505200},{"DSTStart":2011838400,"DSTEnd":2026954800}]},{"displayName":"Asia\/Qatar","id":303,"TZName":"AST","Offset":"10800"},{"displayName":"Indian\/Reunion","id":304,"TZName":"RET","Offset":"14400"},{"displayName":"Europe\/Bucharest","id":305,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Belgrade","id":306,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Kaliningrad","id":307,"TZName":"EET","Offset":"7200"},{"displayName":"Europe\/Moscow","id":308,"TZName":"MSK","Offset":"10800"},{"displayName":"Europe\/Simferopol","id":309,"TZName":"MSK","Offset":"10800"},{"displayName":"Europe\/Kirov","id":310,"TZName":"MSK","Offset":"10800"},{"displayName":"Europe\/Volgograd","id":311,"TZName":"VOLT","Offset":"10800"},{"displayName":"Europe\/Astrakhan","id":312,"TZName":"MSK+1","Offset":"14400"},{"displayName":"Europe\/Saratov","id":313,"TZName":"MSD","Offset":"14400"},{"displayName":"Europe\/Ulyanovsk","id":314,"TZName":"MSK+1","Offset":"14400"},{"displayName":"Europe\/Samara","id":315,"TZName":"SAMT","Offset":"14400"},{"displayName":"Asia\/Yekaterinburg","id":316,"TZName":"YEKT","Offset":"18000"},{"displayName":"Asia\/Omsk","id":317,"TZName":"OMST","Offset":"21600"},{"displayName":"Asia\/Novosibirsk","id":318,"TZName":"NOVT","Offset":"25200"},{"displayName":"Asia\/Barnaul","id":319,"TZName":"MSK+4","Offset":"25200"},{"displayName":"Asia\/Tomsk","id":320,"TZName":"MSD+3","Offset":"25200"},{"displayName":"Asia\/Novokuznetsk","id":321,"TZName":"KRAT","Offset":"25200"},{"displayName":"Asia\/Krasnoyarsk","id":322,"TZName":"KRAT","Offset":"25200"},{"displayName":"Asia\/Irkutsk","id":323,"TZName":"IRKT","Offset":"28800"},{"displayName":"Asia\/Chita","id":324,"TZName":"YAKT","Offset":"32400"},{"displayName":"Asia\/Yakutsk","id":325,"TZName":"YAKT","Offset":"32400"},{"displayName":"Asia\/Khandyga","id":326,"TZName":"YAKT","Offset":"32400"},{"displayName":"Asia\/Vladivostok","id":327,"TZName":"VLAT","Offset":"36000"},{"displayName":"Asia\/Ust-Nera","id":328,"TZName":"VLAT","Offset":"36000"},{"displayName":"Asia\/Magadan","id":329,"TZName":"MAGT","Offset":"39600"},{"displayName":"Asia\/Sakhalin","id":330,"TZName":"SAKT","Offset":"39600"},{"displayName":"Asia\/Srednekolymsk","id":331,"TZName":"SRET","Offset":"39600"},{"displayName":"Asia\/Kamchatka","id":332,"TZName":"PETT","Offset":"43200"},{"displayName":"Asia\/Anadyr","id":333,"TZName":"ANAT","Offset":"43200"},{"displayName":"Africa\/Kigali","id":334,"TZName":"CAT","Offset":"7200"},{"displayName":"Asia\/Riyadh","id":335,"TZName":"AST","Offset":"10800"},{"displayName":"Pacific\/Guadalcanal","id":336,"TZName":"SBT","Offset":"39600"},{"displayName":"Indian\/Mahe","id":337,"TZName":"SCT","Offset":"14400"},{"displayName":"Africa\/Khartoum","id":338,"TZName":"CAT","Offset":"7200"},{"displayName":"Europe\/Stockholm","id":339,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Asia\/Singapore","id":340,"TZName":"SST","Offset":"28800"},{"displayName":"Atlantic\/St_Helena","id":341,"TZName":"GMT","Offset":"0"},{"displayName":"Europe\/Ljubljana","id":342,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Arctic\/Longyearbyen","id":343,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Bratislava","id":344,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Freetown","id":345,"TZName":"GMT","Offset":"0"},{"displayName":"Europe\/San_Marino","id":346,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Dakar","id":347,"TZName":"GMT","Offset":"0"},{"displayName":"Africa\/Mogadishu","id":348,"TZName":"EAT","Offset":"10800"},{"displayName":"America\/Paramaribo","id":349,"TZName":"SRT","Offset":"-10800"},{"displayName":"Africa\/Juba","id":350,"Offset":"7200","TZName":"CAT"},{"displayName":"Africa\/Sao_Tome","id":351,"TZName":"GMT","Offset":"0"},{"displayName":"America\/El_Salvador","id":352,"TZName":"CST","Offset":"-21600"},{"displayName":"America\/Lower_Princes","id":353,"TZName":"AST","Offset":"-14400"},{"displayName":"Asia\/Damascus","id":354,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616709600,"DSTEnd":1635454800},{"DSTStart":1648159200,"DSTEnd":1666904400},{"DSTStart":1680213600,"DSTEnd":1698354000},{"DSTStart":1711663200,"DSTEnd":1729803600},{"DSTStart":1743112800,"DSTEnd":1761858000},{"DSTStart":1774562400,"DSTEnd":1793307600},{"DSTStart":1806012000,"DSTEnd":1824757200},{"DSTStart":1838066400,"DSTEnd":1856206800},{"DSTStart":1869516000,"DSTEnd":1887656400},{"DSTStart":1900965600,"DSTEnd":1919106000},{"DSTStart":1932415200,"DSTEnd":1951160400},{"DSTStart":1963864800,"DSTEnd":1982610000},{"DSTStart":1995314400,"DSTEnd":2014059600}]},{"displayName":"Africa\/Mbabane","id":355,"TZName":"SAST","Offset":"7200"},{"displayName":"America\/Grand_Turk","id":356,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"Africa\/Ndjamena","id":357,"TZName":"WAT","Offset":"3600"},{"displayName":"Indian\/Kerguelen","id":358,"TZName":"TFT","Offset":"18000"},{"displayName":"Africa\/Lome","id":359,"TZName":"GMT","Offset":"0"},{"displayName":"Asia\/Bangkok","id":360,"TZName":"ICT","Offset":"25200"},{"displayName":"Asia\/Dushanbe","id":361,"TZName":"TJT","Offset":"18000"},{"displayName":"Pacific\/Fakaofo","id":362,"TZName":"TKT","Offset":"46800"},{"displayName":"Asia\/Dili","id":363,"TZName":"TLT","Offset":"32400"},{"displayName":"Asia\/Ashgabat","id":364,"TZName":"TMT","Offset":"18000"},{"displayName":"Africa\/Tunis","id":365,"TZName":"CET","Offset":"3600"},{"displayName":"Pacific\/Tongatapu","id":366,"TZName":"TOT","Offset":"46800"},{"displayName":"Europe\/Istanbul","id":367,"TZName":"TRT","Offset":"10800"},{"displayName":"America\/Port_of_Spain","id":368,"TZName":"AST","Offset":"-14400"},{"displayName":"Pacific\/Funafuti","id":369,"TZName":"TVT","Offset":"43200"},{"displayName":"Asia\/Taipei","id":370,"TZName":"CST","Offset":"28800"},{"displayName":"Africa\/Dar_es_Salaam","id":371,"TZName":"EAT","Offset":"10800"},{"displayName":"Europe\/Kiev","id":372,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Uzhgorod","id":373,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Europe\/Zaporozhye","id":374,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"Africa\/Kampala","id":375,"TZName":"EAT","Offset":"10800"},{"displayName":"Pacific\/Midway","id":376,"TZName":"SST","Offset":"-39600"},{"displayName":"Pacific\/Wake","id":377,"TZName":"WAKT","Offset":"43200"},{"displayName":"America\/New_York","id":378,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Detroit","id":379,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Kentucky\/Louisville","id":380,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Kentucky\/Monticello","id":381,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Indiana\/Indianapolis","id":382,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Indiana\/Vincennes","id":383,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Indiana\/Winamac","id":384,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Indiana\/Marengo","id":385,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Indiana\/Petersburg","id":386,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Indiana\/Vevay","id":387,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]},{"displayName":"America\/Chicago","id":388,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/Indiana\/Tell_City","id":389,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/Indiana\/Knox","id":390,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/Menominee","id":391,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/North_Dakota\/Center","id":392,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/North_Dakota\/New_Salem","id":393,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/North_Dakota\/Beulah","id":394,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]},{"displayName":"America\/Denver","id":395,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]},{"displayName":"America\/Boise","id":396,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]},{"displayName":"America\/Phoenix","id":397,"TZName":"MST","Offset":"-25200"},{"displayName":"America\/Los_Angeles","id":398,"DSTOffset":"-25200","DSTName":"PDT","Offset":"-28800","TZName":"PST","DSTData":[{"DSTStart":1615716000,"DSTEnd":1636275600},{"DSTStart":1647165600,"DSTEnd":1667725200},{"DSTStart":1678615200,"DSTEnd":1699174800},{"DSTStart":1710064800,"DSTEnd":1730624400},{"DSTStart":1741514400,"DSTEnd":1762074000},{"DSTStart":1772964000,"DSTEnd":1793523600},{"DSTStart":1805018400,"DSTEnd":1825578000},{"DSTStart":1836468000,"DSTEnd":1857027600},{"DSTStart":1867917600,"DSTEnd":1888477200},{"DSTStart":1899367200,"DSTEnd":1919926800},{"DSTStart":1930816800,"DSTEnd":1951376400},{"DSTStart":1962871200,"DSTEnd":1983430800},{"DSTStart":1994320800,"DSTEnd":2014880400}]},{"displayName":"America\/Anchorage","id":399,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]},{"displayName":"America\/Juneau","id":400,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]},{"displayName":"America\/Sitka","id":401,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]},{"displayName":"America\/Metlakatla","id":402,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]},{"displayName":"America\/Yakutat","id":403,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]},{"displayName":"America\/Nome","id":404,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]},{"displayName":"America\/Adak","id":405,"DSTOffset":"-32400","DSTName":"HDT","Offset":"-36000","TZName":"HST","DSTData":[{"DSTStart":1615723200,"DSTEnd":1636282800},{"DSTStart":1647172800,"DSTEnd":1667732400},{"DSTStart":1678622400,"DSTEnd":1699182000},{"DSTStart":1710072000,"DSTEnd":1730631600},{"DSTStart":1741521600,"DSTEnd":1762081200},{"DSTStart":1772971200,"DSTEnd":1793530800},{"DSTStart":1805025600,"DSTEnd":1825585200},{"DSTStart":1836475200,"DSTEnd":1857034800},{"DSTStart":1867924800,"DSTEnd":1888484400},{"DSTStart":1899374400,"DSTEnd":1919934000},{"DSTStart":1930824000,"DSTEnd":1951383600},{"DSTStart":1962878400,"DSTEnd":1983438000},{"DSTStart":1994328000,"DSTEnd":2014887600}]},{"displayName":"Pacific\/Honolulu","id":406,"TZName":"HST","Offset":"-36000"},{"displayName":"America\/Montevideo","id":407,"TZName":"UYT","Offset":"-10800"},{"displayName":"Asia\/Samarkand","id":408,"TZName":"UZT","Offset":"18000"},{"displayName":"Asia\/Tashkent","id":409,"TZName":"UZT","Offset":"18000"},{"displayName":"Europe\/Vatican","id":410,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]},{"displayName":"America\/St_Vincent","id":411,"TZName":"AST","Offset":"-14400"},{"displayName":"America\/Caracas","id":412,"TZName":"VET","Offset":"-14400"},{"displayName":"America\/Tortola","id":413,"TZName":"AST","Offset":"-14400"},{"displayName":"America\/St_Thomas","id":414,"TZName":"AST","Offset":"-14400"},{"displayName":"Asia\/Ho_Chi_Minh","id":415,"TZName":"IDT","Offset":"25200"},{"displayName":"Pacific\/Efate","id":416,"TZName":"VUT","Offset":"39600"},{"displayName":"Pacific\/Wallis","id":417,"TZName":"WFT","Offset":"43200"},{"displayName":"Pacific\/Apia","id":418,"Offset":"46800","TZName":"WST"},{"displayName":"Asia\/Aden","id":419,"TZName":"AST","Offset":"10800"},{"displayName":"Indian\/Mayotte","id":420,"TZName":"EAT","Offset":"10800"},{"displayName":"Africa\/Johannesburg","id":421,"TZName":"SAST","Offset":"7200"},{"displayName":"Africa\/Lusaka","id":422,"TZName":"CAT","Offset":"7200"},{"displayName":"Africa\/Harare","id":423,"TZName":"CAT","Offset":"7200"}] \ No newline at end of file diff --git a/package/contents/code/icons.js b/package/contents/code/icons.js index e3bffad..5122e48 100644 --- a/package/contents/code/icons.js +++ b/package/contents/code/icons.js @@ -192,6 +192,8 @@ var WeatherFont = { } function getIconCode(iconName, providerId, partOfDay) { + // dbgprint2("getIconCode") + // dbgprint("iconName:" + iconName + "\tproviderId:" + providerId + "\tpartOfDay:" + partOfDay) var iconCodeParts = null if (providerId === 'yrno') { iconCodeParts = WeatherFont.iconNameByYrNoCode[iconName] diff --git a/package/contents/code/placesearch-helpers.js b/package/contents/code/placesearch-helpers.js index b1a7ae9..d86e3df 100644 --- a/package/contents/code/placesearch-helpers.js +++ b/package/contents/code/placesearch-helpers.js @@ -1,4 +1,4 @@ -.import "./db/timezoneData.js" as TZData +.import "./timezoneData.js" as TZData var countries = Array( {shortCode: "AD" , displayName: "Andorra"}, {shortCode: "AE" , displayName: "United Arab Emirates"}, @@ -270,27 +270,34 @@ function getDisplayName(shortCode) { } function updateListView(filter) { filteredCSVData.clear() - for (var f = 0; f < myCSVData.rowCount(); f++) { - let lc = myCSVData.get(f).locationName.toLowerCase() - if (myCSVData.get(f).locationName.toLowerCase().indexOf(filter.toLowerCase()) === 0) { - filteredCSVData.append(myCSVData.get(f)) + for (var f = 0; f < myCSVData.rowCount; f++) { + let lc = myCSVData.getRow(f).Location.toLowerCase() + if (myCSVData.getRow(f).Location.toLowerCase().indexOf(filter.toLowerCase()) === 0) { + filteredCSVData.appendRow(myCSVData.getRow(f)) } } + dbgprint("filteredCSVData.rowCount=" + filteredCSVData.rowCount) } function loadCSVDatabase(countryName) { + dbgprint("Entered loadCSVDatabase") + dbgprint("QML_XHR_ALLOW_FILE_READ = 1 : " + env_QML_XHR_ALLOW_FILE_READ) if (countryName.length === 0) { return } myCSVData.clear() - let filename = Qt.resolvedUrl("./db/" + getshortCode(countryName) + ".csv") + var URL = ("http://weatherwidgetqt6.000webhostapp.com/" + getshortCode(countryName) + ".csv") // LIVE ONLY + if (env_QML_XHR_ALLOW_FILE_READ) { + URL = Qt.resolvedUrl("./db/" + getshortCode(countryName) + ".csv") // DEBUGGING ONLY + } + dbgprint("URL = " + URL) var xhr = new XMLHttpRequest - xhr.open("GET", filename) + xhr.open("GET", URL) xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE) { var response = xhr.responseText var tmpDB = response.split(/\r?\n/) for (var i = 0; i < tmpDB.length - 1; i++) { - myCSVData.append(parseCSVLine(tmpDB[i])) + myCSVData.appendRow(parseCSVLine(tmpDB[i])) } updateListView(locationEdit.text) } @@ -301,15 +308,15 @@ function parseCSVLine(csvLine) { function stripquotes(str) { return str.replace(/['"]+/g, '') } - +// dbgprint(csvLine) var items = csvLine.split(/\t/) return ({ - region: stripquotes((items[0])), - locationName: stripquotes(items[1]), - latitude: parseFloat(items[2]), - longitude: parseFloat(items[3]), - altitude: parseInt(items[4]), + Area: stripquotes((items[0])), + Location: stripquotes(items[1]), + Latitude: parseFloat(items[2]).toFixed(3), + Longitude: parseFloat(items[3]).toFixed(3), + Altitude: parseInt(items[4]), timezoneId: parseInt(items[5]), - timezoneName: TZData.TZData[items[5]].displayName + Timezone: TZData.TZData[items[5]].displayName }) } diff --git a/package/contents/code/timezoneData.js b/package/contents/code/timezoneData.js new file mode 100644 index 0000000..5869716 --- /dev/null +++ b/package/contents/code/timezoneData.js @@ -0,0 +1,440 @@ +const TZData =[ +{"displayName":"Europe\/Andorra","id":0,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Asia\/Dubai","id":1,"TZName":"GST","Offset":"14400"}, +{"displayName":"Asia\/Kabul","id":2,"TZName":"AFT","Offset":"16200"}, +{"displayName":"America\/Antigua","id":3,"TZName":"AST","Offset":"-14400"}, +{"displayName":"America\/Anguilla","id":4,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Europe\/Tirane","id":5,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Asia\/Yerevan","id":6,"TZName":"AMT","Offset":"14400"}, +{"displayName":"Africa\/Luanda","id":7,"TZName":"WAT","Offset":"3600"}, +{"displayName":"Antarctica\/McMurdo","id":8,"Offset":"43200","TZName":"NZST","DSTOffset":"46800","DSTName":"NZDT","DSTData":[{"DSTStart":1632578400,"DSTEnd":1648908000},{"DSTStart":1664028000,"DSTEnd":1680357600},{"DSTStart":1695477600,"DSTEnd":1712412000},{"DSTStart":1727532000,"DSTEnd":1743861600},{"DSTStart":1758981600,"DSTEnd":1775311200},{"DSTStart":1790431200,"DSTEnd":1806760800},{"DSTStart":1821880800,"DSTEnd":1838210400},{"DSTStart":1853330400,"DSTEnd":1869660000},{"DSTStart":1885384800,"DSTEnd":1901714400},{"DSTStart":1916834400,"DSTEnd":1933164000},{"DSTStart":1948284000,"DSTEnd":1964613600},{"DSTStart":1979733600,"DSTEnd":1996063200},{"DSTStart":2011183200,"DSTEnd":2027512800}]}, +{"displayName":"Antarctica\/Casey","id":9,"TZName":"CAST","Offset":"39600"}, +{"displayName":"Antarctica\/Davis","id":10,"TZName":"DAVT","Offset":"25200"}, +{"displayName":"Antarctica\/DumontDUrville","id":11,"TZName":"DDUT","Offset":"36000"}, +{"displayName":"Antarctica\/Mawson","id":12,"TZName":"MAWT","Offset":"18000"}, +{"displayName":"Antarctica\/Palmer","id":13,"TZName":"CLST","Offset":"-10800"}, +{"displayName":"Antarctica\/Rothera","id":14,"TZName":"ART","Offset":"-10800"}, +{"displayName":"Antarctica\/Syowa","id":15,"TZName":"SYOT","Offset":"10800"}, +{"displayName":"Antarctica\/Troll","id":16,"DSTOffset":"7200","DSTName":"CEST","Offset":"0","TZName":"GMT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Antarctica\/Vostok","id":17,"TZName":"VOST","Offset":"21600"}, +{"displayName":"America\/Argentina\/Buenos_Aires","id":18,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/Cordoba","id":19,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/Salta","id":20,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/Jujuy","id":21,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/Tucuman","id":22,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/Catamarca","id":23,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/La_Rioja","id":24,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/San_Juan","id":25,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/Mendoza","id":26,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/San_Luis","id":27,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/Rio_Gallegos","id":28,"TZName":"ART","Offset":"-10800"}, +{"displayName":"America\/Argentina\/Ushuaia","id":29,"TZName":"ART","Offset":"-10800"}, +{"displayName":"Pacific\/Pago_Pago","id":30,"TZName":"SST","Offset":"-39600"}, +{"displayName":"Europe\/Vienna","id":31,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Australia\/Lord_Howe","id":32,"Offset":"37800","TZName":"LHST","DSTOffset":"39600","DSTName":"LHDT","DSTData":[{"DSTStart":1633188600,"DSTEnd":1648911600},{"DSTStart":1664638200,"DSTEnd":1680361200},{"DSTStart":1696087800,"DSTEnd":1712415600},{"DSTStart":1728142200,"DSTEnd":1743865200},{"DSTStart":1759591800,"DSTEnd":1775314800},{"DSTStart":1791041400,"DSTEnd":1806764400},{"DSTStart":1822491000,"DSTEnd":1838214000},{"DSTStart":1853940600,"DSTEnd":1869663600},{"DSTStart":1885995000,"DSTEnd":1901718000},{"DSTStart":1917444600,"DSTEnd":1933167600},{"DSTStart":1948894200,"DSTEnd":1964617200},{"DSTStart":1980343800,"DSTEnd":1996066800},{"DSTStart":2011793400,"DSTEnd":2027516400}]}, +{"displayName":"Antarctica\/Macquarie","id":33,"Offset":"36000","TZName":"AEST","DSTOffset":"39600","DSTName":"AEDT","DSTData":[{"DSTStart":1633190400,"DSTEnd":1648915200},{"DSTStart":1664640000,"DSTEnd":1680364800},{"DSTStart":1696089600,"DSTEnd":1712419200},{"DSTStart":1728144000,"DSTEnd":1743868800},{"DSTStart":1759593600,"DSTEnd":1775318400},{"DSTStart":1791043200,"DSTEnd":1806768000},{"DSTStart":1822492800,"DSTEnd":1838217600},{"DSTStart":1853942400,"DSTEnd":1869667200},{"DSTStart":1885996800,"DSTEnd":1901721600},{"DSTStart":1917446400,"DSTEnd":1933171200},{"DSTStart":1948896000,"DSTEnd":1964620800},{"DSTStart":1980345600,"DSTEnd":1996070400},{"DSTStart":2011795200,"DSTEnd":2027520000}]}, +{"displayName":"Australia\/Hobart","id":34,"Offset":"36000","TZName":"AEST","DSTOffset":"39600","DSTName":"AEDT","DSTData":[{"DSTStart":1633190400,"DSTEnd":1648915200},{"DSTStart":1664640000,"DSTEnd":1680364800},{"DSTStart":1696089600,"DSTEnd":1712419200},{"DSTStart":1728144000,"DSTEnd":1743868800},{"DSTStart":1759593600,"DSTEnd":1775318400},{"DSTStart":1791043200,"DSTEnd":1806768000},{"DSTStart":1822492800,"DSTEnd":1838217600},{"DSTStart":1853942400,"DSTEnd":1869667200},{"DSTStart":1885996800,"DSTEnd":1901721600},{"DSTStart":1917446400,"DSTEnd":1933171200},{"DSTStart":1948896000,"DSTEnd":1964620800},{"DSTStart":1980345600,"DSTEnd":1996070400},{"DSTStart":2011795200,"DSTEnd":2027520000}]}, +{"displayName":"Australia\/Melbourne","id":35,"Offset":"36000","TZName":"AEST","DSTOffset":"39600","DSTName":"AEDT","DSTData":[{"DSTStart":1633190400,"DSTEnd":1648915200},{"DSTStart":1664640000,"DSTEnd":1680364800},{"DSTStart":1696089600,"DSTEnd":1712419200},{"DSTStart":1728144000,"DSTEnd":1743868800},{"DSTStart":1759593600,"DSTEnd":1775318400},{"DSTStart":1791043200,"DSTEnd":1806768000},{"DSTStart":1822492800,"DSTEnd":1838217600},{"DSTStart":1853942400,"DSTEnd":1869667200},{"DSTStart":1885996800,"DSTEnd":1901721600},{"DSTStart":1917446400,"DSTEnd":1933171200},{"DSTStart":1948896000,"DSTEnd":1964620800},{"DSTStart":1980345600,"DSTEnd":1996070400},{"DSTStart":2011795200,"DSTEnd":2027520000}]}, +{"displayName":"Australia\/Sydney","id":36,"Offset":"36000","TZName":"AEST","DSTOffset":"39600","DSTName":"AEDT","DSTData":[{"DSTStart":1633190400,"DSTEnd":1648915200},{"DSTStart":1664640000,"DSTEnd":1680364800},{"DSTStart":1696089600,"DSTEnd":1712419200},{"DSTStart":1728144000,"DSTEnd":1743868800},{"DSTStart":1759593600,"DSTEnd":1775318400},{"DSTStart":1791043200,"DSTEnd":1806768000},{"DSTStart":1822492800,"DSTEnd":1838217600},{"DSTStart":1853942400,"DSTEnd":1869667200},{"DSTStart":1885996800,"DSTEnd":1901721600},{"DSTStart":1917446400,"DSTEnd":1933171200},{"DSTStart":1948896000,"DSTEnd":1964620800},{"DSTStart":1980345600,"DSTEnd":1996070400},{"DSTStart":2011795200,"DSTEnd":2027520000}]}, +{"displayName":"Australia\/Broken_Hill","id":37,"Offset":"34200","TZName":"ACST","DSTOffset":"37800","DSTName":"ACDT","DSTData":[{"DSTStart":1633192200,"DSTEnd":1648917000},{"DSTStart":1664641800,"DSTEnd":1680366600},{"DSTStart":1696091400,"DSTEnd":1712421000},{"DSTStart":1728145800,"DSTEnd":1743870600},{"DSTStart":1759595400,"DSTEnd":1775320200},{"DSTStart":1791045000,"DSTEnd":1806769800},{"DSTStart":1822494600,"DSTEnd":1838219400},{"DSTStart":1853944200,"DSTEnd":1869669000},{"DSTStart":1885998600,"DSTEnd":1901723400},{"DSTStart":1917448200,"DSTEnd":1933173000},{"DSTStart":1948897800,"DSTEnd":1964622600},{"DSTStart":1980347400,"DSTEnd":1996072200},{"DSTStart":2011797000,"DSTEnd":2027521800}]}, +{"displayName":"Australia\/Brisbane","id":38,"TZName":"AEST","Offset":"36000"}, +{"displayName":"Australia\/Lindeman","id":39,"TZName":"AEST","Offset":"36000"}, +{"displayName":"Australia\/Adelaide","id":40,"Offset":"34200","TZName":"ACST","DSTOffset":"37800","DSTName":"ACDT","DSTData":[{"DSTStart":1633192200,"DSTEnd":1648917000},{"DSTStart":1664641800,"DSTEnd":1680366600},{"DSTStart":1696091400,"DSTEnd":1712421000},{"DSTStart":1728145800,"DSTEnd":1743870600},{"DSTStart":1759595400,"DSTEnd":1775320200},{"DSTStart":1791045000,"DSTEnd":1806769800},{"DSTStart":1822494600,"DSTEnd":1838219400},{"DSTStart":1853944200,"DSTEnd":1869669000},{"DSTStart":1885998600,"DSTEnd":1901723400},{"DSTStart":1917448200,"DSTEnd":1933173000},{"DSTStart":1948897800,"DSTEnd":1964622600},{"DSTStart":1980347400,"DSTEnd":1996072200},{"DSTStart":2011797000,"DSTEnd":2027521800}]}, +{"displayName":"Australia\/Darwin","id":41,"TZName":"ACST","Offset":"34200"}, +{"displayName":"Australia\/Perth","id":42,"TZName":"AWST","Offset":"28800"}, +{"displayName":"Australia\/Eucla","id":43,"TZName":"ACWST","Offset":"31500"}, +{"displayName":"America\/Aruba","id":44,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Europe\/Mariehamn","id":45,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Asia\/Baku","id":46,"TZName":"AZT","Offset":"14400"}, +{"displayName":"Europe\/Sarajevo","id":47,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/Barbados","id":48,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Asia\/Dhaka","id":49,"TZName":"BST","Offset":"21600"}, +{"displayName":"Europe\/Brussels","id":50,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Ouagadougou","id":51,"TZName":"GMT","Offset":"0"}, +{"displayName":"Europe\/Sofia","id":52,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Asia\/Bahrain","id":53,"TZName":"AST","Offset":"10800"}, +{"displayName":"Africa\/Bujumbura","id":54,"TZName":"CAT","Offset":"7200"}, +{"displayName":"Africa\/Porto-Novo","id":55,"TZName":"WAT","Offset":"3600"}, +{"displayName":"America\/St_Barthelemy","id":56,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Atlantic\/Bermuda","id":57,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]}, +{"displayName":"Asia\/Brunei","id":58,"TZName":"BNT","Offset":"28800"}, +{"displayName":"America\/La_Paz","id":59,"TZName":"BOT","Offset":"-14400"}, +{"displayName":"America\/Kralendijk","id":60,"TZName":"AST","Offset":"-14400"}, +{"displayName":"America\/Noronha","id":61,"TZName":"FNT","Offset":"-7200"}, +{"displayName":"America\/Belem","id":62,"TZName":"BRT","Offset":"-10800"}, +{"displayName":"America\/Fortaleza","id":63,"TZName":"BRT","Offset":"-10800"}, +{"displayName":"America\/Recife","id":64,"TZName":"BRT","Offset":"-10800"}, +{"displayName":"America\/Araguaina","id":65,"TZName":"BRT","Offset":"-10800"}, +{"displayName":"America\/Maceio","id":66,"TZName":"BRT","Offset":"-10800"}, +{"displayName":"America\/Bahia","id":67,"TZName":"BRT","Offset":"-10800"}, +{"displayName":"America\/Sao_Paulo","id":68,"TZName":"BRT","Offset":"-10800"}, +{"displayName":"America\/Campo_Grande","id":69,"TZName":"AMT","Offset":"-14400"}, +{"displayName":"America\/Cuiaba","id":70,"TZName":"BRT","Offset":"-14400"}, +{"displayName":"America\/Santarem","id":71,"TZName":"BRT","Offset":"-10800"}, +{"displayName":"America\/Porto_Velho","id":72,"TZName":"AMT","Offset":"-14400"}, +{"displayName":"America\/Boa_Vista","id":73,"TZName":"AMT","Offset":"-14400"}, +{"displayName":"America\/Manaus","id":74,"TZName":"AMT","Offset":"-14400"}, +{"displayName":"America\/Eirunepe","id":75,"TZName":"ACT","Offset":"-18000"}, +{"displayName":"America\/Rio_Branco","id":76,"TZName":"ACT","Offset":"-18000"}, +{"displayName":"America\/Nassau","id":77,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"Asia\/Thimphu","id":78,"TZName":"BTT","Offset":"21600"}, +{"displayName":"Africa\/Gaborone","id":79,"TZName":"CAT","Offset":"7200"}, +{"displayName":"Europe\/Minsk","id":80,"TZName":"MSK","Offset":"10800"}, +{"displayName":"America\/Belize","id":81,"TZName":"CST","Offset":"-21600"}, +{"displayName":"America\/St_Johns","id":82,"DSTOffset":"-9000","DSTName":"NDT","Offset":"-12600","TZName":"NST","DSTData":[{"DSTStart":1615699800,"DSTEnd":1636259400},{"DSTStart":1647149400,"DSTEnd":1667709000},{"DSTStart":1678599000,"DSTEnd":1699158600},{"DSTStart":1710048600,"DSTEnd":1730608200},{"DSTStart":1741498200,"DSTEnd":1762057800},{"DSTStart":1772947800,"DSTEnd":1793507400},{"DSTStart":1805002200,"DSTEnd":1825561800},{"DSTStart":1836451800,"DSTEnd":1857011400},{"DSTStart":1867901400,"DSTEnd":1888461000},{"DSTStart":1899351000,"DSTEnd":1919910600},{"DSTStart":1930800600,"DSTEnd":1951360200},{"DSTStart":1962855000,"DSTEnd":1983414600},{"DSTStart":1994304600,"DSTEnd":2014864200}]}, +{"displayName":"America\/Halifax","id":83,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]}, +{"displayName":"America\/Glace_Bay","id":84,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]}, +{"displayName":"America\/Moncton","id":85,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]}, +{"displayName":"America\/Goose_Bay","id":86,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]}, +{"displayName":"America\/Blanc-Sablon","id":87,"TZName":"AST","Offset":"-14400"}, +{"displayName":"America\/Toronto","id":88,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Nipigon","id":89,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Thunder_Bay","id":90,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Iqaluit","id":91,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Pangnirtung","id":92,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Atikokan","id":93,"TZName":"EST","Offset":"-18000"}, +{"displayName":"America\/Winnipeg","id":94,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/Rainy_River","id":95,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/Resolute","id":96,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/Rankin_Inlet","id":97,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/Regina","id":98,"TZName":"CST","Offset":"-21600"}, +{"displayName":"America\/Swift_Current","id":99,"TZName":"CST","Offset":"-21600"}, +{"displayName":"America\/Edmonton","id":100,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]}, +{"displayName":"America\/Cambridge_Bay","id":101,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]}, +{"displayName":"America\/Yellowknife","id":102,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]}, +{"displayName":"America\/Inuvik","id":103,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]}, +{"displayName":"America\/Creston","id":104,"TZName":"MST","Offset":"-25200"}, +{"displayName":"America\/Dawson_Creek","id":105,"TZName":"MST","Offset":"-25200"}, +{"displayName":"America\/Fort_Nelson","id":106,"TZName":"MST","Offset":"-25200"}, +{"displayName":"America\/Whitehorse","id":107,"TZName":"MST","Offset":"-25200"}, +{"displayName":"America\/Dawson","id":108,"TZName":"MST","Offset":"-25200"}, +{"displayName":"America\/Vancouver","id":109,"DSTOffset":"-25200","DSTName":"PDT","Offset":"-28800","TZName":"PST","DSTData":[{"DSTStart":1615716000,"DSTEnd":1636275600},{"DSTStart":1647165600,"DSTEnd":1667725200},{"DSTStart":1678615200,"DSTEnd":1699174800},{"DSTStart":1710064800,"DSTEnd":1730624400},{"DSTStart":1741514400,"DSTEnd":1762074000},{"DSTStart":1772964000,"DSTEnd":1793523600},{"DSTStart":1805018400,"DSTEnd":1825578000},{"DSTStart":1836468000,"DSTEnd":1857027600},{"DSTStart":1867917600,"DSTEnd":1888477200},{"DSTStart":1899367200,"DSTEnd":1919926800},{"DSTStart":1930816800,"DSTEnd":1951376400},{"DSTStart":1962871200,"DSTEnd":1983430800},{"DSTStart":1994320800,"DSTEnd":2014880400}]}, +{"displayName":"Indian\/Cocos","id":110,"TZName":"CCT","Offset":"23400"}, +{"displayName":"Africa\/Kinshasa","id":111,"TZName":"WAT","Offset":"3600"}, +{"displayName":"Africa\/Lubumbashi","id":112,"TZName":"CAT","Offset":"7200"}, +{"displayName":"Africa\/Bangui","id":113,"TZName":"WAT","Offset":"3600"}, +{"displayName":"Africa\/Brazzaville","id":114,"TZName":"WAT","Offset":"3600"}, +{"displayName":"Europe\/Zurich","id":115,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Abidjan","id":116,"TZName":"GMT","Offset":"0"}, +{"displayName":"Pacific\/Rarotonga","id":117,"TZName":"CKT","Offset":"-36000"}, +{"displayName":"America\/Santiago","id":118,"Offset":"-14400","TZName":"CLT","DSTOffset":"-10800","DSTName":"CLST","DSTData":[{"DSTStart":1630814400,"DSTEnd":1648954800},{"DSTStart":1662264000,"DSTEnd":1680404400},{"DSTStart":1693713600,"DSTEnd":1712458800},{"DSTStart":1725768000,"DSTEnd":1743908400},{"DSTStart":1757217600,"DSTEnd":1775358000},{"DSTStart":1788667200,"DSTEnd":1806807600},{"DSTStart":1820116800,"DSTEnd":1838257200},{"DSTStart":1851566400,"DSTEnd":1870311600},{"DSTStart":1883016000,"DSTEnd":1901761200},{"DSTStart":1915070400,"DSTEnd":1933210800},{"DSTStart":1946520000,"DSTEnd":1964660400},{"DSTStart":1977969600,"DSTEnd":1996110000},{"DSTStart":2009419200,"DSTEnd":2027559600}]}, +{"displayName":"America\/Punta_Arenas","id":119,"TZName":"CLST","Offset":"-10800"}, +{"displayName":"Pacific\/Easter","id":120,"Offset":"-21600","TZName":"EAST","DSTOffset":"-18000","DSTName":"EASST","DSTData":[{"DSTStart":1630814400,"DSTEnd":1648954800},{"DSTStart":1662264000,"DSTEnd":1680404400},{"DSTStart":1693713600,"DSTEnd":1712458800},{"DSTStart":1725768000,"DSTEnd":1743908400},{"DSTStart":1757217600,"DSTEnd":1775358000},{"DSTStart":1788667200,"DSTEnd":1806807600},{"DSTStart":1820116800,"DSTEnd":1838257200},{"DSTStart":1851566400,"DSTEnd":1870311600},{"DSTStart":1883016000,"DSTEnd":1901761200},{"DSTStart":1915070400,"DSTEnd":1933210800},{"DSTStart":1946520000,"DSTEnd":1964660400},{"DSTStart":1977969600,"DSTEnd":1996110000},{"DSTStart":2009419200,"DSTEnd":2027559600}]}, +{"displayName":"Africa\/Douala","id":121,"TZName":"WAT","Offset":"3600"}, +{"displayName":"Asia\/Shanghai","id":122,"TZName":"CST","Offset":"28800"}, +{"displayName":"Asia\/Urumqi","id":123,"TZName":"URUT","Offset":"21600"}, +{"displayName":"America\/Bogota","id":124,"TZName":"COT","Offset":"-18000"}, +{"displayName":"America\/Costa_Rica","id":125,"TZName":"CST","Offset":"-21600"}, +{"displayName":"America\/Havana","id":126,"DSTOffset":"-14400","DSTName":"CDT","Offset":"-18000","TZName":"CST","DSTData":[{"DSTStart":1615698000,"DSTEnd":1636261200},{"DSTStart":1647147600,"DSTEnd":1667710800},{"DSTStart":1678597200,"DSTEnd":1699160400},{"DSTStart":1710046800,"DSTEnd":1730610000},{"DSTStart":1741496400,"DSTEnd":1762059600},{"DSTStart":1772946000,"DSTEnd":1793509200},{"DSTStart":1805000400,"DSTEnd":1825563600},{"DSTStart":1836450000,"DSTEnd":1857013200},{"DSTStart":1867899600,"DSTEnd":1888462800},{"DSTStart":1899349200,"DSTEnd":1919912400},{"DSTStart":1930798800,"DSTEnd":1951362000},{"DSTStart":1962853200,"DSTEnd":1983416400},{"DSTStart":1994302800,"DSTEnd":2014866000}]}, +{"displayName":"Atlantic\/Cape_Verde","id":127,"TZName":"CVT","Offset":"-3600"}, +{"displayName":"America\/Curacao","id":128,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Indian\/Christmas","id":129,"TZName":"CXT","Offset":"25200"}, +{"displayName":"Asia\/Nicosia","id":130,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Asia\/Famagusta","id":131,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Prague","id":132,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Berlin","id":133,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Busingen","id":134,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Djibouti","id":135,"TZName":"EAT","Offset":"10800"}, +{"displayName":"Europe\/Copenhagen","id":136,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/Dominica","id":137,"TZName":"AST","Offset":"-14400"}, +{"displayName":"America\/Santo_Domingo","id":138,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Africa\/Algiers","id":139,"TZName":"CET","Offset":"3600"}, +{"displayName":"America\/Guayaquil","id":140,"TZName":"ECT","Offset":"-18000"}, +{"displayName":"Pacific\/Galapagos","id":141,"TZName":"GALT","Offset":"-21600"}, +{"displayName":"Europe\/Tallinn","id":142,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Cairo","id":143,"TZName":"EET","Offset":"7200"}, +{"displayName":"Africa\/El_Aaiun","id":144,"DSTOffset":"0","DSTName":"WET","Offset":"3600","TZName":"WEST","DSTData":[{"DSTStart":1618106400,"DSTEnd":1621130400},{"DSTStart":1648346400,"DSTEnd":1651975200},{"DSTStart":1679191200,"DSTEnd":1682820000},{"DSTStart":1710036000,"DSTEnd":1713060000},{"DSTStart":1740276000,"DSTEnd":1743904800},{"DSTStart":1771120800,"DSTEnd":1774144800},{"DSTStart":1801965600,"DSTEnd":1804989600},{"DSTStart":1832205600,"DSTEnd":1835834400},{"DSTStart":1863050400,"DSTEnd":1866074400},{"DSTStart":1893290400,"DSTEnd":1896919200},{"DSTStart":1924135200,"DSTEnd":1927764000},{"DSTStart":1954980000,"DSTEnd":1958004000},{"DSTStart":1985220000,"DSTEnd":1988848800},{"DSTStart":2016064800,"DSTEnd":2019088800}]}, +{"displayName":"Africa\/Asmara","id":145,"TZName":"EAT","Offset":"10800"}, +{"displayName":"Europe\/Madrid","id":146,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Ceuta","id":147,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Atlantic\/Canary","id":148,"DSTOffset":"3600","DSTName":"WEST","Offset":"0","TZName":"WET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Addis_Ababa","id":149,"TZName":"EAT","Offset":"10800"}, +{"displayName":"Europe\/Helsinki","id":150,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Pacific\/Fiji","id":151,"Offset":"43200","TZName":"FJT","DSTOffset":"46800","DSTName":"FJT","DSTData":[{"DSTStart":1668261600,"DSTEnd":1673704800},{"DSTStart":1699711200,"DSTEnd":1705154400},{"DSTStart":1731160800,"DSTEnd":1736604000},{"DSTStart":1762610400,"DSTEnd":1768658400},{"DSTStart":1794060000,"DSTEnd":1800108000},{"DSTStart":1826114400,"DSTEnd":1831557600},{"DSTStart":1857564000,"DSTEnd":1863007200},{"DSTStart":1889013600,"DSTEnd":1894456800},{"DSTStart":1920463200,"DSTEnd":1925906400},{"DSTStart":1951912800,"DSTEnd":1957960800},{"DSTStart":1983967200,"DSTEnd":1989410400},{"DSTStart":2015416800,"DSTEnd":2020860000}]}, +{"displayName":"Atlantic\/Stanley","id":152,"TZName":"FKT","Offset":"-10800"}, +{"displayName":"Pacific\/Chuuk","id":153,"TZName":"CHUT","Offset":"36000"}, +{"displayName":"Pacific\/Pohnpei","id":154,"TZName":"PONT","Offset":"39600"}, +{"displayName":"Pacific\/Kosrae","id":155,"TZName":"KOST","Offset":"39600"}, +{"displayName":"Atlantic\/Faroe","id":156,"DSTOffset":"3600","DSTName":"WEST","Offset":"0","TZName":"WET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Paris","id":157,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Libreville","id":158,"TZName":"WAT","Offset":"3600"}, +{"displayName":"Europe\/London","id":159,"DSTOffset":"3600","DSTName":"BST","Offset":"0","TZName":"GMT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/Grenada","id":160,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Asia\/Tbilisi","id":161,"TZName":"GET","Offset":"14400"}, +{"displayName":"America\/Cayenne","id":162,"TZName":"GFT","Offset":"-10800"}, +{"displayName":"Europe\/Guernsey","id":163,"DSTOffset":"3600","DSTName":"BST","Offset":"0","TZName":"GMT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Accra","id":164,"TZName":"GMT","Offset":"0"}, +{"displayName":"Europe\/Gibraltar","id":165,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/Nuuk","id":166,"DSTOffset":"-7200","DSTName":"WGST","Offset":"-10800","TZName":"WGT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/Danmarkshavn","id":167,"TZName":"GMT","Offset":"0"}, +{"displayName":"America\/Scoresbysund","id":168,"DSTOffset":"0","DSTName":"EGST","Offset":"-3600","TZName":"EGT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/Thule","id":169,"DSTOffset":"-10800","DSTName":"ADT","Offset":"-14400","TZName":"AST","DSTData":[{"DSTStart":1615701600,"DSTEnd":1636261200},{"DSTStart":1647151200,"DSTEnd":1667710800},{"DSTStart":1678600800,"DSTEnd":1699160400},{"DSTStart":1710050400,"DSTEnd":1730610000},{"DSTStart":1741500000,"DSTEnd":1762059600},{"DSTStart":1772949600,"DSTEnd":1793509200},{"DSTStart":1805004000,"DSTEnd":1825563600},{"DSTStart":1836453600,"DSTEnd":1857013200},{"DSTStart":1867903200,"DSTEnd":1888462800},{"DSTStart":1899352800,"DSTEnd":1919912400},{"DSTStart":1930802400,"DSTEnd":1951362000},{"DSTStart":1962856800,"DSTEnd":1983416400},{"DSTStart":1994306400,"DSTEnd":2014866000}]}, +{"displayName":"Africa\/Banjul","id":170,"TZName":"GMT","Offset":"0"}, +{"displayName":"Africa\/Conakry","id":171,"TZName":"GMT","Offset":"0"}, +{"displayName":"America\/Guadeloupe","id":172,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Africa\/Malabo","id":173,"TZName":"WAT","Offset":"3600"}, +{"displayName":"Europe\/Athens","id":174,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Atlantic\/South_Georgia","id":175,"TZName":"GST","Offset":"-7200"}, +{"displayName":"America\/Guatemala","id":176,"TZName":"CST","Offset":"-21600"}, +{"displayName":"Pacific\/Guam","id":177,"TZName":"ChST","Offset":"36000"}, +{"displayName":"Africa\/Bissau","id":178,"TZName":"GMT","Offset":"0"}, +{"displayName":"America\/Guyana","id":179,"TZName":"GYT","Offset":"-14400"}, +{"displayName":"Asia\/Hong_Kong","id":180,"TZName":"HKT","Offset":"28800"}, +{"displayName":"America\/Tegucigalpa","id":181,"TZName":"CST","Offset":"-21600"}, +{"displayName":"Europe\/Zagreb","id":182,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/Port-au-Prince","id":183,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"Europe\/Budapest","id":184,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Asia\/Jakarta","id":185,"TZName":"WIB","Offset":"25200"}, +{"displayName":"Asia\/Pontianak","id":186,"TZName":"WIB","Offset":"25200"}, +{"displayName":"Asia\/Makassar","id":187,"TZName":"WITA","Offset":"28800"}, +{"displayName":"Asia\/Jayapura","id":188,"TZName":"WIT","Offset":"32400"}, +{"displayName":"Europe\/Dublin","id":189,"Offset":"3600","TZName":"IST","DSTOffset":"0","DSTName":"GMT","DSTData":[{"DSTStart":1635642000,"DSTEnd":1648342800},{"DSTStart":1667091600,"DSTEnd":1679792400},{"DSTStart":1698541200,"DSTEnd":1711846800},{"DSTStart":1729990800,"DSTEnd":1743296400},{"DSTStart":1761440400,"DSTEnd":1774746000},{"DSTStart":1792890000,"DSTEnd":1806195600},{"DSTStart":1824944400,"DSTEnd":1837645200},{"DSTStart":1856394000,"DSTEnd":1869094800},{"DSTStart":1887843600,"DSTEnd":1901149200},{"DSTStart":1919293200,"DSTEnd":1932598800},{"DSTStart":1950742800,"DSTEnd":1964048400},{"DSTStart":1982797200,"DSTEnd":1995498000},{"DSTStart":2014246800,"DSTEnd":2026947600}]}, +{"displayName":"Asia\/Jerusalem","id":190,"DSTOffset":"10800","DSTName":"IDT","Offset":"7200","TZName":"IST","DSTData":[{"DSTStart":1616716800,"DSTEnd":1635634800},{"DSTStart":1648166400,"DSTEnd":1667084400},{"DSTStart":1679616000,"DSTEnd":1698534000},{"DSTStart":1711670400,"DSTEnd":1729983600},{"DSTStart":1743120000,"DSTEnd":1761433200},{"DSTStart":1774569600,"DSTEnd":1792882800},{"DSTStart":1806019200,"DSTEnd":1824937200},{"DSTStart":1837468800,"DSTEnd":1856386800},{"DSTStart":1868918400,"DSTEnd":1887836400},{"DSTStart":1900972800,"DSTEnd":1919286000},{"DSTStart":1932422400,"DSTEnd":1950735600},{"DSTStart":1963872000,"DSTEnd":1982790000},{"DSTStart":1995321600,"DSTEnd":2014239600}]}, +{"displayName":"Europe\/Isle_of_Man","id":191,"DSTOffset":"3600","DSTName":"BST","Offset":"0","TZName":"GMT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Asia\/Kolkata","id":192,"TZName":"IST","Offset":"19800"}, +{"displayName":"Indian\/Chagos","id":193,"TZName":"IOT","Offset":"21600"}, +{"displayName":"Asia\/Baghdad","id":194,"TZName":"AST","Offset":"10800"}, +{"displayName":"Asia\/Tehran","id":195,"DSTOffset":"16200","DSTName":"IRST","Offset":"12600","TZName":"IRDT","DSTData":[{"DSTStart":1616358600,"DSTEnd":1632252600},{"DSTStart":1647894600,"DSTEnd":1663788600},{"DSTStart":1679430600,"DSTEnd":1695324600},{"DSTStart":1710966600,"DSTEnd":1726860600},{"DSTStart":1742589000,"DSTEnd":1758483000},{"DSTStart":1774125000,"DSTEnd":1790019000},{"DSTStart":1805661000,"DSTEnd":1821555000},{"DSTStart":1837197000,"DSTEnd":1853091000},{"DSTStart":1868733000,"DSTEnd":1884627000},{"DSTStart":1900355400,"DSTEnd":1916249400},{"DSTStart":1931891400,"DSTEnd":1947785400},{"DSTStart":1963427400,"DSTEnd":1979321400},{"DSTStart":1994963400,"DSTEnd":2010857400}]}, +{"displayName":"Atlantic\/Reykjavik","id":196,"TZName":"GMT","Offset":"0"}, +{"displayName":"Europe\/Rome","id":197,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Jersey","id":198,"DSTOffset":"3600","DSTName":"BST","Offset":"0","TZName":"GMT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/Jamaica","id":199,"TZName":"EST","Offset":"-18000"}, +{"displayName":"Asia\/Amman","id":200,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616709600,"DSTEnd":1635458400},{"DSTStart":1645740000,"DSTEnd":1666908000},{"DSTStart":1677189600,"DSTEnd":1698357600},{"DSTStart":1709244000,"DSTEnd":1729807200},{"DSTStart":1740693600,"DSTEnd":1761861600},{"DSTStart":1772143200,"DSTEnd":1793311200},{"DSTStart":1803592800,"DSTEnd":1824760800},{"DSTStart":1835042400,"DSTEnd":1856210400},{"DSTStart":1866492000,"DSTEnd":1887660000},{"DSTStart":1898546400,"DSTEnd":1919109600},{"DSTStart":1929996000,"DSTEnd":1951164000},{"DSTStart":1961445600,"DSTEnd":1982613600},{"DSTStart":1992895200,"DSTEnd":2014063200}]}, +{"displayName":"Asia\/Tokyo","id":201,"TZName":"JST","Offset":"32400"}, +{"displayName":"Africa\/Nairobi","id":202,"TZName":"EAT","Offset":"10800"}, +{"displayName":"Asia\/Bishkek","id":203,"TZName":"KGST","Offset":"21600"}, +{"displayName":"Asia\/Phnom_Penh","id":204,"TZName":"ICT","Offset":"25200"}, +{"displayName":"Pacific\/Tarawa","id":205,"TZName":"GILT","Offset":"43200"}, +{"displayName":"Pacific\/Kanton","id":206,"TZName":"EST","Offset":"46800"}, +{"displayName":"Pacific\/Kiritimati","id":207,"TZName":"LINT","Offset":"50400"}, +{"displayName":"Indian\/Comoro","id":208,"TZName":"EAT","Offset":"10800"}, +{"displayName":"America\/St_Kitts","id":209,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Asia\/Pyongyang","id":210,"TZName":"KST","Offset":"32400"}, +{"displayName":"Asia\/Seoul","id":211,"TZName":"KST","Offset":"32400"}, +{"displayName":"Asia\/Kuwait","id":212,"TZName":"AST","Offset":"10800"}, +{"displayName":"America\/Cayman","id":213,"TZName":"EST","Offset":"-18000"}, +{"displayName":"Asia\/Almaty","id":214,"TZName":"ALMT","Offset":"21600"}, +{"displayName":"Asia\/Qyzylorda","id":215,"TZName":"MSK+2","Offset":"18000"}, +{"displayName":"Asia\/Qostanay","id":216,"TZName":"QYZST","Offset":"21600"}, +{"displayName":"Asia\/Aqtobe","id":217,"TZName":"AQTT","Offset":"18000"}, +{"displayName":"Asia\/Aqtau","id":218,"TZName":"MSD+1","Offset":"18000"}, +{"displayName":"Asia\/Atyrau","id":219,"TZName":"MSD+1","Offset":"18000"}, +{"displayName":"Asia\/Oral","id":220,"TZName":"ORAST","Offset":"18000"}, +{"displayName":"Asia\/Vientiane","id":221,"TZName":"ICT","Offset":"25200"}, +{"displayName":"Asia\/Beirut","id":222,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616882400,"DSTEnd":1635627600},{"DSTStart":1648332000,"DSTEnd":1667077200},{"DSTStart":1679781600,"DSTEnd":1698526800},{"DSTStart":1711836000,"DSTEnd":1729976400},{"DSTStart":1743285600,"DSTEnd":1761426000},{"DSTStart":1774735200,"DSTEnd":1792875600},{"DSTStart":1806184800,"DSTEnd":1824930000},{"DSTStart":1837634400,"DSTEnd":1856379600},{"DSTStart":1869084000,"DSTEnd":1887829200},{"DSTStart":1901138400,"DSTEnd":1919278800},{"DSTStart":1932588000,"DSTEnd":1950728400},{"DSTStart":1964037600,"DSTEnd":1982782800},{"DSTStart":1995487200,"DSTEnd":2014232400}]}, +{"displayName":"America\/St_Lucia","id":223,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Europe\/Vaduz","id":224,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Asia\/Colombo","id":225,"TZName":"IST","Offset":"19800"}, +{"displayName":"Africa\/Monrovia","id":226,"TZName":"GMT","Offset":"0"}, +{"displayName":"Africa\/Maseru","id":227,"TZName":"SAST","Offset":"7200"}, +{"displayName":"Europe\/Vilnius","id":228,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Luxembourg","id":229,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Riga","id":230,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Tripoli","id":231,"TZName":"EET","Offset":"7200"}, +{"displayName":"Africa\/Casablanca","id":232,"DSTOffset":"0","DSTName":"WET","Offset":"3600","TZName":"WEST","DSTData":[{"DSTStart":1618106400,"DSTEnd":1621130400},{"DSTStart":1648346400,"DSTEnd":1651975200},{"DSTStart":1679191200,"DSTEnd":1682820000},{"DSTStart":1710036000,"DSTEnd":1713060000},{"DSTStart":1740276000,"DSTEnd":1743904800},{"DSTStart":1771120800,"DSTEnd":1774144800},{"DSTStart":1801965600,"DSTEnd":1804989600},{"DSTStart":1832205600,"DSTEnd":1835834400},{"DSTStart":1863050400,"DSTEnd":1866074400},{"DSTStart":1893290400,"DSTEnd":1896919200},{"DSTStart":1924135200,"DSTEnd":1927764000},{"DSTStart":1954980000,"DSTEnd":1958004000},{"DSTStart":1985220000,"DSTEnd":1988848800},{"DSTStart":2016064800,"DSTEnd":2019088800}]}, +{"displayName":"Europe\/Monaco","id":233,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Chisinau","id":234,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616889600,"DSTEnd":1635638400},{"DSTStart":1648339200,"DSTEnd":1667088000},{"DSTStart":1679788800,"DSTEnd":1698537600},{"DSTStart":1711843200,"DSTEnd":1729987200},{"DSTStart":1743292800,"DSTEnd":1761436800},{"DSTStart":1774742400,"DSTEnd":1792886400},{"DSTStart":1806192000,"DSTEnd":1824940800},{"DSTStart":1837641600,"DSTEnd":1856390400},{"DSTStart":1869091200,"DSTEnd":1887840000},{"DSTStart":1901145600,"DSTEnd":1919289600},{"DSTStart":1932595200,"DSTEnd":1950739200},{"DSTStart":1964044800,"DSTEnd":1982793600},{"DSTStart":1995494400,"DSTEnd":2014243200}]}, +{"displayName":"Europe\/Podgorica","id":235,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/Marigot","id":236,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Indian\/Antananarivo","id":237,"TZName":"EAT","Offset":"10800"}, +{"displayName":"Pacific\/Majuro","id":238,"TZName":"+12","Offset":"43200"}, +{"displayName":"Pacific\/Kwajalein","id":239,"TZName":"+12","Offset":"43200"}, +{"displayName":"Europe\/Skopje","id":240,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Bamako","id":241,"TZName":"GMT","Offset":"0"}, +{"displayName":"Asia\/Yangon","id":242,"TZName":"MMT","Offset":"23400"}, +{"displayName":"Asia\/Ulaanbaatar","id":243,"TZName":"ULAT","Offset":"28800"}, +{"displayName":"Asia\/Hovd","id":244,"TZName":"HOVT","Offset":"25200"}, +{"displayName":"Asia\/Choibalsan","id":245,"TZName":"CHOT","Offset":"28800"}, +{"displayName":"Asia\/Macau","id":246,"TZName":"CST","Offset":"28800"}, +{"displayName":"Pacific\/Saipan","id":247,"TZName":"ChST","Offset":"36000"}, +{"displayName":"America\/Martinique","id":248,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Africa\/Nouakchott","id":249,"TZName":"GMT","Offset":"0"}, +{"displayName":"America\/Montserrat","id":250,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Europe\/Malta","id":251,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Indian\/Mauritius","id":252,"TZName":"MUT","Offset":"14400"}, +{"displayName":"Indian\/Maldives","id":253,"TZName":"MVT","Offset":"18000"}, +{"displayName":"Africa\/Blantyre","id":254,"TZName":"CAT","Offset":"7200"}, +{"displayName":"America\/Mexico_City","id":255,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1617523200,"DSTEnd":1635663600},{"DSTStart":1648972800,"DSTEnd":1667113200},{"DSTStart":1680422400,"DSTEnd":1698562800},{"DSTStart":1712476800,"DSTEnd":1730012400},{"DSTStart":1743926400,"DSTEnd":1761462000},{"DSTStart":1775376000,"DSTEnd":1792911600},{"DSTStart":1806825600,"DSTEnd":1824966000},{"DSTStart":1838275200,"DSTEnd":1856415600},{"DSTStart":1869724800,"DSTEnd":1887865200},{"DSTStart":1901779200,"DSTEnd":1919314800},{"DSTStart":1933228800,"DSTEnd":1950764400},{"DSTStart":1964678400,"DSTEnd":1982818800},{"DSTStart":1996128000,"DSTEnd":2014268400}]}, +{"displayName":"America\/Cancun","id":256,"TZName":"EST","Offset":"-18000"}, +{"displayName":"America\/Merida","id":257,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1617523200,"DSTEnd":1635663600},{"DSTStart":1648972800,"DSTEnd":1667113200},{"DSTStart":1680422400,"DSTEnd":1698562800},{"DSTStart":1712476800,"DSTEnd":1730012400},{"DSTStart":1743926400,"DSTEnd":1761462000},{"DSTStart":1775376000,"DSTEnd":1792911600},{"DSTStart":1806825600,"DSTEnd":1824966000},{"DSTStart":1838275200,"DSTEnd":1856415600},{"DSTStart":1869724800,"DSTEnd":1887865200},{"DSTStart":1901779200,"DSTEnd":1919314800},{"DSTStart":1933228800,"DSTEnd":1950764400},{"DSTStart":1964678400,"DSTEnd":1982818800},{"DSTStart":1996128000,"DSTEnd":2014268400}]}, +{"displayName":"America\/Monterrey","id":258,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1617523200,"DSTEnd":1635663600},{"DSTStart":1648972800,"DSTEnd":1667113200},{"DSTStart":1680422400,"DSTEnd":1698562800},{"DSTStart":1712476800,"DSTEnd":1730012400},{"DSTStart":1743926400,"DSTEnd":1761462000},{"DSTStart":1775376000,"DSTEnd":1792911600},{"DSTStart":1806825600,"DSTEnd":1824966000},{"DSTStart":1838275200,"DSTEnd":1856415600},{"DSTStart":1869724800,"DSTEnd":1887865200},{"DSTStart":1901779200,"DSTEnd":1919314800},{"DSTStart":1933228800,"DSTEnd":1950764400},{"DSTStart":1964678400,"DSTEnd":1982818800},{"DSTStart":1996128000,"DSTEnd":2014268400}]}, +{"displayName":"America\/Matamoros","id":259,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/Mazatlan","id":260,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1617526800,"DSTEnd":1635667200},{"DSTStart":1648976400,"DSTEnd":1667116800},{"DSTStart":1680426000,"DSTEnd":1698566400},{"DSTStart":1712480400,"DSTEnd":1730016000},{"DSTStart":1743930000,"DSTEnd":1761465600},{"DSTStart":1775379600,"DSTEnd":1792915200},{"DSTStart":1806829200,"DSTEnd":1824969600},{"DSTStart":1838278800,"DSTEnd":1856419200},{"DSTStart":1869728400,"DSTEnd":1887868800},{"DSTStart":1901782800,"DSTEnd":1919318400},{"DSTStart":1933232400,"DSTEnd":1950768000},{"DSTStart":1964682000,"DSTEnd":1982822400},{"DSTStart":1996131600,"DSTEnd":2014272000}]}, +{"displayName":"America\/Chihuahua","id":261,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1617526800,"DSTEnd":1635667200},{"DSTStart":1648976400,"DSTEnd":1667116800},{"DSTStart":1680426000,"DSTEnd":1698566400},{"DSTStart":1712480400,"DSTEnd":1730016000},{"DSTStart":1743930000,"DSTEnd":1761465600},{"DSTStart":1775379600,"DSTEnd":1792915200},{"DSTStart":1806829200,"DSTEnd":1824969600},{"DSTStart":1838278800,"DSTEnd":1856419200},{"DSTStart":1869728400,"DSTEnd":1887868800},{"DSTStart":1901782800,"DSTEnd":1919318400},{"DSTStart":1933232400,"DSTEnd":1950768000},{"DSTStart":1964682000,"DSTEnd":1982822400},{"DSTStart":1996131600,"DSTEnd":2014272000}]}, +{"displayName":"America\/Ojinaga","id":262,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]}, +{"displayName":"America\/Hermosillo","id":263,"TZName":"MST","Offset":"-25200"}, +{"displayName":"America\/Tijuana","id":264,"DSTOffset":"-25200","DSTName":"PDT","Offset":"-28800","TZName":"PST","DSTData":[{"DSTStart":1615716000,"DSTEnd":1636275600},{"DSTStart":1647165600,"DSTEnd":1667725200},{"DSTStart":1678615200,"DSTEnd":1699174800},{"DSTStart":1710064800,"DSTEnd":1730624400},{"DSTStart":1741514400,"DSTEnd":1762074000},{"DSTStart":1772964000,"DSTEnd":1793523600},{"DSTStart":1805018400,"DSTEnd":1825578000},{"DSTStart":1836468000,"DSTEnd":1857027600},{"DSTStart":1867917600,"DSTEnd":1888477200},{"DSTStart":1899367200,"DSTEnd":1919926800},{"DSTStart":1930816800,"DSTEnd":1951376400},{"DSTStart":1962871200,"DSTEnd":1983430800},{"DSTStart":1994320800,"DSTEnd":2014880400}]}, +{"displayName":"America\/Bahia_Banderas","id":265,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1617523200,"DSTEnd":1635663600},{"DSTStart":1648972800,"DSTEnd":1667113200},{"DSTStart":1680422400,"DSTEnd":1698562800},{"DSTStart":1712476800,"DSTEnd":1730012400},{"DSTStart":1743926400,"DSTEnd":1761462000},{"DSTStart":1775376000,"DSTEnd":1792911600},{"DSTStart":1806825600,"DSTEnd":1824966000},{"DSTStart":1838275200,"DSTEnd":1856415600},{"DSTStart":1869724800,"DSTEnd":1887865200},{"DSTStart":1901779200,"DSTEnd":1919314800},{"DSTStart":1933228800,"DSTEnd":1950764400},{"DSTStart":1964678400,"DSTEnd":1982818800},{"DSTStart":1996128000,"DSTEnd":2014268400}]}, +{"displayName":"Asia\/Kuala_Lumpur","id":266,"TZName":"MYT","Offset":"28800"}, +{"displayName":"Asia\/Kuching","id":267,"TZName":"MYT","Offset":"28800"}, +{"displayName":"Africa\/Maputo","id":268,"TZName":"CAT","Offset":"7200"}, +{"displayName":"Africa\/Windhoek","id":269,"TZName":"CAT","Offset":"7200"}, +{"displayName":"Pacific\/Noumea","id":270,"TZName":"NCT","Offset":"39600"}, +{"displayName":"Africa\/Niamey","id":271,"TZName":"WAT","Offset":"3600"}, +{"displayName":"Pacific\/Norfolk","id":272,"Offset":"39600","TZName":"NFT","DSTOffset":"43200","DSTName":"NFDT","DSTData":[{"DSTStart":1633186800,"DSTEnd":1648911600},{"DSTStart":1664636400,"DSTEnd":1680361200},{"DSTStart":1696086000,"DSTEnd":1712415600},{"DSTStart":1728140400,"DSTEnd":1743865200},{"DSTStart":1759590000,"DSTEnd":1775314800},{"DSTStart":1791039600,"DSTEnd":1806764400},{"DSTStart":1822489200,"DSTEnd":1838214000},{"DSTStart":1853938800,"DSTEnd":1869663600},{"DSTStart":1885993200,"DSTEnd":1901718000},{"DSTStart":1917442800,"DSTEnd":1933167600},{"DSTStart":1948892400,"DSTEnd":1964617200},{"DSTStart":1980342000,"DSTEnd":1996066800},{"DSTStart":2011791600,"DSTEnd":2027516400}]}, +{"displayName":"Africa\/Lagos","id":273,"TZName":"WAT","Offset":"3600"}, +{"displayName":"America\/Managua","id":274,"TZName":"CST","Offset":"-21600"}, +{"displayName":"Europe\/Amsterdam","id":275,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Oslo","id":276,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Asia\/Kathmandu","id":277,"TZName":"NPT","Offset":"20700"}, +{"displayName":"Pacific\/Nauru","id":278,"TZName":"NRT","Offset":"43200"}, +{"displayName":"Pacific\/Niue","id":279,"TZName":"NUT","Offset":"-39600"}, +{"displayName":"Pacific\/Auckland","id":280,"Offset":"43200","TZName":"NZST","DSTOffset":"46800","DSTName":"NZDT","DSTData":[{"DSTStart":1632578400,"DSTEnd":1648908000},{"DSTStart":1664028000,"DSTEnd":1680357600},{"DSTStart":1695477600,"DSTEnd":1712412000},{"DSTStart":1727532000,"DSTEnd":1743861600},{"DSTStart":1758981600,"DSTEnd":1775311200},{"DSTStart":1790431200,"DSTEnd":1806760800},{"DSTStart":1821880800,"DSTEnd":1838210400},{"DSTStart":1853330400,"DSTEnd":1869660000},{"DSTStart":1885384800,"DSTEnd":1901714400},{"DSTStart":1916834400,"DSTEnd":1933164000},{"DSTStart":1948284000,"DSTEnd":1964613600},{"DSTStart":1979733600,"DSTEnd":1996063200},{"DSTStart":2011183200,"DSTEnd":2027512800}]}, +{"displayName":"Pacific\/Chatham","id":281,"Offset":"45900","TZName":"CHAST","DSTOffset":"49500","DSTName":"CHADT","DSTData":[{"DSTStart":1632578400,"DSTEnd":1648908000},{"DSTStart":1664028000,"DSTEnd":1680357600},{"DSTStart":1695477600,"DSTEnd":1712412000},{"DSTStart":1727532000,"DSTEnd":1743861600},{"DSTStart":1758981600,"DSTEnd":1775311200},{"DSTStart":1790431200,"DSTEnd":1806760800},{"DSTStart":1821880800,"DSTEnd":1838210400},{"DSTStart":1853330400,"DSTEnd":1869660000},{"DSTStart":1885384800,"DSTEnd":1901714400},{"DSTStart":1916834400,"DSTEnd":1933164000},{"DSTStart":1948284000,"DSTEnd":1964613600},{"DSTStart":1979733600,"DSTEnd":1996063200},{"DSTStart":2011183200,"DSTEnd":2027512800}]}, +{"displayName":"Asia\/Muscat","id":282,"TZName":"GST","Offset":"14400"}, +{"displayName":"America\/Panama","id":283,"TZName":"EST","Offset":"-18000"}, +{"displayName":"America\/Lima","id":284,"TZName":"PET","Offset":"-18000"}, +{"displayName":"Pacific\/Tahiti","id":285,"TZName":"TAHT","Offset":"-36000"}, +{"displayName":"Pacific\/Marquesas","id":286,"TZName":"MART","Offset":"-34200"}, +{"displayName":"Pacific\/Gambier","id":287,"TZName":"GAMT","Offset":"-32400"}, +{"displayName":"Pacific\/Port_Moresby","id":288,"TZName":"PGT","Offset":"36000"}, +{"displayName":"Pacific\/Bougainville","id":289,"TZName":"BST","Offset":"39600"}, +{"displayName":"Asia\/Manila","id":290,"TZName":"PST","Offset":"28800"}, +{"displayName":"Asia\/Karachi","id":291,"TZName":"PKT","Offset":"18000"}, +{"displayName":"Europe\/Warsaw","id":292,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/Miquelon","id":293,"DSTOffset":"-7200","DSTName":"PMST","Offset":"-10800","TZName":"PMDT","DSTData":[{"DSTStart":1615698000,"DSTEnd":1636257600},{"DSTStart":1647147600,"DSTEnd":1667707200},{"DSTStart":1678597200,"DSTEnd":1699156800},{"DSTStart":1710046800,"DSTEnd":1730606400},{"DSTStart":1741496400,"DSTEnd":1762056000},{"DSTStart":1772946000,"DSTEnd":1793505600},{"DSTStart":1805000400,"DSTEnd":1825560000},{"DSTStart":1836450000,"DSTEnd":1857009600},{"DSTStart":1867899600,"DSTEnd":1888459200},{"DSTStart":1899349200,"DSTEnd":1919908800},{"DSTStart":1930798800,"DSTEnd":1951358400},{"DSTStart":1962853200,"DSTEnd":1983412800},{"DSTStart":1994302800,"DSTEnd":2014862400}]}, +{"displayName":"Pacific\/Pitcairn","id":294,"TZName":"PST","Offset":"-28800"}, +{"displayName":"America\/Puerto_Rico","id":295,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Asia\/Gaza","id":296,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616796000,"DSTEnd":1635544800},{"DSTStart":1648245600,"DSTEnd":1666994400},{"DSTStart":1679695200,"DSTEnd":1698444000},{"DSTStart":1711749600,"DSTEnd":1729893600},{"DSTStart":1743199200,"DSTEnd":1761343200},{"DSTStart":1774648800,"DSTEnd":1792792800},{"DSTStart":1806098400,"DSTEnd":1824847200},{"DSTStart":1837548000,"DSTEnd":1856296800},{"DSTStart":1868997600,"DSTEnd":1887746400},{"DSTStart":1901052000,"DSTEnd":1919196000},{"DSTStart":1932501600,"DSTEnd":1950645600},{"DSTStart":1963951200,"DSTEnd":1982700000},{"DSTStart":1995400800,"DSTEnd":2014149600}]}, +{"displayName":"Asia\/Hebron","id":297,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616796000,"DSTEnd":1635544800},{"DSTStart":1648245600,"DSTEnd":1666994400},{"DSTStart":1679695200,"DSTEnd":1698444000},{"DSTStart":1711749600,"DSTEnd":1729893600},{"DSTStart":1743199200,"DSTEnd":1761343200},{"DSTStart":1774648800,"DSTEnd":1792792800},{"DSTStart":1806098400,"DSTEnd":1824847200},{"DSTStart":1837548000,"DSTEnd":1856296800},{"DSTStart":1868997600,"DSTEnd":1887746400},{"DSTStart":1901052000,"DSTEnd":1919196000},{"DSTStart":1932501600,"DSTEnd":1950645600},{"DSTStart":1963951200,"DSTEnd":1982700000},{"DSTStart":1995400800,"DSTEnd":2014149600}]}, +{"displayName":"Europe\/Lisbon","id":298,"DSTOffset":"3600","DSTName":"WEST","Offset":"0","TZName":"WET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Atlantic\/Madeira","id":299,"DSTOffset":"3600","DSTName":"WEST","Offset":"0","TZName":"WET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Atlantic\/Azores","id":300,"DSTOffset":"0","DSTName":"AZOST","Offset":"-3600","TZName":"AZOT","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Pacific\/Palau","id":301,"TZName":"+09","Offset":"32400"}, +{"displayName":"America\/Asuncion","id":302,"Offset":"-14400","TZName":"PYT","DSTOffset":"-10800","DSTName":"PYST","DSTData":[{"DSTStart":1633233600,"DSTEnd":1648350000},{"DSTStart":1664683200,"DSTEnd":1679799600},{"DSTStart":1696132800,"DSTEnd":1711249200},{"DSTStart":1728187200,"DSTEnd":1742698800},{"DSTStart":1759636800,"DSTEnd":1774148400},{"DSTStart":1791086400,"DSTEnd":1806202800},{"DSTStart":1822536000,"DSTEnd":1837652400},{"DSTStart":1853985600,"DSTEnd":1869102000},{"DSTStart":1886040000,"DSTEnd":1900551600},{"DSTStart":1917489600,"DSTEnd":1932001200},{"DSTStart":1948939200,"DSTEnd":1964055600},{"DSTStart":1980388800,"DSTEnd":1995505200},{"DSTStart":2011838400,"DSTEnd":2026954800}]}, +{"displayName":"Asia\/Qatar","id":303,"TZName":"AST","Offset":"10800"}, +{"displayName":"Indian\/Reunion","id":304,"TZName":"RET","Offset":"14400"}, +{"displayName":"Europe\/Bucharest","id":305,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Belgrade","id":306,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Kaliningrad","id":307,"TZName":"EET","Offset":"7200"}, +{"displayName":"Europe\/Moscow","id":308,"TZName":"MSK","Offset":"10800"}, +{"displayName":"Europe\/Simferopol","id":309,"TZName":"MSK","Offset":"10800"}, +{"displayName":"Europe\/Kirov","id":310,"TZName":"MSK","Offset":"10800"}, +{"displayName":"Europe\/Volgograd","id":311,"TZName":"VOLT","Offset":"10800"}, +{"displayName":"Europe\/Astrakhan","id":312,"TZName":"MSK+1","Offset":"14400"}, +{"displayName":"Europe\/Saratov","id":313,"TZName":"MSD","Offset":"14400"}, +{"displayName":"Europe\/Ulyanovsk","id":314,"TZName":"MSK+1","Offset":"14400"}, +{"displayName":"Europe\/Samara","id":315,"TZName":"SAMT","Offset":"14400"}, +{"displayName":"Asia\/Yekaterinburg","id":316,"TZName":"YEKT","Offset":"18000"}, +{"displayName":"Asia\/Omsk","id":317,"TZName":"OMST","Offset":"21600"}, +{"displayName":"Asia\/Novosibirsk","id":318,"TZName":"NOVT","Offset":"25200"}, +{"displayName":"Asia\/Barnaul","id":319,"TZName":"MSK+4","Offset":"25200"}, +{"displayName":"Asia\/Tomsk","id":320,"TZName":"MSD+3","Offset":"25200"}, +{"displayName":"Asia\/Novokuznetsk","id":321,"TZName":"KRAT","Offset":"25200"}, +{"displayName":"Asia\/Krasnoyarsk","id":322,"TZName":"KRAT","Offset":"25200"}, +{"displayName":"Asia\/Irkutsk","id":323,"TZName":"IRKT","Offset":"28800"}, +{"displayName":"Asia\/Chita","id":324,"TZName":"YAKT","Offset":"32400"}, +{"displayName":"Asia\/Yakutsk","id":325,"TZName":"YAKT","Offset":"32400"}, +{"displayName":"Asia\/Khandyga","id":326,"TZName":"YAKT","Offset":"32400"}, +{"displayName":"Asia\/Vladivostok","id":327,"TZName":"VLAT","Offset":"36000"}, +{"displayName":"Asia\/Ust-Nera","id":328,"TZName":"VLAT","Offset":"36000"}, +{"displayName":"Asia\/Magadan","id":329,"TZName":"MAGT","Offset":"39600"}, +{"displayName":"Asia\/Sakhalin","id":330,"TZName":"SAKT","Offset":"39600"}, +{"displayName":"Asia\/Srednekolymsk","id":331,"TZName":"SRET","Offset":"39600"}, +{"displayName":"Asia\/Kamchatka","id":332,"TZName":"PETT","Offset":"43200"}, +{"displayName":"Asia\/Anadyr","id":333,"TZName":"ANAT","Offset":"43200"}, +{"displayName":"Africa\/Kigali","id":334,"TZName":"CAT","Offset":"7200"}, +{"displayName":"Asia\/Riyadh","id":335,"TZName":"AST","Offset":"10800"}, +{"displayName":"Pacific\/Guadalcanal","id":336,"TZName":"SBT","Offset":"39600"}, +{"displayName":"Indian\/Mahe","id":337,"TZName":"SCT","Offset":"14400"}, +{"displayName":"Africa\/Khartoum","id":338,"TZName":"CAT","Offset":"7200"}, +{"displayName":"Europe\/Stockholm","id":339,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Asia\/Singapore","id":340,"TZName":"SST","Offset":"28800"}, +{"displayName":"Atlantic\/St_Helena","id":341,"TZName":"GMT","Offset":"0"}, +{"displayName":"Europe\/Ljubljana","id":342,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Arctic\/Longyearbyen","id":343,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Bratislava","id":344,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Freetown","id":345,"TZName":"GMT","Offset":"0"}, +{"displayName":"Europe\/San_Marino","id":346,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Dakar","id":347,"TZName":"GMT","Offset":"0"}, +{"displayName":"Africa\/Mogadishu","id":348,"TZName":"EAT","Offset":"10800"}, +{"displayName":"America\/Paramaribo","id":349,"TZName":"SRT","Offset":"-10800"}, +{"displayName":"Africa\/Juba","id":350,"Offset":"7200","TZName":"CAT"}, +{"displayName":"Africa\/Sao_Tome","id":351,"TZName":"GMT","Offset":"0"}, +{"displayName":"America\/El_Salvador","id":352,"TZName":"CST","Offset":"-21600"}, +{"displayName":"America\/Lower_Princes","id":353,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Asia\/Damascus","id":354,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616709600,"DSTEnd":1635454800},{"DSTStart":1648159200,"DSTEnd":1666904400},{"DSTStart":1680213600,"DSTEnd":1698354000},{"DSTStart":1711663200,"DSTEnd":1729803600},{"DSTStart":1743112800,"DSTEnd":1761858000},{"DSTStart":1774562400,"DSTEnd":1793307600},{"DSTStart":1806012000,"DSTEnd":1824757200},{"DSTStart":1838066400,"DSTEnd":1856206800},{"DSTStart":1869516000,"DSTEnd":1887656400},{"DSTStart":1900965600,"DSTEnd":1919106000},{"DSTStart":1932415200,"DSTEnd":1951160400},{"DSTStart":1963864800,"DSTEnd":1982610000},{"DSTStart":1995314400,"DSTEnd":2014059600}]}, +{"displayName":"Africa\/Mbabane","id":355,"TZName":"SAST","Offset":"7200"}, +{"displayName":"America\/Grand_Turk","id":356,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"Africa\/Ndjamena","id":357,"TZName":"WAT","Offset":"3600"}, +{"displayName":"Indian\/Kerguelen","id":358,"TZName":"TFT","Offset":"18000"}, +{"displayName":"Africa\/Lome","id":359,"TZName":"GMT","Offset":"0"}, +{"displayName":"Asia\/Bangkok","id":360,"TZName":"ICT","Offset":"25200"}, +{"displayName":"Asia\/Dushanbe","id":361,"TZName":"TJT","Offset":"18000"}, +{"displayName":"Pacific\/Fakaofo","id":362,"TZName":"TKT","Offset":"46800"}, +{"displayName":"Asia\/Dili","id":363,"TZName":"TLT","Offset":"32400"}, +{"displayName":"Asia\/Ashgabat","id":364,"TZName":"TMT","Offset":"18000"}, +{"displayName":"Africa\/Tunis","id":365,"TZName":"CET","Offset":"3600"}, +{"displayName":"Pacific\/Tongatapu","id":366,"TZName":"TOT","Offset":"46800"}, +{"displayName":"Europe\/Istanbul","id":367,"TZName":"TRT","Offset":"10800"}, +{"displayName":"America\/Port_of_Spain","id":368,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Pacific\/Funafuti","id":369,"TZName":"TVT","Offset":"43200"}, +{"displayName":"Asia\/Taipei","id":370,"TZName":"CST","Offset":"28800"}, +{"displayName":"Africa\/Dar_es_Salaam","id":371,"TZName":"EAT","Offset":"10800"}, +{"displayName":"Europe\/Kiev","id":372,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Uzhgorod","id":373,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Europe\/Zaporozhye","id":374,"DSTOffset":"10800","DSTName":"EEST","Offset":"7200","TZName":"EET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"Africa\/Kampala","id":375,"TZName":"EAT","Offset":"10800"}, +{"displayName":"Pacific\/Midway","id":376,"TZName":"SST","Offset":"-39600"}, +{"displayName":"Pacific\/Wake","id":377,"TZName":"WAKT","Offset":"43200"}, +{"displayName":"America\/New_York","id":378,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Detroit","id":379,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Kentucky\/Louisville","id":380,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Kentucky\/Monticello","id":381,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Indiana\/Indianapolis","id":382,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Indiana\/Vincennes","id":383,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Indiana\/Winamac","id":384,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Indiana\/Marengo","id":385,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Indiana\/Petersburg","id":386,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Indiana\/Vevay","id":387,"DSTOffset":"-14400","DSTName":"EDT","Offset":"-18000","TZName":"EST","DSTData":[{"DSTStart":1615705200,"DSTEnd":1636264800},{"DSTStart":1647154800,"DSTEnd":1667714400},{"DSTStart":1678604400,"DSTEnd":1699164000},{"DSTStart":1710054000,"DSTEnd":1730613600},{"DSTStart":1741503600,"DSTEnd":1762063200},{"DSTStart":1772953200,"DSTEnd":1793512800},{"DSTStart":1805007600,"DSTEnd":1825567200},{"DSTStart":1836457200,"DSTEnd":1857016800},{"DSTStart":1867906800,"DSTEnd":1888466400},{"DSTStart":1899356400,"DSTEnd":1919916000},{"DSTStart":1930806000,"DSTEnd":1951365600},{"DSTStart":1962860400,"DSTEnd":1983420000},{"DSTStart":1994310000,"DSTEnd":2014869600}]}, +{"displayName":"America\/Chicago","id":388,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/Indiana\/Tell_City","id":389,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/Indiana\/Knox","id":390,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/Menominee","id":391,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/North_Dakota\/Center","id":392,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/North_Dakota\/New_Salem","id":393,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/North_Dakota\/Beulah","id":394,"DSTOffset":"-18000","DSTName":"CDT","Offset":"-21600","TZName":"CST","DSTData":[{"DSTStart":1615708800,"DSTEnd":1636268400},{"DSTStart":1647158400,"DSTEnd":1667718000},{"DSTStart":1678608000,"DSTEnd":1699167600},{"DSTStart":1710057600,"DSTEnd":1730617200},{"DSTStart":1741507200,"DSTEnd":1762066800},{"DSTStart":1772956800,"DSTEnd":1793516400},{"DSTStart":1805011200,"DSTEnd":1825570800},{"DSTStart":1836460800,"DSTEnd":1857020400},{"DSTStart":1867910400,"DSTEnd":1888470000},{"DSTStart":1899360000,"DSTEnd":1919919600},{"DSTStart":1930809600,"DSTEnd":1951369200},{"DSTStart":1962864000,"DSTEnd":1983423600},{"DSTStart":1994313600,"DSTEnd":2014873200}]}, +{"displayName":"America\/Denver","id":395,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]}, +{"displayName":"America\/Boise","id":396,"DSTOffset":"-21600","DSTName":"MDT","Offset":"-25200","TZName":"MST","DSTData":[{"DSTStart":1615712400,"DSTEnd":1636272000},{"DSTStart":1647162000,"DSTEnd":1667721600},{"DSTStart":1678611600,"DSTEnd":1699171200},{"DSTStart":1710061200,"DSTEnd":1730620800},{"DSTStart":1741510800,"DSTEnd":1762070400},{"DSTStart":1772960400,"DSTEnd":1793520000},{"DSTStart":1805014800,"DSTEnd":1825574400},{"DSTStart":1836464400,"DSTEnd":1857024000},{"DSTStart":1867914000,"DSTEnd":1888473600},{"DSTStart":1899363600,"DSTEnd":1919923200},{"DSTStart":1930813200,"DSTEnd":1951372800},{"DSTStart":1962867600,"DSTEnd":1983427200},{"DSTStart":1994317200,"DSTEnd":2014876800}]}, +{"displayName":"America\/Phoenix","id":397,"TZName":"MST","Offset":"-25200"}, +{"displayName":"America\/Los_Angeles","id":398,"DSTOffset":"-25200","DSTName":"PDT","Offset":"-28800","TZName":"PST","DSTData":[{"DSTStart":1615716000,"DSTEnd":1636275600},{"DSTStart":1647165600,"DSTEnd":1667725200},{"DSTStart":1678615200,"DSTEnd":1699174800},{"DSTStart":1710064800,"DSTEnd":1730624400},{"DSTStart":1741514400,"DSTEnd":1762074000},{"DSTStart":1772964000,"DSTEnd":1793523600},{"DSTStart":1805018400,"DSTEnd":1825578000},{"DSTStart":1836468000,"DSTEnd":1857027600},{"DSTStart":1867917600,"DSTEnd":1888477200},{"DSTStart":1899367200,"DSTEnd":1919926800},{"DSTStart":1930816800,"DSTEnd":1951376400},{"DSTStart":1962871200,"DSTEnd":1983430800},{"DSTStart":1994320800,"DSTEnd":2014880400}]}, +{"displayName":"America\/Anchorage","id":399,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]}, +{"displayName":"America\/Juneau","id":400,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]}, +{"displayName":"America\/Sitka","id":401,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]}, +{"displayName":"America\/Metlakatla","id":402,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]}, +{"displayName":"America\/Yakutat","id":403,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]}, +{"displayName":"America\/Nome","id":404,"DSTOffset":"-28800","DSTName":"AKDT","Offset":"-32400","TZName":"AKST","DSTData":[{"DSTStart":1615719600,"DSTEnd":1636279200},{"DSTStart":1647169200,"DSTEnd":1667728800},{"DSTStart":1678618800,"DSTEnd":1699178400},{"DSTStart":1710068400,"DSTEnd":1730628000},{"DSTStart":1741518000,"DSTEnd":1762077600},{"DSTStart":1772967600,"DSTEnd":1793527200},{"DSTStart":1805022000,"DSTEnd":1825581600},{"DSTStart":1836471600,"DSTEnd":1857031200},{"DSTStart":1867921200,"DSTEnd":1888480800},{"DSTStart":1899370800,"DSTEnd":1919930400},{"DSTStart":1930820400,"DSTEnd":1951380000},{"DSTStart":1962874800,"DSTEnd":1983434400},{"DSTStart":1994324400,"DSTEnd":2014884000}]}, +{"displayName":"America\/Adak","id":405,"DSTOffset":"-32400","DSTName":"HDT","Offset":"-36000","TZName":"HST","DSTData":[{"DSTStart":1615723200,"DSTEnd":1636282800},{"DSTStart":1647172800,"DSTEnd":1667732400},{"DSTStart":1678622400,"DSTEnd":1699182000},{"DSTStart":1710072000,"DSTEnd":1730631600},{"DSTStart":1741521600,"DSTEnd":1762081200},{"DSTStart":1772971200,"DSTEnd":1793530800},{"DSTStart":1805025600,"DSTEnd":1825585200},{"DSTStart":1836475200,"DSTEnd":1857034800},{"DSTStart":1867924800,"DSTEnd":1888484400},{"DSTStart":1899374400,"DSTEnd":1919934000},{"DSTStart":1930824000,"DSTEnd":1951383600},{"DSTStart":1962878400,"DSTEnd":1983438000},{"DSTStart":1994328000,"DSTEnd":2014887600}]}, +{"displayName":"Pacific\/Honolulu","id":406,"TZName":"HST","Offset":"-36000"}, +{"displayName":"America\/Montevideo","id":407,"TZName":"UYT","Offset":"-10800"}, +{"displayName":"Asia\/Samarkand","id":408,"TZName":"UZT","Offset":"18000"}, +{"displayName":"Asia\/Tashkent","id":409,"TZName":"UZT","Offset":"18000"}, +{"displayName":"Europe\/Vatican","id":410,"DSTOffset":"7200","DSTName":"CEST","Offset":"3600","TZName":"CET","DSTData":[{"DSTStart":1616893200,"DSTEnd":1635642000},{"DSTStart":1648342800,"DSTEnd":1667091600},{"DSTStart":1679792400,"DSTEnd":1698541200},{"DSTStart":1711846800,"DSTEnd":1729990800},{"DSTStart":1743296400,"DSTEnd":1761440400},{"DSTStart":1774746000,"DSTEnd":1792890000},{"DSTStart":1806195600,"DSTEnd":1824944400},{"DSTStart":1837645200,"DSTEnd":1856394000},{"DSTStart":1869094800,"DSTEnd":1887843600},{"DSTStart":1901149200,"DSTEnd":1919293200},{"DSTStart":1932598800,"DSTEnd":1950742800},{"DSTStart":1964048400,"DSTEnd":1982797200},{"DSTStart":1995498000,"DSTEnd":2014246800}]}, +{"displayName":"America\/St_Vincent","id":411,"TZName":"AST","Offset":"-14400"}, +{"displayName":"America\/Caracas","id":412,"TZName":"VET","Offset":"-14400"}, +{"displayName":"America\/Tortola","id":413,"TZName":"AST","Offset":"-14400"}, +{"displayName":"America\/St_Thomas","id":414,"TZName":"AST","Offset":"-14400"}, +{"displayName":"Asia\/Ho_Chi_Minh","id":415,"TZName":"IDT","Offset":"25200"}, +{"displayName":"Pacific\/Efate","id":416,"TZName":"VUT","Offset":"39600"}, +{"displayName":"Pacific\/Wallis","id":417,"TZName":"WFT","Offset":"43200"}, +{"displayName":"Pacific\/Apia","id":418,"Offset":"46800","TZName":"WST"}, +{"displayName":"Asia\/Aden","id":419,"TZName":"AST","Offset":"10800"}, +{"displayName":"Indian\/Mayotte","id":420,"TZName":"EAT","Offset":"10800"}, +{"displayName":"Africa\/Johannesburg","id":421,"TZName":"SAST","Offset":"7200"}, +{"displayName":"Africa\/Lusaka","id":422,"TZName":"CAT","Offset":"7200"}, +{"displayName":"Africa\/Harare","id":423,"TZName":"CAT","Offset":"7200"}] + +function isDST(DSTPeriods) { + if(DSTPeriods === undefined) + return (false) + + let now = new Date().getTime() / 1000 + let isDSTflag = false + for (let f = 0; f < DSTPeriods.length; f++) { + if ((now >= DSTPeriods[f].DSTStart) && (now <= DSTPeriods[f].DSTEnd)) { + isDSTflag = true + } + } + return(isDSTflag) +} + diff --git a/package/contents/code/unit-utils.js b/package/contents/code/unit-utils.js index fcc9fee..c5f4a72 100644 --- a/package/contents/code/unit-utils.js +++ b/package/contents/code/unit-utils.js @@ -138,6 +138,8 @@ var TimezoneType = { } function convertDate(date, timezoneType, offset) { + // dbgprint("convertDate") + // dbgprint(date + "\t" + "timezoneType:" + timezoneType + "\t" + offset) if (timezoneType === TimezoneType.UTC) { return new Date(date.getTime() + (date.getTimezoneOffset() * 60000)) } diff --git a/package/contents/code/weather/current.1609350.xml b/package/contents/code/weather/current.1609350.xml new file mode 100644 index 0000000..0996e62 --- /dev/null +++ b/package/contents/code/weather/current.1609350.xml @@ -0,0 +1,2 @@ + +TH25200 \ No newline at end of file diff --git a/package/contents/code/weather/current.2644668.xml b/package/contents/code/weather/current.2644668.xml new file mode 100644 index 0000000..ba410d7 --- /dev/null +++ b/package/contents/code/weather/current.2644668.xml @@ -0,0 +1,2 @@ + +GB0 \ No newline at end of file diff --git a/package/contents/code/weather/current.5368361.xml b/package/contents/code/weather/current.5368361.xml new file mode 100644 index 0000000..3e1cad0 --- /dev/null +++ b/package/contents/code/weather/current.5368361.xml @@ -0,0 +1,2 @@ + +US-28800 \ No newline at end of file diff --git a/package/contents/code/weather/daily.1609350.xml b/package/contents/code/weather/daily.1609350.xml new file mode 100644 index 0000000..bf71407 --- /dev/null +++ b/package/contents/code/weather/daily.1609350.xml @@ -0,0 +1,123 @@ + + + +Bangkok + +TH +25200 + + + + + +0 + + + + + + + + + + + + + + diff --git a/package/contents/code/weather/daily.2644668.xml b/package/contents/code/weather/daily.2644668.xml new file mode 100644 index 0000000..7d003fa --- /dev/null +++ b/package/contents/code/weather/daily.2644668.xml @@ -0,0 +1,2 @@ + +LeicesterGB00 \ No newline at end of file diff --git a/package/contents/code/weather/daily.5368361.xml b/package/contents/code/weather/daily.5368361.xml new file mode 100644 index 0000000..91e14fb --- /dev/null +++ b/package/contents/code/weather/daily.5368361.xml @@ -0,0 +1,128 @@ + + + + + +Los Angeles + + +US + +-28800 + + + + + + +0 + + + + + + + + + + + + + + diff --git a/package/contents/code/weather/forecast.1609350.xml b/package/contents/code/weather/forecast.1609350.xml new file mode 100644 index 0000000..230f96c --- /dev/null +++ b/package/contents/code/weather/forecast.1609350.xml @@ -0,0 +1,539 @@ + + + +Bangkok + +TH +25200 + + + + + +0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package/contents/code/weather/forecast.2644668.xml b/package/contents/code/weather/forecast.2644668.xml new file mode 100644 index 0000000..0fecead --- /dev/null +++ b/package/contents/code/weather/forecast.2644668.xml @@ -0,0 +1,544 @@ + + + + + +Leicester + + +GB + +0 + + + + + + +0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package/contents/code/weather/forecast.5368361.xml b/package/contents/code/weather/forecast.5368361.xml new file mode 100644 index 0000000..d805cb9 --- /dev/null +++ b/package/contents/code/weather/forecast.5368361.xml @@ -0,0 +1,2 @@ + +Los AngelesUS-288000 \ No newline at end of file diff --git a/package/contents/code/weather/sun.json b/package/contents/code/weather/sun.json new file mode 100644 index 0000000..f42b453 --- /dev/null +++ b/package/contents/code/weather/sun.json @@ -0,0 +1 @@ +{"copyright":"MET Norway","licenseURL":"https://api.met.no/license_data.html","type":"Feature","geometry":{"type":"Point","coordinates":[-1.1,52.6]},"when":{"interval":["2023-12-11T23:57:00Z","2023-12-13T00:04:00Z"]},"properties":{"body":"Sun","sunrise":{"time":"2023-12-12T08:06+00:00","azimuth":128.76},"sunset":{"time":"2023-12-12T15:49+00:00","azimuth":231.2},"solarnoon":{"time":"2023-12-12T11:57+00:00","disc_centre_elevation":14.32,"visible":true},"solarmidnight":{"time":"2023-12-11T23:57+00:00","disc_centre_elevation":-60.44,"visible":false}}} \ No newline at end of file diff --git a/package/contents/code/weather/weather.json b/package/contents/code/weather/weather.json new file mode 100644 index 0000000..c7ae918 --- /dev/null +++ b/package/contents/code/weather/weather.json @@ -0,0 +1 @@ +{"type":"Feature","geometry":{"type":"Point","coordinates":[-1.1333,52.6333,65]},"properties":{"meta":{"updated_at":"2023-12-12T19:27:27Z","units":{"air_pressure_at_sea_level":"hPa","air_temperature":"celsius","cloud_area_fraction":"%","precipitation_amount":"mm","relative_humidity":"%","wind_from_direction":"degrees","wind_speed":"m/s"}},"timeseries":[{"time":"2023-12-12T22:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":993.9,"air_temperature":5.4,"cloud_area_fraction":100.0,"relative_humidity":99.1,"wind_from_direction":344.0,"wind_speed":3.5}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.3}}}},{"time":"2023-12-12T23:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":994.5,"air_temperature":6.0,"cloud_area_fraction":100.0,"relative_humidity":99.7,"wind_from_direction":347.3,"wind_speed":4.3}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"fog"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.3}}}},{"time":"2023-12-13T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":994.9,"air_temperature":6.4,"cloud_area_fraction":100.0,"relative_humidity":98.8,"wind_from_direction":343.5,"wind_speed":4.4}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"fog"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.5}}}},{"time":"2023-12-13T01:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":995.4,"air_temperature":6.4,"cloud_area_fraction":100.0,"relative_humidity":95.7,"wind_from_direction":334.3,"wind_speed":4.4}},"next_12_hours":{"summary":{"symbol_code":"lightrain"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"lightrain"},"details":{"precipitation_amount":0.5}}}},{"time":"2023-12-13T02:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":995.9,"air_temperature":6.3,"cloud_area_fraction":100.0,"relative_humidity":94.2,"wind_from_direction":325.2,"wind_speed":4.3}},"next_12_hours":{"summary":{"symbol_code":"lightrain"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"lightrain"},"details":{"precipitation_amount":0.6}}}},{"time":"2023-12-13T03:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":996.6,"air_temperature":6.2,"cloud_area_fraction":100.0,"relative_humidity":94.1,"wind_from_direction":319.5,"wind_speed":4.7}},"next_12_hours":{"summary":{"symbol_code":"lightrain"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"lightrain"},"details":{"precipitation_amount":0.2}},"next_6_hours":{"summary":{"symbol_code":"lightrain"},"details":{"precipitation_amount":0.5}}}},{"time":"2023-12-13T04:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":996.9,"air_temperature":6.1,"cloud_area_fraction":100.0,"relative_humidity":95.4,"wind_from_direction":321.6,"wind_speed":4.9}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.3}}}},{"time":"2023-12-13T05:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":997.6,"air_temperature":6.3,"cloud_area_fraction":100.0,"relative_humidity":96.7,"wind_from_direction":325.8,"wind_speed":5.1}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"lightrain"},"details":{"precipitation_amount":0.2}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.3}}}},{"time":"2023-12-13T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":998.4,"air_temperature":6.4,"cloud_area_fraction":100.0,"relative_humidity":97.5,"wind_from_direction":340.0,"wind_speed":6.2}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.2}}}},{"time":"2023-12-13T07:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":999.7,"air_temperature":6.4,"cloud_area_fraction":100.0,"relative_humidity":93.7,"wind_from_direction":1.6,"wind_speed":7.6}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.2}}}},{"time":"2023-12-13T08:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1001.2,"air_temperature":6.0,"cloud_area_fraction":96.1,"relative_humidity":90.0,"wind_from_direction":357.4,"wind_speed":7.8}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.2}}}},{"time":"2023-12-13T09:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1002.5,"air_temperature":5.7,"cloud_area_fraction":97.7,"relative_humidity":88.8,"wind_from_direction":350.4,"wind_speed":8.0}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.2}}}},{"time":"2023-12-13T10:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1003.6,"air_temperature":5.8,"cloud_area_fraction":96.9,"relative_humidity":86.8,"wind_from_direction":351.1,"wind_speed":8.1}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.2}}}},{"time":"2023-12-13T11:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1004.7,"air_temperature":6.0,"cloud_area_fraction":81.2,"relative_humidity":86.0,"wind_from_direction":350.6,"wind_speed":7.7}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.2}}}},{"time":"2023-12-13T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1005.5,"air_temperature":6.0,"cloud_area_fraction":79.7,"relative_humidity":84.8,"wind_from_direction":353.5,"wind_speed":8.9}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-13T13:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1006.3,"air_temperature":6.0,"cloud_area_fraction":89.1,"relative_humidity":82.6,"wind_from_direction":350.4,"wind_speed":8.7}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-13T14:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1007.3,"air_temperature":5.8,"cloud_area_fraction":100.0,"relative_humidity":81.9,"wind_from_direction":345.8,"wind_speed":8.2}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-13T15:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1008.3,"air_temperature":5.6,"cloud_area_fraction":100.0,"relative_humidity":80.1,"wind_from_direction":348.7,"wind_speed":8.0}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-13T16:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1009.5,"air_temperature":5.2,"cloud_area_fraction":98.4,"relative_humidity":78.1,"wind_from_direction":351.1,"wind_speed":7.8}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-13T17:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1010.9,"air_temperature":4.8,"cloud_area_fraction":94.5,"relative_humidity":79.8,"wind_from_direction":345.4,"wind_speed":7.4}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-13T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1012.0,"air_temperature":4.5,"cloud_area_fraction":78.9,"relative_humidity":80.2,"wind_from_direction":345.6,"wind_speed":7.0}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-13T19:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1012.7,"air_temperature":4.1,"cloud_area_fraction":35.9,"relative_humidity":81.4,"wind_from_direction":350.9,"wind_speed":6.3}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-13T20:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1013.9,"air_temperature":2.7,"cloud_area_fraction":43.0,"relative_humidity":87.2,"wind_from_direction":332.1,"wind_speed":5.3}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-13T21:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1014.9,"air_temperature":2.2,"cloud_area_fraction":27.3,"relative_humidity":88.0,"wind_from_direction":329.7,"wind_speed":4.8}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-13T22:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1015.5,"air_temperature":1.3,"cloud_area_fraction":3.1,"relative_humidity":91.4,"wind_from_direction":329.9,"wind_speed":3.9}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"clearsky_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-13T23:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1016.3,"air_temperature":0.7,"cloud_area_fraction":13.3,"relative_humidity":92.6,"wind_from_direction":316.4,"wind_speed":3.5}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-14T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1016.8,"air_temperature":0.1,"cloud_area_fraction":34.4,"relative_humidity":94.1,"wind_from_direction":302.8,"wind_speed":2.9}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T01:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1017.2,"air_temperature":-0.6,"cloud_area_fraction":100.0,"relative_humidity":94.3,"wind_from_direction":291.2,"wind_speed":2.9}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T02:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1017.2,"air_temperature":-1.3,"cloud_area_fraction":100.0,"relative_humidity":94.6,"wind_from_direction":270.5,"wind_speed":2.4}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T03:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1017.4,"air_temperature":-0.4,"cloud_area_fraction":100.0,"relative_humidity":94.5,"wind_from_direction":257.4,"wind_speed":2.3}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.2}}}},{"time":"2023-12-14T04:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1017.2,"air_temperature":0.7,"cloud_area_fraction":100.0,"relative_humidity":89.6,"wind_from_direction":239.1,"wind_speed":2.6}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T05:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1017.3,"air_temperature":1.2,"cloud_area_fraction":100.0,"relative_humidity":88.1,"wind_from_direction":210.8,"wind_speed":3.8}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1017.4,"air_temperature":1.5,"cloud_area_fraction":100.0,"relative_humidity":88.7,"wind_from_direction":198.3,"wind_speed":4.4}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T07:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1017.5,"air_temperature":2.3,"cloud_area_fraction":100.0,"relative_humidity":84.3,"wind_from_direction":211.6,"wind_speed":4.4}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T08:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1017.7,"air_temperature":3.2,"cloud_area_fraction":100.0,"relative_humidity":81.5,"wind_from_direction":209.8,"wind_speed":4.7}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-14T09:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1017.8,"air_temperature":4.1,"cloud_area_fraction":100.0,"relative_humidity":82.5,"wind_from_direction":211.2,"wind_speed":5.1}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T10:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1018.2,"air_temperature":5.2,"cloud_area_fraction":100.0,"relative_humidity":85.5,"wind_from_direction":220.0,"wind_speed":5.0}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T11:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1018.7,"air_temperature":6.1,"cloud_area_fraction":100.0,"relative_humidity":87.0,"wind_from_direction":226.8,"wind_speed":4.8}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1018.8,"air_temperature":7.0,"cloud_area_fraction":100.0,"relative_humidity":86.9,"wind_from_direction":235.3,"wind_speed":4.6}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T13:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1019.1,"air_temperature":8.3,"cloud_area_fraction":99.2,"relative_humidity":86.0,"wind_from_direction":261.3,"wind_speed":4.2}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T14:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1019.5,"air_temperature":8.9,"cloud_area_fraction":98.4,"relative_humidity":87.9,"wind_from_direction":271.1,"wind_speed":3.4}},"next_12_hours":{"summary":{"symbol_code":"fair_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-14T15:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1020.5,"air_temperature":8.4,"cloud_area_fraction":97.7,"relative_humidity":90.7,"wind_from_direction":276.2,"wind_speed":3.4}},"next_12_hours":{"summary":{"symbol_code":"fair_night"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-14T16:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1021.6,"air_temperature":7.8,"cloud_area_fraction":91.4,"relative_humidity":92.2,"wind_from_direction":284.5,"wind_speed":3.4}},"next_12_hours":{"summary":{"symbol_code":"fair_night"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-14T17:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1022.7,"air_temperature":6.7,"cloud_area_fraction":16.4,"relative_humidity":93.2,"wind_from_direction":285.1,"wind_speed":3.1}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-14T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1023.6,"air_temperature":4.7,"cloud_area_fraction":5.5,"relative_humidity":95.7,"wind_from_direction":274.4,"wind_speed":2.5}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"clearsky_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-14T19:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1024.5,"air_temperature":3.8,"cloud_area_fraction":36.7,"relative_humidity":94.3,"wind_from_direction":269.9,"wind_speed":2.6}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-14T20:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1025.5,"air_temperature":4.0,"cloud_area_fraction":58.6,"relative_humidity":92.6,"wind_from_direction":272.6,"wind_speed":2.9}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-14T21:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1026.4,"air_temperature":4.3,"cloud_area_fraction":26.6,"relative_humidity":93.6,"wind_from_direction":273.7,"wind_speed":3.0}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-14T22:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1027.1,"air_temperature":4.3,"cloud_area_fraction":8.6,"relative_humidity":94.6,"wind_from_direction":271.5,"wind_speed":3.2}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"clearsky_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-14T23:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1027.6,"air_temperature":3.8,"cloud_area_fraction":3.9,"relative_humidity":94.0,"wind_from_direction":269.7,"wind_speed":3.2}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"clearsky_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1028.3,"air_temperature":3.4,"cloud_area_fraction":14.8,"relative_humidity":92.6,"wind_from_direction":271.3,"wind_speed":3.3}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T01:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1028.9,"air_temperature":3.2,"cloud_area_fraction":10.9,"relative_humidity":91.1,"wind_from_direction":269.2,"wind_speed":3.5}},"next_1_hours":{"summary":{"symbol_code":"clearsky_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T02:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1029.5,"air_temperature":2.9,"cloud_area_fraction":37.5,"relative_humidity":90.0,"wind_from_direction":263.6,"wind_speed":3.3}},"next_1_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T03:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1030.4,"air_temperature":2.5,"cloud_area_fraction":64.8,"relative_humidity":90.2,"wind_from_direction":260.1,"wind_speed":3.2}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T04:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1030.7,"air_temperature":2.3,"cloud_area_fraction":93.7,"relative_humidity":90.8,"wind_from_direction":253.8,"wind_speed":3.3}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T05:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1031.1,"air_temperature":2.1,"cloud_area_fraction":100.0,"relative_humidity":91.4,"wind_from_direction":248.3,"wind_speed":3.1}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1031.8,"air_temperature":2.1,"cloud_area_fraction":73.4,"relative_humidity":92.2,"wind_from_direction":245.0,"wind_speed":3.1}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T07:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1032.2,"air_temperature":1.9,"cloud_area_fraction":75.8,"relative_humidity":93.1,"wind_from_direction":232.2,"wind_speed":3.2}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T08:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1033.2,"air_temperature":1.9,"cloud_area_fraction":68.7,"relative_humidity":93.2,"wind_from_direction":230.5,"wind_speed":3.6}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T09:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1034.2,"air_temperature":2.4,"cloud_area_fraction":82.0,"relative_humidity":92.9,"wind_from_direction":230.7,"wind_speed":3.8}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T10:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1035.0,"air_temperature":3.8,"cloud_area_fraction":75.8,"relative_humidity":90.5,"wind_from_direction":233.3,"wind_speed":4.3}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T11:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1035.2,"air_temperature":5.1,"cloud_area_fraction":80.5,"relative_humidity":90.9,"wind_from_direction":222.1,"wind_speed":4.6}},"next_1_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1034.9,"air_temperature":6.0,"cloud_area_fraction":90.6,"relative_humidity":89.0,"wind_from_direction":221.3,"wind_speed":4.0}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-15T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1035.6,"air_temperature":6.4,"cloud_area_fraction":82.8,"relative_humidity":91.4,"wind_from_direction":231.9,"wind_speed":4.1}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-16T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1036.2,"air_temperature":8.8,"cloud_area_fraction":100.0,"relative_humidity":94.9,"wind_from_direction":235.5,"wind_speed":5.7}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-16T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1036.8,"air_temperature":8.7,"cloud_area_fraction":100.0,"relative_humidity":93.1,"wind_from_direction":243.7,"wind_speed":5.6}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-16T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1037.8,"air_temperature":10.1,"cloud_area_fraction":100.0,"relative_humidity":88.3,"wind_from_direction":239.7,"wind_speed":6.7}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-16T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1037.7,"air_temperature":10.0,"cloud_area_fraction":99.2,"relative_humidity":87.5,"wind_from_direction":237.7,"wind_speed":5.2}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-17T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1038.5,"air_temperature":9.4,"cloud_area_fraction":100.0,"relative_humidity":86.9,"wind_from_direction":241.5,"wind_speed":5.0}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-17T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1037.2,"air_temperature":9.4,"cloud_area_fraction":100.0,"relative_humidity":92.7,"wind_from_direction":222.3,"wind_speed":5.3}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-17T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1036.3,"air_temperature":9.9,"cloud_area_fraction":100.0,"relative_humidity":85.3,"wind_from_direction":219.9,"wind_speed":7.4}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-17T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1033.3,"air_temperature":8.2,"cloud_area_fraction":39.1,"relative_humidity":85.6,"wind_from_direction":216.0,"wind_speed":6.4}},"next_12_hours":{"summary":{"symbol_code":"fair_night"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"partlycloudy_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-18T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1031.0,"air_temperature":6.9,"cloud_area_fraction":0.8,"relative_humidity":88.7,"wind_from_direction":222.1,"wind_speed":7.5}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"clearsky_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-18T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1027.6,"air_temperature":8.4,"cloud_area_fraction":98.4,"relative_humidity":85.2,"wind_from_direction":220.5,"wind_speed":8.6}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-18T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1027.8,"air_temperature":12.7,"cloud_area_fraction":96.9,"relative_humidity":81.5,"wind_from_direction":250.4,"wind_speed":6.9}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-18T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1027.2,"air_temperature":10.1,"cloud_area_fraction":100.0,"relative_humidity":87.4,"wind_from_direction":228.5,"wind_speed":5.1}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-19T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1024.2,"air_temperature":10.5,"cloud_area_fraction":90.6,"relative_humidity":89.9,"wind_from_direction":244.9,"wind_speed":6.9}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-19T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1027.7,"air_temperature":6.0,"cloud_area_fraction":33.6,"relative_humidity":82.7,"wind_from_direction":306.4,"wind_speed":5.5}},"next_12_hours":{"summary":{"symbol_code":"fair_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"fair_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-19T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1028.0,"air_temperature":6.7,"cloud_area_fraction":0.0,"relative_humidity":73.5,"wind_from_direction":262.1,"wind_speed":6.2}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"clearsky_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-19T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1021.7,"air_temperature":6.2,"cloud_area_fraction":33.6,"relative_humidity":75.8,"wind_from_direction":246.8,"wind_speed":8.4}},"next_12_hours":{"summary":{"symbol_code":"lightrainshowers_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"fair_night"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-20T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1014.5,"air_temperature":6.5,"cloud_area_fraction":100.0,"relative_humidity":79.0,"wind_from_direction":252.4,"wind_speed":7.5}},"next_12_hours":{"summary":{"symbol_code":"lightrainshowers_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"rain"},"details":{"precipitation_amount":1.7}}}},{"time":"2023-12-20T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1012.3,"air_temperature":3.7,"cloud_area_fraction":92.2,"relative_humidity":88.9,"wind_from_direction":295.0,"wind_speed":6.3}},"next_12_hours":{"summary":{"symbol_code":"fair_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-20T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1015.6,"air_temperature":5.7,"cloud_area_fraction":1.6,"relative_humidity":78.4,"wind_from_direction":309.2,"wind_speed":6.5}},"next_12_hours":{"summary":{"symbol_code":"fair_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"clearsky_day"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-20T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1019.6,"air_temperature":2.6,"cloud_area_fraction":9.4,"relative_humidity":78.2,"wind_from_direction":308.9,"wind_speed":4.9}},"next_12_hours":{"summary":{"symbol_code":"partlycloudy_day"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"clearsky_night"},"details":{"precipitation_amount":0.0}}}},{"time":"2023-12-21T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1019.7,"air_temperature":3.5,"cloud_area_fraction":99.2,"relative_humidity":81.5,"wind_from_direction":280.4,"wind_speed":5.3}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.2}}}},{"time":"2023-12-21T06:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1015.1,"air_temperature":4.3,"cloud_area_fraction":100.0,"relative_humidity":89.2,"wind_from_direction":235.0,"wind_speed":4.5}},"next_12_hours":{"summary":{"symbol_code":"cloudy"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.2}}}},{"time":"2023-12-21T12:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1009.6,"air_temperature":9.2,"cloud_area_fraction":100.0,"relative_humidity":86.3,"wind_from_direction":261.0,"wind_speed":7.3}},"next_12_hours":{"summary":{"symbol_code":"lightrain"},"details":{}},"next_6_hours":{"summary":{"symbol_code":"cloudy"},"details":{"precipitation_amount":0.1}}}},{"time":"2023-12-21T18:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1006.6,"air_temperature":10.2,"cloud_area_fraction":100.0,"relative_humidity":79.7,"wind_from_direction":270.8,"wind_speed":10.4}},"next_6_hours":{"summary":{"symbol_code":"lightrain"},"details":{"precipitation_amount":0.7}}}},{"time":"2023-12-22T00:00:00Z","data":{"instant":{"details":{"air_pressure_at_sea_level":1004.8,"air_temperature":11.5,"cloud_area_fraction":100.0,"relative_humidity":79.9,"wind_from_direction":268.3,"wind_speed":10.0}}}}]}} \ No newline at end of file diff --git a/package/contents/config/config.qml b/package/contents/config/config.qml index 927b779..eaf93db 100644 --- a/package/contents/config/config.qml +++ b/package/contents/config/config.qml @@ -4,7 +4,7 @@ import org.kde.plasma.configuration 2.0 ConfigModel { ConfigCategory { name: i18n("General") - icon: Qt.resolvedUrl('../images/weather-widget.svg').replace('file://', '') + icon: Qt.resolvedUrl('../images/weather-widget.svg') source: 'config/ConfigGeneral.qml' } ConfigCategory { diff --git a/package/contents/config/main.xml b/package/contents/config/main.xml index f19f6bc..8bb24ba 100644 --- a/package/contents/config/main.xml +++ b/package/contents/config/main.xml @@ -15,8 +15,10 @@ [ - {"providerId": "metno", "placeIdentifier": "lat=52.63333&lon=-1.13333&altitude=65", "placeAlias": "Leicester, UK", "timezoneID": 159}, - {"providerId": "owm", "placeIdentifier": "1609350", "placeAlias": "Bangkok, TH"}, + {"providerId": "owm", "placeIdentifier": "2644668", "placeAlias": "Leicester, UK (OWM)"}, + {"providerId": "metno", "placeIdentifier": "lat=52.63333&lon=-1.13333&altitude=65", "placeAlias": "Leicester, UK", "timezoneID": 159}, + {"providerId": "owm", "placeIdentifier": "5368361", "placeAlias": "Los Angeles, USA (OWM)"}, + {"providerId": "owm", "placeIdentifier": "1609350", "placeAlias": "Bangkok, TH"}, {"providerId": "metno", "placeIdentifier": "lat=38.50245&lon=-0.13044&altitude=30", "placeAlias": "Benidorm, ES", "timezoneID": 146}, {"providerId": "metno", "placeIdentifier": "lat=25.30089&lon=91.69619&altitude=1505","placeAlias":"Cherrapunji, IN","timezoneID":192} ] @@ -28,9 +30,8 @@ false - - - + + false @@ -52,6 +53,9 @@ + + true + 32 diff --git a/package/contents/images/dark1.svg b/package/contents/images/dark1.svg new file mode 100644 index 0000000..afe7d9c --- /dev/null +++ b/package/contents/images/dark1.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/package/contents/images/dark2.svg b/package/contents/images/dark2.svg new file mode 100644 index 0000000..ce3ba48 --- /dev/null +++ b/package/contents/images/dark2.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/package/contents/images/dark3.svg b/package/contents/images/dark3.svg new file mode 100644 index 0000000..6ae3b26 --- /dev/null +++ b/package/contents/images/dark3.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/package/contents/images/dark4.svg b/package/contents/images/dark4.svg new file mode 100644 index 0000000..0a9897c --- /dev/null +++ b/package/contents/images/dark4.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/package/contents/images/dark5.svg b/package/contents/images/dark5.svg new file mode 100644 index 0000000..86b8e4e --- /dev/null +++ b/package/contents/images/dark5.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/package/contents/images/light1.svg b/package/contents/images/light1.svg new file mode 100644 index 0000000..208ac27 --- /dev/null +++ b/package/contents/images/light1.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/package/contents/images/light2.svg b/package/contents/images/light2.svg new file mode 100644 index 0000000..484ba4c --- /dev/null +++ b/package/contents/images/light2.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/package/contents/images/light3.svg b/package/contents/images/light3.svg new file mode 100644 index 0000000..7612799 --- /dev/null +++ b/package/contents/images/light3.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/package/contents/images/light4.svg b/package/contents/images/light4.svg new file mode 100644 index 0000000..828ac6a --- /dev/null +++ b/package/contents/images/light4.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/package/contents/images/light5.svg b/package/contents/images/light5.svg new file mode 100644 index 0000000..661dafb --- /dev/null +++ b/package/contents/images/light5.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/package/contents/ui/CompactItem.qml b/package/contents/ui/CompactItem.qml index 7864308..9b7bb39 100644 --- a/package/contents/ui/CompactItem.qml +++ b/package/contents/ui/CompactItem.qml @@ -1,4 +1,4 @@ -/* +/* * Copyright 2015 Martin Kotelnik * * This program is free software; you can redistribute it and/or @@ -14,161 +14,179 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import QtQuick 2.2 -import QtQuick.Layouts 1.1 -import QtGraphicalEffects 1.0 -import org.kde.plasma.components 2.0 as PlasmaComponents +import QtQuick +import QtQuick.Layouts +import org.kde.plasma.components 3.0 as PlasmaComponents import org.kde.plasma.core 2.0 as PlasmaCore +import Qt5Compat.GraphicalEffects +import org.kde.kirigami as Kirigami +import org.kde.plasma.plasmoid import "../code/icons.js" as IconTools import "../code/unit-utils.js" as UnitUtils -Item { - id: compactItem - anchors.fill: parent +GridLayout { + id: iconAndText - property bool inTray - property int layoutType: inTray ? 2 : main.layoutType - property string widgetFontName: main.widgetFontName - property string widgetFontSize: main.widgetFontSize + anchors.fill: parent - property double parentWidth: parent.width - property double parentHeight: parent.height + property bool vertical: main.vertical + property int layoutType: main.layoutType - property double partWidth: 0 - property double partHeight: 0 + property int widgetFontSize: plasmoid.configuration.widgetFontSize + property string widgetFontName: (plasmoid.configuration.widgetFontName === "") ? Kirigami.Theme.defaultFont : plasmoid.configuration.widgetFontName - property double widgetWidth: 0 - property double widgetHeight: 0 + property string iconNameStr: main.iconNameStr.length > 0 ? main.iconNameStr : "\uf07b" + property string temperatureStr: main.temperatureStr.length > 0 ? main.temperatureStr : "--" - onParentWidthChanged: { - dbgprint("onParentWidthChanged") - computeWidgetSize() - } + columnSpacing: 0 + rowSpacing: 0 - onParentHeightChanged: { - dbgprint("onParentHeightChanged") - computeWidgetSize() - } + rows: (layoutType === 0) ? 1 : 2 + columns: (layoutType === 0) ? 2 : 1 - onLayoutTypeChanged: { - computeWidgetSize() - } + Item { + // Otherwise it takes up too much space while loading + visible: temperatureText.text.length > 0 - function computeWidgetSize() { - if ((parentWidth > 0) && (parentHeight > 0)) { - setDebugFlag(false) - dbgprint("Widget ParentSize = " + parent.width + "x" + parent.height) - if (layoutType === 0) { - partWidth = vertical ? parentWidth / 2 : parentHeight - partHeight = parentHeight - widgetWidth = partWidth * 2 - widgetHeight = partHeight - } else if (layoutType === 1) { - partWidth = vertical ? parentWidth / 2 : parentWidth / 2 - partHeight = vertical ? parentWidth : parentHeight / 2 - widgetWidth = partWidth - widgetHeight = partHeight * 2 - } else if (layoutType === 2) { - partWidth = vertical ? parentWidth : parentHeight - partHeight = partWidth - widgetWidth = partWidth - widgetHeight = partHeight - } - dbgprint("Individual WidgetSize = " + partWidth + "x" + partHeight) - dbgprint("Combined WidgetSize = " + widgetWidth + "x" + widgetHeight) - compactRepresentation.Layout.preferredHeight = widgetHeight - compactRepresentation.Layout.preferredWidth = widgetWidth - compactRepresentation.Layout.maximumWidth - widgetWidth - setDebugFlag(false) - } - } + Layout.alignment: Qt.AlignCenter + Layout.fillWidth: iconAndText.vertical + Layout.fillHeight: !iconAndText.vertical + Layout.minimumWidth: iconAndText.vertical ? 0 : sizehelperText.paintedWidth + Layout.maximumWidth: iconAndText.vertical ? Infinity : Layout.minimumWidth + Layout.minimumHeight: iconAndText.vertical ? sizehelperText.paintedHeight : 0 + Layout.maximumHeight: iconAndText.vertical ? Layout.minimumHeight : Infinity - property double fontPixelSize: partHeight * (layoutType === 2 ? 0.7 : 0.7) + Text { + id: sizehelperText - property string iconNameStr: actualWeatherModel.count > 0 ? IconTools.getIconCode(actualWeatherModel.get(0).iconName, currentProvider.providerId, getPartOfDayIndex()) : '' - property string temperatureStr: actualWeatherModel.count > 0 ? UnitUtils.getTemperatureNumberExt(actualWeatherModel.get(0).temperature, temperatureType) : '' - - PlasmaComponents.Label { - - anchors.left: parent.left - anchors.leftMargin: layoutType === 0 ? partWidth : 0 - anchors.top: parent.top - anchors.topMargin: layoutType === 1 ? partHeight : 0 - - width: partWidth - height: partHeight - - horizontalAlignment: layoutType === 2 ? Text.AlignLeft : Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - fontSizeMode: ((layoutType === 2) || (layoutType===0 && main.vertical)) ? Text.Fit : Text.FixedSize + font { + family: temperatureText.font.family + weight: temperatureText.font.weight + italic: temperatureText.font.italic + pixelSize: (main.onDesktop) ? Math.max(Kirigami.Units.gridUnit, widgetFontSize) : Math.min(Kirigami.Units.gridUnit, widgetFontSize) // random "big enough" size - this is used as a max pixelSize by the fontSizeMode + } + minimumPixelSize: Math.round(Kirigami.Units.gridUnit / 2) + fontSizeMode: main.onDesktop ? Text.Text.FixedSize : iconAndText.vertical ? Text.HorizontalFit : Text.VerticalFit + wrapMode: Text.NoWrap + + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + anchors { + leftMargin: Kirigami.Units.smallSpacing + rightMargin: Kirigami.Units.smallSpacing + } + // These magic values are taken from the digital clock, so that the + // text sizes here are identical with various clock text sizes + height: { + const textHeightScaleFactor = (parent.height > 26) ? 0.7 : 0.9; + return Math.min (parent.height * textHeightScaleFactor, 3 * Kirigami.Theme.defaultFont.pixelSize); + } + visible: false - font.family: 'weathericons' - text: iconNameStr + // pattern to reserve some constant space TODO: improve and take formatting/i18n into account + text: "888°" + } - opacity: layoutType === 2 ? 0.8 : 1 + PlasmaComponents.Label { + id: temperatureText - font.pixelSize: fontPixelSize - font.pointSize: -1 + font { + weight: Font.Normal + family: widgetFontName + pixelSize: widgetFontSize + pointSize: 0 // we need to unset pointSize otherwise it breaks the Text.Fit size mode + } + minimumPixelSize: Math.round(Kirigami.Units.gridUnit / 2) + fontSizeMode: Text.Fit + wrapMode: Text.NoWrap + + height: 0 + width: 0 + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + text: temperatureStr + anchors { + fill: parent + //leftMargin: Kirigami.Units.smallSpacing + //rightMargin: Kirigami.Units.smallSpacing + } + } } - PlasmaComponents.Label { - id: temperatureText - anchors.left: parent.left - anchors.leftMargin: layoutType === 2 ? partWidth * 0.25 : 0 - anchors.top: parent.top - anchors.topMargin: 0 - width: layoutType === 2 ? partWidth * 0.75 : partWidth - height: partHeight + Item { + // Otherwise it takes up too much space while loading + visible: compactWeatherIcon.text.length > 0 - horizontalAlignment: layoutType === 1 ? Text.AlignHCenter : Text.AlignRight - verticalAlignment: layoutType === 2 ? Text.AlignBottom : Text.AlignVCenter + Layout.alignment: Qt.AlignCenter - text: temperatureStr + Layout.fillWidth: iconAndText.vertical + Layout.fillHeight: !iconAndText.vertical + Layout.minimumWidth: iconAndText.vertical ? 0 : sizehelperIcon.paintedWidth + Layout.maximumWidth: iconAndText.vertical ? Infinity : Layout.minimumWidth - font.family: plasmoid.configuration.widgetFontName === "" ? (theme.defaultFont) : plasmoid.configuration.widgetFontName - font.pixelSize: layoutType === 2 ? widgetFontSize * 0.7 : widgetFontSize - font.pointSize: -1 - fontSizeMode: ((! vertical) && (layoutType === 1)) ? Text.VerticalFit : Text.HorizontalFit - } + Layout.minimumHeight: iconAndText.vertical ? sizehelperIcon.paintedHeight : 0 + Layout.maximumHeight: iconAndText.vertical ? Layout.minimumHeight : Infinity - DropShadow { - anchors.fill: temperatureText - radius: 3 - samples: 16 - spread: 0.8 - fast: true - color: theme.backgroundColor - source: temperatureText - visible: layoutType === 2 - } + Text { + id: sizehelperIcon - PlasmaComponents.BusyIndicator { - id: busyIndicator - anchors.fill: parent - visible: false - running: false - } + font { + family: compactWeatherIcon.font.family + weight: compactWeatherIcon.font.weight + italic: compactWeatherIcon.font.italic + pixelSize: (main.onDesktop) ? Math.max(Kirigami.Units.gridUnit, widgetFontSize) : Math.min(Kirigami.Units.gridUnit, widgetFontSize) // random "big enough" size - this is used as a max pixelSize by the fontSizeMode + } + minimumPixelSize: Math.round(Kirigami.Units.gridUnit / 2) + fontSizeMode: main.onDesktop ? Text.Text.FixedSize : iconAndText.vertical ? Text.HorizontalFit : Text.VerticalFit + wrapMode: Text.NoWrap + + horizontalAlignment: Text.AlignHCenter + verticalAlignment: Text.AlignVCenter + anchors { + leftMargin: Kirigami.Units.smallSpacing + rightMargin: Kirigami.Units.smallSpacing + } + // These magic values are taken from the digital clock, so that the + // text sizes here are identical with various clock text sizes + height: { + const textHeightScaleFactor = (parent.height > 26) ? 0.7 : 0.9; + return Math.min (parent.height * textHeightScaleFactor, 3 * Kirigami.Theme.defaultFont.pixelSize); + } + visible: false - states: [ - State { - name: 'loading' - when: loadingData + // pattern to reserve some constant space TODO: improve and take formatting/i18n into account + text: "XXX" + } - PropertyChanges { - target: busyIndicator - visible: true - running: true - } + PlasmaComponents.Label { + id: compactWeatherIcon - PropertyChanges { - target: compactItem - opacity: 0.5 + font { + weight: Font.Normal + family: 'weathericons' + pixelSize: widgetFontSize + pointSize: 0 // we need to unset pointSize otherwise it breaks the Text.Fit size mode + } + minimumPixelSize: Math.round(Kirigami.Units.gridUnit / 2) + fontSizeMode: Text.Fit + wrapMode: Text.NoWrap + + height: 0 + width: 0 + verticalAlignment: Text.AlignVCenter + horizontalAlignment: Text.AlignHCenter + text: iconNameStr + anchors { + fill: parent + //leftMargin: Kirigami.Units.smallSpacing + //rightMargin: Kirigami.Units.smallSpacing } } - ] + } } + diff --git a/package/contents/ui/CompactItemCompact.qml b/package/contents/ui/CompactItemCompact.qml new file mode 100644 index 0000000..66d477d --- /dev/null +++ b/package/contents/ui/CompactItemCompact.qml @@ -0,0 +1,158 @@ +/* + * Copyright 2015 Martin Kotelnik + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +import QtQuick +import QtQuick.Layouts +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.core 2.0 as PlasmaCore +import Qt5Compat.GraphicalEffects +import org.kde.kirigami as Kirigami +import org.kde.plasma.plasmoid +import "../code/icons.js" as IconTools +import "../code/unit-utils.js" as UnitUtils + +Item +{ + id: compactItemCompact + + anchors.fill: parent + + property int layoutType: main.layoutType + + property int widgetFontSize: plasmoid.configuration.widgetFontSize + property string widgetFontName: (plasmoid.configuration.widgetFontName === "") ? Kirigami.Theme.defaultFont : plasmoid.configuration.widgetFontName + + property string iconNameStr: main.iconNameStr.length > 0 ? main.iconNameStr : "\uf07b" + property string temperatureStr: main.temperatureStr.length > 0 ? main.temperatureStr : "--" + + onWidgetFontSizeChanged: { + compactWeatherIcon.font.pixelSize = widgetFontSize + temperatureText.font.pixelSize = widgetFontSize + } + onWidgetFontNameChanged: { + temperatureText.font.family = widgetFontName + } + + function reLayout() { + let iconScale = (main.inPanel) ? 0.9 : 0.75 + let temperatureScale = ((main.vertical && layoutType === 0)||(! main.vertical && layoutType === 1) || (main.onDesktop)) ? 0.5 : 0.8 + temperatureText.anchors.left = [compactItemCompact.left, compactItemCompact.left, undefined][layoutType] + temperatureText.anchors.right = [undefined, compactItemCompact.right, compactItemCompact.right][layoutType] + temperatureText.anchors.top = [compactItemCompact.top, compactItemCompact.top, undefined][layoutType] + temperatureText.anchors.bottom = [compactItemCompact.bottom, undefined, compactItemCompact.bottom][layoutType] + temperatureText.width = [parent.width * temperatureScale, parent.width, parent.width * 0.6][layoutType] + temperatureText.height = [parent.height , parent.height * temperatureScale, parent.height * 0.6][layoutType] + temperatureText.horizontalAlignment = [Text.AlignRight, Text.AlignHCenter, Text.AlignHCenter][layoutType] + temperatureText.verticalAlignment = [Text.AlignVCenter, Text.AlignVCenter, Text.AlignBottom][layoutType] + temperatureText.fontSizeMode = (main.onDesktop) ? Text.FixedSize : Text.Fit + + compactWeatherIcon.anchors.left = [temperatureText.right, compactItemCompact.left, compactItemCompact.left][layoutType] + compactWeatherIcon.anchors.right = [undefined, compactItemCompact.right, undefined][layoutType] + compactWeatherIcon.anchors.top = [compactItemCompact.top, undefined, compactItemCompact.top][layoutType] + compactWeatherIcon.anchors.bottom = [compactItemCompact.bottom , compactItemCompact.bottom, compactItemCompact.bottom][layoutType] + compactWeatherIcon.width = [parent.width * temperatureScale, parent.width, parent.width * iconScale][layoutType] + compactWeatherIcon.height = [parent.height, parent.height * temperatureScale, parent.height * iconScale][layoutType] + compactWeatherIcon.horizontalAlignment = [Text.AlignLeft, Text.AlignHCenter, Text.AlignLeft][layoutType] + compactWeatherIcon.verticalAlignment = [Text.AlignVCenter, Text.AlignVCenter, Text.AlignTop][layoutType] + compactWeatherIcon.fontSizeMode = (main.onDesktop) ? Text.FixedSize : Text.Fit + } + + + Component.onCompleted: { + if (main.inTray) + layoutType = 2 + layoutTimer2.start() + } + + onLayoutTypeChanged: { + reLayout() + } + + PlasmaComponents.Label { + id: compactWeatherIcon + // Rectangle { + // anchors.fill: parent + // opacity: 0.5 + // color: "yellow" + // } + + font.family: 'weathericons' + font.pixelSize: widgetFontSize + text: iconNameStr + opacity: layoutType === 2 ? 0.8 : 1 + // font.pointSize: -1 + + } + + PlasmaComponents.Label { + id: temperatureText + // Rectangle { + // anchors.fill: parent + // opacity: 0.5 + // color: "blue" + // } + + text: temperatureStr + font.family: widgetFontName + font.pixelSize: widgetFontSize + // font.pointSize: -1 + } + + DropShadow { + anchors.fill: temperatureText + radius: 3 + samples: 16 + spread: 0.8 + fast: true + color: Kirigami.Theme.backgroundColor + source: temperatureText + visible: layoutType === 2 + } + + PlasmaComponents.BusyIndicator { + id: busyIndicator + anchors.fill: parent + visible: false + running: false + + states: [ + State { + name: 'loading' + when: !loadingDataComplete + + PropertyChanges { + target: busyIndicator + visible: true + running: true + } + + PropertyChanges { + target: compactItemCompact + opacity: 0.5 + } + } + ] + } + Timer { + id: layoutTimer2 + interval: 200 + running: false + repeat: false + onTriggered: { + reLayout() + } + } +} diff --git a/package/contents/ui/CompactRepresentation.qml b/package/contents/ui/CompactRepresentation.qml index 1d545c0..5ea60b4 100644 --- a/package/contents/ui/CompactRepresentation.qml +++ b/package/contents/ui/CompactRepresentation.qml @@ -8,61 +8,103 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTIAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import QtQuick 2.2 -import QtQuick.Layouts 1.1 -import QtGraphicalEffects 1.0 -import org.kde.plasma.plasmoid 2.0 +import QtQuick +import org.kde.plasma.components 3.0 as PlasmaComponents import org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.plasma.components 2.0 as PlasmaComponents +import QtQuick.Layouts +import org.kde.plasma.plasmoid +import Qt5Compat.GraphicalEffects +import org.kde.kirigami as Kirigami -Item { + +Loader { id: compactRepresentation anchors.fill: parent + readonly property bool vertical: (Plasmoid.formFactor == PlasmaCore.Types.Vertical) + + property bool showLastReloadedTime: plasmoid.configuration.showLastReloadedTime + + property int layoutType: main.layoutType + property int defaultWidgetSize: -1 + + sourceComponent: !(layoutType === 2) ? compactItem : compactItemCompact + + Layout.fillWidth: compactRepresentation.vertical + Layout.fillHeight: !compactRepresentation.vertical + Layout.minimumWidth: item.Layout.minimumWidth + Layout.minimumHeight: item.Layout.minimumHeight + - CompactItem { + Component { id: compactItem - inTray: false + CompactItem { + vertical: compactRepresentation.vertical + } } - property bool isCompactLayout: main.layoutType === 2 ? true : false - // Layout.preferredWidth: ((! isCompactLayout ) && (plasmoid.formFactor === PlasmaCore.Types.Horizontal)) ? compactItem.height * 2 : compactItem.height - // Layout.preferredHeight: ((! isCompactLayout ) && (plasmoid.formFactor === PlasmaCore.Types.Vertical)) ? parent.width * 2 : parent.width - property double partHeight: compactItem.widgetHeight + Component { + id: compactItemCompact + CompactItemCompact { + } + } PlasmaComponents.Label { id: lastReloadedNotifier - anchors.left: parent.left anchors.bottom: parent.bottom - anchors.bottomMargin: - partHeight * 0.05 + anchors.bottomMargin: - defaultWidgetSize * 0.05 verticalAlignment: Text.AlignBottom width: parent.width fontSizeMode: Text.Fit - - font.pixelSize: partHeight * 0.26 * (layoutType === 0 ? 1 : 0.7) font.pointSize: -1 - color: theme.highlightColor - + minimumPixelSize: 1 + color: Kirigami.Theme.highlightColor text: lastReloadedText - wrapMode: Text.WordWrap + elide: Text.ElideRight visible: false } + + PlasmaComponents.BusyIndicator { + id: busyIndicator + anchors.fill: parent + visible: false + running: false + + states: [ + State { + name: 'loading' + when: !loadingDataComplete + + PropertyChanges { + target: busyIndicator + visible: true + running: true + } + + PropertyChanges { + target: compactItem + //opacity: 0.5 + } + } + ] + } + DropShadow { anchors.fill: lastReloadedNotifier radius: 3 samples: 16 spread: 0.8 fast: true - color: theme.backgroundColor + color: Kirigami.Theme.backgroundColor source: lastReloadedNotifier visible: (lastReloadedText.visible === true) } @@ -76,19 +118,29 @@ Item { hoverEnabled: true onEntered: { - lastReloadedNotifier.visible = !plasmoid.expanded + if (showLastReloadedTime) + { + lastReloadedNotifier.visible = !plasmoid.expanded + } } onExited: { - lastReloadedNotifier.visible = false + if (showLastReloadedTime) + { + lastReloadedNotifier.visible = false + } } - onClicked: { - if (mouse.button == Qt.MiddleButton) { - main.reloadData() + onClicked: (mouse)=> { + if (mouse.button === Qt.MiddleButton) { + loadingData.failedAttemptCount = 0 + main.loadDataFromInternet() } else { - plasmoid.expanded = !plasmoid.expanded - lastReloadedNotifier.visible = !plasmoid.expanded + main.expanded = !main.expanded + if (showLastReloadedTime) + { + lastReloadedNotifier.visible = !main.expanded + } } } @@ -97,11 +149,16 @@ Item { anchors.fill: parent active: !plasmoid.expanded interactive: true - mainText: placeAlias - subText: tooltipSubText + mainText: main.currentPlace.alias + subText: main.toolTipSubText textFormat: Text.RichText icon: Qt.resolvedUrl('../images/weather-widget.svg') } } + Component.onCompleted: { + if ((defaultWidgetSize === -1) && (compactRepresentation.width > 0 || compactRepresentation.height)) { + defaultWidgetSize = Math.min(compactRepresentation.width, compactRepresentation.height) + } + } } diff --git a/package/contents/ui/CompactRepresentationInTray.qml b/package/contents/ui/CompactRepresentationInTray.qml index 95a72e0..648305c 100644 --- a/package/contents/ui/CompactRepresentationInTray.qml +++ b/package/contents/ui/CompactRepresentationInTray.qml @@ -14,22 +14,53 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import QtQuick 2.2 +import QtQuick import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.core 2.0 as PlasmaCore + +Loader { + id: compactRepresentation -Item { - id: compactRepresentationInTray - anchors.fill: parent - - CompactItem { - id: compactItem - inTray: true + + property int defaultWidgetSize: -1 + + sourceComponent: compactItemCompact + + CompactItemCompact { + id: compactItemCompact + } + + MouseArea { + anchors.fill: parent + + hoverEnabled: true + + onClicked: { + dbgprint("CompactRepresentationInTray") + let t = main.expanded + if (t) { + dbgprint("Closing FullRepresentationInTray") + } else { + dbgprint("Opening FullRepresentationInTray") + + } + main.expanded = ! main.expanded + } + } + Component.onCompleted: { + if (main.inTray) + layoutTimer1.start() + } + Timer { + id: layoutTimer1 + interval: 100 + running: false + repeat: false + onTriggered: { + if ((defaultWidgetSize === -1) && ( compactRepresentation.width > 0 || compactRepresentation.height)) { + defaultWidgetSize = Math.min(compactRepresentation.width, compactRepresentation.height) + } + } } - - Plasmoid.toolTipMainText: placeAlias - Plasmoid.toolTipSubText: tooltipSubText - Plasmoid.toolTipTextFormat: Text.RichText - Plasmoid.icon: Qt.resolvedUrl('../images/weather-widget.svg') - } diff --git a/package/contents/ui/FullRepresentation.qml b/package/contents/ui/FullRepresentation.qml index 3f81f62..4d75cea 100644 --- a/package/contents/ui/FullRepresentation.qml +++ b/package/contents/ui/FullRepresentation.qml @@ -8,25 +8,26 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTIAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import QtQuick 2.5 -import QtQuick.Window 2.5 -import org.kde.plasma.plasmoid 2.0 -import org.kde.plasma.components 2.0 as PlasmaComponents -import org.kde.plasma.core 2.0 as PlasmaCore +import QtQuick 2.15 +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.core as PlasmaCore +import org.kde.kirigami as Kirigami +import org.kde.plasma.plasma5support as Plasma5Support +import QtQuick.Layouts Item { id: fullRepresentation - property int imageWidth: 800 * Screen.devicePixelRatio // Makes yr.no images grainy, - property int imageHeight: 320 * Screen.devicePixelRatio + defaultFontPixelSize// prefer rendering meteograms + property int imageWidth: 800 + property int imageHeight: 320 + defaultFontPixelSize - property double defaultFontPixelSize: theme.defaultFont.pixelSize + property double defaultFontPixelSize: Kirigami.Theme.defaultFont.pixelSize property double footerHeight: defaultFontPixelSize property int nextDayItemSpacing: defaultFontPixelSize * 0.5 @@ -36,11 +37,40 @@ Item { property double nextDayItemWidth: (imageWidth / nextDaysCount) - nextDayItemSpacing - hourLegendMargin / nextDaysCount property int headingHeight: defaultFontPixelSize * 2 property double hourLegendBottomMargin: defaultFontPixelSize * 0.2 + property string fullRepresentationAlias: main.fullRepresentationAlias implicitWidth: imageWidth implicitHeight: headingHeight + imageHeight + footerHeight + nextDaysHeight + 14 - + Layout.minimumWidth: imageWidth + Layout.minimumHeight: headingHeight + imageHeight + footerHeight + nextDaysHeight + 14 + Layout.preferredWidth: imageWidth + Layout.preferredHeight: headingHeight + imageHeight + footerHeight + nextDaysHeight + 14 + + onFullRepresentationAliasChanged: { + + // for(const [key,value] of Object.entries(currentPlace)) { console.log(` ${key}: ${value}`) } + var t = main.fullRepresentationAlias + + switch (main.timezoneType) { + case 0: + t += " (" + getLocalTimeZone()+ ")" + break + case 1: + t += " (" + i18n("UTC") + ")" + break + case 2: + if (main.currentPlace.timezoneShortName === "") { + main.currentPlace.timezoneShortName = "unknown" + } + t += " (" + main.currentPlace.timezoneShortName + ")" + break + default: + t += " (" + "TBA" + ")" + break + } + currentLocationText.text = t + } PlasmaComponents.Label { id: currentLocationText @@ -49,26 +79,12 @@ Item { anchors.top: parent.top verticalAlignment: Text.AlignTop - text: { - var t = main.placeAlias - switch (timezoneType) { - case 0: - t += " (" + getLocalTimeZone()+ ")" - break - case 1: - t += " (" + i18n("UTC") + ")" - break - case 2: - if (main.timezoneShortName === "") { - main.timezoneShortName = "unknown" - } - t += " (" + main.timezoneShortName + ")" - break - default: - t += " (" + "TBA" + ")" - break - } - return t + text: "" + Component.onCompleted: { + dbgprint2("FullRepresentation") + dbgprint((main.currentPlace.alias)) + dbgprint2(currentLocationText.text) + nextDaysCount = nextDaysModel.count } } @@ -78,16 +94,17 @@ Item { anchors.right: parent.right anchors.top: parent.top verticalAlignment: Text.AlignTop - visible: !onlyOnePlace - color: theme.textColor + visible: (placesCount > 1) + color: Kirigami.Theme.textColor text: i18n("Next Location") + " >>" } MouseArea { - cursorShape: Qt.PointingHandCursor + cursorShape: (nextLocationText.visible) ? Qt.PointingHandCursor : Qt.ArrowCursor anchors.fill: nextLocationText - hoverEnabled: true + hoverEnabled: nextLocationText.visible + enabled: nextLocationText.visible onClicked: { dbgprint('clicked next location') @@ -110,16 +127,17 @@ Item { anchors.top: nextLocationText.top anchors.rightMargin: 15 verticalAlignment: Text.AlignTop - visible: !onlyOnePlace - color: theme.textColor + visible: (placesCount > 1) + color: Kirigami.Theme.textColor text: "<< " + i18n("Previous Location") } MouseArea { - cursorShape: Qt.PointingHandCursor + cursorShape: (prevLocationText.visible) ? Qt.PointingHandCursor : Qt.ArrowCursor anchors.fill: prevLocationText - hoverEnabled: true + hoverEnabled: prevLocationText.visible + enabled: prevLocationText.visible onClicked: { dbgprint('clicked previous location') @@ -141,12 +159,8 @@ Item { anchors.topMargin: headingHeight width: imageWidth height: imageHeight - } - /* - * - * NEXT DAYS - * - */ + } + ListView { id: nextDaysView anchors.bottom: parent.bottom @@ -171,13 +185,13 @@ Item { id: hourLegend anchors.bottom: parent.bottom anchors.bottomMargin: footerHeight + nextDaysVerticalMargin - spacing: 1 * Screen.devicePixelRatio + spacing: 1 width: hourLegendMargin height: nextDaysHeight - defaultFontPixelSize PlasmaComponents.Label { - text: twelveHourClockEnabled ? '3AM' : '3h' + text: twelveHourClockEnabled ? '3AM' : '3:00' width: parent.width height: parent.height / 4 font.pixelSize: defaultFontPixelSize * 0.8 @@ -186,7 +200,7 @@ Item { opacity: 0.6 } PlasmaComponents.Label { - text: twelveHourClockEnabled ? '9AM' : '9h' + text: twelveHourClockEnabled ? '9AM' : '9:00' width: parent.width height: parent.height / 4 font.pixelSize: defaultFontPixelSize * 0.8 @@ -195,7 +209,7 @@ Item { opacity: 0.6 } PlasmaComponents.Label { - text: twelveHourClockEnabled ? '3PM' : '15h' + text: twelveHourClockEnabled ? '3PM' : '15:00' width: parent.width height: parent.height / 4 font.pixelSize: defaultFontPixelSize * 0.8 @@ -204,7 +218,7 @@ Item { opacity: 0.6 } PlasmaComponents.Label { - text: twelveHourClockEnabled ? '9PM' : '21h' + text: twelveHourClockEnabled ? '9PM' : '21:00' width: parent.width height: parent.height / 4 font.pixelSize: defaultFontPixelSize * 0.8 @@ -220,6 +234,7 @@ Item { * FOOTER * */ + MouseArea { anchors.left: parent.left anchors.bottom: parent.bottom @@ -260,11 +275,10 @@ Item { } onClicked: { - main.reloadData() + main.loadDataFromInternet() } } - PlasmaComponents.Label { id: creditText @@ -272,7 +286,7 @@ Item { anchors.bottom: parent.bottom verticalAlignment: Text.AlignBottom - text: creditLabel + text: currentPlace.creditLabel } MouseArea { @@ -282,8 +296,8 @@ Item { hoverEnabled: true onClicked: { - dbgprint('opening: ', creditLink) - Qt.openUrlExternally(creditLink) + dbgprint('opening: ', currentPlace.creditLink) + Qt.openUrlExternally(currentPlace.creditLink) } onEntered: { diff --git a/package/contents/ui/FullRepresentationInTray.qml b/package/contents/ui/FullRepresentationInTray.qml index 6835900..b1de067 100644 --- a/package/contents/ui/FullRepresentationInTray.qml +++ b/package/contents/ui/FullRepresentationInTray.qml @@ -14,87 +14,93 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import QtQuick 2.5 -import QtQuick.Window 2.5 -import org.kde.plasma.plasmoid 2.0 -import QtQuick.Layouts 1.1 -import QtGraphicalEffects 1.0 -import QtQuick.Controls 1.0 -import org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.plasma.components 2.0 as PlasmaComponents +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.ksvg as KSvg +import org.kde.kirigami as Kirigami Item { id: fullRepresentation - width: parent.width + property double defaultFontPixelSize: Kirigami.Theme.defaultFont.pixelSize - property double defaultFontPixelSize: theme.defaultFont.pixelSize - property double footerHeight: defaultFontPixelSize * 3.5 + Layout.minimumWidth: main.switchWidth + Layout.minimumHeight: headingHeight + (nextDayHeight * 5) + footerHeight - property int nextDaysSpacing: 5 * Screen.devicePixelRatio - property int nextDayHeight: defaultFontPixelSize * 4.9 - property int headingHeight: defaultFontPixelSize * 3 - property int nextDayItemSpacing: defaultFontPixelSize * 0.7 + Layout.preferredWidth: defaultFontPixelSize * 30 + Layout.preferredHeight: headingHeight + (nextDayHeight * 5) + footerHeight + + property int headingHeight: defaultFontPixelSize * 2 + property double footerHeight: defaultFontPixelSize * 3 + + property int nextDaysSpacing: defaultFontPixelSize + property int nextDayHeight: defaultFontPixelSize * 4 + property int nextDayItemSpacing: defaultFontPixelSize property double headingTopMargin: defaultFontPixelSize - property color lineColor: theme.textColor + property color lineColor: Kirigami.Theme.textColor + PlasmaComponents.Label { id: currentLocationText + text: main.currentPlace.alias - anchors.left: parent.left anchors.top: parent.top + anchors.left: parent.left + + height: headingHeight + width: parent.width / 2 - text: main.placeAlias + color: Kirigami.Theme.textColor + + verticalAlignment: Text.AlignTop } PlasmaComponents.Label { id: nextLocationText + text: i18n("Next Location") - anchors.right: parent.right anchors.top: parent.top - visible: !onlyOnePlace + anchors.right: parent.right - text: i18n("Next Location") - color: theme.textColor - } + height: headingHeight + width: parent.width / 2 - MouseArea { - cursorShape: Qt.PointingHandCursor - anchors.fill: nextLocationText + visible: (placesCount > 1) - hoverEnabled: true + color: Kirigami.Theme.textColor - onClicked: { - dbgprint('clicked next location') - main.setNextPlace() - } + horizontalAlignment:Text.AlignRight + verticalAlignment: Text.AlignTop - onEntered: { - nextLocationText.font.underline = true - } + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + + hoverEnabled: true - onExited: { - nextLocationText.font.underline = false + onClicked: { + main.setNextPlace() + } + onEntered: { + nextLocationText.font.underline = true + } + onExited: { + nextLocationText.font.underline = false + } } } - - - /* - * - * NEXT DAYS - * - */ ScrollView { id: nextDays - anchors.top: parent.top - anchors.topMargin: headingHeight - anchors.bottom: parent.bottom - anchors.bottomMargin: footerHeight + anchors.top: currentLocationText.bottom + anchors.bottom: frFooter.top + anchors.bottomMargin: defaultFontPixelSize / 2 width: parent.width @@ -102,27 +108,25 @@ Item { id: nextDaysView anchors.fill: parent - width: parent.width - height: parent.height - model: nextDaysModel + orientation: Qt.Vertical spacing: nextDayItemSpacing interactive: false delegate: Item { - width: nextDaysView.width - height: nextDayHeight + width: nextDaysView.width - 50 + height: (defaultFontPixelSize * 3.6) property string svgLineName: 'horizontal-line' - PlasmaCore.SvgItem { - id: dayTitleLine + KSvg.SvgItem { + anchors.top: dayTitleText.top width: parent.width height: lineSvg.elementSize(svgLineName).height elementId: svgLineName - svg: PlasmaCore.Svg { + svg: KSvg.Svg { id: lineSvg imagePath: 'widgets/line' } @@ -130,186 +134,185 @@ Item { PlasmaComponents.Label { id: dayTitleText - - anchors.top: dayTitleLine.bottom - anchors.topMargin: units.smallSpacing * 0.5 + anchors.topMargin: Kirigami.Units.smallSpacing * 0.5 verticalAlignment: Text.AlignTop - text: dayTitle + font.pixelSize: defaultFontPixelSize * 1.5 + font.bold: true } - - - /* - * - * four item data - * - */ - property double periodMargin: defaultFontPixelSize * 1.5 - property double periodItemWidth: (width - periodMargin * 4) / 4 - property double periodItemHeight: nextDayHeight - headingTopMargin - property double periodFontSize: periodItemHeight * 0.45 + property double periodMargin: defaultFontPixelSize * 0.5 + property double periodItemWidth: (nextDaysView.width - 10 - (periodMargin * 4)) / 4 + property double periodItemHeight: defaultFontPixelSize * 2 Item { - anchors.top: parent.top - anchors.topMargin: headingTopMargin - + anchors.top: dayTitleText.bottom height: periodItemHeight NextDayPeriodItem { id: period1 + width: periodItemWidth height: parent.height + temperature: temperature0 iconName: iconName0 hidden: hidden0 - past: isPast0 - partOfDay: 1 - pixelFontSize: periodFontSize + partOfDay: partOfDay0 + pixelFontSize: defaultFontPixelSize * 1.5 } NextDayPeriodItem { id: period2 + + anchors.left: period1.right + anchors.leftMargin: periodMargin + width: periodItemWidth height: parent.height + temperature: temperature1 iconName: iconName1 hidden: hidden1 - past: isPast1 - partOfDay: 0 - pixelFontSize: periodFontSize - - anchors.left: period1.right - anchors.leftMargin: periodMargin + partOfDay: partOfDay1 + pixelFontSize: defaultFontPixelSize * 1.5 } NextDayPeriodItem { id: period3 + + anchors.left: period2.right + anchors.leftMargin: periodMargin + width: periodItemWidth height: parent.height + temperature: temperature2 iconName: iconName2 hidden: hidden2 - past: isPast2 - partOfDay: 0 - pixelFontSize: periodFontSize - - anchors.left: period2.right - anchors.leftMargin: periodMargin + partOfDay: partOfDay3 + pixelFontSize: defaultFontPixelSize * 1.5 } NextDayPeriodItem { id: period4 + + anchors.left: period3.right + anchors.leftMargin: periodMargin + width: periodItemWidth height: parent.height + temperature: temperature3 iconName: iconName3 hidden: hidden3 - past: isPast3 - partOfDay: 1 - pixelFontSize: periodFontSize - - anchors.left: period3.right - anchors.leftMargin: periodMargin + partOfDay: partOfDay3 + pixelFontSize: defaultFontPixelSize * 1.5 } } - } } } + Rectangle { + id: frFooter + anchors.bottom: fullRepresentation.bottom + anchors.left: fullRepresentation.left + anchors.right: fullRepresentation.right + height: footerHeight + color: Kirigami.Theme.backgroundColor - /* - * - * FOOTER - * - */ - MouseArea { - id: reloadMouseArea + MouseArea { + id: lastReloadArea + cursorShape: Qt.PointingHandCursor - anchors.top: nextDays.bottom - anchors.left: parent.left - anchors.bottom: parent.bottom - anchors.topMargin: units.smallSpacing + anchors.bottom: parent.bottom + anchors.left: parent.left - width: lastReloadedTextComponent.contentWidth - height: lastReloadedTextComponent.contentHeight + height: footerHeight + width: parent.width * 0.25 - hoverEnabled: true - cursorShape: Qt.PointingHandCursor + hoverEnabled: true - PlasmaComponents.Label { - id: lastReloadedTextComponent - anchors.fill: parent + PlasmaComponents.Label { + id: lastReloadedTextComponent - verticalAlignment: Text.AlignTop + anchors.fill: parent - text: lastReloadedText - } + text: main.lastReloadedText - PlasmaComponents.Label { - id: reloadTextComponent - anchors.fill: parent + color: Kirigami.Theme.textColor + elide: Text.ElideRight + maximumLineCount: 3 + verticalAlignment: Text.AlignBottom + wrapMode: Text.WordWrap + } - verticalAlignment: Text.AlignTop + PlasmaComponents.Label { + id: reloadTextComponent - text: '\u21bb '+ i18n("Reload") - visible: false - } + anchors.fill: parent - onEntered: { - lastReloadedTextComponent.visible = false - reloadTextComponent.visible = true - } + text: '\u21bb '+ i18n("Reload") - onExited: { - lastReloadedTextComponent.visible = true - reloadTextComponent.visible = false - } + verticalAlignment: Text.AlignBottom + visible: false + } - onClicked: { - main.reloadData() + onClicked: { + main.loadDataFromInternet() + } + onEntered: { + lastReloadedTextComponent.visible = false + reloadTextComponent.visible = true + } + onExited: { + lastReloadedTextComponent.visible = true + reloadTextComponent.visible = false + } } - } + MouseArea { + // id: frFooter - PlasmaComponents.Label { - id: creditText + cursorShape: Qt.PointingHandCursor + anchors.top: parent.top + anchors.bottom: parent.bottom + anchors.right: parent.right + anchors.left: lastReloadArea.right - anchors.top: nextDays.bottom - anchors.right: parent.right - anchors.bottom: parent.bottom - anchors.left: reloadMouseArea.right - anchors.topMargin: units.smallSpacing - anchors.leftMargin: units.largeSpacing - - text: creditLabel - wrapMode: Text.WordWrap - maximumLineCount: 3 - elide: Text.ElideRight - } + hoverEnabled: true - MouseArea { - cursorShape: Qt.PointingHandCursor - anchors.fill: creditText + PlasmaComponents.Label { + id: creditText + anchors.fill: parent - hoverEnabled: true + text: main.currentPlace.creditLabel - onClicked: { - dbgprint('opening: ', creditLink) - Qt.openUrlExternally(creditLink) - } + color: Kirigami.Theme.textColor + font: Kirigami.Theme.smallFont - onEntered: { - creditText.font.underline = true - } + elide: Text.ElideRight + horizontalAlignment: Text.AlignRight + verticalAlignment: Text.AlignBottom + maximumLineCount: 3 + wrapMode: Text.WordWrap + + } - onExited: { - creditText.font.underline = false + onClicked: { + Qt.openUrlExternally(main.currentPlace.creditLink) + } + onEntered: { + creditText.font.underline = true + } + onExited: { + creditText.font.underline = false + } } - } + } } diff --git a/package/contents/ui/Meteogram.qml b/package/contents/ui/Meteogram.qml index 3793efc..7f7d193 100644 --- a/package/contents/ui/Meteogram.qml +++ b/package/contents/ui/Meteogram.qml @@ -14,12 +14,13 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import QtQuick 2.5 -import QtQuick.Window 2.5 -import QtQml.Models 2.5 -import org.kde.plasma.core 2.0 as PlasmaCore -import org.kde.plasma.components 2.0 as PlasmaComponents -import QtQuick.Controls 2.5 +import QtQuick 2.15 +import QtQuick.Window +import QtQml.Models +import org.kde.plasma.core as PlasmaCore +import org.kde.plasma.components 3.0 as PlasmaComponents +import QtQuick.Controls +import org.kde.kirigami as Kirigami import "../code/unit-utils.js" as UnitUtils import "../code/icons.js" as IconTools @@ -28,8 +29,8 @@ Item { width: imageWidth height: imageHeight + labelHeight// Day Label + Time Label - property int imageWidth: 800 * Screen.devicePixelRatio - (labelWidth * 2) - property int imageHeight: 320 * Screen.devicePixelRatio - labelHeight - cloudarea - windarea + property int imageWidth: 800 - (labelWidth * 2) + property int imageHeight: 320 - labelHeight - cloudarea - windarea property int labelWidth: textMetrics.width property int labelHeight: textMetrics.height @@ -38,7 +39,6 @@ Item { property bool meteogramModelChanged: main.meteogramModelChanged - property int temperatureYGridCount: 21 // Number of vertical grid Temperature elements property double temperatureIncrementDegrees: 0 // Major Step - How much each Temperature grid element rises by in Degrees property double temperatureIncrementPixels: imageHeight / (temperatureYGridCount - 1) // Major Step - How much each Temperature grid element rises by in Pixels @@ -52,31 +52,23 @@ Item { property int dataArraySize: 2 - - property bool textColorLight: ((theme.textColor.r + theme.textColor.g + theme.textColor.b) / 3) > 0.5 - property color gridColor: textColorLight ? Qt.tint(theme.textColor, '#80000000') : Qt.tint(theme.textColor, '#80FFFFFF') - property color gridColorHighlight: textColorLight ? Qt.tint(theme.textColor, '#50000000') : Qt.tint(theme.textColor, '#50FFFFFF') + property bool textColorLight: ((Kirigami.Theme.textColor.r + Kirigami.Theme.textColor.g + Kirigami.Theme.textColor.b) / 3) > 0.5 + property color gridColor: textColorLight ? Qt.tint(Kirigami.Theme.textColor, '#80000000') : Qt.tint(Kirigami.Theme.textColor, '#80FFFFFF') + property color gridColorHighlight: textColorLight ? Qt.tint(Kirigami.Theme.textColor, '#50000000') : Qt.tint(Kirigami.Theme.textColor, '#50FFFFFF') property color pressureColor: textColorLight ? Qt.rgba(0.3, 1, 0.3, 1) : Qt.rgba(0.0, 0.6, 0.0, 1) property color temperatureWarmColor: textColorLight ? Qt.rgba(1, 0.3, 0.3, 1) : Qt.rgba(1, 0.0, 0.0, 1) property color temperatureColdColor: textColorLight ? Qt.rgba(0.2, 0.7, 1, 1) : Qt.rgba(0.1, 0.5, 1, 1) property color rainColor: textColorLight ? Qt.rgba(0.33, 0.66, 1, 1) : Qt.rgba(0, 0.33, 1, 1) - property int precipitationFontPixelSize: 8 * Screen.devicePixelRatio - property int precipitationHeightMultiplier: 15 * Screen.devicePixelRatio - property int precipitationLabelMargin: 8 * Screen.devicePixelRatio + property int precipitationFontPixelSize: 8 + property int precipitationHeightMultiplier: 15 + property int precipitationLabelMargin: 8 -/* - property int temperatureType: 0 - property int pressureType: 0 - property int timezoneType: 0 - property bool twelveHourClockEnabled: false - property int windSpeedType: 0 -*/ property double sampleWidth: imageWidth / (meteogramModel.count - 1) onMeteogramModelChangedChanged: { - dbgprint('meteogram changed') + dbgprint2('METEOGRAM changed') buildMetogramData() processMeteogramData() buildCurves() @@ -95,14 +87,11 @@ Item { ListModel { id: nextDaysModel } -// ListModel { -// id: meteogramModel -// } TextMetrics { id: textMetrics - font.family: theme.defaultFont.family - font.pixelSize: 11 * Screen.devicePixelRatio + font.family: Kirigami.Theme.defaultFont.family + font.pixelSize: 11 text: "999999" } @@ -123,24 +112,21 @@ Item { border.color:gridColor color: "transparent" } + ListView { id: horizontalLines1 model: verticalGridModel - anchors.left: graphArea.left - anchors.top: graphArea.top -// anchors.bottom: graphArea.bottom + labelHeight -// anchors.fill: graphArea - height: graphArea.height + labelHeight + anchors.fill: graphArea interactive: false delegate: Item { height: graphArea.height / (temperatureYGridCount - 1) - width: graphArea.width + width: imageWidth visible: num % 2 === 0 Rectangle { id: gridLine width: parent.width - height: 1 * Screen.devicePixelRatio + height: 1 color: gridColor } PlasmaComponents.Label { @@ -152,7 +138,7 @@ Item { anchors.top: gridLine.top anchors.leftMargin: -labelWidth - 2 anchors.topMargin: -labelHeight / 2 - font.pixelSize: 11 * Screen.devicePixelRatio + font.pixelSize: 11 font.pointSize: -1 } PlasmaComponents.Label { @@ -164,7 +150,7 @@ Item { anchors.left: gridLine.right anchors.leftMargin: 2 horizontalAlignment: Text.AlignLeft - font.pixelSize: 11 * Screen.devicePixelRatio + font.pixelSize: 11 font.pointSize: -1 color: pressureColor } @@ -177,12 +163,13 @@ Item { horizontalAlignment: (UnitUtils.getPressureEnding(pressureType).length > 4) ? Text.AlignRight : Text.AlignLeft anchors.right: (graphArea.right) anchors.rightMargin: -labelWidth - font.pixelSize: 11 * Screen.devicePixelRatio + font.pixelSize: 11 font.pointSize: -1 color: pressureColor anchors.bottom: graphArea.top anchors.bottomMargin: 6 } + ListView { id: hourGrid model: hourGridModel @@ -202,7 +189,6 @@ Item { property bool textVisible: hourVisible && index < hourGridModel.count-1 property int timePeriod: isDaytime ? 0 : 1 - property double precAvg: parseFloat(precipitationAvg) || 0 property double precMax: parseFloat(precipitationMax) || 0 @@ -211,8 +197,6 @@ Item { property string precAvgStr: precipitationFormat(precAvg) property string precMaxStr: precipitationFormat(precMax) - - Rectangle { id: verticalLine width: dayBegins ? 2 : 1 @@ -223,6 +207,7 @@ Item { anchors.top: parent.top } anchors.leftMargin: labelWidth + PlasmaComponents.Label { id: hourText text: hourFromStr @@ -232,19 +217,20 @@ Item { width: hourGrid.hourItemWidth anchors.top: verticalLine.bottom anchors.topMargin: 2 - // anchors.horizontalCenter: verticalLine.left +// anchors.horizontalCenter: verticalLine.left anchors.horizontalCenter: verticalLine.horizontalCenter - font.pixelSize: 11 * Screen.devicePixelRatio + font.pixelSize: 11 font.pointSize: -1 visible: textVisible } + PlasmaComponents.Label { text: hourFromEnding verticalAlignment: Text.AlignTop horizontalAlignment: Text.AlignLeft anchors.top: hourText.top anchors.left: hourText.right - font.pixelSize: 7 * Screen.devicePixelRatio + font.pixelSize: 7 font.pointSize: -1 visible: textVisible } @@ -254,7 +240,7 @@ Item { return rotation } function windStrength(windspeed,themecolor) { - var img = "images/" + var img = "../images/" img += (themecolor) ? "light" : "dark" img += Math.min(5,Math.trunc(windspeed / 5) + 1) return img @@ -266,6 +252,7 @@ Item { } return '' } + Item { id: windspeedAnchor width: parent.width @@ -297,6 +284,7 @@ Item { anchors.left: parent.left // visible: ((windDirection > 0) || (windSpeedMps > 0)) && (! textVisible) && (index > 0) && (index < hourGridModel.count-1) } + MouseArea { anchors.fill: parent hoverEnabled: true @@ -318,10 +306,11 @@ Item { anchors.topMargin: -labelHeight anchors.left: parent.left anchors.leftMargin: parent.width / 2 - font.pixelSize: 11 * Screen.devicePixelRatio + font.pixelSize: 11 font.pointSize: -1 visible: dayBegins && canShowDay } + Rectangle { id: precipitationMaxRect width: parent.width @@ -332,6 +321,7 @@ Item { anchors.bottomMargin: precipitationLabelMargin visible: index < (hourGridModel.count - 1) } + PlasmaComponents.Label { width: parent.width text: precMaxStr || precAvgStr @@ -343,6 +333,7 @@ Item { font.pointSize: -1 visible: precLabelVisible } + PlasmaComponents.Label { function localisePrecipitationUnit(unitText) { switch (unitText) { @@ -356,21 +347,19 @@ Item { return unitText } } + text: localisePrecipitationUnit(precipitationLabel) width: parent.width - // verticalAlignment: Text.AlignTop - // horizontalAlignment: Text.AlignHCenter anchors.left: verticalLine.left anchors.bottom: verticalLine.bottom - // anchors.bottom: verticalLine.bottom - anchors.bottomMargin: -precipitationLabelMargin - // anchors.horizontalCenter: precipitationMaxRect.horizontalCenter + anchors.bottomMargin: 0 font.pixelSize: precipitationFontPixelSize font.pointSize: -1 visible: precLabelVisible } + PlasmaComponents.Label { - font.pixelSize: 14 * Screen.devicePixelRatio + font.pixelSize: 14 font.pointSize: -1 width: parent.width anchors.top: parent.top @@ -379,56 +368,11 @@ Item { anchors.leftMargin: -8 z: 999 font.family: 'weathericons' - text: (differenceHours === 1 && textVisible) || index === hourGridModel.count-1 || index === 0 || iconName === '' ? '' : IconTools.getIconCode(iconName, currentProvider.providerId, timePeriod) + text: (differenceHours === 1 && textVisible) || index === hourGridModel.count-1 || index === 0 || iconName === '' ? '' : IconTools.getIconCode(iconName, currentPlace.providerId, timePeriod) visible: iconName != "\uf07b" Component.onCompleted: { -// console.log(temperatureYGridCount +" - " + "(" + temperature + " + " + temperatureIncrementDegrees + ") * " +temperatureIncrementPixels + " - " + font.pixelSize + " * 2.5") } } - /* - Item { - visible: canShowPrec -// anchors.fill: parent - anchors.bottom: verticalLine.bottom - - - - Rectangle { - id: precipitationAvgRect - width: parent.width - height: precAvg * precipitationHeightMultiplier - color: theme.highlightColor - anchors.left: parent.horizontalCenter - anchors.bottom: parent.bottom - anchors.bottomMargin: precipitationLabelMargin - } - - PlasmaComponents.Label { - function localisePrecipitationUnit(unitText) { - switch (unitText) { - case "mm": - return i18n("mm") - case "cm": - return i18n("cm") - case "in": - return i18n("in") - default: - return unitText - } - } - text: localisePrecipitationUnit(precipitationLabel) - verticalAlignment: Text.AlignTop - horizontalAlignment: Text.AlignHCenter - anchors.top: parent.bottom - anchors.topMargin: -precipitationLabelMargin - anchors.horizontalCenter: precipitationAvgRect.horizontalCenter - font.pixelSize: precipitationFontPixelSize - font.pointSize: -1 - visible: precLabelVisible - } - } -*/ - } } @@ -454,12 +398,13 @@ Item { ctx.clearRect(0, 0, width, height) ctx.strokeStyle = pressureColor - ctx.lineWidth = 1 * Screen.devicePixelRatio; + ctx.lineWidth = 1 ctx.path = pressurePath ctx.stroke() } } } + Canvas { id: meteogramCanvasWarmTemp anchors.top: imageWidth.top @@ -483,7 +428,7 @@ Item { if (ctx !== null) { ctx.clearRect(0, 0, width, height) ctx.strokeStyle = temperatureWarmColor - ctx.lineWidth = 2 * Screen.devicePixelRatio; + ctx.lineWidth = 2 ctx.path = temperaturePathWarm ctx.stroke() } @@ -495,6 +440,7 @@ Item { anchors.fill: parent anchors.topMargin: meteogramCanvasWarmTemp.height clip: true + Canvas { id: meteogramCanvasColdTemp anchors.top: parent.top @@ -514,7 +460,7 @@ Item { ctx.clearRect(0, 0, width, height) ctx.strokeStyle = temperatureColdColor - ctx.lineWidth = 2 * Screen.devicePixelRatio; + ctx.lineWidth = 2 ctx.path = temperaturePathCold ctx.stroke() } @@ -522,6 +468,7 @@ Item { } } } + function repaintCanvas() { meteogramCanvasWarmTemp.requestPaint() meteogramCanvasColdTemp.requestPaint() @@ -534,11 +481,25 @@ Item { } function buildMetogramData() { - var precipitation_unit = meteogramModel.get(0).precipitationLabel + dbgprint2("buildMetogramData (meteogram)") var counter = 0 var i = 0 const oneHourMs = 3600000 hourGridModel.clear() + + let offset = 0 + switch (main.timezoneType) { + case (0): + offset = dataSource.data["Local"]["timezoneOffset"] + break; + case (1): + offset = 0 + break; + case (2): + offset = currentPlace.timezoneOffset + break; + } + while (i < meteogramModel.count) { var obj = meteogramModel.get(i) var dateFrom = obj.from @@ -547,7 +508,7 @@ Item { dateFrom.setSeconds(0) dateFrom.setMilliseconds(0) var differenceHours = Math.floor((dateTo.getTime() - dateFrom.getTime()) / oneHourMs) - dbgprint(dateFrom + "\t" + dateTo + "\t" + differenceHours) + // dbgprint(dateFrom + "\t" + dateTo + "\t" + differenceHours) var differenceHoursMid = Math.ceil(differenceHours / 2) - 1 var wd = obj.windDirection var ws = obj.windSpeedMps @@ -559,22 +520,21 @@ Item { for (var j = 0; j < differenceHours; j++) { counter = (prec > 0) ? counter + 1 : 0 var preparedDate = new Date(dateFrom.getTime() + (j * oneHourMs)) - hourGridModel.append({ - dateFrom: UnitUtils.convertDate(preparedDate, timezoneType, main.timezoneOffset), - iconName: j === differenceHoursMid ? icon : '', - isDaytime: obj.isDaytime, - temperature: airtmp, - precipitationAvg: parseFloat(prec / differenceHours).toFixed(1), - precipitationLabel: (counter === 1) ? "mm" : "", - precipitationMax: parseFloat(prec / differenceHours).toFixed(1), - canShowDay: true, - canShowPrec: true, - windDirection: parseFloat(wd), - windSpeedMps: parseFloat(ws), - pressureHpa: parseFloat(ap), - differenceHours: differenceHours - }) + dateFrom: UnitUtils.convertDate(preparedDate, timezoneType, offset), + iconName: j === differenceHoursMid ? icon : '', + isDaytime: obj.isDaytime, + temperature: airtmp, + precipitationAvg: parseFloat(prec / differenceHours).toFixed(1), + precipitationLabel: (counter === 1) ? "mm" : "", + precipitationMax: parseFloat(prec / differenceHours).toFixed(1), + canShowDay: true, + canShowPrec: true, + windDirection: parseFloat(wd), + windSpeedMps: parseFloat(ws), + pressureHpa: parseFloat(ap), + differenceHours: differenceHours + }) } i++ } @@ -583,7 +543,9 @@ Item { } hourGridModel.setProperty(hourGridModel.count - 1, 'canShowPrec', false) } + function buildCurves() { + dbgprint2("buildCurves") var newPathElements = [] var newPressureElements = [] @@ -610,6 +572,7 @@ Item { pressurePath.pathElements = newPressureElements repaintCanvas() } + function processMeteogramData() { for (var i = 0; i <= temperatureYGridCount; i++) { verticalGridModel.append({ num: i }) @@ -641,10 +604,10 @@ Item { maxValue = value } } + var mid = (maxValue - minValue) / 2 + minValue var halfSize = temperatureYGridCount / 2 temperatureIncrementDegrees = Math.round(- (mid - halfSize)) - } } diff --git a/package/contents/ui/NextDayItem.qml b/package/contents/ui/NextDayItem.qml index 8bf8096..16217c6 100644 --- a/package/contents/ui/NextDayItem.qml +++ b/package/contents/ui/NextDayItem.qml @@ -14,24 +14,29 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import QtQuick 2.2 -import QtQuick.Window 2.5 -import QtQuick.Layouts 1.1 -import QtGraphicalEffects 1.0 -import org.kde.plasma.components 2.0 as PlasmaComponents +import QtQuick 2.15 +import QtQuick.Window +import QtQuick.Layouts +import QtQuick.Shapes 1.6 +import org.kde.plasma.components 3.0 as PlasmaComponents +import Qt5Compat.GraphicalEffects +import org.kde.kirigami as Kirigami Item { - property int itemRowSpacing: 5 * Screen.devicePixelRatio - property double periodFontSize: theme.defaultFont.pixelSize + property int itemRowSpacing: 5 + property double periodFontSize: Kirigami.Theme.defaultFont.pixelSize property double periodHeight: (height - periodFontSize - itemRowSpacing * 4) / 4 - property color lineColor: theme.textColor + property color lineColor: Kirigami.Theme.textColor PlasmaComponents.Label { id: dayTitleText text: dayTitle anchors.top: parent.top + anchors.left: parent.left + anchors.right: parent.right height: periodFontSize + horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignBottom fontSizeMode: Text.Fit } @@ -39,7 +44,7 @@ Item { Item { id: dayTitleLine width: parent.width - height: 1 * Screen.devicePixelRatio + height: 1 anchors.top: parent.top anchors.topMargin: periodFontSize * 0.8 @@ -53,23 +58,22 @@ Item { GradientStop { position: 1.0; color: Qt.rgba(lineColor.r, lineColor.g, lineColor.b, 0) } } } - } - /* - * - * four item data - * - */ +/* + * + * four item data + * +*/ GridLayout { anchors.fill: parent anchors.topMargin: periodFontSize columns: 1 - rowSpacing: 5 * Screen.devicePixelRatio + rowSpacing: 5 height: parent.height - anchors.topMargin width: parent.width @@ -80,8 +84,7 @@ Item { temperature: temperature0 iconName: (iconName0 != undefined) ? iconName0 : "" hidden: hidden0 - past: isPast0 - partOfDay: 1 + partOfDay: partOfDay0 pixelFontSize: periodFontSize } @@ -91,8 +94,7 @@ Item { temperature: temperature1 iconName: (iconName1 != undefined) ? iconName1 : "" hidden: hidden1 - past: isPast1 - partOfDay: 0 + partOfDay: partOfDay1 pixelFontSize: periodFontSize } @@ -102,8 +104,7 @@ Item { temperature: temperature2 iconName: (iconName2 != undefined) ? iconName2 : "" hidden: hidden2 - past: isPast2 - partOfDay: 0 + partOfDay: partOfDay2 pixelFontSize: periodFontSize } @@ -113,10 +114,8 @@ Item { temperature: temperature3 iconName: (iconName3 != undefined) ? iconName3 : "" hidden: hidden3 - past: isPast3 - partOfDay: 1 + partOfDay: partOfDay3 pixelFontSize: periodFontSize } } - } diff --git a/package/contents/ui/NextDayPeriodItem.qml b/package/contents/ui/NextDayPeriodItem.qml index c1f4733..b6bc9f2 100644 --- a/package/contents/ui/NextDayPeriodItem.qml +++ b/package/contents/ui/NextDayPeriodItem.qml @@ -14,16 +14,16 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import QtQuick 2.2 -import org.kde.plasma.components 2.0 as PlasmaComponents +import QtQuick 2.15 +import org.kde.plasma.components 3.0 as PlasmaComponents import "../code/icons.js" as IconTools import "../code/unit-utils.js" as UnitUtils +import org.kde.kirigami as Kirigami Item { property string temperature property string iconName property bool hidden - property bool past property int partOfDay property double pixelFontSize @@ -34,44 +34,26 @@ Item { } } - opacity: past ? 0.5 : 1 - - Item { - id: temperatureTextItem + Text { + id: temperatureText + font.pixelSize: defaultFontPixelSize + text: UnitUtils.getTemperatureNumberExt(temperature, temperatureType) + // Math.round(temperature) + '[]' + temperatureType + visible: ! hidden width: parent.width / 2 - height: parent.height - - PlasmaComponents.Label { - id: temperatureText - - font.pointSize: -1 - - width: parent.width - height: parent.height - - horizontalAlignment: Text.AlignRight - verticalAlignment: Text.AlignVCenter - - text: hidden ? '' : UnitUtils.getTemperatureNumberExt(temperature, temperatureType) - } + horizontalAlignment: Text.AlignRight + color: Kirigami.Theme.textColor + } - - Item { + Text { + anchors.left: temperatureText.right + id: temperatureIcon + font.family: 'weathericons' + font.pixelSize: defaultFontPixelSize + text: (iconName > 0) ? IconTools.getIconCode(iconName, currentPlace.providerId, partOfDay) : '\uf07b' + visible: ! hidden width: parent.width / 2 - height: parent.height - - anchors.right: parent.right - - PlasmaComponents.Label { - id: temperatureIcon - - font.pointSize: -1 - - anchors.centerIn: parent - - font.family: 'weathericons' - text: hidden ? '' : IconTools.getIconCode(iconName, currentProvider.providerId, partOfDay) - } + horizontalAlignment: Text.AlignHCenter + color: Kirigami.Theme.textColor } - -} \ No newline at end of file +} diff --git a/package/contents/ui/WeatherCache.qml b/package/contents/ui/WeatherCache.qml index 3a666e1..f190add 100644 --- a/package/contents/ui/WeatherCache.qml +++ b/package/contents/ui/WeatherCache.qml @@ -15,7 +15,7 @@ * along with this program. If not, see . */ import QtQuick 2.2 -import org.kde.plasma.plasmoid 2.0 +import org.kde.plasma.plasmoid Item { id: weatherCache diff --git a/package/contents/ui/config/ConfigAppearance.qml b/package/contents/ui/config/ConfigAppearance.qml index 9dceec8..763601a 100644 --- a/package/contents/ui/config/ConfigAppearance.qml +++ b/package/contents/ui/config/ConfigAppearance.qml @@ -1,28 +1,31 @@ import QtQuick 2.2 -import QtQuick.Controls 1.3 -import QtQuick.Controls 2.15 as QC215 +import QtQuick.Controls import QtQuick.Layouts 1.1 +import org.kde.kirigami as Kirigami +import org.kde.kcmutils as KCM -Item { +KCM.SimpleKCM { id: appearancePage property int cfg_layoutType property alias cfg_inTrayActiveTimeoutSec: inTrayActiveTimeoutSec.value property string cfg_widgetFontName: plasmoid.configuration.widgetFontName property string cfg_widgetFontSize: plasmoid.configuration.widgetFontSize + property alias cfg_showLastReloadedTime: showLastReloadedTime.checked + onCfg_layoutTypeChanged: { switch (cfg_layoutType) { - case 0: - layoutTypeGroup.current = layoutTypeRadioHorizontal; - break; - case 1: - layoutTypeGroup.current = layoutTypeRadioVertical; - break; - case 2: - layoutTypeGroup.current = layoutTypeRadioCompact; - break; - default: + case 0: + layoutTypeGroup.checkedButton = layoutTypeRadioHorizontal; + break; + case 1: + layoutTypeGroup.checkedButton = layoutTypeRadioVertical; + break; + case 2: + layoutTypeGroup.checkedButton = layoutTypeRadioCompact; + break; + default: } } @@ -36,7 +39,7 @@ Item { var foundIndex = 0 for (var i = 0, j = fonts.length; i < j; ++i) { if (fonts[i] === cfg_widgetFontName) { - foundIndex = i + foundIndex = i } arr.push({text: fonts[i], value: fonts[i]}) } @@ -51,7 +54,7 @@ Item { cfg_layoutTypeChanged() } - ExclusiveGroup { + ButtonGroup { id: layoutTypeGroup } @@ -73,12 +76,12 @@ Item { Layout.columnSpan: 3 } Label { - text: i18n("Layout type:") - Layout.alignment: Qt.AlignVCenter|Qt.AlignRight + text: i18n("Layout type") + ":" + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } RadioButton { id: layoutTypeRadioHorizontal - exclusiveGroup: layoutTypeGroup + ButtonGroup.group: layoutTypeGroup text: i18n("Horizontal") onCheckedChanged: if (checked) cfg_layoutType = 0; } @@ -95,13 +98,13 @@ Item { } RadioButton { id: layoutTypeRadioVertical - exclusiveGroup: layoutTypeGroup + ButtonGroup.group: layoutTypeGroup text: i18n("Vertical") onCheckedChanged: if (checked) cfg_layoutType = 1; } RadioButton { id: layoutTypeRadioCompact - exclusiveGroup: layoutTypeGroup + ButtonGroup.group: layoutTypeGroup text: i18n("Compact") onCheckedChanged: if (checked) cfg_layoutType = 2; } @@ -119,26 +122,39 @@ Item { Layout.columnSpan: 3 } + Label { - text: i18n("Active timeout:") + id: timeoutLabel + text: i18n("Active timeout") + ":" Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + height: inTrayActiveTimeoutSec.height + // anchors.verticalCenter: inTrayActiveTimeoutSec.verticalCenter } - - SpinBox { - id: inTrayActiveTimeoutSec - decimals: 0 - stepSize: 10 - minimumValue: 10 - maximumValue: 8000 - suffix: i18nc("Abbreviation for seconds", "sec") + Item { + SpinBox { + id: inTrayActiveTimeoutSec + Layout.alignment: Qt.AlignVCenter + stepSize: 10 + from: 10 + to: 8000 + anchors.verticalCenter: parent.verticalCenter + // suffix: i18nc("Abbreviation for seconds", "sec") + } + Label { + text: i18nc("Abbreviation for seconds", "sec") + anchors.verticalCenter: parent.verticalCenter + anchors.left:inTrayActiveTimeoutSec.right + anchors.leftMargin: 4 + } } - Label { text: i18n("NOTE: After this timeout widget will be hidden in system tray until refreshed. You can always set the widget to be always \"Shown\" in system tray \"Entries\" settings.") Layout.rowSpan: 3 Layout.preferredWidth: 250 wrapMode: Text.WordWrap } + + Item { width: 2 height: 20 @@ -146,20 +162,21 @@ Item { } Label { - text: i18n("Widget font style:") + text: i18n("Widget font style") + ":" + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } - QC215.ComboBox { + ComboBox { id: fontFamilyComboBox Layout.fillWidth: true currentIndex: 0 - Layout.minimumWidth: units.gridUnit * 10 + Layout.minimumWidth: Kirigami.Units.gridUnit * 10 model: fontsModel textRole: "text" onCurrentIndexChanged: { var current = model.get(currentIndex) if (current) { - cfg_widgetFontName = currentIndex === 0 ? "" : current.value + cfg_widgetFontName = currentIndex === 0 ? Kirigami.Theme.defaultFont : current.value } } } @@ -170,18 +187,47 @@ Item { } Label { - text: i18n("Widget font size:") - } - SpinBox { - id: widgetFontSize - decimals: 0 - stepSize: 1 - minimumValue: 4 - value: cfg_widgetFontSize - maximumValue: 512 - suffix: i18nc("pixels", "px") - onValueChanged: { - cfg_widgetFontSize = widgetFontSize.value + text: i18n("Show last reloaded time") + ":" + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + } + + CheckBox { + id: showLastReloadedTime + Layout.fillWidth: true + Layout.alignment: Qt.AlignLeft + } + + Item { + width: 2 + height: 20 + Layout.columnSpan: 3 + } + + Label { + text: i18n("Widget font size") + ":" + Layout.alignment: Qt.AlignVCenter | Qt.AlignRight + // anchors.verticalCenter: widgetFontSize.verticalCenter + + + } + Item { + SpinBox { + id: widgetFontSize + Layout.alignment: Qt.AlignVCenter + anchors.verticalCenter: parent.verticalCenter + // decimals: 0 + stepSize: 1 + from: 4 + value: cfg_widgetFontSize + to: 512 + onValueChanged: { + cfg_widgetFontSize = widgetFontSize.value + } + } + Label { + anchors.verticalCenter: parent.verticalCenter + anchors.left:widgetFontSize.right + text: i18nc("pixels", "px") } } } diff --git a/package/contents/ui/config/ConfigGeneral.qml b/package/contents/ui/config/ConfigGeneral.qml index edd7d9b..4ff4979 100644 --- a/package/contents/ui/config/ConfigGeneral.qml +++ b/package/contents/ui/config/ConfigGeneral.qml @@ -1,40 +1,52 @@ -import QtQuick 2.2 -import QtQuick.Controls 1.3 -import QtQuick.Controls 2.15 as QC215 -import QtQuick.Layouts 1.1 -import QtQuick.Dialogs 1.2 -import org.kde.plasma.core 2.0 as PlasmaCore +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts import "../../code/config-utils.js" as ConfigUtils import "../../code/placesearch-helpers.js" as Helper -import "../../code/db/timezoneData.js" as TZData -Item { +import "../../code/timezoneData.js" as TZData +import Qt.labs.qmlmodels +import org.kde.kirigami as Kirigami +import org.kde.kcmutils as KCM + +KCM.SimpleKCM { + function dbgprint(msg) { + if (!cfg_debugLogging) { + return + } + + print('[kate weatherWidget] ' + msg) + } + + + id: generalConfigPage property alias cfg_reloadIntervalMin: reloadIntervalMin.value property string cfg_places property alias cfg_debugLogging: debugLogging.checked + property double defaultFontPixelSize: Kirigami.Theme.defaultFont.pixelSize + property bool env_QML_XHR_ALLOW_FILE_READ: plasmoid.configuration.qml_XHR_ALLOW_FILE_READ + property bool textColorLight: ((Kirigami.Theme.textColor.r + Kirigami.Theme.textColor.g + Kirigami.Theme.textColor.b) / 3) > 0.5 + property var backgroundColor: Kirigami.Theme.backgroundColor + property var alternateBackgroundColor: Kirigami.Theme.alternateBackgroundColor + property var highlightColor: Kirigami.Theme.highlightColor - property int editEntryNumber: -1 - - ListModel { - id: placesModel - } - Component.onCompleted: { + var places = ConfigUtils.getPlacesArray() + var f = 0 ConfigUtils.getPlacesArray().forEach(function (placeObj) { - placesModel.append({ - providerId: placeObj.providerId, - placeIdentifier: placeObj.placeIdentifier, - placeAlias: placeObj.placeAlias, - timezoneID: (placeObj.timezoneID !== undefined) ? placeObj.timezoneID : -1 - }) + placesModel.appendRow({ + providerId: placeObj.providerId, + placeIdentifier: placeObj.placeIdentifier, + placeAlias: placeObj.placeAlias, + timezoneID: (placeObj.timezoneID !== undefined) ? placeObj.timezoneID : -1, + }) }) let timezoneArray = TZData.TZData.sort(dynamicSort("displayName")) timezoneArray.forEach(function (tz) { timezoneDataModel.append({displayName: tz.displayName.replace(/_/gi, " "), id: tz.id}); }) - } function dynamicSort(property) { @@ -53,88 +65,607 @@ Item { } } } - function isNumeric(n) { return !isNaN(parseFloat(n)) && isFinite(n); } - function placesModelChanged() { + dbgprint("placesModelChanged") var newPlacesArray = [] - for (var i = 0; i < placesModel.count; i++) { - var placeObj = placesModel.get(i) + for (var i = 0; i < placesModel.rowCount; i++) { + var placeObj = placesModel.getRow(i) newPlacesArray.push({ - providerId: placeObj.providerId, - placeIdentifier: placeObj.placeIdentifier, - placeAlias: placeObj.placeAlias, - timezoneID: (placeObj.timezoneID !== undefined) ? placeObj.timezoneID : -1 + providerId: placeObj.providerId, + placeIdentifier: placeObj.placeIdentifier, + placeAlias: placeObj.placeAlias, + timezoneID: (placeObj.timezoneID !== undefined) ? placeObj.timezoneID : -1 - }) + }) } cfg_places = JSON.stringify(newPlacesArray) - print('[weatherWidget] places: ' + cfg_places) } - + function updatenewMetnoCityOKButton() { + dbgprint("updatenewMetnoCityOKButton") + var latValid = newMetnoCityLatitudeField.acceptableInput + var longValid = newMetnoCityLongitudeField.acceptableInput + var altValid = newMetnoCityAltitudeField.acceptableInput + dbgprint(newMetnoCityAlias.length + "\t" + latValid + "\t" + longValid + "\t" + altValid + "\t" + addMetnoCityIdDialog.timezoneID ) + if ((latValid && longValid && altValid) && (newMetnoCityAlias.length >0) && (addMetnoCityIdDialog.timezoneID > -1)) { + buttons.standardButton(Dialog.Ok).enabled = true + } else { + buttons.standardButton(Dialog.Ok).enabled = false + } + } function updateUrl() { var Url="" - if (newMetnoCityLatitudeField.acceptableInput) { + var latValid = newMetnoCityLatitudeField.acceptableInput + var longValid = newMetnoCityLongitudeField.acceptableInput + var altValid = newMetnoCityAltitudeField.acceptableInput + if (latValid) { Url += "lat=" + (Number.fromLocaleString(newMetnoCityLatitudeField.text)) } - if (newMetnoCityLongitudeField.acceptableInput) { + if (longValid) { if (Url.length > 0) { Url += "&" } Url += "lon=" + (Number.fromLocaleString(newMetnoCityLongitudeField.text)) } - if (newMetnoCityAltitudeField.acceptableInput) { + if (altValid) { if (Url.length > 0) { Url += "&" } Url += "altitude=" + (Number.fromLocaleString(newMetnoCityAltitudeField.text)) } newMetnoUrl.text = Url + updatenewMetnoCityOKButton() + } + + ListModel { + id: timezoneDataModel + } + + ListModel { + id: countryCodesModel + } + + TableModel { + id: placesModel + TableModelColumn { + display: "providerId" + } + TableModelColumn { + display: "placeIdentifier" + } + TableModelColumn { + display: "placeAlias" + } + TableModelColumn { + display: "timezoneID" + } + } + + TableModel { + id: filteredCSVData + TableModelColumn { + display: "Location" + } + TableModelColumn { + display: "Area" + } + TableModelColumn { + display: "Latitude" + } + TableModelColumn { + display: "Longitude" + } + TableModelColumn { + display: "Altitude" + } + TableModelColumn { + display: "Timezone" + } + } + + TableModel { + id: myCSVData + TableModelColumn { + display: "Location" + } + TableModelColumn { + display: "Area" + } + TableModelColumn { + display: "Latitude" + } + TableModelColumn { + display: "Longitude" + } + TableModelColumn { + display: "Altitude" + } + TableModelColumn { + display: "Timezone" + } + TableModelColumn { + display: "timezoneId" + } + + } + + // ConfigGeneral home page + ColumnLayout { + id: rhsColumn + width: parent.width + spacing: 2 + + Label { + text: i18n("Plasmoid version") + ": " + plasmoid.metaData.version + Layout.alignment: Qt.AlignRight + } + + Label { + text: i18n("Location") + font.bold: true + Layout.alignment: Qt.AlignLeft + } + + HorizontalHeaderView { + id: myhorizontalHeader + // anchors.left: mytableView.left + // anchors.leftMargin: 0 + // anchors.topMargin: 2 + // anchors.top: parent.top + // anchors.right: parent.right + // anchors.rightMargin: 2 + + syncView: mytableView + clip: true + model: ListModel { + Component.onCompleted: { + append({ display: i18n("Source") }); + append({ display: i18n("Place Identifier") }); + append({ display: i18n("Displayed as") }); + append({ display: i18n("Action") }); + // append({ display: ("TBA") }); + } + } + } + ScrollView { + id: placesTable + width: parent.width + clip: true + Layout.preferredHeight: 180 + Layout.preferredWidth: parent.width + Layout.columnSpan: 2 + + + TableView { + anchors.fill: parent + property var columnWidths: [10, 40, 25, 22] + columnWidthProvider: function (column) { + let aw = placesTable.width - placesTable.effectiveScrollBarWidth + return parseInt(aw * columnWidths[column] / 100 ) + + } + + implicitHeight: 200 + implicitWidth: 600 + clip: true + interactive: true + rowSpacing: 1 + columnSpacing: 1 + boundsBehavior: Flickable.StopAtBounds + model: placesModel + id: mytableView + alternatingRows: true + + selectionBehavior: TableView.SelectRows + selectionModel: ItemSelectionModel {} + + delegate: myChooser + + DelegateChooser { + id: myChooser + DelegateChoice { + column: 0 + delegate: Rectangle { + color: (row % 2) === 0 ? backgroundColor : alternateBackgroundColor + Text { + anchors.fill: parent + text: display + color: Kirigami.Theme.textColor + font.family: Kirigami.Theme.defaultFont.family + font.pixelSize: 0 + verticalAlignment: Text.AlignVCenter + } + } + } + DelegateChoice { + column: 1 + delegate: Rectangle { + color: (row % 2) === 0 ? backgroundColor : alternateBackgroundColor + Text { + anchors.fill: parent + text: display + color: Kirigami.Theme.textColor + font.family: Kirigami.Theme.defaultFont.family + font.pixelSize: defaultFontPixelSize + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + clip: true + } + } + } + DelegateChoice { + column: 2 + delegate: Rectangle { + color: (row % 2) === 0 ? backgroundColor : alternateBackgroundColor + Text { + anchors.fill: parent + id: tableLocation + text: display + color: Kirigami.Theme.textColor + font.family: Kirigami.Theme.defaultFont.family + font.pixelSize: defaultFontPixelSize + verticalAlignment: Text.AlignVCenter + elide: Text.ElideRight + clip: true + } + } + } + DelegateChoice { + column: 3 + id: myChoice3 + delegate: GridLayout { + columnSpacing: 1 + Text { + id: myrowValue + visible: false + text: display + } + Button { + id:myButton1 + icon.name: 'go-up' + enabled: row === 0 ? false : true + MouseArea { + anchors.fill: parent + onClicked: { + if (row > 0) { + placesModel.moveRow(row, row - 1, 1) + placesModelChanged() + } + } + } + } + Button { + id:myButton2 + icon.name: 'go-down' + enabled: row == (placesModel.rowCount - 1) ? false: true + MouseArea { + anchors.fill: parent + onClicked: { + if (row < placesModel.rowCount) { + placesModel.moveRow(row, row + 1, 1) + placesModelChanged() + } + } + } + } + Button { + icon.name: 'list-remove' + MouseArea { + anchors.fill: parent + onClicked: { + placesModel.removeRow(row, 1) + placesModelChanged() + } + } + enabled: (placesModel.rowCount > 1) + } + Button { + icon.name: 'entry-edit' + MouseArea { + anchors.fill: parent + onClicked: { + let entry = placesModel.getRow(row) + if (entry.providerId === "metno") { + let url = entry.placeIdentifier + newMetnoUrl.text = url + var data = url.match(RegExp("([+-]?[0-9]{1,5}[.]?[0-9]{0,5})","g")) + newMetnoCityLatitudeField.text = Number(data[0]).toLocaleString(Qt.locale(),"f",5) + newMetnoCityLongitudeField.text = Number(data[1]).toLocaleString(Qt.locale(),"f",5) + newMetnoCityAltitudeField.text = (data[2] === undefined) ? 0:data[2] + dbgprint("timezone ID=" + entry.timezoneID) + addMetnoCityIdDialog.timezoneID = entry.timezoneID + for (var i = 0; i < timezoneDataModel.count; i++) { + if (timezoneDataModel.get(i).id == Number(entry.timezoneID)) { + tzComboBox.currentIndex = i + break + } + } + newMetnoCityAlias.text = entry.placeAlias + addMetnoCityIdDialog.placeNumberID = row + addMetnoCityIdDialog.open() + } + if (entry.providerId === "owm") { + newOwmCityIdField.text = "https://openweathermap.org/city/"+entry.placeIdentifier + newOwmCityAlias.text = entry.placeAlias + addOwmCityIdDialog.placeNumberID = row + addOwmCityIdDialog.open() + + } + } + } + } + } + } + } + } + + } + Row { + Button { + icon.name: 'list-add' + text: 'OWM' + width: 100 + onClicked: { + addOwmCityIdDialog.placeNumberID = -1 + newOwmCityIdField.text = '' + newOwmCityAlias.text = '' + newOwmCityIdField.focus = true + addOwmCityIdDialog.open() + } + } + + Button { + icon.name: 'list-add' + text: 'metno' + width: 100 + onClicked: { + + newMetnoCityAlias.text = '' + newMetnoCityLatitudeField.text = '' + newMetnoCityLongitudeField.text = '' + newMetnoCityAltitudeField.text = '' + newMetnoUrl.text = '' + newMetnoCityLatitudeField.focus = true + addMetnoCityIdDialog.placeNumberID=-1 + addMetnoCityIdDialog.open() + } + } + } + + Label { + topPadding: 16 + bottomPadding: 6 + text: i18n("Miscellaneous") + font.bold: true + Layout.alignment: Qt.AlignLeft + } + + Item { + id: reloadItem + width: parent.width + + Label { + id: reloadLabel1 + anchors.verticalCenter: parent.verticalCenter + anchors.left: parent.left + text: i18n("Reload interval") + ":" + Layout.alignment: Qt.AlignLeft + rightPadding: 6 + } + SpinBox { + anchors.verticalCenter: parent.verticalCenter + anchors.left:reloadLabel1.right + id: reloadIntervalMin + stepSize: 10 + + from: 20 + to: 120 + // suffix: i18nc("Abbreviation for minutes", "min") + + } + Label { + anchors.verticalCenter: parent.verticalCenter + anchors.left:reloadIntervalMin.right + text: i18nc("Abbreviation for minutes", "min") + leftPadding: 6 + } + } + + CheckBox { + id: debugLogging + checked: false + text: "Debug" + Layout.alignment: Qt.AlignLeft + visible: false + } + + } + Item { + anchors.bottom: parent.bottom + Rectangle { + anchors.fill: parent + // anchors.top: + } + Label { + id: attribution1 + anchors.bottom: attribution2.top + anchors.bottomMargin: 2 + font: Kirigami.Theme.smallFont + text: i18n("Met.no weather forecast data provided by The Norwegian Meteorological Institute.") + MouseArea { + cursorShape: Qt.PointingHandCursor + anchors.fill: attribution1 + + hoverEnabled: true + + onClicked: { + Qt.openUrlExternally('https://www.met.no/en/About-us') + } + + onEntered: { + attribution1.font.underline = true + } + + onExited: { + attribution1.font.underline = false + } + } + } + Label { + id: attribution2 + anchors.bottom: attribution3.top + anchors.bottomMargin: 2 + font: Kirigami.Theme.smallFont + text: i18n("Sunrise/sunset data provided by Sunrise - Sunset.") + MouseArea { + cursorShape: Qt.PointingHandCursor + anchors.fill: attribution2 + + hoverEnabled: true + + onClicked: { + Qt.openUrlExternally('https://sunrise-sunset.org/about') + } + + onEntered: { + attribution2.font.underline = true + } + + onExited: { + attribution2.font.underline = false + } + } + } + Label { + id: attribution3 + anchors.bottom: attribution4.top + anchors.bottomMargin: 2 + font: Kirigami.Theme.smallFont + text: i18n("OWM weather forecast data provided by OpenWeather.") + MouseArea { + cursorShape: Qt.PointingHandCursor + anchors.fill: attribution3 + + hoverEnabled: true + + onClicked: { + Qt.openUrlExternally('https://openweathermap.org/about-us') + } + + onEntered: { + attribution3.font.underline = true + } + + onExited: { + attribution3.font.underline = false + } + } + } + Label { + id: attribution4 + anchors.bottom: parent.bottom + anchors.bottomMargin: 2 + font: Kirigami.Theme.smallFont + text: i18n("Weather icons created by Erik Flowers.") + MouseArea { + cursorShape: Qt.PointingHandCursor + anchors.fill: attribution4 + + hoverEnabled: true + + onClicked: { + Qt.openUrlExternally('https://erikflowers.github.io/weather-icons/') + } + + onEntered: { + attribution4.font.underline = true + } + + onExited: { + attribution4.font.underline = false + } + } + } } + // changePlaceAliasDialog + Dialog { + id: changePlaceAliasDialog + title: i18n("Change Displayed As") + + standardButtons: Dialog.Ok | Dialog.Cancel + + onAccepted: { + placesModel.setProperty(changePlaceAliasDialog.tableIndex, 'placeAlias', newPlaceAliasField.text) + placesModelChanged() + changePlaceAliasDialog.close() + } + + property int tableIndex: 0 + + TextField { + id: newPlaceAliasField + placeholderText: i18n("Enter place alias") + width: parent.width + } + } + + // addOwmCityIdDialog Dialog { id: addOwmCityIdDialog title: i18n("Add Open Weather Map Place") - + property int placeNumberID: -1 width: 500 - - standardButtons: StandardButton.Ok | StandardButton.Cancel + height: newOwmCityIdField.height * 9 + footer: DialogButtonBox { + id: owmButtons + standardButtons: Dialog.Ok | Dialog.Cancel + } onAccepted: { var url = newOwmCityIdField.text var match = /https?:\/\/openweathermap\.org\/city\/([0-9]+)(\/)?/.exec(url) + var resultString = null + if (match !== null) { resultString = match[1] - } - - if (resultString === null) { - return - } - if (editEntryNumber === -1) { - placesModel.append({ - providerId: 'owm', - placeIdentifier: resultString, - placeAlias: newOwmCityAlias.text - }) - } else { - placesModel.set(editEntryNumber,{ - providerId: 'owm', - placeIdentifier: resultString, - placeAlias: newOwmCityAlias.text - }) + dbgprint(addOwmCityIdDialog.placeNumberID) + if (addOwmCityIdDialog.placeNumberID === -1) { + placesModel.appendRow({ + providerId: 'owm', + placeIdentifier: resultString, + placeAlias: newOwmCityAlias.text, + timezoneID: -1 + }) + } else { + placesModel.setRow(addOwmCityIdDialog.placeNumberID,{ + providerId: 'owm', + placeIdentifier: resultString, + placeAlias: newOwmCityAlias.text, + timezoneID: -1 + }) + } + placesModelChanged() + close() } - placesModelChanged() - close() } TextField { id: newOwmCityIdField placeholderText: i18n("Paste URL here") width: parent.width + onTextChanged: { + var match = /https?:\/\/openweathermap\.org\/city\/([0-9]+)(\/)?/.exec(newOwmCityIdField.text) + if (match === null) { + owmButtons.standardButton(Dialog.Ok).enabled = false + } else { + owmButtons.standardButton(Dialog.Ok).enabled = true + } + } } TextField { @@ -150,7 +681,7 @@ Item { anchors.top: newOwmCityAlias.bottom anchors.topMargin: 10 font.italic: true - text: i18n("Find your city ID by searching here:") + text: i18n("Find your city ID by searching here") + ":" } Label { @@ -187,99 +718,197 @@ Item { } - MessageDialog { - id: invalidData - title: i18n("Error!") - text: "" - icon: StandardIcon.Critical - informativeText: "" - visible: false - } - - MessageDialog { - id: saveSearchedData - title: i18n("Confirmation") - text: i18n("Do you want to select this place?") - icon: StandardIcon.Question - standardButtons: StandardButton.Yes | StandardButton.No - informativeText: "" - visible: false - onYes: { - let data=filteredCSVData.get(tableView.currentRow) - newMetnoCityLatitudeField.text=data["latitude"] - newMetnoCityLongitudeField.text=data["longitude"] - newMetnoCityAltitudeField.text=data["altitude"] - newMetnoUrl.text="lat="+data["latitude"]+"&lon="+data["longitude"]+"&altitude="+data["altitude"] - let loc=data["locationName"]+", "+Helper.getshortCode(countryList.textAt(countryList.currentIndex)) - newMetnoCityAlias.text=loc - addMetnoCityIdDialog.timezoneID=data["timezoneId"] - for (var i=0; i < timezoneDataModel.count; i++) { - if (timezoneDataModel.get(i).id == Number(data["timezoneId"])) { - tzComboBox.currentIndex=i - break - } - } - searchWindow.close() - addMetnoCityIdDialog.open() - } - } - + // addMetnoCityIdDialog Dialog { + id: addMetnoCityIdDialog title: i18n("Add Met.no Map Place") property int timezoneID: -1 + property int placeNumberID: -1 - width: 500 + implicitWidth: generalConfigPage.width + footer: DialogButtonBox { + id: buttons + standardButtons: Dialog.Ok | Dialog.Cancel + } - standardButtons: StandardButton.Ok | StandardButton.Cancel - onActionChosen: { - function between(x, min, max) { - return x >= min && x <= max; - } + Item { + anchors.fill: parent + id: metNoRowLayout + // implicitWidth: 550 + implicitHeight: metNoRow1.height * 4 + property int labelWidth: 80 + property int textboxWidth:( metNoRowLayout.width - (3* metNoRowLayout) ) / 3 + ColumnLayout{ + spacing: 8 + RowLayout { + id: metNoRow1 + Layout.preferredWidth: metNoRowLayout.width + Label { + text: ("Place Identifier") + ":" + Layout.alignment: Qt.AlignVCenter + } + TextField { + id: newMetnoCityAlias + Layout.alignment: Qt.AlignVCenter + placeholderText: ("City alias") + onTextChanged: { + updateUrl() + } + } + Item { + // spacer item + Layout.fillWidth: true + Layout.fillHeight: true + // Rectangle { anchors.fill: parent; color: "#ffaaaa" } // to visualize the spacer + } + Button { + text: i18n("Search") - if (action.button === Dialog.Ok) { - var reason="" - var reasoncount=0; - var latValid = newMetnoCityLatitudeField.acceptableInput - var longValid = newMetnoCityLongitudeField.acceptableInput - var altValid = newMetnoCityAltitudeField.acceptableInput + Layout.alignment: Qt.AlignRight + onClicked: { + addMetnoCityIdDialog.close() + searchWindow.open() + } + } + } - action.accepted = false + RowLayout { + Layout.fillWidth: true + Label { + id: newMetnoCityLatitudeLabel + text: i18n("Latitude") + ":" + Layout.preferredWidth: metNoRowLayout.labelWidth + horizontalAlignment: Text.AlignRight + } + TextField { + id: newMetnoCityLatitudeField + Layout.preferredWidth: metNoRowLayout.textboxWidth + Layout.fillWidth: true + validator: DoubleValidator { bottom: -90; top: 90; decimals: 5 } + color: acceptableInput ? newMetnoCityLatitudeLabel.color : "red" + onTextChanged: { + updateUrl() + } + } - if (!(latValid)) { - reason+=i18n("The Latitude is not valid.")+"\n" - reason+=i18n("The Latitude is not between -90 and 90.")+"\n" - reasoncount++ - } + Label { + id: newMetnoCityLongitudeLabel + horizontalAlignment: Text.AlignRight + Layout.preferredWidth: metNoRowLayout.labelWidth + text: i18n("Longitude") + ":" + } - if (!(longValid)) { - reason+=i18n("The Longitude is not valid.")+"\n" - reason+=i18n("The Longitude is not between -180 and 180.")+"\n" - reasoncount++ - } + TextField { + id: newMetnoCityLongitudeField + validator: DoubleValidator { bottom: -180; top: 180; decimals: 5 } + Layout.fillWidth: true + Layout.preferredWidth: metNoRowLayout.textboxWidth + color: acceptableInput ? newMetnoCityLongitudeLabel.color : "red" + onTextChanged: { + updateUrl() + } + } + Label { + id: newMetnoCityAltitudeLabel + horizontalAlignment: Text.AlignRight + Layout.preferredWidth: metNoRowLayout.labelWidth + text: i18n("Altitude") + ": " + } - if (! altValid) { - reason+=i18n("The Altitude is not valid.")+"\n" - reason+=i18n("The Altitude is not between -999 and 5000.")+"\n" - reasoncount++ + TextField { + id: newMetnoCityAltitudeField + Layout.fillWidth: true + Layout.preferredWidth: metNoRowLayout.textboxWidth + validator: IntValidator { bottom: -999; top: 5000 } + color: acceptableInput ? newMetnoCityAltitudeLabel.color : "red" + onTextChanged: { + updateUrl() + } + } } + RowLayout { + Layout.preferredWidth: metNoRowLayout.width + Label { + text: i18n("Url")+": " + Layout.alignment: Qt.AlignVCenter + horizontalAlignment: Text.AlignRight + Layout.preferredWidth: metNoRowLayout.labelWidth + } + TextField { + id: newMetnoUrl + placeholderText: i18n("URL") + Layout.columnSpan: 5 + Layout.fillWidth: true + color: acceptableInput ? newMetnoCityAltitudeLabel.color : "red" + + function updateFields() { + function localiseFloat(data) { + return Number(data).toLocaleString(Qt.locale(),"f",5) + } - if (newMetnoCityAlias.text.length === 0) { - reason+=i18n("The Place Name is empty.")+"\n" - reasoncount++ - } + var data = newMetnoUrl.text.match(RegExp("([+-]?[0-9]{1,5}[.]?[0-9]{0,5})","g")) + if (data === undefined) + return + if (data.length === 3) { + var newlat = localiseFloat(data[0]) + var newlon = localiseFloat(data[1]) + var newalt = Number(data[2]) + if ((! newMetnoCityLatitudeField.acceptableInput) || (newMetnoCityLatitudeField.text.length === 0) || (newMetnoCityLatitudeField.text !== newlat)) { + newMetnoCityLatitudeField.text = newlat + } + if ((! newMetnoCityLongitudeField.acceptableInput) || (newMetnoCityLongitudeField.text.length === 0) || (newMetnoCityLongitudeField.text !== newlon)) { + newMetnoCityLongitudeField.text = newlon + } + if ((! newMetnoCityAltitudeField.acceptableInput) || (newMetnoCityAltitudeField.text.length === 0) || (newMetnoCityAltitudeField.text !== data[2])) { + // if ((newalt >= newMetnoCityAltitudeField.validator.bottom) && (newalt <= newMetnoCityAltitudeField.validator.top)) { + newMetnoCityAltitudeField.text = data[2] + // } + } + } + updatenewMetnoCityOKButton() + } - if (reasoncount === 0 ) { - action.accepted = true - } else { - action.accepted = false - invalidData.text=i18np("There is an error!", "There are %1 errors!",reasoncount) - invalidData.informativeText=reason - invalidData.open() + onTextChanged: { + updateFields() + } + + onEditingFinished: { + updateFields() + } + } + } + RowLayout { + Layout.fillWidth: true + Label { + id: newMetnoCityTimezoneLabel + text: i18n("Timezone") + ": " + Layout.preferredWidth: metNoRowLayout.labelWidth + horizontalAlignment: Text.AlignRight + } + ComboBox { + id: tzComboBox + model: timezoneDataModel + currentIndex: -1 + textRole: "displayName" + Layout.preferredWidth: (metNoRowLayout.labelWidth * 3) + onCurrentIndexChanged: { + if (tzComboBox.currentIndex > 0) { + addMetnoCityIdDialog.timezoneID = timezoneDataModel.get(tzComboBox.currentIndex).id + } + updateUrl() + } + } } } + + + } + onOpened: { + updatenewMetnoCityOKButton() + // buttons.standardButton(Dialog.Ok).enabled = false; } onAccepted: { @@ -287,224 +916,288 @@ Item { if (resultString.length === 0) { resultString="lat="+newMetnoCityLatitudeField.text+"&lon="+newMetnoCityLongitudeField.text+"&altitude="+newMetnoCityAltitudeField.text } - if (editEntryNumber === -1) { - placesModel.append({ - providerId: 'metno', - placeIdentifier: resultString, - placeAlias: newMetnoCityAlias.text, - timezoneID: addMetnoCityIdDialog.timezoneID - }) + if (addMetnoCityIdDialog.placeNumberID === -1) { + placesModel.appendRow({ + providerId: 'metno', + placeIdentifier: resultString, + placeAlias: newMetnoCityAlias.text, + timezoneID: addMetnoCityIdDialog.timezoneID + }) } else { - placesModel.set(editEntryNumber,{ - providerId: 'metno', - placeIdentifier: resultString, - placeAlias: newMetnoCityAlias.text, - timezoneID: addMetnoCityIdDialog.timezoneID - }) + placesModel.setRow(addMetnoCityIdDialog.placeNumberID,{ + providerId: 'metno', + placeIdentifier: resultString, + placeAlias: newMetnoCityAlias.text, + timezoneID: addMetnoCityIdDialog.timezoneID + }) } placesModelChanged() close() } + } - GridLayout { - id: metNoRowLayout - anchors.fill: parent - columns: 8 - Label { - id: newMetnoCityLatitudeLabel - text: i18n("Latitude")+":" - } + // searchWindow + Dialog { + title: i18n("Location Search") + id: searchWindow + z: 1 + implicitWidth: parent.width - 40 + implicitHeight: parent.height - 40 + footer: DialogButtonBox { + id: searchWindowButtons + standardButtons: Dialog.Ok | Dialog.Cancel + } - TextField { - id: newMetnoCityLatitudeField - Layout.fillWidth: true - validator: DoubleValidator { bottom: -90; top: 90; decimals: 5 } - textColor: acceptableInput ? newMetnoCityLatitudeLabel.color : "red" - onTextChanged: { - updateUrl() + HorizontalHeaderView { + id: mysearchhorizontalHeader + syncView: searchtableView + clip: true + model: ListModel { + Component.onCompleted: { + append({ display: i18n("Location") }); + append({ display: i18n("Area") }); + append({ display: i18n("Latitude") }); + append({ display: i18n("Longitude") }); + append({ display: i18n("Alt") }); + append({ display: i18n("Timezone") }); + // append({ display: ("TBA") }); } } + } - Item { - width: 20 - } - - Label { - id: newMetnoCityLongitudeLabel - text: i18n("Longitude")+":" - } - - TextField { - id: newMetnoCityLongitudeField - Layout.fillWidth: true - validator: DoubleValidator { bottom: -180; top: 180; decimals: 5 } - textColor: acceptableInput ? newMetnoCityLongitudeLabel.color : "red" - onTextChanged: { - updateUrl() - } - - } - - Item { - width: 20 - } + ScrollView { + id: placesTable1 + width: parent.width + clip: true + Layout.preferredHeight: 180 + Layout.preferredWidth: parent.width + Layout.maximumHeight: 180 - Label { - id: newMetnoCityAltitudeLabel - text: i18n("Altitude")+":" - } + Layout.columnSpan: 2 + // anchors.fill: parent + anchors.bottom: row2.top + anchors.right: parent.right + anchors.left: parent.left + anchors.top: parent.top + // anchors.bottomMargin: 10 + anchors.topMargin: mysearchhorizontalHeader.height + 2 + + TableView { + id: searchtableView + anchors.fill: parent + anchors.bottomMargin: 10 + placesTable1.effectiveScrollBarHeight + anchors.rightMargin: 10 + placesTable1.effectiveScrollBarWidth + // verticalScrollBarPolicy: Qt.ScrollBarAsNeeded + // highlightOnFocus: true + property var columnWidths: [30, 15, 15, 12, 12, 30, -1] + property int selectedRow: -1 + columnWidthProvider: function (column) { + let aw = placesTable1.width - placesTable1.effectiveScrollBarWidth + return parseInt(aw * columnWidths[column] / 100 ) - TextField { - id: newMetnoCityAltitudeField - Layout.fillWidth: true - validator: IntValidator { bottom: -999; top: 5000 } - textColor: acceptableInput ? newMetnoCityAltitudeLabel.color : "red" - onTextChanged: { - updateUrl() } - } - Label { - text: i18n("URL")+":" - } - TextField { - id: newMetnoUrl - placeholderText: i18n("URL") - Layout.columnSpan: 5 - Layout.fillWidth: true - textColor: acceptableInput ? newMetnoCityAltitudeLabel.color : "red" - - function updateFields() { - function localiseFloat(data) { - return Number(data).toLocaleString(Qt.locale(),"f",5) + model: filteredCSVData + clip: true + interactive: true + rowSpacing: 1 + columnSpacing: 1 + + boundsBehavior: Flickable.StopAtBounds + implicitHeight: 200 + implicitWidth: 600 + Layout.maximumHeight: 200 + + + selectionBehavior: TableView.SelectRows + selectionModel: ItemSelectionModel { } + + delegate: searchtableChooser + + DelegateChooser { + id: searchtableChooser + DelegateChoice { + column: 0 + + delegate: Rectangle { + required property bool selected + required property bool current + border.width: current ? 2 : 0 + implicitWidth: searchtableView.width * 0.3 + implicitHeight: defaultFontPixelSize + 4 + color: (row === searchtableView.selectedRow) ? highlightColor : (row % 2) === 0 ? backgroundColor : alternateBackgroundColor + Text { + text: display + color: Kirigami.Theme.textColor + font.family: Kirigami.Theme.defaultFont.family + font.pixelSize: defaultFontPixelSize + anchors.verticalCenter: parent.verticalCenter + anchors.fill: parent + } + MouseArea { + anchors.fill: parent + onClicked: { + searchtableView.selectedRow = row + } + onDoubleClicked: { + saveSearchedData.rowNumber = row + saveSearchedData.visible = true + saveSearchedData.open() + } + } + } } - - var data=newMetnoUrl.text.match(RegExp("([+-]?[0-9]{1,5}[.]?[0-9]{0,5})","g")) - if (data === undefined) - return - if (data.length === 3) { - var newlat = localiseFloat(data[0]) - var newlon = localiseFloat(data[1]) - var newalt = Number(data[2]) - if ((! newMetnoCityLatitudeField.acceptableInput) || (newMetnoCityLatitudeField.text.length === 0) || (newMetnoCityLatitudeField.text !== newlat)) { - newMetnoCityLatitudeField.text = newlat + DelegateChoice { + column: 1 + delegate: Rectangle { + implicitHeight: defaultFontPixelSize + 4 + // implicitWidth: searchtableView.width * 0.1 + color: (row === searchtableView.selectedRow) ? highlightColor : (row % 2) === 0 ? backgroundColor : alternateBackgroundColor + Text { + text: display + color: Kirigami.Theme.textColor + font.family: Kirigami.Theme.defaultFont.family + font.pixelSize: defaultFontPixelSize + anchors.verticalCenter: parent.verticalCenter + } + MouseArea { + anchors.fill: parent + onClicked: { + searchtableView.selectedRow = row + } + onDoubleClicked: { + saveSearchedData.rowNumber = row + saveSearchedData.visible = true + saveSearchedData.open() + } + } } - if ((! newMetnoCityLongitudeField.acceptableInput) || (newMetnoCityLongitudeField.text.length === 0) || (newMetnoCityLongitudeField.text !== newlon)) { - newMetnoCityLongitudeField.text = newlon + } + DelegateChoice { + column: 2 + delegate: Rectangle { + required property bool selected + required property bool current + implicitHeight: defaultFontPixelSize + 4 + color: (row === searchtableView.selectedRow) ? highlightColor : (row % 2) === 0 ? backgroundColor : alternateBackgroundColor + Text { + text: display + color: Kirigami.Theme.textColor + font.family: Kirigami.Theme.defaultFont.family + font.pixelSize: defaultFontPixelSize + anchors.verticalCenter: parent.verticalCenter + } + MouseArea { + anchors.fill: parent + onClicked: { + searchtableView.selectedRow = row + } + onDoubleClicked: { + saveSearchedData.rowNumber = row + saveSearchedData.visible = true + saveSearchedData.open() + } + } } - if ((! newMetnoCityAltitudeField.acceptableInput) || (newMetnoCityAltitudeField.text.length === 0) || (newMetnoCityAltitudeField.text !== data[2])) { -// if ((newalt >= newMetnoCityAltitudeField.validator.bottom) && (newalt <= newMetnoCityAltitudeField.validator.top)) { - newMetnoCityAltitudeField.text = data[2] -// } + } + DelegateChoice { + column: 3 + delegate: Rectangle { + implicitHeight: defaultFontPixelSize + 4 + color: (row === searchtableView.selectedRow) ? highlightColor : (row % 2) === 0 ? backgroundColor : alternateBackgroundColor + Text { + text: display + color: Kirigami.Theme.textColor + font.family: Kirigami.Theme.defaultFont.family + font.pixelSize: defaultFontPixelSize + anchors.verticalCenter: parent.verticalCenter + } + MouseArea { + anchors.fill: parent + onClicked: { + searchtableView.selectedRow = row + } + onDoubleClicked: { + saveSearchedData.rowNumber = row + saveSearchedData.visible = true + saveSearchedData.open() + } + } + } + } + DelegateChoice { + column: 4 + delegate: Rectangle { + implicitHeight: defaultFontPixelSize + 4 + color: (row === searchtableView.selectedRow) ? highlightColor : (row % 2) === 0 ? backgroundColor : alternateBackgroundColor + Text { + text: display + color: Kirigami.Theme.textColor + font.family: Kirigami.Theme.defaultFont.family + font.pixelSize: defaultFontPixelSize + anchors.verticalCenter: parent.verticalCenter + } + MouseArea { + anchors.fill: parent + onClicked: { + searchtableView.selectedRow = row + } + onDoubleClicked: { + saveSearchedData.rowNumber = row + saveSearchedData.visible = true + saveSearchedData.open() + } + } + } + } + DelegateChoice { + column: 5 + delegate: Rectangle { + height: defaultFontPixelSize + 4 + color: (row === searchtableView.selectedRow) ? highlightColor : (row % 2) === 0 ? backgroundColor : alternateBackgroundColor + Text { + text: display + color: Kirigami.Theme.textColor + font.family: Kirigami.Theme.defaultFont.family + font.pixelSize: defaultFontPixelSize + anchors.verticalCenter: parent.verticalCenter + } + MouseArea { + anchors.fill: parent + onClicked: { + searchtableView.selectedRow = row + } + onDoubleClicked: { + saveSearchedData.rowNumber = row + saveSearchedData.visible = true + saveSearchedData.open() + } + } } } } - - - - onTextChanged: { - updateFields() - } - - onEditingFinished: { - updateFields() - } - } - QC215.ComboBox { - id: tzComboBox - model: timezoneDataModel - currentIndex: -1 - textRole: "displayName" - Layout.columnSpan: 2 - Layout.fillWidth: true - onCurrentIndexChanged: { - if (tzComboBox.currentIndex > 0) { - addMetnoCityIdDialog.timezoneID = timezoneDataModel.get(tzComboBox.currentIndex).id - } - } - } - Label { - text: i18n("Place Identifier")+":" - } - TextField { - id: newMetnoCityAlias - placeholderText: i18n("City alias") - Layout.columnSpan: 6 - Layout.fillWidth: true - } - Button { - text: i18n("Search") - Layout.alignment: Qt.AlignRight - onClicked: { - searchWindow.open() - } } } - } - - Dialog { - id: changePlaceAliasDialog - title: i18n("Change Displayed As") - - standardButtons: StandardButton.Ok | StandardButton.Cancel - - onAccepted: { - placesModel.setProperty(changePlaceAliasDialog.tableIndex, 'placeAlias', newPlaceAliasField.text) - placesModelChanged() - changePlaceAliasDialog.close() - } - - property int tableIndex: 0 - - TextField { - id: newPlaceAliasField - placeholderText: i18n("Enter place alias") - width: parent.width - } - } - - Dialog { - title: i18n("Location Search") - id: searchWindow - width: 640 - height: 400 - standardButtons: StandardButton.Ok | StandardButton.Cancel + standardButtons: Dialog.Ok | Dialog.Cancel onAccepted: { - if(tableView.currentRow > -1) { + if (searchtableView.selectedRow > -1) { + saveSearchedData.rowNumber = searchtableView.selectedRow + saveSearchedData.visible = true saveSearchedData.open() } } - Component.onCompleted: { - let locale=Qt.locale().name.substr(3,2) - let userCountry=Helper.getDisplayName(locale) - let tmpDB=Helper.getDisplayNames() + onOpened: { + let locale = Qt.locale().name.substr(3,2) + dbgprint(locale) + let userCountry = Helper.getDisplayName(locale) + let tmpDB = Helper.getDisplayNames() for (var i=0; i < tmpDB.length - 1 ; i++) { countryCodesModel.append({ id: tmpDB[i] }) if (tmpDB[i] === userCountry) { countryList.currentIndex = i } } - } - TableView { - id: tableView - height: 140 - verticalScrollBarPolicy: Qt.ScrollBarAsNeeded - highlightOnFocus: true - anchors.bottom: row2.top - anchors.right: parent.right - anchors.left: parent.left - anchors.top: parent.top - anchors.bottomMargin: 10 - model: filteredCSVData - TableViewColumn { role: "locationName"; title: i18n("Location") } - TableViewColumn { role: "region"; title: i18n("Area"); width :75 } - TableViewColumn { role: "latitude"; title: i18n("Latitude"); width :75 } - TableViewColumn { role: "longitude"; title: i18n("Longitude"); width :75 } - TableViewColumn { role: "altitude"; title: i18n("Altitude"); width :75} - TableViewColumn { role: "timezoneName"; title: i18n("Timezone"); width :100} - onDoubleClicked: { - saveSearchedData.open() - } + dbgprint(Helper.getshortCode(userCountry)) } Item { id: row1 @@ -549,13 +1242,13 @@ Item { anchors.bottomMargin: 0 Label { id: countryLabel - text: i18n("Country:") + text: i18n("Country") + ":" anchors.left: parent.left anchors.leftMargin: 10 anchors.verticalCenter: parent.verticalCenter } - QC215.ComboBox { + ComboBox { id: countryList anchors.left: countryLabel.right anchors.leftMargin: 20 @@ -566,8 +1259,11 @@ Item { editable: false onCurrentIndexChanged: { if (countryList.currentIndex > 0) { + // dbgprint("Loading Database: "+countryList.textAt(countryList.currentIndex)) Helper.loadCSVDatabase(countryList.textAt(countryList.currentIndex)) + // Helper.loadCSVDatabase("Malta") } + dbgprint(myCSVData.length) } } Label { @@ -575,7 +1271,7 @@ Item { anchors.right: locationEdit.left anchors.rightMargin: 10 anchors.verticalCenter: parent.verticalCenter - text: i18n("Filter:") + text: i18n("Filter") + ":" } TextField { id: locationEdit @@ -597,361 +1293,58 @@ Item { } } } - - - - ListModel { - id: myCSVData - } - ListModel { - id: countryCodesModel - } - ListModel { - id: filteredCSVData - } - ListModel { - id: timezoneDataModel - } } - ColumnLayout{ - id: rhsColumn - width: parent.width - - Label { - text: i18n("Plasmoid version:") + ' 2.3.4' - Layout.alignment: Qt.AlignRight - } - - Label { - text: i18n("Location") - font.bold: true - Layout.alignment: Qt.AlignLeft - } - - TableView { - id: placesTable - width: parent.width - - TableViewColumn { - id: providerIdCol - role: 'providerId' - title: i18n("Source") - width: parent.width * 0.1 - - delegate: Label { - text: styleData.value - elide: Text.ElideRight - anchors.left: parent ? parent.left : undefined - anchors.leftMargin: 5 - anchors.right: parent ? parent.right : undefined - anchors.rightMargin: 5 - } - } - TableViewColumn { - id: placeIdentifierCol - role: 'placeIdentifier' - title: i18n("Place Identifier") - width: parent.width * 0.4 - delegate: Label { - text: styleData.value - elide: Text.ElideRight - anchors.left: parent ? parent.left : undefined - anchors.leftMargin: 5 - anchors.right: parent ? parent.right : undefined - anchors.rightMargin: 5 - } + Loader { + id: saveSearchedData + property int rowNumber + function open() { + if (item) { + item.open(); + } else { + active = true; } + item.visible = true; + } - TableViewColumn { - role: 'placeAlias' - title: i18n("Displayed as") - width: parent.width * 0.2 - - delegate: MouseArea { - - anchors.fill: parent - - Label { - id: placeAliasText - text: styleData.value - height: parent.height - anchors.left: parent.left - anchors.leftMargin: 5 - anchors.right: parent.right - anchors.rightMargin: 5 - } - - PlasmaCore.IconItem { - id: noAliasWarningIcon - anchors.left: parent.left - anchors.leftMargin: 5 - visible: placeAliasText.text === '' - height: parent.height - width: height - source: 'document-edit' - } + active: false - cursorShape: Qt.PointingHandCursor + sourceComponent: Dialog { + title: i18n("Confirmation") + z:2 + standardButtons: Dialog.Yes | Dialog.No + visible: true + Text { + anchors.fill: parent + text: i18n("Do you want to select") + " \"" + filteredCSVData.getRow(saveSearchedData.rowNumber).Location + "\" ?" - onClicked: { - changePlaceAliasDialog.open() - changePlaceAliasDialog.tableIndex = styleData.row - newPlaceAliasField.text = placeAliasText.text - newPlaceAliasField.focus = true - } - } } - - TableViewColumn { - title: i18n("Action") - width: parent.width * 0.2 - - delegate: Item { - - GridLayout { - height: parent.height - columns: 4 - rowSpacing: 0 - - Button { - iconName: 'go-up' - Layout.fillHeight: true - onClicked: { - placesModel.move(styleData.row, styleData.row - 1, 1) - placesModelChanged() - } - enabled: styleData.row > 0 - } - - Button { - iconName: 'go-down' - Layout.fillHeight: true - onClicked: { - placesModel.move(styleData.row, styleData.row + 1, 1) - placesModelChanged() - } - enabled: styleData.row < placesModel.count - 1 - } - - Button { - iconName: 'list-remove' - Layout.fillHeight: true - onClicked: { - placesModel.remove(styleData.row) - placesModelChanged() - } - } - Button { - iconName: 'entry-edit' - Layout.fillHeight: true - onClicked: { - editEntryNumber = styleData.row - let entry = placesModel.get(styleData.row) - if (entry.providerId === "metno") { - let url=entry.placeIdentifier - newMetnoUrl.text = url - var data = url.match(RegExp("([+-]?[0-9]{1,5}[.]?[0-9]{0,5})","g")) - newMetnoCityLatitudeField.text = Number(data[0]).toLocaleString(Qt.locale(),"f",5) - newMetnoCityLongitudeField.text = Number(data[1]).toLocaleString(Qt.locale(),"f",5) - newMetnoCityAltitudeField.text = (data[2] === undefined) ? 0:data[2] - for (var i = 0; i < timezoneDataModel.count; i++) { - if (timezoneDataModel.get(i).id == Number(entry.timezoneID)) { - tzComboBox.currentIndex = i - addMetnoCityIdDialog.timezoneID = entry.timezoneID - break - } - } - newMetnoCityAlias.text = entry.placeAlias - addMetnoCityIdDialog.open() - } - if (entry.providerId === "owm") { - newOwmCityIdField.text = "https://openweathermap.org/city/"+entry.placeIdentifier - newOwmCityAlias.text = entry.placeAlias - addOwmCityIdDialog.open() - } - } - } + onAccepted: { + let data = filteredCSVData.getRow(rowNumber) + newMetnoCityLatitudeField.text = data["Latitude"] + newMetnoCityLongitudeField.text = data["Longitude"] + newMetnoCityAltitudeField.text = data["Altitude"] + newMetnoUrl.text="lat="+data["Latitude"]+"&lon="+data["Longitude"]+"&altitude="+data["Altitude"] + let loc = data["Location"]+", "+Helper.getshortCode(countryList.textAt(countryList.currentIndex)) + newMetnoCityAlias.text = loc + addMetnoCityIdDialog.timezoneID = data["timezoneId"] + for (var i=0; i < timezoneDataModel.count; i++) { + if (timezoneDataModel.get(i).id == Number(data["timezoneId"])) { + tzComboBox.currentIndex = i + break } } - - } - model: placesModel - Layout.preferredHeight: 150 - Layout.preferredWidth: parent.width - Layout.columnSpan: 2 - } - - Row { - Button { - iconName: 'list-add' - text: 'OWM' - width: 100 - onClicked: { - editEntryNumber = -1 - addOwmCityIdDialog.open() - newOwmCityIdField.text = '' - newOwmCityAlias.text = '' - newOwmCityIdField.focus = true - } - } - - Button { - iconName: 'list-add' - text: 'metno' - width: 100 - onClicked: { - editEntryNumber = -1 - newMetnoCityAlias.text = '' - newMetnoCityLatitudeField.text = '' - newMetnoCityLongitudeField.text = '' - newMetnoCityAltitudeField.text = '' - newMetnoUrl.text = '' - newMetnoCityLatitudeField.focus = true - addMetnoCityIdDialog.open() - } - } - } - - Label { - topPadding: 16 - bottomPadding: 4 - text: i18n("Miscellaneous") - font.bold: true - Layout.alignment: Qt.AlignLeft - } - - Row { - Label { - text: i18n("Reload interval:") - Layout.alignment: Qt.AlignLeft - anchors.verticalCenter: parent.verticalCenter - rightPadding: 6 + searchWindow.close() + addMetnoCityIdDialog.open() + updatenewMetnoCityOKButton() } - SpinBox { - id: reloadIntervalMin - decimals: 0 - stepSize: 10 - minimumValue: 20 - maximumValue: 120 - suffix: i18nc("Abbreviation for minutes", "min") + onRejected: { + visible = false + searchWindow.visible = true } } - - CheckBox { - id: debugLogging - checked: false - text: "Debug" - Layout.alignment: Qt.AlignLeft - visible: false - } } - Item { - anchors.bottom: parent.bottom - anchors.left: parent.left - anchors.right: parent.right - Label { - id: attribution1 - anchors.bottom: attribution2.top - anchors.bottomMargin: 2 - font.pointSize: 8 - text: i18n("Met.no weather forecast data provided by The Norwegian Meteorological Institute.") - } - Label { - id: attribution2 - anchors.bottom: attribution3.top - anchors.bottomMargin: 2 - font.pointSize: 8 - text: i18n("Sunrise/sunset data provided by Sunrise - Sunset.") - } - Label { - id: attribution3 - anchors.bottom: attribution4.top - anchors.bottomMargin: 2 - font.pointSize: 8 - text: i18n("OWM weather forecast data provided by OpenWeather.") - } - Label { - id: attribution4 - anchors.bottom: parent.bottom - anchors.bottomMargin: 2 - font.pointSize: 8 - text: i18n("Weather icons created by Erik Flowers.") - } - MouseArea { - cursorShape: Qt.PointingHandCursor - anchors.fill: attribution1 - - hoverEnabled: true - - onClicked: { - Qt.openUrlExternally('https://www.met.no/en/About-us') - } - - onEntered: { - owmLink.font.underline = true - } - - onExited: { - owmLink.font.underline = false - } - } - MouseArea { - cursorShape: Qt.PointingHandCursor - anchors.fill: attribution2 - - hoverEnabled: true - - onClicked: { - Qt.openUrlExternally('https://sunrise-sunset.org/about') - } - - onEntered: { - owmLink.font.underline = true - } - - onExited: { - owmLink.font.underline = false - } - } - MouseArea { - cursorShape: Qt.PointingHandCursor - anchors.fill: attribution3 - - hoverEnabled: true - - onClicked: { - Qt.openUrlExternally('https://openweathermap.org/about-us') - } - - onEntered: { - owmLink.font.underline = true - } - - onExited: { - owmLink.font.underline = false - } - } - MouseArea { - cursorShape: Qt.PointingHandCursor - anchors.fill: attribution4 - - hoverEnabled: true - - onClicked: { - Qt.openUrlExternally('https://erikflowers.github.io/weather-icons/') - } - - onEntered: { - owmLink.font.underline = true - } - - onExited: { - owmLink.font.underline = false - } - } - } } diff --git a/package/contents/ui/config/ConfigUnits.qml b/package/contents/ui/config/ConfigUnits.qml index bd406e5..5f13616 100644 --- a/package/contents/ui/config/ConfigUnits.qml +++ b/package/contents/ui/config/ConfigUnits.qml @@ -1,71 +1,73 @@ -import QtQuick 2.2 -import QtQuick.Controls 1.3 -import QtQuick.Layouts 1.1 +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts +import org.kde.kcmutils as KCM -Item { +KCM.SimpleKCM { property int cfg_temperatureType property int cfg_pressureType property int cfg_windSpeedType property int cfg_timezoneType + onCfg_temperatureTypeChanged: { switch (cfg_temperatureType) { - case 0: - temperatureTypeGroup.current = temperatureTypeRadioCelsius; - break; - case 1: - temperatureTypeGroup.current = temperatureTypeRadioFahrenheit; - break; - case 2: - temperatureTypeGroup.current = temperatureTypeRadioKelvin; - break; - default: + case 0: + temperatureTypeRadioCelsius.checked = true + break + case 1: + temperatureTypeRadioFahrenheit.checked = true + break + case 2: + temperatureTypeRadioKelvin.checked = true + break + default: } } onCfg_pressureTypeChanged: { switch (cfg_pressureType) { - case 0: - pressureTypeGroup.current = pressureTypeRadioHpa; - break; - case 1: - pressureTypeGroup.current = pressureTypeRadioInhg; - break; - case 2: - pressureTypeGroup.current = pressureTypeRadioMmhg; - break; - default: + case 0: + pressureTypeRadioHpa.checked = true + break + case 1: + pressureTypeRadioInhg.checked = true + break + case 2: + pressureTypeRadioMmhg.checked = true + break + default: } } onCfg_windSpeedTypeChanged: { switch (cfg_windSpeedType) { - case 0: - windSpeedTypeGroup.current = windSpeedTypeRadioMps; - break; - case 1: - windSpeedTypeGroup.current = windSpeedTypeRadioMph; - break; - case 2: - windSpeedTypeGroup.current = windSpeedTypeRadioKmh; - break; - default: + case 0: + windSpeedTypeRadioMps.checked = true + break + case 1: + windSpeedTypeRadioMph.checked = true + break + case 2: + windSpeedTypeRadioKmh.checked = true + break + default: } } onCfg_timezoneTypeChanged: { switch (cfg_timezoneType) { - case 0: - timezoneTypeGroup.current = timezoneTypeRadioUserLocalTime; - break; - case 1: - timezoneTypeGroup.current = timezoneTypeRadioUtc; - break; - case 2: - timezoneTypeGroup.current = timezoneTypeRadioLocationLocal; - break; - default: + case 0: + timezoneTypeRadioUserLocalTime.checked = true + break + case 1: + timezoneTypeRadioUtc.checked = true + break + case 2: + timezoneTypeRadioLocationLocal.checked = true + break + default: } } @@ -76,19 +78,19 @@ Item { cfg_timezoneTypeChanged() } - ExclusiveGroup { + ButtonGroup { id: temperatureTypeGroup } - ExclusiveGroup { + ButtonGroup { id: pressureTypeGroup } - ExclusiveGroup { + ButtonGroup { id: windSpeedTypeGroup } - ExclusiveGroup { + ButtonGroup { id: timezoneTypeGroup } @@ -96,12 +98,12 @@ Item { columns: 2 Label { - text: i18n("Temperature:") + text: i18n("Temperature") + ":" Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } RadioButton { id: temperatureTypeRadioCelsius - exclusiveGroup: temperatureTypeGroup + ButtonGroup.group: temperatureTypeGroup text: i18n("°C") onCheckedChanged: if (checked) cfg_temperatureType = 0 } @@ -112,7 +114,7 @@ Item { } RadioButton { id: temperatureTypeRadioFahrenheit - exclusiveGroup: temperatureTypeGroup + ButtonGroup.group: temperatureTypeGroup text: i18n("°F") onCheckedChanged: if (checked) cfg_temperatureType = 1 } @@ -123,7 +125,7 @@ Item { } RadioButton { id: temperatureTypeRadioKelvin - exclusiveGroup: temperatureTypeGroup + ButtonGroup.group: temperatureTypeGroup text: i18n("K") onCheckedChanged: if (checked) cfg_temperatureType = 2 } @@ -135,12 +137,12 @@ Item { } Label { - text: i18n("Pressure:") + text: i18n("Pressure") + ":" Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } RadioButton { id: pressureTypeRadioHpa - exclusiveGroup: pressureTypeGroup + ButtonGroup.group: pressureTypeGroup text: i18n("hPa") onCheckedChanged: if (checked) cfg_pressureType = 0 } @@ -151,13 +153,13 @@ Item { } RadioButton { id: pressureTypeRadioInhg - exclusiveGroup: pressureTypeGroup + ButtonGroup.group: pressureTypeGroup text: i18n("inHg") onCheckedChanged: if (checked) cfg_pressureType = 1 } RadioButton { id: pressureTypeRadioMmhg - exclusiveGroup: pressureTypeGroup + ButtonGroup.group: pressureTypeGroup text: i18n("mmHg") onCheckedChanged: if (checked) cfg_pressureType = 2 } @@ -169,12 +171,12 @@ Item { } Label { - text: i18n("Wind speed:") + text: i18n("Wind speed") + ":" Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } RadioButton { id: windSpeedTypeRadioMps - exclusiveGroup: windSpeedTypeGroup + ButtonGroup.group: windSpeedTypeGroup text: i18n("m/s") onCheckedChanged: if (checked) cfg_windSpeedType = 0 } @@ -185,13 +187,13 @@ Item { } RadioButton { id: windSpeedTypeRadioMph - exclusiveGroup: windSpeedTypeGroup + ButtonGroup.group: windSpeedTypeGroup text: i18n("mph") onCheckedChanged: if (checked) cfg_windSpeedType = 1 } RadioButton { id: windSpeedTypeRadioKmh - exclusiveGroup: windSpeedTypeGroup + ButtonGroup.group: windSpeedTypeGroup text: i18n("km/h") onCheckedChanged: if (checked) cfg_windSpeedType = 2 } @@ -203,12 +205,12 @@ Item { } Label { - text: i18n("Timezone:") + text: i18n("Timezone") + ":" Layout.alignment: Qt.AlignVCenter | Qt.AlignRight } RadioButton { id: timezoneTypeRadioUserLocalTime - exclusiveGroup: timezoneTypeGroup + ButtonGroup.group: timezoneTypeGroup text: i18n("My local-time") onCheckedChanged: if (checked) cfg_timezoneType = 0 } @@ -219,7 +221,7 @@ Item { } RadioButton { id: timezoneTypeRadioUtc - exclusiveGroup: timezoneTypeGroup + ButtonGroup.group: timezoneTypeGroup text: i18n("UTC") onCheckedChanged: if (checked) cfg_timezoneType = 1 } @@ -230,7 +232,7 @@ Item { } RadioButton { id: timezoneTypeRadioLocationLocal - exclusiveGroup: timezoneTypeGroup + ButtonGroup.group: timezoneTypeGroup text: i18n("Location Timezone") onCheckedChanged: if (checked) cfg_timezoneType = 2 } diff --git a/package/contents/ui/main.qml b/package/contents/ui/main.qml index f2c37f5..2554030 100644 --- a/package/contents/ui/main.qml +++ b/package/contents/ui/main.qml @@ -14,258 +14,234 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import QtQuick 2.2 -import QtQuick.Layouts 1.1 -import org.kde.plasma.plasmoid 2.0 -import org.kde.plasma.core 2.0 as PlasmaCore -import QtQuick.Controls 1.0 +import QtQuick 2.15 +import QtQuick.Layouts +import org.kde.plasma.plasmoid +import org.kde.plasma.core as PlasmaCore +import QtQuick.Controls +import org.kde.plasma.components 3.0 as PlasmaComponents +import org.kde.plasma.plasma5support as Plasma5Support +import org.kde.kirigami as Kirigami +import "providers" import "../code/data-loader.js" as DataLoader import "../code/config-utils.js" as ConfigUtils import "../code/icons.js" as IconTools import "../code/unit-utils.js" as UnitUtils -import "providers" +import "../code/timezoneData.js" as TZ -Item { +PlasmoidItem { id: main - property string placeIdentifier - property string placeAlias - property string cacheKey - property int timezoneID - property string timezoneShortName - property int timezoneOffset - property var cacheMap: {} - property bool renderMeteogram: plasmoid.configuration.renderMeteogram - property int temperatureType: plasmoid.configuration.temperatureType - property int pressureType: plasmoid.configuration.pressureType - property int windSpeedType: plasmoid.configuration.windSpeedType - property int timezoneType: plasmoid.configuration.timezoneType - property string widgetFontName: plasmoid.configuration.widgetFontName - property int widgetFontSize: plasmoid.configuration.widgetFontSize - - property bool twelveHourClockEnabled: Qt.locale().timeFormat(Locale.ShortFormat).toString().indexOf('AP') > -1 - property string placesJsonStr: plasmoid.configuration.places - property bool onlyOnePlace: true - - property string datetimeFormat: 'yyyy-MM-dd\'T\'hh:mm:ss' - property var xmlLocale: Qt.locale('en_GB') - property var additionalWeatherInfo: {} - - property string overviewImageSource - property string creditLink - property string creditLabel - - property int reloadIntervalMin: plasmoid.configuration.reloadIntervalMin // Download Attempt Frequency in minutes - property int reloadIntervalMs: reloadIntervalMin * 60 * 1000 // Download Attempt Frequency in milliseconds - - - property double lastloadingStartTime: 0 // Time download last attempted. - property double lastloadingSuccessTime: 0 // Time download last successful. - property double nextReload: 0 // Time next download is due. - - property bool loadingData: false // Download Attempt in progress Flag. - property int loadingDataTimeoutMs: 15000 // Download Timeout in ms. - property var loadingXhrs: [] // Array of Download Attempt Objects - property bool loadingError: false // Whether the last Download Attempt was successful - property bool imageLoadingError: true - property bool alreadyLoadedFromCache: false - - property string lastReloadedText: '⬇ 0m ago' - property string tooltipSubText: '' - - property bool vertical: (plasmoid.formFactor == PlasmaCore.Types.Vertical) - property bool onDesktop: (plasmoid.location == PlasmaCore.Types.Desktop || plasmoid.location == PlasmaCore.Types.Floating) - property bool inTray: false - property string plasmoidCacheId: plasmoid.id - - property int inTrayActiveTimeoutSec: plasmoid.configuration.inTrayActiveTimeoutSec - - property int nextDaysCount: 8 - - property bool textColorLight: ((theme.textColor.r + theme.textColor.g + theme.textColor.b) / 3) > 0.5 - - // 0 - standard - // 1 - vertical - // 2 - compact - property int layoutType: plasmoid.configuration.layoutType - - property bool updatingPaused: true - - property var currentProvider: null - - property bool meteogramModelChanged: false - - anchors.fill: parent - - property Component crInTray: CompactRepresentationInTray { } - property Component cr: CompactRepresentation { } - - property Component frInTray: FullRepresentationInTray { } - property Component fr: FullRepresentation { } - - Plasmoid.preferredRepresentation: Plasmoid.compactRepresentation - Plasmoid.compactRepresentation: cr - Plasmoid.fullRepresentation: fr - - property bool debugLogging: plasmoid.configuration.debugLogging - + /* Includes */ + WeatherCache { + id: weatherCache + cacheId: cacheData.plasmoidCacheId + } + Plasma5Support.DataSource { + id: dataSource + engine: "time" + connectedSources: ["Local"] + interval: 0 + } FontLoader { - source: '../fonts/weathericons-regular-webfont-2.0.10.ttf' + source: "../fonts/weathericons-regular-webfont-2.0.10.ttf" } - MetNo { id: metnoProvider } - OpenWeatherMap { id: owmProvider } + property bool loadingDataComplete: false - ListModel { - id: actualWeatherModel - } + /* GUI layout stuff */ + property Component fr: FullRepresentation { } + property Component cr: CompactRepresentation { } + property Component frInTray: FullRepresentationInTray { } + property Component crInTray: CompactRepresentationInTray { } + + compactRepresentation: inTray ? crInTray : cr + fullRepresentation: inTray ? frInTray : fr + + switchWidth: inTray ? 256 : undefined + switchHeight: inTray ? 128 : undefined + + preferredRepresentation: inTray ? undefined: compactRepresentation + + property bool vertical: (plasmoid.formFactor === PlasmaCore.Types.Vertical) + property bool onDesktop: (plasmoid.location === PlasmaCore.Types.Desktop || plasmoid.location === PlasmaCore.Types.Floating) + + toolTipTextFormat: Text.RichText + + // User Preferences + property int layoutType: plasmoid.configuration.layoutType + property bool debugLogging: plasmoid.configuration.debugLogging + property int inTrayActiveTimeoutSec: plasmoid.configuration.inTrayActiveTimeoutSec + property string widgetFontName: (plasmoid.configuration.widgetFontName === "") ? Kirigami.Theme.defaultFont : plasmoid.configuration.widgetFontName + property int widgetFontSize: plasmoid.configuration.widgetFontSize + property int temperatureType: plasmoid.configuration.temperatureType + property int timezoneType: plasmoid.configuration.timezoneType + property int pressureType: plasmoid.configuration.pressureType + property int windSpeedType: plasmoid.configuration.windSpeedType + property bool twelveHourClockEnabled: Qt.locale().timeFormat(Locale.ShortFormat).toString().indexOf('AP') > -1 + property bool env_QML_XHR_ALLOW_FILE_READ: plasmoid.configuration.qml_XHR_ALLOW_FILE_READ + property bool inTray: (plasmoid.containment.containmentType === 129) && ((plasmoid.formFactor === 2) || (plasmoid.formFactor === 3)) + readonly property string placesStr: plasmoid.configuration.places + + // Cache, Last Load Time, Widget Status + property string fullRepresentationAlias + property string iconNameStr + property string temperatureStr + property bool meteogramModelChanged: false + property int nextDaysCount + + property var loadingData: ({ + loadingDatainProgress: false, // Download Attempt in progress Flag. + loadingDataTimeoutMs: 15000, // Download Timeout in ms. + loadingXhrs: [], // Array of Download Attempt Objects + loadingError: false, // Whether the last Download Attempt was successful + lastloadingStartTime: 0, // Time download last attempted. + lastloadingSuccessTime: 0, // Time download last successful. + failedAttemptCount: 0 + }) + property string lastReloadedText: "⬇ " + i18n("%1 ago", "?? m") + + property var cacheData: ({ + plasmoidCacheId: plasmoid.id, + cacheKey: "", + cacheMap: ({}) + }) + + // Current Place Data + property var currentPlace: ({ + alias: "", + identifier: "", + provider: "", + providerId:"", + timezoneID: 0, + timezoneShortName: "", + timezoneOffset: 0, + creditLink: "", + creditLabel: "", + cacheID: "", + nextReload: 0 + }) + + property int placesCount + + property var timerData: ({ + reloadIntervalMin: 0 , // Download Attempt Frequency in minutes + reloadIntervalMs: 0, // Download Attempt Frequency in milliseconds + nextReload: 0 // Time next download is due. + }) + + + + property bool useOnlineWeatherData: true + + + /* Data Models */ + property var currentWeatherModel ListModel { id: nextDaysModel } - ListModel { id: meteogramModel } - function action_toggleUpdatingPaused() { - updatingPaused = !updatingPaused - abortTooLongConnection(true) - plasmoid.setAction('toggleUpdatingPaused', updatingPaused ? i18n("Resume Updating") : i18n("Pause Updating"), updatingPaused ? 'media-playback-start' : 'media-playback-pause'); - } - WeatherCache { - id: weatherCache - cacheId: plasmoidCacheId - } - PlasmaCore.DataSource { - id: dataSource - engine: "time" - connectedSources: ["Local"] - interval: 0 + onLoadingDataCompleteChanged: { + dbgprint2("loadingDataComplete:" + loadingDataComplete) } - Component.onCompleted: { - if (plasmoid.configuration.firstRun) { - if (plasmoid.configuration.widgetFontSize === undefined) { - plasmoid.configuration.widgetFontSize = 32 - widgetFontSize = 32 - } - switch (Qt.locale().measurementSystem) { - case (Locale.MetricSystem): - plasmoid.configuration.temperatureType = 0 - plasmoid.configuration.pressureType = 0 - plasmoid.configuration.windSpeedType = 2 - break; - case (Locale.ImperialUSSystem): - plasmoid.configuration.temperatureType = 1 - plasmoid.configuration.pressureType = 1 - plasmoid.configuration.windSpeedType = 1 - break; - case (Locale.ImperialUKSystem): - plasmoid.configuration.temperatureType = 0 - plasmoid.configuration.pressureType = 0 - plasmoid.configuration.windSpeedType = 1 - break; - } - plasmoid.configuration.firstRun = false - } - inTray = (plasmoid.parent !== null && (plasmoid.parent.pluginName === 'org.kde.plasma.private.systemtray' || plasmoid.parent.objectName === 'taskItemContainer')) - plasmoidCacheId = inTray ? plasmoid.parent.id : plasmoid.id - dbgprint('inTray=' + inTray + ', plasmoidCacheId=' + plasmoidCacheId) - - additionalWeatherInfo = { - sunRise: new Date('2000-01-01T00:00:00'), - sunSet: new Date('2000-01-01T00:00:00'), - sunRiseTime: '0:00', - sunSetTime: '0:00', - nearFutureWeather: { - iconName: null, - temperature: null - } - } + onEnv_QML_XHR_ALLOW_FILE_READChanged: { + plasmoid.configuration.qml_XHR_ALLOW_FILE_READ = env_QML_XHR_ALLOW_FILE_READ + dbgprint("QML_XHR_ALLOW_FILE_READ Enabled: " + env_QML_XHR_ALLOW_FILE_READ) + } - // systray settings - if (inTray) { - Plasmoid.compactRepresentation = crInTray - Plasmoid.fullRepresentation = frInTray + onPlacesStrChanged: { + let places = ConfigUtils.getPlacesArray() + let placesCount = places.length - 1 + let i = Math.min(plasmoid.configuration.placeIndex, placesCount) + if (currentPlace != places[i].placeAlias) { + setNextPlace(true) } - // init contextMenu - action_toggleUpdatingPaused() - - var cacheContent = weatherCache.readCache() + } - // fill xml cache xml - if (cacheContent) { - try { - cacheMap = JSON.parse(cacheContent) - dbgprint('cacheMap initialized - keys:') - for (var key in cacheMap) { - dbgprint(' ' + key + ', data: ' + cacheMap[key]) - } - } catch (error) { - dbgprint('error parsing cacheContent') - } + function dbgprint(msg) { + if (!debugLogging) { + return } - cacheMap = cacheMap || {} -// set initial place - setNextPlace(true) + print("[kate weatherWidget] " + msg) } - - onTimezoneShortNameChanged: { - refreshTooltipSubText() - } - - onPlacesJsonStrChanged: { - if (placesJsonStr === '') { + function dbgprint2(msg) { + if (!debugLogging) { return } - onlyOnePlace = ConfigUtils.getPlacesArray().length === 1 - setNextPlace(true) + console.log("\n\n") + console.log("*".repeat(msg.length + 4)) + console.log("* " + msg +" *") + console.log("*".repeat(msg.length + 4)) } - function showData() { - var ok = loadFromCache() - if (!ok) { - reloadData() - } - updateLastReloadedText() - reloadMeteogram() + function getLocalTimeZone() { + return dataSource.data["Local"]["Timezone Abbreviation"] + } + function dateNow() { + var now=new Date().getTime() + return now } function setCurrentProviderAccordingId(providerId) { - if (providerId === 'owm') { - dbgprint('setting provider OpenWeatherMap') - currentProvider = owmProvider + currentPlace.providerId = providerId + if (providerId === "owm") { + dbgprint("setting provider OpenWeatherMap") + return owmProvider } if (providerId === "metno") { - dbgprint('setting provider metno') - currentProvider = metnoProvider + dbgprint("setting provider metno") + return metnoProvider } - } - + } + function emptyWeatherModel() { + return { + temperature: -9999, + iconName: 0, + windDirection: 0, + windSpeedMps: 0, + pressureHpa: 0, + humidity: 0, + cloudiness: 0, + sunRise: new Date("2000-01-01T00:00:00"), + sunSet: new Date("2000-01-01T00:00:00"), + sunRiseTime: "0:00", + sunSetTime: "0:00", + isDay: false, + nearFutureWeather: { + iconName: null, + temperature: null + } + } + } function setNextPlace(initial,direction) { - actualWeatherModel.clear() - nextDaysModel.clear() - meteogramModel.clear() if (direction === undefined) { - direction = "+" + direction = "+" } + currentWeatherModel=emptyWeatherModel() + nextDaysModel.clear() + meteogramModel.clear() + var places = ConfigUtils.getPlacesArray() - onlyOnePlace = places.length === 1 - dbgprint('places count=' + places.length + ', placeIndex=' + plasmoid.configuration.placeIndex) + placesCount = places.length var placeIndex = plasmoid.configuration.placeIndex + dbgprint("places count=" + placesCount + ", placeIndex=" + plasmoid.configuration.placeIndex) if (!initial) { - (direction === "+") ? placeIndex++ :placeIndex-- + (direction === "+") ? placeIndex++ : placeIndex-- } if (placeIndex > places.length - 1) { placeIndex = 0 @@ -274,275 +250,359 @@ Item { placeIndex = places.length - 1 } plasmoid.configuration.placeIndex = placeIndex - dbgprint('placeIndex now: ' + plasmoid.configuration.placeIndex) + dbgprint("placeIndex now: " + plasmoid.configuration.placeIndex) var placeObject = places[placeIndex] - placeIdentifier = placeObject.placeIdentifier - placeAlias = placeObject.placeAlias - if (placeObject.timezoneID === undefined ) { - placeObject.timezoneID = -1 + + currentPlace.identifier = placeObject.placeIdentifier + currentPlace.alias = placeObject.placeAlias + currentPlace.timezoneID = placeObject.timezoneID + currentPlace.providerId = placeObject.providerId + currentPlace.provider = setCurrentProviderAccordingId(placeObject.providerId) + + if (placeObject.timezoneID === undefined) { + currentPlace.timezoneID = -1 + } else { + currentPlace.timezoneID = parseInt(placeObject.timezoneID) } - timezoneID = parseInt(placeObject.timezoneID) - dbgprint('next placeIdentifier is: ' + placeIdentifier) - cacheKey = DataLoader.generateCacheKey(placeIdentifier) - dbgprint('next cacheKey is: ' + cacheKey) - alreadyLoadedFromCache = false - setCurrentProviderAccordingId(placeObject.providerId) + let tzData = TZ.TZData[currentPlace.timezoneID] + currentPlace.timezoneShortName = "LOCAL" + if (currentPlace.providerId === "metno") { + if (TZ.isDST(tzData.DSTData)){ + currentPlace.timezoneShortName = tzData.DSTName + currentPlace.timezoneOffset = parseInt(tzData.DSTOffset) + } else { + currentPlace.timezoneShortName = tzData.TZName + currentPlace.timezoneOffset = parseInt(tzData.Offset) + } + } + + fullRepresentationAlias = currentPlace.alias + - timezoneShortName = getLocalTimeZone() - showData() + cacheData.cacheKey = DataLoader.generateCacheKey(currentPlace.identifier) + currentPlace.cacheID = DataLoader.generateCacheKey(currentPlace.identifier) + dbgprint("cacheKey for " + currentPlace.identifier + " is: " + currentPlace.cacheID) + cacheData.alreadyLoadedFromCache = false + + var ok = loadFromCache() + dbgprint("CACHE " + ok) + if (!ok) { + loadDataFromInternet() + } } + function loadDataFromInternet() { + dbgprint2("loadDataFromInternet") - function dataLoadedFromInternet(contentToCache) { - dbgprint("Data Loaded From Internet successfully.") - loadingData = false - nextReload=dateNow() + reloadIntervalMs - dbgprint('saving cacheKey = ' + cacheKey) - cacheMap[cacheKey] = contentToCache - dbgprint('cacheMap now has these keys:') - for (var key in cacheMap) { - dbgprint(' ' + key) + if (loadingData.loadingDatainProgress) { + dbgprint("still loading") + return } - alreadyLoadedFromCache = false - weatherCache.writeCache(JSON.stringify(cacheMap)) + loadingDataComplete = false + loadingData.loadingDatainProgress = true + loadingData.lastloadingStartTime = dateNow() + loadingData.nextReload = -1 + currentPlace.provider = setCurrentProviderAccordingId(currentPlace.providerId) + currentPlace.creditLink = currentPlace.provider.getCreditLink(currentPlace.identifier) + currentPlace.creditLabel = currentPlace.provider.getCreditLabel(currentPlace.identifier) + loadingData.loadingXhrs = currentPlace.provider.loadDataFromInternet( + dataLoadedFromInternet, + reloadDataFailureCallback, + { placeIdentifier: currentPlace.identifier, timezoneID: currentPlace.timezoneID }) + + } + function dataLoadedFromInternet() { + dbgprint2("dataLoadedFromInternet") + dbgprint("Data Loaded From Internet successfully.") + + loadingData.lastloadingSuccessTime = dateNow() + loadingData.loadingDatainProgress = false + loadingData.nextReload = dateNow() + timerData.reloadIntervalMs + loadingData.failedAttemptCount = 0 + currentPlace.nextReload = dateNow() + timerData.reloadIntervalMs + dbgprint(dateNow() + " + " + timerData.reloadIntervalMs + " = " + loadingData.nextReload) + + nextDaysCount = nextDaysModel.count - reloadMeteogram() - lastloadingSuccessTime=dateNow() updateLastReloadedText() + updateCompactItem() + refreshTooltipSubText() + dbgprint("meteogramModelChanged:" + meteogramModelChanged) + meteogramModelChanged = !meteogramModelChanged + dbgprint("meteogramModelChanged:" + meteogramModelChanged) - loadFromCache() + saveToCache() } - function reloadDataFailureCallback() { dbgprint("Failed to Load Data successfully.") - main.loadingData = false - handleLoadError() + cacheData.loadingDatainProgress = false + dbgprint("Error getting weather data. Scheduling data reload...") + loadingData.nextReload = dateNow() + loadFromCache() + } + function updateLastReloadedText() { + dbgprint("updateLastReloadedText: " + loadingData.lastloadingSuccessTime) + if (loadingData.lastloadingSuccessTime > 0) { + lastReloadedText = '⬇ ' + i18n("%1 ago", DataLoader.getLastReloadedTimeText(dateNow() - loadingData.lastloadingSuccessTime)) + } + plasmoid.status = DataLoader.getPlasmoidStatus(loadingData.lastloadingSuccessTime, inTrayActiveTimeoutSec) + dbgprint(plasmoid.status) + } + function updateCompactItem(){ + dbgprint2("updateCompactItem") + dbgprint(JSON.stringify(currentWeatherModel)) + let icon = currentWeatherModel.iconName + iconNameStr = (icon > 0) ? IconTools.getIconCode(icon, currentPlace.providerId, currentWeatherModel.isDay) : '\uf07b' + temperatureStr = currentWeatherModel.temperature !== 9999 ? UnitUtils.getTemperatureNumberExt(currentWeatherModel.temperature, temperatureType) : '--' } - function reloadData() { - dbgprint("reloadData") - - if (loadingData) { - dbgprint('still loading') + function refreshTooltipSubText() { + // dbgprint(JSON.stringify(currentWeatherModel)) + dbgprint2("refreshTooltipSubText") + if (currentWeatherModel === undefined || currentWeatherModel.nearFutureWeather.iconName === null || currentWeatherModel.count === 0) { + dbgprint("model not yet ready") return } + // for(const [key,value] of Object.entries(currentPlace)) { console.log(` ${key}: ${value}`) } + // for(const [key,value] of Object.entries(currentWeatherModel)) { console.log(` ${key}: ${value}`) } - loadingData = true - lastloadingStartTime=dateNow() - loadingXhrs = currentProvider.loadDataFromInternet(dataLoadedFromInternet, reloadDataFailureCallback, { placeIdentifier: placeIdentifier, timezoneID: timezoneID }) - - } - - function reloadMeteogram() { - currentProvider.reloadMeteogramImage(placeIdentifier) + var nearFutureWeather = currentWeatherModel.nearFutureWeather + var futureWeatherIcon = IconTools.getIconCode(nearFutureWeather.iconName, currentPlace.providerId, (currentWeatherModel.isDay ? 0 : 1)) + var wind1=Math.round(currentWeatherModel.windDirection) + var windDirectionIcon = IconTools.getWindDirectionIconCode(wind1) + var subText = "" + subText += "
" + windDirectionIcon + " " + wind1 + "\u00B0   @ " + UnitUtils.getWindSpeedText(currentWeatherModel.windSpeedMps, windSpeedType) + "" + subText += "
" + UnitUtils.getPressureText(currentWeatherModel.pressureHpa, pressureType) + "" + subText += "
" + if ((currentWeatherModel.humidity !== undefined) && (currentWeatherModel.cloudiness !== undefined)) { + subText += "" + subText += "" + subText += "" + subText += "" + subText += "" + } + subText += "" + let tzName = "GMT" + if (timezoneType === 0) { tzName = getLocalTimeZone() } + if (timezoneType === 1) { tzName = "GMT" } + if (timezoneType === 2) { tzName = currentPlace.timezoneShortName } + subText += "" + subText += "" + subText += "" + subText += "" + subText += "" + subText += "
\uf07a " + currentWeatherModel.humidity + "%\uf013 " + currentWeatherModel.cloudiness + "%
 
\uf051 " + currentWeatherModel.sunRiseTime + " " + tzName + "   
\uf052 " + currentWeatherModel.sunSetTime + " " + tzName + "
" + + subText += "

" + subText += "" + i18n("near future") + "" + subText += "" + subText += "   " + UnitUtils.getTemperatureNumber(nearFutureWeather.temperature, temperatureType) + UnitUtils.getTemperatureEnding(temperatureType) + subText += "   " + futureWeatherIcon + "" + subText += "" + toolTipMainText = currentPlace.alias + toolTipSubText = subText } - function loadFromCache() { - dbgprint('loading from cache, config key: ' + cacheKey) + Component.onCompleted: { + dbgprint2("MAIN.QML") + dbgprint((currentPlace)) - if (alreadyLoadedFromCache) { - dbgprint('already loaded from cache') - return true - } + if (plasmoid.configuration.firstRun) { + let URL = Qt.resolvedUrl("../code/db/GI.csv") // DEBUGGING ONLY + var xhr = new XMLHttpRequest() + xhr.timeout = loadingData.loadingDataTimeoutMs; + dbgprint('Test local file opening - url: ' + URL) + xhr.open('GET', URL) + xhr.setRequestHeader("User-Agent","Mozilla/5.0 (X11; Linux x86_64) Gecko/20100101 ") + xhr.send() + xhr.onload = (event) => { + dbgprint("env_QML_XHR_ALLOW_FILE_READ = 1. Using Builtin Location databases...") + env_QML_XHR_ALLOW_FILE_READ = true + } - creditLink = currentProvider.getCreditLink(placeIdentifier) - creditLabel = currentProvider.getCreditLabel(placeIdentifier) + if (plasmoid.configuration.widgetFontSize === undefined) { + plasmoid.configuration.widgetFontSize = 32 + widgetFontSize = 32 + } - if (!cacheMap || !cacheMap[cacheKey]) { - dbgprint('cache not available') - return false + switch (Qt.locale().measurementSystem) { + case (Locale.MetricSystem): + plasmoid.configuration.temperatureType = 0 + plasmoid.configuration.pressureType = 0 + plasmoid.configuration.windSpeedType = 2 + break; + case (Locale.ImperialUSSystem): + plasmoid.configuration.temperatureType = 1 + plasmoid.configuration.pressureType = 1 + plasmoid.configuration.windSpeedType = 1 + break; + case (Locale.ImperialUKSystem): + plasmoid.configuration.temperatureType = 0 + plasmoid.configuration.pressureType = 0 + plasmoid.configuration.windSpeedType = 1 + break; + } + plasmoid.configuration.firstRun = false } + timerData.reloadIntervalMin=plasmoid.configuration.reloadIntervalMin + timerData.reloadIntervalMs=timerData.reloadIntervalMin * 60000 - var success = currentProvider.setWeatherContents(cacheMap[cacheKey]) - if (!success) { - dbgprint('setting weather contents not successful') - return false + dbgprint("plasmoid.formFactor:" + plasmoid.formFactor) + dbgprint("plasmoid.location:" + plasmoid.location) + dbgprint("plasmoid.configuration.layoutType:" + plasmoid.configuration.layoutType) + dbgprint("plasmoid.containment.containmentType:" + plasmoid.containment.containmentType) + if (inTray) { + dbgprint("IN TRAY!") } - alreadyLoadedFromCache = true - return true - } + dbgprint2(" Load Cache") + var cacheContent = weatherCache.readCache() - function handleLoadError() { - dbgprint('Error getting weather data. Scheduling data reload...') - nextReload = dateNow() - loadFromCache() - } + dbgprint("readCache result length: " + cacheContent.length) - onInTrayActiveTimeoutSecChanged: { - if (placesJsonStr === '') { - return + // fill cache + if (cacheContent) { + try { + cacheData.cacheMap = JSON.parse(cacheContent) + dbgprint("cacheMap initialized - keys:") + for (var key in cacheData.cacheMap) { + dbgprint(" " + key + ", data: " + cacheData.cacheMap[key]) + } + } catch (error) { + dbgprint("error parsing cacheContent") + } } - updateLastReloadedText() - } + cacheData.cacheMap = cacheData.cacheMap || {} + + dbgprint2("get Default Place") + setNextPlace(true) - function updateLastReloadedText() { - dbgprint("updateLastReloadedText: " + lastloadingSuccessTime) - if (lastloadingSuccessTime > 0) { - lastReloadedText = '⬇ ' + i18n("%1 ago", DataLoader.getLastReloadedTimeText(dateNow() - lastloadingSuccessTime)) - } - plasmoid.status = DataLoader.getPlasmoidStatus(lastloadingSuccessTime, inTrayActiveTimeoutSec) } - function updateAdditionalWeatherInfoText() { - if (additionalWeatherInfo !== undefined) { - var sunRise = UnitUtils.convertDate(additionalWeatherInfo.sunRise, timezoneType, timezoneOffset) - var sunSet = UnitUtils.convertDate(additionalWeatherInfo.sunSet, timezoneType, timezoneOffset) - additionalWeatherInfo.sunRiseTime = Qt.formatTime(sunRise, Qt.locale().timeFormat(Locale.ShortFormat)) - additionalWeatherInfo.sunSetTime = Qt.formatTime(sunSet, Qt.locale().timeFormat(Locale.ShortFormat)) + onTimezoneTypeChanged: { + if (currentPlace.identifier !== "") { + dbgprint2('timezoneType changed') + cacheData.cacheKey = DataLoader.generateCacheKey(currentPlace.identifier) + currentPlace.cacheID = DataLoader.generateCacheKey(currentPlace.identifier) + dbgprint("cacheKey for " + currentPlace.identifier + " is: " + currentPlace.cacheID) + cacheData.alreadyLoadedFromCache = false + loadDataFromInternet() + meteogramModelChanged = ! meteogramModelChanged } } - function refreshTooltipSubText() { - dbgprint('refreshing sub text') - if (additionalWeatherInfo === undefined || additionalWeatherInfo.nearFutureWeather.iconName === null || actualWeatherModel.count === 0) { - dbgprint('model not yet ready') - return + function loadFromCache() { + dbgprint2("loadFromCache") + dbgprint('loading from cache, config key: ' + cacheData.cacheKey) + + if (cacheData.alreadyLoadedFromCache) { + dbgprint('already loaded from cache') + return true } - updateAdditionalWeatherInfoText() - var nearFutureWeather = additionalWeatherInfo.nearFutureWeather - var futureWeatherIcon = IconTools.getIconCode(nearFutureWeather.iconName, currentProvider.providerId, getPartOfDayIndex()) - var wind1=Math.round(actualWeatherModel.get(0).windDirection) - var windDirectionIcon = IconTools.getWindDirectionIconCode(wind1) - var subText = '' - subText += '
' + windDirectionIcon + ' ' + wind1 + '\u00B0   @ ' + UnitUtils.getWindSpeedText(actualWeatherModel.get(0).windSpeedMps, windSpeedType) + '' - subText += '
' + UnitUtils.getPressureText(actualWeatherModel.get(0).pressureHpa, pressureType) + '' - subText += '
' - if ((actualWeatherModel.get(0).humidity !== undefined) && (actualWeatherModel.get(0).cloudiness !== undefined)) { - subText += '' - subText += '' - subText += '' - subText += '' - subText += '' + if (!cacheData.cacheMap || !cacheData.cacheMap[cacheData.cacheKey]) { + dbgprint('cache not available') + return false } - subText += '' - subText += '' - subText += '' - subText += '' - subText += '
\uf07a ' + actualWeatherModel.get(0).humidity + '%\uf013 ' + actualWeatherModel.get(0).cloudiness + '%
 
\uf051 ' + additionalWeatherInfo.sunRiseTime + ' '+timezoneShortName + '   \uf052 ' + additionalWeatherInfo.sunSetTime + ' '+timezoneShortName + '
' - - subText += '

' - subText += '' + i18n("near future") + '' - subText += '' - subText += '   ' + UnitUtils.getTemperatureNumber(nearFutureWeather.temperature, temperatureType) + UnitUtils.getTemperatureEnding(temperatureType) - subText += '   ' + futureWeatherIcon + '' - subText += '' - tooltipSubText = subText - } - function getPartOfDayIndex() { - var now = new Date().getTime() - let sunrise1 = additionalWeatherInfo.sunRise.getTime() - let sunset1 = additionalWeatherInfo.sunSet.getTime() - let icon = ((now > sunrise1) && (now < sunset1)) ? 0 : 1 -// setDebugFlag(true) - dbgprint(JSON.stringify(additionalWeatherInfo)) - dbgprint("NOW = " + now + "\tSunrise = " + sunrise1 + "\tSunset = " + sunset1 + "\t" + (icon === 0 ? "isDay" : "isNight")) - dbgprint("\t > Sunrise:" + (now > sunrise1) + "\t\t Sunset:" + (now < sunset1)) -// setDebugFlag(false) - - return icon - } + currentPlace = JSON.parse(cacheData.cacheMap[cacheData.cacheKey][1]) + currentPlace.provider = setCurrentProviderAccordingId(currentPlace.providerId) - function abortTooLongConnection(forceAbort) { - if (!loadingData) { - return + // for(const [key,value] of Object.entries(currentPlace)) { console.log(` ${key}: ${value}`) } + + currentWeatherModel = cacheData.cacheMap[cacheData.cacheKey][2] + // dbgprint("currentPlace:\t" + currentPlace.alias + "\t" + currentPlace.identifier + "\t" + currentPlace.timezoneID + "\t" + currentPlace.timezoneShortName + "\t") + // dbgprint(JSON.stringify(currentWeatherModel)) + let meteogramModelData = JSON.parse( cacheData.cacheMap[cacheData.cacheKey][3]) + let nextDaysModelData = JSON.parse( cacheData.cacheMap[cacheData.cacheKey][4]) + // dbgprint(cacheData.cacheMap[cacheData.cacheKey][4]) + meteogramModel.clear() + for (var i = 0; i < meteogramModelData.length; ++i) { + meteogramModelData[i]['from'] = new Date(Date.parse(meteogramModelData[i]['from'])) + meteogramModelData[i]['to'] = new Date(Date.parse(meteogramModelData[i]['to'])) + meteogramModel.append(meteogramModelData[i]) } - if (forceAbort) { - dbgprint('timeout reached, aborting existing xhrs') - loadingXhrs.forEach(function (xhr) { - xhr.abort() - }) - reloadDataFailureCallback() - } else { - dbgprint('regular loading, no aborting yet') - return + + nextDaysModel.clear() + for (var i = 0; i < nextDaysModelData.length; ++i) { + // meteogramModelData[i]['from'] = new Date(Date.parse(meteogramModelData[i]['from'])) + // meteogramModelData[i]['to'] = new Date(Date.parse(meteogramModelData[i]['to'])) + nextDaysModel.append(nextDaysModelData[i]) } + dbgprint(nextDaysModelData.length) + nextDaysCount = nextDaysModel.count + + updateCompactItem() + refreshTooltipSubText() + dbgprint("meteogramModelChanged:" + meteogramModelChanged) + meteogramModelChanged = !meteogramModelChanged + dbgprint("meteogramModelChanged:" + meteogramModelChanged) + + return true } + function saveToCache() { + dbgprint2("saveCache") + dbgprint(currentPlace.alias) + let cacheID = currentPlace.cacheID - function tryReload() { - updateLastReloadedText() - if (updatingPaused) { - return + var meteogramModelData = ([]) + for (var i = 0; i < meteogramModel.count; ++i) { + meteogramModelData.push(meteogramModel.get(i)) } - reloadData() + var nextDayModelData = ([]) + for (i = 0; i < nextDaysModel.count; ++i) { + // dbgprint(JSON.stringify(nextDaysModel.get(i))) + nextDayModelData.push(nextDaysModel.get(i)) + } + currentPlace.provider = "" + // for(const [key,value] of Object.entries(currentPlace)) { console.log(` ${key}: ${value}`) } + + let contentToCache = {1: JSON.stringify(currentPlace), 2: currentWeatherModel, 3: JSON.stringify(meteogramModelData), 4: JSON.stringify(nextDayModelData)} + print("saving cacheKey = " + cacheID) + cacheData.cacheMap[cacheID] = contentToCache } + Timer { interval: 10000 running: true repeat: true onTriggered: { + dbgprint2("Timer Triggered") var now=dateNow() - dbgprint("*** Timer triggered") - dbgprint("*** loadingData Flag : " + loadingData) - dbgprint("*** Last Load Success: " + (lastloadingSuccessTime)) - dbgprint("*** Next Load Due : " + (nextReload)) + dbgprint("*** loadingData Flag : " + loadingData.loadingDatainProgress) + dbgprint("*** loadingData failedAttemptCount : " + loadingData.failedAttemptCount) + dbgprint("*** Last Load Success: " + (loadingData.lastloadingSuccessTime)) + dbgprint("*** Next Load Due : " + (currentPlace.nextReload)) dbgprint("*** Time Now : " + now) - dbgprint("*** Next Load in : " + Math.round((nextReload - now) / 1000) + " sec = "+ ((nextReload - now) / 60000).toFixed(2) + " min") + dbgprint("*** Next Load in : " + Math.round((currentPlace.nextReload - now) / 1000) + " sec = "+ ((currentPlace.nextReload - now) / 60000).toFixed(2) + " min") updateLastReloadedText() - if ((lastloadingSuccessTime===0) && (updatingPaused)) { - toggleUpdatingPaused() - } - - if (loadingData) { - dbgprint("Timeout in:" + (lastloadingStartTime + loadingDataTimeoutMs - now)) - if (now > (lastloadingStartTime + loadingDataTimeoutMs)) { - console.log("Timed out downloading weather data - aborting attempt. Retrying in 60 seconds time.") - abortTooLongConnection(true) - nextReload=now + 60000 + // if ((loadingData.lastloadingSuccessTime === 0) && (updatingPaused)) { + // currentPlace.nextReload=now + 60000() + // } + + if (loadingData.loadingDatainProgress) { + dbgprint("Timeout in:" + (loadingData.lastloadingStartTime + loadingData.loadingDataTimeoutMs - now)) + if (now > (loadingData.lastloadingStartTime + loadingData.loadingDataTimeoutMs)) { + loadingData.failedAttemptCount++ + let retryTime = Math.min(loadingData.failedAttemptCount, 30) * 30 + console.log("Timed out downloading weather data - aborting attempt. Retrying in " + retryTime +" seconds time.") + loadingData.loadingDatainProgress = false + loadingData.lastloadingSuccessTime = 0 + currentPlace.nextReload = now + (retryTime * 1000) + loadingDataComplete = true } } else { - if (now > nextReload) { - tryReload() - } + if (now > currentPlace.nextReload) { + loadDataFromInternet() + } } - } - } - onTemperatureTypeChanged: { - refreshTooltipSubText() - } - - onPressureTypeChanged: { - refreshTooltipSubText() - } - - onWindSpeedTypeChanged: { - refreshTooltipSubText() - } - - onTwelveHourClockEnabledChanged: { - refreshTooltipSubText() - } - - onTimezoneTypeChanged: { - if (lastloadingSuccessTime > 0) { - refreshTooltipSubText() - } - } - - function dbgprint(msg) { - if (!debugLogging) { - return } - print('[weatherWidget] ' + msg) - } - - function dateNow() { - var now=new Date().getTime() - return now } - function setDebugFlag(flag) { - debugLogging = flag - } - function getLocalTimeZone() { - return dataSource.data["Local"]["Timezone Abbreviation"] - } } diff --git a/package/contents/ui/providers/MetNo.qml b/package/contents/ui/providers/MetNo.qml index 7824b9b..01b1ae3 100644 --- a/package/contents/ui/providers/MetNo.qml +++ b/package/contents/ui/providers/MetNo.qml @@ -1,14 +1,14 @@ -import QtQuick 2.2 +import QtQuick 2.15 import "../../code/model-utils.js" as ModelUtils import "../../code/data-loader.js" as DataLoader import "../../code/unit-utils.js" as UnitUtils -import "../../code/db/timezoneData.js" as TZ - - Item { id: metno + + + property var locale: Qt.locale() property string providerId: 'metno' property string urlPrefix: 'https://api.met.no/weatherapi/locationforecast/2.0/compact?' @@ -22,8 +22,9 @@ Item { } function extLongLat(placeIdentifier) { - return placeIdentifier.substr(placeIdentifier.indexOf("lat=" )+4,placeIdentifier.indexOf("&lon=")-4) +","+ - placeIdentifier.substr(placeIdentifier.indexOf("&lon=")+5,placeIdentifier.indexOf("&altitude=")-placeIdentifier.indexOf("&lon=")-5) + dbgprint(placeIdentifier) + return placeIdentifier.substr(placeIdentifier.indexOf("lat=" ) + 4,placeIdentifier.indexOf("&lon=")-4) + "," + + placeIdentifier.substr(placeIdentifier.indexOf("&lon=") + 5,placeIdentifier.indexOf("&altitude=") - placeIdentifier.indexOf("&lon=") - 5) } function getCreditLink(placeIdentifier) { @@ -35,24 +36,36 @@ Item { } function loadDataFromInternet(successCallback, failureCallback, locationObject) { + + dbgprint2("loadDataFromInternet: " + currentPlace.alias) + var placeIdentifier = locationObject.placeIdentifier + weatherDataFlag = false + sunRiseSetFlag = false + var TZURL = "" + + if (currentPlace.timezoneID === -1) { + console.log("[weatherWidget] Timezone Data not available - using sunrise-sunset.org API") + TZURL = "https://api.sunrise-sunset.org/json?formatted=0&" + placeIdentifier + } else { + dbgprint("Timezone Data is available - using met.no API") + + TZURL = 'https://api.met.no/weatherapi/sunrise/3.0/sun?' + placeIdentifier.replace(/&altitude=[^&]+/,"") + "&date=" + formatDate(new Date().toISOString()) + // TZURL += "&offset=" + calculateOffset(currentPlace.timezoneOffset) + } + if (! useOnlineWeatherData) { + TZURL = Qt.resolvedUrl('../../code/weather/sun.json') + } + dbgprint("Downloading Sunrise / Sunset Data from: " + TZURL) + var xhr1 = DataLoader.fetchJsonFromInternet(TZURL, successSRAS, failureCallback) + return [xhr1] function successWeather(jsonString) { var readingsArray = JSON.parse(jsonString) - actualWeatherModel.clear() - var currentWeather = readingsArray.properties.timeseries[0] - var futureWeather = readingsArray.properties.timeseries[1] - var iconnumber = geticonNumber(currentWeather.data.next_1_hours.summary.symbol_code) - var wd = currentWeather.data.instant.details["wind_from_direction"] - var ws = currentWeather.data.instant.details["wind_speed"] - var ap = currentWeather.data.instant.details["air_pressure_at_sea_level"] - var hm = currentWeather.data.instant.details["relative_humidity"] - var cld = currentWeather.data.instant.details["cloud_area_fraction"] - actualWeatherModel.append({"temperature": currentWeather.data.instant.details["air_temperature"], "iconName": iconnumber, "windDirection": wd,"windSpeedMps": ws, "pressureHpa": ap, "humidity": hm, "cloudiness": cld}) - additionalWeatherInfo.nearFutureWeather.temperature = futureWeather.data.instant.details["air_temperature"] - additionalWeatherInfo.nearFutureWeather.iconName = geticonNumber(futureWeather.data.next_1_hours.summary.symbol_code) + updatecurrentWeather(readingsArray) updateNextDaysModel(readingsArray) buildMetogramData(readingsArray) + refreshTooltipSubText() loadCompleted() } @@ -61,14 +74,166 @@ Item { return new Date(Date.UTC(b[0], --b[1], b[2], b[3], b[4], b[5], b[6])) } + function updatecurrentWeather(readingsArray) { + dbgprint2("Build Current Weather") + + var currentWeather = readingsArray.properties.timeseries[0] + var futureWeather = readingsArray.properties.timeseries[1] + currentWeatherModel.iconName = geticonNumber(currentWeather.data.next_1_hours.summary.symbol_code) + currentWeatherModel.windDirection = currentWeather.data.instant.details["wind_from_direction"] + currentWeatherModel.windSpeedMps = currentWeather.data.instant.details["wind_speed"] + currentWeatherModel.pressureHpa = currentWeather.data.instant.details["air_pressure_at_sea_level"] + currentWeatherModel.humidity = currentWeather.data.instant.details["relative_humidity"] + currentWeatherModel.cloudiness = currentWeather.data.instant.details["cloud_area_fraction"] + currentWeatherModel.temperature = currentWeather.data.instant.details["air_temperature"] + currentWeatherModel.nearFutureWeather.temperature = futureWeather.data.instant.details["air_temperature"] + currentWeatherModel.nearFutureWeather.iconName = geticonNumber(futureWeather.data.next_1_hours.summary.symbol_code) + + let sunRise = UnitUtils.convertDate(currentWeatherModel.sunRise,2,currentPlace.timezoneOffset) + let sunSet = UnitUtils.convertDate(currentWeatherModel.sunSet,2,currentPlace.timezoneOffset) + let updated = UnitUtils.convertDate(new Date(readingsArray.properties.timeseries[0].time) , 2 , currentPlace.timezoneOffset) + + dbgprint("Updated=" + readingsArray.properties.timeseries[0].time + "\t" + currentWeatherModel.sunRise + "\t" + currentWeatherModel.sunSet) + dbgprint("Updated=" + updated/1000 + "\t" + sunRise/1000 + "\t" + sunSet/1000) + dbgprint("Updated=" + updated/1000 + "\t" + (updated > sunRise) + "\t" + (updated < sunSet)) + currentWeatherModel.isDay = ((updated > sunRise) && (updated < sunSet)) ? 0 : 1 + + dbgprint(JSON.stringify(currentWeatherModel)) + } + + function createDate(t) { + let arr = t.split(":") + return Date.parse(new Date(1970, 1, 1, arr[0], arr[1], 0))/1000 + } + + function updateNextDaysModel(readingsArray) { + dbgprint2("updateNextDaysModel") + nextDaysModel.clear() + + function blankObject() { + const myblankObject = {} + for(let f = 0; f < 4; f++) { + myblankObject["temperature" + f] = -999 + myblankObject["iconName" + f] = "" + myblankObject['hidden' + f] = true + } + return myblankObject + } + + let offset = 0 + switch (main.timezoneType) { + case (0): + offset = dataSource.data["Local"]["Offset"] + break; + case (1): + offset = 0 + break; + case (2): + offset = currentPlace.timezoneOffset + break; + } + + let wd = readingsArray.properties.timeseries + let wdPtr = 0 + var localTime = UnitUtils.convertDate(new Date(wd[wdPtr].time), 2, currentPlace.timezoneOffset) + var displayTime = UnitUtils.convertDate(new Date(wd[wdPtr].time), main.timezoneType, offset) + while ((wdPtr < wd.length) && ((displayTime.getHours() - 3) % 6 ) != 0) { + + wdPtr++ + displayTime = UnitUtils.convertDate(new Date(wd[wdPtr].time), main.timezoneType, offset) + } + let x = 0 + let y = 0 + let nextDaysData = blankObject() + let airTemp = -999 + + var sunrise1 = UnitUtils.convertDate(currentWeatherModel.sunRise,2,currentPlace.timezoneOffset) + var sunset1 = UnitUtils.convertDate(currentWeatherModel.sunSet,2,currentPlace.timezoneOffset) + dbgprint("**********************") + dbgprint(sunrise1 + "\t" + sunset1) + var ss = Date.parse(sunset1) / 1000 + var sr = Date.parse(sunrise1) / 1000 + + while (wd[wdPtr].data.next_1_hours !== undefined) { + localTime = UnitUtils.convertDate(new Date(wd[wdPtr].time), 2, currentPlace.timezoneOffset) + displayTime = UnitUtils.convertDate(new Date(wd[wdPtr].time), main.timezoneType, offset) + let lt = Date.parse(localTime) / 1000 + + while (lt > (sr + 86400)) { + dbgprint("+") + sr = sr + 86400 + ss = ss + 86400 + } + if (displayTime.getHours() % 6 === 3) { + let isDayTime = ((lt >= sr ) && (lt <= ss)) ? 0 : 1 + y = Math.trunc(displayTime.getHours() / 6,0) + dbgprint("wdPtr:" + wdPtr + "\t" + wd[wdPtr].time + "\t x = " + x + "\t y = " + y) + dbgprint(isDayTime + "\t\t" + displayTime + "\t" + localTime+ "\t" + new Date(sr * 1000) + "\t" + new Date(ss * 1000) ) + nextDaysData['dayTitle'] = composeNextDayTitle(displayTime) + nextDaysData['temperature' + y] = wd[wdPtr].data.instant.details["air_temperature"] + nextDaysData['hidden' + y] = false + let obj = wd[wdPtr].data.next_1_hours.summary["symbol_code"] + nextDaysData['iconName' + y] = geticonNumber(obj) + nextDaysData['partOfDay' + y] = isDayTime + if (y == 3) { + nextDaysModel.append(nextDaysData) + nextDaysData=blankObject() + x++ + } + + } + wdPtr++ + } + + while ((wdPtr < wd.length) && (wd[wdPtr].data.next_6_hours !== undefined)) + { + let t = new Date(wd[wdPtr].time) + t.setHours(t.getHours() + 3) + localTime = UnitUtils.convertDate(t, 2, currentPlace.timezoneOffset) + displayTime = UnitUtils.convertDate(t, main.timezoneType, offset) + let lt = Date.parse(localTime) / 1000 + + while (lt > (sr + 86400)) { + dbgprint("+") + sr = sr + 86400 + ss = ss + 86400 + } + dbgprint("****\t" + displayTime.getHours()) + { + let isDayTime = ((lt >= sr ) && (lt <= ss)) ? 0 : 1 + y = Math.trunc(displayTime.getHours() / 6,0) + dbgprint("wdPtr:" + wdPtr + "\t" + wd[wdPtr].time + "\t x = " + x + "\t y = " + y) + dbgprint(isDayTime + "\t\t" + displayTime + "\t" + localTime+ "\t" + new Date(sr * 1000) + "\t" + new Date(ss * 1000) ) + dbgprint("\t\t" + displayTime + "\t" + lt+ "\t" + (sr) + "\t" + (ss) ) + nextDaysData['dayTitle'] = composeNextDayTitle(displayTime) + nextDaysData['temperature' + y] = wd[wdPtr].data.instant.details["air_temperature"] + nextDaysData['hidden' + y] = false + let obj = wd[wdPtr].data.next_6_hours.summary["symbol_code"] + nextDaysData['iconName' + y] = geticonNumber(obj) + nextDaysData['partOfDay' + y] = isDayTime + if (y == 3) { + nextDaysModel.append(nextDaysData) + nextDaysData=blankObject() + x++ + } + } + wdPtr++ + } + if ((y < 3) && (x < 8)) { + nextDaysModel.append(nextDaysData) + } + dbgprint("nextDaysModel Count:" + nextDaysModel.count) + } + function buildMetogramData(readingsArray) { + dbgprint2("buildMetogramData (MetNo)" + currentPlace.identifier) meteogramModel.clear() var readingsLength = (readingsArray.properties.timeseries.length) var dateFrom = parseISOString(readingsArray.properties.timeseries[0].time) - var sunrise1 = UnitUtils.convertDate(additionalWeatherInfo.sunRise,2,main.timezoneOffset) - var sunset1 = UnitUtils.convertDate(additionalWeatherInfo.sunSet,2,main.timezoneOffset) - dbgprint("Sunrise \t(GMT)" + new Date(additionalWeatherInfo.sunRise).toTimeString() + "\t(LOCAL)" + sunrise1.toTimeString()) - dbgprint("Sunset \t(GMT)" + new Date(additionalWeatherInfo.sunSet).toTimeString() + "\t(LOCAL)" + sunset1.toTimeString()) + var sunrise1 = UnitUtils.convertDate(currentWeatherModel.sunRise,2,currentPlace.timezoneOffset) + var sunset1 = UnitUtils.convertDate(currentWeatherModel.sunSet,2,currentPlace.timezoneOffset) + dbgprint("Sunrise \t(GMT)" + new Date(currentWeatherModel.sunRise).toTimeString() + "\t(LOCAL)" + sunrise1.toTimeString()) + dbgprint("Sunset \t(GMT)" + new Date(currentWeatherModel.sunSet).toTimeString() + "\t(LOCAL)" + sunset1.toTimeString()) var isDaytime = (dateFrom > sunrise1) && (dateFrom < sunset1) var precipitation_unit = readingsArray.properties.meta.units["precipitation_amount"] @@ -84,35 +249,34 @@ Item { var icon = obj.data.next_1_hours.summary["symbol_code"] var prec = obj.data.next_1_hours.details["precipitation_amount"] counter = (prec > 0) ? counter + 1 : 0 - let localtimestamp=UnitUtils.convertDate(dateFrom,2,main.timezoneOffset) + let localtimestamp = UnitUtils.convertDate(dateFrom, 2 , currentPlace.timezoneOffset) if (localtimestamp >= sunrise1) { - if (localtimestamp < sunset1) { - isDaytime = true - } else { - sunrise1.setDate(sunrise1.getDate() + 1) - sunset1.setDate(sunset1.getDate() + 1) - isDaytime = false - } + if (localtimestamp < sunset1) { + isDaytime = true + } else { + sunrise1.setDate(sunrise1.getDate() + 1) + sunset1.setDate(sunset1.getDate() + 1) + isDaytime = false + } } - dbgprint("DateFrom=" + dateFrom.toISOString() + "\tLocal Time=" + UnitUtils.convertDate(dateFrom,2,main.timezoneOffset).toTimeString() + "\t Sunrise=" + sunrise1.toTimeString() + "\tSunset=" + sunset1.toTimeString()) - dbgprint(isDaytime ? "isDay\n" : "isNight\n") + dbgprint("DateFrom=" + dateFrom.toISOString() + "\tLocal Time=" + UnitUtils.convertDate(dateFrom,2,currentPlace.timezoneOffset).toTimeString() + "\t Sunrise=" + sunrise1.toTimeString() + "\tSunset=" + sunset1.toTimeString() + "\t" + (isDaytime ? "isDay\n" : "isNight\n")) meteogramModel.append({ from: dateFrom, to: dateTo, isDaytime: isDaytime, - temperature: airtmp, - precipitationAvg: prec, - precipitationMax: prec, - precipitationLabel: (counter === 1) ? "mm" : "", - windDirection: parseFloat(wd), - windSpeedMps: parseFloat(ws), - pressureHpa: parseFloat(ap), - iconName: geticonNumber(icon) + temperature: parseFloat(airtmp), + precipitationAvg: parseFloat(prec), + precipitationMax: parseFloat(prec), + precipitationLabel: (counter === 1) ? "mm" : "", + windDirection: parseFloat(wd), + windSpeedMps: parseFloat(ws), + pressureHpa: parseFloat(ap), + iconName: geticonNumber(icon) }) dateFrom = dateTo i++ } - main.meteogramModelChanged = !main.meteogramModelChanged + main.loadingDataComplete = true } function formatTime(ISOdate) { @@ -127,164 +291,65 @@ Item { return Qt.locale().dayName(date.getDay(), Locale.ShortFormat) + ' ' + date.getDate() + '/' + (date.getMonth() + 1) } - function updateNextDaysModel(readingsArray) { - - function resetobj() { - var obj = {} - obj.hidden0 = true - obj.isPast0 = true - obj.hidden1 = true - obj.isPast1 = true - obj.hidden2 = true - obj.isPast2 = true - obj.hidden3 = true - obj.isPast3 = true - return obj + function successSRAS(jsonString) { + dbgprint2("successSRAS") + var readingsArray = JSON.parse(jsonString) + dbgprint("Sunrise:" + JSON.stringify(readingsArray.properties.sunrise)) + let offset = 0 + switch (main.timezoneType) { + case (0): + offset = dataSource.data["Local"]["Offset"] + break; + case (1): + offset = 0 + break; + case (2): + offset = currentPlace.timezoneOffset + break; } - nextDaysModel.clear() - var readingsLength = (readingsArray.properties.timeseries.length) - 1 - var dateNow = new Date() - var obj = resetobj() - for (var i = 0; i < readingsLength; i++) { - var reading = readingsArray.properties.timeseries[i] - var readingDate = new Date(Date.parse(reading.time)).toLocaleDateString(locale, 'ddd d MMM') - var readingTime = formatTime(reading.time) - if (reading.data.next_1_hours) { - var iconnumber = geticonNumber(reading.data.next_1_hours.summary.symbol_code) - } - else if (reading.data.next_6_hours) { - var iconnumber = geticonNumber(reading.data.next_6_hours.summary.symbol_code) - } else { - var iconnumber = undefined - } - var temperature = reading.data.instant.details["air_temperature"] - - if (readingTime === "00:00") { - if ( !(obj.isPast0 && obj.isPast1 && obj.isPast2 && obj.isPast3) && (nextDaysModel.count < 8)) { - nextDaysModel.append(obj) } - obj = resetobj() - obj.dayTitle = readingDate - } - - if ((readingTime === "00:00") || (readingTime === "03:00")) { - obj.temperature0 = temperature - obj.iconName0 = iconnumber - obj.hidden0 = false - obj.isPast0 = false - } - - if ((readingTime === "06:00") || (readingTime === "09:00")) { - obj.temperature1 = temperature - obj.iconName1 = iconnumber - obj.hidden1 = false - obj.isPast1 = false - } - - if ((readingTime === "12:00") || (readingTime === "15:00")) { - obj.temperature2 = temperature - obj.iconName2 = iconnumber - obj.hidden2 = false - obj.isPast2 = false - } + if ((readingsArray.properties !== undefined)) { + currentWeatherModel.sunRise = new Date(readingsArray.properties.sunrise.time) + currentWeatherModel.sunSet = new Date(readingsArray.properties.sunset.time) - if ((readingTime === "18:00") || (readingTime === "21:00")) { - obj.temperature3 = temperature - obj.iconName3 = iconnumber - obj.hidden3 = false - obj.isPast3 = false - if (! obj.dayTitle) { - obj.dayTitle = readingDate - } - } + currentWeatherModel.sunRiseTime = UnitUtils.convertDate(currentWeatherModel.sunRise, main.timezoneType, offset).toTimeString() + currentWeatherModel.sunSetTime = UnitUtils.convertDate(currentWeatherModel.sunSet, main.timezoneType, offset).toTimeString() } - main.nextDaysCount = nextDaysModel.count - } - - function successSRAS(jsonString) { - dbgprint("succesSRAS") - var readingsArray=JSON.parse(jsonString) - if ((readingsArray.location !== undefined)) { - additionalWeatherInfo.sunRise = new Date(readingsArray.location.time[0].sunrise.time) - additionalWeatherInfo.sunSet = new Date(readingsArray.location.time[0].sunset.time) + dbgprint(JSON.stringify(currentWeatherModel)) + sunRiseSetFlag = true + var weatherURL = urlPrefix + placeIdentifier + if (! useOnlineWeatherData) { + weatherURL = Qt.resolvedUrl('../../code/weather/weather.json') } - if ((readingsArray.results !== undefined)) { - additionalWeatherInfo.sunRise = new Date(readingsArray.results.sunrise) - additionalWeatherInfo.sunSet = new Date(readingsArray.results.sunset) - } - additionalWeatherInfo.sunRiseTime=formatTime(UnitUtils.convertDate(additionalWeatherInfo.sunRise,main.timezoneType,main.timezoneOffset).toISOString()) - additionalWeatherInfo.sunSetTime=formatTime(UnitUtils.convertDate(additionalWeatherInfo.sunSet,main.timezoneType,main.timezoneOffset).toISOString()) - sunRiseSetFlag=true - var xhr2 = DataLoader.fetchJsonFromInternet(urlPrefix + placeIdentifier, successWeather, failureCallback) -// var xhr2 = DataLoader.fetchJsonFromInternet('http://localhost/weather.json', successWeather, failureCallback) + dbgprint("Downloading Weather Data from: " + weatherURL) + var xhr2 = DataLoader.fetchJsonFromInternet(weatherURL, successWeather, failureCallback) } function failureCallback() { dbgprint("DOH!") + currentWeatherModel = emptyWeatherModel() + // loadingData.loadingDatainProgress=false + main.loadingDataComplete = true } function loadCompleted() { - refreshTooltipSubText() successCallback() } function calculateOffset(seconds) { - let hrs = String("0" + Math.floor(Math.abs(seconds) / 3600)).slice(-2) - let mins = String("0" + (seconds % 3600)).slice(-2) - let sign = (seconds >= 0) ? "+" : "-" - return(sign + hrs + ":" + mins) + let hrs = String("0" + Math.floor(Math.abs(seconds) / 3600)).slice(-2) + let mins = String("0" + (seconds % 3600)).slice(-2) + let sign = (seconds >= 0) ? "+" : "-" + return(sign + hrs + ":" + mins) } - - function isDST(DSTPeriods) { - if(DSTPeriods === undefined) - return (false) - - let now = new Date().getTime() / 1000 - let isDSTflag = false - for (let f = 0; f < DSTPeriods.length; f++) { - if ((now >= DSTPeriods[f].DSTStart) && (now <= DSTPeriods[f].DSTEnd)) { - isDSTflag = true - } - } - return(isDSTflag) - } - - weatherDataFlag = false - sunRiseSetFlag = false - var TZURL = "" - if (locationObject.timezoneID === -1) { - console.log("[weatherWidget] Timezone Data not available - using sunrise-sunset.org API") - TZURL = "https://api.sunrise-sunset.org/json?formatted=0&" + placeIdentifier - } else { - dbgprint("Timezone Data is available - using met.no API") - if (isDST(TZ.TZData[locationObject.timezoneID].DSTData)) { - timezoneShortName = TZ.TZData[locationObject.timezoneID].DSTName - } else { - timezoneShortName = TZ.TZData[locationObject.timezoneID].TZName - } - TZURL = 'https://api.met.no/weatherapi/sunrise/2.0/.json?' + placeIdentifier.replace("altitude","height") + "&date=" + formatDate(new Date().toISOString()) - if (isDST(TZ.TZData[locationObject.timezoneID].DSTData)) { - TZURL += "&offset=" + calculateOffset(TZ.TZData[locationObject.timezoneID].DSTOffset) - main.timezoneOffset = TZ.TZData[locationObject.timezoneID].DSTOffset - } else { - TZURL += "&offset=" + calculateOffset(TZ.TZData[locationObject.timezoneID].Offset) - main.timezoneOffset = TZ.TZData[locationObject.timezoneID].Offset - } - } - - dbgprint(TZURL); - - var xhr1 = DataLoader.fetchJsonFromInternet(TZURL, successSRAS, failureCallback) -// var xhr1 = DataLoader.fetchJsonFromInternet('http://localhost/sunrisesunset.json?'+TZURL, successSRAS, failureCallback) - return [xhr1] } function reloadMeteogramImage(placeIdentifier) { - main.overviewImageSource = '' + main.overviewImageSource = "" } function geticonNumber(text) { - var codes = { + var codes = { "clearsky": "1", "cloudy": "4", "fair": "2", diff --git a/package/contents/ui/providers/OpenWeatherMap.qml b/package/contents/ui/providers/OpenWeatherMap.qml index 2a6ff43..da6eb2b 100644 --- a/package/contents/ui/providers/OpenWeatherMap.qml +++ b/package/contents/ui/providers/OpenWeatherMap.qml @@ -14,8 +14,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -import QtQuick 2.2 -import QtQuick.XmlListModel 2.0 +import QtQuick +import QtQml.XmlListModel +import org.kde.plasma.plasma5support as Plasma5Support import "../../code/model-utils.js" as ModelUtils import "../../code/data-loader.js" as DataLoader import "../../code/unit-utils.js" as UnitUtils @@ -24,620 +25,466 @@ Item { id: owm property string providerId: 'owm' - property string urlPrefix: 'http://api.openweathermap.org/data/2.5' property string appIdAndModeSuffix: '&units=metric&mode=xml&appid=5819a34c58f8f07bc282820ca08948f1' + property int xmlModelCurrentStatus: xmlModelCurrent.status + property int xmlModelLongTermStatus: xmlModelLongTerm.status + property int xmlModelHourByHourStatus: xmlModelHourByHour.status + property bool xmlModelComplete: (xmlModelCurrent.status === XmlListModel.Ready) && (xmlModelHourByHour.status === XmlListModel.Ready) && (xmlModelLongTerm.status === XmlListModel.Ready) -// DEBUGGING URLs -// property string urlPrefix: 'http://localhost/forecast' -// property string appIdAndModeSuffix: '' - - XmlListModel { - id: xmlModelLongTerm - query: '/weatherdata/forecast/time' - - XmlRole { - name: 'date' - query: '@day/string()' - } - XmlRole { - name: 'temperatureMorning' - query: 'temperature/@morn/number()' - } - XmlRole { - name: 'temperatureDay' - query: 'temperature/@day/number()' - } - XmlRole { - name: 'temperatureEvening' - query: 'temperature/@eve/number()' - } - XmlRole { - name: 'temperatureNight' - query: 'temperature/@night/number()' - } - XmlRole { - name: 'iconName' - query: 'symbol/@number/string()' - } - XmlRole { - name: 'windDirection' - query: 'windDirection/@deg/number()' - } - XmlRole { - name: 'windSpeedMps' - query: 'windSpeed/@mps/number()' - } - XmlRole { - name: 'pressureHpa' - query: 'pressure/@value/number()' - } - } - - XmlListModel { - id: xmlModelHourByHour - query: '/weatherdata/forecast/time' - - XmlRole { - name: 'from' - query: '@from/string()' - } - XmlRole { - name: 'to' - query: '@to/string()' - } - XmlRole { - name: 'temperature' - query: 'temperature/@value/number()' - } - XmlRole { - name: 'iconName' - query: 'symbol/@number/string()' - } - XmlRole { - name: 'windDirection' - query: 'windDirection/@deg/number()' - } - XmlRole { - name: 'windSpeedMps' - query: 'windSpeed/@mps/number()' - } - XmlRole { - name: 'pressureHpa' - query: 'pressure/@value/number()' - } - XmlRole { - name: 'precipitationAvg' - query: 'precipitation/@value/number()' - } - } - - XmlListModel { - id: xmlModelCurrent - query: '/current' - - XmlRole { - name: 'temperature' - query: 'temperature/@value/number()' - } - XmlRole { - name: 'iconName' - query: 'weather/@number/string()' - } - XmlRole { - name: 'humidity' - query: 'humidity/@value/number()' - } - XmlRole { - name: 'pressureHpa' - query: 'pressure/@value/number()' - } - XmlRole { - name: 'windSpeedMps' - query: 'wind/speed/@value/number()' - } - XmlRole { - name: 'windDirection' - query: 'wind/direction/@value/number()' - } - XmlRole { - name: 'cloudiness' - query: 'clouds/@value/number()' - } - XmlRole { - name: 'updated' - query: 'lastupdate/@value/string()' - } - XmlRole { - name: 'rise' - query: 'city/sun/@rise/string()' - } - XmlRole { - name: 'set' - query: 'city/sun/@set/string()' - } - XmlRole { - name: 'timezoneOffset' - query: 'city/timezone/number()' - } - } - - property int timezoneType : main.timezoneType - - onTimezoneTypeChanged: { - getTimeZoneName() - } - - function getTimeZoneName() { - switch (timezoneType) { - case 0: - timezoneShortName = getLocalTimeZone() - break - case 1: - timezoneShortName = i18n("UTC") - break - case 2: - timezoneShortName="LOCAL" - break - } - dbgprint("timezoneName changed to:" + timezoneShortName) - } - - property var xmlModelLongTermStatus: xmlModelLongTerm.status - property var xmlModelCurrentStatus: xmlModelCurrent.status - property var xmlModelHourByHourStatus: xmlModelHourByHour.status - - function parseDate(dateString) { - return new Date(dateString + '.000Z') - } - - onXmlModelCurrentStatusChanged: { - if (xmlModelCurrent.status != XmlListModel.Ready) { - return - } - dbgprint('xmlModelCurrent ready') - xmlModelReady() - } - - onXmlModelHourByHourStatusChanged: { - if (xmlModelHourByHour.status != XmlListModel.Ready) { + onXmlModelCompleteChanged: { + if (xmlModelComplete == false) { return } - dbgprint('xmlModelHourByHour ready') - xmlModelReady() - } - - onXmlModelLongTermStatusChanged: { - if (xmlModelLongTerm.status != XmlListModel.Ready) { - return - } - dbgprint('xmlModelLongTerm ready') - xmlModelReady() - } - - function xmlModelReady() { - if (xmlModelCurrent.status != XmlListModel.Ready) { - return - } - if (xmlModelHourByHour.status != XmlListModel.Ready) { - return - } - if (xmlModelLongTerm.status != XmlListModel.Ready) { - return - } - dbgprint('all xml models ready') - var todayTimeObj = createTodayTimeObj() - updateTodayModels(todayTimeObj) - updateMeteogramModel() + getTimeZoneName() + updatecurrentWeather() updateNextDaysModel() - refreshTooltipSubText() + buildMetogramData() + loadCompleted() } + function parseISOString(s) { + var b = s.split(/\D+/) + return new Date(Date.UTC(b[0], --b[1], b[2], b[3], b[4], b[5], b[6])) + } - function createTodayTimeObj() { - function formatTime(ISOdate) { - return ISOdate.substr(11,5) + function loadDataFromInternet(successCallback, failureCallback, locationObject) { + dbgprint2("OWM loadDataFromInternet") + var loadedData = { + current: null, + hourByHour: null, + longTerm: null } + let url1 = "" + let url2 = "" + let url3 = "" - var currentTimeObj = xmlModelCurrent.get(0) - additionalWeatherInfo.sunRise = new Date(Date.parse(currentTimeObj.rise)) - additionalWeatherInfo.sunSet = new Date(Date.parse(currentTimeObj.set)) - additionalWeatherInfo.sunRiseTime=new Date(UnitUtils.localTime(additionalWeatherInfo.sunRise,currentTimeObj.timezoneOffset)) - additionalWeatherInfo.sunSetTime=new Date(UnitUtils.localTime(additionalWeatherInfo.sunSet,currentTimeObj.timezoneOffset)) - main.timezoneOffset=currentTimeObj.timezoneOffset - getTimeZoneName() - dbgprint('setting actual weather from current xml model') - dbgprint('sunRise: ' + parseDate(additionalWeatherInfo.sunRise)) - dbgprint('sunSet: ' + parseDate(additionalWeatherInfo.sunSet)) - dbgprint('current: ' + currentTimeObj.temperature) - return currentTimeObj + var placeIdentifier = locationObject.placeIdentifier + var versionParam = '&v=' + new Date().getTime() + if (! useOnlineWeatherData) { + url1 = Qt.resolvedUrl('../../code/weather/current.' + placeIdentifier + '.xml') + url2 = Qt.resolvedUrl('../../code/weather/daily.' + placeIdentifier + '.xml') + url3 = Qt.resolvedUrl('../../code/weather/forecast.' + placeIdentifier + '.xml') + } else { + + url1 = urlPrefix + '/weather?id=' + placeIdentifier + appIdAndModeSuffix + versionParam + url2 = urlPrefix + '/forecast/daily?id=' + placeIdentifier + '&cnt=8' + appIdAndModeSuffix + versionParam + url3 = urlPrefix + '/forecast?id=' + placeIdentifier + appIdAndModeSuffix + versionParam + } + dbgprint("xmlModelCurrent = " + url1) + dbgprint("xmlModelLongTerm = " + url2) + dbgprint("xmlModelHourByHour = " + url3) + xmlModelCurrent.source = url1 + xmlModelLongTerm.source = url2 + xmlModelHourByHour.source = url3 } - function updateTodayModels(todayTimeObj) { - - dbgprint('updating today models') + function updatecurrentWeather() { + dbgprint2('updatecurrentWeather (OWM)') var now = new Date() dbgprint('now: ' + now) + var tooOldCurrentDataLimit = new Date(now.getTime() - (2 * 60 * 60 * 1000)) - var nearFutureWeather = additionalWeatherInfo.nearFutureWeather + var nearFutureWeather = currentWeatherModel.nearFutureWeather + let obj=xmlModelCurrent.get(0) + let obj2=xmlModelHourByHour.get(1) + currentWeatherModel.temperature = obj.temperature + currentWeatherModel.iconName = obj.iconName + currentWeatherModel.nearFutureWeather.iconName = obj2.iconName + currentWeatherModel.nearFutureWeather.temperature = obj2.temperature + currentWeatherModel.humidity = obj.humidity + currentWeatherModel.pressureHpa = obj.pressureHpa + currentWeatherModel.windSpeedMps = obj.windSpeedMps + currentWeatherModel.windDirection = parseFloat(obj.windDirection) + currentWeatherModel.cloudiness = obj.cloudiness + currentWeatherModel.updated = obj.updated + let sunRise = Date.parse(obj.rise) + let sunSet = Date.parse(obj.set) + let updated = Date.parse(obj.updated) + let tzms = parseInt(obj.timezoneOffset) * 1000 + currentPlace.timezoneOffset = parseInt(obj.timezoneOffset) + currentWeatherModel.sunRise = new Date (sunRise) + currentWeatherModel.sunSet= new Date (sunSet) + currentWeatherModel.sunRiseTime = new Date (sunRise + tzms).toTimeString() + currentWeatherModel.sunSetTime = new Date (sunSet + tzms).toTimeString() + dbgprint("Updated=" + updated/1000 + "\t" + sunRise/1000 + "\t" + sunSet/1000) + dbgprint("Updated=" + updated/1000 + "\t" + (updated > sunRise) + "\t" + (updated < sunSet)) + currentWeatherModel.isDay = ((updated > sunRise) && (updated < sunSet)) ? 0 : 1 + dbgprint( + "Updated=" + new Date(updated).toTimeString() + + "\t Sunrise=" + currentWeatherModel.sunRiseTime + + "\tSunset=" + currentWeatherModel.sunSetTime + "\t" + + ((currentWeatherModel.isDay === 0) ? "isDay\n" : "isNight\n")) + + dbgprint2('EXIT updatecurrentWeather') + } - actualWeatherModel.clear() - actualWeatherModel.append(todayTimeObj) + function updateNextDaysModel() { + function blankObject() { + const myblankObject={} + for (let f = 0; f < 4; f++) { + myblankObject["temperature" + f] = -999 + myblankObject["iconName" + f] = '' + myblankObject['hidden' + f] = true + myblankObject['partOfDay' + f] = 0 - // set current models - nearFutureWeather.iconName = null - nearFutureWeather.temperature = null - var foundNow = false - for (var i = 0; i < xmlModelHourByHour.count; i++) { - var timeObj = xmlModelHourByHour.get(i) - var dateFrom = parseDate(timeObj.from) - var dateTo = parseDate(timeObj.to) - dbgprint('HOUR BY HOUR: dateFrom=' + dateFrom + ', dateTo=' + dateTo + ', i=' + i) - - if (!foundNow && dateFrom <= now && now <= dateTo) { - dbgprint('foundNow setting to true') - foundNow = true - if (actualWeatherModel.count === 0) { - dbgprint('adding to actualWeatherModel - temperature: ' + timeObj.temperature + ', iconName: ' + timeObj.iconName) - actualWeatherModel.append(timeObj) - } - continue } + return myblankObject + } - if (foundNow) { - nearFutureWeather.iconName = timeObj.iconName - nearFutureWeather.temperature = timeObj.temperature - dbgprint('setting near future - ' + nearFutureWeather.iconName + ', temp: ' + nearFutureWeather.temperature) - break + dbgprint2("updateNextDaysModel") + nextDaysModel.clear() + + var offset = 0 + switch (timezoneType) { + case (0): + offset = dataSource.data["Local"]["Offset"] + break; + case (1): + offset = 0 + break; + case (2): + offset = currentPlace.timezoneOffset + break; + } + let updatedDateTime = xmlModelCurrent.get(0).updated + let timezoneOffset = xmlModelCurrent.get(0).timezoneOffset + + let updatedDateTimeStamp = Date.parse(updatedDateTime) + // let updatedDateTimeStampLocal = convertToLocalTime(Date.parse(updatedDateTime),timezoneOffset * 1000) + let updatedDateTimeStampLocal = new Date(convertToLocalTime(updatedDateTime + "Z", offset)) + let hr = new Date(updatedDateTimeStampLocal).getHours() + let y = parseInt((hr + 3) / 6) +dbgprint("main.timezoneType= " + timezoneType + "\t= " + offset) + let dataTime = new Date(updatedDateTimeStamp) + dbgprint("XML Updated At:\t"+ updatedDateTime + "\t" + new Date(updatedDateTimeStamp) + "\t" + new Date(updatedDateTimeStampLocal)) + // dbgprint("XML Updated At:\t"+ t1 + "Z" + militaryGMTOffsetFromNumeric(tz1)) + // let t2 = Date.parse(t1 + "Z" + militaryGMTOffsetFromNumeric(tz1)) + // let t3 = new Date(t2) + // dbgprint("XML Updated At:\t" + t3 + " (local)") + // let timeArray = t1.split(/[T:-]/) + // let hr = parseInt(timeArray[3]) + // let x = 0 + // let y = parseInt((hr + 3) / 6) + + dbgprint2("HR = " + hr + "\tY = " + y) + + + + let ptr = 0 + let x = 0 + dbgprint("*********************************************************************") + dbgprint("Parsing Data starting at Row " + ptr + " of xmlModelLongTerm") + + let t = 0 + switch (timezoneType) { + case (0): + t = (dataSource.data["Local"]["Offset"] * 1000) - (timezoneOffset * 1000) + break; + case (1): + t = 0 + break; + case (2): + t = (timezoneOffset * 1000) + break; + } + let timeArray=["T03:00:00Z","T09:00:00Z","T15:00:00Z","T21:00:00Z"] + dbgprint2(t / 3600000) + let nextDaysData = blankObject() + while (ptr < xmlModelLongTerm.count) { + let obj = xmlModelLongTerm.get(ptr) + + for (var i = 0; i < 4; i++) { + let str=timeArray[i] + let localtime = convertToLocalTime(obj.date + str, t) + let hr = new Date(localtime).getUTCHours() + let y = parseInt((hr) / 6) + dbgprint(new Date(localtime) + "\t" + new Date(localtime).toUTCString() + "\tt=" + t + "\thr=" + hr + "\ty=" + y) + dbgprint("***" + new Date(updatedDateTimeStamp) + "\t" + localtime) + if (localtime >= new Date(updatedDateTimeStamp)) { + if (y === 0) { + nextDaysData['temperature0'] = parseInt(obj.temperatureMorning) + nextDaysData['iconName0'] = obj.iconName + dbgprint("Added data for Row " + (x + 1) + " Column " + (y + 1)) + nextDaysData['hidden0'] = false + } + if (y === 1) { + nextDaysData['temperature1'] = parseInt(obj.temperatureDay) + nextDaysData['iconName1'] = obj.iconName + dbgprint("Added data for Row " + (x + 1) + " Column " + (y + 1)) + nextDaysData['hidden1'] = false + } + if (y === 2) { + nextDaysData['temperature2'] = parseInt(obj.temperatureEvening) + nextDaysData['iconName2'] = obj.iconName + dbgprint("Added data for Row " + (x + 1) + " Column " + (y + 1)) + nextDaysData['hidden2'] = false + } + if (y === 3) { + // dbgprint2(obj.date) + nextDaysData['dayTitle'] = composeNextDayTitle(dataTime) + dataTime.setDate(dataTime.getDate() + 1) + + nextDaysData['temperature3'] = parseInt(obj.temperatureEvening) + nextDaysData['iconName3'] = obj.iconName + dbgprint("Added data for Row " + (x + 1) + " Column " + (y + 1)) + nextDaysData['hidden3'] = false + nextDaysModel.append(nextDaysData) + // for(const [key,value] of Object.entries(nextDaysData)) { console.log(` ${key}: ${value}`) } + nextDaysData = blankObject() + x++ + } + } } - } - dbgprint('result actualWeatherModel count: ' + actualWeatherModel.count) - dbgprint('result nearFutureWeather.iconName: ' + nearFutureWeather.iconName) +/* - } - function updateNextDaysModel() { - var nextDaysFixedCount = nextDaysCount + let fred = ((dataSource.data["Local"]["Offset"] * 1000) - (timezoneOffset * 1000)) / 3600000 - dbgprint('updating NEXT DAYS MODEL...') - var now = new Date() - dbgprint('now: ' + now) - dbgprint('orig hourByHour model count: ' + xmlModelHourByHour.count) - dbgprint('orig long term model count: ' + xmlModelLongTerm.count) + let t = Date.parse(obj.date + "T03:00:00Z") - var newObjectArray = [] + switch (timezoneType) { + case (0): + t = new Date(t - (timezoneOffset * 1000)) + break; + case (1): + t = new Date(t) + break; + case (2): + t = new Date(t + (dataSource.data["Local"]["Offset"] * 1000)) + break; + } + dbgprint(new Date(t).toUTCString()) + // dbgprint(new Date(t)) + // dbgprint(obj.date + "\t0 = " + "\tt=" + new Date(t - (timezoneOffset * 1000)).toUTCString()) + // dbgprint(obj.date + "\t1 = " + "\tt=" + new Date(t).toUTCString()) + // dbgprint(obj.date + "\t2 = " + "\tt=" + new Date(t + (offset * 1000)).toUTCString()) - var today0000 = new Date(new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime()) - var today0600 = new Date(today0000.getTime() + ModelUtils.hourDurationMs * 6) - var today1200 = new Date(today0000.getTime() + ModelUtils.hourDurationMs * 12) - var today1800 = new Date(today0000.getTime() + ModelUtils.hourDurationMs * 18) - function composeNextDayTitle(date) { - return Qt.locale().dayName(date.getDay(), Locale.ShortFormat) + ' ' + date.getDate() + '/' + (date.getMonth() + 1) - } +*/ - var lastObjectHourByHour = null - var lastDateNumber = now.getDate() - var lastDateToSet = today0000 - var current0000 = today0000 - var current0600 = today0600 - var current1200 = today1200 - var current1800 = today1800 - var next0000 = new Date(current1800.getTime() + ModelUtils.hourDurationMs * 6) - - dbgprint('current0000: ' + current0000) - dbgprint('current0600: ' + current0600) - dbgprint('current1200: ' + current1200) - dbgprint('current1800: ' + current1800) - dbgprint('next0000: ' + next0000) - for (var i = 0; i < xmlModelHourByHour.count; i++) { - var timeObj = xmlModelHourByHour.get(i) - var dateFrom = parseDate(timeObj.from) - var dateTo = parseDate(timeObj.to) - dbgprint('HOUR BY HOUR: dateFrom=' + dateFrom + ', dateTo=' + dateTo + ', i=' + i) - - // encountered old data -> continue to next - if (today0000 >= dateFrom) { - dbgprint('skipping this timeObj') - continue - } + // + "\t" + UnitUtils.convertDate(t, main.timezoneType, -currentPlace.timezoneOffset)) +// dbgprint(obj.date + "T03:00:00" + "\t" + convertToLocalTime(obj.date + "T03:00:00Z", 0)) +// + "\t" + convertToLocalTime(obj.date + "T03:00:00Z", offset * 1000)) +/* + let y1 = convertToLocalTime(obj.date + "T03:00:00Z", offset * 1000) + let y2 = convertToLocalTime(obj.date + "T09:00:00Z", offset * 1000) + let y3 = convertToLocalTime(obj.date + "T15:00:00Z", offset * 1000) + let y4 = convertToLocalTime(obj.date + "T21:00:00Z", offset * 1000) + dbgprint2(y1.getHours()) + dbgprint2(y2.getHours()) + dbgprint2(y3.getHours()) + dbgprint2(y4.getHours()) +*/ +/* - if (next0000 < dateFrom) { - current0000 = next0000 - current0600 = new Date(current0000.getTime() + ModelUtils.hourDurationMs * 6) - current1200 = new Date(current0000.getTime() + ModelUtils.hourDurationMs * 12) - current1800 = new Date(current0000.getTime() + ModelUtils.hourDurationMs * 18) - next0000 = new Date(current1800.getTime() + ModelUtils.hourDurationMs * 6) - dbgprint('current0000: ' + current0000) - dbgprint('current0600: ' + current0600) - dbgprint('current1200: ' + current1200) - dbgprint('current1800: ' + current1800) - dbgprint('next0000: ' + next0000) + nextDaysData['temperature3'] = parseInt(obj.temperatureNight) + nextDaysData['iconName3'] = obj.iconName + dbgprint("Added data for Row " + (x + 1) + " Column 4") + nextDaysData['hidden3'] = false + nextDaysData['dayTitle'] = composeNextDayTitle(dataTime) + dataTime.setDate(dataTime.getDate() + 1) + dbgprint("*** PUSHED ROW " + x + "\t" + nextDaysData['dayTitle']) + + nextDaysModel.append(nextDaysData) + // for(const [key,value] of Object.entries(nextDaysData)) { console.log(` ${key}: ${value}`) } + + x++ + y = 0 + nextDaysData = blankObject() + */ + ptr++ + } + + /* Overwrite nextDaysModel with more accurate data from Daily XML Model where available */ + x = 0 + y = 0 + ptr = 0 + nextDaysData=blankObject() + var offset = 0 + switch (timezoneType) { + case (0): + offset = dataSource.data["Local"]["Offset"] + break; + case (1): + offset = 0 + break; + case (2): + offset = currentPlace.timezoneOffset + break; + } + +dbgprint2("***************************************************") + while (ptr < xmlModelHourByHour.count) { + let obj = xmlModelHourByHour.get(ptr) + dbgprint(obj.from) + let t = convertToLocalTime(obj.from, offset * 1000) + let h = 3 + (parseInt(t.getHours() / 6) * 6) + y = parseInt(h / 6) + dbgprint("GetHours=" + t.getHours() + "\th=" + h + "\ty=" +y) + nextDaysData['dayTitle'] = nextDaysModel.get(x).dayTitle + nextDaysData['temperature' + y] = parseInt(obj.temperature) + nextDaysData['hidden' + y] = false + nextDaysData['iconName' + y] = obj.iconName + if (y === 3) { + dbgprint("*** Replaced ROW " + x + "\t" + nextDaysData['dayTitle']) + nextDaysModel.remove(x,1) + nextDaysModel.insert(x,nextDaysData) + nextDaysData=blankObject() + x++ + y = 0 } + ptr = ptr + 2 + } + dbgprint("nextDaysModel Count:" + nextDaysModel.count) + dbgprint2("EXIT updateNextDaysModel") + } - if (lastObjectHourByHour === null && current0000 < dateFrom && dateFrom < next0000) { - dbgprint('HBH creating new empty next object') - lastObjectHourByHour = ModelUtils.createEmptyNextDaysObject() - newObjectArray.push(lastObjectHourByHour) - - // today? - if (dateFrom <= now && now <= dateTo) { - dbgprint('setting today') - lastObjectHourByHour.dayTitle = i18n("today") - isToday = true - } else { - lastObjectHourByHour.dayTitle = composeNextDayTitle(dateTo) - } - } + function buildMetogramData() { + dbgprint2("buildMetogramData (OWM)" + currentPlace.identifier) - if (current0000 < dateFrom && dateTo <= current0600) { - dbgprint('found Q1 temp') + var offset = 0 + switch (timezoneType) { + case (0): + offset = dataSource.data["Local"]["Offset"] + break; + case (1): + offset = 0 + break; + case (2): + offset = currentPlace.timezoneOffset + break; + } + + dbgprint2("DEBUG:" + timezoneType + " " + offset) + meteogramModel.clear() - lastObjectHourByHour.tempInfoArray.push({ - temperature: timeObj.temperature, - iconName: timeObj.iconName, - isPast: now > current0600 - }) + var now = new Date(convertToLocalTime(xmlModelHourByHour.get(0).from, offset)) - } else if (current0600 < dateFrom && dateTo <= current1200) { - dbgprint('found Q2 temp') + var limitMsDifference = 1000 * 60 * 60 * 54 // 2.25 days - lastObjectHourByHour.tempInfoArray.push({ - temperature: timeObj.temperature, - iconName: timeObj.iconName, - isPast: now > current1200 - }) + var dateFrom = now + var dateTo = now + var sunrise1 = (currentWeatherModel.sunRise) + var sunset1 = (currentWeatherModel.sunSet) + var isDaytime = (dateFrom > sunrise1) && (dateFrom < sunset1) - } else if (current1200 < dateFrom && dateTo <= current1800) { - dbgprint('found Q3 temp') - lastObjectHourByHour.tempInfoArray.push({ - temperature: timeObj.temperature, - iconName: timeObj.iconName, - isPast: now > current1800 - }) + for (var i = 0; i < xmlModelHourByHour.count; i++) { + var obj = xmlModelHourByHour.get(i) + dateFrom = new Date(convertToLocalTime(xmlModelHourByHour.get(i).from + "Z", offset)) + dateTo = new Date(convertToLocalTime(xmlModelHourByHour.get(i).to + "Z", offset)) + if (i === 0) { + var firstFromMs = dateFrom.getTime() + } + dbgprint("DATEFROM\t" + obj.from + "\t\t" + dateFrom + "\t\t" + dateFrom.toUTCString()) + dbgprint("DATETO\t" + obj.to + "\t\t" + dateTo + "\t\t" + dateTo.toUTCString()) + dbgprint(dateTo + "\t\t" + new Date(dateTo).getTime() + "\t\t" + firstFromMs + "\t\t" + (new Date(dateTo).getTime() - firstFromMs) + "\t\t" + limitMsDifference ) + // dbgprint("dateFrom = " + dateFrom.toUTCString() + "\tSunrise = " + sunrise1.toUTCString() + "\tSunset = " + sunset1.toUTCString() + "\t" + (isDaytime ? "isDay" : "isNight")) + var prec = obj.precipitationAvg + if ((typeof(prec) === "string") && (prec === "")) { + prec = 0 + } + + meteogramModel.append({ + from: dateFrom, + to: dateTo, + isDaytime: isDaytime, + temperature: parseFloat(obj.temperature), + precipitationAvg: parseFloat(prec), + precipitationLabel: "", + precipitationMax: parseFloat(prec), + windDirection: parseFloat(obj.windDirection), + windSpeedMps: parseFloat(obj.windSpeedMps), + pressureHpa: parseFloat(obj.pressureHpa), + iconName: obj.iconName + }) + if (new Date(dateTo).getTime() - firstFromMs > limitMsDifference) { + dbgprint('breaking') + break + } + } + /* - } else if (current1800 < dateFrom && dateTo <= next0000) { - dbgprint('found Q4 temp') - lastObjectHourByHour.tempInfoArray.push({ - temperature: timeObj.temperature, - iconName: timeObj.iconName, - isPast: now > next0000 - }) - lastObjectHourByHour = null - } else { - dbgprint('skipping') - continue - } - lastDateToSet = dateTo - dbgprint('lastDateToSet: ' + lastDateToSet) + dbgprint2(now +" " + offset +" " + currentPlace.timezoneOffset) - } - dbgprint('setting next days from LONG TERM XML') - for (var i = 0; i < xmlModelLongTerm.count; i++) { - var timeObj = xmlModelLongTerm.get(i) - var dateFrom = Date.fromLocaleString(xmlLocale, timeObj.date, 'yyyy-MM-dd') - var dateTo = new Date(dateFrom.getTime()) - dateTo.setDate(dateTo.getDate() + 1) - dateTo = new Date(dateTo.getTime() - 1) - dbgprint('LONG TERM: dateFrom=' + dateFrom + ', dateTo=' + dateTo + ', now=' + now + ', i=' + i) + dbgprint(obj.from + "\t" + UnitUtils.convertDate(new Date(obj.from), main.timezoneType, offset) + "\t" + dateFrom + "\t" + UnitUtils.convertDate(dateFrom, main.timezoneType, offset)) - // encountered old data -> continue to next - if (lastDateToSet > dateTo) { - dbgprint('skipping this day') - continue - } - var lastObject - if (lastObjectHourByHour !== null) { - lastObject = lastObjectHourByHour - lastObjectHourByHour = null - } else { - lastObject = ModelUtils.createEmptyNextDaysObject() - newObjectArray.push(lastObject) - } - var isToday = false - if (dateFrom <= now && now <= dateTo) { - dbgprint('setting today') - lastObject.dayTitle = i18n("today") - isToday = true + if (dateFrom >= sunrise1) { + if (dateFrom < sunset1) { + isDaytime = true } else { - lastObject.dayTitle = composeNextDayTitle(dateTo) + sunrise1.setDate(sunrise1.getDate() + 1) + sunset1.setDate(sunset1.getDate() + 1) + isDaytime = false } - - if (lastObject.tempInfoArray.length === 0) { - dbgprint('setting temperatureMorning') - lastObject.tempInfoArray.push({ - temperature: timeObj.temperatureMorning, - iconName: timeObj.iconName, - isPast: isToday && now > today0600 - }) - } - if (lastObject.tempInfoArray.length === 1) { - dbgprint('setting temperatureDay') - lastObject.tempInfoArray.push({ - temperature: timeObj.temperatureDay, - iconName: timeObj.iconName, - isPast: isToday && now > today1200 - }) - } - if (lastObject.tempInfoArray.length === 2) { - dbgprint('setting temperatureEvening') - lastObject.tempInfoArray.push({ - temperature: timeObj.temperatureEvening, - iconName: timeObj.iconName, - isPast: isToday && now > today1800 - }) - } - if (lastObject.tempInfoArray.length === 3) { - dbgprint('setting temperatureNight') - lastObject.tempInfoArray.push({ - temperature: timeObj.temperatureNight, - iconName: timeObj.iconName, - isPast: false - }) - } - } - dbgprint('done setting next days from all models, now polishing created newObjectArray') - - // - // set next days model - // - nextDaysModel.clear() - newObjectArray.forEach(function (objToAdd) { - if (nextDaysModel.count >= nextDaysFixedCount) { - return - } - while (objToAdd.tempInfoArray.length < 4) { - objToAdd.tempInfoArray.unshift(null) - } - ModelUtils.populateNextDaysObject(objToAdd) - nextDaysModel.append(objToAdd) - }) - for (var i = 0; i < (nextDaysFixedCount - nextDaysModel.count); i++) { - nextDaysModel.append(ModelUtils.createEmptyNextDaysObject()) } - dbgprint('result nextDaysModel count: ' + nextDaysModel.count) - } - - function updateMeteogramModel() { - meteogramModel.clear() + /* + for (var i = 0; i < xmlModelHourByHour.count; i++) { + var obj = xmlModelHourByHour.get(i) + //dateFrom = convertToLocalTime(obj.from, currentPlace.timezoneOffset) + // dateTo = convertToLocalTime(obj.to, currentPlace.timezoneOffset) - var firstFromMs = null - var limitMsDifference = 1000 * 60 * 60 * 54 // 2.25 days - var now = new Date() + dateFrom = UnitUtils.convertDate(new Date(obj.from), main.timezoneType, offset) + dateTo = UnitUtils.convertDate(new Date(obj.to), main.timezoneType, offset) - var dateFrom = parseDate(xmlModelHourByHour.get(0).from) - var sunrise1 = parseDate(additionalWeatherInfo.sunRise) - var sunset1 = parseDate(additionalWeatherInfo.sunSet) - var isDaytime = (dateFrom > sunrise1) && (dateFrom < sunset1) - dbgprint("dateFrom = " + dateFrom.toUTCString() + "\tSunrise = " + sunrise1.toUTCString() + "\tSunset = " + sunset1.toUTCString() + "\t" + (isDaytime ? "isDay" : "isNight")) + dbgprint("obj.from=" + obj.from + "\tobj.to=" + obj.to + "\tdateFrom = " + dateFrom.toUTCString() + "\tSunrise = " + sunrise1.toUTCString() + "\tSunset = " + sunset1.toUTCString() + "\t" + (isDaytime ? "isDay" : "isNight")) - for (var i = 0; i < xmlModelHourByHour.count; i++) { - var obj = xmlModelHourByHour.get(i) - var dateFrom = parseDate(obj.from) - var dateTo = parseDate(obj.to) -// dbgprint('meteo fill: i=' + i + ', from=' + obj.from + ', to=' + obj.to) -// dbgprint('parsed: from=' + dateFrom + ', to=' + dateTo) if (now > dateTo) { continue } if (dateFrom <= now && now <= dateTo) { - dbgprint('foundNow') + // dbgprint('foundNow') dateFrom = now } - var prec = obj.precipitationAvg - if ((typeof(prec) === "string") && (prec === "")) { - prec = 0 - } - dbgprint("dateFrom = " + dateFrom.toUTCString()) - dbgprint("Sunrise = " + sunrise1.toUTCString()) - dbgprint("Sunset = " + sunset1.toUTCString()) - - if (dateFrom >= sunrise1) { - if (dateFrom < sunset1) { - isDaytime = true - } else { - sunrise1.setDate(sunrise1.getDate() + 1) - sunset1.setDate(sunset1.getDate() + 1) - isDaytime = false - } - } - dbgprint(isDaytime ? "isDay\n" : "isNight\n") - meteogramModel.append({ - from: dateFrom, - to: dateTo, - isDaytime: isDaytime, - temperature: parseInt(obj.temperature), - precipitationAvg: prec, - precipitationLabel: "", - precipitationMax: prec, - windDirection: obj.windDirection, - windSpeedMps: parseFloat(obj.windSpeedMps), - pressureHpa: parseFloat(obj.pressureHpa), - iconName: obj.iconName - }) - if (firstFromMs === null) { - firstFromMs = dateFrom.getTime() - } - if (dateTo.getTime() - firstFromMs > limitMsDifference) { - dbgprint('breaking') - break - } - } + // dbgprint("dateFrom = " + dateFrom.toUTCString() + "\tSunrise = " + sunrise1.toUTCString() + "\tSunset = " + sunset1.toUTCString()) - dbgprint('meteogramModel.count = ' + meteogramModel.count) - main.meteogramModelChanged = !main.meteogramModelChanged - } + // dbgprint(isDaytime ? "isDay\n" : "isNight\n") + // dbgprint2(new Date(Date.parse(obj.from))) + dbgprint("DateFrom=" + dateFrom.toISOString() + "\tLocal Time=" + UnitUtils.convertDate(dateFrom,2,currentPlace.timezoneOffset).toTimeString() + "\t Sunrise=" + sunrise1.toTimeString() + "\tSunset=" + sunset1.toTimeString()) - /** - * successCallback(contentToCache) - * failureCallback() - */ - function loadDataFromInternet(successCallback, failureCallback, locationObject) { - var placeIdentifier = locationObject.placeIdentifier - - var loadedCounter = 0 - - var loadedData = { - current: null, - hourByHour: null, - longTerm: null - } + if (firstFromMs === null) { + firstFromMs = new Date(dateFrom).getTime() + } - var versionParam = '&v=' + new Date().getTime() - function successLongTerm(xmlString) { - loadedData.longTerm = xmlString - successCallback(loadedData) } +*/ + dbgprint('meteogramModel.count = ' + meteogramModel.count) - function successHourByHour(xmlString) { - loadedData.hourByHour = xmlString - DataLoader.fetchXmlFromInternet(urlPrefix + '/forecast/daily?id=' + placeIdentifier + '&cnt=8' + appIdAndModeSuffix + versionParam, successLongTerm, failureCallback) - } + } - function successCurrent(xmlString) { - loadedData.current = xmlString - DataLoader.fetchXmlFromInternet(urlPrefix + '/forecast?id=' + placeIdentifier + appIdAndModeSuffix + versionParam, successHourByHour, failureCallback) + function convertToLocalTime(dateString, timezoneOffset) { + if ((dateString instanceof Date) || (typeof dateString === 'string')) { + dateString = Date.parse(dateString) } - var xhr1 = DataLoader.fetchXmlFromInternet(urlPrefix + '/weather?id=' + placeIdentifier + appIdAndModeSuffix + versionParam, successCurrent, failureCallback) - - return [xhr1] + return new Date(dateString + timezoneOffset) } - - function setWeatherContents(cacheContent) { - if (!cacheContent.longTerm || !cacheContent.hourByHour || !cacheContent.current) { - return false - } - xmlModelCurrent.xml = '' - xmlModelCurrent.xml = cacheContent.current - xmlModelLongTerm.xml = '' - xmlModelLongTerm.xml = cacheContent.longTerm - xmlModelHourByHour.xml = '' - xmlModelHourByHour.xml = cacheContent.hourByHour - return true + function composeNextDayTitle(date) { + dbgprint2("composeNextDayTitle " + date) + return Qt.locale().dayName(date.getDay(), Locale.ShortFormat) + ' ' + date.getDate() + '/' + (date.getMonth() + 1) } function getCreditLabel(placeIdentifier) { @@ -652,4 +499,136 @@ Item { main.overviewImageSource = '' } + function getTimeZoneName() { + dbgprint2("getTimeZoneName") + switch (timezoneType) { + case 0: + currentPlace.timezoneShortName = getLocalTimeZone() + break + case 1: + currentPlace.timezoneShortName = i18n("UTC") + break + case 2: + currentPlace.timezoneShortName="LOCAL" + break + } + dbgprint("timezoneName changed to:" + currentPlace.timezoneShortName) + } + + function localTime(date){ + let t = Date.parse(date) + parseInt(currentPlace.timezoneOffset) + return new Date(t) + } + function formatTime(ISOdate) { + return ISOdate.substr(11,5) + } + + function loadCompleted() { + main.loadingDataComplete = true + dataLoadedFromInternet() + } + + XmlListModel { + id: xmlModelCurrent + query: "/current" + + XmlListModelRole { name: "temperature"; elementName: "temperature"; attributeName: "value" } + XmlListModelRole { name: "iconName"; elementName: "weather"; attributeName: "number" } + XmlListModelRole { name: "humidity"; elementName: "humidity"; attributeName: "value" } + XmlListModelRole { name: "pressureHpa"; elementName: "pressure"; attributeName: "value" } + XmlListModelRole { name: "windSpeedMps"; elementName: "wind/speed"; attributeName: "value" } + XmlListModelRole { name: "windDirection"; elementName: "wind/direction"; attributeName: "value" } + XmlListModelRole { name: "cloudiness"; elementName: "clouds"; attributeName: "value" } + XmlListModelRole { name: "updated"; elementName: "lastupdate"; attributeName: "value" } + XmlListModelRole { name: "rise"; elementName: "city/sun"; attributeName: "rise" } + XmlListModelRole { name: "set"; elementName: "city/sun"; attributeName: "set" } + XmlListModelRole { name: "cityName"; elementName: "city"; attributeName: "name" } + XmlListModelRole { name: "timezoneOffset"; elementName: "city/timezone" } + + function get(i) { + var o = {} + for (var j = 0; j < roles.length; ++j) + { + o[roles[j].name] = data(index(i,0), Qt.UserRole + j) + } + return o + } + } + onXmlModelCurrentStatusChanged: { + if (xmlModelCurrent.status == XmlListModel.Error) { + dbgprint(xmlModelCurrent.errorString()) + } + if (xmlModelCurrent.status != XmlListModel.Ready) { + return + } else { + dbgprint("***xmlModelCurrent Done***") + } + } + + + XmlListModel { + id: xmlModelLongTerm + query: '/weatherdata/forecast/time' + XmlListModelRole { name: "date"; elementName: ""; attributeName: "day" } + XmlListModelRole { name: "temperatureMorning"; elementName: "temperature"; attributeName: "morn" } + XmlListModelRole { name: "temperatureDay"; elementName: "temperature"; attributeName: "day" } + XmlListModelRole { name: "temperatureEvening"; elementName: "temperature"; attributeName: "eve" } + XmlListModelRole { name: "temperatureNight"; elementName: "temperature"; attributeName: "night" } + XmlListModelRole { name: "iconName"; elementName: "symbol"; attributeName: "number" } + XmlListModelRole { name: "windDirection"; elementName: "windDirection"; attributeName: "deg" } + XmlListModelRole { name: "windSpeedMps"; elementName: "windSpeed"; attributeName: "mps" } + XmlListModelRole { name: "pressureHpa"; elementName: "pressure"; attributeName: "value" } + + function get(i) { + var o = {} + for (var j = 0; j < roles.length; ++j) + { + o[roles[j].name] = data(index(i,0), Qt.UserRole + j) + } + return o + } + } + onXmlModelLongTermStatusChanged: { + if (xmlModelLongTerm.status == XmlListModel.Error) { + dbgprint(xmlModelLongTerm.errorString()) + } + if (xmlModelLongTerm.status != XmlListModel.Ready) { + return + } else { + dbgprint("***xmlModelLongTerm Done***") + } + } + + XmlListModel { + id: xmlModelHourByHour + query: '/weatherdata/forecast/time' + XmlListModelRole { name: "from"; elementName: ""; attributeName: "from" } + XmlListModelRole { name: "to"; elementName: ""; attributeName: "to" } + XmlListModelRole { name: "temperature"; elementName: "temperature"; attributeName: "value" } + XmlListModelRole { name: "iconName"; elementName: "symbol"; attributeName: "number" } + XmlListModelRole { name: "windDirection"; elementName: "windDirection"; attributeName: "deg" } + XmlListModelRole { name: "windSpeedMps"; elementName: "windSpeed"; attributeName: "mps" } + XmlListModelRole { name: "pressureHpa"; elementName: "pressure"; attributeName: "value" } + XmlListModelRole { name: "precipitationAvg"; elementName: "precipitation"; attributeName: "value" } + + function get(i) { + var o = {} + for (var j = 0; j < roles.length; ++j) + { + o[roles[j].name] = data(index(i,0), Qt.UserRole + j) + } + return o + } + } + onXmlModelHourByHourStatusChanged: { + dbgprint("xmlModelHourByHour: " + xmlModelHourByHour.status) + if (xmlModelHourByHour.status == XmlListModel.Error) { + dbgprint(xmlModelHourByHour.errorString()) + } + if (xmlModelHourByHour.status != XmlListModel.Ready) { + return + } else { + dbgprint("***xmlModelHourByHour Done***") + } + } } diff --git a/package/metadata.desktop b/package/metadata.desktop deleted file mode 100644 index 7741e3c..0000000 --- a/package/metadata.desktop +++ /dev/null @@ -1,35 +0,0 @@ -[Desktop Entry] -Name=Weather Widget 2 -Comment=Plasmoid showing weather information from met.no server -Icon=weather-clouds -Type=Service -X-KDE-ServiceTypes=Plasma/Applet -X-Plasma-API=declarativeappletscript -X-Plasma-MainScript=ui/main.qml -X-Plasma-NotificationArea=true -X-KDE-PluginInfo-Category=Environment and Weather -X-KDE-ParentApp= -X-KDE-PluginInfo-Author=Kate Buckley -X-KDE-PluginInfo-Email=kate.buckley@gmail.com -X-KDE-PluginInfo-Name=org.kde.weatherWidget-2 -X-KDE-PluginInfo-Version=2.3.4.2 -X-KDE-PluginInfo-Website=https://github.com/blackadderkate/weather-widget-2 -X-KDE-PluginInfo-Depends= -X-KDE-PluginInfo-License=GPL2 -X-KDE-PluginInfo-EnabledByDefault=false -X-Plasma-RemoteLocation= - -Name[cs]=Weather Widget 2 -Name[de]=Weather Widget 2 -Name[nb]=Weather Widget 2 -Name[nl]=Weerwidget 2 -Name[ru]=Виджет погоды 2 -Name[sv]=Weather Widget 2 -Comment[ca_ES]=Plasmoid que mostra informació del temps del servidor de met.no -Comment[cs]=Widget pro předpověď počasí -Comment[de]=Plasmoid zeigt Wetterinformationen des met.no-Servers -Comment[nb]=Plasmoid som viser værinformasjon fra met.no -Comment[nl]=Een plasmoid die weerinformatie toont van de met.no-server -Comment[ru]=Плазмоид, показывающий информацию о погоде с сервера met.no -Comment[sv]=Plasmoid som visar väderinformation från met.no -Comment[zh_CN]=添加 Open Weather Map diff --git a/package/metadata.json b/package/metadata.json new file mode 100644 index 0000000..80e7a39 --- /dev/null +++ b/package/metadata.json @@ -0,0 +1,35 @@ +{ + "KPlugin": { + "Authors": [ + { + "Email": "kate.buckley@gmail.com", + "Name": "Kate Buckley" + } + ], + "Name": "Weather Widget 3", + "Name[cs]": "Weather Widget 3", + "Name[de]": "Weather Widget 3", + "Name[nb]": "Weather Widget 3", + "Name[nl]": "Weerwidget 3", + "Name[ru]": "Виджет погоды 3", + "Name[sv]": "Weather Widget 3", + "Category": "Environment and Weather", + "Description": "Plasmoid showing weather information from met.no server", + "Description[ca_ES]": "Plasmoid que mostra informació del temps del servidor de met.no", + "Description[cs]": "Widget pro předpověď počasí", + "Description[de]": "Plasmoid zeigt Wetterinformationen des met.no-Servers", + "Description[nb]": "Plasmoid som viser værinformasjon fra met.no", + "Description[nl]": "Een plasmoid die weerinformatie toont van de met.no-server", + "Description[ru]": "Плазмоид, показывающий информацию о погоде с сервера met.no", + "Description[sv]": "Plasmoid som visar väderinformation från met.no", + "Description[zh_CN]": "添加 Open Weather Map", + "Icon": "weather-clouds", + "Id": "org.kde.weatherWidget-3", + "Version": "3.0.4", + "License": "GPL2", + "Website": "https://github.com/blackadderkate/weather-widget-2" + }, + "X-Plasma-API-Minimum-Version": "6.0", + "X-Plasma-NotificationAreaCategory": "SystemServices", + "KPackageStructure": "Plasma/Applet" +} diff --git a/plugin/CMakeLists.txt b/plugin/CMakeLists.txt index 006c3f6..a647265 100644 --- a/plugin/CMakeLists.txt +++ b/plugin/CMakeLists.txt @@ -5,8 +5,8 @@ set(plasmoidplugin_SRCS add_library(plasmoidplugin SHARED ${plasmoidplugin_SRCS}) -target_link_libraries(plasmoidplugin Qt5::Quick KF5::Plasma) +target_link_libraries(plasmoidplugin Qt6::Quick Plasma::Plasma) -install(TARGETS plasmoidplugin DESTINATION ${QML_INSTALL_DIR}/org/kde/private/weatherWidget-2) +install(TARGETS plasmoidplugin DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/private/weatherWidget-3) -install(FILES qmldir DESTINATION ${QML_INSTALL_DIR}/org/kde/private/weatherWidget-2) +install(FILES qmldir DESTINATION ${KDE_INSTALL_QMLDIR}/org/kde/private/weatherWidget-3) diff --git a/plugin/backend.cpp b/plugin/backend.cpp index 03a9a72..3fda74c 100644 --- a/plugin/backend.cpp +++ b/plugin/backend.cpp @@ -15,7 +15,7 @@ void Backend::writeCache(const QString &cacheContent, const QString &plasmoidId) qDebug() << "backend: writing cache, plasmoidId = " + plasmoidId; - QString fileDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/plasmoids/org.kde.weatherWidget-2/"); + QString fileDir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/plasmoids/org.kde.weatherWidget-3/"); QDir().mkpath(fileDir); QString fileName(fileDir + "plasmoidId-" + plasmoidId + ".json"); @@ -25,7 +25,7 @@ void Backend::writeCache(const QString &cacheContent, const QString &plasmoidId) QFile file( fileName ); if (file.open(QIODevice::WriteOnly)) { QTextStream outstream( &file ); - outstream << cacheContent << endl; + outstream << cacheContent << "\n"; } else { qDebug() << "error opening file"; } @@ -38,7 +38,7 @@ QString Backend::readCache(const QString &plasmoidId) { qDebug() << "backend: reading cache, plasmoidId = " + plasmoidId; QString fileName(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)); - fileName += "/plasmoids/org.kde.weatherWidget-2/plasmoidId-"; + fileName += "/plasmoids/org.kde.weatherWidget-3/plasmoidId-"; fileName += plasmoidId; fileName += ".json"; diff --git a/plugin/plasmoidplugin.cpp b/plugin/plasmoidplugin.cpp index e3e1e08..5770073 100644 --- a/plugin/plasmoidplugin.cpp +++ b/plugin/plasmoidplugin.cpp @@ -6,7 +6,7 @@ void PlasmoidPlugin::registerTypes(const char *uri) { - Q_ASSERT(uri == QLatin1String("org.kde.private.weatherWidget-2")); + Q_ASSERT(uri == QLatin1String("org.kde.private.weatherWidget-3")); qmlRegisterType(uri, 1, 0, "Backend"); } diff --git a/plugin/qmldir b/plugin/qmldir index 7d32297..dc27a05 100644 --- a/plugin/qmldir +++ b/plugin/qmldir @@ -1,3 +1,3 @@ -module org.kde.private.weatherWidget +module org.kde.private.weatherWidget-3 plugin plasmoidplugin diff --git a/translations/CMakeLists.txt b/translations/CMakeLists.txt index afce81a..9c564c0 100644 --- a/translations/CMakeLists.txt +++ b/translations/CMakeLists.txt @@ -7,7 +7,7 @@ IF(NOT GETTEXT_MSGFMT_EXECUTABLE) ------") ELSE(NOT GETTEXT_MSGFMT_EXECUTABLE) - SET(catalogname plasma_applet_org.kde.weatherWidget-2) + SET(catalogname plasma_applet_org.kde.weatherWidget-3) FILE(GLOB PO_FILES po/*.po) SET(GMO_FILES) @@ -27,7 +27,7 @@ ELSE(NOT GETTEXT_MSGFMT_EXECUTABLE) ADD_CUSTOM_COMMAND(TARGET translations COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile} DEPENDS ${_poFile}) - INSTALL(FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo) + INSTALL(FILES ${_gmoFile} DESTINATION ${KDE_INSTALL_LOCALEDIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo) LIST(APPEND GMO_FILES ${_gmoFile}) ENDIF( _langCode ) diff --git a/translations/ReadMe.md b/translations/ReadMe.md index a79238f..ec6b073 100644 --- a/translations/ReadMe.md +++ b/translations/ReadMe.md @@ -1,20 +1,20 @@ | Locale | Lines | % Done| |----------|---------|-------| -| Template | 94 | | -| bg | 52/94 | 55% | -| ca_ES | 62/94 | 65% | -| cs | 41/94 | 43% | -| de | 94/94 | 100% | -| en | 0/94 | 0% | -| es | 52/94 | 55% | -| fr | 52/94 | 55% | -| hu_HU | 52/94 | 55% | -| it_IT | 52/94 | 55% | -| lt | 52/94 | 55% | -| nb | 88/94 | 93% | -| nl | 88/94 | 93% | -| pl | 50/94 | 53% | -| ru | 94/94 | 100% | -| sv | 88/94 | 93% | -| zh_CN | 53/94 | 56% | -| zh_TW | 52/94 | 55% | +| Template | 83 | | +| bg | 48/83 | 57% | +| ca_ES | 54/83 | 65% | +| cs | 35/83 | 42% | +| de | 79/83 | 95% | +| en | 0/83 | 0% | +| es | 47/83 | 56% | +| fr | 48/83 | 57% | +| hu_HU | 47/83 | 56% | +| it_IT | 47/83 | 56% | +| lt | 47/83 | 56% | +| nb | 76/83 | 91% | +| nl | 77/83 | 92% | +| pl | 77/83 | 92% | +| ru | 79/83 | 95% | +| sv | 76/83 | 91% | +| zh_CN | 48/83 | 57% | +| zh_TW | 48/83 | 57% | diff --git a/translations/po/CMakeLists.txt b/translations/po/CMakeLists.txt deleted file mode 100644 index 8c77f10..0000000 --- a/translations/po/CMakeLists.txt +++ /dev/null @@ -1,36 +0,0 @@ -FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt) - -IF(NOT GETTEXT_MSGFMT_EXECUTABLE) - MESSAGE( -"------ - NOTE: msgfmt not found. Translations will *not* be installed -------") -ELSE(NOT GETTEXT_MSGFMT_EXECUTABLE) - - SET(catalogname plasma_applet_org.kde.weatherWidget) - - FILE(GLOB PO_FILES po/*.po) - SET(GMO_FILES) - - ADD_CUSTOM_TARGET(translations ALL DEPENDS ${GMO_FILES}) - - FOREACH(_poFile ${PO_FILES}) - GET_FILENAME_COMPONENT(_poFileName ${_poFile} NAME) - STRING(REGEX REPLACE "^${catalogname}_?" "" _langCode ${_poFileName} ) - STRING(REGEX REPLACE "\\.po$" "" _langCode ${_langCode} ) - - IF( _langCode ) - #GET_FILENAME_COMPONENT(_lang ${_poFile} NAME_WE) - STRING(REGEX REPLACE "\\.po$" "" _lang ${_poFileName} ) - SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) - - ADD_CUSTOM_COMMAND(TARGET translations - COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile} - DEPENDS ${_poFile}) - INSTALL(FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo) - LIST(APPEND GMO_FILES ${_gmoFile}) - ENDIF( _langCode ) - - ENDFOREACH(_poFile ${PO_FILES}) - -ENDIF(NOT GETTEXT_MSGFMT_EXECUTABLE) diff --git a/translations/po/bg.po b/translations/po/bg.po index 4ffef6d..0db6a3f 100644 --- a/translations/po/bg.po +++ b/translations/po/bg.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-01-03 22:02+0000\n" "Last-Translator: bvbfan\n" "Language-Team: bvbfan\n" @@ -16,9 +16,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Language: bg\n" +"X-Source-Language: en\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -26,14 +29,17 @@ msgid "Plasmoid showing weather information from met.no server" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "" @@ -108,8 +114,8 @@ msgid "Layout" msgstr "Оформление" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Тип оформление:" +msgid "Layout type" +msgstr "Тип оформление" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -132,8 +138,8 @@ msgid "In-Tray Settings" msgstr "Настройки за системният панел" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Активен за:" +msgid "Active timeout" +msgstr "Активен за" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -151,11 +157,11 @@ msgstr "" "панел." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -164,101 +170,79 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Добави Open Weather Map място" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Постави URL тук" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Град" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Намери ID-то на своят град тук:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"... и Копирай тук цялото URL\n" -"http://openweathermap.org/city/2946447 for Bonn, Germany." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "" +msgid "Location" +msgstr "Местоположение" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" +msgid "Area" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "" +msgid "Latitude" +msgstr "Ширина" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Добави Met.no Map място" +msgid "Longitude" +msgstr "Географска ширина" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." +msgid "Altitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Времева зона" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Plasmoid version" +msgstr "Джаджа версия" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "" +msgid "Source" +msgstr "Ресурс" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Place Identifier" +msgstr "Идентификатор за място" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "" +msgid "Displayed as" +msgstr "Покажи като" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" -msgstr[1] "" +msgid "Miscellaneous" +msgstr "Други" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Ширина" +msgid "Reload interval" +msgstr "Интервал на обновяване" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Географска ширина" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "мин" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Идентификатор за място" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -270,95 +254,80 @@ msgid "Enter place alias" msgstr "Добави място" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" +msgid "Add Open Weather Map Place" +msgstr "Добави Open Weather Map място" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Местоположение" +msgid "Paste URL here" +msgstr "Постави URL тук" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" +msgid "City alias" +msgstr "Град" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "" +msgid "Find your city ID by searching here" +msgstr "Намери ID-то на своят град тук" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" +"... и Копирай тук цялото URL\n" +"http://openweathermap.org/city/2946447 for Bonn, Germany." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "" +msgid "Add Met.no Map Place" +msgstr "Добави Met.no Map място" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Джаджа версия:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Ресурс" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Покажи като" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Действие" +msgid "URL" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Други" +msgid "Location Search" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Интервал на обновяване:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "мин" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Температура:" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Налягане:" +msgid "Temperature" +msgstr "Температура" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Скоростта на вятъра:" +msgid "Pressure" +msgstr "Налягане" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Времева зона:" +msgid "Wind speed" +msgstr "Скоростта на вятъра" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -366,6 +335,7 @@ msgstr "Локално време" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -373,29 +343,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Следващо местоположение" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" +msgid "Previous Location" msgstr "" #: ../../package/contents/ui/FullRepresentation.qml -msgid "Previous Location" +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Поднови Обновяването" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Спри Обновяването" - -#: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "преди %1" @@ -416,18 +377,54 @@ msgid "in" msgstr "" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "днес" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Layout type:" +#~ msgstr "Тип оформление:" + +#~ msgid "Active timeout:" +#~ msgstr "Активен за:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Намери ID-то на своят град тук:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Джаджа версия:" + +#~ msgid "Action" +#~ msgstr "Действие" + +#~ msgid "Reload interval:" +#~ msgstr "Интервал на обновяване:" + +#~ msgid "Temperature:" +#~ msgstr "Температура:" + +#~ msgid "Pressure:" +#~ msgstr "Налягане:" + +#~ msgid "Wind speed:" +#~ msgstr "Скоростта на вятъра:" + +#~ msgid "Timezone:" +#~ msgstr "Времева зона:" + +#~ msgid "Resume Updating" +#~ msgstr "Поднови Обновяването" + +#~ msgid "Pause Updating" +#~ msgstr "Спри Обновяването" + +#~ msgid "today" +#~ msgstr "днес" + #~ msgid "Offline mode" #~ msgstr "Работа без интернет" diff --git a/translations/po/build.sh b/translations/po/build.sh index e27ce25..5d1e4fa 100755 --- a/translations/po/build.sh +++ b/translations/po/build.sh @@ -6,8 +6,9 @@ # Eg: contents/locale/fr_CA/LC_MESSAGES/plasma_applet_org.kde.plasma.eventcalendar.mo DIR=`cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd` -plasmoidName=`kreadconfig5 --file="$DIR/../../package/metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Name"` -website=`kreadconfig5 --file="$DIR/../../package/metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Website"` +plasmoidName=`jq -r .KPlugin.Id "$DIR/../../package/metadata.json"` +website=`jq -r .KPlugin.Website "$DIR/../../package/metadata.json"` + bugAddress="$website" packageRoot=".." # Root of translatable sources projectName="plasma_applet_${plasmoidName}" # project name diff --git a/translations/po/ca_ES.po b/translations/po/ca_ES.po index 092f64b..69d1d58 100644 --- a/translations/po/ca_ES.po +++ b/translations/po/ca_ES.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: weatherWidget-2\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-02-13 14:00+0100\n" "Last-Translator: Eduard Selma \n" "Language-Team: \n" @@ -17,9 +17,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.4.2\n" +"X-Language: es_ES\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -27,14 +29,17 @@ msgid "Plasmoid showing weather information from met.no server" msgstr "Plasmoid que mostra informació del temps del servidor de met.no" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "" @@ -109,8 +114,8 @@ msgid "Layout" msgstr "Format" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Tipus de format:" +msgid "Layout type" +msgstr "Tipus de format" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -133,8 +138,8 @@ msgid "In-Tray Settings" msgstr "Ajustos a la Safata" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Temps d'espera actiu:" +msgid "Active timeout" +msgstr "Temps d'espera actiu" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -152,11 +157,11 @@ msgstr "" "safata d'entrada als paràmetres." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -165,102 +170,80 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Afegeix un lloc de l'Open Weather Map" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Enganxeu el URL aquí" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Àlies de la població" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Trobeu l'ID de la vostra localitat cercant aquí:" +msgid "Location" +msgstr "Ubicació" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." +msgid "Area" msgstr "" -"...i enganxeu el URL complet\n" -"Ex:. http://openweathermap.org/city/2946447 per Bonn, Alemanya." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "Error!" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" -msgstr "Confirmació" +msgid "Latitude" +msgstr "Latitud" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "Voleu seleccionar aquest lloc?" +msgid "Longitude" +msgstr "Longitud" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Afegeix un lloc de Met.no" +msgid "Altitude" +msgstr "Altura" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Fus horari" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "La Latitud no està entre -90 i 90." +msgid "Plasmoid version" +msgstr "Versió del plasmoid" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Source" +msgstr "Origen" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "" +msgid "Place Identifier" +msgstr "Identificador de lloc" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Displayed as" +msgstr "Visualitzat com" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." -msgstr "El Nom del Lloc està buit." +msgid "Miscellaneous" +msgstr "Miscelània" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "Hi ha un error!" -msgstr[1] "Hi han %1 errors!" +msgid "Reload interval" +msgstr "Versió del plasmoid" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Latitud" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "min" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" -msgstr "Altura" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" -msgstr "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Identificador de lloc" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" -msgstr "Cerca" +msgid "Weather icons created by Erik Flowers." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml msgid "Change Displayed As" @@ -271,102 +254,88 @@ msgid "Enter place alias" msgstr "Entreu l'àlies del lloc" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "Cerca del Lloc" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Ubicació" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" +msgid "Add Open Weather Map Place" +msgstr "Afegeix un lloc de l'Open Weather Map" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "" +msgid "Paste URL here" +msgstr "Enganxeu el URL aquí" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." -msgstr "" +msgid "City alias" +msgstr "Àlies de la població" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "" +msgid "Find your city ID by searching here" +msgstr "Trobeu l'ID de la vostra localitat cercant aquí" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" +"...i enganxeu el URL complet\n" +"Ex:. http://openweathermap.org/city/2946447 per Bonn, Alemanya." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Versió del plasmoid:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Origen" +msgid "Add Met.no Map Place" +msgstr "Afegeix un lloc de Met.no" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Visualitzat com" +msgid "Search" +msgstr "Cerca" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Acció" +msgid "URL" +msgstr "URL" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Miscelània" +msgid "Location Search" +msgstr "Cerca del Lloc" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Interval d'actualització:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "min" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." -msgstr "" +msgid "Confirmation" +msgstr "Confirmació" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Temperatura:" +msgid "Temperature" +msgstr "Temperatura" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Pressió:" +msgid "Pressure" +msgstr "Pressió" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" +msgid "Wind speed" msgstr "Velocitat del vent:" -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Fus horari:" - #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" msgstr "Hora local" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -374,29 +343,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Propera ubicació" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" +msgid "Previous Location" msgstr "" #: ../../package/contents/ui/FullRepresentation.qml -msgid "Previous Location" +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Continua l'actualització" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Atura l'actualització" - -#: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "Fa %1" @@ -417,18 +377,71 @@ msgid "in" msgstr "" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "avui" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Layout type:" +#~ msgstr "Tipus de format:" + +#~ msgid "Active timeout:" +#~ msgstr "Temps d'espera actiu:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Trobeu l'ID de la vostra localitat cercant aquí:" + +#~ msgid "Error!" +#~ msgstr "Error!" + +#~ msgid "Do you want to select this place?" +#~ msgstr "Voleu seleccionar aquest lloc?" + +#~ msgid "The Latitude is not between -90 and 90." +#~ msgstr "La Latitud no està entre -90 i 90." + +#~ msgid "The Place Name is empty." +#~ msgstr "El Nom del Lloc està buit." + +#~ msgid "There is an error!" +#~ msgid_plural "There are %1 errors!" +#~ msgstr[0] "Hi ha un error!" +#~ msgstr[1] "Hi han %1 errors!" + +#~ msgid "Plasmoid version:" +#~ msgstr "Versió del plasmoid:" + +#~ msgid "Action" +#~ msgstr "Acció" + +#~ msgid "Reload interval:" +#~ msgstr "Versió del plasmoid:" + +#~ msgid "Temperature:" +#~ msgstr "Temperatura:" + +#~ msgid "Pressure:" +#~ msgstr "Pressió:" + +#~ msgid "Wind speed:" +#~ msgstr "Velocitat del vent:" + +#~ msgid "Timezone:" +#~ msgstr "Fus horari:" + +#~ msgid "Resume Updating" +#~ msgstr "Continua l'actualització" + +#~ msgid "Pause Updating" +#~ msgstr "Atura l'actualització" + +#~ msgid "today" +#~ msgstr "avui" + #~ msgid "The Latitude is not numeric." #~ msgstr "La Latitud no és numèrica." diff --git a/translations/po/cs.po b/translations/po/cs.po index 588760b..c18eed6 100644 --- a/translations/po/cs.po +++ b/translations/po/cs.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-01-03 22:03+0000\n" "Last-Translator: Martin Kotelnik \n" "Language-Team: Martin Kotelnik \n" @@ -16,9 +16,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" +"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" +"X-Language: cs\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -26,14 +29,17 @@ msgid "Plasmoid showing weather information from met.no server" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "" @@ -108,8 +114,8 @@ msgid "Layout" msgstr "Zobrazení" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Typ zobrazení:" +msgid "Layout type" +msgstr "Typ zobrazení" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -132,8 +138,8 @@ msgid "In-Tray Settings" msgstr "Nastavení pro lištu" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Skrýt po:" +msgid "Active timeout" +msgstr "Skrýt po" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -151,11 +157,11 @@ msgstr "" "nastavíte \"Zobrazeno\" v sekci \"Položky\" v nastavení lišty." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -164,101 +170,79 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Přidat lokaci Open Weather Map" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Vložte URL" +msgid "Location" +msgstr "Lokace" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Alias lokace" +msgid "Area" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Najděte své city ID pomocí vyhledávání zde:" +msgid "Latitude" +msgstr "Zeměpisná šířka" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"...a sem vložte celé URL\n" -"např. http://openweathermap.org/city/3065328 pro Prahu, ČR." +msgid "Longitude" +msgstr "Dlouhá síla" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" +msgid "Altitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Časová zóna" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "" +msgid "Plasmoid version" +msgstr "Verze apletu" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Přidat lokaci Met.no Map Map" +msgid "Source" +msgstr "Zdroj" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." -msgstr "" +msgid "Place Identifier" +msgstr "ID lokace" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "" +msgid "Displayed as" +msgstr "Alias" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "" +msgid "Miscellaneous" +msgstr "Ostatní" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Reload interval" +msgstr "Verze apletu" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." +msgctxt "Abbreviation for minutes" +msgid "min" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" -msgstr[1] "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Zeměpisná šířka" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Dlouhá síla" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "OWM weather forecast data provided by OpenWeather." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "ID lokace" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -270,95 +254,80 @@ msgid "Enter place alias" msgstr "Napište alias lokace" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" +msgid "Add Open Weather Map Place" +msgstr "Přidat lokaci Open Weather Map" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Lokace" +msgid "Paste URL here" +msgstr "Vložte URL" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" +msgid "City alias" +msgstr "Alias lokace" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "" +msgid "Find your city ID by searching here" +msgstr "Najděte své city ID pomocí vyhledávání zde" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" +"...a sem vložte celé URL\n" +"např. http://openweathermap.org/city/3065328 pro Prahu, ČR." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "" +msgid "Add Met.no Map Place" +msgstr "Přidat lokaci Met.no Map Map" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Verze apletu:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Zdroj" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Alias" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Akce" +msgid "URL" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Ostatní" +msgid "Location Search" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Obnovovací interval:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" +msgid "Search data extracted from data provided by Geonames.org." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Teplota:" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Tlak:" +msgid "Temperature" +msgstr "Teplota" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Ryhlost větru:" +msgid "Pressure" +msgstr "Tlak" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Časová zóna:" +msgid "Wind speed" +msgstr "Ryhlost větru" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -366,6 +335,7 @@ msgstr "Můj místní čas" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "" @@ -373,29 +343,20 @@ msgstr "" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Další lokace" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" +msgid "Previous Location" msgstr "" #: ../../package/contents/ui/FullRepresentation.qml -msgid "Previous Location" +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Povolit obnovování" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Zakázat obnovování" - -#: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "před %1" @@ -416,18 +377,54 @@ msgid "in" msgstr "" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "dnes" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Layout type:" +#~ msgstr "Typ zobrazení:" + +#~ msgid "Active timeout:" +#~ msgstr "Skrýt po:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Najděte své city ID pomocí vyhledávání zde:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Verze apletu:" + +#~ msgid "Action" +#~ msgstr "Akce" + +#~ msgid "Reload interval:" +#~ msgstr "Obnovovací interval:" + +#~ msgid "Temperature:" +#~ msgstr "Teplota:" + +#~ msgid "Pressure:" +#~ msgstr "Tlak:" + +#~ msgid "Wind speed:" +#~ msgstr "Ryhlost větru:" + +#~ msgid "Timezone:" +#~ msgstr "Časová zóna:" + +#~ msgid "Resume Updating" +#~ msgstr "Povolit obnovování" + +#~ msgid "Pause Updating" +#~ msgstr "Zakázat obnovování" + +#~ msgid "today" +#~ msgstr "dnes" + #~ msgid "Offline mode" #~ msgstr "Offline režim" diff --git a/translations/po/de.po b/translations/po/de.po index c660473..c8488cb 100644 --- a/translations/po/de.po +++ b/translations/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-09-25 10:54+0200\n" "Last-Translator: Martin Schnitkemper\n" "Language-Team: mfroeb\n" @@ -17,24 +17,29 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.1.1\n" +"X-Language: de\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" -msgstr "Weather Widget 2" +msgid "Weather Widget 3" +msgstr "" #: ../../package/metadata.desktop msgid "Plasmoid showing weather information from met.no server" msgstr "Plasmoid zeigt Wetterinformationen des met.no-Servers" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "%1 m" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "%1 s" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "%1 t" @@ -109,8 +114,8 @@ msgid "Layout" msgstr "Anordnung" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Darstellung:" +msgid "Layout type" +msgstr "Darstellung" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -135,8 +140,8 @@ msgid "In-Tray Settings" msgstr "Anzeige im Systemabschnitt der Kontrollleiste" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Ausblendzeit:" +msgid "Active timeout" +msgstr "Ausblendzeit" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -155,12 +160,12 @@ msgstr "" "verändern." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" -msgstr "Widget-Schriftstil:" +msgid "Widget font style" +msgstr "Widget-Schriftstil" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" -msgstr "Widget-Schriftgröße:" +msgid "Widget font size" +msgstr "Widget-Schriftgröße" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "pixels" @@ -168,102 +173,83 @@ msgid "px" msgstr "px" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Ort von \"Open Weather Map\" hinzufügen" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "URL hier einfügen" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Anzeigename" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Suchen Sie Ihren Ort hier:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"... und fügen Sie die URL hier ein, z. B.\n" -"http://openweathermap.org/city/2946447 für Bonn, Deutschland." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "Fehler!" +msgid "Location" +msgstr "Orte" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" -msgstr "Bestätigung" +msgid "Area" +msgstr "Gebiet" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "Möchten Sie diesen Ort wählen?" +msgid "Latitude" +msgstr "Breite" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Ort von \"Met.no Map\" hinzufügen" +msgid "Longitude" +msgstr "Längengrad" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." -msgstr "Der Breitengrad ist ungültig." +msgid "Altitude" +msgstr "Höhe" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "Der Breitengrad liegt nicht zwischen -90 und 90." +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Zeitzone" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "Der Längengrad ist ungültig." +msgid "Plasmoid version" +msgstr "Plasmoid-Version" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "Der Längengrad liegt nicht zwischen -180 und 180." +msgid "Source" +msgstr "Quelle" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "Die Höhe ist ungültig." +msgid "Place Identifier" +msgstr "Ortskennzeichnung" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "Die Höhe liegt nicht zwischen -999 und 5000." +msgid "Displayed as" +msgstr "Anzeigename" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." -msgstr "Der Ortsname ist leer." +msgid "Description" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "Es gibt einen Fehler!" -msgstr[1] "Es gibt %1 Fehler!" +msgid "Miscellaneous" +msgstr "Verschiedenes" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Breite" +msgid "Reload interval" +msgstr "Aktualisierungsintervall" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Längengrad" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "min" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" -msgstr "Höhe" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." +msgstr "" +"Met.no-Wettervorhersagedaten bereitgestellt vom Norwegischen " +"Meteorologischen Institut." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" -msgstr "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgstr "" +"Sonnenaufgangs-/Sonnenuntergangsdaten bereitgestellt von Sunrise - Sunset." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Ortskennzeichnung" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "OWM-Wettervorhersagedaten bereitgestellt von OpenWeather." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" -msgstr "Suche" +msgid "Weather icons created by Erik Flowers." +msgstr "Wettersymbole erstellt von Erik Flowers." #: ../../package/contents/ui/config/ConfigGeneral.qml msgid "Change Displayed As" @@ -274,98 +260,80 @@ msgid "Enter place alias" msgstr "Anzeigename eingeben" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "Standortsuche" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Orte" +msgid "Add Open Weather Map Place" +msgstr "Ort von \"Open Weather Map\" hinzufügen" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "Gebiet" +msgid "Paste URL here" +msgstr "URL hier einfügen" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "Zeitzone" +msgid "City alias" +msgstr "Anzeigename" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." -msgstr "Suchdaten extrahiert aus Daten von Geonames.org." +msgid "Find your city ID by searching here" +msgstr "Suchen Sie Ihren Ort hier" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "Land:" +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." +msgstr "" +"... und fügen Sie die URL hier ein, z. B.\n" +"http://openweathermap.org/city/2946447 für Bonn, Deutschland." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" -msgstr "Filter:" +msgid "Add Met.no Map Place" +msgstr "Ort von \"Met.no Map\" hinzufügen" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Plasmoid-Version:" +msgid "Search" +msgstr "Suche" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Quelle" +msgid "URL" +msgstr "URL" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Anzeigename" +msgid "Location Search" +msgstr "Standortsuche" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Aktion" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Verschiedenes" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "Suchdaten extrahiert aus Daten von Geonames.org." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Aktualisierungsintervall:" +msgid "Country" +msgstr "Land" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "min" +msgid "Filter" +msgstr "Filter" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." -msgstr "" -"Met.no-Wettervorhersagedaten bereitgestellt vom Norwegischen " -"Meteorologischen Institut." +msgid "Confirmation" +msgstr "Bestätigung" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Do you want to select" msgstr "" -"Sonnenaufgangs-/Sonnenuntergangsdaten bereitgestellt von Sunrise - Sunset." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." -msgstr "OWM-Wettervorhersagedaten bereitgestellt von OpenWeather." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." -msgstr "Wettersymbole erstellt von Erik Flowers." - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Temperatur:" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Druck:" +msgid "Temperature" +msgstr "Temperatur" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Windgeschwindigkeit:" +msgid "Pressure" +msgstr "Druck" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Zeitzone:" +msgid "Wind speed" +msgstr "Windgeschwindigkeit" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -373,6 +341,7 @@ msgstr "Lokalzeit" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "Weltzeit (UTC)" @@ -380,29 +349,20 @@ msgstr "Weltzeit (UTC)" msgid "Location Timezone" msgstr "Zeitzone des Standorts" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Nächster Ort" -#: ../../package/contents/ui/FullRepresentationInTray.qml -#: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" -msgstr "Nachladen" - #: ../../package/contents/ui/FullRepresentation.qml msgid "Previous Location" msgstr "Vorheriger Ort" -#: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Aktualisierungen fortsetzen" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Aktualisierungen unterbrechen" +#: ../../package/contents/ui/FullRepresentation.qml +msgid "Reload" +msgstr "Nachladen" #: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "vor %1" @@ -423,16 +383,99 @@ msgid "in" msgstr "in" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" "Wettervorhersagedaten bereitgestellt vom Norwegischen Meteorologischen " "Institut." -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "heute" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "Wettervorhersagedaten bereitgestellt von OpenWeather." + +#~ msgid "Weather Widget 2" +#~ msgstr "Weather Widget 2" + +#~ msgid "Layout type:" +#~ msgstr "Darstellung:" + +#~ msgid "Active timeout:" +#~ msgstr "Ausblendzeit:" + +#~ msgid "Widget font style:" +#~ msgstr "Widget-Schriftstil:" + +#~ msgid "Widget font size:" +#~ msgstr "Widget-Schriftgröße:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Suchen Sie Ihren Ort hier:" + +#~ msgid "Error!" +#~ msgstr "Fehler!" + +#~ msgid "Do you want to select this place?" +#~ msgstr "Möchten Sie diesen Ort wählen?" + +#~ msgid "The Latitude is not valid." +#~ msgstr "Der Breitengrad ist ungültig." + +#~ msgid "The Latitude is not between -90 and 90." +#~ msgstr "Der Breitengrad liegt nicht zwischen -90 und 90." + +#~ msgid "The Longitude is not valid." +#~ msgstr "Der Längengrad ist ungültig." + +#~ msgid "The Longitude is not between -180 and 180." +#~ msgstr "Der Längengrad liegt nicht zwischen -180 und 180." + +#~ msgid "The Altitude is not valid." +#~ msgstr "Die Höhe ist ungültig." + +#~ msgid "The Altitude is not between -999 and 5000." +#~ msgstr "Die Höhe liegt nicht zwischen -999 und 5000." + +#~ msgid "The Place Name is empty." +#~ msgstr "Der Ortsname ist leer." + +#~ msgid "There is an error!" +#~ msgid_plural "There are %1 errors!" +#~ msgstr[0] "Es gibt einen Fehler!" +#~ msgstr[1] "Es gibt %1 Fehler!" + +#~ msgid "Country:" +#~ msgstr "Land:" + +#~ msgid "Filter:" +#~ msgstr "Filter:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Plasmoid-Version:" + +#~ msgid "Action" +#~ msgstr "Aktion" + +#~ msgid "Reload interval:" +#~ msgstr "Aktualisierungsintervall:" + +#~ msgid "Temperature:" +#~ msgstr "Temperatur:" + +#~ msgid "Pressure:" +#~ msgstr "Druck:" + +#~ msgid "Wind speed:" +#~ msgstr "Windgeschwindigkeit:" + +#~ msgid "Timezone:" +#~ msgstr "Zeitzone:" + +#~ msgid "Resume Updating" +#~ msgstr "Aktualisierungen fortsetzen" + +#~ msgid "Pause Updating" +#~ msgstr "Aktualisierungen unterbrechen" + +#~ msgid "today" +#~ msgstr "heute" diff --git a/translations/po/en.po b/translations/po/en.po index 952842e..9b92a61 100644 --- a/translations/po/en.po +++ b/translations/po/en.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2016-03-26 21:59+0100\n" "Last-Translator: Martin Kotelnik \n" "Language-Team: Martin Kotelnik \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -98,7 +98,7 @@ msgid "Layout" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" +msgid "Layout type" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -122,7 +122,7 @@ msgid "In-Tray Settings" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" +msgid "Active timeout" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -135,112 +135,93 @@ msgid "NOTE: After this timeout widget will be hidden in system tray until refre msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Show last reloaded time" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgctxt "pixels" -msgid "px" +msgid "Widget font size" msgstr "" -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" +#: ../../package/contents/ui/config/ConfigAppearance.qml +msgctxt "pixels" +msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." +msgid "Location" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" +msgid "Area" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" +msgid "Latitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" +msgid "Longitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" +msgid "Altitude" msgstr "" -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." +#: ../../package/contents/ui/config/ConfigGeneral.qml ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." +msgid "Plasmoid version" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." +msgid "Source" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." +msgid "Place Identifier" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." +msgid "Displayed as" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "Miscellaneous" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" -msgstr[1] "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" +msgid "Reload interval" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" +msgctxt "Abbreviation for minutes" +msgid "min" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "Met.no weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" +msgid "OWM weather forecast data provided by OpenWeather." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -252,99 +233,84 @@ msgid "Enter place alias" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" +msgid "Add Open Weather Map Place" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "Paste URL here" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" +msgid "City alias" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Find your city ID by searching here" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" +msgid "Add Met.no Map Place" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" +msgid "URL" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" +msgid "Location Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" +msgid "Alt" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" +msgid "Search data extracted from data provided by Geonames.org." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Met.no weather forecast data provided by The Norwegian Meteorological Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." -msgstr "" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" +msgid "Temperature" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" +msgid "Pressure" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" +msgid "Wind speed" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" msgstr "" -#: ../../package/contents/ui/config/ConfigUnits.qml ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/config/ConfigUnits.qml ../../package/contents/ui/FullRepresentation.qml ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "" @@ -352,24 +318,16 @@ msgstr "" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" -msgstr "" - #: ../../package/contents/ui/FullRepresentation.qml msgid "Previous Location" msgstr "" -#: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" +#: ../../package/contents/ui/FullRepresentation.qml +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml @@ -392,14 +350,10 @@ msgstr "" msgid "in" msgstr "" -#: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/MetNo.qml ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" diff --git a/translations/po/es.po b/translations/po/es.po index f6d71be..b2ac05e 100644 --- a/translations/po/es.po +++ b/translations/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-01-03 22:04+0000\n" "Last-Translator: Kepa Badiola \n" "Language-Team: spanish \n" @@ -16,9 +16,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Language: es\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -26,14 +29,17 @@ msgid "Plasmoid showing weather information from met.no server" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "" @@ -108,8 +114,8 @@ msgid "Layout" msgstr "Diseño" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Tipo de diseño:" +msgid "Layout type" +msgstr "Tipo de diseño" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -134,8 +140,8 @@ msgid "In-Tray Settings" msgstr "Preferencias para barra de tareas" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Cuenta atrás activa:" +msgid "Active timeout" +msgstr "Cuenta atrás activa" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -154,11 +160,11 @@ msgstr "" "\"Entradas\" configuración." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -167,101 +173,79 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Añadir Lugar de Open Weather Map" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Pegar URL aquí" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Alias Ciudad" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Encuentra la ID de tu ciudad buscando aquí:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"...y pega aquí la URL completa\n" -"ejemplo: http://openweathermap.org/city/2946447 para Bonn, Alemania." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "" +msgid "Location" +msgstr "Ubicación" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" +msgid "Area" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "" +msgid "Latitude" +msgstr "Latitud" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Añadir Lugar de Met.no Map" +msgid "Longitude" +msgstr "Longevidad" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." +msgid "Altitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Huso Horario" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Plasmoid version" +msgstr "Versión del plasmoide" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "" +msgid "Source" +msgstr "Origen" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Place Identifier" +msgstr "Identificador del Lugar" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "" +msgid "Displayed as" +msgstr "Mostrado como" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" -msgstr[1] "" +msgid "Miscellaneous" +msgstr "Miscelanea" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Latitud" +msgid "Reload interval" +msgstr "Intervalo de recarga" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Longevidad" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "min" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Identificador del Lugar" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -273,95 +257,80 @@ msgid "Enter place alias" msgstr "Introduce el alias del lugar" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" +msgid "Add Open Weather Map Place" +msgstr "Añadir Lugar de Open Weather Map" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Ubicación" +msgid "Paste URL here" +msgstr "Pegar URL aquí" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" +msgid "City alias" +msgstr "Alias Ciudad" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "" +msgid "Find your city ID by searching here" +msgstr "Encuentra la ID de tu ciudad buscando aquí" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" +"...y pega aquí la URL completa\n" +"ejemplo: http://openweathermap.org/city/2946447 para Bonn, Alemania." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "" +msgid "Add Met.no Map Place" +msgstr "Añadir Lugar de Met.no Map" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Versión del plasmoide:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Origen" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Mostrado como" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Acción" +msgid "URL" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Miscelanea" +msgid "Location Search" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Intervalo de recarga:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "min" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Temperatura:" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Presión:" +msgid "Temperature" +msgstr "Temperatura" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Velocidad del viento:" +msgid "Pressure" +msgstr "Presión" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Huso Horario:" +msgid "Wind speed" +msgstr "Velocidad del viento" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -369,6 +338,7 @@ msgstr "Mi horario local" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -376,29 +346,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Próxima Ubicación" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" +msgid "Previous Location" msgstr "" #: ../../package/contents/ui/FullRepresentation.qml -msgid "Previous Location" +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Reanudar Actualización" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Pausar Actualización" - -#: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "hace %1" @@ -419,18 +380,54 @@ msgid "in" msgstr "" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "hoy" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Layout type:" +#~ msgstr "Tipo de diseño:" + +#~ msgid "Active timeout:" +#~ msgstr "Cuenta atrás activa:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Encuentra la ID de tu ciudad buscando aquí:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Versión del plasmoide:" + +#~ msgid "Action" +#~ msgstr "Acción" + +#~ msgid "Reload interval:" +#~ msgstr "Intervalo de recarga:" + +#~ msgid "Temperature:" +#~ msgstr "Temperatura:" + +#~ msgid "Pressure:" +#~ msgstr "Presión:" + +#~ msgid "Wind speed:" +#~ msgstr "Velocidad del viento:" + +#~ msgid "Timezone:" +#~ msgstr "Huso Horario:" + +#~ msgid "Resume Updating" +#~ msgstr "Reanudar Actualización" + +#~ msgid "Pause Updating" +#~ msgstr "Pausar Actualización" + +#~ msgid "today" +#~ msgstr "hoy" + #~ msgid "Offline mode" #~ msgstr "Modo desconectado" diff --git a/translations/po/fr.po b/translations/po/fr.po index 0db13c9..aadbe17 100644 --- a/translations/po/fr.po +++ b/translations/po/fr.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-01-03 22:37+0000\n" "Last-Translator: David Geiger \n" "Language-Team: French (http://www.mageialinux-online.org/)\n" @@ -20,9 +20,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Language: fr\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -30,14 +32,17 @@ msgid "Plasmoid showing weather information from met.no server" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "" @@ -112,8 +117,8 @@ msgid "Layout" msgstr "Agencement" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Type d'agencement :" +msgid "Layout type" +msgstr "Type d'agencement" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -138,8 +143,8 @@ msgid "In-Tray Settings" msgstr "Paramètres de la barre de notification" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Dépassement de délai actif:" +msgid "Active timeout" +msgstr "Dépassement de délai actif" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -157,11 +162,11 @@ msgstr "" "qu'il soit toujours \"Visible\" dans les paramètres \"Entrées\" de la barre." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -170,101 +175,79 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Ajouter une place de carte météorologique ouverte" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Coller l'URL ici" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Alias de la ville" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Trouver l'ID de la ville en la cherchant ici :" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"...et coller ici l'URL complète\n" -"e.g. http://openweathermap.org/city/2946447 pour Bonn, Allemagne." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "" +msgid "Location" +msgstr "Emplacement" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" +msgid "Area" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "" +msgid "Latitude" +msgstr "Latitude" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Ajouter une place de Met.no" +msgid "Longitude" +msgstr "Longitude" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." +msgid "Altitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Fuseau Horaire" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Plasmoid version" +msgstr "Version du plasmoïde" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "" +msgid "Source" +msgstr "Source" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Place Identifier" +msgstr "Identificateur de l'emplacement" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "" +msgid "Displayed as" +msgstr "Affiché comme" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" -msgstr[1] "" +msgid "Miscellaneous" +msgstr "Divers" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Latitude" +msgid "Reload interval" +msgstr "Intervalle de rechargement" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Longitude" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "min" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Identificateur de l'emplacement" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -276,95 +259,80 @@ msgid "Enter place alias" msgstr "Entrer l'alias de l'emplacement" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" +msgid "Add Open Weather Map Place" +msgstr "Ajouter une place de carte météorologique ouverte" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Emplacement" +msgid "Paste URL here" +msgstr "Coller l'URL ici" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" +msgid "City alias" +msgstr "Alias de la ville" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "" +msgid "Find your city ID by searching here" +msgstr "Trouver l'ID de la ville en la cherchant ici" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" +"...et coller ici l'URL complète\n" +"e.g. http://openweathermap.org/city/2946447 pour Bonn, Allemagne." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "" +msgid "Add Met.no Map Place" +msgstr "Ajouter une place de Met.no" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Version du plasmoïde:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Source" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Affiché comme" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Action" +msgid "URL" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Divers" +msgid "Location Search" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Intervalle de rechargement :" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "min" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Température :" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Pression:" +msgid "Temperature" +msgstr "Température" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Vitesse du vent :" +msgid "Pressure" +msgstr "Pression" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Fuseau Horaire :" +msgid "Wind speed" +msgstr "Vitesse du vent" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -372,6 +340,7 @@ msgstr "Temps local" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -379,29 +348,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Emplacement suivant" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" +msgid "Previous Location" msgstr "" #: ../../package/contents/ui/FullRepresentation.qml -msgid "Previous Location" +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Reprendre la mise à jour" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Suspendre la mise à jour" - -#: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "il y a %1" @@ -422,18 +382,54 @@ msgid "in" msgstr "" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "aujourd'hui" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Layout type:" +#~ msgstr "Type d'agencement :" + +#~ msgid "Active timeout:" +#~ msgstr "Dépassement de délai actif:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Trouver l'ID de la ville en la cherchant ici :" + +#~ msgid "Plasmoid version:" +#~ msgstr "Version du plasmoïde:" + +#~ msgid "Action" +#~ msgstr "Action" + +#~ msgid "Reload interval:" +#~ msgstr "Intervalle de rechargement :" + +#~ msgid "Temperature:" +#~ msgstr "Température :" + +#~ msgid "Pressure:" +#~ msgstr "Pression:" + +#~ msgid "Wind speed:" +#~ msgstr "Vitesse du vent :" + +#~ msgid "Timezone:" +#~ msgstr "Fuseau Horaire :" + +#~ msgid "Resume Updating" +#~ msgstr "Reprendre la mise à jour" + +#~ msgid "Pause Updating" +#~ msgstr "Suspendre la mise à jour" + +#~ msgid "today" +#~ msgstr "aujourd'hui" + #~ msgid "Offline mode" #~ msgstr "Mode hors-ligne" diff --git a/translations/po/hu_HU.po b/translations/po/hu_HU.po index 16e66e1..60dab01 100644 --- a/translations/po/hu_HU.po +++ b/translations/po/hu_HU.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: plasma-applet-weather-widget\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-01-03 22:07+0000\n" "Last-Translator: Laszlo Espadas \n" "Language-Team: Hungarian \n" @@ -17,11 +17,11 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Language: hu_HU\n" -"X-Source-Language: C\n" +"X-Source-Language: _GB\n" "X-Generator: Poedit 2.3\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -29,14 +29,17 @@ msgid "Plasmoid showing weather information from met.no server" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "" @@ -111,8 +114,8 @@ msgid "Layout" msgstr "Elrendezés" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Elrendezés típus:" +msgid "Layout type" +msgstr "Elrendezés típus" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -137,8 +140,8 @@ msgid "In-Tray Settings" msgstr "Tálca beállításai" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Aktív időtullépés:" +msgid "Active timeout" +msgstr "Aktív időtullépés" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -154,11 +157,11 @@ msgstr "" "Megjegyzés: Az időtúllépés modul rejtve van a tálcán ami a háttérben frissít." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -167,100 +170,79 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Open Weather Map hely hozzáadás" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "URL beillesztés" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Város" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Saját város ID keresése:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"...és illesszük be ide a teljes hívatkozást (URL)\n" -"példa: http://openweathermap.org/city/2946447 Bonn, Germany." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "" +msgid "Location" +msgstr "Hely" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" +msgid "Area" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "" +msgid "Latitude" +msgstr "Szélesség" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Met.no Map hely hozzáadás" +msgid "Longitude" +msgstr "Hosszúság" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." +msgid "Altitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Időzóna" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Plasmoid version" +msgstr "Plasmoid verzió" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "" +msgid "Source" +msgstr "Forrás" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Place Identifier" +msgstr "Hely azonosító" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "" +msgid "Displayed as" +msgstr "Város" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" +msgid "Miscellaneous" +msgstr "Továbbiak" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Szélesség" +msgid "Reload interval" +msgstr "Intervallum újratöltés" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Hosszúság" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "perccel" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Hely azonosító" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -272,95 +254,80 @@ msgid "Enter place alias" msgstr "Hely hozzáadás" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" +msgid "Add Open Weather Map Place" +msgstr "Open Weather Map hely hozzáadás" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Hely" +msgid "Paste URL here" +msgstr "URL beillesztés" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" +msgid "City alias" +msgstr "Város" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "" +msgid "Find your city ID by searching here" +msgstr "Saját város ID keresése" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" +"...és illesszük be ide a teljes hívatkozást (URL)\n" +"példa: http://openweathermap.org/city/2946447 Bonn, Germany." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "" +msgid "Add Met.no Map Place" +msgstr "Met.no Map hely hozzáadás" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Plasmoid verzió:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Forrás" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Város" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Művelet" +msgid "URL" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Továbbiak" +msgid "Location Search" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Intervallum újratöltés:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "perccel" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Hőmérséklet:" +msgid "Temperature" +msgstr "Hőmérséklet" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Nyomás:" +msgid "Pressure" +msgstr "Nyomás" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Szélsebesség:" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Időzóna:" +msgid "Wind speed" +msgstr "Szélsebesség" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -368,6 +335,7 @@ msgstr "Saját helyi idő" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -375,29 +343,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Következő hely" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" +msgid "Previous Location" msgstr "" #: ../../package/contents/ui/FullRepresentation.qml -msgid "Previous Location" +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Frissítés folytatása" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Frissítés megállítása" - -#: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "%1 ezelőtt" @@ -418,18 +377,51 @@ msgid "in" msgstr "" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "ma" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Active timeout:" +#~ msgstr "Aktív időtullépés:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Saját város ID keresése:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Plasmoid verzió:" + +#~ msgid "Action" +#~ msgstr "Művelet" + +#~ msgid "Reload interval:" +#~ msgstr "Intervallum újratöltés:" + +#~ msgid "Temperature:" +#~ msgstr "Hőmérséklet:" + +#~ msgid "Pressure:" +#~ msgstr "Nyomás:" + +#~ msgid "Wind speed:" +#~ msgstr "Szélsebesség:" + +#~ msgid "Timezone:" +#~ msgstr "Időzóna:" + +#~ msgid "Resume Updating" +#~ msgstr "Frissítés folytatása" + +#~ msgid "Pause Updating" +#~ msgstr "Frissítés megállítása" + +#~ msgid "today" +#~ msgstr "ma" + #~ msgid "Offline mode" #~ msgstr "Offline mód" diff --git a/translations/po/it_IT.po b/translations/po/it_IT.po index b66647a..aacd5b3 100644 --- a/translations/po/it_IT.po +++ b/translations/po/it_IT.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-01-03 22:09+0000\n" "Last-Translator: Armando Brandonisio \n" "Language-Team: Armando Brandonisio \n" @@ -16,9 +16,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Language: it_IT\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -26,14 +29,17 @@ msgid "Plasmoid showing weather information from met.no server" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "" @@ -108,8 +114,8 @@ msgid "Layout" msgstr "Indicatore" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Tipo di indicatore:" +msgid "Layout type" +msgstr "Tipo di indicatore" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -133,8 +139,8 @@ msgid "In-Tray Settings" msgstr "Impostazioni di vassoio" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Tempo di attività:" +msgid "Active timeout" +msgstr "Tempo di attività" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -152,11 +158,11 @@ msgstr "" "sempre \"Visibile\" in \"Aggiungi Oggetti\" nel vassoio di sistema." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -165,101 +171,79 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Aggiungi Open Weather Map Place" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Incolla l'URL qui" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Nome città" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Trova l'ID della tua città cercando qui:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"...e incolla qui l'intero URL\n" -"esempio http://openweathermap.org/city/2946447 per Bonn, Germania." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "" +msgid "Location" +msgstr "Luogo" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" +msgid "Area" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "" +msgid "Latitude" +msgstr "Latitudine" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Aggiungi Met.no Map Place" +msgid "Longitude" +msgstr "Longitudine" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." +msgid "Altitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Fuso orario" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Plasmoid version" +msgstr "Versione plasmoide" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "" +msgid "Source" +msgstr "Sorgente" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Place Identifier" +msgstr "Identificatore posto" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "" +msgid "Displayed as" +msgstr "Visualizzato come" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" -msgstr[1] "" +msgid "Miscellaneous" +msgstr "Altro" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Latitudine" +msgid "Reload interval" +msgstr "Intervallo di aggiornamento" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Longitudine" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "min" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Identificatore posto" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -271,95 +255,80 @@ msgid "Enter place alias" msgstr "Inserisci il nome del luogo" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" +msgid "Add Open Weather Map Place" +msgstr "Aggiungi Open Weather Map Place" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Luogo" +msgid "Paste URL here" +msgstr "Incolla l'URL qui" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" +msgid "City alias" +msgstr "Nome città" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "" +msgid "Find your city ID by searching here" +msgstr "Trova l'ID della tua città cercando qui" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" +"...e incolla qui l'intero URL\n" +"esempio http://openweathermap.org/city/2946447 per Bonn, Germania." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "" +msgid "Add Met.no Map Place" +msgstr "Aggiungi Met.no Map Place" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Versione plasmoide:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Sorgente" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Visualizzato come" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Azione" +msgid "URL" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Altro" +msgid "Location Search" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Intervallo di aggiornamento:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "min" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Temperatura:" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Pressione:" +msgid "Temperature" +msgstr "Temperatura" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Velocità del vento:" +msgid "Pressure" +msgstr "Pressione" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Fuso orario:" +msgid "Wind speed" +msgstr "Velocità del vento" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -367,6 +336,7 @@ msgstr "La mia ora locale" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -374,29 +344,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Prossimo luogo" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" +msgid "Previous Location" msgstr "" #: ../../package/contents/ui/FullRepresentation.qml -msgid "Previous Location" +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Riprendi l'aggiornamento" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Metti in pausa l'aggiornamento" - -#: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "%1 fa" @@ -417,18 +378,54 @@ msgid "in" msgstr "" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "Oggi" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Layout type:" +#~ msgstr "Tipo di indicatore:" + +#~ msgid "Active timeout:" +#~ msgstr "Tempo di attività:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Trova l'ID della tua città cercando qui:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Versione plasmoide:" + +#~ msgid "Action" +#~ msgstr "Azione" + +#~ msgid "Reload interval:" +#~ msgstr "Intervallo di aggiornamento:" + +#~ msgid "Temperature:" +#~ msgstr "Temperatura:" + +#~ msgid "Pressure:" +#~ msgstr "Pressione:" + +#~ msgid "Wind speed:" +#~ msgstr "Velocità del vento:" + +#~ msgid "Timezone:" +#~ msgstr "Fuso orario:" + +#~ msgid "Resume Updating" +#~ msgstr "Riprendi l'aggiornamento" + +#~ msgid "Pause Updating" +#~ msgstr "Metti in pausa l'aggiornamento" + +#~ msgid "today" +#~ msgstr "Oggi" + #~ msgid "Offline mode" #~ msgstr "Modalità offline" diff --git a/translations/po/lt.po b/translations/po/lt.po index 98f2665..4b66402 100644 --- a/translations/po/lt.po +++ b/translations/po/lt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-01-03 22:11+0000\n" "Last-Translator: Moo\n" "Language-Team: \n" @@ -16,11 +16,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " -"(n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Language: lt\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -28,14 +29,17 @@ msgid "Plasmoid showing weather information from met.no server" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "" @@ -110,8 +114,8 @@ msgid "Layout" msgstr "Išdėstymas" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Išdėstymo tipas:" +msgid "Layout type" +msgstr "Išdėstymo tipas" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -136,13 +140,13 @@ msgid "In-Tray Settings" msgstr "Nustatymai dėkle" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Aktyvumo laiko limitas:" +msgid "Active timeout" +msgstr "Aktyvumo laiko limitas" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" msgid "sec" -msgstr "sek." +msgstr "sek" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "" @@ -155,11 +159,11 @@ msgstr "" "nustatyti, kad valdiklis visuomet būtų \"Rodomas\"." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -168,103 +172,79 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Pridėti Open Weather Map vietą" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Čia įdėkite URL" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Miesto alternatyvusis pavadinimas" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Raskite savo miesto ID, atlikdami paiešką čia:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"...ir čia įdėkite pilną URL adresą\n" -"pvz., http://openweathermap.org/city/601084 bus skirta miestui Alytus, " -"Lietuva." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "" +msgid "Location" +msgstr "Vieta" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" +msgid "Area" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "" +msgid "Latitude" +msgstr "Platuma" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Pridėti Met.no Map vietą" +msgid "Longitude" +msgstr "Ilguma" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." +msgid "Altitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Laiko juosta" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Plasmoid version" +msgstr "Plasma valdiklio versija" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "" +msgid "Source" +msgstr "Šaltinis" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Place Identifier" +msgstr "Vietos identifikatorius" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "" +msgid "Displayed as" +msgstr "Rodoma kaip" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgid "Miscellaneous" +msgstr "Įvairūs" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Platuma" +msgid "Reload interval" +msgstr "Įkėlimo iš naujo intervalas" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Ilguma" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "min" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Vietos identifikatorius" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -276,95 +256,81 @@ msgid "Enter place alias" msgstr "Įveskite alternatyvųjį miesto pavadinimą" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" +msgid "Add Open Weather Map Place" +msgstr "Pridėti Open Weather Map vietą" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Vieta" +msgid "Paste URL here" +msgstr "Čia įdėkite URL" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" +msgid "City alias" +msgstr "Miesto alternatyvusis pavadinimas" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "" +msgid "Find your city ID by searching here" +msgstr "Raskite savo miesto ID, atlikdami paiešką čia" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" +"...ir čia įdėkite pilną URL adresą\n" +"pvz., http://openweathermap.org/city/601084 bus skirta miestui Alytus, " +"Lietuva." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "" +msgid "Add Met.no Map Place" +msgstr "Pridėti Met.no Map vietą" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Plasma valdiklio versija:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Šaltinis" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Rodoma kaip" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Veiksmas" +msgid "URL" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Įvairūs" +msgid "Location Search" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Įkėlimo iš naujo intervalas:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "min." +msgid "Search data extracted from data provided by Geonames.org." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Temperatūra:" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Slėgis:" +msgid "Temperature" +msgstr "Temperatūra" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Vėjo greitis:" +msgid "Pressure" +msgstr "Slėgis" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Laiko juosta:" +msgid "Wind speed" +msgstr "Vėjo greitis" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -372,6 +338,7 @@ msgstr "Mano vietinis laikas" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "Suderintasis pasaulinis laikas (UTC)" @@ -379,29 +346,20 @@ msgstr "Suderintasis pasaulinis laikas (UTC)" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Kita vieta" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" +msgid "Previous Location" msgstr "" #: ../../package/contents/ui/FullRepresentation.qml -msgid "Previous Location" +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Pratęsti atnaujinimą" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Pristabdyti atnaujinimą" - -#: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "Prieš %1" @@ -422,18 +380,54 @@ msgid "in" msgstr "" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "šiandien" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Layout type:" +#~ msgstr "Išdėstymo tipas:" + +#~ msgid "Active timeout:" +#~ msgstr "Aktyvumo laiko limitas:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Raskite savo miesto ID, atlikdami paiešką čia:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Plasma valdiklio versija:" + +#~ msgid "Action" +#~ msgstr "Veiksmas" + +#~ msgid "Reload interval:" +#~ msgstr "Įkėlimo iš naujo intervalas:" + +#~ msgid "Temperature:" +#~ msgstr "Temperatūra:" + +#~ msgid "Pressure:" +#~ msgstr "Slėgis:" + +#~ msgid "Wind speed:" +#~ msgstr "Vėjo greitis:" + +#~ msgid "Timezone:" +#~ msgstr "Laiko juosta:" + +#~ msgid "Resume Updating" +#~ msgstr "Pratęsti atnaujinimą" + +#~ msgid "Pause Updating" +#~ msgstr "Pristabdyti atnaujinimą" + +#~ msgid "today" +#~ msgstr "šiandien" + #~ msgid "Offline mode" #~ msgstr "Autonominė veiksena" diff --git a/translations/po/merge.sh b/translations/po/merge.sh index 8699d94..6882521 100755 --- a/translations/po/merge.sh +++ b/translations/po/merge.sh @@ -5,9 +5,13 @@ # https://techbase.kde.org/Development/Tutorials/Localization/i18n_Build_Systems/Outside_KDE_repositories # https://invent.kde.org/sysadmin/l10n-scripty/-/blob/master/extract-messages.sh DIR=`cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd` -plasmoidName=`kreadconfig5 --file="$DIR/../../package/metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Name"` +plasmoidName=`jq -r .KPlugin.Id "$DIR/../../package/metadata.json"` +echo "widgetName=$plasmoidName" +website=`jq -r .KPlugin.Website "$DIR/../../package/metadata.json"` widgetName="${plasmoidName##*.}" # Strip namespace -website=`kreadconfig5 --file="$DIR/../../package/metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Website"` +echo "widgetName=$widgetName" +#plasmoidName=`kreadconfig5 --file="$DIR/../../package/metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Name"` +#website=`kreadconfig5 --file="$DIR/../../package/metadata.desktop" --group="Desktop Entry" --key="X-KDE-PluginInfo-Website"` bugAddress="$website" packageRoot="../.." # Root of translatable sources projectName="plasma_applet_${plasmoidName}" # project name @@ -30,7 +34,7 @@ echo "[merge] Extracting messages" potArgs="--from-code=UTF-8 --width=200 --add-location=file" # Don't extract Icon string if xgettext version < 0.20.2 -iconArgs="-k -kName -kGenericName -kComment -kKeywords" +iconArgs="-kName -kGenericName -kComment -kKeywords" REGEX="([0-9]{1,3}\.)+([0-9]{1,3})" VERBOSE=$(xgettext -V) VER="0.0.0.0" @@ -41,7 +45,7 @@ IFS=. read ver1 ver2 ver3 ver4 <<< $VER if [ $((ver1)) -eq 0 ]; then if [ $((ver2)) -ge 21 ]; then - iconArgs="" +iconArgs="-kName -kGenericName -kComment -kKeywords" fi if [ $((ver2)) -eq 20 ] && [ $((ver2)) -ge 2 ]; then iconArgs="" @@ -49,8 +53,17 @@ if [ $((ver1)) -eq 0 ]; then else iconArgs="" fi +#!/bin/sh +Name=`jq -r .KPlugin.Name ../../package/metadata.json` +Description=`jq -r .KPlugin.Description ../../package/metadata.json` +Category=`jq -r .KPlugin.Category ../../package/metadata.json` +NAME=`jq -r .KPlugin.Name ../../package/metadata.json` +echo -e "[Desktop Entry]\nName=$Name\nDescription=$Description\nComment=$Description\nCategory=$Category" > ../../package/metadata.desktop + + find "${packageRoot}" -name '*.desktop' | sort > "${DIR}/infiles.list" +# echo "xgettext ${potArgs} ${iconArgs} --files-from=\"${DIR}/infiles.list\" --language=Desktop -D \"${packageRoot}\" -D \"${DIR}\" -o \"template.pot.new\"" xgettext \ ${potArgs} \ ${iconArgs} \ @@ -174,63 +187,6 @@ for cat in $catalogs; do done echo "[merge] Done merging messages" -#--- -echo "[merge] Updating .desktop file" - -# Generate LINGUAS for msgfmt -if [ -f "$DIR/LINGUAS" ]; then - rm "$DIR/LINGUAS" -fi -touch "$DIR/LINGUAS" -for cat in $catalogs; do - catLocale=`basename ${cat%.*}` - echo "${catLocale}" >> "$DIR/LINGUAS" -done -echo "cp -f $DIR/../../package/metadata.desktop $DIR/template.desktop" - -cp -f "$DIR/../../package/metadata.desktop" "$DIR/template.desktop" -sed -i '/^Name\[/ d; /^GenericName\[/ d; /^Comment\[/ d; /^Keywords\[/ d' "$DIR/template.desktop" - -echo "msgfmt --desktop --template=\"$DIR/template.desktop\" -d \"$DIR/\" -o \"$DIR/new.desktop\"" -msgfmt --desktop --template="$DIR/template.desktop" -d "$DIR/" -o "$DIR/new.desktop" - -echo "**********************************************" - - -# Delete empty msgid messages that used the po header -if [ ! -z "$(grep '^Name=$' "$DIR/new.desktop")" ]; then - echo "[merge] Name in metadata.desktop is empty!" - sed -i '/^Name\[/ d' "$DIR/new.desktop" -fi -if [ ! -z "$(grep '^GenericName=$' "$DIR/new.desktop")" ]; then - echo "[merge] GenericName in metadata.desktop is empty!" - sed -i '/^GenericName\[/ d' "$DIR/new.desktop" -fi -if [ ! -z "$(grep '^Comment=$' "$DIR/new.desktop")" ]; then - echo "[merge] Comment in metadata.desktop is empty!" - sed -i '/^Comment\[/ d' "$DIR/new.desktop" -fi -if [ ! -z "$(grep '^Keywords=$' "$DIR/new.desktop")" ]; then - echo "[merge] Keywords in metadata.desktop is empty!" - sed -i '/^Keywords\[/ d' "$DIR/new.desktop" -fi - -# Place translations at the bottom of the desktop file. -translatedLines=`cat "$DIR/new.desktop" | grep "]="` -if [ ! -z "${translatedLines}" ]; then - sed -i '/^Name\[/ d; /^GenericName\[/ d; /^Comment\[/ d; /^Keywords\[/ d' "$DIR/new.desktop" - if [ "$(tail -c 2 "$DIR/new.desktop" | wc -l)" != "2" ]; then - # Does not end with 2 empty lines, so add an empty line. - echo "" >> "$DIR/new.desktop" - fi - echo "${translatedLines}" >> "$DIR/new.desktop" -fi - -# Cleanup -mv "$DIR/new.desktop" "$DIR/../../package/metadata.desktop" -rm "$DIR/template.desktop" -rm "$DIR/LINGUAS" - #--- # Populate ReadMe.md echo "[merge] Updating translate/ReadMe.md" @@ -241,5 +197,5 @@ fi sed -i '/^|/ d' ../ReadMe.md # Remove status table from ReadMe cat ./Status.md >> ../ReadMe.md rm ./Status.md - +rm ../../package/metadata.desktop echo "[merge] Done" diff --git a/translations/po/nb.po b/translations/po/nb.po index 74ebe81..e4a25f2 100644 --- a/translations/po/nb.po +++ b/translations/po/nb.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: weatherWidget-2\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-10-28 13:45+0200\n" "Last-Translator: Johnny A. Solbu \n" "Language-Team: Norwegian Bokmaal \n" @@ -17,24 +17,29 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.3\n" +"X-Language: nb\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" -msgstr "Weather Widget 2" +msgid "Weather Widget 3" +msgstr "" #: ../../package/metadata.desktop msgid "Plasmoid showing weather information from met.no server" msgstr "Plasmoid som viser værinformasjon fra met.no" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "%1 m" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "%1 h" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "%1 d" @@ -109,8 +114,8 @@ msgid "Layout" msgstr "Utforming" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Utformingstype:" +msgid "Layout type" +msgstr "Utformingstype" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -135,8 +140,8 @@ msgid "In-Tray Settings" msgstr "Systemkurvinnstillinger" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Aktiv tidsavbrudd:" +msgid "Active timeout" +msgstr "Aktiv tidsavbrudd" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -154,12 +159,12 @@ msgstr "" "i «Oppføringer» i systemkurv-innstillinger." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" -msgstr "Widget-fontstørrelse:" +msgid "Widget font style" +msgstr "Widget-fontstørrelse" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" -msgstr "Widget-skriftstørrelse:" +msgid "Widget font size" +msgstr "Widget-skriftstørrelse" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "pixels" @@ -167,102 +172,80 @@ msgid "px" msgstr "px" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Legg til plassering fra Open Weather Map" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Lim inn URL her" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "By-alias" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Finn din By-ID ved å søke her:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"...og lim inn hele URL-en her\n" -"f.eks. http://openweathermap.org/city/2946447 for Bonn, Tyskland." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "Feil!" +msgid "Location" +msgstr "Plassering" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" -msgstr "Bekreftelse" +msgid "Area" +msgstr "Område" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "Ønsker du å velge dette stedet?" +msgid "Latitude" +msgstr "Breddegrad" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Legg til plassering fra Met.no" +msgid "Longitude" +msgstr "Lengdegrad" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." -msgstr "Breddegraden er ikke gyldig." +msgid "Altitude" +msgstr "Høyde" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "Breddegraden er ikke mellom -90 og 90." +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Tidssone" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "Lengdegraden er ikke gyldig." +msgid "Plasmoid version" +msgstr "Plasmoid-versjon" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "Lengdegraden er ikke mellom -180 og 180." +msgid "Source" +msgstr "Kilde" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "Høyden over havet er ikke gyldig." +msgid "Place Identifier" +msgstr "Stedsidentifikator" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "Høyden over havet er ikke mellom -999 og 5000." +msgid "Displayed as" +msgstr "Vist som" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." -msgstr "Stedsnavnet er tomt." +msgid "Description" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "Det er en feil!" -msgstr[1] "Det er %1 feil!" +msgid "Miscellaneous" +msgstr "Annet" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Breddegrad" +msgid "Reload interval" +msgstr "Oppdateringsintervall" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Lengdegrad" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "min" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" -msgstr "Høyde" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." +msgstr "Met.no-værmeldingsdata er levert av Meteorologisk institutt." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" -msgstr "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgstr "Data for soloppgang/solnedgang levert av Sunrise Sunset." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Stedsidentifikator" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "OWM-værmeldingsdata levert av OpenWeather." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" -msgstr "Søk" +msgid "Weather icons created by Erik Flowers." +msgstr "Vær-ikoner er laget av Erik Flowers." #: ../../package/contents/ui/config/ConfigGeneral.qml msgid "Change Displayed As" @@ -273,95 +256,80 @@ msgid "Enter place alias" msgstr "Legg inn Stedsalias" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "Stedssøk" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Plassering" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "Område" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "Tidssone" +msgid "Add Open Weather Map Place" +msgstr "Legg til plassering fra Open Weather Map" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." -msgstr "Søkedata hentet ut fra data levert av Geonames.org." +msgid "Paste URL here" +msgstr "Lim inn URL her" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "Land:" +msgid "City alias" +msgstr "By-alias" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" -msgstr "Filter:" +msgid "Find your city ID by searching here" +msgstr "Finn din By-ID ved å søke her" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Plasmoid-versjon:" +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." +msgstr "" +"...og lim inn hele URL-en her\n" +"f.eks. http://openweathermap.org/city/2946447 for Bonn, Tyskland." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Kilde" +msgid "Add Met.no Map Place" +msgstr "Legg til plassering fra Met.no" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Vist som" +msgid "Search" +msgstr "Søk" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Handling" +msgid "URL" +msgstr "URL" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Annet" +msgid "Location Search" +msgstr "Stedssøk" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Oppdateringsintervall:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "min" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "Søkedata hentet ut fra data levert av Geonames.org." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." -msgstr "Met.no-værmeldingsdata er levert av Meteorologisk institutt." +msgid "Country" +msgstr "Land" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." -msgstr "Data for soloppgang/solnedgang levert av Sunrise Sunset." +msgid "Filter" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." -msgstr "OWM-værmeldingsdata levert av OpenWeather." +msgid "Confirmation" +msgstr "Bekreftelse" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." -msgstr "Vær-ikoner er laget av Erik Flowers." - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Temperatur:" +msgid "Do you want to select" +msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Trykk:" +msgid "Temperature" +msgstr "Temperatur" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Vindhastighet:" +msgid "Pressure" +msgstr "Trykk" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Tidssone:" +msgid "Wind speed" +msgstr "Vindhastighet" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -369,6 +337,7 @@ msgstr "Min lokaltid" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -376,29 +345,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "Steds-tidssone" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Neste plassering" -#: ../../package/contents/ui/FullRepresentationInTray.qml -#: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" -msgstr "Oppdater" - #: ../../package/contents/ui/FullRepresentation.qml msgid "Previous Location" msgstr "Forrige plassering" -#: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Gjenoppta oppdatering" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Pause oppdatering" +#: ../../package/contents/ui/FullRepresentation.qml +msgid "Reload" +msgstr "Oppdater" #: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "%1 siden" @@ -419,18 +379,101 @@ msgid "in" msgstr "tommer" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "Værmeldingsdata levert av Meteorologisk institutt." -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "i dag" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "Værmeldingsdata levert av OpenWeather." +#~ msgid "Weather Widget 2" +#~ msgstr "Weather Widget 2" + +#~ msgid "Layout type:" +#~ msgstr "Utformingstype:" + +#~ msgid "Active timeout:" +#~ msgstr "Aktiv tidsavbrudd:" + +#~ msgid "Widget font style:" +#~ msgstr "Widget-fontstørrelse:" + +#~ msgid "Widget font size:" +#~ msgstr "Widget-skriftstørrelse:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Finn din By-ID ved å søke her:" + +#~ msgid "Error!" +#~ msgstr "Feil!" + +#~ msgid "Do you want to select this place?" +#~ msgstr "Ønsker du å velge dette stedet?" + +#~ msgid "The Latitude is not valid." +#~ msgstr "Breddegraden er ikke gyldig." + +#~ msgid "The Latitude is not between -90 and 90." +#~ msgstr "Breddegraden er ikke mellom -90 og 90." + +#~ msgid "The Longitude is not valid." +#~ msgstr "Lengdegraden er ikke gyldig." + +#~ msgid "The Longitude is not between -180 and 180." +#~ msgstr "Lengdegraden er ikke mellom -180 og 180." + +#~ msgid "The Altitude is not valid." +#~ msgstr "Høyden over havet er ikke gyldig." + +#~ msgid "The Altitude is not between -999 and 5000." +#~ msgstr "Høyden over havet er ikke mellom -999 og 5000." + +#~ msgid "The Place Name is empty." +#~ msgstr "Stedsnavnet er tomt." + +#~ msgid "There is an error!" +#~ msgid_plural "There are %1 errors!" +#~ msgstr[0] "Det er en feil!" +#~ msgstr[1] "Det er %1 feil!" + +#~ msgid "Country:" +#~ msgstr "Land:" + +#~ msgid "Filter:" +#~ msgstr "Filter:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Plasmoid-versjon:" + +#~ msgid "Action" +#~ msgstr "Handling" + +#~ msgid "Reload interval:" +#~ msgstr "Oppdateringsintervall:" + +#~ msgid "Temperature:" +#~ msgstr "Temperatur:" + +#~ msgid "Pressure:" +#~ msgstr "Trykk:" + +#~ msgid "Wind speed:" +#~ msgstr "Vindhastighet:" + +#~ msgid "Timezone:" +#~ msgstr "Tidssone:" + +#~ msgid "Resume Updating" +#~ msgstr "Gjenoppta oppdatering" + +#~ msgid "Pause Updating" +#~ msgstr "Pause oppdatering" + +#~ msgid "today" +#~ msgstr "i dag" + #~ msgid "The Latitude is not numeric." #~ msgstr "Breddegraden er ikke numerisk." diff --git a/translations/po/nl.po b/translations/po/nl.po index 472e659..5679d59 100644 --- a/translations/po/nl.po +++ b/translations/po/nl.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: weatherWidget-2\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-03-13 19:39+0100\n" "Last-Translator: Heimen Stoffels \n" "Language-Team: \n" @@ -17,24 +17,29 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" +"X-Language: nl\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" -msgstr "Weerwidget 2" +msgid "Weather Widget 3" +msgstr "" #: ../../package/metadata.desktop msgid "Plasmoid showing weather information from met.no server" msgstr "Een plasmoid die weerinformatie toont van de met.no-server" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "%1 m" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "%1 u" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "%1 d" @@ -109,8 +114,8 @@ msgid "Layout" msgstr "Indeling" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Soort indeling:" +msgid "Layout type" +msgstr "Soort indeling" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -135,13 +140,13 @@ msgid "In-Tray Settings" msgstr "Systeemvakinstellingen" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Actieve time-out:" +msgid "Active timeout" +msgstr "Actieve time-out" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" msgid "sec" -msgstr "sec." +msgstr "sec" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "" @@ -154,12 +159,12 @@ msgstr "" "systeemvakinstellingen van het paneel." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" -msgstr "Lettertypestijl:" +msgid "Widget font style" +msgstr "Lettertypestijl" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" -msgstr "Tekstgrootte:" +msgid "Widget font size" +msgstr "Tekstgrootte" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "pixels" @@ -167,102 +172,82 @@ msgid "px" msgstr "px" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "OpenWeatherMap-locatie toevoegen" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Plak hier de url" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Locatie-alias" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Zoek de id van je locatie:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"…en plak de volledige url hier.\n" -"Voorbeeld: https://openweathermap.org/city/2745912 (Utrecht, Nederland)." +msgid "Location" +msgstr "Locatie" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "Foutmelding!" +msgid "Area" +msgstr "Gebied" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" -msgstr "Bevestiging" +msgid "Latitude" +msgstr "Breedtegraad" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "Wil je deze locatie toevoegen?" +msgid "Longitude" +msgstr "Lengtegraad" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Met.no-locatie toevoegen" +msgid "Altitude" +msgstr "Hoogte" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Tijdzone" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "De breedtegraad ligt niet tussen -90 en 90." +msgid "Plasmoid version" +msgstr "Plasmoid-versie" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Source" +msgstr "Bron" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "De breedtegraad ligt niet tussen -180 en 180." +msgid "Place Identifier" +msgstr "Locatie-id" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Displayed as" +msgstr "Wordt getoond als" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." -msgstr "Voer een locatie in." +msgid "Miscellaneous" +msgstr "Overig" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "Er is een fout opgetreden!" -msgstr[1] "Er zijn %1 fouten opgetreden!" +msgid "Reload interval" +msgstr "Bijwerktussenpoos" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Breedtegraad" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Lengtegraad" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "min" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" -msgstr "Hoogte" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." +msgstr "" +"De Met.no-weersvoorspelling wordt aangeleverd door het Noors Meteorologisch " +"Instituut." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" -msgstr "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgstr "De zonsopkomst/-ondergang wordt aangeleverd door Sunrise - Sunset." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Locatie-id" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "De OWM-weersvoorspelling wordt aangeleverd door OpenWeather." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" -msgstr "Zoeken" +msgid "Weather icons created by Erik Flowers." +msgstr "De weerpictogrammen zijn gemaakt door Erik Flowers." #: ../../package/contents/ui/config/ConfigGeneral.qml msgid "Change Displayed As" @@ -273,97 +258,80 @@ msgid "Enter place alias" msgstr "Voer een locatie-alias in" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "Locatie zoeken" +msgid "Add Open Weather Map Place" +msgstr "OpenWeatherMap-locatie toevoegen" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Locatie" +msgid "Paste URL here" +msgstr "Plak hier de url" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "Gebied" +msgid "City alias" +msgstr "Locatie-alias" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "Tijdzone" +msgid "Find your city ID by searching here" +msgstr "Zoek de id van je locatie" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." -msgstr "De zoekinformatie is geëxtraheerd van Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." +msgstr "" +"…en plak de volledige url hier.\n" +"Voorbeeld: https://openweathermap.org/city/2745912 (Utrecht, Nederland)." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "Land:" +msgid "Add Met.no Map Place" +msgstr "Met.no-locatie toevoegen" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" -msgstr "Filter:" +msgid "Search" +msgstr "Zoeken" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Plasmoid-versie:" +msgid "URL" +msgstr "URL" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Bron" +msgid "Location Search" +msgstr "Locatie zoeken" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Wordt getoond als" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Actie" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "De zoekinformatie is geëxtraheerd van Geonames.org." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Overig" +msgid "Country" +msgstr "Land" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Bijwerktussenpoos:" +msgid "Filter" +msgstr "Filter" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "min." +msgid "Confirmation" +msgstr "Bevestiging" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Do you want to select" msgstr "" -"De Met.no-weersvoorspelling wordt aangeleverd door het Noors Meteorologisch " -"Instituut." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." -msgstr "De zonsopkomst/-ondergang wordt aangeleverd door Sunrise - Sunset." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." -msgstr "De OWM-weersvoorspelling wordt aangeleverd door OpenWeather." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." -msgstr "De weerpictogrammen zijn gemaakt door Erik Flowers." - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Temperatuur:" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Luchtdruk:" +msgid "Temperature" +msgstr "Temperatuur" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Windsnelheid:" +msgid "Pressure" +msgstr "Luchtdruk" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Tijdzone:" +msgid "Wind speed" +msgstr "Windsnelheid" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -371,6 +339,7 @@ msgstr "Lokale tijd" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -378,29 +347,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Volgende locatie" -#: ../../package/contents/ui/FullRepresentationInTray.qml -#: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" -msgstr "Vernieuwen" - #: ../../package/contents/ui/FullRepresentation.qml msgid "Previous Location" msgstr "Vorige locatie" -#: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Bijwerken voortzetten" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Bijwerken onderbreken" +#: ../../package/contents/ui/FullRepresentation.qml +msgid "Reload" +msgstr "Vernieuwen" #: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "%1 geleden" @@ -421,20 +381,91 @@ msgid "in" msgstr "in" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" "De weersvoorspelling wordt aangeleverd door het Noors Meteorologisch " "Instituut." -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "Vandaag" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Weather Widget 2" +#~ msgstr "Weerwidget 2" + +#~ msgid "Layout type:" +#~ msgstr "Soort indeling:" + +#~ msgid "Active timeout:" +#~ msgstr "Actieve time-out:" + +#~ msgid "Widget font style:" +#~ msgstr "Lettertypestijl:" + +#~ msgid "Widget font size:" +#~ msgstr "Tekstgrootte:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Zoek de id van je locatie:" + +#~ msgid "Error!" +#~ msgstr "Foutmelding!" + +#~ msgid "Do you want to select this place?" +#~ msgstr "Wil je deze locatie toevoegen?" + +#~ msgid "The Latitude is not between -90 and 90." +#~ msgstr "De breedtegraad ligt niet tussen -90 en 90." + +#~ msgid "The Longitude is not between -180 and 180." +#~ msgstr "De breedtegraad ligt niet tussen -180 en 180." + +#~ msgid "The Place Name is empty." +#~ msgstr "Voer een locatie in." + +#~ msgid "There is an error!" +#~ msgid_plural "There are %1 errors!" +#~ msgstr[0] "Er is een fout opgetreden!" +#~ msgstr[1] "Er zijn %1 fouten opgetreden!" + +#~ msgid "Country:" +#~ msgstr "Land:" + +#~ msgid "Filter:" +#~ msgstr "Filter:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Plasmoid-versie:" + +#~ msgid "Action" +#~ msgstr "Actie" + +#~ msgid "Reload interval:" +#~ msgstr "Bijwerktussenpoos:" + +#~ msgid "Temperature:" +#~ msgstr "Temperatuur:" + +#~ msgid "Pressure:" +#~ msgstr "Luchtdruk:" + +#~ msgid "Wind speed:" +#~ msgstr "Windsnelheid:" + +#~ msgid "Timezone:" +#~ msgstr "Tijdzone:" + +#~ msgid "Resume Updating" +#~ msgstr "Bijwerken voortzetten" + +#~ msgid "Pause Updating" +#~ msgstr "Bijwerken onderbreken" + +#~ msgid "today" +#~ msgstr "Vandaag" + #~ msgid "The Latitude is not numeric." #~ msgstr "De breedtegraad is geen numeriek getal." diff --git a/translations/po/pl.po b/translations/po/pl.po index 54723fb..3b4f7be 100644 --- a/translations/po/pl.po +++ b/translations/po/pl.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-10-21 23:46+0200\n" "Last-Translator: Tomasz Przybył \n" "Language-Team: Polish \n" @@ -14,27 +14,31 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 3.1.1\n" +"X-Language: pl\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" -msgstr "Weather Widget 2" +msgid "Weather Widget 3" +msgstr "" #: ../../package/metadata.desktop msgid "Plasmoid showing weather information from met.no server" msgstr "Plasmoid pokazujący informacje o pogodzie z serwera met.no" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "%1 m" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "%1 h" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "%1 d" @@ -109,8 +113,8 @@ msgid "Layout" msgstr "Rozmieszczenie" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Typ wyglądu:" +msgid "Layout type" +msgstr "Typ wyglądu" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -134,8 +138,8 @@ msgid "In-Tray Settings" msgstr "Ustawienia ikony w zasobniku" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Czas aktywności:" +msgid "Active timeout" +msgstr "Czas aktywności" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -157,12 +161,12 @@ msgstr "" "dla samodzielnego plasmoidu dodanego jako osobny element Panelu." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" -msgstr "Styl czcionki widżetu:" +msgid "Widget font style" +msgstr "Styl czcionki widżetu" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" -msgstr "Rozmiar czcionki widżetu:" +msgid "Widget font size" +msgstr "Rozmiar czcionki widżetu" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "pixels" @@ -170,103 +174,82 @@ msgid "px" msgstr "px" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Dodaj miejscowość z Open Weather" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Wklej URL tutaj" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Alias miasta" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Wyszukaj ID twojego miasta tutaj:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"i wklej tutaj URL\n" -"np. http://openweathermap.org/city/756135 dla Warszawa, Polska." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "Błąd!" +msgid "Location" +msgstr "Lokalizacja" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" -msgstr "Potwierdzenie" +msgid "Area" +msgstr "Obszar" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "Czy chcesz wybrać to miejsce?" +msgid "Latitude" +msgstr "Szerokość geograficzna" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Dodaj miejscowość z Met.no" +msgid "Longitude" +msgstr "Długość geograficzna" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." -msgstr "Szerokość geograficzna jest nieprawidłowa." +msgid "Altitude" +msgstr "Wysokość geograficzna" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "Szerokość geograficzna nie mieści się w przedziale od -90 do 90." +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Strefa czasowa" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "Długość geograficzna jest nieprawidłowa." +msgid "Plasmoid version" +msgstr "Wersja plasmoidu" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "Długość geograficzna nie mieści się w przedziale od -180 do 180." +msgid "Source" +msgstr "Źródło" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "Wysokość geograficzna jest nieprawidłowa." +msgid "Place Identifier" +msgstr "ID miejsca" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "Wysokość geograficzna nie mieści się w przedziale od -999 do 5000." +msgid "Displayed as" +msgstr "Alias" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." -msgstr "Nazwa miejsca jest pusta." +msgid "Description" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "Wystąpił błąd!" -msgstr[1] "Wystąpiły %1 błędy!" -msgstr[2] "Wystąpiły %1 błędy!" +msgid "Miscellaneous" +msgstr "Różne" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Szerokość geograficzna" +msgid "Reload interval" +msgstr "Aktualizuj co" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Długość geograficzna" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "min" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" -msgstr "Wysokość geograficzna" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." +msgstr "" +"Met.no dane prognozy pogody dostarczone przez Norweski Instytut " +"Meteorologiczny." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" -msgstr "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgstr "Dane wschodu/zachodu słońca dostarczane przez Sunrise - Sunset." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "ID miejsca" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "Dane prognozy pogody OWM dostarczone przez OpenWeather." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" -msgstr "Szukaj" +msgid "Weather icons created by Erik Flowers." +msgstr "Ikony pogody stworzone przez Erika Flowersa." #: ../../package/contents/ui/config/ConfigGeneral.qml msgid "Change Displayed As" @@ -277,98 +260,81 @@ msgid "Enter place alias" msgstr "Wpisz alias miejsca" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "Wyszukiwanie lokalizacji" +msgid "Add Open Weather Map Place" +msgstr "Dodaj miejscowość z Open Weather" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Lokalizacja" +msgid "Paste URL here" +msgstr "Wklej URL tutaj" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "Obszar" +msgid "City alias" +msgstr "Alias miasta" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "Strefa czasowa" +msgid "Find your city ID by searching here" +msgstr "Wyszukaj ID twojego miasta tutaj" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" -"Dane wyszukiwania wyodrębnione z danych dostarczonych przez Geonames.org." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "Kraj:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" -msgstr "Filtr:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Wersja plasmoidu:" +"i wklej tutaj URL\n" +"np. http://openweathermap.org/city/756135 dla Warszawa, Polska." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Źródło" +msgid "Add Met.no Map Place" +msgstr "Dodaj miejscowość z Met.no" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Alias" +msgid "Search" +msgstr "Szukaj" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Akcja" +msgid "URL" +msgstr "URL" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Różne" +msgid "Location Search" +msgstr "Wyszukiwanie lokalizacji" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Aktualizuj co:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "min" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "" +"Dane wyszukiwania wyodrębnione z danych dostarczonych przez Geonames.org." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" -"Met.no dane prognozy pogody dostarczone przez Norweski Instytut " -"Meteorologiczny." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." -msgstr "Dane wschodu/zachodu słońca dostarczane przez Sunrise - Sunset." +msgid "Filter" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." -msgstr "Dane prognozy pogody OWM dostarczone przez OpenWeather." +msgid "Confirmation" +msgstr "Potwierdzenie" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." -msgstr "Ikony pogody stworzone przez Erika Flowersa." - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Temperatura:" +msgid "Do you want to select" +msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Ciśnienie:" +msgid "Temperature" +msgstr "Temperatura" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Prędkość wiatru:" +msgid "Pressure" +msgstr "Ciśnienie" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Strefa czasowa:" +msgid "Wind speed" +msgstr "Prędkość wiatru" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -376,6 +342,7 @@ msgstr "Czas lokalny" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -383,29 +350,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "Strefa czasowa lokalizacji" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Następne miejsce" -#: ../../package/contents/ui/FullRepresentationInTray.qml -#: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" -msgstr "Przeładuj" - #: ../../package/contents/ui/FullRepresentation.qml msgid "Previous Location" msgstr "Poprzednie miejsce" -#: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Wznów aktualizację" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Wstrzymaj aktualizację" +#: ../../package/contents/ui/FullRepresentation.qml +msgid "Reload" +msgstr "Przeładuj" #: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "%1 temu" @@ -426,19 +384,103 @@ msgid "in" msgstr "in" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" "Dane prognozy pogody dostarczone przez Norweski Instytut Meteorologiczny." -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "dzisiaj" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "Dane prognozy pogody dostarczone przez OpenWeather." +#~ msgid "Weather Widget 2" +#~ msgstr "Weather Widget 2" + +#~ msgid "Layout type:" +#~ msgstr "Typ wyglądu:" + +#~ msgid "Active timeout:" +#~ msgstr "Czas aktywności:" + +#~ msgid "Widget font style:" +#~ msgstr "Styl czcionki widżetu:" + +#~ msgid "Widget font size:" +#~ msgstr "Rozmiar czcionki widżetu:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Wyszukaj ID twojego miasta tutaj:" + +#~ msgid "Error!" +#~ msgstr "Błąd!" + +#~ msgid "Do you want to select this place?" +#~ msgstr "Czy chcesz wybrać to miejsce?" + +#~ msgid "The Latitude is not valid." +#~ msgstr "Szerokość geograficzna jest nieprawidłowa." + +#~ msgid "The Latitude is not between -90 and 90." +#~ msgstr "Szerokość geograficzna nie mieści się w przedziale od -90 do 90." + +#~ msgid "The Longitude is not valid." +#~ msgstr "Długość geograficzna jest nieprawidłowa." + +#~ msgid "The Longitude is not between -180 and 180." +#~ msgstr "Długość geograficzna nie mieści się w przedziale od -180 do 180." + +#~ msgid "The Altitude is not valid." +#~ msgstr "Wysokość geograficzna jest nieprawidłowa." + +#~ msgid "The Altitude is not between -999 and 5000." +#~ msgstr "Wysokość geograficzna nie mieści się w przedziale od -999 do 5000." + +#~ msgid "The Place Name is empty." +#~ msgstr "Nazwa miejsca jest pusta." + +#~ msgid "There is an error!" +#~ msgid_plural "There are %1 errors!" +#~ msgstr[0] "Wystąpił błąd!" +#~ msgstr[1] "Wystąpiły %1 błędy!" +#~ msgstr[2] "Wystąpiły %1 błędy!" + +#~ msgid "Country:" +#~ msgstr "Kraj:" + +#~ msgid "Filter:" +#~ msgstr "Filtr:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Wersja plasmoidu:" + +#~ msgid "Action" +#~ msgstr "Akcja" + +#~ msgid "Reload interval:" +#~ msgstr "Aktualizuj co:" + +#~ msgid "Temperature:" +#~ msgstr "Temperatura:" + +#~ msgid "Pressure:" +#~ msgstr "Ciśnienie:" + +#~ msgid "Wind speed:" +#~ msgstr "Prędkość wiatru:" + +#~ msgid "Timezone:" +#~ msgstr "Strefa czasowa:" + +#~ msgid "Resume Updating" +#~ msgstr "Wznów aktualizację" + +#~ msgid "Pause Updating" +#~ msgstr "Wstrzymaj aktualizację" + +#~ msgid "today" +#~ msgstr "dzisiaj" + #~ msgid "Offline mode" #~ msgstr "Tryb offline" diff --git a/translations/po/ru.po b/translations/po/ru.po index 82993b5..7b359b0 100644 --- a/translations/po/ru.po +++ b/translations/po/ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-09-29 17:35+0700\n" "Last-Translator: Damir Islamov \n" "Language-Team: Russian \n" @@ -17,26 +17,30 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" -"Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : " -"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"X-Language: ru\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" -msgstr "Виджет погоды 2" +msgid "Weather Widget 3" +msgstr "" #: ../../package/metadata.desktop msgid "Plasmoid showing weather information from met.no server" msgstr "Плазмоид, показывающий информацию о погоде с сервера met.no" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "%1 м" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "%1 ч" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "%1 д" @@ -111,8 +115,8 @@ msgid "Layout" msgstr "Размещение" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Тип размещения:" +msgid "Layout type" +msgstr "Тип размещения" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -135,8 +139,8 @@ msgid "In-Tray Settings" msgstr "Настройки лотка" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Время отображения:" +msgid "Active timeout" +msgstr "Время отображения" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -154,11 +158,15 @@ msgstr "" "системного лотка можно установить значение \"Показывать всегда\"." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "Шрифт виджета" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Show last reloaded time" +msgstr "Показать последнее обновление" + +#: ../../package/contents/ui/config/ConfigAppearance.qml +msgid "Widget font size" msgstr "Размер шрифта виджета" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -167,104 +175,82 @@ msgid "px" msgstr "пикс." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Добавить место Open Weather Map" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Вставьте URL-адрес сюда" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Название для города" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Найдите ID нужного города через поиск здесь:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"...и вставьте сюда адрес интернет-страницы целиком\n" -"напр., http://openweathermap.org/city/524901 для Москвы, Россия." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "Ошибка!" +msgid "Location" +msgstr "Местоположение" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" -msgstr "Подтверждение" +msgid "Area" +msgstr "Зона" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "Хотите выбрать это место?" +msgid "Latitude" +msgstr "Широта" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Добавить место Met.no" +msgid "Longitude" +msgstr "Долгота" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." -msgstr "Некорректное значение широты." +msgid "Altitude" +msgstr "Высота" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "Широта вне интервала между -90 и 90." +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Часовой пояс" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "Некорректное значение долготы." +msgid "Plasmoid version" +msgstr "Версия плазмоида" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "Долгота вне интервала между -180 и 180." +msgid "Source" +msgstr "Источник" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "Некорректное значение высоты" +msgid "Place Identifier" +msgstr "Идентификатор места" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "Высота вне интервала между -999 и 5000." +msgid "Displayed as" +msgstr "Отображать как" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." -msgstr "Название места пусто." +msgid "Description" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "Ошибка!" -msgstr[1] "%1 ошибки!" -msgstr[2] "%1 ошибок!" -msgstr[3] "Ошибка!" +msgid "Miscellaneous" +msgstr "Разное" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Широта" +msgid "Reload interval" +msgstr "Интервал обновления" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Долгота" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "мин" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" -msgstr "Высота" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." +msgstr "" +"Данные прогноза погоды Met.no предоставлены Норвежским метеорологическим " +"институтом." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" -msgstr "URL-адрес" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgstr "Данные о восходе/закате предоставлены Sunrise - Sunset." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Идентификатор места" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "Данные прогноза погоды OWM предоставлены OpenWeather." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" -msgstr "Поиск" +msgid "Weather icons created by Erik Flowers." +msgstr "Иконки погоды созданы Эриком Флауэрсом." #: ../../package/contents/ui/config/ConfigGeneral.qml msgid "Change Displayed As" @@ -275,97 +261,80 @@ msgid "Enter place alias" msgstr "Введите название места" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "Поиск местоположения" +msgid "Add Open Weather Map Place" +msgstr "Добавить место Open Weather Map" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Местоположение" +msgid "Paste URL here" +msgstr "Вставьте URL-адрес сюда" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "Зона" +msgid "City alias" +msgstr "Название для города" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "Часовой пояс" +msgid "Find your city ID by searching here" +msgstr "Найдите ID нужного города через поиск здесь" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." -msgstr "Данные для поиска извлечены из данных, предоставленных Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." +msgstr "" +"...и вставьте сюда адрес интернет-страницы целиком\n" +"напр., http://openweathermap.org/city/524901 для Москвы, Россия." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "Страна:" +msgid "Add Met.no Map Place" +msgstr "Добавить место Met.no" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" -msgstr "Фильтр:" +msgid "Search" +msgstr "Поиск" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Версия плазмоида:" +msgid "URL" +msgstr "URL-адрес" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Источник" +msgid "Location Search" +msgstr "Поиск местоположения" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Отображать как" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Действие" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "Данные для поиска извлечены из данных, предоставленных Geonames.org." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Разное" +msgid "Country" +msgstr "Страна" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Интервал обновления:" +msgid "Filter" +msgstr "Фильтр" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "мин" +msgid "Confirmation" +msgstr "Подтверждение" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Do you want to select" msgstr "" -"Данные прогноза погоды Met.no предоставлены Норвежским метеорологическим " -"институтом." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." -msgstr "Данные о восходе/закате предоставлены Sunrise - Sunset." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." -msgstr "Данные прогноза погоды OWM предоставлены OpenWeather." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." -msgstr "Иконки погоды созданы Эриком Флауэрсом." - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Температура:" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Давление:" +msgid "Temperature" +msgstr "Температура" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Скорость ветра:" +msgid "Pressure" +msgstr "Давление" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Часовой пояс:" +msgid "Wind speed" +msgstr "Скорость ветра" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -373,6 +342,7 @@ msgstr "Местное время" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -380,29 +350,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "Часовой пояс местоположения" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Следующее место" -#: ../../package/contents/ui/FullRepresentationInTray.qml -#: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" -msgstr "Обновить" - #: ../../package/contents/ui/FullRepresentation.qml msgid "Previous Location" msgstr "Предыдущее место" -#: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Отменить обновление" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Приостановить обновление" +#: ../../package/contents/ui/FullRepresentation.qml +msgid "Reload" +msgstr "Обновить" #: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "%1 назад" @@ -423,19 +384,103 @@ msgid "in" msgstr "дм" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" "Данные прогноза погоды предоставлены Норвежским метеорологическим институтом." -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "сегодня" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "Данные прогноза погоды предоставлены OpenWeather." +#~ msgid "Weather Widget 2" +#~ msgstr "Виджет погоды 2" + +#~ msgid "Layout type:" +#~ msgstr "Тип размещения:" + +#~ msgid "Active timeout:" +#~ msgstr "Время отображения:" + +#~ msgid "Widget font style:" +#~ msgstr "Шрифт виджета" + +#~ msgid "Widget font size:" +#~ msgstr "Размер шрифта виджета" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Найдите ID нужного города через поиск здесь:" + +#~ msgid "Error!" +#~ msgstr "Ошибка!" + +#~ msgid "Do you want to select this place?" +#~ msgstr "Хотите выбрать это место?" + +#~ msgid "The Latitude is not valid." +#~ msgstr "Некорректное значение широты." + +#~ msgid "The Latitude is not between -90 and 90." +#~ msgstr "Широта вне интервала между -90 и 90." + +#~ msgid "The Longitude is not valid." +#~ msgstr "Некорректное значение долготы." + +#~ msgid "The Longitude is not between -180 and 180." +#~ msgstr "Долгота вне интервала между -180 и 180." + +#~ msgid "The Altitude is not valid." +#~ msgstr "Некорректное значение высоты" + +#~ msgid "The Altitude is not between -999 and 5000." +#~ msgstr "Высота вне интервала между -999 и 5000." + +#~ msgid "The Place Name is empty." +#~ msgstr "Название места пусто." + +#~ msgid "There is an error!" +#~ msgid_plural "There are %1 errors!" +#~ msgstr[0] "Ошибка!" +#~ msgstr[1] "%1 ошибки!" +#~ msgstr[2] "%1 ошибок!" + +#~ msgid "Country:" +#~ msgstr "Страна:" + +#~ msgid "Filter:" +#~ msgstr "Фильтр:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Версия плазмоида:" + +#~ msgid "Action" +#~ msgstr "Действие" + +#~ msgid "Reload interval:" +#~ msgstr "Интервал обновления:" + +#~ msgid "Temperature:" +#~ msgstr "Температура:" + +#~ msgid "Pressure:" +#~ msgstr "Давление:" + +#~ msgid "Wind speed:" +#~ msgstr "Скорость ветра:" + +#~ msgid "Timezone:" +#~ msgstr "Часовой пояс:" + +#~ msgid "Resume Updating" +#~ msgstr "Отменить обновление" + +#~ msgid "Pause Updating" +#~ msgstr "Приостановить обновление" + +#~ msgid "today" +#~ msgstr "сегодня" + #~ msgid "The Latitude is not numeric." #~ msgstr "Значение широта не числовое." diff --git a/translations/po/sv.po b/translations/po/sv.po index fa45412..c849697 100644 --- a/translations/po/sv.po +++ b/translations/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: weatherWidget-2\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-03-14 21:50+0100\n" "Last-Translator: \n" "Language-Team: \n" @@ -17,24 +17,29 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" +"X-Language: sv\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" -msgstr "Weather Widget 2" +msgid "Weather Widget 3" +msgstr "" #: ../../package/metadata.desktop msgid "Plasmoid showing weather information from met.no server" msgstr "Plasmoid som visar väderinformation från met.no" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "%1 m" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "%1 t" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "%1 d" @@ -109,8 +114,8 @@ msgid "Layout" msgstr "Layout" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "Layouttyp:" +msgid "Layout type" +msgstr "Layouttyp" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -135,8 +140,8 @@ msgid "In-Tray Settings" msgstr "Aktivitetsinställningar" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "Aktiv tidsgräns:" +msgid "Active timeout" +msgstr "Aktiv tidsgräns" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -153,12 +158,12 @@ msgstr "" "den uppdateras. Du kan ställa in så att den alltid visas i inställningarna." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" -msgstr "Plasmoidens typsnitt:" +msgid "Widget font style" +msgstr "Plasmoidens typsnitt" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" -msgstr "Typsnittsstorlek:" +msgid "Widget font size" +msgstr "Typsnittsstorlek" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "pixels" @@ -166,102 +171,81 @@ msgid "px" msgstr "px" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "Lägg till plats från Open Weather Map" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "Klistra in URL här" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "Stadsnamn" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "Hitta din stads ID genom att söka här:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"...och klistra in hela URL:en här\n" -"t.ex. http://openweathermap.org/city/2694762 för Linköping." +msgid "Location" +msgstr "Plats" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "Fel!" +msgid "Area" +msgstr "Område" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" -msgstr "Bekräftelse" +msgid "Latitude" +msgstr "Latitud" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "Är du säker på att du vill välja denna plats?" +msgid "Longitude" +msgstr "Longtitud" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "Lägg till plats från Met.no" +msgid "Altitude" +msgstr "Höjd" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "Tidszon" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "Latituden är inte mellan -90 och 90." +msgid "Plasmoid version" +msgstr "Plasmoidversion" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Source" +msgstr "Källa" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "Longituden är inte mellan -180 och 180." +msgid "Place Identifier" +msgstr "Platsidentiferare" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Displayed as" +msgstr "Visas som" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." -msgstr "Platsnamnet är tomt." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "Ett fel uppstod!" -msgstr[1] "%1 fel uppstod!" +msgid "Miscellaneous" +msgstr "Övrigt" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Latitud" +msgid "Reload interval" +msgstr "Plasmoidversion" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "Longtitud" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "min" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" -msgstr "Höjd" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." +msgstr "" +"Met.no:s väderleksrapport tillhandahålls av Meteorologisk institutt i Norge." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" -msgstr "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgstr "Soltiderna tillhandahålls av Sunrise - Sunset." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "Platsidentiferare" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "OWM:s väderleksrapport tillhandahålls av OpenWeather." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" -msgstr "Söl" +msgid "Weather icons created by Erik Flowers." +msgstr "Väderikonerna är skapade av Erik Flowers." #: ../../package/contents/ui/config/ConfigGeneral.qml msgid "Change Displayed As" @@ -272,96 +256,80 @@ msgid "Enter place alias" msgstr "Ange platsnamn" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "Platssök" +msgid "Add Open Weather Map Place" +msgstr "Lägg till plats från Open Weather Map" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "Plats" +msgid "Paste URL here" +msgstr "Klistra in URL här" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "Område" +msgid "City alias" +msgstr "Stadsnamn" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "Tidszon" +msgid "Find your city ID by searching here" +msgstr "Hitta din stads ID genom att söka här" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." -msgstr "Sökdata är ett urval av data hämtad från Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." +msgstr "" +"...och klistra in hela URL:en här\n" +"t.ex. http://openweathermap.org/city/2694762 för Linköping." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "Land:" +msgid "Add Met.no Map Place" +msgstr "Lägg till plats från Met.no" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" -msgstr "Filter:" +msgid "Search" +msgstr "Söl" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Plasmoidversion:" +msgid "URL" +msgstr "URL" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "Källa" +msgid "Location Search" +msgstr "Platssök" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "Visas som" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "Åtgärd" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "Sökdata är ett urval av data hämtad från Geonames.org." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "Övrigt" +msgid "Country" +msgstr "Land" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "Uppdateringsintervall:" +msgid "Filter" +msgstr "Filter" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "min" +msgid "Confirmation" +msgstr "Bekräftelse" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Do you want to select" msgstr "" -"Met.no:s väderleksrapport tillhandahålls av Meteorologisk institutt i Norge." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." -msgstr "Soltiderna tillhandahålls av Sunrise - Sunset." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." -msgstr "OWM:s väderleksrapport tillhandahålls av OpenWeather." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." -msgstr "Väderikonerna är skapade av Erik Flowers." #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "Temperatur:" +msgid "Temperature" +msgstr "Temperatur" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "Tryck:" +msgid "Pressure" +msgstr "Tryck" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "Vindhastighet:" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "Tidszon:" +msgid "Wind speed" +msgstr "Vindhastighet" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -369,6 +337,7 @@ msgstr "Min lokala tid" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -376,29 +345,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "Nästa plats" -#: ../../package/contents/ui/FullRepresentationInTray.qml -#: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" -msgstr "Uppdatera" - #: ../../package/contents/ui/FullRepresentation.qml msgid "Previous Location" msgstr "Föregående plats" -#: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "Återuppta uppdatering" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "Pausa uppdatering" +#: ../../package/contents/ui/FullRepresentation.qml +msgid "Reload" +msgstr "Uppdatera" #: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "%1 sedan" @@ -419,18 +379,89 @@ msgid "in" msgstr "tum" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "Väderleksrapporten tillhandahålls av Meteorologisk institutt i Norge." -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "idag" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Weather Widget 2" +#~ msgstr "Weather Widget 2" + +#~ msgid "Layout type:" +#~ msgstr "Layouttyp:" + +#~ msgid "Active timeout:" +#~ msgstr "Aktiv tidsgräns:" + +#~ msgid "Widget font style:" +#~ msgstr "Plasmoidens typsnitt:" + +#~ msgid "Widget font size:" +#~ msgstr "Typsnittsstorlek:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "Hitta din stads ID genom att söka här:" + +#~ msgid "Error!" +#~ msgstr "Fel!" + +#~ msgid "Do you want to select this place?" +#~ msgstr "Är du säker på att du vill välja denna plats?" + +#~ msgid "The Latitude is not between -90 and 90." +#~ msgstr "Latituden är inte mellan -90 och 90." + +#~ msgid "The Longitude is not between -180 and 180." +#~ msgstr "Longituden är inte mellan -180 och 180." + +#~ msgid "The Place Name is empty." +#~ msgstr "Platsnamnet är tomt." + +#~ msgid "There is an error!" +#~ msgid_plural "There are %1 errors!" +#~ msgstr[0] "Ett fel uppstod!" +#~ msgstr[1] "%1 fel uppstod!" + +#~ msgid "Country:" +#~ msgstr "Land:" + +#~ msgid "Filter:" +#~ msgstr "Filter:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Plasmoidversion:" + +#~ msgid "Action" +#~ msgstr "Åtgärd" + +#~ msgid "Reload interval:" +#~ msgstr "Uppdateringsintervall:" + +#~ msgid "Temperature:" +#~ msgstr "Temperatur:" + +#~ msgid "Pressure:" +#~ msgstr "Tryck:" + +#~ msgid "Wind speed:" +#~ msgstr "Vindhastighet:" + +#~ msgid "Timezone:" +#~ msgstr "Tidszon:" + +#~ msgid "Resume Updating" +#~ msgstr "Återuppta uppdatering" + +#~ msgid "Pause Updating" +#~ msgstr "Pausa uppdatering" + +#~ msgid "today" +#~ msgstr "idag" + #~ msgid "The Latitude is not numeric." #~ msgstr "Latituden är inte giltig." diff --git a/translations/po/template.pot b/translations/po/template.pot index 17f061c..5013436 100644 --- a/translations/po/template.pot +++ b/translations/po/template.pot @@ -1,14 +1,14 @@ -# Translation of weatherWidget-2 in LANGUAGE -# Copyright (C) 2022 -# This file is distributed under the same license as the weatherWidget-2 package. +# Translation of weatherWidget-3 in LANGUAGE +# Copyright (C) 2024 +# This file is distributed under the same license as the weatherWidget-3 package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" -"Project-Id-Version: weatherWidget-2\n" +"Project-Id-Version: weatherWidget-3\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,10 +16,9 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -100,7 +99,7 @@ msgid "Layout" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" +msgid "Layout type" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -124,7 +123,7 @@ msgid "In-Tray Settings" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" +msgid "Active timeout" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -137,11 +136,11 @@ msgid "NOTE: After this timeout widget will be hidden in system tray until refre msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -150,99 +149,76 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." +msgid "Location" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" +msgid "Area" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" +msgid "Latitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" +msgid "Longitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" +msgid "Altitude" msgstr "" -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." +#: ../../package/contents/ui/config/ConfigGeneral.qml ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." +msgid "Plasmoid version" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." +msgid "Source" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." +msgid "Place Identifier" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." +msgid "Displayed as" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "Miscellaneous" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" -msgstr[1] "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" +msgid "Reload interval" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" +msgctxt "Abbreviation for minutes" +msgid "min" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "Met.no weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" +msgid "OWM weather forecast data provided by OpenWeather." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -254,99 +230,84 @@ msgid "Enter place alias" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" +msgid "Add Open Weather Map Place" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "Paste URL here" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" +msgid "City alias" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Find your city ID by searching here" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" +msgid "Add Met.no Map Place" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" +msgid "URL" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" +msgid "Location Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" +msgid "Alt" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" +msgid "Search data extracted from data provided by Geonames.org." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Met.no weather forecast data provided by The Norwegian Meteorological Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." -msgstr "" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" +msgid "Temperature" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" +msgid "Pressure" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" +msgid "Wind speed" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" msgstr "" -#: ../../package/contents/ui/config/ConfigUnits.qml ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/config/ConfigUnits.qml ../../package/contents/ui/FullRepresentation.qml ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "" @@ -354,24 +315,16 @@ msgstr "" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" -msgstr "" - #: ../../package/contents/ui/FullRepresentation.qml msgid "Previous Location" msgstr "" -#: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" +#: ../../package/contents/ui/FullRepresentation.qml +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml @@ -394,14 +347,10 @@ msgstr "" msgid "in" msgstr "" -#: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/MetNo.qml ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" diff --git a/translations/po/zh_CN.po b/translations/po/zh_CN.po index 05dfaa9..699e7db 100644 --- a/translations/po/zh_CN.po +++ b/translations/po/zh_CN.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: 1.0\n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-01-03 22:17+0000\n" "Last-Translator: 吴相东 \n" "Language-Team: 吴相东 \n" @@ -16,9 +16,12 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Language: zh_CN\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -26,14 +29,17 @@ msgid "Plasmoid showing weather information from met.no server" msgstr "添加 Open Weather Map" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "" @@ -108,8 +114,8 @@ msgid "Layout" msgstr "布局" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "布局类型:" +msgid "Layout type" +msgstr "布局类型" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -132,8 +138,8 @@ msgid "In-Tray Settings" msgstr "托盘部件设置" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "显示时间:" +msgid "Active timeout" +msgstr "显示时间" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -145,16 +151,14 @@ msgid "" "NOTE: After this timeout widget will be hidden in system tray until " "refreshed. You can always set the widget to be always \"Shown\" in system " "tray \"Entries\" settings." -msgstr "" -"注意: 过了此时间后部件将会被隐藏至托盘中,直到天气更新后重新显示.你可以通过系" -"统托盘 \"项目\"设置中将其设置为总是显示." +msgstr "注意: 过了此时间后部件将会被隐藏至托盘中,直到天气更新后重新显示.你可以通过系统托盘 \"项目\"设置中将其设置为总是显示." #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -163,101 +167,79 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "添加 Open Weather Map" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "在此粘贴网址" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "城市名称" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "搜索这里找到你的城市ID:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"在此粘贴网址\n" -"例如: http://openweathermap.org/city/2946447 德国,波恩." - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "" +msgid "Location" +msgstr "位置" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" +msgid "Area" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "" +msgid "Latitude" +msgstr "Latitude" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "添加 Met.no" +msgid "Longitude" +msgstr "长身材" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." +msgid "Altitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "时区" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Plasmoid version" +msgstr "部件版本" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "" +msgid "Source" +msgstr "来源" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Place Identifier" +msgstr "地区ID" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "" +msgid "Displayed as" +msgstr "显示名称" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" -msgstr[1] "" +msgid "Miscellaneous" +msgstr "杂项" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "Latitude" +msgid "Reload interval" +msgstr "载入间隔" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "长身材" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "分钟" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "地区ID" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -269,102 +251,88 @@ msgid "Enter place alias" msgstr "输入城市名称" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" +msgid "Add Open Weather Map Place" +msgstr "添加 Open Weather Map" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "位置" +msgid "Paste URL here" +msgstr "在此粘贴网址" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" +msgid "City alias" +msgstr "城市名称" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "" +msgid "Find your city ID by searching here" +msgstr "搜索这里找到你的城市ID" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" +"在此粘贴网址\n" +"例如: http://openweathermap.org/city/2946447 德国,波恩." #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "" +msgid "Add Met.no Map Place" +msgstr "添加 Met.no" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "部件版本:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "来源" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "显示名称" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "动作" +msgid "URL" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "杂项" +msgid "Location Search" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "载入间隔:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "分钟" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "温度:" +msgid "Temperature" +msgstr "温度" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "气压:" +msgid "Pressure" +msgstr "气压" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" +msgid "Wind speed" msgstr "风速" -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "时区:" - #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" msgstr "本地时间" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -372,29 +340,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "下一个位置" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" +msgid "Previous Location" msgstr "" #: ../../package/contents/ui/FullRepresentation.qml -msgid "Previous Location" +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "恢复" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "暂停" - -#: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "%1 前" @@ -415,18 +374,54 @@ msgid "in" msgstr "" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "今天" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Layout type:" +#~ msgstr "布局类型:" + +#~ msgid "Active timeout:" +#~ msgstr "显示时间:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "搜索这里找到你的城市ID:" + +#~ msgid "Plasmoid version:" +#~ msgstr "部件版本:" + +#~ msgid "Action" +#~ msgstr "动作" + +#~ msgid "Reload interval:" +#~ msgstr "载入间隔:" + +#~ msgid "Temperature:" +#~ msgstr "温度:" + +#~ msgid "Pressure:" +#~ msgstr "气压:" + +#~ msgid "Wind speed:" +#~ msgstr "风速" + +#~ msgid "Timezone:" +#~ msgstr "时区:" + +#~ msgid "Resume Updating" +#~ msgstr "恢复" + +#~ msgid "Pause Updating" +#~ msgstr "暂停" + +#~ msgid "today" +#~ msgstr "今天" + #~ msgid "Offline mode" #~ msgstr "离线模式" diff --git a/translations/po/zh_TW.po b/translations/po/zh_TW.po index 5f16354..114ab7e 100644 --- a/translations/po/zh_TW.po +++ b/translations/po/zh_TW.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/blackadderkate/weather-widget-2\n" -"POT-Creation-Date: 2022-09-29 19:30+0700\n" +"POT-Creation-Date: 2024-02-18 09:43-0800\n" "PO-Revision-Date: 2022-01-03 22:18+0000\n" "Last-Translator: Jeff Huang \n" "Language-Team: Chinese \n" @@ -14,11 +14,13 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=n != 1;\n" +"Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 2.3\n" +"X-Language: zh_TW\n" +"X-Source-Language: C\n" #: ../../package/metadata.desktop -msgid "Weather Widget 2" +msgid "Weather Widget 3" msgstr "" #: ../../package/metadata.desktop @@ -26,14 +28,17 @@ msgid "Plasmoid showing weather information from met.no server" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 m" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 h" msgstr "" #: ../../package/contents/code/data-loader.js +#, qt-format msgid "%1 d" msgstr "" @@ -108,8 +113,8 @@ msgid "Layout" msgstr "佈局" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Layout type:" -msgstr "佈局類型:" +msgid "Layout type" +msgstr "布局类型" #: ../../package/contents/ui/config/ConfigAppearance.qml msgid "Horizontal" @@ -132,8 +137,8 @@ msgid "In-Tray Settings" msgstr "系統匣內設定" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Active timeout:" -msgstr "活躍逾時:" +msgid "Active timeout" +msgstr "显示时间" #: ../../package/contents/ui/config/ConfigAppearance.qml msgctxt "Abbreviation for seconds" @@ -145,16 +150,14 @@ msgid "" "NOTE: After this timeout widget will be hidden in system tray until " "refreshed. You can always set the widget to be always \"Shown\" in system " "tray \"Entries\" settings." -msgstr "" -"注意:過了此逾時時間後,這個小工具將會隱藏至系統匣中,直到重新整理為止。您還" -"是可以在系統匣「項目」設定中將其設定為總是「顯示」。" +msgstr "注意:過了此逾時時間後,這個小工具將會隱藏至系統匣中,直到重新整理為止。您還是可以在系統匣「項目」設定中將其設定為總是「顯示」。" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font style:" +msgid "Widget font style" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml -msgid "Widget font size:" +msgid "Widget font size" msgstr "" #: ../../package/contents/ui/config/ConfigAppearance.qml @@ -163,101 +166,79 @@ msgid "px" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Open Weather Map Place" -msgstr "新增開放天氣地圖位置" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Paste URL here" -msgstr "在此貼上 URL" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "City alias" -msgstr "城市別稱" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Find your city ID by searching here:" -msgstr "在此搜尋以查詢您的城市 ID:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"...and paste here the whole URL\n" -"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." -msgstr "" -"...並在此貼上完整的 URL\n" -"範例:德國波昂為 http://openweathermap.org/city/2946447" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Error!" -msgstr "" +msgid "Location" +msgstr "位置" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Confirmation" +msgid "Area" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Do you want to select this place?" -msgstr "" +msgid "Latitude" +msgstr "緯度" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Add Met.no Map Place" -msgstr "添加 Met.no 地圖地點" +msgid "Longitude" +msgstr "長身材" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not valid." +msgid "Altitude" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Latitude is not between -90 and 90." -msgstr "" +#: ../../package/contents/ui/config/ConfigUnits.qml +msgid "Timezone" +msgstr "时区" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not valid." -msgstr "" +msgid "Plasmoid version" +msgstr "部件版本" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Longitude is not between -180 and 180." -msgstr "" +msgid "Source" +msgstr "來源" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not valid." -msgstr "" +msgid "Place Identifier" +msgstr "位置識別符" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Altitude is not between -999 and 5000." -msgstr "" +msgid "Displayed as" +msgstr "顯示為" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "The Place Name is empty." +msgid "Description" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "There is an error!" -msgid_plural "There are %1 errors!" -msgstr[0] "" -msgstr[1] "" +msgid "Miscellaneous" +msgstr "雜項" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Latitude" -msgstr "緯度" +msgid "Reload interval" +msgstr "载入间隔" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Longitude" -msgstr "長身材" +msgctxt "Abbreviation for minutes" +msgid "min" +msgstr "分鐘" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Altitude" +msgid "" +"Met.no weather forecast data provided by The Norwegian Meteorological " +"Institute." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "URL" +msgid "Sunrise/sunset data provided by Sunrise - Sunset." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Place Identifier" -msgstr "位置識別符" +msgid "OWM weather forecast data provided by OpenWeather." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search" +msgid "Weather icons created by Erik Flowers." msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml @@ -269,95 +250,80 @@ msgid "Enter place alias" msgstr "輸入位置別稱" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location Search" -msgstr "" +msgid "Add Open Weather Map Place" +msgstr "新增開放天氣地圖位置" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Location" -msgstr "位置" +msgid "Paste URL here" +msgstr "在此貼上 URL" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Area" -msgstr "" +msgid "City alias" +msgstr "城市別稱" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Timezone" -msgstr "" +msgid "Find your city ID by searching here" +msgstr "搜索这里找到你的城市ID" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Search data extracted from data provided by Geonames.org." +msgid "" +"...and paste here the whole URL\n" +"e.g. http://openweathermap.org/city/2946447 for Bonn, Germany." msgstr "" +"...並在此貼上完整的 URL\n" +"範例:德國波昂為 http://openweathermap.org/city/2946447" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Country:" -msgstr "" +msgid "Add Met.no Map Place" +msgstr "添加 Met.no 地圖地點" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Filter:" +msgid "Search" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Plasmoid version:" -msgstr "Plasmoid 版本:" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Source" -msgstr "來源" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Displayed as" -msgstr "顯示為" - -#: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Action" -msgstr "動作" +msgid "URL" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Miscellaneous" -msgstr "雜項" +msgid "Location Search" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Reload interval:" -msgstr "重新載入間隔:" +msgid "Alt" +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgctxt "Abbreviation for minutes" -msgid "min" -msgstr "分鐘" +msgid "Search data extracted from data provided by Geonames.org." +msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "" -"Met.no weather forecast data provided by The Norwegian Meteorological " -"Institute." +msgid "Country" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Sunrise/sunset data provided by Sunrise - Sunset." +msgid "Filter" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "OWM weather forecast data provided by OpenWeather." +msgid "Confirmation" msgstr "" #: ../../package/contents/ui/config/ConfigGeneral.qml -msgid "Weather icons created by Erik Flowers." +msgid "Do you want to select" msgstr "" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Temperature:" -msgstr "溫度:" - -#: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Pressure:" -msgstr "壓力:" +msgid "Temperature" +msgstr "温度" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Wind speed:" -msgstr "風速:" +msgid "Pressure" +msgstr "气压" #: ../../package/contents/ui/config/ConfigUnits.qml -msgid "Timezone:" -msgstr "時區:" +msgid "Wind speed" +msgstr "风速" #: ../../package/contents/ui/config/ConfigUnits.qml msgid "My local-time" @@ -365,6 +331,7 @@ msgstr "我的本地時間" #: ../../package/contents/ui/config/ConfigUnits.qml #: ../../package/contents/ui/FullRepresentation.qml +#: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "UTC" msgstr "UTC" @@ -372,29 +339,20 @@ msgstr "UTC" msgid "Location Timezone" msgstr "" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml msgid "Next Location" msgstr "下一個位置" -#: ../../package/contents/ui/FullRepresentationInTray.qml #: ../../package/contents/ui/FullRepresentation.qml -msgid "Reload" +msgid "Previous Location" msgstr "" #: ../../package/contents/ui/FullRepresentation.qml -msgid "Previous Location" +msgid "Reload" msgstr "" #: ../../package/contents/ui/main.qml -msgid "Resume Updating" -msgstr "繼續更新" - -#: ../../package/contents/ui/main.qml -msgid "Pause Updating" -msgstr "暫停更新" - -#: ../../package/contents/ui/main.qml +#, qt-format msgid "%1 ago" msgstr "%1 前" @@ -415,18 +373,54 @@ msgid "in" msgstr "" #: ../../package/contents/ui/providers/MetNo.qml +#: ../../package/contents/ui/providers/OpenWeatherMapJS.qml msgid "" "Weather forecast data provided by The Norwegian Meteorological Institute." msgstr "" -#: ../../package/contents/ui/providers/OpenWeatherMap.qml -msgid "today" -msgstr "今天" - #: ../../package/contents/ui/providers/OpenWeatherMap.qml msgid "Weather forecast data provided by OpenWeather." msgstr "" +#~ msgid "Layout type:" +#~ msgstr "佈局類型:" + +#~ msgid "Active timeout:" +#~ msgstr "活躍逾時:" + +#~ msgid "Find your city ID by searching here:" +#~ msgstr "在此搜尋以查詢您的城市 ID:" + +#~ msgid "Plasmoid version:" +#~ msgstr "Plasmoid 版本:" + +#~ msgid "Action" +#~ msgstr "動作" + +#~ msgid "Reload interval:" +#~ msgstr "重新載入間隔:" + +#~ msgid "Temperature:" +#~ msgstr "溫度:" + +#~ msgid "Pressure:" +#~ msgstr "壓力:" + +#~ msgid "Wind speed:" +#~ msgstr "風速:" + +#~ msgid "Timezone:" +#~ msgstr "時區:" + +#~ msgid "Resume Updating" +#~ msgstr "繼續更新" + +#~ msgid "Pause Updating" +#~ msgstr "暫停更新" + +#~ msgid "today" +#~ msgstr "今天" + #~ msgid "Offline mode" #~ msgstr "離線模式"