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/shared/shared.qrc \
#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
QML_IMPORT_PATH =

View file

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

View file

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

View file

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

View file

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

View file

@ -105,20 +105,19 @@ Page {
id: buttonRepeater
property var buttons: [
//% "IFSC results"
["\uf059", qsTrId("ifscResults"), ifscDisclaimerDialog.open],
["\uf059", qsTrId("#ifscResults"), ifscDisclaimerDialog.open],
[
"\uf042",
Material.theme === Material.Light ?
//% "Dark mode"
qsTrId("darkMode"):
qsTrId("#darkMode"):
//% "Light mode"
qsTrId("lightMode"),
qsTrId("#lightMode"),
app.toggleDarkMode
],
//% "About blueROCK"
["\uf05a", qsTrId("aboutBluerock"), aboutBluerockDisclaimerDialog.open],
//% "Scan QR code"
["\uf029", qsTrId("scanQrCode"), qrCodeScanPopup.open],
["\uf05a", qsTrId("#aboutBluerock"), aboutBluerockDisclaimerDialog.open],
["\uf029", qsTrId("#scanQrCode"), qrCodeScanPopup.open],
]
model: buttons
@ -160,22 +159,18 @@ Page {
DisclaimerDialog {
id: ifscDisclaimerDialog
Material.theme: root.Material.theme
title: "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>. " +
"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>."
//% "Where are the IFSC results?"
title: qsTrId("#ifscDisclaimerTitle")
//% "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>."
content: qsTrId("#ifscDisclaimer")
}
DisclaimerDialog {
id: aboutBluerockDisclaimerDialog
Material.theme: root.Material.theme
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> " +
"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>."
//% "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>."
content: qsTrId("#aboutBluerockDisclaimer")
}
QrCodeScanPopup {

View file

@ -29,7 +29,7 @@ DataListView {
property bool ready
//% "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 {
@ -65,14 +65,14 @@ DataListView {
}
//% "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) {
return a['data']['sort_rank'] - b['data']['sort_rank'];
});
//% "Select filters"
filterSelectPu.appear(compCats, qsTrId("selectFilters"), "")
filterSelectPu.appear(compCats, qsTrId("#selectFilters"), "")
}
text: "\uf0b0"
@ -206,17 +206,17 @@ DataListView {
var infosheet = "";
if(infoUrls.length >= 1)
//% "Infosheet"
infosheet += ("<a href='" + getCompInfoUrls(compIndex)[0] + "'>" + qsTrId('infosheet') + "</a>")
infosheet += ("<a href='" + getCompInfoUrls(compIndex)[0] + "'>" + qsTrId("#infosheet") + "</a>")
if(infoUrls.length === 2)
//% "Further infos"
infosheet += (", <a href='" + getCompInfoUrls(compIndex)[1] + "'>" + qsTrId('furtherInfos') + "</a>")
infosheet += (", <a href='" + getCompInfoUrls(compIndex)[1] + "'>" + qsTrId("#furtherInfos") + "</a>")
console.log("Infosheet: " + infosheet)
var eventWebsite = control.widgetData["competitions"][compIndex]["homepage"] !== undefined ?
//% "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 )
}
@ -233,7 +233,7 @@ DataListView {
}
//% "Select year"
selector.appear(selectOptions, qsTrId("selectYear"))
selector.appear(selectOptions, qsTrId("#selectYear"))
}
function openCup(state, data) {
@ -246,7 +246,7 @@ DataListView {
if(state === undefined){
// opened for the first time -> select cup
//% "Select cup"
selectTitle = qsTrId("selectCup")
selectTitle = qsTrId("#selectCup")
cups.sort(function(a, b) {
return parseInt(b["SerId"]) - parseInt(a["SerId"]);
@ -275,7 +275,7 @@ DataListView {
}
//% "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
for(prop in cup['cats']){

View file

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

View file

@ -28,7 +28,7 @@ DataListView {
property string title: control.widgetData['comp_name']
//% "(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 var widgetData: currentWidgetData

View file

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

View file

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

View file

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

View file

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

View file

@ -34,6 +34,16 @@ int main(int argc, char *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");
qmlRegisterType<BlueRockBackend>("de.itsblue.blueROCK", 1, 0, "BlueRockBackend");