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 { class FlashMessenger {
static deleteMessage(_idNumber, _delayInMilliSeconds) { static deleteMessage(_idNumber, _delayInMilliSeconds) {
_delayInMilliSeconds = Helper.nonNull(_delayInMilliSeconds, 0); _delayInMilliSeconds = Helper.nonNull(_delayInMilliSeconds, 0);
@ -7254,6 +7276,12 @@ InitPromise.addPromise(app => {
app.addDeepLink("impressum", ImpressumSite); app.addDeepLink("impressum", ImpressumSite);
}); });
class PersistDialog extends ConfirmDialog{
constructor() {
super("persist-storage-dialog-message", "persist-storage-dialog-title");
}
}
class WordRotatorSettingFragment extends LocalStorageSettingsFragment { class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
constructor(site) { constructor(site) {
super(site, "html/application/fragment/settings.html"); super(site, "html/application/fragment/settings.html");
@ -7328,39 +7356,53 @@ class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
installButton.classList.remove("hidden"); installButton.classList.remove("hidden");
}); });
// let storageManager = MyStorageManager.getInstance(); let storageManager = MyStorageManager.getInstance();
// if (storageManager.canEstimateStorage()) { if (storageManager.canPersist()) {
// console.log("can estimate storage!"); Promise.all([storageManager.isPersistent(), navigator.serviceWorker["ready"]]).then(res => {
// Promise.all([storageManager.estimate(), storageManager.isPersistent()]).then(res => { let isPersisted = res[0];
// let storage = res[0]; let storageObject = this.findBy("#storage-info");
// let isPersisted = res[1]; storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [
// let storageObject = this.findBy("#storage-info"); ((isPersisted) ? "" : "nicht")]));
// console.log(isPersisted); storageObject.parentElement.classList.remove("hidden");
// storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [ storageObject.parentElement.addEventListener("click", async () => {
// Math.round(storage.usage / (1024 * 1024) * 100) / 100, if (!isPersisted) {
// Math.round(storage.quota / (1024 * 1024) * 100) / 100, try {
// Math.round(storage.usage / storage.quota * 10000) / 100, let shouldAskForNotifications = await (new PersistDialog().show());
// ((isPersisted) ? "" : "nicht")])); if (shouldAskForNotifications) {
// storageObject.parentElement.classList.remove("hidden"); let sub = await res[1]["pushManager"]["subscribe"]({
// storageObject.parentElement.addEventListener("click", () => { "userVisibleOnly": true,
// storageManager.persist().then(isPersisted => { "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])
// storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [ });
// Math.round(storage.usage / (1024 * 1024) * 100) / 100, }
// Math.round(storage.quota / (1024 * 1024) * 100) / 100, } catch (e) {
// Math.round(storage.usage / storage.quota * 10000) / 100, if ('Notification' in window && Notification.permission === 'denied') {
// ((isPersisted) ? "" : "nicht")])); FlashMessenger.addMessage('notification-permission-denied');
// }
// console.log("p", isPersisted); }
// if (!isPersisted){
// FlashMessenger.addMessage("storage-permission-not-get"); isPersisted = await storageManager.isPersistent();
// } storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [
// else { ((isPersisted) ? "" : "nicht")]));
// FlashMessenger.addMessage("storage-permission-get");
// } }
// }); // 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(); return super.onFirstStart();
} }
@ -7569,24 +7611,23 @@ InitPromise.resolve(app$1).then(async function () {
MyStorageManager.getInstance().persist(); MyStorageManager.getInstance().persist();
} }
window["applyAndroidBridge"] = AndroidBridge.applyDefinitions; window["applyAndroidBridge"] = AndroidBridge.applyDefinitions;
}); });
console.log("trying push... 1"); // console.log("trying push... 1");
navigator.serviceWorker["ready"].then(function (registration) { // navigator.serviceWorker["ready"].then(function (registration) {
console.log("trying push... 2"); // console.log("trying push... 2");
registration["pushManager"]["subscribe"]({ // registration["pushManager"]["subscribe"]({
"userVisibleOnly": false, // "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]) // "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) { // }).then(function (sub) {
console.log("trying push... 3"); // console.log("trying push... 3");
console.log("Subscription", sub); // console.log("Subscription", sub);
}).catch(function (e) { // }).catch(function (e) {
// if ('Notification' in window && Notification.permission === 'denied') { // // if ('Notification' in window && Notification.permission === 'denied') {
// console.warn('Permission for notifications was denied'); // // console.warn('Permission for notifications was denied');
// } else { // // } else {
// console.error('Unable to subscribe to push', e); // // 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(); MyStorageManager.getInstance().persist();
} }
window["applyAndroidBridge"] = AndroidBridge.applyDefinitions; window["applyAndroidBridge"] = AndroidBridge.applyDefinitions;
}); });
console.log("trying push... 1"); // console.log("trying push... 1");
navigator.serviceWorker["ready"].then(function (registration) { // navigator.serviceWorker["ready"].then(function (registration) {
console.log("trying push... 2"); // console.log("trying push... 2");
registration["pushManager"]["subscribe"]({ // registration["pushManager"]["subscribe"]({
"userVisibleOnly": true, // "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]) // "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) { // }).then(function (sub) {
console.log("trying push... 3"); // console.log("trying push... 3");
console.log("Subscription", sub); // console.log("Subscription", sub);
}).catch(function (e) { // }).catch(function (e) {
// if ('Notification' in window && Notification.permission === 'denied') { // // if ('Notification' in window && Notification.permission === 'denied') {
// console.warn('Permission for notifications was denied'); // // console.warn('Permission for notifications was denied');
// } else { // // } else {
// console.error('Unable to subscribe to push', e); // // 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 {ChooseThemeDialog} from "../dialog/ChooseThemeDialog";
import {ContactSite} from "../../../../../js/lib/pwa-contact"; import {ContactSite} from "../../../../../js/lib/pwa-contact";
import {ImpressumSite} from "../site/ImpressumSite"; import {ImpressumSite} from "../site/ImpressumSite";
import {PersistDialog} from "../dialog/PersistDialog";
export class WordRotatorSettingFragment extends LocalStorageSettingsFragment { export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
constructor(site) { constructor(site) {
@ -82,39 +83,56 @@ export class WordRotatorSettingFragment extends LocalStorageSettingsFragment {
installButton.classList.remove("hidden"); installButton.classList.remove("hidden");
}); });
// let storageManager = MyStorageManager.getInstance(); let storageManager = MyStorageManager.getInstance();
// if (storageManager.canEstimateStorage()) { if (storageManager.canPersist()) {
// console.log("can estimate storage!"); Promise.all([storageManager.isPersistent(), navigator.serviceWorker["ready"]]).then(res => {
// Promise.all([storageManager.estimate(), storageManager.isPersistent()]).then(res => { let isPersisted = res[0];
// let storage = res[0]; let storageObject = this.findBy("#storage-info");
// let isPersisted = res[1]; storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [
// let storageObject = this.findBy("#storage-info"); ((isPersisted) ? "" : "nicht")]));
// console.log(isPersisted); storageObject.parentElement.classList.remove("hidden");
// storageObject.appendChild(Translator.makePersistentTranslation("storage-info", [ storageObject.parentElement.addEventListener("click", async () => {
// Math.round(storage.usage / (1024 * 1024) * 100) / 100, if (!isPersisted) {
// Math.round(storage.quota / (1024 * 1024) * 100) / 100, try {
// Math.round(storage.usage / storage.quota * 10000) / 100, let shouldAskForNotifications = await (new PersistDialog().show());
// ((isPersisted) ? "" : "nicht")])); if (shouldAskForNotifications) {
// storageObject.parentElement.classList.remove("hidden"); let sub = await res[1]["pushManager"]["subscribe"]({
// storageObject.parentElement.addEventListener("click", () => { "userVisibleOnly": true,
// storageManager.persist().then(isPersisted => { "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])
// storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [ });
// Math.round(storage.usage / (1024 * 1024) * 100) / 100, }
// Math.round(storage.quota / (1024 * 1024) * 100) / 100, } catch (e) {
// Math.round(storage.usage / storage.quota * 10000) / 100, if ('Notification' in window && Notification.permission === 'denied') {
// ((isPersisted) ? "" : "nicht")])); FlashMessenger.addMessage('notification-permission-denied');
// }
// console.log("p", isPersisted); }
// if (!isPersisted){
// FlashMessenger.addMessage("storage-permission-not-get"); isPersisted = await storageManager.isPersistent();
// } storageObject.removeAllChildren().appendChild(Translator.makePersistentTranslation("storage-info", [
// else { ((isPersisted) ? "" : "nicht")]));
// FlashMessenger.addMessage("storage-permission-get");
// } }
// }); 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(); 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> </span>
</label> </label>
<div class='row setting-row hidden' > <div class='row setting-row hidden' >
<span class = "column small-12" id='storage-info'></span> <span class = "column small-10" id='storage-info'></span>
<!--<span class='columns small-2 text-right' data-translation=">"></span>--> <span class='columns small-6 text-right' data-translation=">"></span>
</div> </div>
<!--<iframe--> <!--<iframe-->

View File

@ -1,38 +1,37 @@
{ {
"won":"Gewonnen!", "won": "Gewonnen!",
"continue":"Weiter", "continue": "Weiter",
"help": "?", "help": "?",
"not-enough-coins":"Du hast zu wenig Münzen!", "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.",
"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.",
"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!",
"play":"Spielen!",
"tutorial-step-1": "Klicke auf ein Feld, um dieses rotieren zu lassen!", "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-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-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.", "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!", "extra-coins-after-first-level": "Für das erste Level gibt es 50 extra Münzen!",
"dark": "Dunkel",
"dark":"Dunkel", "theme": "Theme:",
"theme":"Theme:", "sound": "Sound:",
"sound":"Sound:", "music": "Musik:",
"music":"Musik:", "credits": "Credits",
"credits":"Credits", "privacy-policy": "Datenschutzbestimmungen",
"privacy-policy":"Datenschutzbestimmungen", "impressum": "Impressum",
"impressum":"Impressum", "track": "Anonymisierte Nutzungsdaten senden:",
"track":"Anonymisierte Nutzungsdaten senden:", ">": ">",
">":">", "choose-theme-dialog-title": "Theme auswählen:",
"choose-theme-dialog-title":"Theme auswählen:", "install": "Installieren",
"install":"Installieren", "share-dialog": "Teilen:",
"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-sister-text":"Ich danke meiner Lieblingsschwester, denn ohne Sie würde diese App nicht so aussehen, wie sie aussieht (wahrscheinlich eher schlechter :p)", "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",
"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>.", "storage-info": "Daten {0} dauerhaft gespeichert",
"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-permission-not-get": "Der Browser gibt nicht die Erlaubnis zur dauerhaften Speicherung...",
"storage-info":"Ungef. {0}/{1}MB genutzt ({2}%, {3} dauerhaft gespeichert)", "storage-permission-get": "Die Daten sind nun dauerhaft gespeichert",
"storage-permission-not-get":"Der Browser gibt nicht die Erlaubnis zur dauerhaften Speicherung...", "persist-storage-dialog-title": "Daten dauerhaft speichern?",
"storage-permission-get":"Die Daten sind nun dauerhaft gespeichert" "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!"
} }