Merge v0.6.0 and v0.6.1 #29

Merged
dorian merged 30 commits from version/0.5.1 into master 2024-10-17 17:52:37 +02:00
20 changed files with 627 additions and 62 deletions
Showing only changes of commit 9ca38f8651 - Show all commits

View file

@ -36,8 +36,11 @@ HEADERS += \
RESOURCES += resources/qml/qml.qrc \ RESOURCES += resources/qml/qml.qrc \
resources/shared/shared.qrc \ resources/shared/shared.qrc \
#resources/shared/icons/bluerock/index.theme \ #resources/shared/icons/bluerock/index.theme \
#$$files(resources/shared/icons/*.png, true) \ #$$files(resources/shared/icons/*.png, true)
resources/translations/translations.qrc
TRANSLATIONS += resources/translations/en.ts \
resources/translations/de.ts
# Additional import path used to resolve QML modules in Qt Creator's code model # Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH = QML_IMPORT_PATH =

View file

@ -12,6 +12,7 @@
class AndroidShareUtils : public PlatformShareUtils, public QAndroidActivityResultReceiver class AndroidShareUtils : public PlatformShareUtils, public QAndroidActivityResultReceiver
{ {
Q_OBJECT
public: public:
AndroidShareUtils(QObject* parent = nullptr); AndroidShareUtils(QObject* parent = nullptr);
bool checkMimeTypeView(const QString &mimeType) override; bool checkMimeTypeView(const QString &mimeType) override;

View file

@ -24,7 +24,7 @@ Dialog {
modal: true modal: true
//% "Scan QR-Code" //% "Scan QR-Code"
title: qsTrId("scanQrCode") title: qsTrId("#scanQrCode")
standardButtons: Dialog.Cancel standardButtons: Dialog.Cancel
@ -38,7 +38,7 @@ Dialog {
function setDefaultStatusText() { function setDefaultStatusText() {
//% "Place the Code in the center" //% "Place the Code in the center"
_statusText = qsTrId("placeQrCodeInCenter") _statusText = qsTrId("#placeQrCodeInCenter")
_statusColor = Material.primaryTextColor _statusColor = Material.primaryTextColor
} }
@ -180,13 +180,13 @@ Dialog {
control._freezeScanning = true control._freezeScanning = true
//% "Plase wait" //% "Plase wait"
control._statusText = qsTrId("pleaseWait") + "..." control._statusText = qsTrId("#pleaseWait") + "..."
if(app.openWidgetFromUrl(tag)) if(app.openWidgetFromUrl(tag))
control.close() control.close()
else { else {
//% "Invalid QR-Code" //% "Invalid QR-Code"
control._statusText = qsTrId("invalidQrCode") control._statusText = qsTrId("#invalidQrCode")
control._statusColor = Material.color(Material.Red) control._statusColor = Material.color(Material.Red)
statusTextResetTimer.start() statusTextResetTimer.start()
control._freezeScanning = false control._freezeScanning = false

View file

@ -16,7 +16,8 @@ Dialog {
y: (parent.height - height) * 0.5 y: (parent.height - height) * 0.5
modal: true modal: true
title: "Share these results" //% "Share these results"
title: qsTrId("#shareResultsHeadline")
onClosed: { onClosed: {
shareComponentLoader.sourceComponent = null shareComponentLoader.sourceComponent = null
@ -40,12 +41,15 @@ Dialog {
Repeater { Repeater {
id: buttonRepeater id: buttonRepeater
property var buttons: [ property var buttons: [
["\uf0c1", "Link", serverConn.shareResultsAsUrl], //% "Link"
["\uf029", "QR-code", function() { ["\uf0c1", qsTrId("#shareByLink"), serverConn.shareResultsAsUrl],
//% "QR-Code"
["\uf029", qsTrId("#shareByQrCode"), function() {
stackLayout.currentIndex = 1 stackLayout.currentIndex = 1
} }
], ],
["\uf1c1", "Poster", serverConn.shareResultsAsPoster], //% "Poster"
["\uf1c1", qsTrId("#shareByPoster"), serverConn.shareResultsAsPoster],
] ]
model: buttons model: buttons

View file

@ -17,7 +17,7 @@ Rectangle {
function onPurchaseFailed() { function onPurchaseFailed() {
//% "Purchase failed" //% "Purchase failed"
purchaseBt.text = qsTrId("purchaseFailed") purchaseBt.text = qsTrId("#purchaseFailed")
purchaseBt.enabled = false purchaseBt.enabled = false
buttonTextResetTimer.start() buttonTextResetTimer.start()
} }
@ -31,9 +31,9 @@ Rectangle {
onTriggered: { onTriggered: {
purchaseBt.text = (speedFlowChartProduct.status === Product.Registered purchaseBt.text = (speedFlowChartProduct.status === Product.Registered
//% "Buy now for" //% "Buy now for"
? qsTrId("buyNowFor") + " " + speedFlowChartProduct.price ? qsTrId("#buyNowFor") + " " + speedFlowChartProduct.price
//% "This item is currently unavailable" //% "This item is currently unavailable"
: qsTrId("itemUnavailable")) : qsTrId("#itemIsUnavailable"))
purchaseBt.enabled = true purchaseBt.enabled = true
} }
} }
@ -57,7 +57,7 @@ Rectangle {
height: parent.height * 0.015 height: parent.height * 0.015
//% "This is a premium feature." //% "This is a premium feature."
text: qsTrId("thisIsAPremiumFeature") text: qsTrId("#thisIsAPremiumFeature")
font.bold: true font.bold: true
font.pixelSize: height font.pixelSize: height
@ -87,9 +87,8 @@ Rectangle {
Layout.alignment: Layout.Center Layout.alignment: Layout.Center
enabled: speedFlowChartProduct.status === Product.Registered enabled: speedFlowChartProduct.status === Product.Registered
text: speedFlowChartProduct.status === Product.Registered text: speedFlowChartProduct.status === Product.Registered
? "\uf218 "+ qsTrId("buyNowFor") +" " + speedFlowChartProduct.price ? "\uf218 "+ qsTrId("#buyNowFor") +" " + speedFlowChartProduct.price
//% "This item is currently unavailable" : qsTrId("#itemIsUnavailable")
: qsTrId("itemIsUnavailable")
font.family: fa5solid.name font.family: fa5solid.name
onClicked: speedFlowChartProduct.purchase() onClicked: speedFlowChartProduct.purchase()
} }
@ -105,7 +104,7 @@ Rectangle {
flat: true flat: true
//% "Restore purchase" //% "Restore purchase"
text: qsTrId("restorePurchase") text: qsTrId("#restorePurchase")
onClicked: inAppProductStore.restorePurchases() onClicked: inAppProductStore.restorePurchases()
} }
@ -116,7 +115,7 @@ Rectangle {
flat: true flat: true
//% "contact support" //% "contact support"
text: qsTrId("contact support") text: qsTrId("#contact support")
onClicked: Qt.openUrlExternally("mailto:contact@itsblue.de") onClicked: Qt.openUrlExternally("mailto:contact@itsblue.de")
} }

View file

@ -105,20 +105,19 @@ Page {
id: buttonRepeater id: buttonRepeater
property var buttons: [ property var buttons: [
//% "IFSC results" //% "IFSC results"
["\uf059", qsTrId("ifscResults"), ifscDisclaimerDialog.open], ["\uf059", qsTrId("#ifscResults"), ifscDisclaimerDialog.open],
[ [
"\uf042", "\uf042",
Material.theme === Material.Light ? Material.theme === Material.Light ?
//% "Dark mode" //% "Dark mode"
qsTrId("darkMode"): qsTrId("#darkMode"):
//% "Light mode" //% "Light mode"
qsTrId("lightMode"), qsTrId("#lightMode"),
app.toggleDarkMode app.toggleDarkMode
], ],
//% "About blueROCK" //% "About blueROCK"
["\uf05a", qsTrId("aboutBluerock"), aboutBluerockDisclaimerDialog.open], ["\uf05a", qsTrId("#aboutBluerock"), aboutBluerockDisclaimerDialog.open],
//% "Scan QR code" ["\uf029", qsTrId("#scanQrCode"), qrCodeScanPopup.open],
["\uf029", qsTrId("scanQrCode"), qrCodeScanPopup.open],
] ]
model: buttons model: buttons
@ -160,22 +159,18 @@ Page {
DisclaimerDialog { DisclaimerDialog {
id: ifscDisclaimerDialog id: ifscDisclaimerDialog
Material.theme: root.Material.theme Material.theme: root.Material.theme
title: "Where are the IFSC results?" //% "Where are the IFSC results?"
content: "Unfortunately, the IFSC has restricted the access to their data and <b>is not willing to share results with blueROCK anymore</b>. " + title: qsTrId("#ifscDisclaimerTitle")
"Because of this, blueROCK is no longer able to access and display IFSC results.<br><br>" + //% "Unfortunately, the IFSC has restricted the access to their data and <b>is not willing to share results with blueROCK anymore</b>. Because of this, blueROCK is no longer able to access and display IFSC results.<br><br>You can find current IFSC results <a href=\"https://ifsc.results.info\">over here</a> and on <a href=\"https://ifsc-climbing.org\">their website</a>."
"You can find current IFSC results <a href=\"https://ifsc.results.info\">over here</a> and on <a href=\"https://ifsc-climbing.org\">their website</a>." content: qsTrId("#ifscDisclaimer")
} }
DisclaimerDialog { DisclaimerDialog {
id: aboutBluerockDisclaimerDialog id: aboutBluerockDisclaimerDialog
Material.theme: root.Material.theme Material.theme: root.Material.theme
title: "blueROCK v" + APP_VERSION + "<br>By <a href=\"https://itsblue.de\">Itsblue Development</a>" title: "blueROCK v" + APP_VERSION + "<br>By <a href=\"https://itsblue.de\">Itsblue Development</a>"
content: "This app was built using the <a href='https://qt.io'>Qt Framework</a> " + //% "This app was built using the <a href='https://qt.io'>Qt Framework</a> licensed under the <a href='https://www.gnu.org/licenses/lgpl-3.0.en.html'>GNU lgplV3 license</a>.<br><br>This app is open source and licensed under the <a href='https://www.gnu.org/licenses/agpl-3.0.en.html'>GNU agplV3 license</a>, the source code can be found <a href='https://itsblue.dev/dorian/blueROCK/'>here</a>.<br><br>Resultservice and rankings provided by <a href='http://www.digitalROCK.de'>digital ROCK</a>."
"licensed under the <a href='https://www.gnu.org/licenses/lgpl-3.0.en.html'>GNU lgplV3 license</a>.<br><br>"+ content: qsTrId("#aboutBluerockDisclaimer")
"This app is open source and licensed under the <a href='https://www.gnu.org/licenses/agpl-3.0.en.html'>GNU agplV3 license</a>," +
"the source code can be found <a href='https://itsblue.dev/dorian/blueROCK/'>here</a>.<br><br>" +
"Resultservice and rankings provided by <a href='http://www.digitalROCK.de'>digital ROCK</a>."
} }
QrCodeScanPopup { QrCodeScanPopup {

View file

@ -29,7 +29,7 @@ DataListView {
property bool ready property bool ready
//% "calendar" //% "calendar"
property string title: (params.nation === "ICC" ? "IFSC":params.nation === "GER" ? "DAV":"SAC") + " " + qsTrId("calendar") + " " + control.year property string title: (params.nation === "ICC" ? "IFSC":params.nation === "GER" ? "DAV":"SAC") + " " + qsTrId("#calendar") + " " + control.year
property Component headerComponent: RowLayout { property Component headerComponent: RowLayout {
@ -65,14 +65,14 @@ DataListView {
} }
//% "Favorites" //% "Favorites"
compCats.push( {"text": qsTrId("favorites"), "data": {"sort_rank":0, "cat_id":[-1]}} ) compCats.push( {"text": qsTrId("#favorites"), "data": {"sort_rank":0, "cat_id":[-1]}} )
compCats.sort(function(a, b) { compCats.sort(function(a, b) {
return a['data']['sort_rank'] - b['data']['sort_rank']; return a['data']['sort_rank'] - b['data']['sort_rank'];
}); });
//% "Select filters" //% "Select filters"
filterSelectPu.appear(compCats, qsTrId("selectFilters"), "") filterSelectPu.appear(compCats, qsTrId("#selectFilters"), "")
} }
text: "\uf0b0" text: "\uf0b0"
@ -206,17 +206,17 @@ DataListView {
var infosheet = ""; var infosheet = "";
if(infoUrls.length >= 1) if(infoUrls.length >= 1)
//% "Infosheet" //% "Infosheet"
infosheet += ("<a href='" + getCompInfoUrls(compIndex)[0] + "'>" + qsTrId('infosheet') + "</a>") infosheet += ("<a href='" + getCompInfoUrls(compIndex)[0] + "'>" + qsTrId("#infosheet") + "</a>")
if(infoUrls.length === 2) if(infoUrls.length === 2)
//% "Further infos" //% "Further infos"
infosheet += (", <a href='" + getCompInfoUrls(compIndex)[1] + "'>" + qsTrId('furtherInfos') + "</a>") infosheet += (", <a href='" + getCompInfoUrls(compIndex)[1] + "'>" + qsTrId("#furtherInfos") + "</a>")
console.log("Infosheet: " + infosheet) console.log("Infosheet: " + infosheet)
var eventWebsite = control.widgetData["competitions"][compIndex]["homepage"] !== undefined ? var eventWebsite = control.widgetData["competitions"][compIndex]["homepage"] !== undefined ?
//% "Event website" //% "Event website"
("<a href='" + control.widgetData["competitions"][compIndex]["homepage"] + "'>" + qsTrId('eventWebsite') + "</a>"):"" ("<a href='" + control.widgetData["competitions"][compIndex]["homepage"] + "'>" + qsTrId("#eventWebsite") + "</a>"):""
selector.appear(selectOptions, control.widgetData["competitions"][compIndex]['name'], eventWebsite + ((eventWebsite !== "" && infosheet !== "") ? ", ":"") + infosheet ) selector.appear(selectOptions, control.widgetData["competitions"][compIndex]['name'], eventWebsite + ((eventWebsite !== "" && infosheet !== "") ? ", ":"") + infosheet )
} }
@ -233,7 +233,7 @@ DataListView {
} }
//% "Select year" //% "Select year"
selector.appear(selectOptions, qsTrId("selectYear")) selector.appear(selectOptions, qsTrId("#selectYear"))
} }
function openCup(state, data) { function openCup(state, data) {
@ -246,7 +246,7 @@ DataListView {
if(state === undefined){ if(state === undefined){
// opened for the first time -> select cup // opened for the first time -> select cup
//% "Select cup" //% "Select cup"
selectTitle = qsTrId("selectCup") selectTitle = qsTrId("#selectCup")
cups.sort(function(a, b) { cups.sort(function(a, b) {
return parseInt(b["SerId"]) - parseInt(a["SerId"]); return parseInt(b["SerId"]) - parseInt(a["SerId"]);
@ -275,7 +275,7 @@ DataListView {
} }
//% "Select category" //% "Select category"
selectTitle = cup['name'] + ": " + qsTrId("selectCategory") selectTitle = cup['name'] + ": " + qsTrId("#selectCategory")
// build a list with all cat in the cup out of the cat keys (rkey) given in the cup.cats // build a list with all cat in the cup out of the cat keys (rkey) given in the cup.cats
for(prop in cup['cats']){ for(prop in cup['cats']){

View file

@ -191,7 +191,7 @@ Page {
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
//% "Age" //% "Age"
text: qsTrId("age") + ": " + widgetData["age"] text: qsTrId("#age") + ": " + widgetData["age"]
} }
Label { Label {
@ -208,7 +208,7 @@ Page {
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
//% "Year of birth" //% "Year of birth"
text: qsTrId("yearOfBirth") + ": " + widgetData["birthdate"] text: qsTrId("#yearOfBirth") + ": " + widgetData["birthdate"]
} }
Label { Label {
@ -225,7 +225,7 @@ Page {
horizontalAlignment: Text.AlignHCenter horizontalAlignment: Text.AlignHCenter
//% "City" //% "City"
text: qsTrId("city") + ": " + widgetData["city"] text: qsTrId("#city") + ": " + widgetData["city"]
} }
} }
@ -268,9 +268,9 @@ Page {
text: bestResultsRep.showAllResults ? text: bestResultsRep.showAllResults ?
//% "Show best results" //% "Show best results"
qsTrId("showBestResults"): qsTrId("#showBestResults"):
//% "Show all results" //% "Show all results"
qsTrId("showAllResults") qsTrId("#showAllResults")
onClicked: { onClicked: {
bestResultsRep.showAllResults = !bestResultsRep.showAllResults bestResultsRep.showAllResults = !bestResultsRep.showAllResults

View file

@ -28,7 +28,7 @@ DataListView {
property string title: control.widgetData['comp_name'] property string title: control.widgetData['comp_name']
//% "(Ranking)" //% "(Ranking)"
property string subTitle: qsTrId("rankingHeadline") + " after " + control.widgetData['route_name'] property string subTitle: qsTrId("#rankingHeadline") + " after " + control.widgetData['route_name']
property bool titleIsPageTitle: true property bool titleIsPageTitle: true
property var widgetData: currentWidgetData property var widgetData: currentWidgetData

View file

@ -58,7 +58,7 @@ DataListView {
} }
//% "(Registration)" //% "(Registration)"
var addition = qsTrId("registrationHeadline") var addition = qsTrId("#registrationHeadline")
if(titleString !== undefined){ if(titleString !== undefined){
return addition + " " + titleString return addition + " " + titleString
@ -109,7 +109,7 @@ DataListView {
} }
} }
selector.appear(selectOptions, qsTrId("selectCategory")) selector.appear(selectOptions, qsTrId("#selectCategory"))
} }
function filterAthletes(athletes) { function filterAthletes(athletes) {

View file

@ -133,7 +133,7 @@ DataListView {
} }
} }
//% "(Results)" //% "(Results)"
var addition = qsTrId("resultsHeadline") var addition = qsTrId("#resultsHeadline")
if(titleString !== undefined){ if(titleString !== undefined){
return addition + " " + titleString return addition + " " + titleString
@ -166,7 +166,7 @@ DataListView {
} }
} }
selector.appear(selectOptions, qsTrId("selectCategory")) selector.appear(selectOptions, qsTrId("#selectCategory"))
} }
Connections { Connections {

View file

@ -53,7 +53,7 @@ DataListView {
} }
//% "(Startlist)" //% "(Startlist)"
var addition = qsTrId("startlistHeadline") var addition = qsTrId("#startlistHeadline")
return addition + " " + titleString return addition + " " + titleString
} }
@ -79,7 +79,7 @@ DataListView {
} }
} }
selector.appear(selectOptions, qsTrId("startlistHeadline")) selector.appear(selectOptions, qsTrId("#startlistHeadline"))
} }
Connections { Connections {

View file

@ -547,7 +547,8 @@ Window {
font.bold: true font.bold: true
color: "white" color: "white"
text: "loading..." //% "Loading"
text: qsTrId("#loading") + "..."
} }
} }
@ -661,28 +662,28 @@ Window {
case 0: case 0:
infoLevel = 2 infoLevel = 2
//% "No connection to server" //% "No connection to server"
errorString = qsTrId("noConnectionError") errorString = qsTrId("#noConnectionError")
break break
case 404: case 404:
infoLevel = 2 infoLevel = 2
//% "Not found" //% "Not found"
errorString = qsTrId("notFoundError") errorString = qsTrId("#notFoundError")
break break
case 901: case 901:
infoLevel = 1 infoLevel = 1
//% "No Data" //% "No Data"
errorString = qsTrId("noDataError") errorString = qsTrId("#noDataError")
break break
case 906: case 906:
infoLevel = 2 infoLevel = 2
//% "Invalid Request" //% "Invalid Request"
errorString = qsTrId("invalidRequestError") errorString = qsTrId("#invalidRequestError")
errorDescription = "Invalid Request" errorDescription = "Invalid Request"
break break
default: default:
infoLevel = 2 infoLevel = 2
//% "Unexpected error" //% "Unexpected error"
errorString = qsTrId("unexpectedError") + " ("+errorCode+")" errorString = qsTrId("#unexpectedError") + " ("+errorCode+")"
} }
return([infoLevel, errorString]) return([infoLevel, errorString])

Binary file not shown.

View file

@ -0,0 +1,274 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="de" sourcelanguage="en">
<context>
<name></name>
<message id="#scanQrCode">
<location filename="../qml/Components/QrCodeScanPopup.qml" line="27"/>
<source>Scan QR-Code</source>
<translation>QR-Code scannen</translation>
</message>
<message id="#placeQrCodeInCenter">
<location filename="../qml/Components/QrCodeScanPopup.qml" line="41"/>
<source>Place the Code in the center</source>
<translation>Positioniere den Code in der Mitte</translation>
</message>
<message id="#pleaseWait">
<location filename="../qml/Components/QrCodeScanPopup.qml" line="183"/>
<source>Plase wait</source>
<translation>Bitte warten</translation>
</message>
<message id="#invalidQrCode">
<location filename="../qml/Components/QrCodeScanPopup.qml" line="189"/>
<source>Invalid QR-Code</source>
<translation>Ungültiger QR-Code</translation>
</message>
<message id="#shareResultsHeadline">
<location filename="../qml/Components/SharePopup.qml" line="20"/>
<source>Share these results</source>
<translation>Teile diese Ergebnisse</translation>
</message>
<message id="#shareByLink">
<location filename="../qml/Components/SharePopup.qml" line="45"/>
<source>Link</source>
<translation>Link</translation>
</message>
<message id="#shareByQrCode">
<location filename="../qml/Components/SharePopup.qml" line="47"/>
<source>QR-Code</source>
<translation>QR-Code</translation>
</message>
<message id="#shareByPoster">
<location filename="../qml/Components/SharePopup.qml" line="52"/>
<source>Poster</source>
<translation>Poster</translation>
</message>
<message id="#purchaseFailed">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="20"/>
<source>Purchase failed</source>
<translation>Kauf fehlgeschlagen</translation>
</message>
<message id="#buyNowFor">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="34"/>
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="90"/>
<source>Buy now for</source>
<translation>Jetzt kaufen für</translation>
</message>
<message id="#itemUnavailable">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="36"/>
<source>This item is currently unavailable</source>
<translation>Diese Produkt ist nicht verfügbar</translation>
</message>
<message id="#thisIsAPremiumFeature">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="60"/>
<source>This is a premium feature.</source>
<translation>Das ist eine premium Funktion.</translation>
</message>
<message id="#itemIsUnavailable">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="92"/>
<source>This item is currently unavailable</source>
<translation>Diese Produkt ist nicht verfügbar</translation>
</message>
<message id="#restorePurchase">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="108"/>
<source>Restore purchase</source>
<translation>Kauf wiederherstellen</translation>
</message>
<message id="#contact support">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="119"/>
<source>contact support</source>
<translation>Support kontaktieren</translation>
</message>
<message id="#ifscResults">
<location filename="../qml/Pages/StartPage.qml" line="108"/>
<source>IFSC results</source>
<translation>IFSC Ergebnisse</translation>
</message>
<message id="#darkMode">
<location filename="../qml/Pages/StartPage.qml" line="113"/>
<source>Dark mode</source>
<translation>Dunkler Modus</translation>
</message>
<message id="#lightMode">
<location filename="../qml/Pages/StartPage.qml" line="115"/>
<source>Light mode</source>
<translation>Heller Modus</translation>
</message>
<message id="#aboutBluerock">
<location filename="../qml/Pages/StartPage.qml" line="119"/>
<source>About blueROCK</source>
<translation>Über blueROCK</translation>
</message>
<message id="#ifscDisclaimerTitle">
<location filename="../qml/Pages/StartPage.qml" line="164"/>
<source>Where are the IFSC results?</source>
<translation>Wo sind die IFSC Ergebnisse?</translation>
</message>
<message id="#ifscDisclaimer">
<location filename="../qml/Pages/StartPage.qml" line="166"/>
<source>Unfortunately, the IFSC has restricted the access to their data and &lt;b&gt;is not willing to share results with blueROCK anymore&lt;/b&gt;. Because of this, blueROCK is no longer able to access and display IFSC results.&lt;br&gt;&lt;br&gt;You can find current IFSC results &lt;a href=&quot;https://ifsc.results.info&quot;&gt;over here&lt;/a&gt; and on &lt;a href=&quot;https://ifsc-climbing.org&quot;&gt;their website&lt;/a&gt;.</source>
<translation>Leider hat die IFSC den Zugang zu ihren Ergebnissen eingeschränkt&lt;b&gt;und ist nicht mehr bereit, Ergebnisse mit blueROCK zu teilen&lt;/b&gt;. Daher ist blueROCK nicht länger in der Lage auf IFSC Ergebnisse zuzugriefen und diese anzuzeigen.&lt;br&gt;&lt;br&gt;Aktuelle IFSC Ergebnisse finden sich &lt;a href=&quot;https://ifsc.results.info&quot;&gt;hier&lt;/a&gt; und auf der &lt;a href=&quot;https://ifsc-climbing.org&quot;&gt;IFSC Webseite&lt;/a&gt;.</translation>
</message>
<message id="#aboutBluerockDisclaimer">
<location filename="../qml/Pages/StartPage.qml" line="174"/>
<source>This app was built using the &lt;a href=&apos;https://qt.io&apos;&gt;Qt Framework&lt;/a&gt; licensed under the &lt;a href=&apos;https://www.gnu.org/licenses/lgpl-3.0.en.html&apos;&gt;GNU lgplV3 license&lt;/a&gt;.&lt;br&gt;&lt;br&gt;This app is open source and licensed under the &lt;a href=&apos;https://www.gnu.org/licenses/agpl-3.0.en.html&apos;&gt;GNU agplV3 license&lt;/a&gt;, the source code can be found &lt;a href=&apos;https://itsblue.dev/dorian/blueROCK/&apos;&gt;here&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Resultservice and rankings provided by &lt;a href=&apos;http://www.digitalROCK.de&apos;&gt;digital ROCK&lt;/a&gt;.</source>
<translation type="unfinished">Diese App wurde unter Verwendung des &lt;a href=&apos;https://qt.io&apos;&gt;Qt Frameworks&lt;/a&gt; unter der &lt;a href=&apos;https://www.gnu.org/licenses/lgpl-3.0.en.html&apos;&gt;GNU lgplV3 Lizenz&lt;/a&gt; erstellt.&lt;br&gt;&lt;br&gt;Diese App ist Open-source und lizensiert unter der &lt;a href=&apos;https://www.gnu.org/licenses/agpl-3.0.en.html&apos;&gt;GNU agplV3 Lizenz&lt;/a&gt;. Der Sourcecode findet sich &lt;a href=&apos;https://itsblue.dev/dorian/blueROCK/&apos;&gt;hier&lt;/a&gt;.Die Ergebnisse und Ranglisten werden von &lt;a href=&apos;http://www.digitalROCK.de&apos;&gt;digital ROCK&lt;/a&gt; zur Verfügung gestellt.</translation>
</message>
<message id="#calendar">
<location filename="../qml/Widgets/CalendarWidget.qml" line="32"/>
<source>calendar</source>
<translation>Kalender</translation>
</message>
<message id="#favorites">
<location filename="../qml/Widgets/CalendarWidget.qml" line="68"/>
<source>Favorites</source>
<translation>Favoriten</translation>
</message>
<message id="#selectFilters">
<location filename="../qml/Widgets/CalendarWidget.qml" line="75"/>
<source>Select filters</source>
<translation>Filter auswählen</translation>
</message>
<message id="#infosheet">
<location filename="../qml/Widgets/CalendarWidget.qml" line="209"/>
<source>Infosheet</source>
<translation>Ausschreibung</translation>
</message>
<message id="#furtherInfos">
<location filename="../qml/Widgets/CalendarWidget.qml" line="212"/>
<source>Further infos</source>
<translation>Weitere Informationen</translation>
</message>
<message id="#eventWebsite">
<location filename="../qml/Widgets/CalendarWidget.qml" line="219"/>
<source>Event website</source>
<translation>Veranstaltungswebseite</translation>
</message>
<message id="#selectYear">
<location filename="../qml/Widgets/CalendarWidget.qml" line="236"/>
<source>Select year</source>
<translation>Jahr auswählen</translation>
</message>
<message id="#selectCup">
<location filename="../qml/Widgets/CalendarWidget.qml" line="249"/>
<source>Select cup</source>
<translation>Rangliste auswählen</translation>
</message>
<message id="#selectCategory">
<location filename="../qml/Widgets/CalendarWidget.qml" line="278"/>
<location filename="../qml/Widgets/RegistrationWidget.qml" line="112"/>
<location filename="../qml/Widgets/ResultWidget.qml" line="169"/>
<source>Select category</source>
<translation>Kategorie auswählen</translation>
</message>
<message id="#age">
<location filename="../qml/Widgets/ProfileWidget.qml" line="194"/>
<source>Age</source>
<translation>Alter</translation>
</message>
<message id="#yearOfBirth">
<location filename="../qml/Widgets/ProfileWidget.qml" line="211"/>
<source>Year of birth</source>
<translation>Geburtsjahr</translation>
</message>
<message id="#city">
<location filename="../qml/Widgets/ProfileWidget.qml" line="228"/>
<source>City</source>
<translation>Stadt</translation>
</message>
<message id="#showBestResults">
<location filename="../qml/Widgets/ProfileWidget.qml" line="271"/>
<source>Show best results</source>
<translation>Zeige die besten Ergebnisse</translation>
</message>
<message id="#showAllResults">
<location filename="../qml/Widgets/ProfileWidget.qml" line="273"/>
<source>Show all results</source>
<translation>Zeige alle Ergebnisse</translation>
</message>
<message id="#rankingHeadline">
<location filename="../qml/Widgets/RankingWidget.qml" line="31"/>
<source>(Ranking)</source>
<translation>(Rangliste)</translation>
</message>
<message id="#registrationHeadline">
<location filename="../qml/Widgets/RegistrationWidget.qml" line="61"/>
<source>(Registration)</source>
<translation>(Registrierung)</translation>
</message>
<message id="#resultsHeadline">
<location filename="../qml/Widgets/ResultWidget.qml" line="136"/>
<source>(Results)</source>
<translation>(Ergebnisse)</translation>
</message>
<message id="#startlistHeadline">
<location filename="../qml/Widgets/StartlistWidget.qml" line="56"/>
<location filename="../qml/Widgets/StartlistWidget.qml" line="82"/>
<source>(Startlist)</source>
<translation>(Startliste)</translation>
</message>
<message id="#loading">
<location filename="../qml/main.qml" line="551"/>
<source>Loading</source>
<translation>Laden</translation>
</message>
<message id="#noConnectionError">
<location filename="../qml/main.qml" line="665"/>
<source>No connection to server</source>
<translation>Keine Verbindung zum Server</translation>
</message>
<message id="#notFoundError">
<location filename="../qml/main.qml" line="670"/>
<source>Not found</source>
<translation>Nicht gefunden</translation>
</message>
<message id="#noDataError">
<location filename="../qml/main.qml" line="675"/>
<source>No Data</source>
<translation>Keine Daten</translation>
</message>
<message id="#invalidRequestError">
<location filename="../qml/main.qml" line="680"/>
<source>Invalid Request</source>
<translation>Ungültige Anfrage</translation>
</message>
<message id="#unexpectedError">
<location filename="../qml/main.qml" line="686"/>
<source>Unexpected error</source>
<translation>Unerwarteter Fehler</translation>
</message>
<message id="#shareResultsLinkText">
<location filename="../../sources/bluerockbackend.cpp" line="99"/>
<source>Check out the results of %1 over here:</source>
<translation>Verfolge die Ergebnisse vom Wettkampf &quot;%1&quot; hier live:</translation>
</message>
</context>
<context>
<name>AndroidShareUtils</name>
<message>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="191"/>
<source>Share: an Error occured</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="203"/>
<source>Share: an Error occured
WorkingDir not valid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="217"/>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="243"/>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="255"/>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="283"/>
<source>Empty URL received</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="235"/>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="273"/>
<source>File does not exist: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

Binary file not shown.

View file

@ -0,0 +1,271 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name></name>
<message id="#scanQrCode">
<location filename="../qml/Components/QrCodeScanPopup.qml" line="27"/>
<location filename="../qml/Pages/StartPage.qml" line="120"/>
<source>Scan QR-Code</source>
<translation type="unfinished"></translation>
</message>
<message id="#placeQrCodeInCenter">
<location filename="../qml/Components/QrCodeScanPopup.qml" line="41"/>
<source>Place the Code in the center</source>
<translation type="unfinished"></translation>
</message>
<message id="#pleaseWait">
<location filename="../qml/Components/QrCodeScanPopup.qml" line="183"/>
<source>Plase wait</source>
<translation type="unfinished"></translation>
</message>
<message id="#invalidQrCode">
<location filename="../qml/Components/QrCodeScanPopup.qml" line="189"/>
<source>Invalid QR-Code</source>
<translation type="unfinished"></translation>
</message>
<message id="#shareResultsHeadline">
<location filename="../qml/Components/SharePopup.qml" line="20"/>
<source>Share these results</source>
<translation type="unfinished"></translation>
</message>
<message id="#shareByLink">
<location filename="../qml/Components/SharePopup.qml" line="45"/>
<source>Link</source>
<translation type="unfinished"></translation>
</message>
<message id="#shareByQrCode">
<location filename="../qml/Components/SharePopup.qml" line="47"/>
<source>QR-Code</source>
<translation type="unfinished"></translation>
</message>
<message id="#shareByPoster">
<location filename="../qml/Components/SharePopup.qml" line="52"/>
<source>Poster</source>
<translation type="unfinished"></translation>
</message>
<message id="#purchaseFailed">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="20"/>
<source>Purchase failed</source>
<translation type="unfinished"></translation>
</message>
<message id="#buyNowFor">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="34"/>
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="90"/>
<source>Buy now for</source>
<translation type="unfinished"></translation>
</message>
<message id="#thisIsAPremiumFeature">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="60"/>
<source>This is a premium feature.</source>
<translation type="unfinished"></translation>
</message>
<message id="#itemIsUnavailable">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="36"/>
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="91"/>
<source>This item is currently unavailable</source>
<translation type="unfinished"></translation>
</message>
<message id="#restorePurchase">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="107"/>
<source>Restore purchase</source>
<translation type="unfinished"></translation>
</message>
<message id="#contact support">
<location filename="../qml/Components/SpeedFlowChartLocker.qml" line="118"/>
<source>contact support</source>
<translation type="unfinished"></translation>
</message>
<message id="#ifscResults">
<location filename="../qml/Pages/StartPage.qml" line="108"/>
<source>IFSC results</source>
<translation type="unfinished"></translation>
</message>
<message id="#darkMode">
<location filename="../qml/Pages/StartPage.qml" line="113"/>
<source>Dark mode</source>
<translation type="unfinished"></translation>
</message>
<message id="#lightMode">
<location filename="../qml/Pages/StartPage.qml" line="115"/>
<source>Light mode</source>
<translation type="unfinished"></translation>
</message>
<message id="#aboutBluerock">
<location filename="../qml/Pages/StartPage.qml" line="119"/>
<source>About blueROCK</source>
<translation type="unfinished"></translation>
</message>
<message id="#ifscDisclaimerTitle">
<location filename="../qml/Pages/StartPage.qml" line="163"/>
<source>Where are the IFSC results?</source>
<translation type="unfinished"></translation>
</message>
<message id="#ifscDisclaimer">
<location filename="../qml/Pages/StartPage.qml" line="165"/>
<source>Unfortunately, the IFSC has restricted the access to their data and &lt;b&gt;is not willing to share results with blueROCK anymore&lt;/b&gt;. Because of this, blueROCK is no longer able to access and display IFSC results.&lt;br&gt;&lt;br&gt;You can find current IFSC results &lt;a href=&quot;https://ifsc.results.info&quot;&gt;over here&lt;/a&gt; and on &lt;a href=&quot;https://ifsc-climbing.org&quot;&gt;their website&lt;/a&gt;.</source>
<translation type="unfinished"></translation>
</message>
<message id="#aboutBluerockDisclaimer">
<location filename="../qml/Pages/StartPage.qml" line="173"/>
<source>This app was built using the &lt;a href=&apos;https://qt.io&apos;&gt;Qt Framework&lt;/a&gt; licensed under the &lt;a href=&apos;https://www.gnu.org/licenses/lgpl-3.0.en.html&apos;&gt;GNU lgplV3 license&lt;/a&gt;.&lt;br&gt;&lt;br&gt;This app is open source and licensed under the &lt;a href=&apos;https://www.gnu.org/licenses/agpl-3.0.en.html&apos;&gt;GNU agplV3 license&lt;/a&gt;, the source code can be found &lt;a href=&apos;https://itsblue.dev/dorian/blueROCK/&apos;&gt;here&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Resultservice and rankings provided by &lt;a href=&apos;http://www.digitalROCK.de&apos;&gt;digital ROCK&lt;/a&gt;.</source>
<translation type="unfinished"></translation>
</message>
<message id="#calendar">
<location filename="../qml/Widgets/CalendarWidget.qml" line="32"/>
<source>calendar</source>
<translation type="unfinished"></translation>
</message>
<message id="#favorites">
<location filename="../qml/Widgets/CalendarWidget.qml" line="68"/>
<source>Favorites</source>
<translation type="unfinished"></translation>
</message>
<message id="#selectFilters">
<location filename="../qml/Widgets/CalendarWidget.qml" line="75"/>
<source>Select filters</source>
<translation type="unfinished"></translation>
</message>
<message id="#infosheet">
<location filename="../qml/Widgets/CalendarWidget.qml" line="209"/>
<source>Infosheet</source>
<translation type="unfinished"></translation>
</message>
<message id="#furtherInfos">
<location filename="../qml/Widgets/CalendarWidget.qml" line="212"/>
<source>Further infos</source>
<translation type="unfinished"></translation>
</message>
<message id="#eventWebsite">
<location filename="../qml/Widgets/CalendarWidget.qml" line="219"/>
<source>Event website</source>
<translation type="unfinished"></translation>
</message>
<message id="#selectYear">
<location filename="../qml/Widgets/CalendarWidget.qml" line="236"/>
<source>Select year</source>
<translation type="unfinished"></translation>
</message>
<message id="#selectCup">
<location filename="../qml/Widgets/CalendarWidget.qml" line="249"/>
<source>Select cup</source>
<translation type="unfinished"></translation>
</message>
<message id="#selectCategory">
<location filename="../qml/Widgets/CalendarWidget.qml" line="278"/>
<location filename="../qml/Widgets/RegistrationWidget.qml" line="112"/>
<location filename="../qml/Widgets/ResultWidget.qml" line="169"/>
<source>Select category</source>
<translation type="unfinished"></translation>
</message>
<message id="#age">
<location filename="../qml/Widgets/ProfileWidget.qml" line="194"/>
<source>Age</source>
<translation type="unfinished"></translation>
</message>
<message id="#yearOfBirth">
<location filename="../qml/Widgets/ProfileWidget.qml" line="211"/>
<source>Year of birth</source>
<translation type="unfinished"></translation>
</message>
<message id="#city">
<location filename="../qml/Widgets/ProfileWidget.qml" line="228"/>
<source>City</source>
<translation type="unfinished"></translation>
</message>
<message id="#showBestResults">
<location filename="../qml/Widgets/ProfileWidget.qml" line="271"/>
<source>Show best results</source>
<translation type="unfinished"></translation>
</message>
<message id="#showAllResults">
<location filename="../qml/Widgets/ProfileWidget.qml" line="273"/>
<source>Show all results</source>
<translation type="unfinished"></translation>
</message>
<message id="#rankingHeadline">
<location filename="../qml/Widgets/RankingWidget.qml" line="31"/>
<source>(Ranking)</source>
<translation type="unfinished"></translation>
</message>
<message id="#registrationHeadline">
<location filename="../qml/Widgets/RegistrationWidget.qml" line="61"/>
<source>(Registration)</source>
<translation type="unfinished"></translation>
</message>
<message id="#resultsHeadline">
<location filename="../qml/Widgets/ResultWidget.qml" line="136"/>
<source>(Results)</source>
<translation type="unfinished"></translation>
</message>
<message id="#startlistHeadline">
<location filename="../qml/Widgets/StartlistWidget.qml" line="56"/>
<location filename="../qml/Widgets/StartlistWidget.qml" line="82"/>
<source>(Startlist)</source>
<translation type="unfinished"></translation>
</message>
<message id="#loading">
<location filename="../qml/main.qml" line="551"/>
<source>Loading</source>
<translation type="unfinished"></translation>
</message>
<message id="#noConnectionError">
<location filename="../qml/main.qml" line="665"/>
<source>No connection to server</source>
<translation type="unfinished"></translation>
</message>
<message id="#notFoundError">
<location filename="../qml/main.qml" line="670"/>
<source>Not found</source>
<translation type="unfinished"></translation>
</message>
<message id="#noDataError">
<location filename="../qml/main.qml" line="675"/>
<source>No Data</source>
<translation type="unfinished"></translation>
</message>
<message id="#invalidRequestError">
<location filename="../qml/main.qml" line="680"/>
<source>Invalid Request</source>
<translation type="unfinished"></translation>
</message>
<message id="#unexpectedError">
<location filename="../qml/main.qml" line="686"/>
<source>Unexpected error</source>
<translation type="unfinished"></translation>
</message>
<message id="#shareResultsLinkText">
<location filename="../../sources/bluerockbackend.cpp" line="99"/>
<source>Check out the results of %1 over here:</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>AndroidShareUtils</name>
<message>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="191"/>
<source>Share: an Error occured</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="203"/>
<source>Share: an Error occured
WorkingDir not valid</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="217"/>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="243"/>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="255"/>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="283"/>
<source>Empty URL received</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="235"/>
<location filename="../../sources/shareUtils/androidshareutils.cpp" line="273"/>
<source>File does not exist: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View file

@ -0,0 +1,6 @@
<RCC>
<qresource prefix="/">
<file>de.qm</file>
<file>en.qm</file>
</qresource>
</RCC>

View file

@ -95,7 +95,8 @@ QVariantMap BlueRockBackend::getParamsFromUrl(QString stringUrl) {
} }
void BlueRockBackend::shareResultsAsUrl(QString url, QString compName) { void BlueRockBackend::shareResultsAsUrl(QString url, QString compName) {
this->_shareUtils->shareText("Check out the results of " + compName + " over here:\n" + url); //% "Check out the results of %1 over here:"
this->_shareUtils->shareText(qtTrId("#shareResultsLinkText").arg(compName) + "\n" + url);
} }
void BlueRockBackend::shareResultsAsPoster(QString url, QString compName) { void BlueRockBackend::shareResultsAsPoster(QString url, QString compName) {

View file

@ -34,6 +34,16 @@ int main(int argc, char *argv[])
QGuiApplication app(argc, argv); QGuiApplication app(argc, argv);
// translation
QString localeName = QLocale::system().bcp47Name();
QTranslator* translator = new QTranslator(qApp);
// fallback to en!
if(!translator->load(":/" + localeName + ".qm"))
translator->load(":/en.qm");
QGuiApplication::installTranslator(translator);
QQuickStyle::setStyle("Material"); QQuickStyle::setStyle("Material");
qmlRegisterType<BlueRockBackend>("de.itsblue.blueROCK", 1, 0, "BlueRockBackend"); qmlRegisterType<BlueRockBackend>("de.itsblue.blueROCK", 1, 0, "BlueRockBackend");