This commit is contained in:
silas 2018-11-01 13:44:20 +01:00
parent 1bac3c5b55
commit 84913c2bb1
9 changed files with 204 additions and 137 deletions

View File

@ -1 +1 @@
<div class="max-height fill-me"><div class="row max-width grow flex-center"><div class="columns small-centered small-12 smedium-11 medium-9 large-7"><div class="row setting-row hidden" id=install-button><span class="columns small-6" data-translation=install></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class="row setting-row" id=theme-chooser><span class="columns small-6" data-translation=theme></span> <span class="columns small-6 text-right"><div id=theme-name></div></span></div><label class="switch row setting-row"><span class="columns small-6" data-translation=sound></span> <span class="columns small-6 text-right"><input type=checkbox class=setting id=play-sound name=play-sound value=1 data-default=1> <span class=slider></span></span></label> <label class="switch row setting-row"><span class="columns small-6" data-translation=music></span> <span class="columns small-6 text-right"><input type=checkbox class=setting id=play-music name=play-music value=1 data-default=1> <span class=slider></span></span></label><div class="row setting-row" id=credits-button><span class="columns small-6" data-translation=credits></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class="row setting-row" id=privacy-policy-button><span class="columns small-6" data-translation=privacy-policy></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class="row setting-row" id=impressum-button><span class="columns small-6" data-translation=impressum></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class="row setting-row" id=contact-button><span class="columns small-6" data-translation=contact></span> <span class="columns small-6 text-right" data-translation=">"></span></div><label class="switch row setting-row"><span class="columns small-6" data-translation=track></span> <span class="columns small-6 text-right"><input type=checkbox class=setting id=track-switch name=matomoShouldTrack value=1 data-default=1 data-raw=1> <span class=slider></span></span></label><div class="row setting-row hidden"><span class="column small-12" id=storage-info></span></div><button id=reset-levels class="button hidden" data-translation=reset-levels></button></div></div></div>
<div class="max-height fill-me"><div class="row max-width grow flex-center"><div class="columns small-centered small-12 smedium-11 medium-9 large-7"><div class="row setting-row hidden" id=install-button><span class="columns small-6" data-translation=install></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class="row setting-row" id=theme-chooser><span class="columns small-6" data-translation=theme></span> <span class="columns small-6 text-right"><div id=theme-name></div></span></div><label class="switch row setting-row"><span class="columns small-6" data-translation=sound></span> <span class="columns small-6 text-right"><input type=checkbox class=setting id=play-sound name=play-sound value=1 data-default=1> <span class=slider></span></span></label> <label class="switch row setting-row"><span class="columns small-6" data-translation=music></span> <span class="columns small-6 text-right"><input type=checkbox class=setting id=play-music name=play-music value=1 data-default=1> <span class=slider></span></span></label><div class="row setting-row" id=credits-button><span class="columns small-6" data-translation=credits></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class="row setting-row" id=privacy-policy-button><span class="columns small-6" data-translation=privacy-policy></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class="row setting-row" id=impressum-button><span class="columns small-6" data-translation=impressum></span> <span class="columns small-6 text-right" data-translation=">"></span></div><div class="row setting-row" id=contact-button><span class="columns small-6" data-translation=contact></span> <span class="columns small-6 text-right" data-translation=">"></span></div><label class="switch row setting-row"><span class="columns small-6" data-translation=track></span> <span class="columns small-6 text-right"><input type=checkbox class=setting id=track-switch name=matomoShouldTrack value=1 data-default=1 data-raw=1> <span class=slider></span></span></label><div class="row setting-row hidden"><span class="column small-10" id=storage-info></span> <span class="columns small-6 text-right" data-translation=">"></span></div><button id=reset-levels class="button hidden" data-translation=reset-levels></button></div></div></div>

View File

@ -2682,6 +2682,28 @@ class Dialog {
}
}
class ConfirmDialog extends Dialog {
constructor(content, title) {
super(content, title);
}
async show() {
this.addButton("confirm-button", true);
this.addButton("cancel-button", false);
return super.show();
}
close() {
if (Helper.isNull(this.result))
{
this.result = false;
}
return super.close();
}
}
class FlashMessenger {
static deleteMessage(_idNumber, _delayInMilliSeconds) {
_delayInMilliSeconds = Helper.nonNull(_delayInMilliSeconds, 0);
@ -7254,6 +7276,12 @@ InitPromise.addPromise(app => {
app.addDeepLink("impressum", ImpressumSite);
});
class PersistDialog extends ConfirmDialog{
constructor() {
super("persist-storage-dialog-message", "persist-storage-dialog-title");
}
}
class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
constructor(site) {
super(site, "html/application/fragment/settings.html");
@ -7328,39 +7356,53 @@ class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
installButton.classList.remove("hidden");
});
// let storageManager = MyStorageManager.getInstance();
// if (storageManager.canEstimateStorage()) {
// console.log("can estimate storage!");
// Promise.all([storageManager.estimate(), storageManager.isPersistent()]).then(res => {
// let storage = res[0];
// let isPersisted = res[1];
// let storageObject = this.findBy("#storage-info");
// console.log(isPersisted);
// storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [
// Math.round(storage.usage / (1024 * 1024) * 100) / 100,
// Math.round(storage.quota / (1024 * 1024) * 100) / 100,
// Math.round(storage.usage / storage.quota * 10000) / 100,
// ((isPersisted) ? "" : "nicht")]));
// storageObject.parentElement.classList.remove("hidden");
// storageObject.parentElement.addEventListener("click", () => {
// storageManager.persist().then(isPersisted => {
// storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [
// Math.round(storage.usage / (1024 * 1024) * 100) / 100,
// Math.round(storage.quota / (1024 * 1024) * 100) / 100,
// Math.round(storage.usage / storage.quota * 10000) / 100,
// ((isPersisted) ? "" : "nicht")]));
//
// console.log("p", isPersisted);
// if (!isPersisted){
// FlashMessenger.addMessage("storage-permission-not-get");
// }
// else {
// FlashMessenger.addMessage("storage-permission-get");
// }
// });
// })
// });
// }
let storageManager = MyStorageManager.getInstance();
if (storageManager.canPersist()) {
Promise.all([storageManager.isPersistent(), navigator.serviceWorker["ready"]]).then(res => {
let isPersisted = res[0];
let storageObject = this.findBy("#storage-info");
storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [
((isPersisted) ? "" : "nicht")]));
storageObject.parentElement.classList.remove("hidden");
storageObject.parentElement.addEventListener("click", async () => {
if (!isPersisted) {
try {
let shouldAskForNotifications = await (new PersistDialog().show());
if (shouldAskForNotifications) {
let sub = await res[1]["pushManager"]["subscribe"]({
"userVisibleOnly": true,
"applicationServerKey": new Uint8Array([0x4, 0x53, 0xb7, 0x8d, 0xc6, 0xd1, 0x1a, 0xd4, 0x8b, 0xb2, 0xeb, 0x82, 0xf0, 0x9e, 0x12, 0xf6, 0xd, 0x32, 0x18, 0xa, 0x35, 0xf, 0x2d, 0x4c, 0x5, 0x29, 0x15, 0x95, 0x23, 0xb1, 0xd3, 0xab, 0x87, 0x88, 0x85, 0x1d, 0xc0, 0x98, 0x6e, 0x65, 0xe3, 0xcb, 0xa2, 0x28, 0x63, 0x7, 0x34, 0x9b, 0xfa, 0x46, 0x9a, 0x49, 0xcc, 0x70, 0x7a, 0xdd, 0xbe, 0x1e, 0xfc, 0xde, 0xcc, 0xb3, 0x5b, 0xcb, 0xf4])
});
}
} catch (e) {
if ('Notification' in window && Notification.permission === 'denied') {
FlashMessenger.addMessage('notification-permission-denied');
}
}
isPersisted = await storageManager.isPersistent();
storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [
((isPersisted) ? "" : "nicht")]));
}
// storageManager.persist().then(isPersisted => {
// storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [
// Math.round(storage.usage / (1024 * 1024) * 100) / 100,
// Math.round(storage.quota / (1024 * 1024) * 100) / 100,
// Math.round(storage.usage / storage.quota * 10000) / 100,
// ((isPersisted) ? "" : "nicht")]));
//
// console.log("p", isPersisted);
// if (!isPersisted){
// FlashMessenger.addMessage("storage-permission-not-get");
// }
// else {
// FlashMessenger.addMessage("storage-permission-get");
// }
// });
});
});
}
return super.onFirstStart();
}
@ -7569,24 +7611,23 @@ InitPromise.resolve(app$1).then(async function () {
MyStorageManager.getInstance().persist();
}
window["applyAndroidBridge"] = AndroidBridge.applyDefinitions;
});
console.log("trying push... 1");
navigator.serviceWorker["ready"].then(function (registration) {
console.log("trying push... 2");
registration["pushManager"]["subscribe"]({
"userVisibleOnly": false,
"applicationServerKey": new Uint8Array([0x4, 0x53, 0xb7, 0x8d, 0xc6, 0xd1, 0x1a, 0xd4, 0x8b, 0xb2, 0xeb, 0x82, 0xf0, 0x9e, 0x12, 0xf6, 0xd, 0x32, 0x18, 0xa, 0x35, 0xf, 0x2d, 0x4c, 0x5, 0x29, 0x15, 0x95, 0x23, 0xb1, 0xd3, 0xab, 0x87, 0x88, 0x85, 0x1d, 0xc0, 0x98, 0x6e, 0x65, 0xe3, 0xcb, 0xa2, 0x28, 0x63, 0x7, 0x34, 0x9b, 0xfa, 0x46, 0x9a, 0x49, 0xcc, 0x70, 0x7a, 0xdd, 0xbe, 0x1e, 0xfc, 0xde, 0xcc, 0xb3, 0x5b, 0xcb, 0xf4])
}).then(function (sub) {
console.log("trying push... 3");
console.log("Subscription", sub);
}).catch(function (e) {
// if ('Notification' in window && Notification.permission === 'denied') {
// console.warn('Permission for notifications was denied');
// } else {
// console.error('Unable to subscribe to push', e);
// }
});
});
// console.log("trying push... 1");
// navigator.serviceWorker["ready"].then(function (registration) {
// console.log("trying push... 2");
// registration["pushManager"]["subscribe"]({
// "userVisibleOnly": true,
// "applicationServerKey": new Uint8Array([0x4, 0x53, 0xb7, 0x8d, 0xc6, 0xd1, 0x1a, 0xd4, 0x8b, 0xb2, 0xeb, 0x82, 0xf0, 0x9e, 0x12, 0xf6, 0xd, 0x32, 0x18, 0xa, 0x35, 0xf, 0x2d, 0x4c, 0x5, 0x29, 0x15, 0x95, 0x23, 0xb1, 0xd3, 0xab, 0x87, 0x88, 0x85, 0x1d, 0xc0, 0x98, 0x6e, 0x65, 0xe3, 0xcb, 0xa2, 0x28, 0x63, 0x7, 0x34, 0x9b, 0xfa, 0x46, 0x9a, 0x49, 0xcc, 0x70, 0x7a, 0xdd, 0xbe, 0x1e, 0xfc, 0xde, 0xcc, 0xb3, 0x5b, 0xcb, 0xf4])
// }).then(function (sub) {
// console.log("trying push... 3");
// console.log("Subscription", sub);
// }).catch(function (e) {
// // if ('Notification' in window && Notification.permission === 'denied') {
// // console.warn('Permission for notifications was denied');
// // } else {
// // console.error('Unable to subscribe to push', e);
// // }
// });
// });

File diff suppressed because one or more lines are too long

View File

@ -91,24 +91,23 @@ InitPromise.resolve(app).then(async function () {
MyStorageManager.getInstance().persist();
}
window["applyAndroidBridge"] = AndroidBridge.applyDefinitions;
});
console.log("trying push... 1");
navigator.serviceWorker["ready"].then(function (registration) {
console.log("trying push... 2");
registration["pushManager"]["subscribe"]({
"userVisibleOnly": true,
"applicationServerKey": new Uint8Array([0x4, 0x53, 0xb7, 0x8d, 0xc6, 0xd1, 0x1a, 0xd4, 0x8b, 0xb2, 0xeb, 0x82, 0xf0, 0x9e, 0x12, 0xf6, 0xd, 0x32, 0x18, 0xa, 0x35, 0xf, 0x2d, 0x4c, 0x5, 0x29, 0x15, 0x95, 0x23, 0xb1, 0xd3, 0xab, 0x87, 0x88, 0x85, 0x1d, 0xc0, 0x98, 0x6e, 0x65, 0xe3, 0xcb, 0xa2, 0x28, 0x63, 0x7, 0x34, 0x9b, 0xfa, 0x46, 0x9a, 0x49, 0xcc, 0x70, 0x7a, 0xdd, 0xbe, 0x1e, 0xfc, 0xde, 0xcc, 0xb3, 0x5b, 0xcb, 0xf4])
}).then(function (sub) {
console.log("trying push... 3");
console.log("Subscription", sub);
}).catch(function (e) {
// if ('Notification' in window && Notification.permission === 'denied') {
// console.warn('Permission for notifications was denied');
// } else {
// console.error('Unable to subscribe to push', e);
// }
});
});
// console.log("trying push... 1");
// navigator.serviceWorker["ready"].then(function (registration) {
// console.log("trying push... 2");
// registration["pushManager"]["subscribe"]({
// "userVisibleOnly": true,
// "applicationServerKey": new Uint8Array([0x4, 0x53, 0xb7, 0x8d, 0xc6, 0xd1, 0x1a, 0xd4, 0x8b, 0xb2, 0xeb, 0x82, 0xf0, 0x9e, 0x12, 0xf6, 0xd, 0x32, 0x18, 0xa, 0x35, 0xf, 0x2d, 0x4c, 0x5, 0x29, 0x15, 0x95, 0x23, 0xb1, 0xd3, 0xab, 0x87, 0x88, 0x85, 0x1d, 0xc0, 0x98, 0x6e, 0x65, 0xe3, 0xcb, 0xa2, 0x28, 0x63, 0x7, 0x34, 0x9b, 0xfa, 0x46, 0x9a, 0x49, 0xcc, 0x70, 0x7a, 0xdd, 0xbe, 0x1e, 0xfc, 0xde, 0xcc, 0xb3, 0x5b, 0xcb, 0xf4])
// }).then(function (sub) {
// console.log("trying push... 3");
// console.log("Subscription", sub);
// }).catch(function (e) {
// // if ('Notification' in window && Notification.permission === 'denied') {
// // console.warn('Permission for notifications was denied');
// // } else {
// // console.error('Unable to subscribe to push', e);
// // }
// });
// });

View File

@ -7,6 +7,7 @@ import {PrivacyPolicySite} from "../site/PrivacyPolicySite";
import {ChooseThemeDialog} from "../dialog/ChooseThemeDialog";
import {ContactSite} from "../../../../../js/lib/pwa-contact";
import {ImpressumSite} from "../site/ImpressumSite";
import {PersistDialog} from "../dialog/PersistDialog";
export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
constructor(site) {
@ -82,39 +83,56 @@ export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
installButton.classList.remove("hidden");
});
// let storageManager = MyStorageManager.getInstance();
// if (storageManager.canEstimateStorage()) {
// console.log("can estimate storage!");
// Promise.all([storageManager.estimate(), storageManager.isPersistent()]).then(res => {
// let storage = res[0];
// let isPersisted = res[1];
// let storageObject = this.findBy("#storage-info");
// console.log(isPersisted);
// storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [
// Math.round(storage.usage / (1024 * 1024) * 100) / 100,
// Math.round(storage.quota / (1024 * 1024) * 100) / 100,
// Math.round(storage.usage / storage.quota * 10000) / 100,
// ((isPersisted) ? "" : "nicht")]));
// storageObject.parentElement.classList.remove("hidden");
// storageObject.parentElement.addEventListener("click", () => {
// storageManager.persist().then(isPersisted => {
// storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [
// Math.round(storage.usage / (1024 * 1024) * 100) / 100,
// Math.round(storage.quota / (1024 * 1024) * 100) / 100,
// Math.round(storage.usage / storage.quota * 10000) / 100,
// ((isPersisted) ? "" : "nicht")]));
//
// console.log("p", isPersisted);
// if (!isPersisted){
// FlashMessenger.addMessage("storage-permission-not-get");
// }
// else {
// FlashMessenger.addMessage("storage-permission-get");
// }
// });
// })
// });
// }
let storageManager = MyStorageManager.getInstance();
if (storageManager.canPersist()) {
Promise.all([storageManager.isPersistent(), navigator.serviceWorker["ready"]]).then(res => {
let isPersisted = res[0];
let storageObject = this.findBy("#storage-info");
storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [
((isPersisted) ? "" : "nicht")]));
storageObject.parentElement.classList.remove("hidden");
storageObject.parentElement.addEventListener("click", async () => {
if (!isPersisted) {
try {
let shouldAskForNotifications = await (new PersistDialog().show());
if (shouldAskForNotifications) {
let sub = await res[1]["pushManager"]["subscribe"]({
"userVisibleOnly": true,
"applicationServerKey": new Uint8Array([0x4, 0x53, 0xb7, 0x8d, 0xc6, 0xd1, 0x1a, 0xd4, 0x8b, 0xb2, 0xeb, 0x82, 0xf0, 0x9e, 0x12, 0xf6, 0xd, 0x32, 0x18, 0xa, 0x35, 0xf, 0x2d, 0x4c, 0x5, 0x29, 0x15, 0x95, 0x23, 0xb1, 0xd3, 0xab, 0x87, 0x88, 0x85, 0x1d, 0xc0, 0x98, 0x6e, 0x65, 0xe3, 0xcb, 0xa2, 0x28, 0x63, 0x7, 0x34, 0x9b, 0xfa, 0x46, 0x9a, 0x49, 0xcc, 0x70, 0x7a, 0xdd, 0xbe, 0x1e, 0xfc, 0xde, 0xcc, 0xb3, 0x5b, 0xcb, 0xf4])
});
}
} catch (e) {
if ('Notification' in window && Notification.permission === 'denied') {
FlashMessenger.addMessage('notification-permission-denied');
}
}
isPersisted = await storageManager.isPersistent();
storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [
((isPersisted) ? "" : "nicht")]));
}
else {
new Dialog("already-persited-dialog-message", "already-persited-dialog-title").show();
}
// storageManager.persist().then(isPersisted => {
// storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [
// Math.round(storage.usage / (1024 * 1024) * 100) / 100,
// Math.round(storage.quota / (1024 * 1024) * 100) / 100,
// Math.round(storage.usage / storage.quota * 10000) / 100,
// ((isPersisted) ? "" : "nicht")]));
//
// console.log("p", isPersisted);
// if (!isPersisted){
// FlashMessenger.addMessage("storage-permission-not-get");
// }
// else {
// FlashMessenger.addMessage("storage-permission-get");
// }
// });
})
});
}
return super.onFirstStart();
}

View File

@ -0,0 +1,7 @@
import {ConfirmDialog, Dialog, Helper, ThemeManager, Translator, ViewInflater} from "../../../../../js/lib/pwa-lib";
export class PersistDialog extends ConfirmDialog{
constructor() {
super("persist-storage-dialog-message", "persist-storage-dialog-title");
}
}

View File

@ -0,0 +1,3 @@
<article>
<section id = 'persistance-info-message'></section>
</article>

View File

@ -52,8 +52,8 @@
</span>
</label>
<div class='row setting-row hidden' >
<span class = "column small-12" id='storage-info'></span>
<!--<span class='columns small-2 text-right' data-translation=">"></span>-->
<span class = "column small-10" id='storage-info'></span>
<span class='columns small-6 text-right' data-translation=">"></span>
</div>
<!--<iframe-->

View File

@ -1,38 +1,37 @@
{
"won":"Gewonnen!",
"continue":"Weiter",
"won": "Gewonnen!",
"continue": "Weiter",
"help": "?",
"not-enough-coins":"Du hast zu wenig Münzen!",
"sync-error":"Es gab einen Fehler beim Aktualisieren der Level. Bitte stelle sicher, dass du eine aktive Internetverbindung hast und versuche es später erneut.",
"game-ended":"<b>Oh nein!</b> <br/>Es sieht so aus, als ob du schon alle Level gespielt hast... <br/>Schau später noch einmal rein, evtl gibt es dann neue Level.",
"play":"Spielen!",
"not-enough-coins": "Du hast zu wenig Münzen!",
"sync-error": "Es gab einen Fehler beim Aktualisieren der Level. Bitte stelle sicher, dass du eine aktive Internetverbindung hast und versuche es später erneut.",
"game-ended": "<b>Oh nein!</b> <br/>Es sieht so aus, als ob du schon alle Level gespielt hast... <br/>Schau später noch einmal rein, evtl gibt es dann neue Level.",
"play": "Spielen!",
"tutorial-step-1": "Klicke auf ein Feld, um dieses rotieren zu lassen!",
"tutorial-step-2": "Um zu gewinnen, drehe die Segmente so, dass du zwei Wörter lesen kannst.",
"tutorial-step-3": "Die Hilfe löst ein Segment, kostet aber 25 Münzen. Probiere jetzt die Hilfe aus.",
"tutorial-step-4": "Große Segmente drehst du, indem du diese ziehst.",
"extra-coins-after-first-level":"Für das erste Level gibt es 50 extra Münzen!",
"dark":"Dunkel",
"theme":"Theme:",
"sound":"Sound:",
"music":"Musik:",
"credits":"Credits",
"privacy-policy":"Datenschutzbestimmungen",
"impressum":"Impressum",
"track":"Anonymisierte Nutzungsdaten senden:",
">":">",
"choose-theme-dialog-title":"Theme auswählen:",
"install":"Installieren",
"share-dialog":"Teilen:",
"credits-sister-text":"Ich danke meiner Lieblingsschwester, denn ohne Sie würde diese App nicht so aussehen, wie sie aussieht (wahrscheinlich eher schlechter :p)",
"credits-coin-text":"Sound:<br/>Der Münz-Sound ist von der Webseite <a href = '{0}' target='_blank' rel='noopener' class = 'link'>{0}</a>. Alle Rechte für diesen Münz-Sound gehören <a target='_blank' rel='noopener' href = '{0}' class = 'link'>{0}</a>.",
"credits-music-text":"Musik:<br/>Bright And Beautiful - GEMAfreie Musik von <a href = '{0}' target='_blank' rel='noopener' class = 'link'>{0}</a><br/>Licensed under Creative Commons: By Attribution 4.0 International (CC BY 4.0)<br/><a href = '{1}' target='_blank' rel='noopener' class = 'link'>{1}</a><br/>Angepasst (geschnitten) für diese App",
"storage-info":"Ungef. {0}/{1}MB genutzt ({2}%, {3} dauerhaft gespeichert)",
"storage-permission-not-get":"Der Browser gibt nicht die Erlaubnis zur dauerhaften Speicherung...",
"storage-permission-get":"Die Daten sind nun dauerhaft gespeichert"
"extra-coins-after-first-level": "Für das erste Level gibt es 50 extra Münzen!",
"dark": "Dunkel",
"theme": "Theme:",
"sound": "Sound:",
"music": "Musik:",
"credits": "Credits",
"privacy-policy": "Datenschutzbestimmungen",
"impressum": "Impressum",
"track": "Anonymisierte Nutzungsdaten senden:",
">": ">",
"choose-theme-dialog-title": "Theme auswählen:",
"install": "Installieren",
"share-dialog": "Teilen:",
"credits-sister-text": "Ich danke meiner Lieblingsschwester, denn ohne Sie würde diese App nicht so aussehen, wie sie aussieht (wahrscheinlich eher schlechter :p)",
"credits-coin-text": "Sound:<br/>Der Münz-Sound ist von der Webseite <a href = '{0}' target='_blank' rel='noopener' class = 'link'>{0}</a>. Alle Rechte für diesen Münz-Sound gehören <a target='_blank' rel='noopener' href = '{0}' class = 'link'>{0}</a>.",
"credits-music-text": "Musik:<br/>Bright And Beautiful - GEMAfreie Musik von <a href = '{0}' target='_blank' rel='noopener' class = 'link'>{0}</a><br/>Licensed under Creative Commons: By Attribution 4.0 International (CC BY 4.0)<br/><a href = '{1}' target='_blank' rel='noopener' class = 'link'>{1}</a><br/>Angepasst (geschnitten) für diese App",
"storage-info": "Daten {0} dauerhaft gespeichert",
"storage-permission-not-get": "Der Browser gibt nicht die Erlaubnis zur dauerhaften Speicherung...",
"storage-permission-get": "Die Daten sind nun dauerhaft gespeichert",
"persist-storage-dialog-title": "Daten dauerhaft speichern?",
"persist-storage-dialog-message": "Der Fortschritt und die Level dieser WebApp sind nur temporär gespeichert. Damit die Daten dauerhaft gespeichert werden, muss eins von drei Kriterien erfüllt sein:<br/>1) Die Seite muss als Lesezeichen gespeichert werden (und maximal 5 Lesezeichen ingsesamt).<br/>2) Die Seite muss mit die meistbenutzte Seite sein. <br/>3) Benachrichtigungen müssen erlaubt werden.<br/>Damit die Daten dieser Webseite nicht gelöscht werden, erlaube bitte Benachrichtigungen. Alternativ kannst du die Seite auch als Lesezeichen speichern.",
"notification-permission-denied":"Die Berechtigung für Benachrichtigungen wurde verwährt",
"already-persisted-dialog-message":"Damit die Daten dauerhaft gespeichert werden, muss eins von drei Kriterien erfüllt sein:<br/>1) Die Seite muss als Lesezeichen gespeichert werden (und maximal 5 Lesezeichen ingsesamt).<br/>2) Die Seite muss mit die meistbenutzte Seite sein. <br/>3) Benachrichtigungen müssen erlaubt werden.<br/> Du erfüllst schon ein Kriterium und daher wird dein Fortschritt dauerhaft gespeichert (außer du löscht sie)",
"already-persisted-dialog-title":"Daten werden dauerhaft gespeichert!"
}