diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index b2c6f380..825dd66e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -6,4 +6,4 @@ Here are some important resources:
- The [roadmap](https://github.com/vishnuraghavb/EnRecipes/projects/1) will tell you whats the future of EnRecipes. Your feedback and suggestions are very important to make EnRecipes the best. If you have an idea to improve EnRecipes, [do let me know](https://github.com/vishnuraghavb/EnRecipes#having-issues-suggestions-and-feedback). I'm always open to ideas ;)
- You can help [translate EnRecipes using Weblate](https://hosted.weblate.org/engage/enrecipes/) into the language of your choice. See [translation instructions](https://github.com/vishnuraghavb/EnRecipes/wiki/Translation-Instructions) in the wiki for more information.
-- Bugs, suggestions or feedback? You can [create an issue here](https://github.com/vishnuraghavb/EnRecipes/issues) or [join the Telegram group](http://t.me/enrecipes)(quicker replies) or contact me at apps@vishnuraghav.com
+- Bugs, suggestions or feedback? You can [create an issue here](https://github.com/vishnuraghavb/EnRecipes/issues) or [join the Telegram group](http://t.me/enrecipes) (quicker replies) or contact me at apps@vishnuraghav.com
diff --git a/README.md b/README.md
index 5a0978cc..b29fcc19 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
- You can also get the latest release on GitHub
+ You can also get the latest release on GitHub
Enjoying EnRecipes?
Please consider making a small donation to help fund the project. Developing an application, especially one that is open source and completely free, takes a lot of time and effort.
@@ -28,16 +28,17 @@
- Scale your recipe ingredients to serve more or less people
- Get notified of the last time you tried a recipe
- Share your recipe to anyone by any means as a nicely formatted message. You can share the recipe photo too.
-- Shake device to view random recipe
+- Shake your device to view a random recipe
- Create meal plans
-- Import/Export recipes
-- Light, Dark and Black themes
+- Set cooking timers
+- You can Import or Export your data
+- Has Light, Dark and Black themes
## Highlights
- 100% free and open-source
- Private by Design
-- No permissions required
+- No special permissions required
- No annoying ads or pop-ups
**Languages being translated**:
diff --git a/app/app.scss b/app/app.scss
index ae66c777..ddb33624 100644
--- a/app/app.scss
+++ b/app/app.scss
@@ -1,3 +1,4 @@
+// Colours
$gray0: #f8f9fa;
$gray1: #f1f3f5;
$gray2: #e9ecef;
@@ -11,21 +12,29 @@ $gray9: #212529;
$gray10: #000000;
$orange: #ff5200;
+// FontSizes based on Minor Third
+$t1: 25;
+$t2: 21;
+$t3: 17;
+$t4: 14;
+$t5: 12; // Base size
+$t6: 10;
+
Page {
- font-family: 'Inter-Medium';
- font-size: 14;
+ font-family: 'Inter-Medium', sans-serif;
+ font-size: $t4;
}
.ico {
font-family: 'enrecipes';
font-size: 24;
vertical-alignment: center;
&.sm {
- font-size: 16;
+ font-size: $t3;
opacity: 0.5;
}
}
.tb {
- font-family: 'Inter-Bold';
+ font-family: 'Inter-Bold', sans-serif;
}
.tac {
text-align: center;
@@ -36,7 +45,7 @@ Page {
.pageTitle {
@extend .tb;
@extend .tw;
- font-size: 25;
+ font-size: $t1;
padding: 16 16 24;
}
.Light {
@@ -60,7 +69,6 @@ Page {
background: $gray0;
}
.fieldLabel,
- .dayName,
.sub {
color: $gray6;
}
@@ -98,7 +106,6 @@ Page {
background: $gray8;
}
.fieldLabel,
- .dayName,
.sub {
color: $gray5;
}
@@ -136,7 +143,6 @@ Page {
background: $gray9;
}
.fieldLabel,
- .dayName,
.sub {
color: $gray6;
}
@@ -169,14 +175,13 @@ TextView {
line-height: 4;
}
#searchBar {
- padding-left: 0;
- margin: 0;
+ padding: 13 12;
}
.inputField {
margin-bottom: 24;
}
.fieldLabel {
- font-size: 12;
+ font-size: $t5;
}
.progressContainer {
width: 100%;
@@ -198,25 +203,28 @@ button {
border-radius: 12;
min-width: 0;
min-height: 0;
- &:active {
- @extend .fade;
- }
&.ico {
width: 48;
height: 48;
padding: 0;
margin: 0;
+ &:active {
+ @extend .fade;
+ }
}
&.text {
@extend .tb;
color: $orange;
+ &:active {
+ @extend .fade;
+ }
}
&.big {
margin-top: 8;
padding: 16 0;
}
&.sm {
- font-size: 12;
+ font-size: $t5;
padding: 12;
}
&.min {
@@ -224,10 +232,16 @@ button {
height: 40;
vertical-alignment: center;
}
+ &.fb:active {
+ @extend .fade;
+ }
&.rate {
margin: 0 4 0 0;
width: 32;
height: 32;
+ &:active {
+ @extend .fade;
+ }
}
}
ActivityIndicator {
@@ -246,14 +260,15 @@ ActivityIndicator {
.value {
padding: 0 0 0 8;
vertical-alignment: center;
- &.rtl {
+ &.r {
padding: 0 8 0 0;
+ transform: scaleX(-1);
}
}
- &.select {
- color: $orange;
- @extend .hl;
- }
+}
+.select {
+ color: $orange;
+ @extend .hl;
}
.emptyState {
padding: 16 16 8;
@@ -262,7 +277,7 @@ ActivityIndicator {
}
.title {
@extend .tb;
- font-size: 17;
+ font-size: $t3;
}
}
@@ -272,22 +287,18 @@ ActivityIndicator {
padding: 8 16;
.recipeInfo {
vertical-alignment: center;
- padding: 0 0 4 8;
- &.rtl {
- transform: none;
- padding: 0 8 4 0;
- }
+ padding: 0 8 4;
}
.title {
padding: 0 0 4;
}
- .attr {
- font-size: 10;
- padding: 0 6 1 2;
- &.rtl {
- padding: 0 2 1 6;
- }
- }
+}
+.attrs {
+ orientation: horizontal;
+}
+.attr {
+ font-size: $t6;
+ padding: 1 4;
}
.simple .recipeInfo {
padding: 8 0;
@@ -343,20 +354,24 @@ ActivityIndicator {
.group-info {
padding: 16 16 16 72;
line-height: 4;
+ &.r {
+ padding: 16 72 16 16;
+ }
}
.options {
.option {
vertical-align: center;
- padding: 14 12;
+ padding: 14 16;
.ico {
- margin: 0 24 0 12;
+ width: 40;
+ text-align: center;
}
- .info,
- .sub {
+ .info {
+ padding: 0 16;
@extend .tw;
}
.sub {
- font-size: 12;
+ font-size: $t5;
}
}
}
@@ -371,7 +386,7 @@ ActivityIndicator {
horizontal-alignment: center;
}
.name {
- font-size: 21;
+ font-size: $t2;
}
.info {
padding: 8 16 24;
@@ -394,9 +409,8 @@ ActivityIndicator {
}
.attribute {
margin: 8 16;
- .title {
- margin-right: 8;
- font-size: 12;
+ .sub {
+ font-size: $t5;
}
.value {
@extend .tb;
@@ -416,7 +430,7 @@ ActivityIndicator {
padding: 0 16;
.count {
@extend .tb;
- font-size: 17;
+ font-size: $t3;
}
.value {
@extend .tw;
@@ -443,7 +457,7 @@ ActivityIndicator {
}
.dateInfo {
padding: 32 16 16;
- font-size: 12;
+ font-size: $t5;
line-height: 4;
}
@@ -459,10 +473,12 @@ ActivityIndicator {
@extend .tb;
@extend .tw;
vertical-align: center;
+ margin: 0 12;
line-height: 4;
}
.msg {
padding: 14 16;
+ margin: 0;
}
.fab {
margin-left: 8;
@@ -471,21 +487,21 @@ ActivityIndicator {
margin: 8 8 0;
}
}
+.sidebar {
+ margin-bottom: 0;
+}
.toolbar {
z-index: 4;
padding: 4;
margin: 0 0 52;
- horizontal-alignment: left;
.tool {
- padding: 0 12;
+ padding: 0 8;
label {
vertical-alignment: center;
}
+ .value,
.ico {
- padding: 0 8 0 0;
- &.rtl {
- padding: 0 0 0 8;
- }
+ padding: 0 4;
}
}
}
@@ -499,7 +515,7 @@ ActivityIndicator {
.sectionTitle {
@extend .tb;
@extend .tw;
- font-size: 21;
+ font-size: $t2;
padding: 0;
margin: 32 0 16;
}
@@ -509,49 +525,51 @@ ActivityIndicator {
margin: 0;
}
.countdown {
- font-size: 17;
+ font-size: $t3;
color: $orange;
}
// -----------------------------
// MealPlanner
-.calendar {
- padding: 0 8;
- .navBtn {
- margin: 0;
- }
- .monthName {
- text-align: center;
+.monthSwitcher {
+ padding: 0 16;
+ .month {
vertical-alignment: center;
- font-size: 17;
- }
- .dayName {
- margin: 8 0;
- font-size: 12;
text-align: center;
- }
- .day {
- border-radius: 12;
- }
- .hasPlans {
- color: $orange;
- }
- .activeDay {
- @extend .hl;
+ font-size: $t3;
}
}
-.dayPlan {
- padding: 16 16 80;
- width: 100%;
- .periodLabel {
- font-size: 17;
- text-transform: capitalize;
- vertical-align: center;
+.calendar {
+ padding: 0 16;
+ .dayName {
+ vertical-alignment: center;
+ text-align: center;
+ font-size: $t5;
}
- .recipeTitle {
- @extend .tw;
- padding: 16 8;
- line-height: 4;
+ .accent.sub {
+ color: rgba($orange, 0.5);
+ }
+}
+.plans {
+ padding: 8 16 80;
+ width: 100%;
+ .date {
+ font-size: $t2;
+ padding: 16 0;
+ }
+ .plan {
+ padding: 8 0;
+ }
+ .meal {
+ font-size: $t3;
+ padding: 8 0;
+ }
+ .planContent {
+ min-height: 48;
+ padding: 8;
+ }
+ .attr {
+ padding: 0;
}
}
@@ -566,7 +584,7 @@ ActivityIndicator {
@extend .tb;
@extend .tw;
padding: 16;
- font-size: 21;
+ font-size: $t2;
}
.input {
padding: 0 16 8;
@@ -581,13 +599,12 @@ ActivityIndicator {
margin: 16 0;
}
.listItem {
- @extend .tw;
letter-spacing: 0;
text-transform: none;
line-height: 4;
padding: 13 16;
margin: 0;
- background: transparent;
+ background-color: transparent;
}
.shareItem {
border-radius: 12;
@@ -649,10 +666,10 @@ ActivityIndicator {
// -----------------------------
// Helpers
-.rtl {
+.f {
transform: scaleX(-1);
}
-.clickable {
+.accent {
color: $orange;
}
.hal {
diff --git a/app/components/CookingTimer.vue b/app/components/CookingTimer.vue
index 1f70c6a7..d0e4351f 100644
--- a/app/components/CookingTimer.vue
+++ b/app/components/CookingTimer.vue
@@ -1,53 +1,55 @@
-
+
-
-
-
-
+
+
+
+
-
+
+
+
+
+
+
-
+
-
+
-
+
@@ -58,13 +60,17 @@ import {
Observable,
CoreTypes,
Application,
- ApplicationSettings,
- AndroidApplication,
Utils,
Device,
+ Frame,
} from "@nativescript/core";
+import {
+ getNumber,
+ setNumber,
+ remove,
+} from "@nativescript/core/application-settings";
import { mapState, mapActions } from "vuex";
-
+import EnRecipes from "./EnRecipes.vue";
import Action from "./modals/Action.vue";
import CTSettings from "./settings/CTSettings.vue";
import TimePickerHMS from "./modals/TimePickerHMS.vue";
@@ -72,13 +78,10 @@ import TimerReminder from "./modals/TimerReminder.vue";
import Timer from "./sub/Timer.vue";
import Toast from "./sub/Toast.vue";
import SnackBar from "./sub/SnackBar.vue";
-
import * as utils from "~/shared/utils";
-import { EventBus } from "~/main";
-let undoTimer,
- firingTimers = [];
-declare const com: any;
-
+import { EvtBus } from "~/main";
+let barTimer;
+declare const com, android: any;
export default {
components: { Timer, Toast, SnackBar },
props: ["recipeID"],
@@ -86,43 +89,62 @@ export default {
return {
scrollPos: 1,
appbar: null,
+ toastbar: null,
+ snackbar: null,
+ scrollView: null,
countdown: 5,
snackMsg: null,
- showUndo: false,
- undo: false,
- CTSettings: CTSettings,
+ showUndo: 0,
+ undo: 0,
toast: null,
+ key: 99,
};
},
computed: {
...mapState([
"icon",
"recipes",
- "currentComponent",
"timerSound",
"timerVibrate",
- "timerDelay",
"timerPresets",
"activeTimers",
+ "FGService",
+ "RTL",
]),
+ hasBackStack() {
+ return Frame.topmost().backStack.length;
+ },
},
methods: {
...mapActions([
- "setComponent",
"addActiveTimer",
"removeActiveTimer",
"clearTimerInterval",
"addTimerPreset",
"updateActiveTimer",
+ "setFGService",
]),
- onPageLoad({ object }) {
+ pgLoad({ object }) {
object.bindingContext = new Observable();
- this.setComponent("CookingTimer");
+ if (this.activeTimers.filter((e: any) => e.done).length)
+ this.openReminder();
+ this.keepScreenOnCountUp();
+ setNumber("isTimer", 1);
},
- onAppBarLoad({ object }) {
+ pgUnload() {
+ utils.keepScreenOn(0);
+ },
+ abLoad({ object }) {
this.appbar = object;
},
- onScroll(args) {
+ tbLoad({ object }) {
+ this.toastbar = object;
+ },
+ sbLoad({ object }) {
+ this.snackbar = object;
+ },
+ svScroll(args) {
+ this.scrollView = args.object;
let scrollUp;
let y = args.scrollY;
if (y) {
@@ -132,18 +154,19 @@ export default {
if (!scrollUp && ab == 0) {
this.appbar.animate({
translate: { x: 0, y: 64 },
- duration: 250,
+ duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
} else if (scrollUp && ab == 64) {
this.appbar.animate({
translate: { x: 0, y: 0 },
- duration: 250,
+ duration: 200,
curve: CoreTypes.AnimationCurve.ease,
});
}
}
},
+
// HELPERS
getRecipeTitle(id) {
let recipe = this.recipes.filter((e) => e.id === id)[0];
@@ -168,81 +191,111 @@ export default {
},
// NOTIFICATION HANDLERS
- notifyTimers() {
+ timerInfo() {
let activeCount = this.activeTimers.length;
let pausedCount = this.activeTimers.filter((e) => e.isPaused).length;
let ongoingCount = activeCount - pausedCount;
- console.log("notifying");
- utils.TimerNotif.show({
- bID: "bringToFront",
- cID: "cti",
- cName: "Cooking Timer info",
- description: `${ongoingCount} ongoing, ${pausedCount} paused`,
- nID: 777,
- priority: -2,
- sound: null,
- title: localize("timer"),
- });
- if (activeCount <= 0) this.foregroundService(false);
+ this.foregroundService(activeCount);
+ function show() {
+ utils.TimerNotif.show({
+ bID: "info",
+ cID: "cti",
+ cName: "Cooking Timer info",
+ description: localize("oAP", ongoingCount + "", pausedCount),
+ nID: 6,
+ priority: -2,
+ sound: null,
+ title: localize("timer"),
+ });
+ }
+ if (this.FGService)
+ setTimeout(() => this.activeTimers.length && show(), 250);
+ this.keepScreenOnCountUp();
+ utils.wakeLock(ongoingCount);
},
- fireTimer(timer) {
- console.log("firing");
- let description = timer.recipeID
- ? " - " + this.getRecipeTitle(timer.recipeID)
- : "";
- let title = timer.label;
- let time = this.formattedTime(timer.time);
- let bID = "timer" + timer.id;
+ timerAlert() {
+ let title, description, bID;
+ let firedTimers = this.activeTimers.filter((e) => e.done);
+ let timer = firedTimers[0];
+ if (firedTimers.length > 1) {
+ title = localize("texp", firedTimers.length);
+ description = localize("ttv");
+ bID = "alerts";
+ } else if (firedTimers.length == 1) {
+ title =
+ timer.label +
+ (timer.recipeID ? " - " + this.getRecipeTitle(timer.recipeID) : "");
+ description = this.formattedTime(timer.time);
+ bID = "timer" + timer.id;
+ } else {
+ utils.TimerNotif.clear(7);
+ return;
+ }
utils.TimerNotif.show({
- actions: true,
+ actions: 1,
bID,
cID: "cta",
cName: "Cooking Timer alerts",
- description: time,
- nID: timer.id,
+ description,
+ multi: firedTimers.length > 1,
+ nID: 7,
priority: 1,
sound: this.timerSound.uri,
- title: title + description,
+ title,
vibrate: this.timerVibrate,
});
- Application.android.registerBroadcastReceiver(bID, (ctx, intent) => {
- let action = intent.getStringExtra("action");
- console.log(action, "firing");
- EventBus.$emit(bID, action);
+ if (firedTimers.length == 1) {
+ Application.android.registerBroadcastReceiver(bID, (ctx, intent) => {
+ EvtBus.$emit(bID, intent.getStringExtra("action"));
+ Application.android.unregisterBroadcastReceiver(bID);
+ });
+ } else {
+ Application.android.unregisterBroadcastReceiver(bID);
+ Application.android.registerBroadcastReceiver(bID, (ctx, intent) => {
+ if (intent.getStringExtra("action") == "dismissAll") {
+ firedTimers.forEach((t) => this.removeTimer(t.id, 1));
+ Application.android.unregisterBroadcastReceiver(bID);
+ }
+ });
+ }
+ },
+ openReminder() {
+ this.clearTimerInterval();
+ this.$showModal(TimerReminder, {
+ fullscreen: true,
+ props: {
+ formattedTime: this.formattedTime,
+ removeTimer: this.removeTimer,
+ togglePause: this.togglePause,
+ timerAlert: this.timerAlert,
+ showToast: this.showToast,
+ },
+ }).then(() => {
+ this.clearTimerInterval();
+ this.key = Math.floor(Math.random() * 900) + 100;
});
- firingTimers.push(timer);
- // if (firingTimers.length == 1) {
- // this.$showModal(TimerReminder, {
- // fullscreen: true,
- // props: {
- // timers: firingTimers,
- // stop: this.stopFiringTimers,
- // formattedTime: this.formattedTime,
- // },
- // });
- // }
},
- stopFiringTimers() {
- firingTimers.forEach((e) => utils.TimerNotif.clear(e.id));
- firingTimers = [];
- },
- openReminder() {},
- foregroundService(bool) {
+ foregroundService(n) {
const ctx = Utils.ad.getApplicationContext();
const intent = new android.content.Intent(
ctx,
com.tns.ForegroundService.class
);
- if (bool)
+ if (n && !this.FGService) {
parseInt(Device.sdkVersion) < 26
? ctx.startService(intent)
: ctx.startForegroundService(intent);
- else ctx.stopService(intent);
+ this.setFGService(1);
+ setNumber("FGService", 1);
+ } else if (!this.activeTimers.length) {
+ ctx.stopService(intent);
+ this.setFGService(0);
+ setNumber("FGService", 0);
+ }
},
// DATA HANDLERS
addTimer() {
- this.foregroundService(true);
this.$showModal(TimePickerHMS, {
props: {
title: "ntmr",
@@ -258,7 +311,7 @@ export default {
);
this.$showModal(Action, {
props: {
- title: "tmrPrsts",
+ title: "prsts",
list,
},
}).then((preset) => {
@@ -266,128 +319,155 @@ export default {
let timer = JSON.parse(
JSON.stringify(this.timerPresets[list.indexOf(preset)])
);
- timer.id = this.getRandomID();
+ timer.id = utils.getRandomID(1);
+ timer.recipeID = this.recipeID;
+ timer.timerInt = timer.isPaused = 0;
+ timer.preset = timer.mode = 1;
this.addActiveTimer({
timer,
- index: this.activeTimers.length,
+ i: this.activeTimers.length,
});
- this.notifyTimers();
+ this.timerInfo();
}
});
} else {
- if (res.time != "00:00:00") {
- this.addActiveTimer({
- timer: {
- id: this.getRandomID(),
- label: res.label,
- recipeID: this.recipeID,
- time: res.time,
- timerInterval: null,
- isPaused: false,
- preset: 0,
- },
- index: this.activeTimers.length,
- });
- this.notifyTimers();
- }
+ let mode = res.time != "00:00:00" ? 1 : 0;
+ this.addActiveTimer({
+ timer: {
+ id: utils.getRandomID(1),
+ label: res.label,
+ recipeID: this.recipeID,
+ time: res.time,
+ timerInt: 0,
+ isPaused: 0,
+ preset: 0,
+ done: 0,
+ mode,
+ },
+ i: this.activeTimers.length,
+ });
+ this.timerInfo();
}
}
});
},
- removeTimer(id, index, noUndo) {
- let temp = this.activeTimers[index];
- this.removeActiveTimer(index);
- utils.TimerNotif.clear(id);
- if (!noUndo) {
- this.showUndoBar("tmrClr")
- .then(() => {
- this.foregroundService(true);
- this.addActiveTimer({
- timer: temp,
- index,
- });
- this.notifyTimers();
- })
- .catch(() => {
- ApplicationSettings.remove(`${temp.id}progress`);
- });
+ removeTimer(id, noUndo) {
+ let i = this.activeTimers.findIndex((e) => e.id == id);
+ let temp = this.activeTimers[i];
+ clearInterval(temp.timerInt);
+ temp.timerInt = 0;
+ this.removeActiveTimer(i);
+ let secs = [getNumber(`${temp.id}c`, 0), getNumber(`${temp.id}d`, 0)];
+ function removeSettings() {
+ remove(`${temp.id}c`);
+ remove(`${temp.id}d`);
}
- this.notifyTimers();
+ removeSettings();
+ if (!noUndo) {
+ this.showUndoBar("tmrRm")
+ .then(() => {
+ setNumber(`${temp.id}c`, secs[0]),
+ setNumber(`${temp.id}d`, secs[1]),
+ this.addActiveTimer({
+ timer: temp,
+ i,
+ });
+ this.timerInfo();
+ })
+ .catch(() => removeSettings());
+ }
+ this.timerAlert();
+ this.timerInfo();
},
- addToPreset(timer) {
- timer = JSON.parse(JSON.stringify(timer));
- timer.recipeID = timer.timerInterval = null;
- timer.preset = 1;
- this.addTimerPreset(timer);
- this.showToast("aTPrst");
- },
- togglePause(timer, bool) {
- if (typeof bool === "boolean") timer.isPaused = bool;
- else timer.isPaused = !timer.isPaused;
+ togglePause(timer, n) {
+ timer.isPaused =
+ typeof n === "number" ? n : (!timer.isPaused as boolean | 0);
this.updateActiveTimer(timer);
- this.notifyTimers();
+ n ? 0 : this.timerInfo();
},
showToast(data) {
- this.toast = localize(data);
- utils.timer(5, (val) => {
- if (!val) this.toast = val;
+ this.animateBar(this.snackbar, 0);
+ this.animateBar(this.appbar, 0).then(() => {
+ this.showUndo = 0;
+ this.toast = localize(data);
+ this.animateBar(this.toastbar, 1);
+ let a = 5;
+ clearInterval(barTimer);
+ barTimer = setInterval(() => a-- < 1 && this.hideBar(), 1000);
});
},
showUndoBar(message) {
return new Promise((resolve, reject) => {
- clearTimeout(undoTimer);
- this.showUndo = true;
- this.snackMsg = message;
- this.countdown = 5;
- let a = 5;
- undoTimer = setInterval(() => {
- if (this.undo) {
- this.showUndo = this.undo = false;
- clearTimeout(undoTimer);
- resolve(true);
- }
- this.countdown = Math.round((a -= 0.1));
- if (this.countdown < 1) {
- this.showUndo = false;
- clearTimeout(undoTimer);
- reject(true);
- }
- }, 100);
+ this.animateBar(this.toastbar, 0);
+ this.animateBar(this.appbar, 0).then(() => {
+ this.toast = null;
+ this.showUndo = 1;
+ this.snackMsg = message;
+ this.countdown = 5;
+ this.animateBar(this.snackbar, 1).then(() => {
+ let a = 5;
+ clearInterval(barTimer);
+ barTimer = setInterval(() => {
+ if (this.undo) {
+ this.hideBar();
+ resolve(1);
+ }
+ this.countdown = Math.round((a -= 0.1));
+ if (this.countdown < 1) {
+ this.hideBar();
+ reject(1);
+ }
+ }, 100);
+ });
+ });
});
},
- hideBar({ object }) {
- this.appbar.translateY = 64;
- object
- .animate({
- opacity: 0,
- translate: { x: 0, y: 64 },
- duration: 250,
- curve: CoreTypes.AnimationCurve.ease,
- })
- .then(() => {
- this.showUndo = false;
+ hideBar() {
+ clearInterval(barTimer);
+ this.animateBar(this.toast ? this.toastbar : this.snackbar, 0).then(
+ () => {
+ this.showUndo = this.undo = 0;
this.toast = null;
- this.appbar.animate({
- translate: { x: 0, y: 0 },
- duration: 250,
- curve: CoreTypes.AnimationCurve.ease,
- });
- object.opacity = 1;
- object.translateY = 0;
- clearTimeout(undoTimer);
- });
+ this.animateBar(this.appbar, 1);
+ }
+ );
},
undoDel() {
- this.undo = true;
+ this.undo = 1;
+ },
+
+ //NAVIGATION HANDLERS
+ navigateTo() {
+ this.$navigateTo(CTSettings, {
+ transition: {
+ name: this.RTL ? "slideRight" : "slide",
+ duration: 200,
+ curve: "easeOut",
+ },
+ });
+ },
+ navigateBack() {
+ setNumber("isTimer", 0);
+ this.hasBackStack
+ ? this.$navigateBack()
+ : this.$navigateTo(EnRecipes, {
+ clearHistory: true,
+ });
},
// HELPERS
- getRandomID() {
- return Math.floor(Math.random() * 9000000000) + 1000000000;
+ keepScreenOnCountUp() {
+ utils.keepScreenOn(
+ this.activeTimers.filter((e: any) => !e.isPaused).length
+ );
},
},
created() {
this.clearTimerInterval();
+ this.recipeID && this.addTimer();
+ },
+ destroyed() {
+ setNumber("isTimer", 0);
},
};
diff --git a/app/components/EditRecipe.vue b/app/components/EditRecipe.vue
index 516b4c76..0a54e8fd 100644
--- a/app/components/EditRecipe.vue
+++ b/app/components/EditRecipe.vue
@@ -1,15 +1,11 @@
-
-
-
+
+
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
@@ -128,7 +132,8 @@
:text="getTitleCount('ings', 'ingredients')"
class="sectionTitle"
/>
-
-
+
@@ -178,7 +184,8 @@
:text="getTitleCount('inss', 'instructions')"
class="sectionTitle"
/>
-
-
+
@@ -205,32 +213,36 @@
:text="getTitleCount('cmbs', 'combinations')"
class="sectionTitle"
/>
-
-
+
-
@@ -241,52 +253,53 @@
/>
-
-
+
+
-
-
+
-
+
-
@@ -294,7 +307,6 @@
diff --git a/app/components/GroceryList.vue b/app/components/GroceryList.vue
deleted file mode 100644
index 83dab81f..00000000
--- a/app/components/GroceryList.vue
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/components/MealPlanner.vue b/app/components/MealPlanner.vue
index 179e54d2..e37bca00 100644
--- a/app/components/MealPlanner.vue
+++ b/app/components/MealPlanner.vue
@@ -1,112 +1,146 @@
-
+
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
-
+
-
+
+
+
-
diff --git a/app/components/ViewRecipe.vue b/app/components/ViewRecipe.vue
index 5742d458..c89ae113 100644
--- a/app/components/ViewRecipe.vue
+++ b/app/components/ViewRecipe.vue
@@ -1,16 +1,21 @@
-
-
-
-
+
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
-
-
+
+
-
+
-
-
-
-
+
+
-
-
-
-
-
+
+
+
-
-
-
+
-
+
+
+
+
+ null"
+ >
+
-
-
+
-
-
-
+
+
+
(object.cancel = true)"
+ @tap="closePhoto"
backgroundColor="black"
stretch="aspectFit"
@loaded="onImgViewLoad"
@@ -243,6 +265,7 @@
class="photoviewer"
/>
+
@@ -255,13 +278,13 @@ import {
Utils,
Span,
FormattedString,
- Label,
Observable,
Screen,
CoreTypes,
+ WebView,
} from "@nativescript/core";
+import { RLabel } from "~/rtl-ui";
import { localize } from "@nativescript/localize";
-const intl = require("nativescript-intl");
import { mapActions, mapState } from "vuex";
import CookingTimer from "./CookingTimer.vue";
import EditRecipe from "./EditRecipe.vue";
@@ -269,17 +292,24 @@ import Action from "./modals/Action.vue";
import Toast from "./sub/Toast.vue";
import Prompt from "./modals/Prompt.vue";
import * as utils from "~/shared/utils";
+const Intl = require("nativescript-intl");
+let barTimer;
+declare const android: any;
+
export default {
components: { Toast },
- props: ["filterTrylater", "recipeID"],
+ props: ["filterTrylater", "recipeID", "yieldQuantity"],
data() {
return {
- busy: false,
+ busyEdit: 0,
+ busyDup: 0,
yieldMultiplier: 1,
recipe: null,
currentRecipeID: this.recipeID,
scrollview: null,
appbar: null,
+ sidebar: null,
+ toastbar: null,
ingcon: null,
inscon: null,
cmbcon: null,
@@ -290,13 +320,15 @@ export default {
checked: 0,
stepsDid: 0,
toast: null,
- photoOpen: false,
- showTitleArr: [false, false, false, false],
+ photoOpen: 0,
+ showTitleArr: [0, 0, 0, 0],
sticky: null,
+ view: null,
+ wv: null,
};
},
computed: {
- ...mapState(["icon", "recipes"]),
+ ...mapState(["icon", "recipes", "RTL"]),
tempYieldQuantity() {
return Math.abs(this.yieldMultiplier) > 0
? Math.abs(parseFloat(this.yieldMultiplier))
@@ -320,29 +352,38 @@ export default {
}
return val;
},
+ hasPrinterSupport() {
+ return utils.Printer.isSupported();
+ },
},
methods: {
- ...mapActions([
- "toggleStateAction",
- "setComponent",
- "setRatingAction",
- "toggleCartAction",
- ]),
- onPageLoad({ object }) {
+ ...mapActions(["toggleStateAction", "setRatingAction", "toggleCartAction"]),
+ pgLoad({ object }) {
+ this.busyDup = this.busyEdit = this.photoOpen = 0;
object.bindingContext = new Observable();
- this.busy = this.photoOpen = false;
- this.setComponent("ViewRecipe");
if (this.yieldMultiplier == this.recipe.yieldQuantity)
this.yieldMultiplier = this.recipe.yieldQuantity;
- this.keepScreenOn(true);
+ utils.keepScreenOn(1);
this.syncCombinations();
+ this.view = object.page.getViewById("printview");
},
onPageUnload() {
- this.keepScreenOn(false);
+ utils.keepScreenOn(0);
},
- onAppBarLoad({ object }) {
+ sbload({ object }) {
+ this.sidebar = object;
+ },
+ abLoad({ object }) {
this.appbar = object;
},
+ tbLoad({ object }) {
+ this.toastbar = object;
+ this.recipe.tried && this.recipe.lastTried && this.showLastTried();
+ },
+ wvLoad({ object }) {
+ this.wv = object;
+ utils.updateLocale();
+ },
onIngsLoad({ object }) {
this.ingcon = object;
},
@@ -366,24 +407,22 @@ export default {
this.imgView = object;
this.imgView.visibility = "collapsed";
this.imgView.top = 24;
- this.imgView.left = Screen.mainScreen.widthDIPs - 112;
+ this.imgView.left = this.RTL ? 16 : Screen.mainScreen.widthDIPs - 112;
},
onStickyLoad({ object }) {
this.sticky = object;
},
- fixTitle({ object }, swipeUp: boolean): void {
+ fixTitle(object, swipeUp: boolean): void {
let ingL = this.recipe.ingredients.length;
let insL = this.recipe.instructions.length;
let cmbL = this.recipe.combinations.length;
let notL = this.recipe.notes.length;
-
const isTop = (label): boolean => {
let pos = label.getLocationRelativeTo(object).y;
return label === this.cmbcon || label === this.notesT
? pos < 0
: pos + 32 < 0;
};
-
const setVisibleTitle = (n: number): void => {
let arr = [ingL, insL, cmbL, notL];
this.showTitleArr = Array.from(
@@ -391,7 +430,6 @@ export default {
(v, i) => (v = arr[i] ? i < n : false)
);
};
-
if (swipeUp) {
if (ingL && !this.showTitleArr[0] && isTop(this.ingcon))
setVisibleTitle(1);
@@ -412,45 +450,71 @@ export default {
setVisibleTitle(0);
}
},
- onScroll(args) {
+ svScroll({ object, scrollY }) {
let swipeUp: boolean;
- let y = args.scrollY;
+ let y = scrollY;
if (y) {
swipeUp = y > this.scrollPos;
this.scrollPos = Math.abs(y);
- this.fixTitle(args, swipeUp);
+ this.fixTitle(object, swipeUp);
if (!this.toast) {
let ab = this.appbar.translateY;
- if (swipeUp && ab == 0)
- this.appbar.animate({
- translate: { x: 0, y: 64 },
- duration: 250,
- curve: CoreTypes.AnimationCurve.ease,
- });
- else if (!swipeUp && ab == 64)
- this.appbar.animate({
- translate: { x: 0, y: 0 },
- duration: 250,
- curve: CoreTypes.AnimationCurve.ease,
- });
+ if (swipeUp && ab == 0) this.hideBars();
+ else if (!swipeUp && ab == 64) this.showBars();
}
}
},
- // HELPERS
+ showBars() {
+ this.appbar.animate({
+ translate: { x: 0, y: 0 },
+ duration: 200,
+ curve: CoreTypes.AnimationCurve.ease,
+ });
+ this.sidebar.animate({
+ translate: { x: 0, y: 0 },
+ duration: 200,
+ curve: CoreTypes.AnimationCurve.ease,
+ });
+ },
+ hideBars() {
+ this.appbar.animate({
+ translate: { x: 0, y: 64 },
+ duration: 200,
+ curve: CoreTypes.AnimationCurve.ease,
+ });
+ this.sidebar.animate({
+ translate: { x: this.RTL ? -64 : 64, y: 0 },
+ duration: 200,
+ curve: CoreTypes.AnimationCurve.ease,
+ });
+ },
+
+ // Helpers
getTitleCount(title, type) {
- let count = this.recipe[type].length;
- let selected = null;
+ let c = this.recipe[type].length;
+ let s = null;
switch (title) {
case "ings":
- selected = this.checked;
+ s = this.checked;
break;
case "inss":
- selected = this.stepsDid;
+ s = this.stepsDid;
break;
}
- let text = selected ? ` (${selected}/${count})` : ` (${count})`;
+ c = this.getLocaleN(c);
+ s = s && this.getLocaleN(s);
+ let text = s ? ` (${s}/${c})` : ` (${c})`;
return localize(title) + text;
},
+ getIngredientItem(item) {
+ return `${
+ this.roundedQuantity(item.quantity)
+ ? this.roundedQuantity(item.quantity) + " "
+ : ""
+ }${this.roundedQuantity(item.quantity) ? localize(item.unit) + " " : ""}${
+ item.item
+ }`;
+ },
changeYield() {
this.$showModal(Prompt, {
props: {
@@ -485,31 +549,25 @@ export default {
);
},
showLastTried() {
- this.toast = localize("triedInfo", this.niceDate(this.recipe.lastTried));
- utils.timer(10, (val) => {
- if (!val) this.toast = val;
+ this.animateBar(this.appbar, 0).then(() => {
+ this.toast = localize(
+ "triedInfo",
+ this.niceDate(this.recipe.lastTried)
+ );
+ this.animateBar(this.toastbar, 1);
+ let a = 10;
+ clearInterval(barTimer);
+ barTimer = setInterval(() => a-- < 1 && this.hideBar(), 1000);
});
},
- hideLastTried({ object }) {
- object
- .animate({
- opacity: 0,
- translate: { x: 0, y: 64 },
- duration: 250,
- curve: CoreTypes.AnimationCurve.ease,
- })
- .then(() => {
- this.showUndo = false;
- this.appbar.translateY = 64;
- this.appbar.animate({
- translate: { x: 0, y: 0 },
- duration: 250,
- curve: CoreTypes.AnimationCurve.ease,
- });
- object.opacity = 1;
- object.translateY = 0;
- this.toast = null;
- });
+ hideBar() {
+ clearInterval(barTimer);
+ this.animateBar(this.toastbar, 0).then(() => {
+ this.toast = null;
+ this.photoOpen
+ ? (this.appbar.opacity = 1)
+ : this.animateBar(this.appbar, 1);
+ });
},
// getMeasure(value: number, unit: string) {
// let vm = this;
@@ -560,14 +618,6 @@ export default {
) / 100
);
},
- keepScreenOn(boolean) {
- let activity =
- Application.android.foregroundActivity ||
- Application.android.startActivity;
- let window = activity.getWindow();
- let flag = android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
- boolean ? window.addFlags(flag) : window.clearFlags(flag);
- },
formattedTime(time) {
let t = time.split(":");
let h = parseInt(t[0]);
@@ -577,15 +627,13 @@ export default {
return h ? (m ? `${h} ${hr} ${m} ${min}` : `${h} ${hr}`) : `${m} ${min}`;
},
formattedDate(date) {
- let d = new Date(date);
- var dateFormat = new intl.DateTimeFormat(null, {
+ return new Intl.DateTimeFormat(null, {
year: "numeric",
month: "long",
day: "numeric",
hour: "numeric",
minute: "numeric",
- }).format(d);
- return `${dateFormat}`;
+ }).format(new Date(date));
},
isValidURL(string) {
let pattern = new RegExp("^https?|^www", "ig");
@@ -654,26 +702,38 @@ export default {
this.inscon.getChildAt(i).className = "instruction";
}
},
+ getDates() {
+ let u = `${localize("Last updated")}: ${this.formattedDate(
+ this.recipe.lastModified
+ )}`;
+ let c = `${localize("Created")}: ${this.formattedDate(
+ this.recipe.created
+ )}`;
+ return {
+ u,
+ c,
+ uc: u + "\n" + c,
+ };
+ },
- // NAVIGATION HANDLERS
+ // NavigationHandlers
editRecipe() {
- this.busy = true;
+ this.busyEdit = 1;
this.$navigateTo(EditRecipe, {
props: {
- navigationFromView: true,
filterTrylater: this.filterTrylater,
recipeID: this.currentRecipeID,
},
- // backstackVisible: false,
+ animated: false,
});
},
viewCombination(combination) {
this.scrollview.scrollToVerticalOffset(0, true);
this.recipe = this.recipes.filter((e) => e.id === combination)[0];
- this.showTitleArr = new Array(4).fill(false);
+ this.showTitleArr = new Array(4).fill(0);
this.clearChecks();
this.clearSteps();
- this.recipe.ingredients.forEach(() => this.checks.push(false));
+ this.recipe.ingredients.forEach(() => this.checks.push(0));
this.currentRecipeID = combination;
this.syncCombinations();
this.createNotes();
@@ -681,7 +741,7 @@ export default {
this.recipe.tried && this.recipe.lastTried && this.showLastTried();
},
- // SHARE ACTION
+ // ShareAction
shareHandler() {
if (this.recipe.image) {
this.$showModal(Action, {
@@ -696,7 +756,7 @@ export default {
break;
case "pht":
ImageSource.fromFile(this.recipe.image).then((res) =>
- utils.shareImage(res, localize("srpu"))
+ utils.shareImage(res, localize("srpu"), this.recipe.title)
);
break;
}
@@ -769,7 +829,7 @@ export default {
utils.shareText(shareContent, localize("sru"));
},
- // DATA HANDLERS
+ // DataHandlers
toggle(key: string, setDate: boolean) {
this.toggleStateAction({
id: this.currentRecipeID,
@@ -787,7 +847,7 @@ export default {
}
},
- // SHOPPINGLIST
+ // ShoppingList
toggleCart() {
if (!this.recipe.inBag) {
} else {
@@ -797,10 +857,10 @@ export default {
});
},
- // NOTES
+ // Notes
createNote(note) {
let regex = /(https?:\/\/[^\s]+)/g;
- const lbl = new Label();
+ const lbl = new RLabel();
lbl.className = "note";
lbl.textWrap = true;
let fString = new FormattedString();
@@ -851,7 +911,8 @@ export default {
} else this.$navigateBack();
},
viewPhoto() {
- this.photoOpen = true;
+ this.hideBars();
+ this.photoOpen = 1;
this.hijackBackEvent();
let pv = this.imgView;
pv.visibility = "visible";
@@ -865,16 +926,16 @@ export default {
pv.animate({
width: sw,
height: sw,
- translate: { x: 112 - sw, y: (sh - sw) / 3 },
- duration: 250,
+ translate: { x: this.RTL ? -16 : 112 - sw, y: (sh - sw) / 3 },
+ duration: 200,
curve: CoreTypes.AnimationCurve.ease,
})
)
.then(() =>
pv.animate({
height: sh,
- translate: { x: -sw + 112, y: -((sh - sw) / 6) },
- duration: 250,
+ translate: { x: this.RTL ? -16 : 112 - sw, y: -((sh - sw) / 6) },
+ duration: 200,
curve: CoreTypes.AnimationCurve.ease,
})
);
@@ -886,8 +947,8 @@ export default {
pv.animate({
width: sw,
height: sw,
- translate: { x: 112 - sw, y: (sh - sw) / 3 },
- duration: 250,
+ translate: { x: this.RTL ? -16 : 112 - sw, y: (sh - sw) / 3 },
+ duration: 200,
curve: CoreTypes.AnimationCurve.ease,
})
.then(() =>
@@ -895,7 +956,7 @@ export default {
width: 96,
height: 96,
translate: { x: 0, y: 0 },
- duration: 250,
+ duration: 200,
curve: CoreTypes.AnimationCurve.ease,
})
)
@@ -907,37 +968,162 @@ export default {
)
.then(() => {
pv.visibility = "collapsed";
- this.photoOpen = false;
+ this.photoOpen = 0;
this.releaseBackEvent();
+ this.showBars();
});
},
- navigateBack() {
- this.photoOpen ? this.closePhoto() : this.$navigateBack();
- },
- //TIMERS
+ // Timers
openCookingTimer() {
this.$navigateTo(CookingTimer, {
props: {
recipeID: this.recipe.id,
},
+ animated: false,
});
},
- //HELPERS
+
+ //DuplicateRecipe
+ duplicateRecipe() {
+ this.busyDup = 1;
+ let dupRecipe = Object.assign({}, this.recipe);
+ dupRecipe.id = utils.getRandomID(0);
+ dupRecipe.title = dupRecipe.title + " " + localize("cpy");
+ this.$navigateTo(EditRecipe, {
+ props: {
+ dupRecipe,
+ },
+ animated: false,
+ });
+ },
+
+ // Print
+ prepareHTML() {
+ let r = this.recipe;
+ const head = `
EnRecipes - Recipe for Print `;
+ const getStarRating = () => {
+ let rate = ` `;
+ let unrate = ` `;
+ return rate.repeat(r.rating) + unrate.repeat(5 - r.rating);
+ };
+ const img = r.image ? ` ` : "";
+ const getIngs = () => {
+ let ing = [];
+ r.ingredients.forEach((e) => {
+ ing.push(`${this.getIngredientItem(e)} `);
+ });
+ return ing.join("");
+ };
+ const getIns = () => {
+ let ins = [];
+ r.instructions.forEach((e) => {
+ ins.push(`${e} `);
+ });
+ return ins.join("");
+ };
+ const getCmbs = () => {
+ let cmb = [];
+ r.combinations.forEach((e) => {
+ cmb.push(`${this.getCombinationTitle(e)}
`);
+ });
+ return cmb.join("");
+ };
+ const getNotes = () => {
+ let regex = /(https?:\/\/[^\s]+)/g;
+ let n = [];
+ const createSpan = (val, isUrl) => {
+ return isUrl
+ ? `${val} `
+ : val;
+ };
+ r.notes.forEach((e) => {
+ let arr = e.split(regex);
+ let single = [];
+ arr.forEach((f) => {
+ single.push(createSpan(f, regex.test(f)));
+ });
+ n.push(`${single.join("")}
`);
+ });
+ return n.join("");
+ };
+ return `${head}${localize(
+ "cui"
+ )}
${r.cuisine}
${localize("cat")}
${
+ r.category
+ }
${
+ r.tags.length
+ ? `${localize(
+ "ts"
+ )}
${this.getTags(r.tags)}
`
+ : ""
+ } ${
+ this.hasTime(r.prepTime) || this.hasTime(r.cookTime)
+ ? `${
+ this.hasTime(r.prepTime)
+ ? `
${localize("prepT")}
${this.formattedTime(
+ r.prepTime
+ )}
`
+ : ""
+ } ${
+ this.hasTime(r.cookTime)
+ ? `
${localize("cookT")}
${this.formattedTime(
+ r.cookTime
+ )}
`
+ : ""
+ }
`
+ : ""
+ }${localize("yld")}
${
+ this.tempYieldQuantity
+ } ${localize(r.yieldUnit)}
${localize(
+ "Difficulty level"
+ )}
${r.difficulty}
${
+ r.ingredients.length
+ ? `${this.getTitleCount("ings", "ingredients")} `
+ : ""
+ }${
+ r.instructions.length
+ ? `${this.getTitleCount("inss", "instructions")} `
+ : ""
+ }${getIns()} ${
+ r.combinations.length
+ ? `${this.getTitleCount("cmbs", "combinations")} `
+ : ""
+ } ${getCmbs()} ${
+ r.notes.length ? `${this.getTitleCount("nos", "notes")} ` : ""
+ } ${getNotes()}${this.getDates().u}
${
+ this.getDates().c
+ }
+
+`;
+ },
+ printView() {
+ let wv = this.wv as WebView;
+ const fileName = `${this.recipe.title} - ${localize("EnRecipes")}`;
+ wv.src = this.prepareHTML();
+ wv.once("loadFinished", () =>
+ utils.Printer.print(wv, fileName).then(() => (wv.src = null))
+ );
+ },
+
+ // Helpers
touchYield({ object, action }) {
object.className = action.match(/down|move/)
- ? "value clickable fade"
- : "value clickable";
+ ? "value accent fade"
+ : "value accent";
if (action == "up") this.changeYield();
},
},
created() {
this.recipe = this.recipes.filter((e) => e.id === this.currentRecipeID)[0];
- this.recipe.ingredients.forEach((e) => this.checks.push(false));
+ this.recipe.ingredients.forEach((e) => this.checks.push(0));
},
mounted() {
- this.yieldMultiplier = this.recipe.yieldQuantity;
- this.recipe.tried && this.recipe.lastTried && this.showLastTried();
+ this.yieldMultiplier = this.yieldQuantity || this.recipe.yieldQuantity;
},
};
diff --git a/app/components/modals/Action.vue b/app/components/modals/Action.vue
index 5ec66390..b935cd09 100644
--- a/app/components/modals/Action.vue
+++ b/app/components/modals/Action.vue
@@ -2,14 +2,14 @@
-
+
-
-
+
-
+
@@ -54,7 +53,7 @@ import Confirm from "./Confirm.vue";
interface IData {
newList: unknown[];
- stretch: boolean;
+ stretch: number;
listHeight: number;
}
@@ -72,26 +71,30 @@ export default {
type: String,
required: false,
},
+ selected: {
+ type: String,
+ required: false,
+ },
},
data(): IData {
return {
newList: this.list,
- stretch: false,
+ stretch: 0,
listHeight: 0,
};
},
computed: {
- ...mapState(["sortType", "icon", "appTheme"]),
+ ...mapState(["sortType", "icon", "theme", "RTL"]),
},
methods: {
- ...mapActions(["removeListItemAction"]),
+ ...mapActions(["removeListItemAction", "deleteTimerPreset"]),
localized(item: string): string {
return this.title !== "lang" ? localize(item) : item;
},
tapAction(item: string): void {
this.$modal.close(item);
},
- deletionConfirmation(description: string): void {
+ removeConfirmation(description: string): void {
return this.$showModal(Confirm, {
props: {
title: "conf",
@@ -101,13 +104,24 @@ export default {
},
});
},
+ deletionConfirmation(description: string): void {
+ return this.$showModal(Confirm, {
+ props: {
+ title: "conf",
+ description,
+ cancelButtonText: "cBtn",
+ okButtonText: "dBtn",
+ },
+ });
+ },
removeItem(item: string): void {
let vm = this;
+ let index = this.newList.findIndex((e) => e === item);
let localizedItem = `"${localize(item)}"`;
function removeListItem(listName: string, desc: string): void {
- vm.deletionConfirmation(`${localize(desc, localizedItem)}`).then(
+ vm.removeConfirmation(`${localize(desc, localizedItem)}`).then(
(action: boolean) => {
- if (action != null && action)
+ if (action)
vm.removeListItemAction({
item,
listName,
@@ -115,6 +129,16 @@ export default {
}
);
}
+ function deleteTimerPreset(): void {
+ vm.deletionConfirmation(`${localize("delPrst", `"${item}"`)}`).then(
+ (action: boolean) => {
+ if (action) {
+ vm.deleteTimerPreset(index);
+ vm.newList.splice(index, 1);
+ }
+ }
+ );
+ }
switch (this.title) {
case "cui":
removeListItem("cuisines", "rmCuiInfo");
@@ -128,12 +152,18 @@ export default {
case "Unit":
removeListItem("units", "rmUInfo");
break;
+ case "prsts":
+ deleteTimerPreset();
+ break;
}
},
touch({ object, action }): void {
+ let classes = object.className;
object.className = action.match(/down|move/)
- ? "listItem fade"
- : "listItem";
+ ? !classes.includes("fade")
+ ? classes + " fade"
+ : classes
+ : classes.replace(/ fade/g, "");
},
},
created() {
@@ -145,7 +175,7 @@ export default {
if (modalHeight < usableHeight) {
this.listHeight = listHeight;
} else {
- this.stretch = true;
+ this.stretch = 1;
}
},
};
diff --git a/app/components/modals/ActionWithSearch.vue b/app/components/modals/ActionWithSearch.vue
index 7bff6e75..b837d020 100644
--- a/app/components/modals/ActionWithSearch.vue
+++ b/app/components/modals/ActionWithSearch.vue
@@ -2,20 +2,25 @@
-
+
-
+
-
-
+
-
+
@@ -62,7 +67,7 @@ export default {
};
},
computed: {
- ...mapState(["icon", "appTheme"]),
+ ...mapState(["icon", "theme", "RTL"]),
filteredRecipes() {
return this.recipes
.map((e, i) => {
@@ -82,8 +87,8 @@ export default {
tapAction(recipe) {
this.$modal.close(recipe.id);
},
- centerLabel(args) {
- args.object.android.setGravity(16);
+ centerLabel({ object }) {
+ object.android.setGravity(16);
},
recipeFilter(e) {
let searchQuery = this.searchQuery.toLowerCase();
@@ -98,7 +103,7 @@ export default {
touch({ object, action }, recipe) {
object.className = action.match(/down|move/)
? "listItem fade"
- : "listItem";
+ : "listItem ";
if (action == "up") this.tapAction(recipe);
},
},
diff --git a/app/components/modals/Confirm.vue b/app/components/modals/Confirm.vue
index 14ceee36..802ad536 100644
--- a/app/components/modals/Confirm.vue
+++ b/app/components/modals/Confirm.vue
@@ -2,31 +2,31 @@
-
+
-
+
-
+
@@ -53,7 +53,7 @@ export default {
},
},
computed: {
- ...mapState(["icon", "appTheme"]),
+ ...mapState(["icon", "theme", "RTL"]),
},
};
diff --git a/app/components/modals/DMYPicker.vue b/app/components/modals/DMYPicker.vue
new file mode 100644
index 00000000..e1982df0
--- /dev/null
+++ b/app/components/modals/DMYPicker.vue
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/modals/Filter.vue b/app/components/modals/Filter.vue
index ca777367..795cdb80 100644
--- a/app/components/modals/Filter.vue
+++ b/app/components/modals/Filter.vue
@@ -1,28 +1,32 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
-
+
@@ -61,7 +70,7 @@ export default {
localCuisine: null,
localCategory: null,
localTag: null,
- reset: false,
+ reset: 0,
};
},
computed: {
@@ -70,10 +79,11 @@ export default {
"recipes",
"cuisines",
"categories",
- "selectedCuisine",
- "selectedCategory",
- "selectedTag",
- "appTheme",
+ "selCuisine",
+ "selCategory",
+ "selTag",
+ "theme",
+ "RTL",
]),
pathList() {
let arr = [
@@ -163,18 +173,12 @@ export default {
},
},
methods: {
- ...mapActions([
- "setComponent",
- "setCuisine",
- "setCategory",
- "setTag",
- "clearFilter",
- ]),
- onPageLoad(args) {
+ ...mapActions(["setCuisine", "setCategory", "setTag", "clearFilter"]),
+ pgLoad(args) {
this.transparentPage(args);
- this.localCuisine = this.selectedCuisine;
- this.localCategory = this.selectedCategory;
- this.localTag = this.selectedTag;
+ this.localCuisine = this.selCuisine;
+ this.localCategory = this.selCategory;
+ this.localTag = this.selTag;
if (this.localCuisine) this.filterType = "category";
if (this.localCategory && this.localTag) this.filterType = "tag";
this.scrollToRight();
@@ -198,14 +202,14 @@ export default {
setTimeout(
() =>
this.scrollview.scrollToHorizontalOffset(
- this.scrollview.scrollableWidth,
+ this.RTL ? 0 : this.scrollview.scrollableWidth,
true
),
10
);
},
setRecipeFilter(item) {
- this.reset = false;
+ this.reset = 0;
switch (this.filterType) {
case "cuisine":
this.localCuisine = item;
@@ -225,27 +229,26 @@ export default {
this.setCuisine(this.localCuisine);
this.setCategory(this.localCategory);
this.setTag(this.localTag);
- this.filterFavourites = this.filterTrylater = false;
- if (this.reset) this.setComponent("EnRecipes");
- else this.setComponent("Filtered recipes");
- this.$modal.close();
+ this.filterFavourites = this.filterTrylater = 0;
+ this.$modal.close(this.reset);
},
resetFilter() {
this.filterType = "cuisine";
this.localCuisine = this.localCategory = this.localTag = null;
- this.reset = true;
+ this.reset = 1;
},
touch({ object, action }, item) {
object.className = action.match(/down|move/)
? "listItem fade"
- : "listItem";
+ : "listItem ";
if (action == "up") this.setRecipeFilter(item);
},
touchSelector({ object, action }, type) {
let selected = this.filterType == type;
+ let classes = `segment ${this.RTL ? "rtl" : ""} `;
object.className = action.match(/down|move/)
- ? `segment ${selected ? "select" : "fade"}`
- : `segment ${selected && "select"}`;
+ ? `${classes}${selected ? "select" : "fade"}`
+ : `${classes}${selected && "select"}`;
if (action == "up") this.setFilterType(type);
},
},
diff --git a/app/components/modals/Prompt.vue b/app/components/modals/Prompt.vue
index f686309f..8a3c9fb9 100644
--- a/app/components/modals/Prompt.vue
+++ b/app/components/modals/Prompt.vue
@@ -2,24 +2,35 @@
-
+
+
-
+
-
+
@@ -37,20 +48,23 @@ import { Utils } from "@nativescript/core";
import { localize } from "@nativescript/localize";
import { mapState } from "vuex";
export default {
- props: ["title", "hint", "placeholder", "action"],
+ props: ["title", "type", "hint", "placeholder", "action"],
data() {
return {
text: null,
};
},
computed: {
- ...mapState(["icon", "appTheme"]),
+ ...mapState(["icon", "theme", "RTL"]),
},
methods: {
focusField({ object }) {
+ this.setGravity(object);
let a = this.placeholder;
typeof a == "number"
? (object.keyboardType = "number")
+ : this.type
+ ? ""
: (object.autocapitalizationType = "words");
object.hint = this.hint;
object.focus();
diff --git a/app/components/modals/TimePickerHM.vue b/app/components/modals/TimePickerHM.vue
index 48882d9c..a5fa110c 100644
--- a/app/components/modals/TimePickerHM.vue
+++ b/app/components/modals/TimePickerHM.vue
@@ -2,45 +2,43 @@
-
-
+
-
-
+
+
-
+
@@ -49,7 +47,7 @@
import { mapState } from "vuex";
import { localize } from "@nativescript/localize";
export default {
- props: ["title", "selectedHr", "selectedMin", "action"],
+ props: ["title", "selectedHr", "selectedMin"],
data() {
return {
hrs: [],
@@ -59,7 +57,7 @@ export default {
};
},
computed: {
- ...mapState(["icon", "appTheme"]),
+ ...mapState(["icon", "theme", "RTL"]),
hrsList() {
let h = [...Array(24).keys()];
this.hrs = h;
diff --git a/app/components/modals/TimePickerHMS.vue b/app/components/modals/TimePickerHMS.vue
index 8c231a96..27b7f5a0 100644
--- a/app/components/modals/TimePickerHMS.vue
+++ b/app/components/modals/TimePickerHMS.vue
@@ -2,20 +2,25 @@
-
+
-
-
+
-
+
-
+
-
+
@@ -71,7 +81,7 @@ export default {
};
},
computed: {
- ...mapState(["icon", "appTheme"]),
+ ...mapState(["icon", "theme", "RTL"]),
hrsList() {
let h = [...Array(24).keys()];
this.hrs = h;
diff --git a/app/components/modals/TimerReminder.vue b/app/components/modals/TimerReminder.vue
new file mode 100644
index 00000000..bd6d116f
--- /dev/null
+++ b/app/components/modals/TimerReminder.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/settings/About.vue b/app/components/settings/About.vue
index d7cd9afe..0cc63e92 100644
--- a/app/components/settings/About.vue
+++ b/app/components/settings/About.vue
@@ -1,12 +1,7 @@
-
-
-
+
+
+
@@ -23,20 +18,26 @@
-
-
-
-
+
+
+
+
-
+
-
+
@@ -46,7 +47,7 @@ import { mapState } from "vuex";
export default {
computed: {
- ...mapState(["icon"]),
+ ...mapState(["icon", "RTL"]),
items() {
return [
{},
@@ -69,8 +70,7 @@ export default {
{
icon: "priv",
title: "priv",
- url:
- "https://github.com/vishnuraghavb/EnRecipes/blob/main/PRIVACY.md",
+ url: "https://github.com/vishnuraghavb/EnRecipes/blob/main/PRIVACY.md",
},
{
icon: "don",
@@ -95,7 +95,7 @@ export default {
},
},
methods: {
- onPageLoad({ object }) {
+ pgLoad({ object }) {
object.bindingContext = new Observable();
},
// HELPERS
diff --git a/app/components/settings/AppSettings.vue b/app/components/settings/AppSettings.vue
index 1cd499db..7980c93b 100644
--- a/app/components/settings/AppSettings.vue
+++ b/app/components/settings/AppSettings.vue
@@ -1,17 +1,17 @@
-
-
+
+
-
+
-
+
\ No newline at end of file
diff --git a/app/components/sub/Timer.vue b/app/components/sub/Timer.vue
index d1f5f912..7caa801e 100644
--- a/app/components/sub/Timer.vue
+++ b/app/components/sub/Timer.vue
@@ -1,193 +1,280 @@
-
-
-
-
-
+
+
+
-
-
-
+
+
\ No newline at end of file
diff --git a/app/fonts/enrecipes.ttf b/app/fonts/enrecipes.ttf
index 8aff549f..d315bebb 100644
Binary files a/app/fonts/enrecipes.ttf and b/app/fonts/enrecipes.ttf differ
diff --git a/app/i18n/de.json b/app/i18n/de.json
index 4fd46841..137f1136 100644
--- a/app/i18n/de.json
+++ b/app/i18n/de.json
@@ -290,13 +290,13 @@
"yld": "Ergebnis",
"buto": "Gesichert in %s",
"sysDefB": "Systemstandard + schwarz",
- "tmr": "Eieruhr %s",
+ "tmr": "Kurzzeitwecker %s",
"strtBtn": "START",
- "ntmr": "Neue Eieruhr",
- "timer": "Eieruhr",
+ "ntmr": "Neuer Kurzzeitwecker",
+ "timer": "Kurzzeitwecker",
"sec": "s",
- "tmrvbrt": "Eieruhrvibration",
- "tmrSnd": "Eieruhrton",
+ "tmrvbrt": "Kurzzeitweckervibration",
+ "tmrSnd": "Kurzzeitweckerton",
"aTPrst": "Zu Voreinstellungen hinzugefügt",
"fwr": "für welches Rezept?",
"prstBtn": "Voreinstellungen",
@@ -308,17 +308,17 @@
"minute": "Minute",
"dlyDur": "Verzögerungsdauer",
"delay": "Verzögerung",
- "tmrRm": "Eieruhr entfernt",
+ "tmrRm": "Kurzzeitwecker entfernt",
"notifSetg": "Benachrichtigungseinstellungen",
"delPrst": "Du bist dabei, %s aus den Voreinstellungen zu löschen",
"prsts": "Voreinstellungen",
"ttv": "Zum Anzeigen tippen",
- "dismissAll": "Alle Eieruhren verwerfen",
+ "dismissAll": "Alle Kurzzeitwecker verwerfen",
"dismiss": "Verwerfen",
- "texp": "%s Eieruhren abgelaufen",
+ "texp": "%s Kurzzeitwecker abgelaufen",
"wDBy": "%1$s wurde um %2$s verzögert",
"prstTU": "Voreingestellte Zeit aktualisiert",
- "ccwt": "Koche selbstbewusst mit Eieruhren!",
+ "ccwt": "Koche selbstbewusst mit Kurzzeitweckern!",
"gtD": "Zu Datum gehen",
"random": "Zufällig",
"oAP": "%1$s laufend, %2$s angehalten",
@@ -333,5 +333,16 @@
"tue": "Dienstag",
"mon": "Montag",
"sun": "Sonntag",
- "calVM": "Modus der Kalenderansicht"
+ "calVM": "Modus der Kalenderansicht",
+ "d": "Tag",
+ "wk": "Woche",
+ "mnth": "Monat",
+ "nvr": "Nie",
+ "otaw": "Älter als eine Woche",
+ "otam": "Älter als ein Monat",
+ "otay": "Älter als ein Jahr",
+ "admp": "Mahlzeitenpläne automatisch löschen",
+ "plsCrt": "Verwende die Plus-Taste, um einen zu erstellen",
+ "ehwmp": "Iss gesund mit Essensplänen!",
+ "selMT": "Mahlzeitentyp auswählen"
}
diff --git a/app/i18n/en-GB.default.json b/app/i18n/en-GB.default.json
index 2efc53fe..b54be090 100644
--- a/app/i18n/en-GB.default.json
+++ b/app/i18n/en-GB.default.json
@@ -336,5 +336,14 @@
"cpy": "copy",
"tdy": "Today",
"tmrw": "Tomorrow",
- "ystr": "Yesterday"
+ "ystr": "Yesterday",
+ "selMT": "Select meal type",
+ "ehwmp": "Eat healthy with meal plans!",
+ "plsCrt": "Use the plus button to create one",
+ "admp": "Auto-delete meal plans",
+ "otay": "Older than a year",
+ "otam": "Older than a month",
+ "otaw": "Older than a week",
+ "nvr": "Never",
+ "add": "Add"
}
diff --git a/app/i18n/en-IN.json b/app/i18n/en-IN.json
index e7dcaf4d..bbb4e0d2 100644
--- a/app/i18n/en-IN.json
+++ b/app/i18n/en-IN.json
@@ -333,5 +333,16 @@
"mon": "Monday",
"sun": "Sunday",
"calVM": "Calendar view mode",
- "oAP": "%1$s ongoing, %2$s paused"
+ "oAP": "%1$s ongoing, %2$s paused",
+ "d": "Day",
+ "wk": "Week",
+ "mnth": "Month",
+ "nvr": "Never",
+ "otaw": "Older than a week",
+ "otam": "Older than a month",
+ "otay": "Older than a year",
+ "admp": "Auto delete meal plans",
+ "plsCrt": "Use the plus button to create one",
+ "ehwmp": "Eat healthy with meal plans!",
+ "selMT": "Select meal type"
}
diff --git a/app/i18n/en-US.json b/app/i18n/en-US.json
index aacff72b..b15a9c9c 100644
--- a/app/i18n/en-US.json
+++ b/app/i18n/en-US.json
@@ -333,5 +333,16 @@
"mon": "Monday",
"sun": "Sunday",
"calVM": "Calendar view mode",
- "oAP": "%1$s ongoing, %2$s paused"
+ "oAP": "%1$s ongoing, %2$s paused",
+ "d": "Day",
+ "wk": "Week",
+ "mnth": "Month",
+ "nvr": "Never",
+ "otaw": "Older than a week",
+ "otam": "Older than a month",
+ "otay": "Older than a year",
+ "admp": "Auto delete meal plans",
+ "plsCrt": "Use the plus button to create one",
+ "ehwmp": "Eat healthy with meal plans!",
+ "selMT": "Select meal type"
}
diff --git a/app/i18n/es.json b/app/i18n/es.json
index 6b8aa0ef..954d31dd 100644
--- a/app/i18n/es.json
+++ b/app/i18n/es.json
@@ -312,14 +312,6 @@
"tmrRm": "Temporizador eliminado",
"delPrst": "Está a punto de eliminar %s de los preajustes",
"prsts": "Preselecciones",
- "ttv": "Toca para ver",
- "dismissAll": "Descartar todos los temporizadores",
- "dismiss": "Descartar",
- "texp": "%s temporizadores expirados",
- "random": "Aleatorio",
- "ystr": "Ayer",
- "tmrw": "Mañana",
- "tdy": "Hoy",
"cpy": "copia",
"sat": "sábado",
"fri": "viernes",
@@ -328,9 +320,10 @@
"tue": "martes",
"mon": "lunes",
"sun": "domingo",
- "calVM": "Modo de vista del calendario",
- "oAP": "%1$s en curso, %2$s en pausa",
- "prstTU": "Hora preestablecida actualizada",
- "ccwt": "¡Cocine con confianza con los temporizadores!",
- "gtD": "Ir a la fecha"
+ "d": "Día",
+ "wk": "Semana",
+ "mnth": "Mes",
+ "ystr": "Ayer",
+ "tmrw": "Mañana",
+ "tdy": "Hoy"
}
diff --git a/app/i18n/fi.json b/app/i18n/fi.json
new file mode 100644
index 00000000..4f6be3ec
--- /dev/null
+++ b/app/i18n/fi.json
@@ -0,0 +1,343 @@
+{
+ "aap": "Liitä valokuva",
+ "About": "Tietoja",
+ "aBtn": "LISÄÄ",
+ "aD": "Valmista!",
+ "addCmbBtn": "LISÄÄ YHDISTELMÄ",
+ "aFBu": "Lisää resepti varmuuskopioinnin suorittamiseen",
+ "aIngBtn": "LISÄÄ AINESOSA",
+ "allCats": "Kaikki luokat",
+ "allCuis": "Kaikki keittiöt",
+ "allTs": "Kaikki tunnisteet",
+ "American": "amerikkalainen",
+ "aNBtn": "LISÄÄ UUSI",
+ "aNoBtn": "LISÄÄ HUOMAUTUS",
+ "app.name": "EnRecipes",
+ "appCrd": "Jaettu EnRecipesin kautta. Lataa se F-Droidista, IzzyOnDroidista tai Play Storesta.",
+ "Appetizers": "Alkupalat",
+ "appInfo": "EnRecipes on avoimen lähdekoodin, yksityisyyden suojaa kunnioittava digitaalinen keittokirja, jonka avulla voit luoda, hallita ja jakaa reseptejäsi",
+ "apply": "KÄYTÄ",
+ "appRst": "Sovelluksen uudelleenkäynnistys vaaditaan",
+ "April": "huhtikuu",
+ "aStpBtn": "",
+ "August": "elokuu",
+ "Barbecue": "Grilli",
+ "Beverages": "Juomat",
+ "Black": "Musta",
+ "Brazilian": "brasilialainen",
+ "Breads": "Leivät",
+ "breakfast": "Aamiainen",
+ "British": "brittiläinen",
+ "buEmp": "Varmuuskopiotiedosto on tyhjä",
+ "buFol": "Varmuuskopioiden hakemisto",
+ "buInc": "Virheellinen tai vioittunut varmuuskopiotiedosto",
+ "buInfo": "Luo ZIP-tiedoston, joka sisältää kaikki tiedot, jotka voidaan tuoda takaisin",
+ "buMod": "Varmuuskopiotiedostoa muutettiin muualla",
+ "cat": "Luokka",
+ "cBtn": "PERUUTA",
+ "Challenging": "Haastava",
+ "Chinese": "kiinalainen",
+ "clove": "kynsi",
+ "cm": "cm",
+ "cmbs": "Yhdistelmät",
+ "conBtn": "JATKA",
+ "conf": "Vahvista",
+ "cookT": "Kypsennysaika",
+ "cPic": "Rajaa kuva",
+ "Created": "Luotu",
+ "cui": "Keittiö",
+ "cup": "cup",
+ "Cup": "Kuppi",
+ "dAgo": "%s päivää sitten",
+ "Danish": "tanskalainen",
+ "Dark": "Tumma",
+ "db": "Tietokanta",
+ "dBtn": "POISTA",
+ "December": "joulukuu",
+ "delRecInfo": "Olet poistamassa reseptiä %s pysyvästi",
+ "delRecsInfo": "Olet poistamassa %s pysyvästi",
+ "Desserts": "Jälkiruoat",
+ "detailed": "Yksityiskohtainen",
+ "Difficulty level": "Vaikeustaso",
+ "dinner": "Illallinen",
+ "disBtn": "HYLKÄÄ",
+ "disc": "Tässä reseptissä on tallentamattomia muutoksia. Mitä haluaisit tehdä?",
+ "donate": "Lahjoita",
+ "dozen": "tusina",
+ "drop": "",
+ "dsp": "",
+ "Easy": "Helppo",
+ "editRec": "Muokkaa resepti",
+ "Egyptian": "egyptiläinen",
+ "English": "englantilainen",
+ "EnRecipes": "EnRecipes",
+ "expBu": "Vie koko varmuuskopio",
+ "expip": "Vienti käynnissä",
+ "expSuc": "",
+ "favourites": "",
+ "February": "helmikuu",
+ "Filipino": "",
+ "Filtered recipes": "Suodatetut reseptit",
+ "fl oz": "",
+ "fltr": "",
+ "Fluid Ounce": "",
+ "French": "ranskalainen",
+ "FRI": "pe",
+ "fsList": "Suosikkireseptisi on lueteltu täällä",
+ "g": "g",
+ "gal": "",
+ "Gallon": "",
+ "German": "saksalainen",
+ "gh": "Näytä GitHub:ssa",
+ "Gram": "gramma",
+ "Greek": "kreikkalainen",
+ "grid": "",
+ "grocery": "Ostoslista",
+ "guide": "Käyttöopas",
+ "Healthy": "Terveellinen",
+ "hr": "t.",
+ "impBu": "Tuo tietoja",
+ "impFail": "Tuonti epäonnistui",
+ "impInfo": "Tukee tämän sovelluksen viemiä täydellisiä varmuuskopioita",
+ "impip": "Tuonti käynnissä",
+ "impSuc": "Tuonti onnistui",
+ "in": "",
+ "Indian": "intialainen",
+ "ings": "Ainekset",
+ "inss": "Ohjeet",
+ "intf": "Käyttöliittymä",
+ "invFile": "Virheellinen tiedosto",
+ "Irish": "irlantilainen",
+ "it": "",
+ "Italian": "",
+ "Jamaican": "",
+ "January": "tammikuu",
+ "Japanese": "japanilainen",
+ "Jewish": "juutalainen",
+ "joinTG": "",
+ "July": "heinäkuu",
+ "June": "kesäkuu",
+ "kEdit": "",
+ "Kenyan": "",
+ "kg": "kg",
+ "Kilogram": "kilogramma",
+ "Korean": "korealainen",
+ "l": "l",
+ "lang": "Kieli",
+ "large": "",
+ "Last updated": "",
+ "lb": "",
+ "leaf": "",
+ "Light": "",
+ "listVM": "",
+ "Litre": "",
+ "Loaf": "",
+ "ltAgo": "",
+ "lunch": "",
+ "mAgo": "",
+ "Main dishes": "",
+ "March": "",
+ "May": "",
+ "Meat": "",
+ "medium": "",
+ "Mexican": "",
+ "mg": "",
+ "Millilitre": "",
+ "min": "",
+ "minimal": "",
+ "ml": "",
+ "Moderate": "",
+ "MON": "",
+ "newCui": "",
+ "Newest first": "",
+ "newRec": "",
+ "newUnit": "",
+ "Nigerian": "",
+ "nLangInfo": "",
+ "nNBtn": "",
+ "no": "",
+ "noAccSensor": "",
+ "noFavs": "",
+ "Noodles": "",
+ "noRecs": "Hakua vastaavia reseptejä ei ole",
+ "noRecsInL": "",
+ "nos": "",
+ "November": "marraskuu",
+ "nwCat": "Uusi luokka",
+ "nwYiU": "",
+ "October": "lokakuu",
+ "OK": "OK",
+ "Oldest first": "",
+ "opts": "Valinnat",
+ "Ounce": "",
+ "oz": "",
+ "Pasta": "",
+ "Patty": "",
+ "photogrid": "",
+ "pht": "Reseptivalokuva",
+ "piece": "pala",
+ "Piece": "Pala",
+ "pinch": "",
+ "planner": "Ateriasuunnittelija",
+ "plsAdd": "Lisää resepti pluspainikkeella",
+ "Portuguese": "portugalilainen",
+ "Poultry": "",
+ "Pound": "",
+ "prepT": "Valmisteluaika",
+ "priv": "Tietosuojakäytäntö",
+ "pt": "",
+ "qt": "",
+ "Quickest first": "",
+ "Rating": "",
+ "rBtn": "POISTA",
+ "rec": "Resepti",
+ "recE": "On jo olemassa:",
+ "recF": "löydettyä reseptiä",
+ "recI": "",
+ "recListEmp": "",
+ "recPic": "Reseptivalokuva",
+ "recRm": "Resepti poistettu",
+ "recs": "reseptiä",
+ "recTitle": "Minun terveellinen reseptini",
+ "recU": "Päivitetty:",
+ "req": "",
+ "resNF": "",
+ "rest": "Nollaa",
+ "restCatL": "",
+ "restCuiL": "",
+ "restDone": "",
+ "restInfo": "",
+ "restUL": "",
+ "restYUL": "",
+ "Rice": "Riisi",
+ "rmCatInfo": "Olet poistamassa %s luokkaluettelosta",
+ "rmCmb": "Yhdistelmä poistettu",
+ "rmCuiInfo": "",
+ "rmIng": "Ainesosa poistettu",
+ "rmIns": "Ohje poistettu",
+ "rmN": "Huomautus poistettu",
+ "rmUInfo": "",
+ "rmYUInfo": "",
+ "Roll": "",
+ "rp": "Poista valokuva",
+ "rst": "UUDELLEENKÄYNNISTÄ",
+ "Russian": "venäläinen",
+ "Salads": "Salaatit",
+ "SAT": "la",
+ "Sauces": "Kastikkeet",
+ "Scottish": "skotlantilainen",
+ "Seafood": "",
+ "selRec": "",
+ "September": "",
+ "ser": "Etsi",
+ "Serving": "",
+ "SET": "ASETA",
+ "Settings": "Asetukset",
+ "shr": "Jaa",
+ "Side dishes": "",
+ "simple": "",
+ "Slowest first": "",
+ "sltd": "",
+ "small": "",
+ "snacks": "",
+ "Soups": "Keitot",
+ "Spanish": "espanjalainen",
+ "Sri Lankan": "srilankalainen",
+ "srpu": "Jaa reseptikuva käyttämällä…",
+ "srt": "Järjestä",
+ "sru": "Jaa resepti käyttämällä…",
+ "stars": "",
+ "stick": "",
+ "stp": "",
+ "strAdd": "",
+ "SUN": "su",
+ "sVw": "Ravista nähdäksesi satunnainen resepti",
+ "sVwInfo": "Auttaa sinua valitsemaan, mitä valmistaa, kun et osaa päättää",
+ "Swedish": "ruotsalainen",
+ "swm": "Aloita viikko maanantaina",
+ "sysDef": "Järjestelmän oletus",
+ "Tablespoon": "",
+ "tbsp": "",
+ "Teaspoon": "",
+ "Thai": "thaimaalainen",
+ "Theme": "Teema",
+ "THU": "to",
+ "title": "Otsikko",
+ "tLInfo": "Reseptit, joita haluat kokeilla myöhemmin, on lueteltu täällä",
+ "today": "tänään",
+ "triedInfo": "Kokeilit tätä reseptiä %s",
+ "trnsl": "Käännä",
+ "trylater": "",
+ "trySer": "ETSI KAIKISTA RESEPTEISTÄ?",
+ "ts": "Tunnisteet",
+ "tsInfo": "",
+ "tsp": "",
+ "TUE": "ti",
+ "Turkish": "",
+ "Undefined": "Määrittelemätön",
+ "unit": "",
+ "Unit": "",
+ "unsaved": "",
+ "untRec": "",
+ "Vegan": "Vegaani",
+ "Vegetarian": "Kasvissyöjä",
+ "Vietnamese": "vietnamilainen",
+ "wAgo": "%s viikkoa sitten",
+ "WED": "ke",
+ "yesterday": "eilen",
+ "yieldQ": "",
+ "yieldU": "",
+ "yld": "",
+ "buto": "",
+ "sysDefB": "Järjestelmän oletusarvo + Musta",
+ "tmr": "Ajastin %s",
+ "stop": "Pysäytä",
+ "ntmr": "Uusi ajastin",
+ "timer": "Keittoajastin",
+ "tmrSnd": "Ajastinääni",
+ "aTPrst": "Lisätty esiasetuksiin",
+ "fwr": "mitä reseptiä varten?",
+ "prstBtn": "ESIASETUKSET",
+ "sec": "s",
+ "dlyDur": "Viiveen kesto",
+ "seconds": "sekuntia",
+ "hours": "tuntia",
+ "minutes": "minuuttia",
+ "hour": "tunti",
+ "minute": "minuutti",
+ "prsts": "Esiasetukset",
+ "texp": "%s ajastinta on vanhentunut",
+ "tmrRm": "Ajastin poistettu",
+ "ccwt": "Keitä luottavaisesti ajastimien avulla!",
+ "gtD": "Siirry päivämäärään",
+ "random": "Satunnainen",
+ "notifSetg": "Ilmoitusasetukset",
+ "prstTU": "Esiasetettu aika päivitetty",
+ "ttv": "Napauta nähdäksesi",
+ "dismissAll": "Hylkää kaikki ajastimet",
+ "dismiss": "Hylkää",
+ "d": "Päivä",
+ "wk": "Viikko",
+ "mnth": "Kuukausi",
+ "ystr": "Eilen",
+ "tmrw": "Huomenna",
+ "tdy": "Tänään",
+ "cpy": "kopio",
+ "sat": "lauantai",
+ "fri": "perjantai",
+ "thu": "torstai",
+ "wed": "keskiviikko",
+ "tue": "tiistai",
+ "mon": "maanantai",
+ "sun": "sunnuntai",
+ "calVM": "Kalenterinäkymätila",
+ "oAP": "%1$s käynnissä, %2$s keskeytetty",
+ "ehwmp": "Syö terveellisesti ateriasuunnitelmien avulla!",
+ "selMT": "Valitse ateriatyyppi",
+ "plsCrt": "Käytä plus-painiketta luodaksesi yhden",
+ "nvr": "Ei koskaan",
+ "otaw": "Viikon jälkeen",
+ "otam": "Kuukauden jälkeen",
+ "otay": "Vuoden jälkeen",
+ "admp": "Poista ateriasuunnitelmat automaattisesti"
+}
diff --git a/app/i18n/fr-BE.json b/app/i18n/fr-BE.json
index 5e09f676..a4465e1d 100644
--- a/app/i18n/fr-BE.json
+++ b/app/i18n/fr-BE.json
@@ -323,7 +323,7 @@
"random": "Aléatoire",
"ystr": "Hier",
"tmrw": "Demain",
- "tdy": "Oggi",
+ "tdy": "Aujourd’hui",
"cpy": "copie",
"sat": "samedi",
"fri": "vendredi",
@@ -332,6 +332,17 @@
"tue": "mardi",
"mon": "lundi",
"sun": "dimanche",
+ "d": "Jour",
+ "wk": "Semaine",
+ "mnth": "Mois",
"calVM": "Mode d’affichage du calendrier",
- "oAP": "%1$s en cours, %2$s en pause"
+ "oAP": "%1$s en cours, %2$s en pause",
+ "otaw": "Après une semaine",
+ "otam": "Après un mois",
+ "otay": "Après un an",
+ "admp": "Supprimer automatiquement les planifications de repas",
+ "nvr": "Jamais",
+ "plsCrt": "Utilisez le bouton plus pour en créer une",
+ "ehwmp": "Mangez sainement grâce aux planifications de repas !",
+ "selMT": "Sélectionnez le type de repas"
}
diff --git a/app/i18n/fr-CA.json b/app/i18n/fr-CA.json
index 31a0d299..fbceaf7a 100644
--- a/app/i18n/fr-CA.json
+++ b/app/i18n/fr-CA.json
@@ -321,9 +321,9 @@
"ccwt": "Cuisinez avec confiance avec des minuteries!",
"gtD": "Aller à la date",
"random": "Aléatoire",
- "tdy": "Aujourd’hui",
"ystr": "Hier",
"tmrw": "Demain",
+ "tdy": "Aujourd’hui",
"cpy": "copie",
"sat": "samedi",
"fri": "vendredi",
@@ -332,6 +332,17 @@
"tue": "mardi",
"mon": "lundi",
"sun": "dimanche",
+ "d": "Jour",
+ "wk": "Semaine",
+ "mnth": "Mois",
"calVM": "Mode d’affichage du calendrier",
- "oAP": "%1$s en cours, %2$s en pause"
+ "oAP": "%1$s en cours, %2$s en pause",
+ "otaw": "Après une semaine",
+ "otam": "Après un mois",
+ "otay": "Après un an",
+ "admp": "Supprimer automatiquement les planifications de repas",
+ "nvr": "Jamais",
+ "plsCrt": "Utilisez le bouton plus pour en créer une",
+ "ehwmp": "Mangez sainement grâce aux planifications de repas!",
+ "selMT": "Sélectionnez le type de repas"
}
diff --git a/app/i18n/fr-CH.json b/app/i18n/fr-CH.json
index 7e0e7a15..dfa298da 100644
--- a/app/i18n/fr-CH.json
+++ b/app/i18n/fr-CH.json
@@ -323,7 +323,7 @@
"random": "Aléatoire",
"ystr": "Hier",
"tmrw": "Demain",
- "tdy": "Oggi",
+ "tdy": "Aujourd’hui",
"cpy": "copie",
"sat": "samedi",
"fri": "vendredi",
@@ -332,6 +332,17 @@
"tue": "mardi",
"mon": "lundi",
"sun": "dimanche",
+ "d": "Jour",
+ "wk": "Semaine",
+ "mnth": "Mois",
"calVM": "Mode d’affichage du calendrier",
- "oAP": "%1$s en cours, %2$s en pause"
+ "oAP": "%1$s en cours, %2$s en pause",
+ "nvr": "Jamais",
+ "otaw": "Après une semaine",
+ "otam": "Après un mois",
+ "otay": "Après un an",
+ "admp": "Supprimer automatiquement les planifications de repas",
+ "plsCrt": "Utilisez le bouton plus pour en créer une",
+ "ehwmp": "Mangez sainement grâce aux planifications de repas!",
+ "selMT": "Sélectionnez le type de repas"
}
diff --git a/app/i18n/fr.json b/app/i18n/fr.json
index e20e40e8..9a249b19 100644
--- a/app/i18n/fr.json
+++ b/app/i18n/fr.json
@@ -321,9 +321,9 @@
"ccwt": "Cuisinez avec confiance avec des minuteries !",
"gtD": "Aller à la date",
"random": "Aléatoire",
- "tdy": "Aujourd’hui",
"ystr": "Hier",
"tmrw": "Demain",
+ "tdy": "Aujourd’hui",
"cpy": "copie",
"sat": "samedi",
"fri": "vendredi",
@@ -332,6 +332,17 @@
"tue": "mardi",
"mon": "lundi",
"sun": "dimanche",
+ "d": "Jour",
+ "wk": "Semaine",
+ "mnth": "Mois",
"calVM": "Mode d’affichage du calendrier",
- "oAP": "%1$s en cours, %2$s en pause"
+ "oAP": "%1$s en cours, %2$s en pause",
+ "otaw": "Après une semaine",
+ "otam": "Après un mois",
+ "otay": "Après un an",
+ "admp": "Supprimer automatiquement les planifications de repas",
+ "nvr": "Jamais",
+ "plsCrt": "Utilisez le bouton plus pour en créer une",
+ "ehwmp": "Mangez sainement grâce aux planifications de repas !",
+ "selMT": "Sélectionnez le type de repas"
}
diff --git a/app/i18n/it.json b/app/i18n/it.json
index 0fd4c57a..84ee21ff 100644
--- a/app/i18n/it.json
+++ b/app/i18n/it.json
@@ -332,6 +332,17 @@
"tue": "martedì",
"mon": "lunedì",
"sun": "domenica",
+ "d": "Giorno",
+ "wk": "Settimana",
+ "mnth": "Mese",
"calVM": "Modalità di visualizzazione calendario",
- "oAP": "%1$s in corso, %2$s in pausa"
+ "oAP": "%1$s in corso, %2$s in pausa",
+ "otaw": "Dopo una settimana",
+ "otam": "Dopo un mese",
+ "otay": "Dopo un anno",
+ "nvr": "Mai",
+ "admp": "Elimina automaticamente i piani pasto",
+ "plsCrt": "Usa il pulsante più per crearne uno",
+ "ehwmp": "Mangia sano con i piani dei pasti!",
+ "selMT": "Seleziona il tipo di pasto"
}
diff --git a/app/i18n/ja.json b/app/i18n/ja.json
new file mode 100644
index 00000000..2167f57e
--- /dev/null
+++ b/app/i18n/ja.json
@@ -0,0 +1,293 @@
+{
+ "aap": "写真を添付",
+ "About": "アプリについて",
+ "aBtn": "追加",
+ "aD": "完了しました!",
+ "addCmbBtn": "組合せを追加",
+ "aFBu": "バックアップするにはレシピを登録してください",
+ "aIngBtn": "材料を追加",
+ "allCats": "全てのカテゴリー",
+ "allCuis": "全てのジャンル",
+ "allTs": "全てのタグ",
+ "American": "アメリカ料理",
+ "aNBtn": "新しく追加",
+ "aNoBtn": "メモを追加",
+ "app.name": "EnRecipes",
+ "appCrd": "EnRecipesから共有されました。F-DroidかIzzyOnDroidかPlayストアからダウンロード出来ます。",
+ "Appetizers": "前菜",
+ "appInfo": "EnRecipesはレシピを作成・管理・共有することができる、オープンソースでプライバシーに配慮したデジタル料理本です",
+ "apply": "適用する",
+ "appRst": "アプリの再起動が必要",
+ "April": "4月",
+ "aStpBtn": "手順を追加",
+ "August": "8月",
+ "Barbecue": "キャンプ料理",
+ "Beverages": "飲物",
+ "Black": "黒",
+ "Brazilian": "ブラジル料理",
+ "Breads": "パン",
+ "breakfast": "朝食",
+ "British": "イギリス料理",
+ "buEmp": "バックアップファイルが空です",
+ "buFol": "バックアップフォルダー",
+ "buInc": "バックアップファイルが壊れています",
+ "buInfo": "全てのデータを復元するためのZIPファイルを生成します",
+ "buMod": "バックアップファイルが一部修正されています",
+ "cat": "カテゴリー",
+ "cBtn": "キャンセル",
+ "Challenging": "難しい",
+ "Chinese": "中華料理",
+ "clove": "クローブ",
+ "cm": "cm",
+ "cmbs": "組合せ",
+ "conBtn": "続ける",
+ "conf": "確認",
+ "cookT": "調理時間",
+ "cPic": "写真を切り抜く",
+ "Created": "作成日時",
+ "cui": "ジャンル",
+ "cup": "カップ",
+ "Cup": "カップ",
+ "dAgo": "%s 日前",
+ "Danish": "デンマーク料理",
+ "Dark": "ダーク",
+ "db": "データベース",
+ "dBtn": "削除",
+ "December": "12月",
+ "delRecInfo": "レシピ %s を削除しようとしています",
+ "delRecsInfo": "%s 件のレシピを削除しようとしています",
+ "Desserts": "デザート",
+ "detailed": "詳細",
+ "Difficulty level": "難易度",
+ "dinner": "夕食",
+ "disBtn": "破棄",
+ "disc": "レシピの変更が保存されていません。どうしますか?",
+ "donate": "寄付する",
+ "dozen": "ダース",
+ "drop": "滴",
+ "dsp": "デザート用スプーン",
+ "Easy": "簡単",
+ "editRec": "レシピを編集する",
+ "Egyptian": "エジプト料理",
+ "English": "イングランド料理",
+ "EnRecipes": "EnRecipes",
+ "expBu": "バックアップをエクスポート",
+ "expip": "エクスポートを実行中",
+ "expSuc": "エクスポートに成功",
+ "favourites": "お気に入り",
+ "February": "2月",
+ "Filipino": "フィリピン料理",
+ "Filtered recipes": "絞り込み結果",
+ "fl oz": "液量オンス",
+ "fltr": "絞り込み",
+ "Fluid Ounce": "液量オンス",
+ "French": "フランス料理",
+ "FRI": "金",
+ "fsList": "お気に入りのレシピはここに表示されます",
+ "g": "g",
+ "gal": "ガロン",
+ "Gallon": "ガロン",
+ "German": "ドイツ料理",
+ "gh": "GitHubで見る",
+ "Gram": "グラム",
+ "Greek": "ギリシャ料理",
+ "grid": "グリッド",
+ "grocery": "食材のリスト",
+ "guide": "ユーザーガイド",
+ "Healthy": "ヘルシー",
+ "hr": "時間",
+ "impBu": "データをインポート",
+ "impFail": "インポートに失敗",
+ "impInfo": "アプリからエクスポートしたフルバックアップに対応しています",
+ "impip": "インポートを実行中",
+ "impSuc": "インポートに成功",
+ "Indian": "インド料理",
+ "ings": "材料",
+ "inss": "作り方",
+ "intf": "インターフェイス",
+ "invFile": "無効なファイルです",
+ "Irish": "アイルランド料理",
+ "Italian": "イタリア料理",
+ "Jamaican": "ジャマイカ料理",
+ "January": "1月",
+ "Japanese": "和食",
+ "Jewish": "ユダヤ料理",
+ "joinTG": "Telegramグループに参加",
+ "July": "7月",
+ "June": "6月",
+ "kEdit": "編集を続ける",
+ "Kenyan": "ケニア料理",
+ "kg": "kg",
+ "Kilogram": "キログラム",
+ "Korean": "韓国料理",
+ "l": "リットル",
+ "lang": "言語",
+ "Last updated": "最終更新",
+ "leaf": "枚",
+ "Light": "ライト",
+ "listVM": "一覧の表示方法",
+ "Litre": "リットル",
+ "Loaf": "ローフ",
+ "ltAgo": "ずっと前",
+ "lunch": "昼食",
+ "mAgo": "%s か月前",
+ "Main dishes": "主菜",
+ "March": "3月",
+ "May": "5月",
+ "Meat": "肉料理",
+ "Mexican": "メキシコ料理",
+ "mg": "mg",
+ "Millilitre": "ミリリットル",
+ "min": "分",
+ "minimal": "最小",
+ "ml": "ml",
+ "Moderate": "普通",
+ "MON": "月",
+ "newCui": "新しいジャンル",
+ "Newest first": "新しい順",
+ "newRec": "新しいレシピ",
+ "newUnit": "新しい単位",
+ "Nigerian": "ナイジェリア料理",
+ "nLangInfo": "新しい言語を使用するためにEnRecipesを再起動",
+ "no": "メモ",
+ "noAccSensor": "加速度センサーが無効です",
+ "noFavs": "お気に入りはまだありません",
+ "Noodles": "麺",
+ "noRecs": "検索に一致するレシピがありません",
+ "noRecsInL": "検索に一致するレシピが見つかりませんでした",
+ "nos": "メモ",
+ "November": "11月",
+ "nwCat": "新しいカテゴリー",
+ "nwYiU": "新しい仕上がり単位",
+ "October": "10月",
+ "OK": "OK",
+ "Oldest first": "古いもの順",
+ "opts": "オプション",
+ "Ounce": "オンス",
+ "Pasta": "パスタ",
+ "Patty": "パティ",
+ "photogrid": "写真グリッド",
+ "pht": "レシピの写真",
+ "piece": "片",
+ "Piece": "片",
+ "planner": "献立プラン",
+ "plsAdd": "プラスボタンを押して追加します",
+ "Portuguese": "ポルトガル料理",
+ "Poultry": "チキン料理",
+ "Pound": "ポンド",
+ "prepT": "準備時間",
+ "priv": "プライバシーポリシー",
+ "pt": "少々",
+ "qt": "クォート",
+ "Quickest first": "速いもの順",
+ "Rating": "評価",
+ "rBtn": "削除",
+ "rec": "レシピ",
+ "recE": "既に存在します:",
+ "recF": "件のレシピが見つかりました",
+ "recI": "インポートしました:",
+ "recListEmp": "まだ何もありません!レシピを追加してもう一度試してください",
+ "recPic": "レシピの写真",
+ "recRm": "レシピを削除しました",
+ "recs": "レシピ",
+ "recTitle": "私の健康レシピ",
+ "recU": "アップデート:",
+ "req": "%s が必要",
+ "resNF": "レシピが見つかりません",
+ "rest": "リセット",
+ "restCatL": "カテゴリーリストをリセット",
+ "restCuiL": "ジャンルのリストをリセット",
+ "restDone": "リセットが完了しました",
+ "restInfo": "リストをリセットすると、作成した項目が削除され、既定の項目を復元します。既にあるレシピには影響しません。",
+ "restUL": "単位のリストをリセットする",
+ "restYUL": "仕上がり分量の単位のリストをリセットする",
+ "Rice": "お米料理",
+ "rmCatInfo": "カテゴリーのリストから %s を削除しようとしています",
+ "rmCmb": "組合せが削除されました",
+ "rmCuiInfo": "ジャンルのリストから %s を削除しようとしています",
+ "rmIng": "材料を削除しました",
+ "rmIns": "作り方を削除しました",
+ "rmN": "メモが削除されました",
+ "rmUInfo": "単位のリストから %s を削除しようとしています",
+ "rmYUInfo": "仕上がり分量の単位のリストから %s を削除しようとしています",
+ "Roll": "ロール",
+ "rp": "写真を削除",
+ "rst": "再起動",
+ "Russian": "ロシア料理",
+ "Salads": "サラダ",
+ "SAT": "土",
+ "Sauces": "ソース",
+ "Scottish": "スコットランド料理",
+ "Seafood": "シーフード",
+ "selRec": "レシピを選択",
+ "September": "9月",
+ "ser": "検索",
+ "Serving": "人前",
+ "SET": "設定",
+ "Settings": "設定",
+ "shr": "共有",
+ "Side dishes": "副菜",
+ "simple": "シンプル",
+ "Slowest first": "遅い順",
+ "sltd": "選択",
+ "snacks": "軽食",
+ "Soups": "スープ",
+ "Spanish": "スペイン料理",
+ "Sri Lankan": "スリランカ料理",
+ "srpu": "レシピの写真を共有...",
+ "srt": "並び替え",
+ "sru": "レシピを共有...",
+ "stars": "星評価",
+ "stp": "作り方",
+ "strAdd": "レシピを追加しましょう!",
+ "SUN": "日",
+ "sVw": "振ってランダムなレシピを表示",
+ "sVwInfo": "何を作るか決められないときに使います",
+ "Swedish": "スウェーデン料理",
+ "swm": "月曜始まりにする",
+ "sysDef": "システム既定",
+ "Tablespoon": "大さじ",
+ "tbsp": "大さじ",
+ "Teaspoon": "小さじ",
+ "Thai": "タイ料理",
+ "Theme": "テーマ",
+ "THU": "木",
+ "title": "タイトル",
+ "tLInfo": "あとで試したいレシピはここに並びます",
+ "today": "今日",
+ "triedInfo": "に作りました",
+ "trnsl": "翻訳",
+ "trylater": "あとで作る",
+ "trySer": "全てのレシピを検索しますか?",
+ "ts": "タグ",
+ "tsInfo": "スペースで区切ってください",
+ "tsp": "小さじ",
+ "TUE": "火",
+ "Turkish": "トルコ料理",
+ "unit": "個",
+ "Unit": "単位",
+ "unsaved": "未保存の変更",
+ "untRec": "無題のレシピ",
+ "Vegan": "ビーガン",
+ "Vegetarian": "ベジタリアン",
+ "Vietnamese": "ベトナム料理",
+ "wAgo": "%s 週前",
+ "WED": "水",
+ "yesterday": "昨日",
+ "yieldQ": "仕上がり分量",
+ "yieldU": "仕上がり分量の単位",
+ "yld": "仕上がり分量",
+ "buto": "%s としてバックアップしました",
+ "sysDefB": "システム既定+黒",
+ "in": "中の",
+ "Undefined": "未定義",
+ "nNBtn": "あとで",
+ "stick": "スティック",
+ "pinch": "ピンチ",
+ "oz": "オンス",
+ "lb": "ポンド",
+ "it": "材料",
+ "small": "小",
+ "large": "大",
+ "medium": "中"
+}
diff --git a/app/i18n/ml.json b/app/i18n/ml.json
new file mode 100644
index 00000000..22b596c5
--- /dev/null
+++ b/app/i18n/ml.json
@@ -0,0 +1,293 @@
+{
+ "aap": "ഒരു ഫോട്ടോ അറ്റാച്ചുചെയ്യുക",
+ "About": "കുറിച്ച്",
+ "aBtn": "ചേർക്കുക",
+ "aD": "എല്ലാം ചെയ്തു!",
+ "addCmbBtn": "സംയോജനം ചേർക്കുക",
+ "aFBu": "ഒരു ബാക്കപ്പ് നടത്താൻ ഒരു പാചകക്കുറിപ്പ് ചേർക്കുക",
+ "aIngBtn": "ചേരുവ ചേർക്കുക",
+ "allCats": "എല്ലാ വിഭാഗങ്ങളും",
+ "allCuis": "എല്ലാ പാചകരീതികളും",
+ "allTs": "എല്ലാ ടാഗുകളും",
+ "American": "അമേരിക്കൻ",
+ "aNBtn": "പുതിയത് ചേർക്കുക",
+ "aNoBtn": "കുറിപ്പ് ചേര്ക്കുക",
+ "app.name": "ൻന്റെസിപിഎസ്",
+ "appCrd": "എന്റെരെസിപീസ് വഴി പങ്കിട്ടു. എഫ്-ആൻഡ്രോയിഡ്, ഇസിഓൺഡ്രോയിഡ് അല്ലെങ്കിൽ പ്ലേ സ്റ്റോറിൽ ഇത് നേടുക.",
+ "Appetizers": "വിശപ്പ്",
+ "appInfo": "നിങ്ങളുടെ പാചകക്കുറിപ്പുകൾ സൃഷ്ടിക്കാനും നിയന്ത്രിക്കാനും പങ്കിടാനും അനുവദിക്കുന്ന ഒരു ഓപ്പൺ സോഴ്സ്, സ്വകാര്യത കേന്ദ്രീകരിച്ച ഡിജിറ്റൽ പാചകപുസ്തകമാണ് എന്റെരെസിപീസ്",
+ "apply": "പ്രയോഗിക്കുക",
+ "appRst": "അപ്ലിക്കേഷൻ പുനരാരംഭിക്കൽ ആവശ്യമാണ്",
+ "April": "ഏപ്രിൽ",
+ "aStpBtn": "നിർദ്ദേശം ചേർക്കുക",
+ "August": "ഓഗസ്റ്റ്",
+ "Barbecue": "ബാർബിക്യൂ",
+ "Beverages": "പാനീയങ്ങൾ",
+ "Black": "കറുപ്പ്",
+ "Brazilian": "ബ്രസീലിയൻ",
+ "Breads": "ബ്രെഡുകൾ",
+ "breakfast": "പ്രഭാതഭക്ഷണം",
+ "British": "ബ്രിട്ടീഷ്",
+ "buEmp": "ബാക്കപ്പ് ഫയൽ ശൂന്യമാണ്",
+ "buFol": "ബാക്കപ്പ് ഫോൾഡർ",
+ "buInc": "കേടായ അല്ലെങ്കിൽ കേടായ ബാക്കപ്പ് ഫയൽ",
+ "buInfo": "തിരികെ ഇറക്കുമതി ചെയ്യാൻ കഴിയുന്ന നിങ്ങളുടെ എല്ലാ ഡാറ്റയും അടങ്ങിയ ഒരു ZIP ഫയൽ സൃഷ്ടിക്കുന്നു",
+ "buMod": "ബാക്കപ്പ് ഫയൽ മറ്റെവിടെയെങ്കിലും പരിഷ്ക്കരിച്ചു",
+ "cat": "വിഭാഗം",
+ "cBtn": "റദ്ദാക്കുക",
+ "Challenging": "വെല്ലുവിളിനിറഞ്ഞ",
+ "Chinese": "ചൈനീസ്",
+ "clove": "ഗ്രാമ്പൂ",
+ "cm": "സെന്റിമീറ്റർ",
+ "cmbs": "സംയോജനങ്ങൾ",
+ "conBtn": "തുടരുക",
+ "conf": "സ്ഥിരീകരിക്കുക",
+ "cookT": "പാചക സമയം",
+ "cPic": "ഫോട്ടോ എഡിറ്റുചെയ്യുക",
+ "Created": "സൃഷ്ടിച്ചു",
+ "cui": "പാചകരീതി",
+ "cup": "കപ്പ്",
+ "Cup": "കപ്പ്",
+ "dAgo": "%s ദിവസം മുമ്പ്",
+ "Danish": "ഡാനിഷ്",
+ "Dark": "ഇരുണ്ടത്",
+ "db": "ഡാറ്റാബേസ്",
+ "dBtn": "ഇല്ലാതാക്കുക",
+ "December": "ഡിസംബർ",
+ "delRecInfo": "%s പാചകക്കുറിപ്പ് നിങ്ങൾ ശാശ്വതമായി ഇല്ലാതാക്കാൻ പോകുന്നു",
+ "delRecsInfo": "നിങ്ങൾ %s ശാശ്വതമായി ഇല്ലാതാക്കാൻ പോകുന്നു",
+ "Desserts": "മധുരപലഹാരങ്ങൾ",
+ "detailed": "വിശദമായ",
+ "Difficulty level": "വൈഷമ്യ നില",
+ "dinner": "അത്താഴം",
+ "disBtn": "നിരസിക്കുക",
+ "disc": "ഈ പാചകക്കുറിപ്പിൽ സംരക്ഷിക്കാത്ത മാറ്റങ്ങളുണ്ട്. നിങ്ങൾ എന്താണ് ചെയ്യാൻ ആഗ്രഹിക്കുന്നത്?",
+ "donate": "സംഭാവനചെയ്യുക",
+ "dozen": "ഡസൻ",
+ "drop": "തുള്ളി",
+ "dsp": "ഡെസേർട്ട് സ്പൂൺ",
+ "Easy": "എളുപ്പമാണ്",
+ "editRec": "പാചകക്കുറിപ്പ് എഡിറ്റുചെയ്യുക",
+ "Egyptian": "ഈജിപ്ഷ്യൻ",
+ "English": "ഇംഗ്ലീഷ്",
+ "EnRecipes": "ൻന്റെസിപിഎസ്",
+ "expBu": "പൂർണ്ണ ബാക്കപ്പ് എക്സ്പോർട്ടുചെയ്യുക",
+ "expip": "കയറ്റുമതി പുരോഗതിയിലാണ്",
+ "expSuc": "കയറ്റുമതി വിജയം",
+ "favourites": "പ്രിയങ്കരങ്ങൾ",
+ "February": "ഫെബ്രുവരി",
+ "Filipino": "ഫിലിപ്പിനോ",
+ "Filtered recipes": "ഫിൽട്ടർ ചെയ്ത പാചകക്കുറിപ്പുകൾ",
+ "fl oz": "ഫ്ലൂയിഡ് un ൺസ്",
+ "fltr": "ഫിൽട്ടർ ചെയ്യുക",
+ "Fluid Ounce": "ഫ്ലൂയിഡ് un ൺസ്",
+ "French": "ഫ്രഞ്ച്",
+ "FRI": "വെള്ളി",
+ "fsList": "നിങ്ങളുടെ പ്രിയപ്പെട്ട പാചകക്കുറിപ്പുകൾ ഇവിടെ പട്ടികപ്പെടുത്തിയിട്ടുണ്ട്",
+ "g": "ഗ്രാം",
+ "gal": "ഗാലൺ",
+ "Gallon": "ഗാലൺ",
+ "German": "ജർമ്മൻ",
+ "gh": "GitHub- ൽ കാണുക",
+ "Gram": "ഗ്രാം",
+ "Greek": "ഗ്രീക്ക്",
+ "grid": "ഗ്രിഡ്",
+ "grocery": "പലചരക്ക് പട്ടിക",
+ "guide": "ഉപയോക്തൃ ഗൈഡ്",
+ "Healthy": "ആരോഗ്യമുള്ള",
+ "hr": "മണിക്കൂർ",
+ "impBu": "ഡാറ്റ ഇറക്കുമതി ചെയ്യുക",
+ "impFail": "ഇറക്കുമതി പരാജയപ്പെട്ടു",
+ "impInfo": "ഈ അപ്ലിക്കേഷൻ എക്സ്പോർട്ടുചെയ്ത പൂർണ്ണ ബാക്കപ്പുകൾ പിന്തുണയ്ക്കുന്നു",
+ "impip": "ഇറക്കുമതി പുരോഗതിയിലാണ്",
+ "impSuc": "ഇറക്കുമതി വിജയം",
+ "in": "ഇഞ്ച്",
+ "Indian": "ഇന്ത്യൻ",
+ "ings": "ചേരുവകൾ",
+ "inss": "നിർദ്ദേശങ്ങൾ",
+ "intf": "ഇന്റർഫേസ്",
+ "invFile": "അസാധുവായ ഫയൽ",
+ "Irish": "ഐറിഷ്",
+ "it": "ഇനം",
+ "Italian": "ഇറ്റാലിയൻ",
+ "Jamaican": "ജമൈക്കൻ",
+ "January": "ജനുവരി",
+ "Japanese": "ജാപ്പനീസ്",
+ "Jewish": "ജൂതൻ",
+ "joinTG": "ടെലിഗ്രാം ഗ്രൂപ്പിൽ ചേരുക",
+ "July": "ജൂലൈ",
+ "June": "ജൂൺ",
+ "kEdit": "എഡിറ്റിംഗ് തുടരുക",
+ "Kenyan": "കെനിയൻ",
+ "kg": "കി. ഗ്രാം",
+ "Kilogram": "കിലോഗ്രാം",
+ "Korean": "കൊറിയൻ",
+ "l": "ലിറ്റർ",
+ "lang": "ഭാഷ",
+ "large": "വലുത്",
+ "Last updated": "അവസാനമായി പുതുക്കിയത്",
+ "lb": "പൗണ്ട്",
+ "leaf": "ഇല",
+ "Light": "പ്രകാശം",
+ "listVM": "പട്ടിക കാഴ്ച മോഡ്",
+ "Litre": "ലിറ്റർ",
+ "Loaf": "അപ്പം",
+ "ltAgo": "വളരെക്കാലം മുമ്പ്",
+ "lunch": "ഉച്ചഭക്ഷണം",
+ "mAgo": "%s മാസം മുമ്പ്",
+ "Main dishes": "പ്രധാന വിഭവങ്ങൾ",
+ "March": "മാർച്ച്",
+ "May": "മെയ്",
+ "Meat": "മാംസം",
+ "medium": "ഇടത്തരം",
+ "Mexican": "മെക്സിക്കൻ",
+ "mg": "മില്ലിഗ്രാം",
+ "Millilitre": "മില്ലിലിറ്റർ",
+ "min": "മിനിറ്റ്",
+ "minimal": "കുറഞ്ഞത്",
+ "ml": "മില്ലി",
+ "Moderate": "മിതത്വം",
+ "MON": "തിങ്കൾ",
+ "newCui": "പുതിയ പാചകരീതി",
+ "Newest first": "ആദ്യത്തെ പുതിയത്",
+ "newRec": "പുതിയ പാചകക്കുറിപ്പ്",
+ "newUnit": "പുതിയ യൂണിറ്റ്",
+ "Nigerian": "നൈജീരിയൻ",
+ "nLangInfo": "പുതിയ ഭാഷ ഉപയോഗിക്കുന്നതിന് എന്റെരെസിപീസ് പുനരാരംഭിക്കുക",
+ "nNBtn": "ഇപ്പോൾ വേണ്ട",
+ "no": "കുറിപ്പ്",
+ "noAccSensor": "ആക്സിലറോമീറ്റർ സെൻസർ പ്രവർത്തനരഹിതമാക്കി അല്ലെങ്കിൽ പ്രവർത്തിക്കുന്നില്ല",
+ "noFavs": "ഇതുവരെ പ്രിയപ്പെട്ട പാചകക്കുറിപ്പുകളൊന്നുമില്ല",
+ "Noodles": "നൂഡിൽസ്",
+ "noRecs": "പാചകക്കുറിപ്പുകളൊന്നും നിങ്ങളുടെ തിരയലുമായി പൊരുത്തപ്പെടുന്നില്ല",
+ "noRecsInL": "ഇവിടെയുള്ള പാചകങ്ങളൊന്നും നിങ്ങളുടെ തിരയലുമായി പൊരുത്തപ്പെടുന്നില്ല",
+ "nos": "കുറിപ്പുകൾ",
+ "November": "നവംബർ",
+ "nwCat": "പുതിയ വിഭാഗം",
+ "nwYiU": "പുതിയ വിളവ് യൂണിറ്റ്",
+ "October": "ഒക്ടോബർ",
+ "OK": "ശരി",
+ "Oldest first": "ആദ്യം പഴയത്",
+ "opts": "ഓപ്ഷനുകൾ",
+ "Ounce": "Un ൺസ്",
+ "oz": "oun ൺസ്",
+ "Pasta": "പാസ്ത",
+ "Patty": "പാറ്റി",
+ "photogrid": "ഫോട്ടോ ഗ്രിഡ്",
+ "pht": "പാചകക്കുറിപ്പ് ഫോട്ടോ",
+ "piece": "കഷണം",
+ "Piece": "പീസ്",
+ "pinch": "നുള്ള്",
+ "planner": "ഭക്ഷണ പ്ലാനർ",
+ "plsAdd": "ഒരെണ്ണം ചേർക്കാൻ പ്ലസ് ബട്ടൺ ഉപയോഗിക്കുക",
+ "Portuguese": "പോർച്ചുഗീസ്",
+ "Poultry": "കോഴി",
+ "Pound": "പൗണ്ട്",
+ "prepT": "തയ്യാറാക്കൽ സമയം",
+ "priv": "സ്വകാര്യതാ നയം",
+ "pt": "പിന്റ്",
+ "qt": "ക്വാർട്ട്",
+ "Quickest first": "ആദ്യ വേഗത്തിലുള്ളത്",
+ "Rating": "റേറ്റിംഗ്",
+ "rBtn": "നീക്കംചെയ്യുക",
+ "rec": "പാചകക്കുറിപ്പ്",
+ "recE": "നിലവിലുള്ളത്:",
+ "recF": "പാചകക്കുറിപ്പുകൾ കണ്ടെത്തി",
+ "recI": "ഇറക്കുമതി ചെയ്തത്:",
+ "recListEmp": "ഇവിടെ ഒന്നുമില്ല! കുറച്ച് പാചകക്കുറിപ്പുകൾ ചേർത്ത് വീണ്ടും ശ്രമിക്കുക",
+ "recPic": "പാചകക്കുറിപ്പ് ഫോട്ടോ",
+ "recRm": "പാചകക്കുറിപ്പ് നീക്കംചെയ്തു",
+ "recs": "പാചകക്കുറിപ്പുകൾ",
+ "recTitle": "എന്റെ ആരോഗ്യകരമായ പാചകക്കുറിപ്പ്",
+ "recU": "അപ്ഡേറ്റുചെയ്തത്:",
+ "req": "ആവശ്യമായ %s",
+ "resNF": "പാചകക്കുറിപ്പ് കണ്ടെത്തിയില്ല",
+ "rest": "പുനഃക്രമീകരിക്കുക",
+ "restCatL": "വിഭാഗ ലിസ്റ്റ് പുന .സജ്ജമാക്കുക",
+ "restCuiL": "പാചകരീതി പട്ടിക പുന .സജ്ജമാക്കുക",
+ "restDone": "പുന .സജ്ജീകരണം പൂർത്തിയായി",
+ "restInfo": "ഒരു ലിസ്റ്റ് പുന .സജ്ജമാക്കുന്നത് ഉപയോക്താവ് സൃഷ്ടിച്ച എൻട്രികൾ ഇല്ലാതാക്കുകയും സ്ഥിരസ്ഥിതി എൻട്രികൾ പുന restore സ്ഥാപിക്കുകയും ചെയ്യും. നിലവിലുള്ള പാചകത്തെ ബാധിക്കില്ല.",
+ "restUL": "യൂണിറ്റ് ലിസ്റ്റ് പുന .സജ്ജമാക്കുക",
+ "restYUL": "വിളവ് യൂണിറ്റ് ലിസ്റ്റ് പുന .സജ്ജമാക്കുക",
+ "Rice": "അരി",
+ "rmCatInfo": "നിങ്ങൾ കാറ്റഗറി ലിസ്റ്റിൽ നിന്ന് %s നീക്കംചെയ്യാൻ പോകുന്നു",
+ "rmCmb": "കോമ്പിനേഷൻ നീക്കംചെയ്തു",
+ "rmCuiInfo": "നിങ്ങൾ പാചക പട്ടികയിൽ നിന്ന് %s നീക്കംചെയ്യാൻ പോകുന്നു",
+ "rmIng": "ചേരുവ നീക്കംചെയ്തു",
+ "rmIns": "നിർദ്ദേശം നീക്കംചെയ്തു",
+ "rmN": "കുറിപ്പ് നീക്കംചെയ്തു",
+ "rmUInfo": "നിങ്ങൾ %s യെ യൂണിറ്റ് പട്ടികയിൽ നിന്ന് നീക്കംചെയ്യാൻ പോവുകയാണ്",
+ "rmYUInfo": "വിളവ് യൂണിറ്റ് പട്ടികയിൽ നിന്ന് നിങ്ങൾ %s നീക്കംചെയ്യാൻ പോകുന്നു",
+ "Roll": "റോൾ",
+ "rp": "ഫോട്ടോ നീക്കംചെയ്യുക",
+ "rst": "പുനരാരംഭിക്കുക",
+ "Russian": "റഷ്യൻ",
+ "Salads": "സലാഡുകൾ",
+ "SAT": "ശനി",
+ "Sauces": "സോസുകൾ",
+ "Scottish": "സ്കോട്ടിഷ്",
+ "Seafood": "കടൽ ഭക്ഷണം",
+ "selRec": "പാചകക്കുറിപ്പ് തിരഞ്ഞെടുക്കുക",
+ "September": "സെപ്റ്റംബർ",
+ "ser": "തിരയുക",
+ "Serving": "സേവിക്കുന്നു",
+ "SET": "സെറ്റ്",
+ "Settings": "ക്രമീകരണങ്ങൾ",
+ "shr": "പങ്കിടുക",
+ "Side dishes": "സൈഡ് വിഭവങ്ങൾ",
+ "simple": "ലളിതം",
+ "Slowest first": "ആദ്യ വേഗത",
+ "sltd": "തിരഞ്ഞെടുത്തു",
+ "small": "ചെറുത്",
+ "snacks": "ലഘുഭക്ഷണങ്ങൾ",
+ "Soups": "സൂപ്പ്",
+ "Spanish": "സ്പാനിഷ്",
+ "Sri Lankan": "ശ്രീലങ്കൻ",
+ "srpu": "പാചകക്കുറിപ്പ് ഫോട്ടോ പങ്കിടുക...",
+ "srt": "അടുക്കുക",
+ "sru": "പാചകക്കുറിപ്പ് പങ്കിടുക...",
+ "stars": "നക്ഷത്ര റേറ്റിംഗ്",
+ "stick": "വടി",
+ "stp": "ഘട്ടം",
+ "strAdd": "നിങ്ങളുടെ പാചകക്കുറിപ്പുകൾ ചേർക്കാൻ ആരംഭിക്കുക!",
+ "SUN": "ഞായ",
+ "sVw": "ക്രമരഹിതമായ പാചകക്കുറിപ്പ് കാണാൻ കുലുക്കുക",
+ "sVwInfo": "നിങ്ങൾക്ക് തീരുമാനിക്കാൻ കഴിയാത്തപ്പോൾ എന്താണ് പാചകം ചെയ്യേണ്ടതെന്ന് തിരഞ്ഞെടുക്കാൻ നിങ്ങളെ സഹായിക്കുന്നു",
+ "Swedish": "സ്വീഡിഷ്",
+ "swm": "ആഴ്ചയിലെ ആദ്യ ദിവസം തിങ്കളാഴ്ച",
+ "sysDef": "സിസ്റ്റം സ്ഥിരസ്ഥിതി",
+ "Tablespoon": "ടേബിൾസ്പൂൺ",
+ "tbsp": "ടേബിൾസ്പൂൺ",
+ "Teaspoon": "ടീസ്പൂൺ",
+ "Thai": "തായ്",
+ "Theme": "തീം",
+ "THU": "വ്യാഴം",
+ "title": "ശീർഷകം",
+ "tLInfo": "നിങ്ങൾ പിന്നീട് ശ്രമിക്കാൻ ആഗ്രഹിക്കുന്ന പാചകക്കുറിപ്പുകൾ ഇവിടെ പട്ടികപ്പെടുത്തിയിട്ടുണ്ട്",
+ "today": "ഇന്ന്",
+ "triedInfo": "നിങ്ങൾ %s ഈ പാചകക്കുറിപ്പ് പരീക്ഷിച്ചു",
+ "trnsl": "വിവർത്തനം ചെയ്യുക",
+ "trylater": "പിന്നീട് ശ്രമിക്കുക",
+ "trySer": "എല്ലാ പാചകക്കുറിപ്പുകളിലും തിരയണോ?",
+ "ts": "ടാഗുകൾ",
+ "tsInfo": "സ്പെയ്സുകൾ ഉപയോഗിച്ച് വേർതിരിക്കുക",
+ "tsp": "ടീസ്പൂൺ",
+ "TUE": "ചൊവ്വ",
+ "Turkish": "ടർക്കിഷ്",
+ "Undefined": "നിർവചിച്ചിട്ടില്ല",
+ "unit": "യൂണിറ്റ്",
+ "Unit": "യൂണിറ്റ്",
+ "unsaved": "സംരക്ഷിക്കാത്ത മാറ്റങ്ങൾ",
+ "untRec": "ശീർഷകമില്ലാത്ത പാചകക്കുറിപ്പ്",
+ "Vegan": "വെഗാൻ",
+ "Vegetarian": "വെജിറ്റേറിയൻ",
+ "Vietnamese": "വിയറ്റ്നാമീസ്",
+ "wAgo": "%s ആഴ്ച മുമ്പ്",
+ "WED": "ബുധൻ",
+ "yesterday": "ഇന്നലെ",
+ "yieldQ": "വിളവ് അളവ്",
+ "yieldU": "വിളവ് യൂണിറ്റ്",
+ "yld": "വരുമാനം",
+ "buto": "%s ലേക്ക് ബാക്കപ്പ് ചെയ്തു",
+ "sysDefB": "സിസ്റ്റം സ്ഥിരസ്ഥിതി + കറുപ്പ്"
+}
diff --git a/app/i18n/nl.json b/app/i18n/nl.json
index 093b320c..749e5e14 100644
--- a/app/i18n/nl.json
+++ b/app/i18n/nl.json
@@ -332,6 +332,17 @@
"tue": "dinsdag",
"mon": "maandag",
"sun": "zondag",
+ "d": "Dag",
+ "wk": "Week",
+ "mnth": "Maand",
"calVM": "Weergavemodus van kalender",
- "oAP": "%1$s lopende; %2$s onderbroken"
+ "oAP": "%1$s lopende; %2$s onderbroken",
+ "nvr": "Nooit",
+ "otaw": "Ouder dan een week",
+ "otam": "Ouder dan een maand",
+ "otay": "Ouder dan een jaar",
+ "admp": "Schema's automatisch verwijderen",
+ "plsCrt": "Druk op de plusknop om een schema toe te voegen",
+ "ehwmp": "Eet gezond met maaltijdschema's!",
+ "selMT": "Kies het soort maaltijd"
}
diff --git a/app/i18n/pt-BR.json b/app/i18n/pt-BR.json
index 1637eeea..3bb49e54 100644
--- a/app/i18n/pt-BR.json
+++ b/app/i18n/pt-BR.json
@@ -311,20 +311,5 @@
"prsts": "Predefinições",
"delPrst": "Você está prestes a apagar %s das predefinições",
"tmrRm": "Timer removido",
- "notifSetg": "Configurações de notificação",
- "calVM": "Modo de visualização de calendário",
- "oAP": "%1$s em curso, %2$s em pausa",
- "gtD": "Ir à data",
- "random": "Aleatório",
- "ystr": "Ontem",
- "tmrw": "Amanhã",
- "tdy": "Hoje",
- "cpy": "cópia",
- "sat": "sábado",
- "fri": "sexta-feira",
- "thu": "quinta-feira",
- "wed": "quarta-feira",
- "tue": "terça-feira",
- "mon": "segunda-feira",
- "sun": "domingo"
+ "notifSetg": "Configurações de notificação"
}
diff --git a/app/i18n/pt.json b/app/i18n/pt.json
index 7e275628..8694a3ae 100644
--- a/app/i18n/pt.json
+++ b/app/i18n/pt.json
@@ -321,17 +321,28 @@
"ccwt": "Cozinhe com segurança com temporizadores!",
"gtD": "Ir à data",
"random": "Aleatória",
- "cpy": "cópia",
- "oAP": "%1$s em curso, %2$s em pausa",
- "calVM": "Modo de visualização de calendário",
+ "nvr": "Nunca",
+ "otaw": "Mais antigas que 1 semana",
+ "otam": "Mais antigas que 1 mês",
+ "otay": "Mais antigas que 1 ano",
+ "admp": "Eliminar automaticamente planos de refeições",
+ "plsCrt": "Use o botão + para criar uma",
+ "ehwmp": "Coma saudavelmente com planificações de refeições!",
+ "selMT": "Selecionar tipo de refeição",
"ystr": "Ontem",
"tmrw": "Amanhã",
"tdy": "Hoje",
- "sat": "sábado",
- "fri": "sexta-feira",
- "thu": "quinta-feira",
- "wed": "quarta-feira",
- "tue": "terça-feira",
- "mon": "segunda-feira",
- "sun": "domingo"
+ "cpy": "cópia",
+ "sat": "Sábado",
+ "fri": "Sexta-feira",
+ "thu": "Quinta-feira",
+ "wed": "Quarta-feira",
+ "tue": "Terça-feira",
+ "mon": "Segunda-feira",
+ "sun": "Domingo",
+ "d": "Dia",
+ "wk": "Semana",
+ "mnth": "Mês",
+ "calVM": "Modo de vista tipo calendário",
+ "oAP": "%1$s a decorrer, %2$s em pausa"
}
diff --git a/app/i18n/ta.json b/app/i18n/ta.json
index 9a68366a..6cb2f9f1 100644
--- a/app/i18n/ta.json
+++ b/app/i18n/ta.json
@@ -333,5 +333,16 @@
"mon": "திங்கள்",
"sun": "ஞாயிறு",
"calVM": "கேலெண்டர் காட்சி முறை",
- "oAP": "%1$s செயலில் உள்ளது,%2$s இடைநிறுத்தப்பட்டது"
+ "oAP": "%1$s செயலில் உள்ளது,%2$s இடைநிறுத்தப்பட்டது",
+ "d": "நாள்",
+ "wk": "வாரம்",
+ "mnth": "மாதம்",
+ "nvr": "ஒருபோதும்",
+ "otaw": "ஒரு வாரத்திற்கும் மேலானது",
+ "otam": "ஒரு மாதத்திற்கும் மேலானது",
+ "otay": "ஒரு வருடத்திற்கும் மேலானது",
+ "admp": "உணவு திட்டங்களை தானாக நீக்கு",
+ "plsCrt": "ஒன்றை உருவாக்க பிளஸ் பொத்தானைப் பயன்படுத்தவும்",
+ "ehwmp": "உணவு திட்டங்களுடன் ஆரோக்கியமாக சாப்பிடுங்கள்!",
+ "selMT": "உணவு வகையைத் தேர்ந்தெடுக்கவும்"
}
diff --git a/app/main.ts b/app/main.ts
index a5fe7681..f44bab0c 100644
--- a/app/main.ts
+++ b/app/main.ts
@@ -1,45 +1,43 @@
+import Vue from 'nativescript-vue'
+import store from './store'
import {
Application,
AndroidApplication,
ApplicationSettings,
Utils,
- Device,
- Color,
Frame,
} from '@nativescript/core'
-import {
- localize,
- androidLaunchEventLocalizationHandler,
-} from '@nativescript/localize'
-import Vue from 'nativescript-vue'
+import { localize } from '@nativescript/localize'
import EnRecipes from './components/EnRecipes.vue'
import EditRecipe from './components/EditRecipe.vue'
import MealPlanner from './components/MealPlanner.vue'
import CookingTimer from './components/CookingTimer.vue'
-import GroceryList from './components/GroceryList.vue'
-import store from './store'
+
+// import GroceryList from './components/GroceryList.vue'
+
import * as utils from '~/shared/utils'
-export const EventBus = new Vue()
+export const EvtBus = new Vue()
-let renderView: any = EnRecipes
+let renderView = EnRecipes
import CollectionView from '@nativescript-community/ui-collectionview/vue'
Vue.use(CollectionView)
-import { StackLayout, GridLayout, DockLayout } from '@nativescript-rtl/ui'
-Vue.registerElement('RStackLayout', () => StackLayout)
-Vue.registerElement('RGridLayout', () => GridLayout)
-Vue.registerElement('RDockLayout', () => DockLayout)
+
+import { RGridLayout, RStackLayout, RDockLayout, RLabel } from './rtl-ui'
+Vue.registerElement('RGridLayout', () => RGridLayout)
+Vue.registerElement('RStackLayout', () => RStackLayout)
+Vue.registerElement('RDockLayout', () => RDockLayout)
+Vue.registerElement('RLabel', () => RLabel)
import { myMixin } from './shared/mixins'
Vue.mixin(myMixin)
const initFrame = () => {
const vm = store
-
- //MAIN INIT
- vm.commit('setTheme', ApplicationSettings.getString('appTheme', 'sysDef'))
- if (!vm.state.recipes.length) vm.commit('initRecipes')
+ // MainInit
+ vm.commit('setTheme', ApplicationSettings.getString('theme', 'sysDef'))
+ vm.commit('initRecipes')
vm.commit('initMealPlans')
vm.commit('initListItems')
vm.commit('initTimerPresets')
@@ -50,42 +48,11 @@ const initFrame = () => {
hasTimerSound ? JSON.parse(hasTimerSound) : utils.getTones().defaultTone
)
}
-
- // INIT FRAME
- const View = android.view.View as any
+ // InitFrame
const window = Application.android.startActivity.getWindow()
const decorView = window.getDecorView()
- let sdkv = parseInt(Device.sdkVersion)
- function setColors(color) {
- window.setStatusBarColor(new Color(color).android)
- sdkv >= 27 && window.setNavigationBarColor(new Color(color).android)
- }
- switch (vm.state.appTheme) {
- case 'Light':
- setColors('#f1f3f5')
- break
- case 'Dark':
- setColors('#212529')
- break
- default:
- setColors('#000000')
- break
- }
- if (sdkv >= 27)
- decorView.setSystemUiVisibility(
- vm.state.appTheme == 'Light'
- ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR |
- View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
- : View.SYSTEM_UI_FLAG_DARK_STATUS_BAR |
- View.SYSTEM_UI_FLAG_DARK_NAVIGATION_BAR
- )
- else
- decorView.setSystemUiVisibility(
- vm.state.appTheme == 'Light'
- ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
- : View.SYSTEM_UI_FLAG_DARK_STATUS_BAR
- )
- Frame.topmost().className = store.state.appTheme
+ utils.setBarColors(window, decorView, vm.state.theme)
+ Frame.topmost().className = vm.state.theme
}
const showOverLockscreen = () => {
let ctx = Utils.ad.getApplicationContext()
@@ -103,12 +70,9 @@ const showOverLockscreen = () => {
}
}
const intentListener = ({ intent, android }: any) => {
- console.log(intent, android)
let action = ((intent || android).getStringExtra('action') ||
(android && android.getAction())) as string
-
if (action) {
- console.log(action)
switch (action) {
case 'new_recipe':
renderView = EditRecipe
@@ -118,30 +82,47 @@ const intentListener = ({ intent, android }: any) => {
break
case 'timer':
renderView = CookingTimer
- Vue.navigateTo(CookingTimer as any, {
- animated: false,
- })
- break
- case 'grocery':
- renderView = GroceryList
+ switch (ApplicationSettings.getNumber('isTimer', 0)) {
+ case 0:
+ // Closing all modals if available before navigation
+ let modals = Frame.topmost()._getRootModalViews()
+ for (let i = modals.length - 1; i >= 0; i--) {
+ Frame.topmost()
+ ._getRootModalViews()
+ [i].closeModal()
+ }
+ Vue.navigateTo(CookingTimer as any, {
+ animated: false,
+ })
+ ApplicationSettings.setNumber('isTimer', 1)
+ break
+ case 2:
+ Vue.navigateBack()
+ break
+ }
break
+ // case 'grocery':
+ // renderView = GroceryList
+ // break
}
}
}
-Application.on(Application.resumeEvent, (args) => {
- console.log('App Resume')
+Application.on(Application.resumeEvent, () => {
showOverLockscreen()
+ if (
+ utils.sysLocale() !==
+ ApplicationSettings.getString('sysLocale', utils.sysLocale())
+ ) {
+ Frame.reloadPage()
+ utils.updateLocale()
+ }
})
Application.on(Application.launchEvent, (args) => {
- console.log('App Launch')
- console.log('RTL', store.state.RTL)
+ utils.updateLocale()
store.commit('setRTL')
- if (args.android) {
- androidLaunchEventLocalizationHandler()
- intentListener(args)
- }
+ intentListener(args)
Application.android.on(
AndroidApplication.activityNewIntentEvent,
intentListener
@@ -150,7 +131,6 @@ Application.on(Application.launchEvent, (args) => {
})
Application.on(Application.exitEvent, () => {
- console.log('App Exit')
renderView = EnRecipes
Application.android.off(
AndroidApplication.activityNewIntentEvent,
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/app_icon_fg.webp b/app/resources/Android/src/main/res/drawable-hdpi/app_icon_fg.webp
deleted file mode 100644
index da039055..00000000
Binary files a/app/resources/Android/src/main/res/drawable-hdpi/app_icon_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/notify_icon_sil.webp b/app/resources/Android/src/main/res/drawable-hdpi/notify.webp
similarity index 100%
rename from app/resources/Android/src/main/res/drawable-hdpi/notify_icon_sil.webp
rename to app/resources/Android/src/main/res/drawable-hdpi/notify.webp
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/notify_icon.webp b/app/resources/Android/src/main/res/drawable-hdpi/notify_icon.webp
deleted file mode 100644
index ad765b78..00000000
Binary files a/app/resources/Android/src/main/res/drawable-hdpi/notify_icon.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/sc_add.webp b/app/resources/Android/src/main/res/drawable-hdpi/sc_add.webp
index 3c966167..60224430 100644
Binary files a/app/resources/Android/src/main/res/drawable-hdpi/sc_add.webp and b/app/resources/Android/src/main/res/drawable-hdpi/sc_add.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/sc_add_fg.webp b/app/resources/Android/src/main/res/drawable-hdpi/sc_add_fg.webp
deleted file mode 100644
index fef38e89..00000000
Binary files a/app/resources/Android/src/main/res/drawable-hdpi/sc_add_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/sc_grocery.webp b/app/resources/Android/src/main/res/drawable-hdpi/sc_grocery.webp
index e1f015d0..083f3f3d 100644
Binary files a/app/resources/Android/src/main/res/drawable-hdpi/sc_grocery.webp and b/app/resources/Android/src/main/res/drawable-hdpi/sc_grocery.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/sc_grocery_fg.webp b/app/resources/Android/src/main/res/drawable-hdpi/sc_grocery_fg.webp
deleted file mode 100644
index 5e3af964..00000000
Binary files a/app/resources/Android/src/main/res/drawable-hdpi/sc_grocery_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/sc_planner.webp b/app/resources/Android/src/main/res/drawable-hdpi/sc_planner.webp
index 5ef4f9c1..b8b44c96 100644
Binary files a/app/resources/Android/src/main/res/drawable-hdpi/sc_planner.webp and b/app/resources/Android/src/main/res/drawable-hdpi/sc_planner.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/sc_planner_fg.webp b/app/resources/Android/src/main/res/drawable-hdpi/sc_planner_fg.webp
deleted file mode 100644
index 761ad469..00000000
Binary files a/app/resources/Android/src/main/res/drawable-hdpi/sc_planner_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/sc_timer.webp b/app/resources/Android/src/main/res/drawable-hdpi/sc_timer.webp
index d67881cc..abf51865 100644
Binary files a/app/resources/Android/src/main/res/drawable-hdpi/sc_timer.webp and b/app/resources/Android/src/main/res/drawable-hdpi/sc_timer.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-hdpi/sc_timer_fg.webp b/app/resources/Android/src/main/res/drawable-hdpi/sc_timer_fg.webp
deleted file mode 100644
index 4d34a7ac..00000000
Binary files a/app/resources/Android/src/main/res/drawable-hdpi/sc_timer_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/app_icon_fg.webp b/app/resources/Android/src/main/res/drawable-mdpi/app_icon_fg.webp
deleted file mode 100644
index 4f91f941..00000000
Binary files a/app/resources/Android/src/main/res/drawable-mdpi/app_icon_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/notify_icon_sil.webp b/app/resources/Android/src/main/res/drawable-mdpi/notify.webp
similarity index 100%
rename from app/resources/Android/src/main/res/drawable-mdpi/notify_icon_sil.webp
rename to app/resources/Android/src/main/res/drawable-mdpi/notify.webp
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/notify_icon.webp b/app/resources/Android/src/main/res/drawable-mdpi/notify_icon.webp
deleted file mode 100644
index dd7cfcdf..00000000
Binary files a/app/resources/Android/src/main/res/drawable-mdpi/notify_icon.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/sc_add.webp b/app/resources/Android/src/main/res/drawable-mdpi/sc_add.webp
index 290f87b0..d30ebe20 100644
Binary files a/app/resources/Android/src/main/res/drawable-mdpi/sc_add.webp and b/app/resources/Android/src/main/res/drawable-mdpi/sc_add.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/sc_add_fg.webp b/app/resources/Android/src/main/res/drawable-mdpi/sc_add_fg.webp
deleted file mode 100644
index 17d50d70..00000000
Binary files a/app/resources/Android/src/main/res/drawable-mdpi/sc_add_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/sc_grocery.webp b/app/resources/Android/src/main/res/drawable-mdpi/sc_grocery.webp
index 4318670e..51bf6dc8 100644
Binary files a/app/resources/Android/src/main/res/drawable-mdpi/sc_grocery.webp and b/app/resources/Android/src/main/res/drawable-mdpi/sc_grocery.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/sc_grocery_fg.webp b/app/resources/Android/src/main/res/drawable-mdpi/sc_grocery_fg.webp
deleted file mode 100644
index 15020eb9..00000000
Binary files a/app/resources/Android/src/main/res/drawable-mdpi/sc_grocery_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/sc_planner.webp b/app/resources/Android/src/main/res/drawable-mdpi/sc_planner.webp
index 816f2371..f26c15d0 100644
Binary files a/app/resources/Android/src/main/res/drawable-mdpi/sc_planner.webp and b/app/resources/Android/src/main/res/drawable-mdpi/sc_planner.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/sc_planner_fg.webp b/app/resources/Android/src/main/res/drawable-mdpi/sc_planner_fg.webp
deleted file mode 100644
index 3d4f4293..00000000
Binary files a/app/resources/Android/src/main/res/drawable-mdpi/sc_planner_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/sc_timer.webp b/app/resources/Android/src/main/res/drawable-mdpi/sc_timer.webp
index ac5889e7..fb0b1bed 100644
Binary files a/app/resources/Android/src/main/res/drawable-mdpi/sc_timer.webp and b/app/resources/Android/src/main/res/drawable-mdpi/sc_timer.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-mdpi/sc_timer_fg.webp b/app/resources/Android/src/main/res/drawable-mdpi/sc_timer_fg.webp
deleted file mode 100644
index 95e87029..00000000
Binary files a/app/resources/Android/src/main/res/drawable-mdpi/sc_timer_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/app_icon_fg.webp b/app/resources/Android/src/main/res/drawable-xhdpi/app_icon_fg.webp
deleted file mode 100644
index 65197473..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xhdpi/app_icon_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/notify_icon_sil.webp b/app/resources/Android/src/main/res/drawable-xhdpi/notify.webp
similarity index 100%
rename from app/resources/Android/src/main/res/drawable-xhdpi/notify_icon_sil.webp
rename to app/resources/Android/src/main/res/drawable-xhdpi/notify.webp
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/notify_icon.webp b/app/resources/Android/src/main/res/drawable-xhdpi/notify_icon.webp
deleted file mode 100644
index 14cef5f8..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xhdpi/notify_icon.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/sc_add.webp b/app/resources/Android/src/main/res/drawable-xhdpi/sc_add.webp
index 1a377bea..34d8084c 100644
Binary files a/app/resources/Android/src/main/res/drawable-xhdpi/sc_add.webp and b/app/resources/Android/src/main/res/drawable-xhdpi/sc_add.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/sc_add_fg.webp b/app/resources/Android/src/main/res/drawable-xhdpi/sc_add_fg.webp
deleted file mode 100644
index f7ed5af8..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xhdpi/sc_add_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/sc_grocery.webp b/app/resources/Android/src/main/res/drawable-xhdpi/sc_grocery.webp
index 69a63422..16f190b2 100644
Binary files a/app/resources/Android/src/main/res/drawable-xhdpi/sc_grocery.webp and b/app/resources/Android/src/main/res/drawable-xhdpi/sc_grocery.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/sc_grocery_fg.webp b/app/resources/Android/src/main/res/drawable-xhdpi/sc_grocery_fg.webp
deleted file mode 100644
index 4e2e4a99..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xhdpi/sc_grocery_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/sc_planner.webp b/app/resources/Android/src/main/res/drawable-xhdpi/sc_planner.webp
index 4ed87d31..b3d85b44 100644
Binary files a/app/resources/Android/src/main/res/drawable-xhdpi/sc_planner.webp and b/app/resources/Android/src/main/res/drawable-xhdpi/sc_planner.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/sc_planner_fg.webp b/app/resources/Android/src/main/res/drawable-xhdpi/sc_planner_fg.webp
deleted file mode 100644
index b712b04d..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xhdpi/sc_planner_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/sc_timer.webp b/app/resources/Android/src/main/res/drawable-xhdpi/sc_timer.webp
index 144623a4..a35ceb23 100644
Binary files a/app/resources/Android/src/main/res/drawable-xhdpi/sc_timer.webp and b/app/resources/Android/src/main/res/drawable-xhdpi/sc_timer.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xhdpi/sc_timer_fg.webp b/app/resources/Android/src/main/res/drawable-xhdpi/sc_timer_fg.webp
deleted file mode 100644
index dd1d2049..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xhdpi/sc_timer_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/app_icon_fg.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/app_icon_fg.webp
deleted file mode 100644
index 0a5230e5..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxhdpi/app_icon_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/notify_icon_sil.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/notify.webp
similarity index 100%
rename from app/resources/Android/src/main/res/drawable-xxhdpi/notify_icon_sil.webp
rename to app/resources/Android/src/main/res/drawable-xxhdpi/notify.webp
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/notify_icon.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/notify_icon.webp
deleted file mode 100644
index c6b575b9..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxhdpi/notify_icon.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_add.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_add.webp
index be7c550a..af837ffa 100644
Binary files a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_add.webp and b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_add.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_add_fg.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_add_fg.webp
deleted file mode 100644
index e0096ef5..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_add_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_grocery.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_grocery.webp
index 118157c7..b8799e0d 100644
Binary files a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_grocery.webp and b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_grocery.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_grocery_fg.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_grocery_fg.webp
deleted file mode 100644
index 81dbd757..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_grocery_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_planner.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_planner.webp
index 25317794..e406c228 100644
Binary files a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_planner.webp and b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_planner.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_planner_fg.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_planner_fg.webp
deleted file mode 100644
index 21bb98fa..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_planner_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_timer.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_timer.webp
index 21239054..5e8aa59d 100644
Binary files a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_timer.webp and b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_timer.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_timer_fg.webp b/app/resources/Android/src/main/res/drawable-xxhdpi/sc_timer_fg.webp
deleted file mode 100644
index cc7b14c5..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxhdpi/sc_timer_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/app_icon_fg.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/app_icon_fg.webp
deleted file mode 100644
index d1ff722c..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxxhdpi/app_icon_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/notify_icon_sil.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/notify.webp
similarity index 100%
rename from app/resources/Android/src/main/res/drawable-xxxhdpi/notify_icon_sil.webp
rename to app/resources/Android/src/main/res/drawable-xxxhdpi/notify.webp
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/notify_icon.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/notify_icon.webp
deleted file mode 100644
index 494cf34a..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxxhdpi/notify_icon.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_add.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_add.webp
index a21ac1b1..8cc3a92c 100644
Binary files a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_add.webp and b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_add.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_add_fg.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_add_fg.webp
deleted file mode 100644
index d431d913..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_add_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_grocery.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_grocery.webp
index 3c944bda..b3f9904b 100644
Binary files a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_grocery.webp and b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_grocery.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_grocery_fg.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_grocery_fg.webp
deleted file mode 100644
index bd147b6f..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_grocery_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_planner.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_planner.webp
index 0c98f90a..2d710d9c 100644
Binary files a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_planner.webp and b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_planner.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_planner_fg.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_planner_fg.webp
deleted file mode 100644
index 14ef2e2f..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_planner_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_timer.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_timer.webp
index 43399182..92d92f4d 100644
Binary files a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_timer.webp and b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_timer.webp differ
diff --git a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_timer_fg.webp b/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_timer_fg.webp
deleted file mode 100644
index cd0438d8..00000000
Binary files a/app/resources/Android/src/main/res/drawable-xxxhdpi/sc_timer_fg.webp and /dev/null differ
diff --git a/app/resources/Android/src/main/res/drawable/app_icon_fg.xml b/app/resources/Android/src/main/res/drawable/app_icon_fg.xml
new file mode 100644
index 00000000..7ef44945
--- /dev/null
+++ b/app/resources/Android/src/main/res/drawable/app_icon_fg.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/resources/Android/src/main/res/drawable/sc_add_fg.xml b/app/resources/Android/src/main/res/drawable/sc_add_fg.xml
new file mode 100644
index 00000000..20ea7115
--- /dev/null
+++ b/app/resources/Android/src/main/res/drawable/sc_add_fg.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/app/resources/Android/src/main/res/drawable/sc_grocery_fg.xml b/app/resources/Android/src/main/res/drawable/sc_grocery_fg.xml
new file mode 100644
index 00000000..b59ced12
--- /dev/null
+++ b/app/resources/Android/src/main/res/drawable/sc_grocery_fg.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/app/resources/Android/src/main/res/drawable/sc_planner_fg.xml b/app/resources/Android/src/main/res/drawable/sc_planner_fg.xml
new file mode 100644
index 00000000..03ea0625
--- /dev/null
+++ b/app/resources/Android/src/main/res/drawable/sc_planner_fg.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/app/resources/Android/src/main/res/drawable/sc_timer_fg.xml b/app/resources/Android/src/main/res/drawable/sc_timer_fg.xml
new file mode 100644
index 00000000..da3c025c
--- /dev/null
+++ b/app/resources/Android/src/main/res/drawable/sc_timer_fg.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/app/resources/Android/src/main/res/values-ar/strings.xml b/app/resources/Android/src/main/res/values-ar/strings.xml
index 08840dd5..38c9ec85 100644
--- a/app/resources/Android/src/main/res/values-ar/strings.xml
+++ b/app/resources/Android/src/main/res/values-ar/strings.xml
@@ -1,6 +1,5 @@
- "Timer cleared"
"ثوان"
"ساعات"
"ساعة"
@@ -9,36 +8,35 @@
"مدة التأخير"
"اهتزاز المؤقت"
"صوت المؤقت"
- "Added to presets"
+ "أضيف إلى الإعدادات المسبقة"
"لأي وصفة؟"
- "Timer presets"
"PRESETS"
"مؤقت %1$s"
"التأخير"
"قف"
"ابدأ"
"مؤقت جديد"
- "Cooking Timer"
+ "مؤقت الطبخ"
"System default + Black"
- "Backed up to %1$s"
- "Yield"
- "Yield unit"
- "Yield quantity"
+ "نسخ احتياطياً إلى %1$s"
+ "الانتاج"
+ "وحدة الانتاج"
+ "كمية الإنتاج"
"أمس"
"WED"
"قبل %1$s أسابيع"
"فيتنامية"
"نباتي"
"نباتي صرف"
- "Untitled Recipe"
+ "وصفة بلا عنوان"
"تغيرات غبر محفوظة"
"وحدة"
"وحدة"
- "Undefined"
+ "غير معرف"
"تركية"
"TUE"
- "tsp"
- "separate with spaces"
+ "ملعقة كبيرة"
+ "افصل بمساقات"
"العلامات"
"ابحث في كل الوصفات؟"
"حاول لاحقاً"
@@ -51,7 +49,7 @@
"السمة"
"تايلندية"
"ملعقة شاي"
- "tbsp"
+ "ملعقة كبيرة"
"ملعقة"
"System default"
"ابدأ الاسبوع يوم الاثنين"
@@ -61,10 +59,10 @@
"SUN"
"ابدأ إضافة وصفاتك!"
"خطوة"
- "stick"
+ "اصبع"
"التقييم النجمي"
"شارك وصفة باستعمال..."
- "Sort"
+ "افرز"
"شارك صورة الوصفة باستعمال..."
"سري لانكية"
"اسبانية"
@@ -78,7 +76,7 @@
"شارك"
"الإعدادات"
"SET"
- "Serving"
+ "حصة"
"ابحث"
"سبتمبر"
"اختر وصفة"
@@ -89,35 +87,35 @@
"سلطات"
"روسية"
"أعد التشغيل"
- "Remove photo"
+ "أزل الصورة"
"لفة"
- "You are about to remove %1$s from the yield unit list"
- "You are about to remove %1$s from the unit list"
- "Note removed"
- "Instruction removed"
- "Ingredient removed"
- "You are about to remove %1$s from the cuisine list"
- "Combination removed"
- "You are about to remove %1$s from the category list"
+ "أنت على وشك أن تزيل %1$s من قائمة وحدات الإنتاج"
+ "أنت على وشك أن تزيل %1$s من قائمة الوحدات"
+ "أزيلت الملاحظة"
+ "أزيلت التعليمة"
+ "أزيل المكون"
+ "أنت على وشك أن تزيل %1$s من قائمة المطابخ"
+ "أزيلت المجموعة"
+ "أنت على وشك أن تزيل %1$s من قائمة الأصناف"
"أرز"
- "Reset yield unit list"
+ "أعد تعيين قائمة وحدات الإنتاج"
"Reset unit list"
- "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
- "Reset done"
- "Reset cuisine list"
- "Reset category list"
- "Reset"
- "Recipe not found"
- "Required %1$s"
- "Updated:"
+ "ستؤدي إعادة تعيين قائمة ما إلى حذف الإدخالات التي أنشأها المستخدم واستعادة الإدخالات الافتراضية. الوصفات الحالية لن تتأثر."
+ "انتهت إعادة التعيين"
+ "أعد تعيين قائمة المطابخ"
+ "أعد تعيين قائمة الأصناف"
+ "إعادة تعيين"
+ "لم يعثر على الوصفة"
+ "%1$s مطلوب(ة)"
+ "حدثت:"
"وصفتي الصحية"
"الوصفات"
- "Recipe removed"
+ "أزيلت الوصفة"
"صورة الوصفة"
"لا شيء هنا! أضف بعض الوصفات ثم حاول مجدداً"
"المستورد:"
- "recipes found"
- "Already exist:"
+ "وصفات عثرت"
+ "موجود أصلاً:"
"الوصفة"
"REMOVE"
"التقييم"
@@ -135,7 +133,7 @@
"قطعة"
"قطعة"
"صورة الوصفة"
- "Photo Grid"
+ "شبكة صور"
"فطيرة"
"باستا"
"oz"
@@ -144,14 +142,14 @@
"الأقدم أولاً"
"OK"
"أكتوبر"
- "New yield unit"
+ "وحدة إنتاج جديدة"
"صنف جديد"
"نوفمبر"
"ملاحظات"
- "None of the recipes here matches your search"
+ "لا توجد وصفات هنا تطابق بحثك"
"لا وصفات مطابقة لبحثك"
"نودلز"
- "No favourites yet"
+ "لا مفضلات حتى الآن"
"مقياس التسارع إما معطل أو لا يعمل"
"ملاحظة"
"ليس الآن"
@@ -164,8 +162,8 @@
"MON"
"متوسطة"
"مل"
- "Minimal"
- "sec"
+ "الأقل"
+ "ثان"
"min"
"مللتر"
"مغ"
@@ -182,9 +180,9 @@
"لتر"
"وضع عرض القائمة"
"فاتح"
- "leaf"
+ "ورقة"
"lb"
- "Last updated"
+ "آخر تحديث"
"كبير"
"اللغة"
"ل"
@@ -205,7 +203,7 @@
"إيرلندية"
"ملف غير صحيح"
"الواجهة"
- "Instructions"
+ "التعليمات"
"المكونات"
"هندية"
"إن"
@@ -221,7 +219,7 @@
"شبكة"
"إغريقية"
"غرام"
- "اعرض على github"
+ "اعرض على GitHub"
"ألمانية"
"جالون"
"جال"
@@ -229,7 +227,7 @@
"وصفاتك المفضلة مسرودة هنا"
"FRI"
"فرنسية"
- "Fluid Ounce"
+ "أونصة سائلة"
"المصفاة"
"fl oz"
"الوصفات المصفاة"
@@ -239,7 +237,7 @@
"نجح التصدير"
"جار التصدير"
"صدر نسخة احتياطية كاملة"
- ""
+ "EnRecipes"
"إنجليزية"
"مصرية"
"عدل الوصفة"
@@ -254,8 +252,8 @@
"مستوى الصعوبة"
"مفصل"
"حلا"
- "You are about to permanently delete %1$s"
- "You are about to permanently delete the recipe %1$s"
+ "أنت على وشك أنت تحذف %1$s أبدياً"
+ "أنت على وشك أن تحذف الوصفة %1$s أبدياً"
"ديسمبر"
"DELETE"
"قاعدة البيانات"
@@ -265,12 +263,12 @@
"كأس"
"كأس"
"المطبخ"
- "Created"
+ "أنشئت"
"قص الصورة"
- "Cooking time"
- "Confirm"
+ "وقت الطبخ"
+ "أكد"
"أكمل"
- "Combinations"
+ "مجموعات"
"سم"
"فص"
"صينية"
@@ -294,12 +292,12 @@
"أبريل"
"إعادة تشغيل التطبيق متطلبة"
"طبق"
- "EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"
+ "EnRecipes كتاب طبخ مفتوح المصدر صديق للخصوصية يتيح لك إنشاء وصفاتك و إدارتها ومشاركتها"
"مقبلات"
- "Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."
- ""
- ""
- ""
+ "شورك عبر EnRecipes. احصل عليه على F-Droid, IzzyOnDroid, أو متجر بلاي."
+ "EnRecipes"
+ "EnRecipes"
+ "EnRecipes"
"أضف ملاحظة"
"أضف جديدة"
"أمريكية"
@@ -313,6 +311,42 @@
"أضف"
"حول"
"ألحق صورة"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Yesterday"
+ "Tomorrow"
+ "Today"
+ "copy"
+ "Saturday"
+ "Friday"
+ "Thursday"
+ "Wednesday"
+ "Tuesday"
+ "Monday"
+ "Sunday"
+ "Day"
+ "Week"
+ "Month"
+ "Calendar view mode"
+ "%1$s ongoing, %2$s paused"
+ "Tap to view"
+ "Dismiss all timers"
+ "Dismiss"
+ "%1$s timers expired"
+ "%1$s was delayed by %2$s"
+ "Preset time updated"
+ "Cook confidently with timers!"
+ "Go to date"
+ "Random"
"Notification settings"
"Timer removed"
+ "You are about to delete %1$s from the presets"
+ "Presets"
diff --git a/app/resources/Android/src/main/res/values-ca/strings.xml b/app/resources/Android/src/main/res/values-ca/strings.xml
deleted file mode 100644
index 8931d5d7..00000000
--- a/app/resources/Android/src/main/res/values-ca/strings.xml
+++ /dev/null
@@ -1,318 +0,0 @@
-
-
- "s"
- "DC."
- "Vegetarianes"
- "Veganes"
- "Recepta sense títol"
- "Canvis no desats"
- "Sense definir"
- "DT."
- "Etiquetes"
- "Per a provar més tard"
- "Tradueix"
- "DJ."
- "Culleradeta"
- "Cullerada"
- "DG."
- "Espanyola"
- "Brous"
- "piscolabis"
- "Guarnicions"
- "Comparteix"
- "Paràmetres"
- "DEFINEIX"
- "Ració"
- "Cerca"
- "setembre"
- "Peix i marisc"
- "Salses"
- "DS."
- "Amanides"
- "REINICIA"
- "Arròs"
- "Recepta com a text"
- "Lliura"
- "Planificador d’àpats"
- "Peça"
- "Foto de la recepta"
- "Pasta"
- "Unça"
- "D’acord"
- "octubre"
- "Categoria nova"
- "novembre"
- "Fideus"
- "ARA NO"
- "DL."
- "Mil·lilitre"
- "Mexicana"
- "Carn"
- "maig"
- "març"
- "Litre"
- "Quilogram"
- "juny"
- "juliol"
- "gener"
- "El fitxer no és vàlid"
- "Ha fallat la importació"
- "Llista de queviures"
- "Graella"
- "Gram"
- "Galó"
- "DV."
- "Unça líquida"
- "febrer"
- "Preferits"
- "EnRecipes"
- "Aquesta recepta té canvis no desats. Què voleu fer?"
- "DESCARTA’LS"
- "Postres"
- "desembre"
- "SUPRIMEIX"
- "Tassa"
- "Escapça la foto"
- "Confirma"
- "CONTINUA"
- "Pans"
- "Begudes"
- "Barbacoes"
- "agost"
- "abril"
- "Cal reiniciar l’aplicació"
- "L’EnRecipes és un receptari digital, de codi obert i privat, que us permet crear, gestionar i compartir les vostres receptes"
- "Aperitius"
- "EnRecipes"
- "EnRecipes"
- "EnRecipes"
- "AFEGEIX-NE UN DE NOU"
- "Totes les etiquetes"
- "Totes les categories"
- "Quant a"
- "Notification settings"
- "Timer removed"
- "seconds"
- "hours"
- "hour"
- "minutes"
- "minute"
- "Delay duration"
- "Timer vibrate"
- "Timer sound"
- "Added to presets"
- "for which recipe?"
- "Timer presets"
- "PRESETS"
- "Timer %1$s"
- "Delay"
- "Stop"
- "START"
- "New timer"
- "Cooking Timer"
- "System default + Black"
- "Backed up to %1$s"
- "Yield"
- "Yield unit"
- "Yield quantity"
- "yesterday"
- "%1$s weeks ago"
- "Vietnamese"
- "Unit"
- "unit"
- "Turkish"
- "tsp"
- "separate with spaces"
- "SEARCH IN ALL THE RECIPES?"
- "You tried this recipe %1$s"
- "today"
- "Recipes you want to try later are listed here"
- "Title"
- "Theme"
- "Thai"
- "tbsp"
- "System default"
- "Start week on Monday"
- "Swedish"
- "Helps you choose what to cook when you can\'t decide"
- "Shake to view random recipe"
- "Start adding your recipes!"
- "Step"
- "stick"
- "Star rating"
- "Share recipe using..."
- "Sort"
- "Share recipe photo using..."
- "Sri Lankan"
- "small"
- "selected"
- "Slowest first"
- "Simple"
- "Select recipe"
- "Scottish"
- "Russian"
- "Remove photo"
- "Roll"
- "You are about to remove %1$s from the yield unit list"
- "You are about to remove %1$s from the unit list"
- "Note removed"
- "Instruction removed"
- "Ingredient removed"
- "You are about to remove %1$s from the cuisine list"
- "Combination removed"
- "You are about to remove %1$s from the category list"
- "Reset yield unit list"
- "Reset unit list"
- "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
- "Reset done"
- "Reset cuisine list"
- "Reset category list"
- "Reset"
- "Recipe not found"
- "Required %1$s"
- "Updated:"
- "My Healthy Recipe"
- "recipes"
- "Recipe removed"
- "Recipe photo"
- "Nothing here! Add some recipes and try again"
- "Imported:"
- "recipes found"
- "Already exist:"
- "REMOVE"
- "Rating"
- "Quickest first"
- "qt"
- "pt"
- "Privacy policy"
- "Preparation time"
- "Poultry"
- "Portuguese"
- "Use the plus button to add one"
- "pinch"
- "piece"
- "Photo Grid"
- "Patty"
- "oz"
- "Options"
- "Oldest first"
- "New yield unit"
- "Notes"
- "None of the recipes here matches your search"
- "No recipes match your search"
- "No favourites yet"
- "Accelerometer sensor is either disabled or is not working"
- "Note"
- "Restart EnRecipes to use the new language"
- "Nigerian"
- "New unit"
- "New recipe"
- "Newest first"
- "New cuisine"
- "Moderate"
- "ml"
- "Minimal"
- "min"
- "mg"
- "medium"
- "Main dishes"
- "%1$s months ago"
- "Lunch"
- "a long time ago"
- "Loaf"
- "List view mode"
- "Light"
- "leaf"
- "lb"
- "Last updated"
- "large"
- "Language"
- "l"
- "Korean"
- "kg"
- "Kenyan"
- "KEEP EDITING"
- "Join the Telegram group"
- "Jewish"
- "Japanese"
- "Jamaican"
- "Italian"
- "Item"
- "Irish"
- "Interface"
- "Instructions"
- "Ingredients"
- "Indian"
- "in"
- "Import success"
- "Import in progress"
- "Supports full backups exported by this app"
- "Import data"
- "hr"
- "Healthy"
- "User guide"
- "Greek"
- "View on GitHub"
- "German"
- "gal"
- "g"
- "Your favourite recipes are listed here"
- "French"
- "Filter"
- "fl oz"
- "Filtered recipes"
- "Filipino"
- "Export success"
- "Export in progress"
- "Export full backup"
- "English"
- "Egyptian"
- "Edit recipe"
- "Easy"
- "dstspn"
- "drop"
- "dozen"
- "Donate"
- "Dinner"
- "Difficulty level"
- "Detailed"
- "You are about to permanently delete %1$s"
- "You are about to permanently delete the recipe %1$s"
- "Database"
- "Dark"
- "Danish"
- "%1$s days ago"
- "cup"
- "Cuisine"
- "Created"
- "Cooking time"
- "Combinations"
- "cm"
- "clove"
- "Chinese"
- "Challenging"
- "CANCEL"
- "Category"
- "The backup file was modified elsewhere"
- "Generates a ZIP file containing all your data that can be imported back"
- "Malformed or corrupt backup file"
- "Backup folder"
- "The backup file is empty"
- "British"
- "Breakfast"
- "Brazilian"
- "Black"
- "ADD STEP"
- "APPLY"
- "Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."
- "ADD NOTE"
- "American"
- "All Cuisines"
- "ADD INGREDIENT"
- "Add a recipe to perform a backup"
- "ADD COMBINATION"
- "All done!"
- "ADD"
- "Attach a photo"
- "tmrClr"
-
diff --git a/app/resources/Android/src/main/res/values-da/strings.xml b/app/resources/Android/src/main/res/values-da/strings.xml
index f0da2471..5a89f00d 100644
--- a/app/resources/Android/src/main/res/values-da/strings.xml
+++ b/app/resources/Android/src/main/res/values-da/strings.xml
@@ -1,5 +1,9 @@
+ "Forindstillinger"
+ "Du er ved at slette %1$s fra de forudindstillinger"
+ "Timer fjernet"
+ "Indstillinger for meddelelser"
"sekunder"
"minutter"
"minut"
@@ -8,17 +12,15 @@
"Timeren %1$s"
"Timeren lyd"
"FORUDSÆTTER"
- "Timeren forindstillinger"
"til hvilken opskrift?"
"Tilføjet til forudindstillinger"
"timers"
"timer"
- "Timeren er slettet"
"Kogetid Timer"
"Ny timer"
"STARTER"
"Stopper"
- "Forsinkelse"
+ "Udset"
"s"
"Systemstandard + sort"
"November"
@@ -313,6 +315,38 @@
"American"
"Fuldendt!"
"Om"
- "Notification settings"
- "Timer removed"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Yesterday"
+ "Tomorrow"
+ "Today"
+ "copy"
+ "Saturday"
+ "Friday"
+ "Thursday"
+ "Wednesday"
+ "Tuesday"
+ "Monday"
+ "Sunday"
+ "Day"
+ "Week"
+ "Month"
+ "Calendar view mode"
+ "%1$s ongoing, %2$s paused"
+ "Tap to view"
+ "Dismiss all timers"
+ "Dismiss"
+ "%1$s timers expired"
+ "%1$s was delayed by %2$s"
+ "Preset time updated"
+ "Cook confidently with timers!"
+ "Go to date"
+ "Random"
diff --git a/app/resources/Android/src/main/res/values-de/strings.xml b/app/resources/Android/src/main/res/values-de/strings.xml
index 4b6c6923..1730d0da 100644
--- a/app/resources/Android/src/main/res/values-de/strings.xml
+++ b/app/resources/Android/src/main/res/values-de/strings.xml
@@ -1,6 +1,42 @@
- "Timer gelöscht"
+ "Mahlzeitentyp auswählen"
+ "Iss gesund mit Essensplänen!"
+ "Verwende die Plus-Taste, um einen zu erstellen"
+ "Mahlzeitenpläne automatisch löschen"
+ "Älter als ein Jahr"
+ "Älter als ein Monat"
+ "Älter als eine Woche"
+ "Nie"
+ "Monat"
+ "Woche"
+ "Tag"
+ "Modus der Kalenderansicht"
+ "Sonntag"
+ "Montag"
+ "Dienstag"
+ "Mittwoch"
+ "Donnerstag"
+ "Freitag"
+ "Samstag"
+ "Kopie"
+ "Heute"
+ "Morgen"
+ "Gestern"
+ "%1$s laufend, %2$s angehalten"
+ "Zufällig"
+ "Zu Datum gehen"
+ "Koche selbstbewusst mit Kurzzeitweckern!"
+ "Voreingestellte Zeit aktualisiert"
+ "%1$s wurde um %2$s verzögert"
+ "%1$s Kurzzeitwecker abgelaufen"
+ "Verwerfen"
+ "Alle Kurzzeitwecker verwerfen"
+ "Zum Anzeigen tippen"
+ "Voreinstellungen"
+ "Du bist dabei, %1$s aus den Voreinstellungen zu löschen"
+ "Benachrichtigungseinstellungen"
+ "Kurzzeitwecker entfernt"
"Verzögerung"
"Verzögerungsdauer"
"Minute"
@@ -12,14 +48,13 @@
"Voreinstellungen"
"für welches Rezept?"
"Zu Voreinstellungen hinzugefügt"
- "Timer-Voreinstellungen"
- "Timerton"
- "Timervibration"
- "sec"
- "Kochtimer"
- "Neuer Timer"
+ "Kurzzeitweckerton"
+ "Kurzzeitweckervibration"
+ "s"
+ "Kurzzeitwecker"
+ "Neuer Kurzzeitwecker"
"START"
- "Timer %1$s"
+ "Kurzzeitwecker %1$s"
"Systemstandard + schwarz"
"Gesichert in %1$s"
"Ergebnis"
@@ -313,6 +348,5 @@
"HINZUFÜGEN"
"Über"
"Foto anhängen"
- "Notification settings"
- "Timer removed"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-en-rIN/strings.xml b/app/resources/Android/src/main/res/values-en-rIN/strings.xml
index c40b78ae..2f506485 100644
--- a/app/resources/Android/src/main/res/values-en-rIN/strings.xml
+++ b/app/resources/Android/src/main/res/values-en-rIN/strings.xml
@@ -1,6 +1,42 @@
- "Timer cleared"
+ "Select meal type"
+ "Eat healthy with meal plans!"
+ "Use the plus button to create one"
+ "Auto delete meal plans"
+ "Older than a year"
+ "Older than a month"
+ "Older than a week"
+ "Never"
+ "Month"
+ "Week"
+ "Day"
+ "%1$s ongoing, %2$s paused"
+ "Calendar view mode"
+ "Sunday"
+ "Monday"
+ "Tuesday"
+ "Wednesday"
+ "Thursday"
+ "Friday"
+ "Saturday"
+ "copy"
+ "Today"
+ "Tomorrow"
+ "Yesterday"
+ "Random"
+ "Go to date"
+ "Cook confidently with timers!"
+ "Preset time updated"
+ "%1$s was delayed by %2$s"
+ "%1$s timers expired"
+ "Dismiss"
+ "Dismiss all timers"
+ "Tap to view"
+ "Presets"
+ "You are about to delete %1$s from the presets"
+ "Timer removed"
+ "Notification settings"
"Delay"
"Delay duration"
"minute"
@@ -15,7 +51,6 @@
"Stop"
"Timer %1$s"
"PRESETS"
- "Timer presets"
"for which recipe?"
"Added to presets"
"Timer sound"
@@ -313,6 +348,5 @@
"ADD"
"About"
"Attach a photo"
- "Notification settings"
- "Timer removed"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-en-rUS/strings.xml b/app/resources/Android/src/main/res/values-en-rUS/strings.xml
index 8abaf9d7..a925e0b7 100644
--- a/app/resources/Android/src/main/res/values-en-rUS/strings.xml
+++ b/app/resources/Android/src/main/res/values-en-rUS/strings.xml
@@ -1,6 +1,42 @@
- "Timer cleared"
+ "Select meal type"
+ "Eat healthy with meal plans!"
+ "Use the plus button to create one"
+ "Auto delete meal plans"
+ "Older than a year"
+ "Older than a month"
+ "Older than a week"
+ "Never"
+ "Month"
+ "Week"
+ "Day"
+ "%1$s ongoing, %2$s paused"
+ "Calendar view mode"
+ "Sunday"
+ "Monday"
+ "Tuesday"
+ "Wednesday"
+ "Thursday"
+ "Friday"
+ "Saturday"
+ "copy"
+ "Today"
+ "Tomorrow"
+ "Yesterday"
+ "Random"
+ "Go to date"
+ "Cook confidently with timers!"
+ "Preset time updated"
+ "%1$s was delayed by %2$s"
+ "%1$s timers expired"
+ "Dismiss"
+ "Dismiss all timers"
+ "Tap to view"
+ "Presets"
+ "You are about to delete %1$s from the presets"
+ "Timer removed"
+ "Notification settings"
"Delay"
"Delay duration"
"minute"
@@ -15,7 +51,6 @@
"Stop"
"Timer %1$s"
"PRESETS"
- "Timer presets"
"for which recipe?"
"Added to presets"
"Timer sound"
@@ -313,6 +348,5 @@
"ADD"
"About"
"Attach a photo"
- "Notification settings"
- "Timer removed"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-es-rAR/strings.xml b/app/resources/Android/src/main/res/values-es-rAR/strings.xml
deleted file mode 100644
index 6ee9f9b3..00000000
--- a/app/resources/Android/src/main/res/values-es-rAR/strings.xml
+++ /dev/null
@@ -1,318 +0,0 @@
-
-
- "Adjuntá una foto"
- "Acerca de"
- "AGREGAR"
- "¡Todo listo!"
- "AGREGAR COMBINACIÓN"
- "Agregá recetas para hacer un backup"
- "AGREGAR INGREDIENTE"
- "Todas las categorías"
- "Americana"
- "AGREGAR NUEVA"
- "AGREGAR NOTA"
- "Compartido vía EnRecipes. Conseguilo en F-Droid, IzzyOnDroid o en la Play Store."
- "Aperitivos"
- "EnRecipes es un libro de cocina digital, privado y de código abierto, que te permite crear, administrar y compartir tus recetas"
- "APLICAR"
- "Se requiere reiniciar la app"
- "Abril"
- "AGREGAR PASO"
- "Agosto"
- "s"
- "Notification settings"
- "Timer removed"
- "seconds"
- "hours"
- "hour"
- "minutes"
- "minute"
- "Delay duration"
- "Timer vibrate"
- "Timer sound"
- "Added to presets"
- "for which recipe?"
- "Timer presets"
- "PRESETS"
- "Timer %1$s"
- "Delay"
- "Stop"
- "START"
- "New timer"
- "Cooking Timer"
- "System default + Black"
- "Backed up to %1$s"
- "Yield"
- "Yield unit"
- "Yield quantity"
- "yesterday"
- "WED"
- "%1$s weeks ago"
- "Vietnamese"
- "Vegetarian"
- "Vegan"
- "Untitled Recipe"
- "Unsaved changes"
- "Unit"
- "unit"
- "Undefined"
- "Turkish"
- "TUE"
- "tsp"
- "separate with spaces"
- "Tags"
- "SEARCH IN ALL THE RECIPES?"
- "Try Later"
- "Translate"
- "You tried this recipe %1$s"
- "today"
- "Recipes you want to try later are listed here"
- "Title"
- "THU"
- "Theme"
- "Thai"
- "Teaspoon"
- "tbsp"
- "Tablespoon"
- "System default"
- "Start week on Monday"
- "Swedish"
- "Helps you choose what to cook when you can\'t decide"
- "Shake to view random recipe"
- "SUN"
- "Start adding your recipes!"
- "Step"
- "stick"
- "Star rating"
- "Share recipe using..."
- "Sort"
- "Share recipe photo using..."
- "Sri Lankan"
- "Spanish"
- "Soups"
- "Snacks"
- "small"
- "selected"
- "Slowest first"
- "Simple"
- "Side dishes"
- "Share"
- "Settings"
- "SET"
- "Serving"
- "Search"
- "September"
- "Select recipe"
- "Seafood"
- "Scottish"
- "Sauces"
- "SAT"
- "Salads"
- "Russian"
- "RESTART"
- "Remove photo"
- "Roll"
- "You are about to remove %1$s from the yield unit list"
- "You are about to remove %1$s from the unit list"
- "Note removed"
- "Instruction removed"
- "Ingredient removed"
- "You are about to remove %1$s from the cuisine list"
- "Combination removed"
- "You are about to remove %1$s from the category list"
- "Rice"
- "Reset yield unit list"
- "Reset unit list"
- "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
- "Reset done"
- "Reset cuisine list"
- "Reset category list"
- "Reset"
- "Recipe not found"
- "Required %1$s"
- "Updated:"
- "My Healthy Recipe"
- "recipes"
- "Recipe removed"
- "Recipe photo"
- "Nothing here! Add some recipes and try again"
- "Imported:"
- "recipes found"
- "Already exist:"
- "Recipe"
- "REMOVE"
- "Rating"
- "Quickest first"
- "qt"
- "pt"
- "Privacy policy"
- "Preparation time"
- "Pound"
- "Poultry"
- "Portuguese"
- "Use the plus button to add one"
- "Meal Planner"
- "pinch"
- "Piece"
- "piece"
- "Recipe photo"
- "Photo Grid"
- "Patty"
- "Pasta"
- "oz"
- "Ounce"
- "Options"
- "Oldest first"
- "OK"
- "October"
- "New yield unit"
- "New category"
- "November"
- "Notes"
- "None of the recipes here matches your search"
- "No recipes match your search"
- "Noodles"
- "No favourites yet"
- "Accelerometer sensor is either disabled or is not working"
- "Note"
- "NOT NOW"
- "Restart EnRecipes to use the new language"
- "Nigerian"
- "New unit"
- "New recipe"
- "Newest first"
- "New cuisine"
- "MON"
- "Moderate"
- "ml"
- "Minimal"
- "min"
- "Millilitre"
- "mg"
- "Mexican"
- "medium"
- "Meat"
- "May"
- "March"
- "Main dishes"
- "%1$s months ago"
- "Lunch"
- "a long time ago"
- "Loaf"
- "Litre"
- "List view mode"
- "Light"
- "leaf"
- "lb"
- "Last updated"
- "large"
- "Language"
- "l"
- "Korean"
- "Kilogram"
- "kg"
- "Kenyan"
- "KEEP EDITING"
- "June"
- "July"
- "Join the Telegram group"
- "Jewish"
- "Japanese"
- "January"
- "Jamaican"
- "Italian"
- "Item"
- "Irish"
- "Invalid file"
- "Interface"
- "Instructions"
- "Ingredients"
- "Indian"
- "in"
- "Import success"
- "Import in progress"
- "Supports full backups exported by this app"
- "Import failed"
- "Import data"
- "hr"
- "Healthy"
- "User guide"
- "Grocery List"
- "Grid"
- "Greek"
- "Gram"
- "View on GitHub"
- "German"
- "Gallon"
- "gal"
- "g"
- "Your favourite recipes are listed here"
- "FRI"
- "French"
- "Fluid Ounce"
- "Filter"
- "fl oz"
- "Filtered recipes"
- "Filipino"
- "February"
- "Favourites"
- "Export success"
- "Export in progress"
- "Export full backup"
- "EnRecipes"
- "English"
- "Egyptian"
- "Edit recipe"
- "Easy"
- "dstspn"
- "drop"
- "dozen"
- "Donate"
- "This recipe has unsaved changes. What would you like to do?"
- "DISCARD"
- "Dinner"
- "Difficulty level"
- "Detailed"
- "Desserts"
- "You are about to permanently delete %1$s"
- "You are about to permanently delete the recipe %1$s"
- "December"
- "DELETE"
- "Database"
- "Dark"
- "Danish"
- "%1$s days ago"
- "Cup"
- "cup"
- "Cuisine"
- "Created"
- "Crop photo"
- "Cooking time"
- "Confirm"
- "CONTINUE"
- "Combinations"
- "cm"
- "clove"
- "Chinese"
- "Challenging"
- "CANCEL"
- "Category"
- "The backup file was modified elsewhere"
- "Generates a ZIP file containing all your data that can be imported back"
- "Malformed or corrupt backup file"
- "Backup folder"
- "The backup file is empty"
- "British"
- "Breakfast"
- "Breads"
- "Brazilian"
- "Black"
- "Beverages"
- "Barbecue"
- "EnRecipes"
- "EnRecipes"
- "EnRecipes"
- "All Tags"
- "All Cuisines"
- "tmrClr"
-
diff --git a/app/resources/Android/src/main/res/values-es/strings.xml b/app/resources/Android/src/main/res/values-es/strings.xml
index f2acde4a..20de8603 100644
--- a/app/resources/Android/src/main/res/values-es/strings.xml
+++ b/app/resources/Android/src/main/res/values-es/strings.xml
@@ -1,12 +1,28 @@
- "Temporizador borrado"
+ "Hoy"
+ "Mañana"
+ "Ayer"
+ "Mes"
+ "Semana"
+ "Día"
+ "domingo"
+ "lunes"
+ "martes"
+ "miércoles"
+ "jueves"
+ "viernes"
+ "sábado"
+ "copia"
+ "Preselecciones"
+ "Está a punto de eliminar %1$s de los preajustes"
+ "Temporizador eliminado"
+ "Ajustes de notificación"
"Duración del retraso"
"Vibrador del temporizador"
"Sonido del temporizador"
"Añadido a los preajustes"
"para qué receta?"
- "Preselecciones del temporizador"
"PRECIPIOS"
"Retraso"
"Detener"
@@ -313,6 +329,24 @@
"AÑADIR"
"Acerca de"
"Adjuntar una foto"
- "Notification settings"
- "Timer removed"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Calendar view mode"
+ "%1$s ongoing, %2$s paused"
+ "Tap to view"
+ "Dismiss all timers"
+ "Dismiss"
+ "%1$s timers expired"
+ "%1$s was delayed by %2$s"
+ "Preset time updated"
+ "Cook confidently with timers!"
+ "Go to date"
+ "Random"
diff --git a/app/resources/Android/src/main/res/values-fi/strings.xml b/app/resources/Android/src/main/res/values-fi/strings.xml
index dcd130d5..34060211 100644
--- a/app/resources/Android/src/main/res/values-fi/strings.xml
+++ b/app/resources/Android/src/main/res/values-fi/strings.xml
@@ -1,5 +1,40 @@
+ "Poista ateriasuunnitelmat automaattisesti"
+ "Vuoden jälkeen"
+ "Kuukauden jälkeen"
+ "Viikon jälkeen"
+ "Ei koskaan"
+ "Käytä plus-painiketta luodaksesi yhden"
+ "Valitse ateriatyyppi"
+ "Syö terveellisesti ateriasuunnitelmien avulla!"
+ "%1$s käynnissä, %2$s keskeytetty"
+ "Kalenterinäkymätila"
+ "sunnuntai"
+ "maanantai"
+ "tiistai"
+ "keskiviikko"
+ "torstai"
+ "perjantai"
+ "lauantai"
+ "kopio"
+ "Tänään"
+ "Huomenna"
+ "Eilen"
+ "Kuukausi"
+ "Viikko"
+ "Päivä"
+ "Hylkää"
+ "Hylkää kaikki ajastimet"
+ "Napauta nähdäksesi"
+ "Esiasetettu aika päivitetty"
+ "Ilmoitusasetukset"
+ "Satunnainen"
+ "Siirry päivämäärään"
+ "Keitä luottavaisesti ajastimien avulla!"
+ "Ajastin poistettu"
+ "%1$s ajastinta on vanhentunut"
+ "Esiasetukset"
"minuutti"
"tunti"
"minuuttia"
@@ -8,7 +43,6 @@
"Viiveen kesto"
"s"
"ESIASETUKSET"
- "Ajastimen esiasetukset"
"mitä reseptiä varten?"
"Lisätty esiasetuksiin"
"Ajastinääni"
@@ -53,7 +87,7 @@
"Järjestelmän oletus"
"Aloita viikko maanantaina"
"ruotsalainen"
- "Auttaa sinua valitsemaan, mitä valmistaa, kun et osaa päättää."
+ "Auttaa sinua valitsemaan, mitä valmistaa, kun et osaa päättää"
"Ravista nähdäksesi satunnainen resepti"
"su"
""
@@ -235,7 +269,7 @@
""
"Vienti käynnissä"
"Vie koko varmuuskopio"
- ""
+ "EnRecipes"
"englantilainen"
"egyptiläinen"
"Muokkaa resepti"
@@ -293,9 +327,9 @@
"EnRecipes on avoimen lähdekoodin, yksityisyyden suojaa kunnioittava digitaalinen keittokirja, jonka avulla voit luoda, hallita ja jakaa reseptejäsi"
"Alkupalat"
"Jaettu EnRecipesin kautta. Lataa se F-Droidista, IzzyOnDroidista tai Play Storesta."
- ""
- ""
- ""
+ "EnRecipes"
+ "EnRecipes"
+ "EnRecipes"
"LISÄÄ HUOMAUTUS"
"LISÄÄ UUSI"
"amerikkalainen"
@@ -309,10 +343,10 @@
"LISÄÄ"
"Tietoja"
"Liitä valokuva"
- "Notification settings"
- "Timer removed"
+ "Add"
+ "%1$s was delayed by %2$s"
"Timer vibrate"
+ "You are about to delete %1$s from the presets"
"Delay"
"START"
- "tmrClr"
diff --git a/app/resources/Android/src/main/res/values-fr-rBE/strings.xml b/app/resources/Android/src/main/res/values-fr-rBE/strings.xml
index 1b1f01f6..392820eb 100644
--- a/app/resources/Android/src/main/res/values-fr-rBE/strings.xml
+++ b/app/resources/Android/src/main/res/values-fr-rBE/strings.xml
@@ -1,6 +1,42 @@
- "Minuterie effacée"
+ "Sélectionnez le type de repas"
+ "Mangez sainement grâce aux planifications de repas !"
+ "Utilisez le bouton plus pour en créer une"
+ "Jamais"
+ "Supprimer automatiquement les planifications de repas"
+ "Après un an"
+ "Après un mois"
+ "Après une semaine"
+ "%1$s en cours, %2$s en pause"
+ "Mode d’affichage du calendrier"
+ "Mois"
+ "Semaine"
+ "Jour"
+ "dimanche"
+ "lundi"
+ "mardi"
+ "mercredi"
+ "jeudi"
+ "vendredi"
+ "samedi"
+ "copie"
+ "Aujourd’hui"
+ "Demain"
+ "Hier"
+ "Aléatoire"
+ "Aller à la date"
+ "Cuisinez avec confiance avec des minuteries !"
+ "Temps du préréglage mis à jour"
+ "%1$s a été retardée de %2$s"
+ "%1$s minuteries ont expiré"
+ "Rejeter"
+ "Rejeter toutes les minuteries"
+ "Appuyez pour voir"
+ "Préréglages"
+ "Vous êtes sur le point de supprimer %1$s des préréglages"
+ "Minuterie retirée"
+ "Paramètres de notification"
"Retard"
"Durée du retard"
"minute"
@@ -15,7 +51,6 @@
"Arrêter"
"Minuterie %1$s"
"PRÉRÉGLAGES"
- "Préréglages de la minuterie"
"pour quelle recette ?"
"Ajouté aux préréglages"
"Son de la minuterie"
@@ -44,7 +79,7 @@
"RECHERCHE DANS TOUTES LES RECETTES ?"
"À essayer plus tard"
"Traduire"
- "Vous avez essayé cette recette %1$s"
+ "Vous avez essayé cette recette %1$s"
"aujourd’hui"
"Les recettes que vous voulez essayer plus tard sont listées ici"
"Titre"
@@ -109,7 +144,7 @@
"Réinitialiser la liste des catégories"
"Réinitialiser"
"Recette introuvable"
- "%1$s requis(e)"
+ "%1$s nécessaire"
"mise à jour :"
"Ma recette saine"
"recettes"
@@ -175,7 +210,7 @@
"mai"
"mars"
"Plats principaux"
- "Il y a %1$s mois"
+ "il y a %1$s mois"
"Diner"
"il y a longtemps"
"Miche"
@@ -313,6 +348,5 @@
"AJOUTER"
"À propos"
"Joindre une photo"
- "Notification settings"
- "Timer removed"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-fr-rCA/strings.xml b/app/resources/Android/src/main/res/values-fr-rCA/strings.xml
index a38eaa2c..922e4ce1 100644
--- a/app/resources/Android/src/main/res/values-fr-rCA/strings.xml
+++ b/app/resources/Android/src/main/res/values-fr-rCA/strings.xml
@@ -1,6 +1,42 @@
- "Minuterie effacée"
+ "Sélectionnez le type de repas"
+ "Mangez sainement grâce aux planifications de repas!"
+ "Utilisez le bouton plus pour en créer une"
+ "Jamais"
+ "Supprimer automatiquement les planifications de repas"
+ "Après un an"
+ "Après un mois"
+ "Après une semaine"
+ "%1$s en cours, %2$s en pause"
+ "Mode d’affichage du calendrier"
+ "Mois"
+ "Semaine"
+ "Jour"
+ "dimanche"
+ "lundi"
+ "mardi"
+ "mercredi"
+ "jeudi"
+ "vendredi"
+ "samedi"
+ "copie"
+ "Aujourd’hui"
+ "Demain"
+ "Hier"
+ "Aléatoire"
+ "Aller à la date"
+ "Cuisinez avec confiance avec des minuteries!"
+ "Temps du préréglage mis à jour"
+ "%1$s a été retardée de %2$s"
+ "%1$s minuteries ont expiré"
+ "Rejeter"
+ "Rejeter toutes les minuteries"
+ "Appuyez pour voir"
+ "Préréglages"
+ "Vous êtes sur le point de supprimer %1$s des préréglages"
+ "Minuterie retirée"
+ "Paramètres de notification"
"Retard"
"Durée du retard"
"minute"
@@ -15,7 +51,6 @@
"Arrêter"
"Minuterie %1$s"
"PRÉRÉGLAGES"
- "Préréglages de la minuterie"
"pour quelle recette?"
"Ajouté aux préréglages"
"Son de la minuterie"
@@ -109,7 +144,7 @@
"Réinitialiser la liste des catégories"
"Réinitialiser"
"Recette introuvable"
- "%1$s requis(e)"
+ "%1$s nécessaire"
"mise à jour :"
"Ma recette saine"
"recettes"
@@ -175,7 +210,7 @@
"mai"
"mars"
"Plats principaux"
- "Il y a %1$s mois"
+ "il y a %1$s mois"
"Dîner"
"il y a longtemps"
"Miche"
@@ -313,6 +348,5 @@
"AJOUTER"
"À propos"
"Joindre une photo"
- "Notification settings"
- "Timer removed"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-fr-rCH/strings.xml b/app/resources/Android/src/main/res/values-fr-rCH/strings.xml
index 36631328..5cc08a8b 100644
--- a/app/resources/Android/src/main/res/values-fr-rCH/strings.xml
+++ b/app/resources/Android/src/main/res/values-fr-rCH/strings.xml
@@ -1,6 +1,42 @@
- "Minuterie effacée"
+ "Sélectionnez le type de repas"
+ "Mangez sainement grâce aux planifications de repas!"
+ "Utilisez le bouton plus pour en créer une"
+ "Supprimer automatiquement les planifications de repas"
+ "Après un an"
+ "Après un mois"
+ "Après une semaine"
+ "Jamais"
+ "%1$s en cours, %2$s en pause"
+ "Mode d’affichage du calendrier"
+ "Mois"
+ "Semaine"
+ "Jour"
+ "dimanche"
+ "lundi"
+ "mardi"
+ "mercredi"
+ "jeudi"
+ "vendredi"
+ "samedi"
+ "copie"
+ "Aujourd’hui"
+ "Demain"
+ "Hier"
+ "Aléatoire"
+ "Aller à la date"
+ "Cuisinez avec confiance avec des minuterie!"
+ "Temps du préréglage mis à jour"
+ "%1$s a été retardée de %2$s"
+ "%1$s minuteries ont expiré"
+ "Rejeter"
+ "Rejeter toutes les minuteries"
+ "Appuyez pour voir"
+ "Préréglages"
+ "Vous êtes sur le point de supprimer %1$s des préréglages"
+ "Minuterie retirée"
+ "Paramètres de notification"
"Retard"
"Durée du retard"
"minute"
@@ -15,7 +51,6 @@
"Arrêter"
"Minuterie %1$s"
"PRÉRÉGLAGES"
- "Préréglages de la minuterie"
"pour quelle recette?"
"Ajouté aux préréglages"
"Son de la minuterie"
@@ -109,7 +144,7 @@
"Réinitialiser la liste des catégories"
"Réinitialiser"
"Recette introuvable"
- "%1$s requis(e)"
+ "%1$s nécessaire"
"mise à jour :"
"Ma recette saine"
"recettes"
@@ -175,7 +210,7 @@
"mai"
"mars"
"Plats principaux"
- "Il y a %1$s mois"
+ "il y a %1$s mois"
"Dîner"
"il y a longtemps"
"Miche"
@@ -313,6 +348,5 @@
"AJOUTER"
"À propos"
"Joindre une photo"
- "Notification settings"
- "Timer removed"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-fr/strings.xml b/app/resources/Android/src/main/res/values-fr/strings.xml
index 333240ba..e7e16fea 100644
--- a/app/resources/Android/src/main/res/values-fr/strings.xml
+++ b/app/resources/Android/src/main/res/values-fr/strings.xml
@@ -1,6 +1,42 @@
- "Minuterie effacée"
+ "Sélectionnez le type de repas"
+ "Mangez sainement grâce aux planifications de repas !"
+ "Utilisez le bouton plus pour en créer une"
+ "Jamais"
+ "Supprimer automatiquement les planifications de repas"
+ "Après un an"
+ "Après un mois"
+ "Après une semaine"
+ "%1$s en cours, %2$s en pause"
+ "Mode d’affichage du calendrier"
+ "Mois"
+ "Semaine"
+ "Jour"
+ "dimanche"
+ "lundi"
+ "mardi"
+ "mercredi"
+ "jeudi"
+ "vendredi"
+ "samedi"
+ "copie"
+ "Aujourd’hui"
+ "Demain"
+ "Hier"
+ "Aléatoire"
+ "Aller à la date"
+ "Cuisinez avec confiance avec des minuteries !"
+ "Temps du préréglage mis à jour"
+ "%1$s minuteries ont expiré"
+ "Rejeter"
+ "Rejeter toutes les minuteries"
+ "Appuyez pour voir"
+ "%1$s a été retardée de %2$s"
+ "Préréglages"
+ "Vous êtes sur le point de supprimer %1$s des préréglages"
+ "Minuterie retirée"
+ "Paramètres de notification"
"Retard"
"Durée du retard"
"minute"
@@ -15,7 +51,6 @@
"Arrêter"
"Minuterie %1$s"
"PRÉRÉGLAGES"
- "Préréglages de la minuterie"
"pour quelle recette ?"
"Ajouté aux préréglages"
"Son de la minuterie"
@@ -74,7 +109,7 @@
"petit"
"sélectionné"
"La plus lente d’abord"
- "Simplicité"
+ "Simple"
"Plats d’accompagnement"
"Partager"
"Paramètres"
@@ -85,7 +120,7 @@
"Sélectionner une recette"
"Fruits de mer"
"écossaise"
- "Soupes"
+ "Sauces"
"sam"
"Salades"
"russe"
@@ -109,7 +144,7 @@
"Réinitialiser la liste des catégories"
"Réinitialiser"
"Recette introuvable"
- "%1$s requis(e)"
+ "%1$s nécessaire"
"mise à jour :"
"Ma recette saine"
"recettes"
@@ -167,7 +202,7 @@
"ml"
"Minimale"
"min"
- "Millilette"
+ "Millilitre"
"mg"
"mexicaine"
"moyen"
@@ -175,11 +210,11 @@
"mai"
"mars"
"Plats principaux"
- "Il y a %1$s mois"
+ "il y a %1$s mois"
"Déjeuner"
"il y a longtemps"
"Miche"
- "Leitre"
+ "Litre"
"Type de vue en liste"
"Clair"
"feuille"
@@ -223,7 +258,7 @@
"Gramme"
"Voir sur GitHub"
"allemande"
- "Galon"
+ "Gallon"
"gal"
"g"
"Vos recettes favorites sont listées ici"
@@ -253,7 +288,7 @@
"Dîner"
"Niveau de difficulté"
"Détaillée"
- "Délices"
+ "Desserts"
"Vous êtes sur le point de supprimer définitivement %1$s"
"Vous êtes sur le point de supprimer définitivement la recette %1$s"
"décembre"
@@ -264,7 +299,7 @@
"il y a %1$s jours"
"Tasse"
"tasse"
- "Cuisines"
+ "Cuisine"
"Créé le"
"Recadrer la photo"
"Temps de cuisson"
@@ -288,7 +323,7 @@
"Brésilienne"
"Noir"
"Boissons"
- "Grillades"
+ "Barbecue"
"août"
"AJOUTER UNE ÉTAPE"
"avril"
@@ -313,6 +348,5 @@
"AJOUTER"
"À propos"
"Joindre une photo"
- "Notification settings"
- "Timer removed"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-hi/strings.xml b/app/resources/Android/src/main/res/values-hi/strings.xml
index edf58ac0..d8605f11 100644
--- a/app/resources/Android/src/main/res/values-hi/strings.xml
+++ b/app/resources/Android/src/main/res/values-hi/strings.xml
@@ -1,14 +1,39 @@
+ "बेतरतीब"
+ "डेट पर जाएं"
+ "टाइमर्स के साथ आत्मविश्वास से पकाएं!"
+ "प्रीसेट समय अपडेट किया गया"
+ "%1$s वा %2$s की देरी से"
+ "%1$s टाइमर समाप्त हो गए"
+ "खारिज"
+ "सभी टाइमर्स खारिज करें"
+ "देखने के लिए टैप करें"
+ "%1$s चल रहा है, %2$s रुका हुआ है"
+ "कैलेंडर दृश्य मोड"
+ "रविवार"
+ "सोमवार"
+ "मंगलवार"
+ "बुधवार"
+ "गुरूवार"
+ "शुक्रवार"
+ "शनिवार"
+ "कॉपी"
+ "आज"
+ "कल"
+ "कल"
+ "आप प्रीसेट से %1$s मिटाने वाले हैं"
+ "प्रीसेट"
+ "टाइमर हटा दिया गया"
+ "अधिसूचना सेटिंग्स"
"सेकंड"
"कुकिंग टाइमर"
"नया टाइमर"
"शुरू"
"रुकें"
"देरी"
- "टाइमर%1$s"
+ "टाइमर %1$s"
"प्रीसेट"
- "टाइमर प्रीसेट"
"प्रीसेट में जोड़ा गया"
"टाइमर की आवाज़"
"टाइमर वाइब्रेट"
@@ -18,7 +43,6 @@
"घंटा"
"घंटे"
"सेकंड"
- "टाइमर साफ"
"किस विधि के लिए?"
"प्रणालीगत चूक + काला"
"%1$s में बैकअप लिया गया"
@@ -313,6 +337,16 @@
"जोड़ें"
"तकरीबन"
"एक तस्वीर लगाओ"
- "Notification settings"
- "Timer removed"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Day"
+ "Week"
+ "Month"
diff --git a/app/resources/Android/src/main/res/values-id/strings.xml b/app/resources/Android/src/main/res/values-id/strings.xml
index 0f6571b1..3f4e2522 100644
--- a/app/resources/Android/src/main/res/values-id/strings.xml
+++ b/app/resources/Android/src/main/res/values-id/strings.xml
@@ -1,10 +1,13 @@
+ "Pengaturan notifikasi"
+ "Timer dihapus"
+ "Anda akan menghapus %1$s dari presets"
+ "Preset"
"Berhenti"
"Menunda"
"Timer %1$s"
"PRESET"
- "Preset timer"
"untuk resep yang mana?"
"Ditambahkan ke preset"
"Suara timer"
@@ -15,7 +18,6 @@
"jam"
"jam"
"detik"
- "Timer dibersihkan"
"Timer Memasak"
"Timer baru"
"MULAI"
@@ -29,8 +31,8 @@
"RAB"
"%1$s minggu yang lalu"
"Vietnam"
- "Vegetarian"
- "Vegan"
+ "vegetarian"
+ "vegan"
"Resep tanpa judul"
"Perubahan yang belum disimpan"
"Satuan"
@@ -313,6 +315,38 @@
"Tambah"
"Tentang"
"Lampirkan foto"
- "Notification settings"
- "Timer removed"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Yesterday"
+ "Tomorrow"
+ "Today"
+ "copy"
+ "Saturday"
+ "Friday"
+ "Thursday"
+ "Wednesday"
+ "Tuesday"
+ "Monday"
+ "Sunday"
+ "Day"
+ "Week"
+ "Month"
+ "Calendar view mode"
+ "%1$s ongoing, %2$s paused"
+ "Tap to view"
+ "Dismiss all timers"
+ "Dismiss"
+ "%1$s timers expired"
+ "%1$s was delayed by %2$s"
+ "Preset time updated"
+ "Cook confidently with timers!"
+ "Go to date"
+ "Random"
diff --git a/app/resources/Android/src/main/res/values-it/strings.xml b/app/resources/Android/src/main/res/values-it/strings.xml
index 3fc11eab..aeb9e8d3 100644
--- a/app/resources/Android/src/main/res/values-it/strings.xml
+++ b/app/resources/Android/src/main/res/values-it/strings.xml
@@ -1,6 +1,42 @@
- "Contaminuti cancellato"
+ "Seleziona il tipo di pasto"
+ "Mangia sano con i piani dei pasti!"
+ "Usa il pulsante più per crearne uno"
+ "Elimina automaticamente i piani pasto"
+ "Mai"
+ "Dopo un anno"
+ "Dopo un mese"
+ "Dopo una settimana"
+ "%1$s in corso, %2$s in pausa"
+ "Modalità di visualizzazione calendario"
+ "Mese"
+ "Settimana"
+ "Giorno"
+ "domenica"
+ "lunedì"
+ "martedì"
+ "mercoledì"
+ "giovedì"
+ "venerdì"
+ "sabato"
+ "copia"
+ "Oggi"
+ "Domani"
+ "Ieri"
+ "Casuale"
+ "Vai alla data"
+ "Cucina con fiducia con i contaminuti!"
+ "Tempo preimpostato aggiornato"
+ "%1$s è stato ritardato di %2$s"
+ "%1$s contaminuti scaduti"
+ "Diattiva"
+ "Disattiva tutti i contaminuti"
+ "Tocca per visualizzare"
+ "Preimpostazioni"
+ "Stai per eliminare %1$s dalle preimpostazioni"
+ "Contaminuti rimosso"
+ "Impostazioni di notifica"
"Ritardo"
"Durata del ritardo"
"minuto"
@@ -11,7 +47,6 @@
"s"
"Ferma"
"Preimpostazioni"
- "Preimpostazioni del contaminuti"
"per quale ricetta?"
"Aggiunto alle preimpostazioni"
"Suono del contaminuti"
@@ -109,7 +144,7 @@
"Reimposta l\'elenco delle categorie"
"Ripristina"
"Ricetta non trovata"
- "%1$s richiesto"
+ "%1$s necessario"
"Aggiornate:"
"La mia ricetta sana"
"ricette"
@@ -313,6 +348,5 @@
"AGGIUNGI"
"Informazioni"
"Allega una foto"
- "Notification settings"
- "Timer removed"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-ja/strings.xml b/app/resources/Android/src/main/res/values-ja/strings.xml
index 8295639c..51a17d49 100644
--- a/app/resources/Android/src/main/res/values-ja/strings.xml
+++ b/app/resources/Android/src/main/res/values-ja/strings.xml
@@ -219,6 +219,7 @@
"エクスポートに成功"
"エクスポートを実行中"
"バックアップをエクスポート"
+ "EnRecipes"
"イングランド料理"
"エジプト料理"
"レシピを編集する"
@@ -276,6 +277,9 @@
"EnRecipesはレシピを作成・管理・共有することができる、オープンソースでプライバシーに配慮したデジタル料理本です"
"前菜"
"EnRecipesから共有されました。F-DroidかIzzyOnDroidかPlayストアからダウンロード出来ます。"
+ "EnRecipes"
+ "EnRecipes"
+ "EnRecipes"
"メモを追加"
"新しく追加"
"アメリカ料理"
@@ -289,6 +293,40 @@
"追加"
"アプリについて"
"写真を添付"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Yesterday"
+ "Tomorrow"
+ "Today"
+ "copy"
+ "Saturday"
+ "Friday"
+ "Thursday"
+ "Wednesday"
+ "Tuesday"
+ "Monday"
+ "Sunday"
+ "Day"
+ "Week"
+ "Month"
+ "Calendar view mode"
+ "%1$s ongoing, %2$s paused"
+ "Tap to view"
+ "Dismiss all timers"
+ "Dismiss"
+ "%1$s timers expired"
+ "%1$s was delayed by %2$s"
+ "Preset time updated"
+ "Cook confidently with timers!"
+ "Go to date"
+ "Random"
"Notification settings"
"Timer removed"
"seconds"
@@ -301,7 +339,8 @@
"Timer sound"
"Added to presets"
"for which recipe?"
- "Timer presets"
+ "You are about to delete %1$s from the presets"
+ "Presets"
"PRESETS"
"Timer %1$s"
"Delay"
@@ -310,9 +349,4 @@
"New timer"
"Cooking Timer"
"sec"
- "EnRecipes"
- "EnRecipes"
- "EnRecipes"
- "EnRecipes"
- "tmrClr"
diff --git a/app/resources/Android/src/main/res/values-kn/strings.xml b/app/resources/Android/src/main/res/values-kn/strings.xml
deleted file mode 100644
index d91f9e1d..00000000
--- a/app/resources/Android/src/main/res/values-kn/strings.xml
+++ /dev/null
@@ -1,318 +0,0 @@
-
-
- "Notification settings"
- "Timer removed"
- "seconds"
- "hours"
- "hour"
- "minutes"
- "minute"
- "Delay duration"
- "Timer vibrate"
- "Timer sound"
- "Added to presets"
- "for which recipe?"
- "Timer presets"
- "PRESETS"
- "Timer %1$s"
- "Delay"
- "Stop"
- "START"
- "New timer"
- "Cooking Timer"
- "System default + Black"
- "Backed up to %1$s"
- "Yield"
- "Yield unit"
- "Yield quantity"
- "yesterday"
- "WED"
- "%1$s weeks ago"
- "Vietnamese"
- "Vegetarian"
- "Vegan"
- "Untitled Recipe"
- "Unsaved changes"
- "Unit"
- "unit"
- "Undefined"
- "Turkish"
- "TUE"
- "tsp"
- "separate with spaces"
- "Tags"
- "SEARCH IN ALL THE RECIPES?"
- "Try Later"
- "Translate"
- "You tried this recipe %1$s"
- "today"
- "Recipes you want to try later are listed here"
- "Title"
- "THU"
- "Theme"
- "Thai"
- "Teaspoon"
- "tbsp"
- "Tablespoon"
- "System default"
- "Start week on Monday"
- "Swedish"
- "Helps you choose what to cook when you can\'t decide"
- "Shake to view random recipe"
- "SUN"
- "Start adding your recipes!"
- "Step"
- "stick"
- "Star rating"
- "Share recipe using..."
- "Sort"
- "Share recipe photo using..."
- "Sri Lankan"
- "Spanish"
- "Soups"
- "Snacks"
- "small"
- "selected"
- "Slowest first"
- "Simple"
- "Side dishes"
- "Share"
- "Settings"
- "SET"
- "Serving"
- "Search"
- "September"
- "Select recipe"
- "Seafood"
- "Scottish"
- "Sauces"
- "SAT"
- "Salads"
- "Russian"
- "RESTART"
- "Remove photo"
- "Roll"
- "You are about to remove %1$s from the yield unit list"
- "You are about to remove %1$s from the unit list"
- "Note removed"
- "Instruction removed"
- "Ingredient removed"
- "You are about to remove %1$s from the cuisine list"
- "Combination removed"
- "You are about to remove %1$s from the category list"
- "Rice"
- "Reset yield unit list"
- "Reset unit list"
- "Resetting a list will delete user-created entries and restore default entries. Existing recipes will not be affected."
- "Reset done"
- "Reset cuisine list"
- "Reset category list"
- "Reset"
- "Recipe not found"
- "Required %1$s"
- "Updated:"
- "My Healthy Recipe"
- "recipes"
- "Recipe removed"
- "Recipe photo"
- "Nothing here! Add some recipes and try again"
- "Imported:"
- "recipes found"
- "Already exist:"
- "Recipe"
- "REMOVE"
- "Rating"
- "Quickest first"
- "qt"
- "pt"
- "Privacy policy"
- "Preparation time"
- "Pound"
- "Poultry"
- "Portuguese"
- "Use the plus button to add one"
- "Meal Planner"
- "pinch"
- "Piece"
- "piece"
- "Recipe photo"
- "Photo Grid"
- "Patty"
- "Pasta"
- "oz"
- "Ounce"
- "Options"
- "Oldest first"
- "OK"
- "October"
- "New yield unit"
- "New category"
- "November"
- "Notes"
- "None of the recipes here matches your search"
- "No recipes match your search"
- "Noodles"
- "No favourites yet"
- "Accelerometer sensor is either disabled or is not working"
- "Note"
- "NOT NOW"
- "Restart EnRecipes to use the new language"
- "Nigerian"
- "New unit"
- "New recipe"
- "Newest first"
- "New cuisine"
- "MON"
- "Moderate"
- "ml"
- "Minimal"
- "sec"
- "min"
- "Millilitre"
- "mg"
- "Mexican"
- "medium"
- "Meat"
- "May"
- "March"
- "Main dishes"
- "%1$s months ago"
- "Lunch"
- "a long time ago"
- "Loaf"
- "Litre"
- "List view mode"
- "Light"
- "leaf"
- "lb"
- "Last updated"
- "large"
- "Language"
- "l"
- "Korean"
- "Kilogram"
- "kg"
- "Kenyan"
- "KEEP EDITING"
- "June"
- "July"
- "Join the Telegram group"
- "Jewish"
- "Japanese"
- "January"
- "Jamaican"
- "Italian"
- "Item"
- "Irish"
- "Invalid file"
- "Interface"
- "Instructions"
- "Ingredients"
- "Indian"
- "in"
- "Import success"
- "Import in progress"
- "Supports full backups exported by this app"
- "Import failed"
- "Import data"
- "hr"
- "Healthy"
- "User guide"
- "Grocery List"
- "Grid"
- "Greek"
- "Gram"
- "View on GitHub"
- "German"
- "Gallon"
- "gal"
- "g"
- "Your favourite recipes are listed here"
- "FRI"
- "French"
- "Fluid Ounce"
- "Filter"
- "fl oz"
- "Filtered recipes"
- "Filipino"
- "February"
- "Favourites"
- "Export success"
- "Export in progress"
- "Export full backup"
- "EnRecipes"
- "English"
- "Egyptian"
- "Edit recipe"
- "Easy"
- "dstspn"
- "drop"
- "dozen"
- "Donate"
- "This recipe has unsaved changes. What would you like to do?"
- "DISCARD"
- "Dinner"
- "Difficulty level"
- "Detailed"
- "Desserts"
- "You are about to permanently delete %1$s"
- "You are about to permanently delete the recipe %1$s"
- "December"
- "DELETE"
- "Database"
- "Dark"
- "Danish"
- "%1$s days ago"
- "Cup"
- "cup"
- "Cuisine"
- "Created"
- "Crop photo"
- "Cooking time"
- "Confirm"
- "CONTINUE"
- "Combinations"
- "cm"
- "clove"
- "Chinese"
- "Challenging"
- "CANCEL"
- "Category"
- "The backup file was modified elsewhere"
- "Generates a ZIP file containing all your data that can be imported back"
- "Malformed or corrupt backup file"
- "Backup folder"
- "The backup file is empty"
- "British"
- "Breakfast"
- "Breads"
- "Brazilian"
- "Black"
- "Beverages"
- "Barbecue"
- "August"
- "ADD STEP"
- "April"
- "App restart required"
- "APPLY"
- "EnRecipes is an open source, privacy-friendly digital cookbook that lets you create, manage and share your recipes"
- "Appetizers"
- "Shared via EnRecipes. Get it on F-Droid, IzzyOnDroid or the Play Store."
- "EnRecipes"
- "EnRecipes"
- "EnRecipes"
- "ADD NOTE"
- "ADD NEW"
- "American"
- "All Tags"
- "All Cuisines"
- "All Categories"
- "ADD INGREDIENT"
- "Add a recipe to perform a backup"
- "ADD COMBINATION"
- "All done!"
- "ADD"
- "About"
- "Attach a photo"
- "tmrClr"
-
diff --git a/app/resources/Android/src/main/res/values-ml/strings.xml b/app/resources/Android/src/main/res/values-ml/strings.xml
index d1e54ef9..ee6113ca 100644
--- a/app/resources/Android/src/main/res/values-ml/strings.xml
+++ b/app/resources/Android/src/main/res/values-ml/strings.xml
@@ -293,6 +293,40 @@
"ചേർക്കുക"
"കുറിച്ച്"
"ഒരു ഫോട്ടോ അറ്റാച്ചുചെയ്യുക"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Yesterday"
+ "Tomorrow"
+ "Today"
+ "copy"
+ "Saturday"
+ "Friday"
+ "Thursday"
+ "Wednesday"
+ "Tuesday"
+ "Monday"
+ "Sunday"
+ "Day"
+ "Week"
+ "Month"
+ "Calendar view mode"
+ "%1$s ongoing, %2$s paused"
+ "Tap to view"
+ "Dismiss all timers"
+ "Dismiss"
+ "%1$s timers expired"
+ "%1$s was delayed by %2$s"
+ "Preset time updated"
+ "Cook confidently with timers!"
+ "Go to date"
+ "Random"
"Notification settings"
"Timer removed"
"seconds"
@@ -305,7 +339,8 @@
"Timer sound"
"Added to presets"
"for which recipe?"
- "Timer presets"
+ "You are about to delete %1$s from the presets"
+ "Presets"
"PRESETS"
"Timer %1$s"
"Delay"
@@ -314,5 +349,4 @@
"New timer"
"Cooking Timer"
"sec"
- "tmrClr"
diff --git a/app/resources/Android/src/main/res/values-nb-rNO/strings.xml b/app/resources/Android/src/main/res/values-nb-rNO/strings.xml
index 8f15b3f7..b9d34fe9 100644
--- a/app/resources/Android/src/main/res/values-nb-rNO/strings.xml
+++ b/app/resources/Android/src/main/res/values-nb-rNO/strings.xml
@@ -1,5 +1,18 @@
+ "Start"
+ "Stopp"
+ "Utsett"
+ "minutt"
+ "minutter"
+ "time"
+ "timer"
+ "sekunder"
+ "Tidsur fjernet"
+ "Merknadsinnstillinger"
+ "Tilfeldig"
+ "Gå til dato"
+ "Nytt tidsur"
"s"
"Systemforvalg + Svart"
"Støttet opp til %1$s"
@@ -294,25 +307,46 @@
"Legg til"
"Om"
"Legg ved et bilde"
- "Notification settings"
- "Timer removed"
- "seconds"
- "hours"
- "hour"
- "minutes"
- "minute"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Yesterday"
+ "Tomorrow"
+ "Today"
+ "copy"
+ "Saturday"
+ "Friday"
+ "Thursday"
+ "Wednesday"
+ "Tuesday"
+ "Monday"
+ "Sunday"
+ "Day"
+ "Week"
+ "Month"
+ "Calendar view mode"
+ "%1$s ongoing, %2$s paused"
+ "Tap to view"
+ "Dismiss all timers"
+ "Dismiss"
+ "%1$s timers expired"
+ "%1$s was delayed by %2$s"
+ "Preset time updated"
+ "Cook confidently with timers!"
"Delay duration"
"Timer vibrate"
"Timer sound"
"Added to presets"
"for which recipe?"
- "Timer presets"
+ "You are about to delete %1$s from the presets"
+ "Presets"
"PRESETS"
"Timer %1$s"
- "Delay"
- "Stop"
- "START"
- "New timer"
"Cooking Timer"
- "tmrClr"
diff --git a/app/resources/Android/src/main/res/values-nl/strings.xml b/app/resources/Android/src/main/res/values-nl/strings.xml
index 0eac0b0e..448abc75 100644
--- a/app/resources/Android/src/main/res/values-nl/strings.xml
+++ b/app/resources/Android/src/main/res/values-nl/strings.xml
@@ -1,6 +1,42 @@
- "Kookwekker gewist"
+ "Kies het soort maaltijd"
+ "Eet gezond met maaltijdschema\'s!"
+ "Druk op de plusknop om een schema toe te voegen"
+ "Schema\'s automatisch verwijderen"
+ "Ouder dan een jaar"
+ "Ouder dan een maand"
+ "Ouder dan een week"
+ "Nooit"
+ "%1$s lopende; %2$s onderbroken"
+ "Weergavemodus van kalender"
+ "Maand"
+ "Week"
+ "Dag"
+ "zondag"
+ "maandag"
+ "dinsdag"
+ "woensdag"
+ "donderdag"
+ "vrijdag"
+ "zaterdag"
+ "kopie"
+ "Vandaag"
+ "Morgen"
+ "Gisteren"
+ "Willekeurig"
+ "Ga naar datum"
+ "Kook vol vertrouwen d.m.v. kookwekkers!"
+ "De tijd is bijgewerkt"
+ "%1$s is %2$s vertraagd"
+ "%1$s kookwekkers zijn afgegaan"
+ "Verwerpen"
+ "Alle kookwekkers verwerpen"
+ "Druk om te bekijken"
+ "Voorinstellingen"
+ "Je staat op het punt om %1$s te verwijderen uit de voorinstellingen"
+ "De kookwekker is verwijderd"
+ "Meldingsinstellingen"
"Vertraging"
"Vertragingsduur"
"minuut"
@@ -11,7 +47,6 @@
"Kookwekker laten trillen"
"Stoppen"
"VOORINSTELLINGEN"
- "Kookwekker: voorinstellingen"
"bij welk recept?"
"Toegevoegd aan voorinstellingen"
"Kookwekkergeluid"
@@ -109,7 +144,7 @@
"Categorieënlijst herstellen"
"Standaardwaarden"
"Recept niet gevonden"
- "Vereiste %1$s"
+ "%1$s vereist"
"Bijgewerkt:"
"Mijn gezonde recept"
"recepten"
@@ -313,6 +348,5 @@
"TOEVOEGEN"
"Over"
"Foto bijvoegen"
- "Notification settings"
- "Timer removed"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-pt-rBR/strings.xml b/app/resources/Android/src/main/res/values-pt-rBR/strings.xml
index 51aca148..6e83012c 100644
--- a/app/resources/Android/src/main/res/values-pt-rBR/strings.xml
+++ b/app/resources/Android/src/main/res/values-pt-rBR/strings.xml
@@ -1,6 +1,9 @@
- "Temporizador liberado"
+ "Configurações de notificação"
+ "Timer removido"
+ "Você está prestes a apagar %1$s das predefinições"
+ "Predefinições"
"segundos"
"horas"
"hora"
@@ -11,7 +14,6 @@
"Som temporizador"
"Adicionado às predefinições"
"para qual receita?"
- "Predefinições temporizadas"
"Atraso"
"Parada"
"s"
@@ -313,6 +315,38 @@
"Tudo feito!"
"ADICIONAR"
"Sobre"
- "Notification settings"
- "Timer removed"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Yesterday"
+ "Tomorrow"
+ "Today"
+ "copy"
+ "Saturday"
+ "Friday"
+ "Thursday"
+ "Wednesday"
+ "Tuesday"
+ "Monday"
+ "Sunday"
+ "Day"
+ "Week"
+ "Month"
+ "Calendar view mode"
+ "%1$s ongoing, %2$s paused"
+ "Tap to view"
+ "Dismiss all timers"
+ "Dismiss"
+ "%1$s timers expired"
+ "%1$s was delayed by %2$s"
+ "Preset time updated"
+ "Cook confidently with timers!"
+ "Go to date"
+ "Random"
diff --git a/app/resources/Android/src/main/res/values-pt/strings.xml b/app/resources/Android/src/main/res/values-pt/strings.xml
index 5b9a1e06..525e10ee 100644
--- a/app/resources/Android/src/main/res/values-pt/strings.xml
+++ b/app/resources/Android/src/main/res/values-pt/strings.xml
@@ -1,8 +1,43 @@
- "Temporizador a zero"
- "PRIMEIROS"
- "Predefinições temporizadas"
+ "%1$s a decorrer, %2$s em pausa"
+ "Modo de vista tipo calendário"
+ "Mês"
+ "Semana"
+ "Dia"
+ "Domingo"
+ "Segunda-feira"
+ "Terça-feira"
+ "Quarta-feira"
+ "Quinta-feira"
+ "Sexta-feira"
+ "Sábado"
+ "cópia"
+ "Hoje"
+ "Amanhã"
+ "Ontem"
+ "Selecionar tipo de refeição"
+ "Coma saudavelmente com planificações de refeições!"
+ "Use o botão + para criar uma"
+ "Eliminar automaticamente planos de refeições"
+ "Mais antigas que 1 ano"
+ "Mais antigas que 1 mês"
+ "Mais antigas que 1 semana"
+ "Nunca"
+ "Aleatória"
+ "Ir à data"
+ "Cozinhe com segurança com temporizadores!"
+ "Tempo predefinido atualizado"
+ "%1$s foi adiado por %2$s"
+ "%1$s temporizadores expiraram"
+ "Rejeitar"
+ "Rejeitar todos os temporizadores"
+ "Tocar para ver"
+ "Predefinições"
+ "Está prestes a eliminar %1$s das predefinições"
+ "Temporizador removido"
+ "Definições de notificação"
+ "PREDEFINIÇÕES"
"para que receita?"
"Adicionado às predefinições"
"Som temporizador"
@@ -120,7 +155,7 @@
"receitas"
"A minha receita saudável"
"Atualizado:"
- "Necessárias %1$s"
+ "Necessário %1$s"
"Receita não encontrada"
"Reiniciar"
"Reiniciar lista de categorias"
@@ -139,7 +174,7 @@
"Combinações"
"Confirme"
"Tempo de cozedura"
- "Foto do corte"
+ "Recortar fotografia"
"Cozinha"
"%1$s dias atrás"
"Base de dados"
@@ -150,7 +185,7 @@
"Esta receita tem alterações não guardadas. O que gostaria de fazer?"
"Doação"
"Editar receita"
- "Exportar apoio total"
+ "Exportar cópia de segurança completa"
"Exportação em curso"
"Exportado com sucesso"
"Fevereiro"
@@ -313,6 +348,5 @@
"Americana"
"Sobre"
"Anexar uma fotografia"
- "Notification settings"
- "Timer removed"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-ru/strings.xml b/app/resources/Android/src/main/res/values-ru/strings.xml
index a4e703a1..b4ae2b4b 100644
--- a/app/resources/Android/src/main/res/values-ru/strings.xml
+++ b/app/resources/Android/src/main/res/values-ru/strings.xml
@@ -1,6 +1,9 @@
- "Таймер очищен"
+ "Настройки уведомлений"
+ "Таймер удален"
+ "Вы собираетесь удалить %1$s из предустановок"
+ "Пресеты"
"секунды"
"часы"
"час"
@@ -11,7 +14,6 @@
"Звук таймера"
"Добавлено в предустановки"
"для какого рецепта?"
- "Предустановки таймера"
"ПРЕЗЕТЫ"
"Задержка"
"Стоп"
@@ -313,6 +315,38 @@
"ДОБАВИТЬ"
"О приложении"
"Прикрепить фото"
- "Notification settings"
- "Timer removed"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Yesterday"
+ "Tomorrow"
+ "Today"
+ "copy"
+ "Saturday"
+ "Friday"
+ "Thursday"
+ "Wednesday"
+ "Tuesday"
+ "Monday"
+ "Sunday"
+ "Day"
+ "Week"
+ "Month"
+ "Calendar view mode"
+ "%1$s ongoing, %2$s paused"
+ "Tap to view"
+ "Dismiss all timers"
+ "Dismiss"
+ "%1$s timers expired"
+ "%1$s was delayed by %2$s"
+ "Preset time updated"
+ "Cook confidently with timers!"
+ "Go to date"
+ "Random"
diff --git a/app/resources/Android/src/main/res/values-ta/strings.xml b/app/resources/Android/src/main/res/values-ta/strings.xml
index a58630a4..ac1bf448 100644
--- a/app/resources/Android/src/main/res/values-ta/strings.xml
+++ b/app/resources/Android/src/main/res/values-ta/strings.xml
@@ -1,5 +1,60 @@
+ "உணவு வகையைத் தேர்ந்தெடுக்கவும்"
+ "உணவு திட்டங்களுடன் ஆரோக்கியமாக சாப்பிடுங்கள்!"
+ "ஒன்றை உருவாக்க பிளஸ் பொத்தானைப் பயன்படுத்தவும்"
+ "உணவு திட்டங்களை தானாக நீக்கு"
+ "ஒரு வருடத்திற்கும் மேலானது"
+ "ஒரு மாதத்திற்கும் மேலானது"
+ "ஒரு வாரத்திற்கும் மேலானது"
+ "ஒருபோதும்"
+ "மாதம்"
+ "வாரம்"
+ "நாள்"
+ "%1$s செயலில் உள்ளது,%2$s இடைநிறுத்தப்பட்டது"
+ "கேலெண்டர் காட்சி முறை"
+ "ஞாயிறு"
+ "திங்கள்"
+ "செவ்வாய்"
+ "புதன்"
+ "வியாழன்"
+ "வெள்ளி"
+ "சனி"
+ "நகல்"
+ "இன்று"
+ "நாளை"
+ "நேற்று"
+ "%1$s %2$s தாமதமாக்கப்பட்டது"
+ "%1$s டைமர்கள் முடிந்துவிட்டன"
+ "அகற்று"
+ "அனைத்து டைமர்களையும் அகற்று"
+ "பார்க்க தட்டவும்"
+ "டைமர்களுடன் நம்பிக்கையுடன் சமையுங்கள்!"
+ "முன்னமைவின் நேரம் புதுப்பிக்கப்பட்டது"
+ "ஒழுங்குமுறையின்றி"
+ "தேதிக்குச் செல்"
+ "வினாடி"
+ "சமையல் டைமர்"
+ "புதிய டைமர்"
+ "துடங்கு"
+ "நிறுத்து"
+ "தாமதப்படுத்து"
+ "டைமர் %1$s"
+ "முன்னமைவுகள்"
+ "முன்னமைவுகள்"
+ "நீங்கள் முன்னமைவுகளிலிருந்து %1$s ஐ நீக்க உள்ளீர்கள்"
+ "எந்த சமையல் குறிப்புக்காக?"
+ "முன்னமைவுகளில் சேர்க்கப்பட்டது"
+ "டைமர் ஒலி"
+ "டைமர் அதிர்வு"
+ "தாமத காலம்"
+ "நிமிடம்"
+ "நிமிடங்கள்"
+ "மணி"
+ "மணி"
+ "வினாடிகள்"
+ "டைமர் அகற்றப்பட்டது"
+ "அறிவிப்பு அமைப்புகள்"
"அமைப்பு இயல்புநிலை + கருப்பு"
"%1$s இல் காப்புப் பிரதி எடுக்கப்பட்டது"
"மகசூல்"
@@ -201,7 +256,7 @@
"கட்டம்"
"கிரேக்க"
"கிராம்"
- "கிட்ஹப்பில் காண்க"
+ "GitHub இல் காண்க"
"ஜெர்மன்"
"கேலன்"
"கேலன்"
@@ -293,26 +348,5 @@
"சேர்"
"பற்றி"
"புகைப்படத்தை இணைக்கவும்"
- "Notification settings"
- "Timer removed"
- "seconds"
- "hours"
- "hour"
- "minutes"
- "minute"
- "Delay duration"
- "Timer vibrate"
- "Timer sound"
- "Added to presets"
- "for which recipe?"
- "Timer presets"
- "PRESETS"
- "Timer %1$s"
- "Delay"
- "Stop"
- "START"
- "New timer"
- "Cooking Timer"
- "sec"
- "tmrClr"
+ "Add"
diff --git a/app/resources/Android/src/main/res/values-te/strings.xml b/app/resources/Android/src/main/res/values-te/strings.xml
index 3dd25ff9..1fba4a4e 100644
--- a/app/resources/Android/src/main/res/values-te/strings.xml
+++ b/app/resources/Android/src/main/res/values-te/strings.xml
@@ -1,5 +1,49 @@
+ "యాదృచ్ఛికం"
+ "తేదీకి వెళ్ళండి"
+ "టైమర్లతో నమ్మకంగా ఉడికించాలి!"
+ "ప్రీసెట్ సమయం నవీకరించబడింది"
+ "%1$s %2$s ఆలస్యం అయింది"
+ "%1$s టైమర్ల గడువు ముగిసింది"
+ "రద్దుచేసే"
+ "అన్ని టైమర్లను తొలగించండి"
+ "వీక్షించడానికి నొక్కండి"
+ "%1$s పురోగతిలో ఉంది, %2$s పాజ్ చేయబడ్డాయి"
+ "క్యాలెండర్ వీక్షణ మోడ్"
+ "ఆదివారం"
+ "సోమవారం"
+ "మంగళవారం"
+ "బుధవారం"
+ "గురువారం"
+ "శుక్రవారం"
+ "శనివారం"
+ "కాపీ"
+ "నేడు"
+ "రేపు"
+ "నిన్న"
+ "సెక"
+ "వంట టైమర్"
+ "క్రొత్త టైమర్"
+ "ప్రారం"
+ "ఆపు"
+ "ఆలస్యం"
+ "టైమర్ %1$s"
+ "ప్రీసెట్లు"
+ "ప్రీసెట్లు"
+ "మీరు ప్రీసెట్లు నుండి %1$s ను తొలగించబోతున్నారు"
+ "ఏ రెసిపీ కోసం?"
+ "ప్రీసెట్లు జోడించబడ్డాయి"
+ "టైమర్ ధ్వని"
+ "టైమర్ వైబ్రేట్"
+ "ఆలస్యం వ్యవధి"
+ "నిమిషం"
+ "నిమిషాలు"
+ "గంట"
+ "గంటలు"
+ "సెకన్లు"
+ "టైమర్ తొలగించబడింది"
+ "నోటిఫికేషన్ సెట్టింగులు"
"సిస్టమ్ డిఫాల్ట్ + నలుపు"
"%1$s కు బ్యాకప్ చేయబడింది"
"దిగుబడి"
@@ -89,7 +133,7 @@
"వర్గం జాబితాను రీసెట్ చేయండి"
"రీసెట్ చేయండి"
"రెసిపీ కనుగొనబడలేదు"
- "అవసరమైన %%"
+ "అవసరమైన %1$s"
"నవీకరించబడింది:"
"నా ఆరోగ్యకరమైన వంటకం"
"వంటకాలు"
@@ -293,26 +337,16 @@
"చేర్చు"
"గురించి"
"ఫోటోను అటాచ్ చేయండి"
- "Notification settings"
- "Timer removed"
- "seconds"
- "hours"
- "hour"
- "minutes"
- "minute"
- "Delay duration"
- "Timer vibrate"
- "Timer sound"
- "Added to presets"
- "for which recipe?"
- "Timer presets"
- "PRESETS"
- "Timer %1$s"
- "Delay"
- "Stop"
- "START"
- "New timer"
- "Cooking Timer"
- "sec"
- "tmrClr"
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Day"
+ "Week"
+ "Month"
diff --git a/app/resources/Android/src/main/res/values/strings.xml b/app/resources/Android/src/main/res/values/strings.xml
index d91f9e1d..d79a613d 100644
--- a/app/resources/Android/src/main/res/values/strings.xml
+++ b/app/resources/Android/src/main/res/values/strings.xml
@@ -1,5 +1,39 @@
+ "Add"
+ "Never"
+ "Older than a week"
+ "Older than a month"
+ "Older than a year"
+ "Auto-delete meal plans"
+ "Use the plus button to create one"
+ "Eat healthy with meal plans!"
+ "Select meal type"
+ "Yesterday"
+ "Tomorrow"
+ "Today"
+ "copy"
+ "Saturday"
+ "Friday"
+ "Thursday"
+ "Wednesday"
+ "Tuesday"
+ "Monday"
+ "Sunday"
+ "Day"
+ "Week"
+ "Month"
+ "Calendar view mode"
+ "%1$s ongoing, %2$s paused"
+ "Tap to view"
+ "Dismiss all timers"
+ "Dismiss"
+ "%1$s timers expired"
+ "%1$s was delayed by %2$s"
+ "Preset time updated"
+ "Cook confidently with timers!"
+ "Go to date"
+ "Random"
"Notification settings"
"Timer removed"
"seconds"
@@ -12,7 +46,8 @@
"Timer sound"
"Added to presets"
"for which recipe?"
- "Timer presets"
+ "You are about to delete %1$s from the presets"
+ "Presets"
"PRESETS"
"Timer %1$s"
"Delay"
@@ -314,5 +349,4 @@
"ADD"
"About"
"Attach a photo"
- "tmrClr"
diff --git a/app/resources/Android/src/main/res/xml/provider.xml b/app/resources/Android/src/main/res/xml/provider.xml
index d82b1349..04c23891 100644
--- a/app/resources/Android/src/main/res/xml/provider.xml
+++ b/app/resources/Android/src/main/res/xml/provider.xml
@@ -1,4 +1,4 @@
-
-
\ No newline at end of file
+
+
diff --git a/app/resources/Android/src/main/res/xml/shortcuts.xml b/app/resources/Android/src/main/res/xml/shortcuts.xml
new file mode 100644
index 00000000..cb362b63
--- /dev/null
+++ b/app/resources/Android/src/main/res/xml/shortcuts.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/rtl-ui/dock-layout/index.android.ts b/app/rtl-ui/dock-layout/index.android.ts
new file mode 100644
index 00000000..14a51f8e
--- /dev/null
+++ b/app/rtl-ui/dock-layout/index.android.ts
@@ -0,0 +1,52 @@
+import { Property, DockLayout } from '@nativescript/core'
+
+class Common extends DockLayout {
+ public rtl: boolean
+}
+const RTLProperty = new Property({
+ name: 'rtl',
+ defaultValue: false,
+ valueConverter(v): boolean {
+ return !!v
+ },
+})
+RTLProperty.register(Common)
+
+export class RDockLayout extends Common {
+ public initNativeView(): void {
+ super.initNativeView()
+ this._updateDirection()
+ }
+ [RTLProperty.setNative](rtl: boolean): void {
+ this.rtl = rtl
+ this._updateDirection()
+ }
+ public addChild(view): void {
+ super.addChild(view)
+ if (view.nativeViewProtected) {
+ this._updateDirection()
+ }
+ }
+ public removeChild(view): void {
+ super.removeChild(view)
+ if (view.nativeViewProtected) {
+ this._updateDirection()
+ }
+ }
+ private _updateDirection(): void {
+ let v = this
+ setTimeout(() => {
+ v.nativeViewProtected.setRotationY(v.rtl ? 180 : 0)
+ for (let i = 0; i < v.getChildrenCount(); i++) {
+ let c = v.getChildAt(i).className
+ let r = /(^|\s)rtl($|\s)/.test(c)
+ let a = /(^|\s)a($|\s)/.test(c)
+ if (!v.rtl) r = !r
+ if (/(^|\s)a($|\s)/.test(c))
+ v.getChildAt(i).horizontalAlignment = a ? 'left' : 'right'
+ v.getChildAt(i).nativeView &&
+ v.getChildAt(i).nativeView.setRotationY(v.rtl ? (r ? 0 : 180) : 0)
+ }
+ }, 1)
+ }
+}
diff --git a/app/rtl-ui/dock-layout/index.d.ts b/app/rtl-ui/dock-layout/index.d.ts
new file mode 100644
index 00000000..3f95f04e
--- /dev/null
+++ b/app/rtl-ui/dock-layout/index.d.ts
@@ -0,0 +1 @@
+export { RDockLayout } from './index.android'
diff --git a/app/rtl-ui/grid-layout/index.android.ts b/app/rtl-ui/grid-layout/index.android.ts
new file mode 100644
index 00000000..7a259d1e
--- /dev/null
+++ b/app/rtl-ui/grid-layout/index.android.ts
@@ -0,0 +1,53 @@
+import { Property, GridLayout } from '@nativescript/core/ui'
+
+class Common extends GridLayout {
+ public rtl: boolean
+}
+const RTLProperty = new Property({
+ name: 'rtl',
+ defaultValue: false,
+ valueConverter(v): boolean {
+ return !!v
+ },
+})
+RTLProperty.register(Common)
+
+export class RGridLayout extends Common {
+ public initNativeView(): void {
+ super.initNativeView()
+ this._updateDirection()
+ }
+ [RTLProperty.setNative](rtl: boolean): void {
+ this.rtl = rtl
+ this._updateDirection()
+ }
+ public addChild(view): void {
+ super.addChild(view)
+ if (view.nativeViewProtected) {
+ this._updateDirection()
+ }
+ }
+ public removeChild(view): void {
+ super.removeChild(view)
+ if (view.nativeViewProtected) {
+ this._updateDirection()
+ }
+ }
+ private _updateDirection(): void {
+ let v = this
+ setTimeout(() => {
+ let pr = /(^|\s)rtl($|\s)/.test(v.className)
+ v.nativeViewProtected.setRotationY(v.rtl ? (pr ? 0 : 180) : 0)
+ for (let i = 0; i < v.getChildrenCount(); i++) {
+ let c = v.getChildAt(i).className
+ let r = /(^|\s)rtl($|\s)/.test(c)
+ let a = /(^|\s)a($|\s)/.test(c)
+ if (!v.rtl) r = !r
+ if (/(^|\s)a($|\s)/.test(c))
+ v.getChildAt(i).horizontalAlignment = a ? 'left' : 'right'
+ v.getChildAt(i).nativeView &&
+ v.getChildAt(i).nativeView.setRotationY(v.rtl ? (r ? 0 : 180) : 0)
+ }
+ }, 1)
+ }
+}
diff --git a/app/rtl-ui/grid-layout/index.d.ts b/app/rtl-ui/grid-layout/index.d.ts
new file mode 100644
index 00000000..4013e71e
--- /dev/null
+++ b/app/rtl-ui/grid-layout/index.d.ts
@@ -0,0 +1 @@
+export { RGridLayout } from './index.android'
diff --git a/app/rtl-ui/index.ts b/app/rtl-ui/index.ts
new file mode 100644
index 00000000..674bad71
--- /dev/null
+++ b/app/rtl-ui/index.ts
@@ -0,0 +1,4 @@
+export { RGridLayout } from './grid-layout'
+export { RStackLayout } from './stack-layout'
+export { RDockLayout } from './dock-layout'
+export { RLabel } from './label'
diff --git a/app/rtl-ui/label/index.android.ts b/app/rtl-ui/label/index.android.ts
new file mode 100644
index 00000000..8701aa53
--- /dev/null
+++ b/app/rtl-ui/label/index.android.ts
@@ -0,0 +1,13 @@
+import { Label, ApplicationSettings } from '@nativescript/core'
+
+export class RLabel extends Label {
+ public initNativeView(): void {
+ super.initNativeView()
+ this._setGravity()
+ }
+ private _setGravity(): void {
+ this.nativeViewProtected.setGravity(
+ ApplicationSettings.getNumber('RTL', 0) ? 5 : 3
+ )
+ }
+}
diff --git a/app/rtl-ui/label/index.d.ts b/app/rtl-ui/label/index.d.ts
new file mode 100644
index 00000000..4c9feb81
--- /dev/null
+++ b/app/rtl-ui/label/index.d.ts
@@ -0,0 +1 @@
+export { RLabel } from './index.android'
diff --git a/app/rtl-ui/stack-layout/index.android.ts b/app/rtl-ui/stack-layout/index.android.ts
new file mode 100644
index 00000000..61a0c623
--- /dev/null
+++ b/app/rtl-ui/stack-layout/index.android.ts
@@ -0,0 +1,53 @@
+import { Property, StackLayout } from '@nativescript/core'
+
+class Common extends StackLayout {
+ public rtl: boolean
+}
+const RTLProperty = new Property({
+ name: 'rtl',
+ defaultValue: false,
+ valueConverter(v): boolean {
+ return !!v
+ },
+})
+RTLProperty.register(Common)
+
+export class RStackLayout extends Common {
+ public initNativeView(): void {
+ super.initNativeView()
+ this._updateDirection()
+ }
+ [RTLProperty.setNative](rtl: boolean): void {
+ this.rtl = rtl
+ this._updateDirection()
+ }
+ public addChild(view): void {
+ super.addChild(view)
+ if (view.nativeViewProtected) {
+ this._updateDirection()
+ }
+ }
+ public removeChild(view): void {
+ super.removeChild(view)
+ if (view.nativeViewProtected) {
+ this._updateDirection()
+ }
+ }
+ private _updateDirection(): void {
+ let v = this
+ setTimeout(() => {
+ let pr = /(^|\s)rtl($|\s)/.test(v.className)
+ v.nativeViewProtected.setRotationY(v.rtl ? (pr ? 0 : 180) : 0)
+ for (let i = 0; i < v.getChildrenCount(); i++) {
+ let c = v.getChildAt(i).className
+ let r = /(^|\s)rtl($|\s)/.test(c)
+ let a = /(^|\s)a($|\s)/.test(c)
+ if (!v.rtl) r = !r
+ if (/(^|\s)a($|\s)/.test(c))
+ v.getChildAt(i).horizontalAlignment = a ? 'left' : 'right'
+ v.getChildAt(i).nativeView &&
+ v.getChildAt(i).nativeView.setRotationY(v.rtl ? (r ? 0 : 180) : 0)
+ }
+ }, 1)
+ }
+}
diff --git a/app/rtl-ui/stack-layout/index.d.ts b/app/rtl-ui/stack-layout/index.d.ts
new file mode 100644
index 00000000..7841e299
--- /dev/null
+++ b/app/rtl-ui/stack-layout/index.d.ts
@@ -0,0 +1 @@
+export { RStackLayout } from './index.android'
diff --git a/app/shared/mixins.ts b/app/shared/mixins.ts
index 39d041f0..45ea1afe 100644
--- a/app/shared/mixins.ts
+++ b/app/shared/mixins.ts
@@ -1,6 +1,9 @@
declare const android: any
+import { CoreTypes } from '@nativescript/core'
+import { localize } from '@nativescript/localize'
+const Intl = require('nativescript-intl')
-export const lvMixin = {
+export const myMixin = {
methods: {
transparentPage({ object }) {
object._dialogFragment
@@ -12,15 +15,39 @@ export const lvMixin = {
)
)
},
- // animateInOut(dur, rev, draw) {
- // const start = Date.now()
- // let timer = setInterval(() => {
- // const passed = Date.now() - start
- // let val = passed / dur
- // if (val > 1) val = 1
- // draw(rev ? 1 - val : val)
- // if (val === 1) clearInterval(timer)
- // }, 17) // 1000ms/60fps=16.66ms => 17ms
- // },
+ animateBar(obj, op) {
+ if (op) {
+ obj.translateY = 64
+ obj.opacity = 0
+ }
+ return obj.animate({
+ opacity: op,
+ translate: { x: 0, y: op ? 0 : 64 },
+ duration: 200,
+ curve: CoreTypes.AnimationCurve.ease,
+ })
+ },
+ totalTime(prepTime, cookTime) {
+ let t1 = prepTime.split(':')
+ let t2 = cookTime.split(':')
+ let minutes = parseInt(t1[1]) + parseInt(t2[1])
+ let m = minutes % 60
+ let h = parseInt(t1[0]) + parseInt(t2[0]) + Math.floor(minutes / 60)
+ let hr = localize('hr')
+ let min = localize('min')
+ let mins = h * 60 + m
+ h = h && this.getLocaleN(h)
+ m = m && this.getLocaleN(m)
+ return {
+ time: h ? (m ? `${h} ${hr} ${m} ${min}` : `${h} ${hr}`) : `${m} ${min}`,
+ duration: `${mins}`,
+ }
+ },
+ setGravity(args) {
+ ;(args.object || args).android.setGravity(this.RTL ? 5 : 3)
+ },
+ getLocaleN(n) {
+ return new Intl.NumberFormat(null).format(n)
+ },
},
}
diff --git a/app/shared/utils.ts b/app/shared/utils.ts
index aefcca58..6c10bf52 100644
--- a/app/shared/utils.ts
+++ b/app/shared/utils.ts
@@ -6,19 +6,23 @@ import {
Color,
path,
knownFolders,
+ ApplicationSettings,
} from '@nativescript/core'
import { localize } from '@nativescript/localize'
let timerOne
declare const global, android, androidx, com, java, Array: any
+const View = android.view.View
const PowerManager = android.os.PowerManager
const pm = Utils.android
.getApplicationContext()
.getSystemService(android.content.Context.POWER_SERVICE)
const wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 'Timers')
-export const restartApp = () => {
+const sdkv = parseInt(Device.sdkVersion)
+
+export function restartApp() {
const ctx = Utils.ad.getApplicationContext()
let mStartActivity = new android.content.Intent(
ctx,
@@ -39,7 +43,7 @@ export const restartApp = () => {
)
android.os.Process.killProcess(android.os.Process.myPid())
}
-export const openAppSettingsPage = () => {
+export function openAppSettingsPage() {
let intent = new android.content.Intent(
android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS
)
@@ -51,7 +55,7 @@ export const openAppSettingsPage = () => {
)
Application.android.foregroundActivity.startActivity(intent)
}
-export const hasAccelerometer = () => {
+export function hasAccelerometer() {
let ctx = Utils.ad.getApplicationContext()
let sensorManager = ctx.getSystemService(
android.content.Context.SENSOR_SERVICE
@@ -60,21 +64,21 @@ export const hasAccelerometer = () => {
android.hardware.Sensor.TYPE_ACCELEROMETER
)
}
-export const vibrate = (duration) => {
+export function vibrate(duration) {
let vibratorService = Application.android.context.getSystemService(
android.content.Context.VIBRATOR_SERVICE
)
if (vibratorService.hasVibrator()) vibratorService.vibrate(duration)
}
-export const timer = (dur, callback) => {
- callback(true)
+export function timer(dur, callback) {
+ callback(1)
clearInterval(timerOne)
timerOne = setInterval(() => {
dur--
- callback(true)
+ callback(1)
if (dur == 0) {
clearInterval(timerOne)
- callback(false)
+ callback(0)
}
}, 1000)
}
@@ -95,7 +99,7 @@ function callIntent(ctx, intent, msg, pickerType) {
})
}
// IMAGE PICKER
-export const getRecipePhoto = () => {
+export function getRecipePhoto() {
const ctx =
Application.android.foregroundActivity || Application.android.startActivity
const DIR_CODE = Math.round(Math.random() * 10000)
@@ -110,28 +114,41 @@ export const getRecipePhoto = () => {
}
)
}
-export const copyPhotoToCache = (uri, filepath) => {
+export function copyPhotoToCache(src: string, dest: string) {
const ContentResolver = Application.android.nativeApp.getContentResolver()
+ const isURI = src.includes('content://')
return new Promise((resolve) => {
- const inputStream = ContentResolver.openInputStream(uri)
- const input = new java.io.BufferedInputStream(inputStream)
- let size = input.available()
- let buffer = Array.create('byte', size)
- const output = new java.io.BufferedOutputStream(
- new java.io.FileOutputStream(filepath)
- )
- input.read(buffer)
- do {
- output.write(buffer)
- } while (input.read(buffer) != -1)
- input.close()
- output.close()
- resolve(filepath)
+ if (isURI) {
+ const input = new java.io.BufferedInputStream(
+ ContentResolver.openInputStream(src)
+ )
+ let size = input.available()
+ let buffer = Array.create('byte', size)
+ const output = new java.io.BufferedOutputStream(
+ new java.io.FileOutputStream(dest)
+ )
+ input.read(buffer)
+ do {
+ output.write(buffer)
+ } while (input.read(buffer) != -1)
+ input.close()
+ output.close()
+ resolve(dest)
+ } else {
+ const input = new java.io.FileInputStream(src)
+ const output = new java.io.FileOutputStream(dest)
+ let buffer = Array.create('byte', 1024)
+ let len
+ while ((len = input.read(buffer)) > 0) {
+ output.write(buffer, 0, len)
+ }
+ resolve(dest)
+ }
})
}
// COPY DB FILE
-export const copyDBToExport = () => {
+export function copyDBToExport() {
const src = path.join(knownFolders.documents().path, 'EnRecipes.db')
const dst = path.join(
knownFolders.documents().getFolder('EnRecipes').path,
@@ -151,7 +168,7 @@ export const copyDBToExport = () => {
}
// BACKUP FOLDER PICKER
-export const getBackupFolder = () => {
+export function getBackupFolder() {
const ctx =
Application.android.foregroundActivity || Application.android.startActivity
const DIR_CODE = Math.round(Math.random() * 10000)
@@ -167,7 +184,7 @@ export const getBackupFolder = () => {
}
// BACKUP FILE PICKER
-export const getBackupFile = () => {
+export function getBackupFile() {
const ctx =
Application.android.foregroundActivity || Application.android.startActivity
const DIR_CODE = Math.round(Math.random() * 10000)
@@ -187,7 +204,7 @@ export const getBackupFile = () => {
// ZIP OPERATIONS
export class Zip {
- static getSubFiles(src: string, isRootFolder?: boolean) {
+ static getSubFiles(src: string, isRootFolder?: number) {
const fileList = new java.util.ArrayList()
const sourceFile = new java.io.File(src)
let tempList = sourceFile.listFiles()
@@ -216,7 +233,7 @@ export class Zip {
let destFile = uri.createFile('application/zip', filename).getUri()
const outputStream = ContentResolver.openOutputStream(destFile)
const zipOutputStream = new java.util.zip.ZipOutputStream(outputStream)
- const sourceFiles = Zip.getSubFiles(src, true)
+ const sourceFiles = Zip.getSubFiles(src, 1)
for (let i = 0; i < sourceFiles.size(); i++) {
let len
let buffer = Array.create('byte', 4096)
@@ -287,12 +304,12 @@ function getSendIntent(type) {
intent.setType(type)
return intent
}
-export const shareText = (text, subject) => {
+export function shareText(text, subject) {
const intent = getSendIntent('text/plain')
intent.putExtra(android.content.Intent.EXTRA_TEXT, text)
share(intent, subject)
}
-export const shareImage = (image, subject, title) => {
+export function shareImage(image, subject, title) {
let ctx = Application.android.context
const intent = getSendIntent('image/jpeg')
const baos = new java.io.ByteArrayOutputStream()
@@ -311,7 +328,7 @@ export const shareImage = (image, subject, title) => {
share(intent, subject)
}
-export const keepScreenOn = (bool) => {
+export function keepScreenOn(bool) {
let ctx =
Application.android.foregroundActivity || Application.android.startActivity
let window = ctx.getWindow()
@@ -351,7 +368,7 @@ export class TimerNotif {
vibrate,
}: {
multi?: boolean
- actions?: boolean
+ actions?: number
bID: string
cID: string
cName: string
@@ -363,7 +380,6 @@ export class TimerNotif {
},
ctx
) {
- let sdkv: number = parseInt(Device.sdkVersion)
let soundUri: any
if (sound) soundUri = new android.net.Uri.parse(sound)
const NotifyMgr = android.app.NotificationManager
@@ -386,7 +402,7 @@ export class TimerNotif {
importance
)
if (description) Channel.setDescription(description)
- Channel.enableVibration(vibrate)
+ Channel.enableVibration(!!vibrate)
Channel.enableLights(false)
if (sound) Channel.setSound(soundUri, audioAttributes)
else Channel.setSound(null, null)
@@ -443,14 +459,14 @@ export class TimerNotif {
// CREATE NOTIFICATION
- let icon = this.getIcon(ctx, 'notify_icon_sil')
+ let icon = this.getIcon(ctx, 'notify')
let builder = new NotificationCompat.Builder(ctx, cID)
.setColor(new Color('#ff5200').android)
.setContentIntent(mainPInt)
.setContentTitle(title)
.setOngoing(true)
.setPriority(priority)
- .setShowWhen(actions)
+ .setShowWhen(!!actions)
.setSmallIcon(icon)
.setTicker(title)
.setAutoCancel(false)
@@ -482,37 +498,31 @@ export class TimerNotif {
}
}
export class Printer {
- static PrintPackage = global.androidx.print
+ static PrintHelper = androidx.print.PrintHelper
static isSupported() {
- return this.PrintPackage.PrintHelper.systemSupportsPrint()
+ return this.PrintHelper.systemSupportsPrint()
}
- static print(view) {
+ static print(view, fileName) {
+ const ctx =
+ Application.android.foregroundActivity ||
+ Application.android.startActivity
+ const PrintAttributes = android.print.PrintAttributes
+ const PrintManager = ctx.getSystemService(
+ android.content.Context.PRINT_SERVICE
+ )
return new Promise((resolve, reject) => {
try {
- let img: any
- img = android.graphics.Bitmap.createBitmap(
- view.getMeasuredWidth(),
- view.getMeasuredHeight(),
- android.graphics.Bitmap.Config.ARGB_8888
- )
- view.android.draw(new android.graphics.Canvas(img))
- this.printImage(img).then(resolve, reject)
- } catch (e) {
- reject(e)
- }
- })
- }
- static printImage(img) {
- return new Promise((resolve, reject) => {
- try {
- let callback = (success) => resolve(success)
- let printHelper = new this.PrintPackage.PrintHelper(
- Application.android.foregroundActivity
- )
- printHelper.setScaleMode(this.PrintPackage.PrintHelper.SCALE_MODE_FIT)
- let jobName = 'MyPrintJob'
- printHelper.printBitmap(jobName, img)
- callback(true)
+ const PrintAdapter = view.android.createPrintDocumentAdapter(fileName)
+ if (PrintManager != null) {
+ let attributes = new PrintAttributes.Builder()
+ .setMediaSize(PrintAttributes.MediaSize.ISO_A4)
+ .setMinMargins(PrintAttributes.Margins.NO_MARGINS)
+ .setResolution(
+ new PrintAttributes.Resolution('pdf', 'pdf', 300, 300)
+ )
+ PrintManager.print(fileName, PrintAdapter, attributes.build())
+ resolve(true)
+ }
} catch (e) {
reject(e)
}
@@ -521,7 +531,7 @@ export class Printer {
}
// GET RINGTONES LIST
-export const getTones = () => {
+export function getTones() {
const RingtoneManager = android.media.RingtoneManager
let ctx = Utils.ad.getApplicationContext()
const ringtonesMgr = new RingtoneManager(ctx)
@@ -556,14 +566,84 @@ export const getTones = () => {
return { tones, defaultTone: defaultToneUri ? defaultTone : tones[0] }
}
-//DETECT RTL LANGUAGE
-export const RTL = (): boolean => {
- const ctx = Utils.android.getApplicationContext()
- const config = ctx.getResources().getConfiguration()
- return config.getLayoutDirection() == android.view.View.LAYOUT_DIRECTION_RTL
+//WAKE LOCK
+export function wakeLock(n): void {
+ n ? !wl.isHeld() && wl.acquire() : wl.isHeld() && wl.release()
}
-//WAKE LOCK
-export const wakeLock = (bool) => {
- bool ? !wl.isHeld() && wl.acquire() : wl.isHeld() && wl.release()
+//RandomId
+export function getRandomID(n?: number) {
+ if (n) return Math.floor(Math.random() * 9000000000) + 1000000000
+ else {
+ let res = ''
+ let chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
+ for (let i = 0; i < 16; i++) {
+ res += chars.charAt(Math.floor(Math.random() * chars.length))
+ }
+ return res
+ }
+}
+
+//LocaleHandlers
+export function updateLocale() {
+ let lang = ApplicationSettings.getString('appLocale', 'none').split('-')
+ const l = lang[0]
+ const c = lang[1]
+ const ctx = Utils.android.getApplicationContext()
+ const res = ctx.getResources()
+ const config = res.getConfiguration()
+ if (l !== 'none') {
+ const locale = c ? new java.util.Locale(l, c) : new java.util.Locale(l)
+ java.util.Locale.setDefault(locale)
+ config.setLocale(locale)
+ config.setLayoutDirection(locale)
+ ctx.createConfigurationContext(config)
+ res.updateConfiguration(config, res.getDisplayMetrics())
+ ApplicationSettings.setNumber('RTL', config.getLayoutDirection() | 0)
+ }
+ ApplicationSettings.setString('sysLocale', sysLocale())
+}
+export function sysRTL() {
+ return android.content.res.Resources.getSystem()
+ .getConfiguration()
+ .getLayoutDirection()
+}
+export function sysLocale() {
+ return android.content.res.Resources.getSystem()
+ .getConfiguration()
+ .locale.toString()
+ .replace('_', '-')
+}
+
+// SetBarColors
+export function setBarColors(w, dv, t) {
+ function setColors(color) {
+ w.setStatusBarColor(new Color(color).android)
+ sdkv >= 27 && w.setNavigationBarColor(new Color(color).android)
+ }
+ switch (t) {
+ case 'Light':
+ setColors('#f1f3f5')
+ break
+ case 'Dark':
+ setColors('#212529')
+ break
+ default:
+ setColors('#000000')
+ break
+ }
+ if (sdkv >= 27)
+ dv.setSystemUiVisibility(
+ t == 'Light'
+ ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR |
+ View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR
+ : View.SYSTEM_UI_FLAG_DARK_STATUS_BAR |
+ View.SYSTEM_UI_FLAG_DARK_NAVIGATION_BAR
+ )
+ else
+ dv.setSystemUiVisibility(
+ t == 'Light'
+ ? View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
+ : View.SYSTEM_UI_FLAG_DARK_STATUS_BAR
+ )
}
diff --git a/app/store.ts b/app/store.ts
index 182aeaed..ce64ea19 100644
--- a/app/store.ts
+++ b/app/store.ts
@@ -1,7 +1,8 @@
import Vue from 'nativescript-vue'
import Vuex from 'vuex'
+
Vue.use(Vuex)
-import { openOrCreate } from '@akylas/nativescript-sqlite'
+
import {
getFileAccess,
File,
@@ -15,34 +16,35 @@ import {
getString,
setString,
} from '@nativescript/core/application-settings'
+import { openOrCreate } from '@akylas/nativescript-sqlite'
import * as utils from '~/shared/utils'
-// OPEN DATABASE FILE
+// OpenDatabaseFile
const db = openOrCreate(
path.join(knownFolders.documents().path, 'EnRecipes.db')
)
-// CREATE recipes TABLE
+// Create"recipes"Table
db.execute(
'CREATE TABLE IF NOT EXISTS recipes (id TEXT PRIMARY KEY, image TEXT, title TEXT, cuisine TEXT, category TEXT, tags TEXT, prepTime TEXT, cookTime TEXT, yieldQuantity TEXT, yieldUnit TEXT, difficulty TEXT, rating INT, ingredients TEXT, instructions TEXT, combinations TEXT, notes TEXT, favorite INT, tried INT, lastTried INT, lastModified INT, created INT)'
)
-// CREATE lists TABLE
+// Create"lists"Table
db.execute(
'CREATE TABLE IF NOT EXISTS lists (cuisines TEXT, categories TEXT, yieldUnits TEXT, units TEXT)'
)
-// CREATE mealPlans TABLE
+// Create"mealPlans"Table
db.execute(
- 'CREATE TABLE IF NOT EXISTS mealPlans (date INT, type TEXT, title TEXT)'
+ 'CREATE TABLE IF NOT EXISTS mealPlans (id TEXT PRIMARY KEY, date INT, mealType TEXT, recipeID TEXT, quantity INT, note TEXT)'
)
-// CREATE timerPresets TABLE
+// Create"timerPresets"Table
db.execute(
'CREATE TABLE IF NOT EXISTS timerPresets (id INT PRIMARY KEY, label TEXT, time TEXT)'
)
-const defaultCuisines = [
+const defCuisines = [
'American',
'Brazilian',
'British',
@@ -73,7 +75,7 @@ const defaultCuisines = [
'Turkish',
'Vietnamese',
]
-const defaultCategories = [
+const defCategories = [
'Appetizers',
'Barbecue',
'Beverages',
@@ -99,7 +101,7 @@ const defaultCategories = [
'Vegan',
'Vegetarian',
]
-const defaultYieldUnits = [
+const defYieldUnits = [
'Serving',
'Piece',
'Teaspoon',
@@ -117,7 +119,7 @@ const defaultYieldUnits = [
'Patty',
'Loaf',
]
-const defaultUnits = [
+const defUnits = [
'unit',
'tsp',
'dsp',
@@ -151,19 +153,19 @@ const defaultUnits = [
const listItems = {
cuisines: {
sort: 1,
- defaultItems: defaultCuisines,
+ defs: defCuisines,
},
categories: {
sort: 1,
- defaultItems: defaultCategories,
+ defs: defCategories,
},
yieldUnits: {
sort: 0,
- defaultItems: defaultYieldUnits,
+ defs: defYieldUnits,
},
units: {
sort: 0,
- defaultItems: defaultUnits,
+ defs: defUnits,
},
}
@@ -240,13 +242,17 @@ export default new Vuex.Store({
delay: '\ue93d',
ring: '\ue93e',
print: '\ue93f',
+ dup: '\ue940',
+ calv: '\ue941',
+ mpd: '\ue942',
+ madd: '\ue943',
},
- currentComponent: 'EnRecipes',
sortType: 'random',
language: [
{
locale: 'ar',
title: 'العربية',
+ rtl: 1,
},
{
locale: 'da',
@@ -300,14 +306,14 @@ export default new Vuex.Store({
locale: 'it',
title: 'Italiano',
},
- {
- locale: 'ja',
- title: '日本語',
- },
- {
- locale: 'ml',
- title: 'മലയാളം',
- },
+ // {
+ // locale: 'ja',
+ // title: '日本語',
+ // },
+ // {
+ // locale: 'ml',
+ // title: 'മലയാളം',
+ // },
{
locale: 'nb-NO',
title: 'Norsk bokmål',
@@ -337,29 +343,39 @@ export default new Vuex.Store({
title: 'తెలుగు',
},
],
- shakeEnabled: getNumber('shakeEnabled', 1),
+ shake: getNumber('shake', 1),
importSummary: {
found: 0,
imported: 0,
updated: 0,
},
layout: getString('layout', 'detailed'),
- selectedCuisine: null,
- selectedCategory: null,
- selectedTag: null,
- appTheme: 'sysDef',
+ selCuisine: null,
+ selCategory: null,
+ selTag: null,
+ theme: 'sysDef',
mondayFirst: getNumber('mondayFirst', 0),
- timerDelay: getString('timerDelay', '1 minute'),
+ timerDelay: getNumber('timerDelay', 1),
timerSound: {},
timerVibrate: getNumber('timerVibrate', 0),
timerPresets: [],
activeTimers: [],
FGService: 0,
- RTL: 0,
+ RTL: getNumber('RTL', 0),
+ plannerView: getString('plannerView', 'wk'),
+ planDeletion: getString('planDeletion', 'nvr'),
},
mutations: {
+ setPlanDeletion(state, s) {
+ state.planDeletion = s
+ setString('planDeletion', s)
+ },
+ setPlannerView(state, s) {
+ state.plannerView = s
+ setString('plannerView', s)
+ },
setRTL(state) {
- state.RTL = utils.RTL() as any | 0
+ state.RTL = getNumber('RTL', 0)
},
setFGService(state, val) {
state.FGService = val
@@ -427,9 +443,9 @@ export default new Vuex.Store({
removeActiveTimer(state, i) {
state.activeTimers.splice(i, 1)
},
- setTimerDelay(state, delay) {
- state.timerDelay = delay
- setString('timerDelay', delay)
+ setTimerDelay(state, n: number) {
+ state.timerDelay = n
+ setNumber('timerDelay', n)
},
setTimerSound(state, sound) {
state.timerSound = sound
@@ -443,27 +459,27 @@ export default new Vuex.Store({
for (const key in state.importSummary) state.importSummary[key] = 0
},
setFirstDay(state, n) {
- state.mondayFirst = n | 0
- setNumber('mondayFirst', n | 0)
+ state.mondayFirst = n
+ setNumber('mondayFirst', n)
},
setTheme(state, theme) {
switch (theme) {
case 'sysDef':
- state.appTheme =
+ state.theme =
Application.systemAppearance() == 'dark' ? 'Dark' : 'Light'
break
case 'sysDefB':
- state.appTheme =
+ state.theme =
Application.systemAppearance() == 'dark' ? 'Black' : 'Light'
break
default:
- state.appTheme = theme
+ state.theme = theme
break
}
- setString('appTheme', theme)
+ setString('theme', theme)
},
clearFilter(state) {
- state.selectedCuisine = state.selectedCategory = state.selectedTag = null
+ state.selCuisine = state.selCategory = state.selTag = null
},
setLayout(state, type) {
state.layout = type
@@ -472,17 +488,19 @@ export default new Vuex.Store({
state.sortType = sortType
},
initRecipes(state) {
- db.select('SELECT * FROM recipes').then((res) => {
- res.forEach((e) => {
- Object.keys(e).forEach(
- (f) =>
- f.match(/tags|ingredients|instructions|combinations|notes/) &&
- (e[f] = JSON.parse(e[f]))
- )
- state.recipes.push(e)
+ if (!state.recipes.length) {
+ db.select('SELECT * FROM recipes').then((res) => {
+ res.forEach((e) => {
+ Object.keys(e).forEach(
+ (f) =>
+ f.match(/tags|ingredients|instructions|combinations|notes/) &&
+ (e[f] = JSON.parse(e[f]))
+ )
+ state.recipes.push(e)
+ })
})
- })
- state.shakeEnabled = getNumber('shakeEnabled', 1)
+ }
+ state.shake = getNumber('shake', 1)
state.sortType = getString('sortType', 'random')
},
importRecipesFromJSON(state, recipes) {
@@ -515,6 +533,8 @@ export default new Vuex.Store({
r.lastTried = getTime(r.lastTried)
r.lastModified = getTime(r.lastModified)
r.created = getTime(r.created)
+ r.favorite = r.favorite | 0
+ r.tried = r.tried | 0
return r
})
}
@@ -542,8 +562,8 @@ export default new Vuex.Store({
JSON.stringify(r.instructions),
JSON.stringify(r.combinations),
JSON.stringify(r.notes),
- r.favorite ? 1 : 0,
- r.tried ? 1 : 0,
+ r.favorite,
+ r.tried,
r.lastTried,
r.lastModified,
r.created,
@@ -583,8 +603,8 @@ export default new Vuex.Store({
JSON.stringify(r.instructions),
JSON.stringify(r.combinations),
JSON.stringify(r.notes),
- r.favorite ? 1 : 0,
- r.tried ? 1 : 0,
+ r.favorite,
+ r.tried,
r.lastTried,
r.lastModified,
r.created,
@@ -740,16 +760,14 @@ export default new Vuex.Store({
db.select(`SELECT * FROM lists`).then((res) => {
Object.keys(res[0]).forEach((list) => {
let userItems: string[]
- let defaultItems = listItems[list].defaultItems
+ let defs = listItems[list].defs
if (res[0][list]) {
userItems = JSON.parse(res[0][list])
- state[list] = userItems.some((e: string) =>
- defaultItems.includes(e)
- )
+ state[list] = userItems.some((e: string) => defs.includes(e))
? userItems
- : [...defaultItems, ...userItems]
+ : [...defs, ...userItems]
} else {
- state[list] = defaultItems
+ state[list] = defs
listItems[list].sort && state[list].sort()
}
})
@@ -784,8 +802,8 @@ export default new Vuex.Store({
)
},
resetListItems(state, listName) {
- let defaultItems = listItems[listName].defaultItems
- state[listName] = [...defaultItems]
+ let defs = listItems[listName].defs
+ state[listName] = [...defs]
if (listItems[listName].sort)
state[listName].sort((a: string, b: string) =>
a.toLowerCase().localeCompare(b.toLowerCase())
@@ -795,12 +813,33 @@ export default new Vuex.Store({
)
},
initMealPlans(state) {
- if (!state.mealPlans.length)
+ if (!state.mealPlans.length) {
+ let c = state.planDeletion
+ let date = new Date()
+ let d = new Date()
+ if (c != 'nvr') {
+ d.setHours(0, 0, 0, 0)
+ let ld =
+ c == 'otay'
+ ? 365
+ : c == 'otam'
+ ? new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate()
+ : 7
+ d.setDate(d.getDate() - ld)
+ }
+
db.select(`SELECT * FROM mealPlans`).then((res) =>
- res.forEach((m: {}) => state.mealPlans.push(m))
+ res.forEach((p: any) => {
+ if (p.date < d.getTime())
+ // DeletingOldMealPlans
+ db.execute(`DELETE FROM mealPlans WHERE id = '${p.id}'`)
+ else state.mealPlans.push(p)
+ })
)
+ }
},
importMealPlansFromJSON(state, mealPlans) {
+ let updatedMealPlans = []
let newMealPlans = mealPlans.filter((e) => {
if (e.hasOwnProperty('eventColor')) {
return !state.mealPlans.some((f) => {
@@ -826,17 +865,21 @@ export default new Vuex.Store({
type = 'snacks'
break
}
- return f.title == e.title && f.date == date && f.type == type
+ return f.recipeID == e.title && f.date == date && f.mealType == type
})
} else {
return !state.mealPlans.some(
- (f) => f.title == e.title && f.date == e.date && f.type == e.type
+ (f) =>
+ f.recipeID == e.title && f.date == e.date && f.mealType == e.type
)
}
})
- let updatedMealPlans = []
- if (newMealPlans[0].hasOwnProperty('eventColor')) {
- newMealPlans.forEach((p) => {
+ newMealPlans.forEach((p) => {
+ p.id = utils.getRandomID()
+ p.recipeID = p.title
+ p.quantity = 1
+ p.note = null
+ if (p.hasOwnProperty('eventColor')) {
let d = new Date(p.startDate)
p.date = new Date(
d.getFullYear(),
@@ -846,29 +889,34 @@ export default new Vuex.Store({
).getTime()
switch (d.getHours()) {
case 0:
- p.type = 'breakfast'
+ p.mealType = 'breakfast'
break
case 5:
- p.type = 'lunch'
+ p.mealType = 'lunch'
break
case 10:
- p.type = 'dinner'
+ p.mealType = 'dinner'
break
case 15:
- p.type = 'snacks'
+ p.mealType = 'snacks'
break
}
+ delete p.title
delete p.startDate
delete p.endDate
delete p.eventColor
- updatedMealPlans.push(p)
- })
- }
+ } else {
+ p.mealType = p.type
+ delete p.type
+ delete p.title
+ }
+ updatedMealPlans.push(p)
+ })
state.mealPlans = [...state.mealPlans, ...updatedMealPlans]
- updatedMealPlans.forEach((m) => {
+ updatedMealPlans.forEach((p) => {
db.execute(
- `INSERT INTO mealPlans (date, type, title) VALUES (?, ?, ?)`,
- [m.date, m.type, m.title]
+ `INSERT INTO mealPlans (id, date, mealType, recipeID, quantity, note) VALUES (?, ?, ?, ?, ?, ?)`,
+ [p.id, p.date, p.mealType, p.recipeID, p.quantity, p.note]
)
})
},
@@ -880,18 +928,21 @@ export default new Vuex.Store({
)
)
state.mealPlans = [...state.mealPlans, ...newMealPlans]
- newMealPlans.forEach((m) => {
+ newMealPlans.forEach((p) => {
db.execute(
- `INSERT INTO mealPlans (date, type, title) VALUES (?, ?, ?)`,
- [m.date, m.type, m.title]
+ `INSERT INTO mealPlans (id, date, mealType, recipeID, quantity, note) VALUES (?, ?, ?, ?, ?, ?)`,
+ [p.id, p.date, p.mealType, p.recipeID, p.quantity, p.note]
)
})
},
- addMealPlan(state, { date, type, title, index, inDB }) {
+ addMealPlan(state, { plan, index, inDB }) {
let mealPlan = {
- date,
- type,
- title,
+ id: plan.id,
+ date: plan.date,
+ mealType: plan.mealType,
+ recipeID: plan.recipeID,
+ quantity: plan.quantity,
+ note: plan.note,
}
if (inDB) {
const cols = Object.keys(mealPlan).join(', ')
@@ -899,7 +950,7 @@ export default new Vuex.Store({
.fill('?')
.join(', ')
db.execute(
- `INSERT INTO mealPlans (${cols}) VALUES (${placeholder})`,
+ `REPLACE INTO mealPlans (${cols}) VALUES (${placeholder})`,
Object.values(mealPlan)
)
if (index === null) state.mealPlans.push(mealPlan)
@@ -907,11 +958,9 @@ export default new Vuex.Store({
state.mealPlans.splice(index, 0, mealPlan)
}
},
- deleteMealPlan(state, { date, type, title, index, inDB }) {
+ deleteMealPlan(state, { id, index, inDB }) {
if (inDB) {
- db.execute(
- `DELETE FROM mealPlans WHERE date = ${date} AND type = '${type}' AND title = '${title}'`
- )
+ db.execute(`DELETE FROM mealPlans WHERE id = '${id}'`)
} else {
state.mealPlans.splice(index, 1)
state.mealPlans = [...state.mealPlans]
@@ -942,9 +991,9 @@ export default new Vuex.Store({
}
})
},
- setShake(state, shake) {
- state.shakeEnabled = shake | 0
- setNumber('shakeEnabled', shake | 0)
+ setShake(state, n) {
+ state.shake = n
+ setNumber('shake', n)
},
setRating(state, { id, rating }) {
let i = state.recipes.findIndex((e) => e.id == id)
@@ -965,16 +1014,22 @@ export default new Vuex.Store({
})
},
setCuisine(state, value) {
- state.selectedCuisine = value
+ state.selCuisine = value
},
setCategory(state, value) {
- state.selectedCategory = value
+ state.selCategory = value
},
setTag(state, value) {
- state.selectedTag = value
+ state.selTag = value
},
},
actions: {
+ setPlanDeletion({ commit }, s) {
+ commit('setPlanDeletion', s)
+ },
+ setPlannerView({ commit }, s) {
+ commit('setPlannerView', s)
+ },
setRTL({ commit }) {
commit('setRTL')
},
@@ -1008,8 +1063,8 @@ export default new Vuex.Store({
removeActiveTimer({ commit }, i) {
commit('removeActiveTimer', i)
},
- setTimerDelay({ commit }, delay) {
- commit('setTimerDelay', delay)
+ setTimerDelay({ commit }, n) {
+ commit('setTimerDelay', n)
},
setTimerSound({ commit }, sound) {
commit('setTimerSound', sound)
@@ -1086,8 +1141,8 @@ export default new Vuex.Store({
unSyncCombinationsAction({ commit }, combinations) {
commit('unSyncCombinations', combinations)
},
- setShake({ commit }, shake) {
- commit('setShake', shake)
+ setShake({ commit }, n) {
+ commit('setShake', n)
},
setRatingAction({ commit }, rating) {
commit('setRating', rating)
diff --git a/fastlane/metadata/android/en-GB/changelogs/1.txt b/fastlane/metadata/android/en-GB/changelogs/1.txt
index 36df80b9..bff77c90 100644
--- a/fastlane/metadata/android/en-GB/changelogs/1.txt
+++ b/fastlane/metadata/android/en-GB/changelogs/1.txt
@@ -4,5 +4,5 @@
- The recipes can now be sorted in random order
- RTL language support
- Print recipe
-- Create duplicate recipes for alternate versions
-- App shortcut for all the tools
\ No newline at end of file
+- Duplicate recipe
+- Revamped Meal planner UI
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 0727a621..16671ff8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,10 +10,8 @@
"license": "GPL",
"dependencies": {
"@akylas/nativescript-sqlite": "^3.3.12",
- "@nativescript-community/ui-collectionview": "^4.0.29",
- "@nativescript-rtl/ui": "^0.1.8",
+ "@nativescript-community/ui-collectionview": "^4.0.32",
"@nativescript/core": "^8.0.7",
- "@nativescript/local-notifications": "^5.0.3",
"@nativescript/localize": "^5.0.4",
"@triniwiz/nativescript-accelerometer": "^4.0.3",
"nativescript-imagecropper": "^4.0.1",
@@ -24,8 +22,8 @@
"devDependencies": {
"@nativescript/android": "8.0.0",
"@nativescript/types": "^8.0.1",
- "@nativescript/webpack": "^5.0.0-beta.12",
- "@types/node": "^15.9.0",
+ "@nativescript/webpack": "^5.0.0-beta.14",
+ "@types/node": "^15.12.2",
"nativescript-vue-template-compiler": "~2.9.0",
"sass": "^1.34.1",
"typescript": "^4.2.4",
@@ -45,35 +43,41 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
- "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz",
+ "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==",
"dev": true,
"dependencies": {
- "@babel/highlight": "^7.12.13"
+ "@babel/highlight": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz",
- "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==",
- "dev": true
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz",
+ "integrity": "sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
"node_modules/@babel/core": {
- "version": "7.14.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz",
- "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.5.tgz",
+ "integrity": "sha512-RN/AwP2DJmQTZSfiDaD+JQQ/J99KsIpOCfBE5pL+5jJSt7nI3nYGoAXZu+ffYSQ029NLs2DstZb+eR81uuARgg==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@babel/generator": "^7.14.3",
- "@babel/helper-compilation-targets": "^7.13.16",
- "@babel/helper-module-transforms": "^7.14.2",
- "@babel/helpers": "^7.14.0",
- "@babel/parser": "^7.14.3",
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.2",
- "@babel/types": "^7.14.2",
+ "@babel/code-frame": "^7.14.5",
+ "@babel/generator": "^7.14.5",
+ "@babel/helper-compilation-targets": "^7.14.5",
+ "@babel/helper-module-transforms": "^7.14.5",
+ "@babel/helpers": "^7.14.5",
+ "@babel/parser": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -99,14 +103,17 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.14.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz",
- "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz",
+ "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.14.2",
+ "@babel/types": "^7.14.5",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/generator/node_modules/source-map": {
@@ -119,145 +126,199 @@
}
},
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz",
- "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz",
+ "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==",
"dev": true,
"dependencies": {
- "@babel/compat-data": "^7.14.4",
- "@babel/helper-validator-option": "^7.12.17",
+ "@babel/compat-data": "^7.14.5",
+ "@babel/helper-validator-option": "^7.14.5",
"browserslist": "^4.16.6",
"semver": "^6.3.0"
},
+ "engines": {
+ "node": ">=6.9.0"
+ },
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-function-name": {
- "version": "7.14.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz",
- "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz",
+ "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==",
"dev": true,
"dependencies": {
- "@babel/helper-get-function-arity": "^7.12.13",
- "@babel/template": "^7.12.13",
- "@babel/types": "^7.14.2"
+ "@babel/helper-get-function-arity": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/helper-get-function-arity": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz",
- "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz",
+ "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz",
+ "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
- "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz",
+ "integrity": "sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.13.12"
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
- "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz",
+ "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.13.12"
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.14.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz",
- "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz",
+ "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==",
"dev": true,
"dependencies": {
- "@babel/helper-module-imports": "^7.13.12",
- "@babel/helper-replace-supers": "^7.13.12",
- "@babel/helper-simple-access": "^7.13.12",
- "@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/helper-validator-identifier": "^7.14.0",
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.2",
- "@babel/types": "^7.14.2"
+ "@babel/helper-module-imports": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.14.5",
+ "@babel/helper-simple-access": "^7.14.5",
+ "@babel/helper-split-export-declaration": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
- "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz",
+ "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/helper-replace-supers": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz",
- "integrity": "sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz",
+ "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==",
"dev": true,
"dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.13.12",
- "@babel/helper-optimise-call-expression": "^7.12.13",
- "@babel/traverse": "^7.14.2",
- "@babel/types": "^7.14.4"
+ "@babel/helper-member-expression-to-functions": "^7.14.5",
+ "@babel/helper-optimise-call-expression": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/helper-simple-access": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
- "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz",
+ "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.13.12"
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/helper-split-export-declaration": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
- "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz",
+ "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
- "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
- "dev": true
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
+ "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.12.17",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
- "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==",
- "dev": true
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
+ "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
"node_modules/@babel/helpers": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz",
- "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.5.tgz",
+ "integrity": "sha512-xtcWOuN9VL6nApgVHtq3PPcQv5qFBJzoSZzJ/2c0QK/IP/gxVcoWSNQwFEGvmbQsuS9rhYqjILDGGXcTkA705Q==",
"dev": true,
"dependencies": {
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.0",
- "@babel/types": "^7.14.0"
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/highlight": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
- "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.14.0",
+ "@babel/helper-validator-identifier": "^7.14.5",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/highlight/node_modules/ansi-styles": {
@@ -323,9 +384,9 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz",
- "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.5.tgz",
+ "integrity": "sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
@@ -335,40 +396,50 @@
}
},
"node_modules/@babel/template": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz",
- "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz",
+ "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@babel/parser": "^7.12.13",
- "@babel/types": "^7.12.13"
+ "@babel/code-frame": "^7.14.5",
+ "@babel/parser": "^7.14.5",
+ "@babel/types": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.14.2",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz",
- "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz",
+ "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@babel/generator": "^7.14.2",
- "@babel/helper-function-name": "^7.14.2",
- "@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/parser": "^7.14.2",
- "@babel/types": "^7.14.2",
+ "@babel/code-frame": "^7.14.5",
+ "@babel/generator": "^7.14.5",
+ "@babel/helper-function-name": "^7.14.5",
+ "@babel/helper-hoist-variables": "^7.14.5",
+ "@babel/helper-split-export-declaration": "^7.14.5",
+ "@babel/parser": "^7.14.5",
+ "@babel/types": "^7.14.5",
"debug": "^4.1.0",
"globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@babel/types": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz",
- "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
+ "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
"dev": true,
"dependencies": {
- "@babel/helper-validator-identifier": "^7.14.0",
+ "@babel/helper-validator-identifier": "^7.14.5",
"to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
"node_modules/@discoveryjs/json-ext": {
@@ -381,22 +452,9 @@
}
},
"node_modules/@nativescript-community/ui-collectionview": {
- "version": "4.0.31",
- "resolved": "https://registry.npmjs.org/@nativescript-community/ui-collectionview/-/ui-collectionview-4.0.31.tgz",
- "integrity": "sha512-kWtupfe+zr2Vj5hLfie/xxlFYLtLbBS6WrDBUD9z1cJYIZRf9KQxwl8z4wJ2dtQ51dlt1r8CJZgpgRbMTk5xQA=="
- },
- "node_modules/@nativescript-rtl/ui": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/@nativescript-rtl/ui/-/ui-0.1.8.tgz",
- "integrity": "sha512-GUmRHuwI0vJ1IKUH1ilm2SmPo8iv6o5PhA4LxmNnysODuiJywnnNfE9yFpoecBsDOMRVT6M/dlV26+3DfO4Rbw==",
- "dependencies": {
- "@types/node": "^14.6.4"
- }
- },
- "node_modules/@nativescript-rtl/ui/node_modules/@types/node": {
- "version": "14.17.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.2.tgz",
- "integrity": "sha512-sld7b/xmFum66AAKuz/rp/CUO8+98fMpyQ3SBfzzBNGMd/1iHBTAg9oyAvcYlAj46bpc74r91jSw2iFdnx29nw=="
+ "version": "4.0.32",
+ "resolved": "https://registry.npmjs.org/@nativescript-community/ui-collectionview/-/ui-collectionview-4.0.32.tgz",
+ "integrity": "sha512-mSn2ZEWdPH1VufV0FXy7s3UcRMS0Iz3dX/FTfXfhq+9csQU0AngzisiNIq3nFBgp0NGtbzEeyfM0fOpUxGOvtg=="
},
"node_modules/@nativescript/android": {
"version": "8.0.0",
@@ -425,14 +483,6 @@
"mkdirp": "^1.0.4"
}
},
- "node_modules/@nativescript/local-notifications": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/@nativescript/local-notifications/-/local-notifications-5.0.3.tgz",
- "integrity": "sha512-zIynr7kbac1/XZZ14NGnRro7eocdj+T5G3GqPtoJnlCNF2Lfwdr9KcbshhOsRiW/gszi5wkUli7QuFm0T3j5Dg==",
- "dependencies": {
- "@nativescript/shared-notification-delegate": "~1.0.0"
- }
- },
"node_modules/@nativescript/localize": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/@nativescript/localize/-/localize-5.0.4.tgz",
@@ -445,11 +495,6 @@
"sprintf-js": "^1.1.1"
}
},
- "node_modules/@nativescript/shared-notification-delegate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@nativescript/shared-notification-delegate/-/shared-notification-delegate-1.0.2.tgz",
- "integrity": "sha512-Wh6F1WH9Aj23K+nyolA5MrA6MXku/5rSPt9r20ekbyx2FkRpBr0stjg4uD6KSyUvWY8YT+KQ9WlOUzhq7g7Ycw=="
- },
"node_modules/@nativescript/types": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@nativescript/types/-/types-8.0.1.tgz",
@@ -473,9 +518,9 @@
"dev": true
},
"node_modules/@nativescript/webpack": {
- "version": "5.0.0-dev.0",
- "resolved": "https://registry.npmjs.org/@nativescript/webpack/-/webpack-5.0.0-dev.0.tgz",
- "integrity": "sha512-pJhuzm+sqMBrr+MHAm6qQclvHo6evK8IsqBpZ8s2e5O/Bk0HbtPdKJdiNQuw2TRHWpWJ1Rkp3Nc8lnZsoxK7VQ==",
+ "version": "5.0.0-dev.5",
+ "resolved": "https://registry.npmjs.org/@nativescript/webpack/-/webpack-5.0.0-dev.5.tgz",
+ "integrity": "sha512-9ktg+iYw3yk/IIrLOKPxaaK1vaVXhp3tO0IvK+d9cd07m0vgwhAnISuab+5/0zCYqOcFcQb0KOm4t3sDdxg6JA==",
"dev": true,
"dependencies": {
"@babel/core": "^7.0.0",
@@ -507,7 +552,7 @@
"ts-dedent": "^2.0.0",
"ts-loader": "^9.0.0",
"vue-loader": "^15.0.0",
- "webpack": "^5.0.0",
+ "webpack": "^5.34.0",
"webpack-bundle-analyzer": "^4.0.0",
"webpack-chain": "^6.0.0",
"webpack-cli": "^4.0.0",
@@ -652,9 +697,9 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "15.12.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.1.tgz",
- "integrity": "sha512-zyxJM8I1c9q5sRMtVF+zdd13Jt6RU4r4qfhTd7lQubyThvLfx6yYekWSQjGCGV2Tkecgxnlpl/DNlb6Hg+dmEw==",
+ "version": "15.12.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
+ "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
"dev": true
},
"node_modules/@types/parse-json": {
@@ -664,16 +709,15 @@
"dev": true
},
"node_modules/@vue/component-compiler-utils": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz",
- "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.1.tgz",
+ "integrity": "sha512-Mci9WJYLRjyJEBkGHMPxZ1ihJ9l6gOy2Gr6hpYZUNpQoe5+nbpeb3w00aP+PSHJygCF+fxJsqp7Af1zGDITzuw==",
"dev": true,
"dependencies": {
"consolidate": "^0.15.1",
"hash-sum": "^1.0.2",
"lru-cache": "^4.1.2",
"merge-source-map": "^1.1.0",
- "postcss": "^7.0.14",
"postcss-selector-parser": "^6.0.2",
"source-map": "~0.6.1",
"vue-template-es2015-compiler": "^1.9.0"
@@ -682,86 +726,6 @@
"prettier": "^1.18.2"
}
},
- "node_modules/@vue/component-compiler-utils/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@vue/component-compiler-utils/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@vue/component-compiler-utils/node_modules/chalk/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@vue/component-compiler-utils/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@vue/component-compiler-utils/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "node_modules/@vue/component-compiler-utils/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@vue/component-compiler-utils/node_modules/postcss": {
- "version": "7.0.35",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
- "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
- "dev": true,
- "dependencies": {
- "chalk": "^2.4.2",
- "source-map": "^0.6.1",
- "supports-color": "^6.1.0"
- },
- "engines": {
- "node": ">=6.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- }
- },
"node_modules/@vue/component-compiler-utils/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -771,18 +735,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/@vue/component-compiler-utils/node_modules/supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/@webassemblyjs/ast": {
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz",
@@ -930,9 +882,9 @@
}
},
"node_modules/@webpack-cli/configtest": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.3.tgz",
- "integrity": "sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw==",
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz",
+ "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==",
"dev": true,
"peerDependencies": {
"webpack": "4.x.x || 5.x.x",
@@ -940,9 +892,9 @@
}
},
"node_modules/@webpack-cli/info": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.4.tgz",
- "integrity": "sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz",
+ "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==",
"dev": true,
"dependencies": {
"envinfo": "^7.7.3"
@@ -952,9 +904,9 @@
}
},
"node_modules/@webpack-cli/serve": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.4.0.tgz",
- "integrity": "sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg==",
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.1.tgz",
+ "integrity": "sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw==",
"dev": true,
"peerDependencies": {
"webpack-cli": "4.x.x"
@@ -978,9 +930,9 @@
"dev": true
},
"node_modules/acorn": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz",
- "integrity": "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz",
+ "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==",
"dev": true,
"bin": {
"acorn": "bin/acorn"
@@ -1366,9 +1318,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001234",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001234.tgz",
- "integrity": "sha512-a3gjUVKkmwLdNysa1xkUAwN2VfJUJyVW47rsi3aCbkRCtbHAfo+rOsCqVw29G6coQ8gzAPb5XBXwiGHwme3isA==",
+ "version": "1.0.30001237",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz",
+ "integrity": "sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -1859,9 +1811,9 @@
"dev": true
},
"node_modules/electron-to-chromium": {
- "version": "1.3.748",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.748.tgz",
- "integrity": "sha512-fmIKfYALVeEybk/L2ucdgt7jN3JsbGtg3K9pmF/MRWgkeADBI1VSAa5IzdG2gZwTxsnsrFtdMpOTSM5mrBRKVQ==",
+ "version": "1.3.752",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz",
+ "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==",
"dev": true
},
"node_modules/emoji-regex": {
@@ -3013,9 +2965,9 @@
"dev": true
},
"node_modules/node-releases": {
- "version": "1.1.72",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
- "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
+ "version": "1.1.73",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz",
+ "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==",
"dev": true
},
"node_modules/normalize-path": {
@@ -3270,9 +3222,9 @@
}
},
"node_modules/postcss": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz",
- "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==",
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.2.tgz",
+ "integrity": "sha512-y1FK/AWdZlBF5lusS5j5l4/vF67+vQZt1SXPVJ32y1kRGDQyrs1zk32hG1cInRTu14P0V+orPz+ifwW/7rR4bg==",
"dev": true,
"dependencies": {
"colorette": "^1.2.2",
@@ -3720,9 +3672,9 @@
}
},
"node_modules/sass-loader": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.0.0.tgz",
- "integrity": "sha512-LJQMyDdNdhcvoO2gJFw7KpTaioVFDeRJOuatRDUNgCIqyu4s4kgDsNofdGzAZB1zFOgo/p3fy+aR/uGXamcJBg==",
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz",
+ "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==",
"dev": true,
"dependencies": {
"klona": "^2.0.4",
@@ -4136,9 +4088,9 @@
}
},
"node_modules/ts-loader": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.2.tgz",
- "integrity": "sha512-hNIhGTQHtNKjOzR2ZtQ2OSVbXPykOae+zostf1IlHCf61Mt41GMJurKNqrYUbzHgpmj6UWRu8eBfb7q0XliV0g==",
+ "version": "9.2.3",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.3.tgz",
+ "integrity": "sha512-sEyWiU3JMHBL55CIeC4iqJQadI0U70A5af0kvgbNLHVNz2ACztQg0j/9x10bjjIht8WfFYLKfn4L6tkZ+pu+8Q==",
"dev": true,
"dependencies": {
"chalk": "^4.1.0",
@@ -4221,7 +4173,6 @@
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz",
"integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==",
- "dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -4261,10 +4212,9 @@
"dev": true
},
"node_modules/vue": {
- "version": "2.6.13",
- "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.13.tgz",
- "integrity": "sha512-O+pAdJkce1ooYS1XyoQtpBQr9An+Oys3w39rkqxukVO3ZD1ilYJkWBGoRuadiQEm2LLJnCL2utV4TMSf52ubjw==",
- "dev": true
+ "version": "2.6.14",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
+ "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
},
"node_modules/vue-hot-reload-api": {
"version": "2.3.4",
@@ -4487,15 +4437,15 @@
}
},
"node_modules/webpack-cli": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.7.0.tgz",
- "integrity": "sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g==",
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.7.2.tgz",
+ "integrity": "sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw==",
"dev": true,
"dependencies": {
"@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.0.3",
- "@webpack-cli/info": "^1.2.4",
- "@webpack-cli/serve": "^1.4.0",
+ "@webpack-cli/configtest": "^1.0.4",
+ "@webpack-cli/info": "^1.3.0",
+ "@webpack-cli/serve": "^1.5.1",
"colorette": "^1.2.1",
"commander": "^7.0.0",
"execa": "^5.0.0",
@@ -4531,9 +4481,9 @@
}
},
"node_modules/webpack-merge": {
- "version": "5.7.3",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz",
- "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==",
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
+ "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
"dev": true,
"dependencies": {
"clone-deep": "^4.0.1",
@@ -4760,35 +4710,35 @@
}
},
"@babel/code-frame": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
- "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz",
+ "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.12.13"
+ "@babel/highlight": "^7.14.5"
}
},
"@babel/compat-data": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.4.tgz",
- "integrity": "sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz",
+ "integrity": "sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w==",
"dev": true
},
"@babel/core": {
- "version": "7.14.3",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.3.tgz",
- "integrity": "sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.5.tgz",
+ "integrity": "sha512-RN/AwP2DJmQTZSfiDaD+JQQ/J99KsIpOCfBE5pL+5jJSt7nI3nYGoAXZu+ffYSQ029NLs2DstZb+eR81uuARgg==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.12.13",
- "@babel/generator": "^7.14.3",
- "@babel/helper-compilation-targets": "^7.13.16",
- "@babel/helper-module-transforms": "^7.14.2",
- "@babel/helpers": "^7.14.0",
- "@babel/parser": "^7.14.3",
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.2",
- "@babel/types": "^7.14.2",
+ "@babel/code-frame": "^7.14.5",
+ "@babel/generator": "^7.14.5",
+ "@babel/helper-compilation-targets": "^7.14.5",
+ "@babel/helper-module-transforms": "^7.14.5",
+ "@babel/helpers": "^7.14.5",
+ "@babel/parser": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -4806,12 +4756,12 @@
}
},
"@babel/generator": {
- "version": "7.14.3",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.3.tgz",
- "integrity": "sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz",
+ "integrity": "sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA==",
"dev": true,
"requires": {
- "@babel/types": "^7.14.2",
+ "@babel/types": "^7.14.5",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
},
@@ -4825,140 +4775,149 @@
}
},
"@babel/helper-compilation-targets": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz",
- "integrity": "sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz",
+ "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.14.4",
- "@babel/helper-validator-option": "^7.12.17",
+ "@babel/compat-data": "^7.14.5",
+ "@babel/helper-validator-option": "^7.14.5",
"browserslist": "^4.16.6",
"semver": "^6.3.0"
}
},
"@babel/helper-function-name": {
- "version": "7.14.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz",
- "integrity": "sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz",
+ "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==",
"dev": true,
"requires": {
- "@babel/helper-get-function-arity": "^7.12.13",
- "@babel/template": "^7.12.13",
- "@babel/types": "^7.14.2"
+ "@babel/helper-get-function-arity": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/types": "^7.14.5"
}
},
"@babel/helper-get-function-arity": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz",
- "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz",
+ "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==",
"dev": true,
"requires": {
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.14.5"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz",
+ "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.14.5"
}
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
- "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz",
+ "integrity": "sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.13.12"
+ "@babel/types": "^7.14.5"
}
},
"@babel/helper-module-imports": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
- "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz",
+ "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.13.12"
+ "@babel/types": "^7.14.5"
}
},
"@babel/helper-module-transforms": {
- "version": "7.14.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz",
- "integrity": "sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz",
+ "integrity": "sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.13.12",
- "@babel/helper-replace-supers": "^7.13.12",
- "@babel/helper-simple-access": "^7.13.12",
- "@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/helper-validator-identifier": "^7.14.0",
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.2",
- "@babel/types": "^7.14.2"
+ "@babel/helper-module-imports": "^7.14.5",
+ "@babel/helper-replace-supers": "^7.14.5",
+ "@babel/helper-simple-access": "^7.14.5",
+ "@babel/helper-split-export-declaration": "^7.14.5",
+ "@babel/helper-validator-identifier": "^7.14.5",
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
}
},
"@babel/helper-optimise-call-expression": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
- "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz",
+ "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==",
"dev": true,
"requires": {
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.14.5"
}
},
"@babel/helper-replace-supers": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz",
- "integrity": "sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz",
+ "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==",
"dev": true,
"requires": {
- "@babel/helper-member-expression-to-functions": "^7.13.12",
- "@babel/helper-optimise-call-expression": "^7.12.13",
- "@babel/traverse": "^7.14.2",
- "@babel/types": "^7.14.4"
+ "@babel/helper-member-expression-to-functions": "^7.14.5",
+ "@babel/helper-optimise-call-expression": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
}
},
"@babel/helper-simple-access": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
- "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz",
+ "integrity": "sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw==",
"dev": true,
"requires": {
- "@babel/types": "^7.13.12"
+ "@babel/types": "^7.14.5"
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
- "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz",
+ "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==",
"dev": true,
"requires": {
- "@babel/types": "^7.12.13"
+ "@babel/types": "^7.14.5"
}
},
"@babel/helper-validator-identifier": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
- "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz",
+ "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==",
"dev": true
},
"@babel/helper-validator-option": {
- "version": "7.12.17",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
- "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz",
+ "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==",
"dev": true
},
"@babel/helpers": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz",
- "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.5.tgz",
+ "integrity": "sha512-xtcWOuN9VL6nApgVHtq3PPcQv5qFBJzoSZzJ/2c0QK/IP/gxVcoWSNQwFEGvmbQsuS9rhYqjILDGGXcTkA705Q==",
"dev": true,
"requires": {
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.0",
- "@babel/types": "^7.14.0"
+ "@babel/template": "^7.14.5",
+ "@babel/traverse": "^7.14.5",
+ "@babel/types": "^7.14.5"
}
},
"@babel/highlight": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
- "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
+ "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.0",
+ "@babel/helper-validator-identifier": "^7.14.5",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
},
@@ -5016,45 +4975,46 @@
}
},
"@babel/parser": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.4.tgz",
- "integrity": "sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.5.tgz",
+ "integrity": "sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg==",
"dev": true
},
"@babel/template": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz",
- "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz",
+ "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.12.13",
- "@babel/parser": "^7.12.13",
- "@babel/types": "^7.12.13"
+ "@babel/code-frame": "^7.14.5",
+ "@babel/parser": "^7.14.5",
+ "@babel/types": "^7.14.5"
}
},
"@babel/traverse": {
- "version": "7.14.2",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.2.tgz",
- "integrity": "sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz",
+ "integrity": "sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.12.13",
- "@babel/generator": "^7.14.2",
- "@babel/helper-function-name": "^7.14.2",
- "@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/parser": "^7.14.2",
- "@babel/types": "^7.14.2",
+ "@babel/code-frame": "^7.14.5",
+ "@babel/generator": "^7.14.5",
+ "@babel/helper-function-name": "^7.14.5",
+ "@babel/helper-hoist-variables": "^7.14.5",
+ "@babel/helper-split-export-declaration": "^7.14.5",
+ "@babel/parser": "^7.14.5",
+ "@babel/types": "^7.14.5",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
- "version": "7.14.4",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.4.tgz",
- "integrity": "sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw==",
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz",
+ "integrity": "sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg==",
"dev": true,
"requires": {
- "@babel/helper-validator-identifier": "^7.14.0",
+ "@babel/helper-validator-identifier": "^7.14.5",
"to-fast-properties": "^2.0.0"
}
},
@@ -5065,24 +5025,9 @@
"dev": true
},
"@nativescript-community/ui-collectionview": {
- "version": "4.0.31",
- "resolved": "https://registry.npmjs.org/@nativescript-community/ui-collectionview/-/ui-collectionview-4.0.31.tgz",
- "integrity": "sha512-kWtupfe+zr2Vj5hLfie/xxlFYLtLbBS6WrDBUD9z1cJYIZRf9KQxwl8z4wJ2dtQ51dlt1r8CJZgpgRbMTk5xQA=="
- },
- "@nativescript-rtl/ui": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/@nativescript-rtl/ui/-/ui-0.1.8.tgz",
- "integrity": "sha512-GUmRHuwI0vJ1IKUH1ilm2SmPo8iv6o5PhA4LxmNnysODuiJywnnNfE9yFpoecBsDOMRVT6M/dlV26+3DfO4Rbw==",
- "requires": {
- "@types/node": "^14.6.4"
- },
- "dependencies": {
- "@types/node": {
- "version": "14.17.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.2.tgz",
- "integrity": "sha512-sld7b/xmFum66AAKuz/rp/CUO8+98fMpyQ3SBfzzBNGMd/1iHBTAg9oyAvcYlAj46bpc74r91jSw2iFdnx29nw=="
- }
- }
+ "version": "4.0.32",
+ "resolved": "https://registry.npmjs.org/@nativescript-community/ui-collectionview/-/ui-collectionview-4.0.32.tgz",
+ "integrity": "sha512-mSn2ZEWdPH1VufV0FXy7s3UcRMS0Iz3dX/FTfXfhq+9csQU0AngzisiNIq3nFBgp0NGtbzEeyfM0fOpUxGOvtg=="
},
"@nativescript/android": {
"version": "8.0.0",
@@ -5110,14 +5055,6 @@
"mkdirp": "^1.0.4"
}
},
- "@nativescript/local-notifications": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/@nativescript/local-notifications/-/local-notifications-5.0.3.tgz",
- "integrity": "sha512-zIynr7kbac1/XZZ14NGnRro7eocdj+T5G3GqPtoJnlCNF2Lfwdr9KcbshhOsRiW/gszi5wkUli7QuFm0T3j5Dg==",
- "requires": {
- "@nativescript/shared-notification-delegate": "~1.0.0"
- }
- },
"@nativescript/localize": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/@nativescript/localize/-/localize-5.0.4.tgz",
@@ -5129,11 +5066,6 @@
"sprintf-js": "^1.1.1"
}
},
- "@nativescript/shared-notification-delegate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@nativescript/shared-notification-delegate/-/shared-notification-delegate-1.0.2.tgz",
- "integrity": "sha512-Wh6F1WH9Aj23K+nyolA5MrA6MXku/5rSPt9r20ekbyx2FkRpBr0stjg4uD6KSyUvWY8YT+KQ9WlOUzhq7g7Ycw=="
- },
"@nativescript/types": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/@nativescript/types/-/types-8.0.1.tgz",
@@ -5157,9 +5089,9 @@
"dev": true
},
"@nativescript/webpack": {
- "version": "5.0.0-dev.0",
- "resolved": "https://registry.npmjs.org/@nativescript/webpack/-/webpack-5.0.0-dev.0.tgz",
- "integrity": "sha512-pJhuzm+sqMBrr+MHAm6qQclvHo6evK8IsqBpZ8s2e5O/Bk0HbtPdKJdiNQuw2TRHWpWJ1Rkp3Nc8lnZsoxK7VQ==",
+ "version": "5.0.0-dev.5",
+ "resolved": "https://registry.npmjs.org/@nativescript/webpack/-/webpack-5.0.0-dev.5.tgz",
+ "integrity": "sha512-9ktg+iYw3yk/IIrLOKPxaaK1vaVXhp3tO0IvK+d9cd07m0vgwhAnISuab+5/0zCYqOcFcQb0KOm4t3sDdxg6JA==",
"dev": true,
"requires": {
"@babel/core": "^7.0.0",
@@ -5191,7 +5123,7 @@
"ts-dedent": "^2.0.0",
"ts-loader": "^9.0.0",
"vue-loader": "^15.0.0",
- "webpack": "^5.0.0",
+ "webpack": "^5.34.0",
"webpack-bundle-analyzer": "^4.0.0",
"webpack-chain": "^6.0.0",
"webpack-cli": "^4.0.0",
@@ -5283,9 +5215,9 @@
"dev": true
},
"@types/node": {
- "version": "15.12.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.1.tgz",
- "integrity": "sha512-zyxJM8I1c9q5sRMtVF+zdd13Jt6RU4r4qfhTd7lQubyThvLfx6yYekWSQjGCGV2Tkecgxnlpl/DNlb6Hg+dmEw==",
+ "version": "15.12.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
+ "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
"dev": true
},
"@types/parse-json": {
@@ -5295,99 +5227,26 @@
"dev": true
},
"@vue/component-compiler-utils": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz",
- "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==",
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.1.tgz",
+ "integrity": "sha512-Mci9WJYLRjyJEBkGHMPxZ1ihJ9l6gOy2Gr6hpYZUNpQoe5+nbpeb3w00aP+PSHJygCF+fxJsqp7Af1zGDITzuw==",
"dev": true,
"requires": {
"consolidate": "^0.15.1",
"hash-sum": "^1.0.2",
"lru-cache": "^4.1.2",
"merge-source-map": "^1.1.0",
- "postcss": "^7.0.14",
"postcss-selector-parser": "^6.0.2",
"prettier": "^1.18.2",
"source-map": "~0.6.1",
"vue-template-es2015-compiler": "^1.9.0"
},
"dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "postcss": {
- "version": "7.0.35",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
- "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
- "dev": true,
- "requires": {
- "chalk": "^2.4.2",
- "source-map": "^0.6.1",
- "supports-color": "^6.1.0"
- }
- },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"dev": true
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
}
}
},
@@ -5538,25 +5397,27 @@
}
},
"@webpack-cli/configtest": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.3.tgz",
- "integrity": "sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw==",
- "dev": true
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.4.tgz",
+ "integrity": "sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==",
+ "dev": true,
+ "requires": {}
},
"@webpack-cli/info": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.4.tgz",
- "integrity": "sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.3.0.tgz",
+ "integrity": "sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==",
"dev": true,
"requires": {
"envinfo": "^7.7.3"
}
},
"@webpack-cli/serve": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.4.0.tgz",
- "integrity": "sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg==",
- "dev": true
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.5.1.tgz",
+ "integrity": "sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw==",
+ "dev": true,
+ "requires": {}
},
"@xtuc/ieee754": {
"version": "1.2.0",
@@ -5571,9 +5432,9 @@
"dev": true
},
"acorn": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.3.0.tgz",
- "integrity": "sha512-tqPKHZ5CaBJw0Xmy0ZZvLs1qTV+BNFSyvn77ASXkpBNfIRk8ev26fKrD9iLGwGA9zedPao52GSHzq8lyZG0NUw==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.0.tgz",
+ "integrity": "sha512-ULr0LDaEqQrMFGyQ3bhJkLsbtrQ8QibAseGZeaSUiT/6zb9IvIkomWHJIvgvwad+hinRAgsI51JcWk2yvwyL+w==",
"dev": true
},
"acorn-class-fields": {
@@ -5589,7 +5450,8 @@
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/acorn-private-class-elements/-/acorn-private-class-elements-0.2.7.tgz",
"integrity": "sha512-+GZH2wOKNZOBI4OOPmzpo4cs6mW297sn6fgIk1dUI08jGjhAaEwvC39mN2gJAg2lmAQJ1rBkFqKWonL3Zz6PVA==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"acorn-private-methods": {
"version": "0.3.3",
@@ -5642,7 +5504,8 @@
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"ansi-html": {
"version": "0.0.7",
@@ -5830,9 +5693,9 @@
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30001234",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001234.tgz",
- "integrity": "sha512-a3gjUVKkmwLdNysa1xkUAwN2VfJUJyVW47rsi3aCbkRCtbHAfo+rOsCqVw29G6coQ8gzAPb5XBXwiGHwme3isA==",
+ "version": "1.0.30001237",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001237.tgz",
+ "integrity": "sha512-pDHgRndit6p1NR2GhzMbQ6CkRrp4VKuSsqbcLeOQppYPKOYkKT/6ZvZDvKJUqcmtyWIAHuZq3SVS2vc1egCZzw==",
"dev": true
},
"chalk": {
@@ -6200,9 +6063,9 @@
"dev": true
},
"electron-to-chromium": {
- "version": "1.3.748",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.748.tgz",
- "integrity": "sha512-fmIKfYALVeEybk/L2ucdgt7jN3JsbGtg3K9pmF/MRWgkeADBI1VSAa5IzdG2gZwTxsnsrFtdMpOTSM5mrBRKVQ==",
+ "version": "1.3.752",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.752.tgz",
+ "integrity": "sha512-2Tg+7jSl3oPxgsBsWKh5H83QazTkmWG/cnNwJplmyZc7KcN61+I10oUgaXSVk/NwfvN3BdkKDR4FYuRBQQ2v0A==",
"dev": true
},
"emoji-regex": {
@@ -6639,7 +6502,8 @@
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
"integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"ignore": {
"version": "5.1.8",
@@ -7088,9 +6952,9 @@
"dev": true
},
"node-releases": {
- "version": "1.1.72",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
- "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
+ "version": "1.1.73",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz",
+ "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==",
"dev": true
},
"normalize-path": {
@@ -7277,9 +7141,9 @@
}
},
"postcss": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz",
- "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==",
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.2.tgz",
+ "integrity": "sha512-y1FK/AWdZlBF5lusS5j5l4/vF67+vQZt1SXPVJ32y1kRGDQyrs1zk32hG1cInRTu14P0V+orPz+ifwW/7rR4bg==",
"dev": true,
"requires": {
"colorette": "^1.2.2",
@@ -7352,7 +7216,8 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
"integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"postcss-modules-local-by-default": {
"version": "4.0.0",
@@ -7581,9 +7446,9 @@
}
},
"sass-loader": {
- "version": "12.0.0",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.0.0.tgz",
- "integrity": "sha512-LJQMyDdNdhcvoO2gJFw7KpTaioVFDeRJOuatRDUNgCIqyu4s4kgDsNofdGzAZB1zFOgo/p3fy+aR/uGXamcJBg==",
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.1.0.tgz",
+ "integrity": "sha512-FVJZ9kxVRYNZTIe2xhw93n3xJNYZADr+q69/s98l9nTCrWASo+DR2Ot0s5xTKQDDEosUkatsGeHxcH4QBp5bSg==",
"dev": true,
"requires": {
"klona": "^2.0.4",
@@ -7883,9 +7748,9 @@
"dev": true
},
"ts-loader": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.2.tgz",
- "integrity": "sha512-hNIhGTQHtNKjOzR2ZtQ2OSVbXPykOae+zostf1IlHCf61Mt41GMJurKNqrYUbzHgpmj6UWRu8eBfb7q0XliV0g==",
+ "version": "9.2.3",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.2.3.tgz",
+ "integrity": "sha512-sEyWiU3JMHBL55CIeC4iqJQadI0U70A5af0kvgbNLHVNz2ACztQg0j/9x10bjjIht8WfFYLKfn4L6tkZ+pu+8Q==",
"dev": true,
"requires": {
"chalk": "^4.1.0",
@@ -7941,8 +7806,7 @@
"typescript": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.2.tgz",
- "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw==",
- "dev": true
+ "integrity": "sha512-zZ4hShnmnoVnAHpVHWpTcxdv7dWP60S2FsydQLV8V5PbS3FifjWFFRiHSWpDJahly88PRyV5teTSLoq4eG7mKw=="
},
"universalify": {
"version": "2.0.0",
@@ -7972,10 +7836,9 @@
"dev": true
},
"vue": {
- "version": "2.6.13",
- "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.13.tgz",
- "integrity": "sha512-O+pAdJkce1ooYS1XyoQtpBQr9An+Oys3w39rkqxukVO3ZD1ilYJkWBGoRuadiQEm2LLJnCL2utV4TMSf52ubjw==",
- "dev": true
+ "version": "2.6.14",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
+ "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
},
"vue-hot-reload-api": {
"version": "2.3.4",
@@ -8059,7 +7922,8 @@
"vuex": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz",
- "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw=="
+ "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==",
+ "requires": {}
},
"watchpack": {
"version": "2.2.0",
@@ -8165,15 +8029,15 @@
}
},
"webpack-cli": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.7.0.tgz",
- "integrity": "sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g==",
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.7.2.tgz",
+ "integrity": "sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw==",
"dev": true,
"requires": {
"@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^1.0.3",
- "@webpack-cli/info": "^1.2.4",
- "@webpack-cli/serve": "^1.4.0",
+ "@webpack-cli/configtest": "^1.0.4",
+ "@webpack-cli/info": "^1.3.0",
+ "@webpack-cli/serve": "^1.5.1",
"colorette": "^1.2.1",
"commander": "^7.0.0",
"execa": "^5.0.0",
@@ -8186,9 +8050,9 @@
}
},
"webpack-merge": {
- "version": "5.7.3",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz",
- "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==",
+ "version": "5.8.0",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
+ "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
"dev": true,
"requires": {
"clone-deep": "^4.0.1",
@@ -8254,7 +8118,8 @@
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==",
- "dev": true
+ "dev": true,
+ "requires": {}
},
"xmlbuilder": {
"version": "9.0.7",
diff --git a/package.json b/package.json
index 1c93c7f3..6321d245 100644
--- a/package.json
+++ b/package.json
@@ -19,10 +19,8 @@
"private": "true",
"dependencies": {
"@akylas/nativescript-sqlite": "^3.3.12",
- "@nativescript-community/ui-collectionview": "^4.0.29",
- "@nativescript-rtl/ui": "^0.1.8",
+ "@nativescript-community/ui-collectionview": "^4.0.32",
"@nativescript/core": "^8.0.7",
- "@nativescript/local-notifications": "^5.0.3",
"@nativescript/localize": "^5.0.4",
"@triniwiz/nativescript-accelerometer": "^4.0.3",
"nativescript-imagecropper": "^4.0.1",
@@ -33,8 +31,8 @@
"devDependencies": {
"@nativescript/android": "8.0.0",
"@nativescript/types": "^8.0.1",
- "@nativescript/webpack": "^5.0.0-beta.12",
- "@types/node": "^15.9.0",
+ "@nativescript/webpack": "^5.0.0-beta.14",
+ "@types/node": "^15.12.2",
"nativescript-vue-template-compiler": "~2.9.0",
"sass": "^1.34.1",
"typescript": "^4.2.4",
diff --git a/translations/app/en-GB.default.json b/translations/app/en-GB.default.json
index 33a5f1bb..691a5d4a 100644
--- a/translations/app/en-GB.default.json
+++ b/translations/app/en-GB.default.json
@@ -82,7 +82,6 @@
"fltr": "Filter",
"Fluid Ounce": "Fluid Ounce",
"French": "French",
- "FRI": "FRI",
"fsList": "Your favourite recipes are listed here",
"g": "g",
"gal": "gal",
@@ -148,7 +147,6 @@
"minimal": "Minimal",
"ml": "ml",
"Moderate": "Moderate",
- "MON": "MON",
"newCui": "New cuisine",
"Newest first": "Newest first",
"newRec": "New recipe",
@@ -224,7 +222,6 @@
"rst": "RESTART",
"Russian": "Russian",
"Salads": "Salads",
- "SAT": "SAT",
"Sauces": "Sauces",
"Scottish": "Scottish",
"Seafood": "Seafood",
@@ -251,7 +248,6 @@
"stick": "stick",
"stp": "Step",
"strAdd": "Start adding your recipes!",
- "SUN": "SUN",
"sVw": "Shake to view random recipe",
"sVwInfo": "Helps you choose what to cook when you can't decide",
"Swedish": "Swedish",
@@ -262,7 +258,6 @@
"Teaspoon": "Teaspoon",
"Thai": "Thai",
"Theme": "Theme",
- "THU": "THU",
"title": "Title",
"tLInfo": "Recipes you want to try later are listed here",
"today": "today",
@@ -273,7 +268,6 @@
"ts": "Tags",
"tsInfo": "separate with spaces",
"tsp": "tsp",
- "TUE": "TUE",
"Turkish": "Turkish",
"Undefined": "Undefined",
"unit": "unit",
@@ -284,7 +278,6 @@
"Vegetarian": "Vegetarian",
"Vietnamese": "Vietnamese",
"wAgo": "%s weeks ago",
- "WED": "WED",
"yesterday": "yesterday",
"yieldQ": "Yield quantity",
"yieldU": "Yield unit",
@@ -340,9 +333,10 @@
"selMT": "Select meal type",
"ehwmp": "Eat healthy with meal plans!",
"plsCrt": "Use the plus button to create one",
- "admp": "Auto delete meal plans",
+ "admp": "Auto-delete meal plans",
"otay": "Older than a year",
"otam": "Older than a month",
"otaw": "Older than a week",
- "nvr": "Never"
+ "nvr": "Never",
+ "add": "Add"
}
diff --git a/tsconfig.json b/tsconfig.json
index d381e021..f4be0b25 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -6,7 +6,7 @@
"lib": ["dom", "es2017"],
"sourceMap": true,
"noEmitHelpers": true,
- "importHelpers": false, // Must be false to create custom android componentt
+ "importHelpers": false,
"baseUrl": ".",
"paths": {
"~/*": ["app/*"],